name.schedenig.eclipse.grepconsole.view.items.ItemLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for name.schedenig.eclipse.grepconsole.view.items.ItemLabelProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2008 - 2014 Marian Schedenig
 * 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:
 *    Marian Schedenig - initial API and implementation
 *******************************************************************************/

package name.schedenig.eclipse.grepconsole.view.items;

import java.util.Map;

import name.schedenig.eclipse.grepconsole.Activator;
import name.schedenig.eclipse.grepconsole.i18n.Messages;
import name.schedenig.eclipse.grepconsole.model.AbstractGrepModelElement;
import name.schedenig.eclipse.grepconsole.model.GrepExpressionFolder;
import name.schedenig.eclipse.grepconsole.model.GrepExpressionItem;
import name.schedenig.eclipse.grepconsole.model.GrepExpressionsWithSelection;
import name.schedenig.eclipse.grepconsole.model.GrepGroup;
import name.schedenig.eclipse.grepconsole.model.GrepStyle;
import name.schedenig.eclipse.grepconsole.model.InheritedFlagResolver;
import name.schedenig.eclipse.grepconsole.model.InheritedFlagResolver.InheritedFlag;
import name.schedenig.eclipse.grepconsole.view.colors.ColorRegistry;

import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.OwnerDrawLabelProvider;
import org.eclipse.jface.viewers.ViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.TextLayout;
import org.eclipse.swt.graphics.TextStyle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;

/**
 * A label provider for model trees. Displays style thumbnails and item labels.
 * 
 * @author msched
 */
public class ItemLabelProvider extends OwnerDrawLabelProvider implements ILabelProvider {
    /** Space (in pixels) between thumbnail and label. */
    private static final int SPACE = 4;

    /** RGB value for disabled labels. */
    private static final RGB RGB_DISABLED = new RGB(160, 160, 160);

    /** Viewer to which the provider is bound. */
    private ColumnViewer viewer;

    /** Style image registry for thumbnail images. */
    private StyleImageRegistry styleImageRegistry = new StyleImageRegistry();

    /** Colour registry for label colours. */
    private ColorRegistry colorRegistry = new ColorRegistry(Activator.getDefault().getColorRegistry());

    /**
     * @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
     */
    @Override
    public void dispose() {
        super.dispose();

        styleImageRegistry.dispose();
        colorRegistry.disposeColors();
    }

    /**
     * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#initialize(org.eclipse.jface.viewers.ColumnViewer, org.eclipse.jface.viewers.ViewerColumn)
     */
    @Override
    protected void initialize(ColumnViewer viewer, ViewerColumn column) {
        super.initialize(viewer, column);

        this.viewer = viewer;
    }

    /**
     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
     */
    @Override
    public String getText(Object element) {
        AbstractGrepModelElement grepElement = (AbstractGrepModelElement) element;

        String text = null;

        if ((grepElement instanceof GrepExpressionItem) && (grepElement.getName() == null)) {
            text = ((GrepExpressionItem) grepElement).getGrepExpression();
        }

        if (text == null) {
            text = grepElement.getName();
        }

        return text == null ? "" : text; //$NON-NLS-1$
    }

