com.vectrace.MercurialEclipse.search.MercurialTextSearchTreeLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.vectrace.MercurialEclipse.search.MercurialTextSearchTreeLabelProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2010 IBM Corporation 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:
 *     IBM Corporation                 - initial API and implementation
 *     Juerg Billeter, juergbi@ethz.ch - 47136 Search view should show match objects
 *     Ulrich Etter, etteru@ethz.ch    - 47136 Search view should show match objects
 *     Roman Fuchs, fuchsro@ethz.ch    - 47136 Search view should show match objects
 *     Andrei Loskutov                 - bug fixes
 *     Philip Graf                     - Fixed bugs which FindBugs found
 *******************************************************************************/
package com.vectrace.MercurialEclipse.search;

import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.StyledString.Styler;
import org.eclipse.search.internal.ui.Messages;
import org.eclipse.search.internal.ui.SearchMessages;
import org.eclipse.search.internal.ui.SearchPluginImages;
import org.eclipse.search.internal.ui.text.BasicElementLabels;
import org.eclipse.search.ui.text.AbstractTextSearchResult;
import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.model.WorkbenchLabelProvider;

import com.vectrace.MercurialEclipse.MercurialEclipsePlugin;
import com.vectrace.MercurialEclipse.model.ChangeSet;
import com.vectrace.MercurialEclipse.model.HgFile;

public class MercurialTextSearchTreeLabelProvider extends LabelProvider implements IStyledLabelProvider {

    public static final int SHOW_LABEL = 1;
    public static final int SHOW_LABEL_PATH = 2;
    public static final int SHOW_PATH_LABEL = 3;

    private static final String FG_SEPARATOR_FORMAT = "{0} - {1}"; //$NON-NLS-1$

    private final WorkbenchLabelProvider fLabelProvider;
    private final AbstractTextSearchViewPage fPage;
    private final Image fLineMatchImage;

    private final int fOrder;

    public MercurialTextSearchTreeLabelProvider(AbstractTextSearchViewPage page, int orderFlag) {
        fLabelProvider = new WorkbenchLabelProvider();
        fOrder = orderFlag;
        fPage = page;
        fLineMatchImage = SearchPluginImages.get(SearchPluginImages.IMG_OBJ_TEXT_SEARCH_LINE);
    }

    @Override
    public String getText(Object object) {
        return getStyledText(object).getString();
    }

    private StyledString getColoredLabelWithCounts(Object element, StyledString coloredName) {
        AbstractTextSearchResult result = fPage.getInput();
        if (result == null) {
            return coloredName;
        }

        int matchCount = result.getMatchCount(element);
        if (matchCount <= 1) {
            return coloredName;
        }

        String countInfo = Messages.format(SearchMessages.FileLabelProvider_count_format,
                Integer.valueOf(matchCount));
        coloredName.append(' ').append(countInfo, StyledString.COUNTER_STYLER);
        return coloredName;
    }

    public StyledString getStyledText(Object element) {
        if (element instanceof HgFile) {
            HgFile mrs = (HgFile) element;
            ChangeSet cs = mrs.getChangeSet();
            if (cs == null) {
                return new StyledString("");
            }
            return new StyledString(cs.getIndex() + " [" + cs.getAuthor() + "] (" + cs.getAgeDate() + ")");
        }

        if (element instanceof MercurialMatch) {
            MercurialMatch match = (MercurialMatch) element;
            return getMercurialMatchLabel(match);
        }

        if (!(element instanceof IResource)) {
            return new StyledString(element.toString());
        }

        IResource resource = (IResource) element;
        if (!resource.exists()) {
            new StyledString(SearchMessages.FileLabelProvider_removed_resource_label);
        }

        String name = BasicElementLabels.getResourceName(resource);
        if (fOrder == SHOW_LABEL) {
            return getColoredLabelWithCounts(resource, new StyledString(name));
        }

        String pathString = BasicElementLabels.getPathLabel(resource.getParent().getFullPath(), false);
        if (fOrder == SHOW_LABEL_PATH) {
            StyledString str = new StyledString(name);
            String decorated = Messages.format(FG_SEPARATOR_FORMAT, new String[] { str.getString(), pathString });

            styleDecoratedString(decorated, StyledString.QUALIFIER_STYLER, str);
            return getColoredLabelWithCounts(resource, str);
        }

        StyledString str = new StyledString(
                Messages.format(FG_SEPARATOR_FORMAT, new String[] { pathString, name }));
        return getColoredLabelWithCounts(resource, str);
    }

