coloredide.astview.ASTViewLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for coloredide.astview.ASTViewLabelProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2005 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
 *******************************************************************************/

package coloredide.astview;

import java.util.Set;

import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.IFontProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;

import coloredide.astview.internal.ASTAttribute;
import coloredide.astview.internal.Binding;
import coloredide.astview.internal.BindingProperty;
import coloredide.astview.internal.Error;
import coloredide.astview.internal.ExceptionAttribute;
import coloredide.astview.internal.JavaElement;
import coloredide.astview.internal.NodeProperty;
import coloredide.features.Feature;
import coloredide.features.FeatureManager;

public class ASTViewLabelProvider extends LabelProvider implements IColorProvider, IFontProvider {
    private int fSelectionStart;

    private int fSelectionLength;

    private final Color fBlue, fRed, fDarkGray, fDarkGreen, fDarkRed;

    private final Font fBold;

    // to dispose:
    private final Font fAllocatedBoldItalic;

    private final Color fLightBlue, fLightRed;

    private ASTView fView;

    public ASTViewLabelProvider(ASTView view) {
        this.fView = view;
        fSelectionStart = -1;
        fSelectionLength = -1;

        Display display = Display.getCurrent();

        fRed = display.getSystemColor(SWT.COLOR_RED);
        fDarkGray = display.getSystemColor(SWT.COLOR_DARK_GRAY);
        fBlue = display.getSystemColor(SWT.COLOR_DARK_BLUE);
        fDarkGreen = display.getSystemColor(SWT.COLOR_DARK_GREEN);
        fDarkRed = display.getSystemColor(SWT.COLOR_DARK_RED);

        fLightBlue = new Color(display, 232, 242, 254); // default for
        // AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR
        fLightRed = new Color(display, 255, 190, 190);

        fBold = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getFontRegistry()
                .getBold(JFaceResources.DEFAULT_FONT);
        FontData[] fontData = fBold.getFontData();
        for (int i = 0; i < fontData.length; i++) {
            fontData[i].setStyle(fontData[i].getStyle() | SWT.ITALIC);
        }
        fAllocatedBoldItalic = new Font(display, fontData);
    }

    public void setSelectedRange(int start, int length) {
        fSelectionStart = start;
        fSelectionLength = length;
        // could be made more efficient by only updating selected node and
        // parents (of old and new selection)
        fireLabelProviderChanged(new LabelProviderChangedEvent(this));
    }

    public String getText(Object obj) {
        StringBuffer buf = new StringBuffer();
        if (obj instanceof ASTNode) {
            getNodeType((ASTNode) obj, buf);
        } else if (obj instanceof ASTAttribute) {
            buf.append(((ASTAttribute) obj).getLabel());
        }
        return buf.toString();
    }

    private void getNodeType(ASTNode node, StringBuffer buf) {
        buf.append(Signature.getSimpleName(node.getClass().getName()));
        buf.append(" ["); //$NON-NLS-1$
        buf.append(node.getStartPosition());
        buf.append(", "); //$NON-NLS-1$
        buf.append(node.getLength());
        buf.append(']');
        if ((node.getFlags() & ASTNode.MALFORMED) != 0) {
            buf.append(" (malformed)"); //$NON-NLS-1$
        }
        if ((node.getFlags() & ASTNode.RECOVERED) != 0) {
            buf.append(" (recovered)"); //$NON-NLS-1$
        }
    }

    public Image getImage(Object obj) {
        if (obj instanceof ASTNode) {
            return null;
        } else if (obj instanceof ASTAttribute) {
            return ((ASTAttribute) obj).getImage();
        }

        return null;
        // String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
        // if (obj instanceof ASTNode) {
        // imageKey = ISharedImages.IMG_OBJ_FOLDER;
        // }
        // return
        // PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
     */
    public Color getForeground(Object element) {
        if ((element instanceof Error))
            return fRed;
        if ((element instanceof ExceptionAttribute) && ((ExceptionAttribute) element).getException() != null)
            return fRed;

        if (element instanceof ASTNode) {
            ASTNode node = (ASTNode) element;
            if ((node.getFlags() & ASTNode.MALFORMED) != 0) {
                return fRed;
            }
            return fDarkGray;
        } else if (element instanceof Binding) {
            Binding binding = (Binding) element;
            if (!binding.isRelevant())
                return fDarkGray;
            return fBlue;
        } else if (element instanceof NodeProperty) {
            return null; // normal color
        } else if (element instanceof BindingProperty) {
            BindingProperty binding = (BindingProperty) element;
            if (!binding.isRelevant())
                return fDarkGray;
            return fBlue;
        } else if (element instanceof JavaElement) {
            JavaElement javaElement = (JavaElement) element;
            if (javaElement.getJavaElement() == null || !javaElement.getJavaElement().exists()) {
                return fRed;
            }
            return fDarkGreen;
        }
        return fDarkRed; // all extra properties
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
     */
    public Color getBackground(Object element) {
        ASTNode node = null;
        if (element instanceof ASTNode)
            node = (ASTNode) element;
        if (element instanceof NodeProperty && ((NodeProperty) element).getParent() instanceof ASTNode)
            node = (ASTNode) ((NodeProperty) element).getParent();

        if (node != null) {
            Set<Feature> colors = fView.getColoredJavaSourceFile().getColorManager().getColors(node);
            if (colors.size() > 0) {
                RGB rgb = FeatureManager.getCombinedRGB(colors);
                return new Color(Display.getCurrent(), rgb);
            }
        }
        if (isNotProperlyNested(element)) {
            return fLightRed;
        }
        if (fSelectionStart != -1 && isInside(element)) {
            return fLightBlue;
        }
        return null;
    }

    private boolean isNotProperlyNested(Object element) {
        if (element instanceof ASTNode) {
            ASTNode node = (ASTNode) element;
            int start = node.getStartPosition();
            int end = start + node.getLength();

            ASTNode parent = node.getParent();
            if (parent != null) {
                int parentstart = parent.getStartPosition();
                int parentend = parentstart + parent.getLength();

                if (start < parentstart || end > parentend) {
                    return true;
                }
            }
        }
        return false;
    }

    private boolean isInsideNode(ASTNode node) {
        int start = node.getStartPosition();
        int end = start + node.getLength();
        if (start <= fSelectionStart && (fSelectionStart + fSelectionLength) < end) {
            return true;
        }
        return false;
    }

    private boolean isInside(Object element) {
        if (element instanceof ASTNode) {
            return isInsideNode((ASTNode) element);
        } else if (element instanceof NodeProperty) {
            NodeProperty property = (NodeProperty) element;
            Object object = property.getNode();
            if (object instanceof ASTNode) {
                return isInsideNode((ASTNode) object);
            }
        }
        return false;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
     */
    public Font getFont(Object element) {
        if (element instanceof ASTNode) {
            ASTNode node = (ASTNode) element;
            if ((node.getFlags() & ASTNode.RECOVERED) != 0)
                return fAllocatedBoldItalic;
            else
                return fBold;
        }
        return null;
    }

    public void dispose() {
        super.dispose();
        fLightBlue.dispose();
        fLightRed.dispose();
        fAllocatedBoldItalic.dispose();
    }

}