de.walware.statet.r.internal.ui.rhelp.RHelpLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for de.walware.statet.r.internal.ui.rhelp.RHelpLabelProvider.java

Source

/*=============================================================================#
 # Copyright (c) 2010-2015 Stephan Wahlbrink (WalWare.de) and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
 # http://www.eclipse.org/legal/epl-v10.html
 # 
 # Contributors:
 #     Stephan Wahlbrink - initial API and implementation
 #=============================================================================*/

package de.walware.statet.r.internal.ui.rhelp;

import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.StyledString.Styler;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.graphics.Image;

import de.walware.ecommons.ltk.ui.IElementLabelProvider;
import de.walware.ecommons.ui.SharedUIResources;
import de.walware.ecommons.workbench.search.ui.TextSearchLabelUtil;

import de.walware.statet.r.core.renv.IREnv;
import de.walware.statet.r.core.renv.IREnvConfiguration;
import de.walware.statet.r.core.rhelp.IRHelpKeyword;
import de.walware.statet.r.core.rhelp.IRHelpPage;
import de.walware.statet.r.core.rhelp.IRHelpSearchMatch;
import de.walware.statet.r.core.rhelp.IRHelpSearchMatch.MatchFragment;
import de.walware.statet.r.core.rhelp.IRPkgHelp;
import de.walware.statet.r.ui.RUI;

public class RHelpLabelProvider extends StyledCellLabelProvider implements ILabelProvider, IStyledLabelProvider {

    private static final String TITLE_SEP = "  "; //$NON-NLS-1$

    public static final int WITH_TITLE = 0x1;
    public static final int WITH_QUALIFIER = 0x2;

    public static final int HEADER = 0x20;
    public static final int TOOLTIP = 0x10;

    public static void append(final StyledString string, final MatchFragment fragment) {
        final String text = fragment.getText();
        int startIdx = 0;
        int endIdx = 0;
        while ((startIdx = text.indexOf(IRHelpSearchMatch.PRE_TAGS_PREFIX, endIdx)) >= 0) {
            if (startIdx > endIdx) {
                string.append(text.substring(endIdx, startIdx));
            }
            final int m = (text.charAt(startIdx + 8)) - ('A');
            startIdx += 10;
            endIdx = text.indexOf(IRHelpSearchMatch.POST_TAGS[m], startIdx);
            if (endIdx < 0) {
                return;
            }
            string.append(text.substring(startIdx, endIdx), TextSearchLabelUtil.HIGHLIGHT_STYLE);
            endIdx += 11;
        }
        if (endIdx < text.length()) {
            string.append(text.substring(endIdx));
        }
    }

    private boolean fTooltip;
    private final boolean fWithTitle;
    private boolean fWithQualifier;

    private Object fFocusObject;

    private final Styler fDefaultStyler;

    private Image fPackageImage;
    private Image fPageImage;
    private Image fLineImage;

    public RHelpLabelProvider() {
        this(WITH_TITLE);
    }

    public RHelpLabelProvider(final int style) {
        fTooltip = ((style & TOOLTIP) != 0);
        ;
        fWithQualifier = ((style & WITH_QUALIFIER) != 0);
        fWithTitle = ((style & (WITH_TITLE | TOOLTIP)) != 0);
        if ((style & HEADER) != 0) {
            fDefaultStyler = IElementLabelProvider.TITLE_STYLER;
        } else {
            fDefaultStyler = null;
        }
    }

    @Override
    public void initialize(final ColumnViewer viewer, final ViewerColumn column) {
        super.initialize(viewer, column);

        if (viewer instanceof TableViewer) {
            fWithQualifier = true;
        }
    }

    @Override
    public void dispose() {
        super.dispose();
        fPackageImage = null;
        fPageImage = null;
        fLineImage = null;
    }

    public void setFocusObject(final Object object) {
        fFocusObject = object;
    }