    /**
     * TODO this is a temporary copy from StyledCellLabelProvider (Eclipse 3.5) we have to keep it
     * as long as we want to be Eclipse 3.4 compatible
     *
     * Applies decoration styles to the decorated string and adds the styles of the previously
     * undecorated string.
     * <p>
     * If the <code>decoratedString</code> contains the <code>styledString</code>, then the result
     * keeps the styles of the <code>styledString</code> and styles the decorations with the
     * <code>decorationStyler</code>. Otherwise, the decorated string is returned without any
     * styles.
     *
     * @param decoratedString
     *            the decorated string
     * @param decorationStyler
     *            the styler to use for the decoration or <code>null</code> for no styles
     * @param styledString
     *            the original styled string
     *
     * @return the styled decorated string (can be the given <code>styledString</code>)
     * @since 3.5
     */
    private static StyledString styleDecoratedString(String decoratedString, Styler decorationStyler,
            StyledString styledString) {
        String label = styledString.getString();
        int originalStart = decoratedString.indexOf(label);
        if (originalStart == -1) {
            return new StyledString(decoratedString); // the decorator did something wild
        }

        if (decoratedString.length() == label.length()) {
            return styledString;
        }

        if (originalStart > 0) {
            StyledString newString = new StyledString(decoratedString.substring(0, originalStart),
                    decorationStyler);
            newString.append(styledString);
            styledString = newString;
        }
        if (decoratedString.length() > originalStart + label.length()) { // decorator appended
            // something
            return styledString.append(decoratedString.substring(originalStart + label.length()), decorationStyler);
        }
        return styledString; // no change
    }

    private static StyledString getMercurialMatchLabel(MercurialMatch match) {
        int lineNumber = match.getLineNumber();
        String becomesMatch = match.isBecomesMatch() ? "+" : "-";
        StyledString str = new StyledString(lineNumber + " (" + becomesMatch + ") ", StyledString.QUALIFIER_STYLER);

        String content = match.getExtract();

        return str.append(content);
    }

    @Override
    public Image getImage(Object element) {
        if (element instanceof HgFile) {
            return MercurialEclipsePlugin.getImage("elcl16/changeset_obj.gif");
        }

        if (element instanceof MercurialMatch) {
            return fLineMatchImage;
        }

        if (!(element instanceof IResource)) {
            return null;
        }

        return getResourceImage(element);
    }

    /**
     * @param element
     * @return
     */
    protected Image getResourceImage(Object element) {
        IResource resource = (IResource) element;
        Image image = fLabelProvider.getImage(resource);
        return image;
    }

    @Override
    public void dispose() {
        super.dispose();
        fLabelProvider.dispose();
    }

    @Override
    public boolean isLabelProperty(Object element, String property) {
        return fLabelProvider.isLabelProperty(element, property);
    }

    @Override
    public void removeListener(ILabelProviderListener listener) {
        super.removeListener(listener);
        fLabelProvider.removeListener(listener);
    }

    @Override
    public void addListener(ILabelProviderListener listener) {
        super.addListener(listener);
        fLabelProvider.addListener(listener);
    }

    protected static String getCsInfoString(HgFile mrs) {
        ChangeSet cs = mrs.getChangeSet();
        String csInfo = cs.getIndex() + " [" + cs.getAuthor() + "] (" + cs.getAgeDate() + ") ";
        return csInfo;
    }

}