    /**
     * Returns the font to use for a specific element.
     * 
     * For groups, a bold version of the default font is returned. For all other
     * items, <code>null</code> is returned.
     * 
     * @param element Element.
     * 
     * @return Font, or <code>null</code>.
     */
    public Font getFont(Object element) {
        if (element instanceof GrepExpressionFolder) {
            return JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT);
        } else {
            return JFaceResources.getDialogFont();
        }
    }

    /**
     * For groups, no image is returned. For items, style thumbnail images are
     * created on demand.
     * 
     * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
     */
    @Override
    public Image getImage(Object element) {
        if (!(element instanceof GrepExpressionItem)) {
            return null;
        }

        GrepExpressionItem item = (GrepExpressionItem) element;

        if (item.getGroups() == null || item.getGroups().length == 0) {
            return null;
        }

        GrepStyle style = null;

        for (GrepGroup g : item.getGroups()) {
            GrepStyle s = g.getStyle();

            if (s != null) {
                style = s;
                break;
            }
        }

        RGB foreground = style == null ? null : style.getForeground();
        RGB background = style == null ? null : style.getBackground();

        return styleImageRegistry.getColorImage(new StyleImageRegistry.RgbPair(foreground, background));
    }

    /**
     * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#measure(org.eclipse.swt.widgets.Event, java.lang.Object)
     */
    @Override
    protected void measure(Event event, Object element) {
        GC gc = event.gc;
        Image image = getImage(element);
        String text = getText(element);

        Font oldFont = gc.getFont();
        Font font = getFont(element);

        if (font == null) {
            font = JFaceResources.getFont(JFaceResources.DEFAULT_FONT);
        }

        gc.setFont(font);
        Point size = gc.textExtent(text);
        gc.setFont(oldFont);

        if (image != null) {
            Rectangle imageBounds = image.getBounds();

            size.x += imageBounds.width + SPACE;
            size.y = Math.max(size.y, imageBounds.height);
        }

        event.setBounds(new Rectangle(event.x, event.y, size.x, size.y));
    }

    /**
     * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#erase(org.eclipse.swt.widgets.Event, java.lang.Object)
     */
    @Override
    protected void erase(Event event, Object element) {
    }

    /**
     * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#paint(org.eclipse.swt.widgets.Event, java.lang.Object)
     */
    @Override
    protected void paint(Event event, Object element) {
        Image image = getImage(element);
        String text = getText(element);

        boolean enabled = isElementEnabled((AbstractGrepModelElement) element);
        boolean selected = (event.detail & SWT.SELECTED) != 0;
        Color color;

        if (enabled) {
            Display display = viewer.getControl().getDisplay();
            color = selected ? display.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT)
                    : display.getSystemColor(SWT.COLOR_LIST_FOREGROUND);
        } else {
            color = colorRegistry.get(RGB_DISABLED);
        }

        int x = event.x;

        if (image != null) {
            Rectangle imageBounds = image.getBounds();
            event.gc.drawImage(image, event.x, event.y + (event.height - imageBounds.height) / 2);
            int imageWidth = imageBounds.width + SPACE;
            x += imageWidth;
        }

        Device device = event.gc.getDevice();
        TextLayout layout = new TextLayout(device);

        try {
            Font font = getFont(element);

            if (font == null) {
                font = JFaceResources.getFont(JFaceResources.DEFAULT_FONT);
            }

            TextStyle style = new TextStyle(font, color, null);

            layout.setText(text);
            layout.setStyle(style, 0, text.length());
            layout.draw(event.gc, x, event.y + (event.height - layout.getBounds().height) / 2);
        } finally {
            layout.dispose();
        }
    }

    /**
     * Determines whether an element is enabled by reverse iterating through
     * its parents in the model tree.
     * 
     * Uses the enablement map, if available, and the elements' default values.
     * 
     * @param element Element.
     * 
     * @return Whether the element is enabled.
     */
    public boolean isElementEnabled(AbstractGrepModelElement element) {
        GrepExpressionFolder parent = element.getParent();

        if (parent != null) {
            if (!isElementEnabled(element.getParent())) {
                return false;
            }
        }

        Map<String, Boolean> enablementMap = getEnablementMap();
        Boolean enabled;

        if (enablementMap == null) {
            enabled = null;
        } else {
            enabled = enablementMap.get(element.getId());
        }

        if (enabled == null) {
            enabled = element.isDefaultEnabled();
        }

        return enabled;
    }

    /**
     * Returns the enablement map, if the viewer's input is a
     * GrepExpressionWithSelection instance.
     * 
     * @return Enablement map, or <code>null</code>.
     */
    private Map<String, Boolean> getEnablementMap() {
        Object input = viewer.getInput();

        if (input instanceof GrepExpressionsWithSelection) {
            return ((GrepExpressionsWithSelection) viewer.getInput()).getEnablementMap();
        } else {
            return null;
        }
    }

    /**
     * Returns the filter map, if the viewer's input is a
     * GrepExpressionWithSelection instance.
     * 
     * @return Filter map, or <code>null</code>.
     */
    private Map<String, Boolean> getFilterMap() {
        Object input = viewer.getInput();

        if (input instanceof GrepExpressionsWithSelection) {
            return ((GrepExpressionsWithSelection) viewer.getInput()).getFilterMap();
        } else {
            return null;
        }
    }

    /**
     * Returns the statistics map, if the viewer's input is a
     * GrepExpressionWithSelection instance.
     * 
     * @return Statistics map, or <code>null</code>.
     */
    private Map<String, Boolean> getStatisticsMap() {
        Object input = viewer.getInput();

        if (input instanceof GrepExpressionsWithSelection) {
            return ((GrepExpressionsWithSelection) viewer.getInput()).getStatisticsMap();
        } else {
            return null;
        }
    }

    /**
     * Returns the notifications map, if the viewer's input is a
     * GrepExpressionWithSelection instance.
     * 
     * @return Filter map, or <code>null</code>.
     */
    private Map<String, Boolean> getNotificationsMap() {
        Object input = viewer.getInput();

        if (input instanceof GrepExpressionsWithSelection) {
            return ((GrepExpressionsWithSelection) viewer.getInput()).getNotificationsMap();
        } else {
            return null;
        }
    }

    /**
     * @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipText(java.lang.Object)
     */
    @Override
    public String getToolTipText(Object element) {
        String name = getText(element);
        AbstractGrepModelElement me = (AbstractGrepModelElement) element;
        InheritedFlag enabled = InheritedFlagResolver.ENABLED_RESOLVER.getFlag(me, getEnablementMap());
        InheritedFlag filtered = InheritedFlagResolver.FILTER_RESOLVER.getFlag(me, getFilterMap());
        InheritedFlag statistics = InheritedFlagResolver.STATISTICS_RESOLVER.getFlag(me, getStatisticsMap());
        InheritedFlag notifications = InheritedFlagResolver.NOTIFICATIONS_RESOLVER.getFlag(me,
                getNotificationsMap());

        String enabledText = (enabled.isSet() ? Messages.ItemLabelProvider_styled
                : Messages.ItemLabelProvider_unstyled)
                + (enabled.isInherited() ? " " + Messages.ItemLabelProvider_inherited : ""); //$NON-NLS-1$ //$NON-NLS-2$
        String filteredText = (filtered.isSet() ? Messages.ItemLabelProvider_filtered
                : Messages.ItemLabelProvider_unfiltered)
                + (filtered.isInherited() ? " " + Messages.ItemLabelProvider_inherited : ""); //$NON-NLS-1$ //$NON-NLS-2$
        String statisticsText = (statistics.isSet() ? Messages.ItemLabelProvider_statistics
                : Messages.ItemLabelProvider_no_statistics)
                + (filtered.isInherited() ? " " + Messages.ItemLabelProvider_inherited : ""); //$NON-NLS-1$ //$NON-NLS-2$
        String notificationsText = (notifications.isSet() ? Messages.ItemLabelProvider_notifications
                : Messages.ItemLabelProvider_no_notifications)
                + (notifications.isInherited() ? " " + Messages.ItemLabelProvider_inherited : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$

        String s = name + " - " + enabledText + ", " + filteredText + ", " + statisticsText + "," //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
                + notificationsText + "."; //$NON-NLS-1$
        return s;
    }
}