    @Override
    public Image getImage(Object element) {
        if (element instanceof RHelpSearchMatch) {
            element = ((RHelpSearchMatch) element).getRHelpMatch().getPage();
        }

        if (element instanceof IRHelpPage) {
            if (fPageImage == null || fPageImage.isDisposed()) {
                fPageImage = RUI.getImage(RUI.IMG_OBJ_R_HELP_PAGE);
            }
            return fPageImage;
        } else if (element instanceof IRPkgHelp) {
            if (fPackageImage == null || fPackageImage.isDisposed()) {
                fPackageImage = RUI.getImage(RUI.IMG_OBJ_R_PACKAGE);
            }
            return fPackageImage;
        }

        else if (element instanceof IREnvConfiguration || element instanceof IREnv) {
            return RUI.getImage(RUI.IMG_OBJ_R_RUNTIME_ENV);
        }

        else if (element instanceof IRHelpSearchMatch.MatchFragment) {
            if (fLineImage == null) {
                fLineImage = SharedUIResources.getImages().get(SharedUIResources.OBJ_LINE_MATCH_IMAGE_ID);
            }
            return fLineImage;
        }

        else {
            return null;
        }
    }

    @Override
    public String getText(Object element) {
        if (element instanceof RHelpSearchMatch) {
            element = ((RHelpSearchMatch) element).getRHelpMatch().getPage();
        }
        if (element instanceof IRHelpPage) {
            final StringBuilder sb = new StringBuilder(32);
            final IRHelpPage page = (IRHelpPage) element;
            sb.append(page.getName());
            if (fTooltip) {
                sb.append(" {"); //$NON-NLS-1$
                sb.append(page.getPackage().getName());
                sb.append("}\n"); //$NON-NLS-1$
                sb.append(page.getTitle());
            } else {
                if (fWithTitle && page.getTitle().length() > 0) {
                    sb.append(TITLE_SEP);
                    sb.append(page.getTitle());
                }
            }
            return sb.toString();
        } else if (element instanceof IRPkgHelp) {
            final StringBuilder sb = new StringBuilder(32);
            final IRPkgHelp packageHelp = (IRPkgHelp) element;
            if (fTooltip) {
                sb.append(packageHelp.getName());
                sb.append(" ["); //$NON-NLS-1$
                sb.append(packageHelp.getVersion());
                sb.append("]\n"); //$NON-NLS-1$
                sb.append(packageHelp.getTitle());
            } else {
                sb.append(packageHelp.getName());
                if ((element == fFocusObject) && packageHelp.getTitle().length() > 0) {
                    sb.append(TITLE_SEP);
                    sb.append(packageHelp.getTitle());
                }
            }
            return sb.toString();
        }

        else if (element instanceof IREnvConfiguration) {
            final IREnvConfiguration rEnv = (IREnvConfiguration) element;
            return rEnv.getName();
        } else if (element instanceof IREnv) {
            final IREnv rEnv = (IREnv) element;
            final String name = rEnv.getName();
            return (name != null) ? name : ""; //$NON-NLS-1$
        }

        else if (element instanceof IRHelpKeyword.Group) {
            final IRHelpKeyword.Group group = (IRHelpKeyword.Group) element;
            return group.getLabel() + TITLE_SEP + group.getDescription();
        } else if (element instanceof IRPkgHelp) {
            final IRHelpKeyword keyword = (IRHelpKeyword) element;
            return keyword.getKeyword() + TITLE_SEP + keyword.getDescription();
        }

        else if (element instanceof IRHelpSearchMatch.MatchFragment) {
            final IRHelpSearchMatch.MatchFragment fragment = (MatchFragment) element;
            return IRHelpSearchMatch.ALL_TAGS_PATTERN.matcher(fragment.getText()).replaceAll(""); //$NON-NLS-1$
        }

        else if (element instanceof Object[]) {
            final Object[] array = (Object[]) element;
            return array[array.length - 1].toString();
        } else {
            return element.toString();
        }
    }

    @Override
    public boolean useNativeToolTip(final Object object) {
        return true;
    }

    @Override
    public String getToolTipText(final Object element) {
        final boolean wasTooltip = fTooltip;
        try {
            fTooltip = true;
            return getText(element);
        } finally {
            fTooltip = wasTooltip;
        }
    }

    @Override
    public StyledString getStyledText(final Object element) {
        final StyledString text = new StyledString();

        if (element instanceof RHelpSearchMatch) {
            final IRHelpSearchMatch match = ((RHelpSearchMatch) element).getRHelpMatch();
            final IRHelpPage page = match.getPage();
            text.append(page.getName(), fDefaultStyler);
            if (fWithTitle && page.getTitle().length() > 0) {
                text.append(TITLE_SEP, fDefaultStyler);
                text.append(page.getTitle(), fDefaultStyler);
            }
            if (fWithQualifier) {
                text.append(" - ", StyledString.QUALIFIER_STYLER); //$NON-NLS-1$
                text.append(page.getPackage().getName(), StyledString.QUALIFIER_STYLER);
            } else if (match.getMatchesCount() > 0) {
                text.append(" (", StyledString.COUNTER_STYLER); //$NON-NLS-1$
                text.append(Integer.toString(match.getMatchesCount()), StyledString.COUNTER_STYLER);
                text.append(")", StyledString.COUNTER_STYLER); //$NON-NLS-1$
            }
        } else if (element instanceof IRHelpPage) {
            final IRHelpPage page = (IRHelpPage) element;
            text.append(page.getName(), fDefaultStyler);
            if (fWithTitle && page.getTitle().length() > 0) {
                text.append(TITLE_SEP, fDefaultStyler);
                text.append(page.getTitle(), fDefaultStyler);
            }
            if (fWithQualifier) {
                text.append(" - ", StyledString.QUALIFIER_STYLER); //$NON-NLS-1$
                text.append(page.getPackage().getName(), StyledString.QUALIFIER_STYLER);
            }
        } else if (element instanceof IRPkgHelp) {
            final IRPkgHelp packageHelp = (IRPkgHelp) element;
            text.append(packageHelp.getName(), fDefaultStyler);
            if (packageHelp == fFocusObject && packageHelp.getTitle().length() > 0) {
                text.append(TITLE_SEP, fDefaultStyler);
                text.append(packageHelp.getTitle(), fDefaultStyler);
            }
        }

        else if (element instanceof IRHelpKeyword.Group) {
            final IRHelpKeyword.Group group = (IRHelpKeyword.Group) element;
            text.append(group.getLabel());
            text.append(" - " + group.getDescription(), StyledString.QUALIFIER_STYLER); //$NON-NLS-1$
        } else if (element instanceof IRHelpKeyword) {
            final IRHelpKeyword keyword = (IRHelpKeyword) element;
            text.append(keyword.getKeyword());
            text.append(" - " + keyword.getDescription(), StyledString.QUALIFIER_STYLER); //$NON-NLS-1$
        }

        else if (element instanceof IREnvConfiguration) {
            final IREnvConfiguration rEnv = (IREnvConfiguration) element;
            text.append(rEnv.getName());
        } else if (element instanceof IREnv) {
            final IREnv rEnv = (IREnv) element;
            final String name = rEnv.getName();
            text.append((name != null) ? name : "", fDefaultStyler); //$NON-NLS-1$
        }

        else if (element instanceof IRHelpSearchMatch.MatchFragment) {
            final IRHelpSearchMatch.MatchFragment fragment = (MatchFragment) element;
            {
                final String fieldLabel = fragment.getFieldLabel();
                if (fieldLabel != null) {
                    text.append(fieldLabel, StyledString.QUALIFIER_STYLER);
                    text.append(": ", StyledString.QUALIFIER_STYLER); //$NON-NLS-1$
                }
            }
            append(text, fragment);
        }

        else if (element instanceof Object[]) {
            final Object[] array = (Object[]) element;
            text.append(array[array.length - 1].toString());
        } else {
            text.append(element.toString());
        }

        return text;
    }

    @Override
    public void update(final ViewerCell cell) {
        final Object element = cell.getElement();
        final Image image = getImage(element);
        final StyledString text = getStyledText(element);

        cell.setImage(image);
        cell.setText(text.getString());
        cell.setStyleRanges(text.getStyleRanges());

        super.update(cell);
    }

    @Override
    protected StyleRange prepareStyleRange(StyleRange styleRange, final boolean applyColors) {
        if (!applyColors && styleRange.background != null) {
            styleRange = super.prepareStyleRange(styleRange, applyColors);
            styleRange.borderStyle = SWT.BORDER_DOT;
            return styleRange;
        }
        return super.prepareStyleRange(styleRange, applyColors);
    }

}