edu.buffalo.cse.green.editor.controller.MemberPart.java Source code

Java tutorial

Introduction

Here is the source code for edu.buffalo.cse.green.editor.controller.MemberPart.java

Source

/* This file is part of Green.
 *
 * Copyright (C) 2005 The Research Foundation of State University of New York
 * All Rights Under Copyright Reserved, The Research Foundation of S.U.N.Y.
 * 
 * Green is free software, licensed under the terms of the Eclipse
 * Public License, version 1.0.  The license is available at
 * http://www.eclipse.org/legal/epl-v10.html
 */

package edu.buffalo.cse.green.editor.controller;

import static edu.buffalo.cse.green.editor.controller.PropertyChange.Element;
import static edu.buffalo.cse.green.preferences.PreferenceInitializer.P_COLOR_UML;
import static edu.buffalo.cse.green.preferences.PreferenceInitializer.P_DISPLAY_ELEMENT_TOOLTIPS;
import static org.eclipse.jdt.core.IJavaElement.CLASS_FILE;
import static org.eclipse.jdt.core.IJavaElement.COMPILATION_UNIT;

import org.eclipse.draw2d.MouseEvent;
import org.eclipse.draw2d.MouseMotionListener;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.Javadoc;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;

import edu.buffalo.cse.green.PlugIn;
import edu.buffalo.cse.green.editor.model.AbstractModel;
import edu.buffalo.cse.green.editor.model.MemberModel;
import edu.buffalo.cse.green.editor.view.IIconHolder;

/**
 * The superclass of parts that correspond to <code>MemberModel</code>s.
 * 
 * @author bcmartin
 */
public abstract class MemberPart extends AbstractPart {

    /**
     * @return The label for the part.
     */
    protected abstract IIconHolder getNameLabel();

    /**
     * Auxiliary method; makes reading easier. 
     */
    private IIconHolder figure() {
        return (IIconHolder) getFigure();
    }

    /**
     * @see edu.buffalo.cse.green.editor.controller.AbstractPart#addPropertyListeners()
     */
    @Override
    protected void addPropertyListeners() {
        addListener(Element, new VisualsUpdater());
    }

    /**
     * @return The part's corresponding javadoc.
     */
    private String getJavaDoc() {
        final IMember element = (IMember) model().getJavaElement();
        int type = element.isBinary() ? CLASS_FILE : COMPILATION_UNIT;

        CompilationUnit cu = getEditor().getCompilationUnit(element.getAncestor(type));

        //If no source code attached for given element
        if (cu == null)
            return "";

        JavadocGrabber grabber = getJavadocGrabber();
        grabber.setElement(model().getMember());
        cu.accept(grabber);

        return grabber.getJavadoc();
    }

    /**
     * @return An instance of a <code>JavadocGrabber</code> appropriate to the
     * current part.
     */
    protected abstract JavadocGrabber getJavadocGrabber();

    /**
     * @see org.eclipse.gef.EditPart#deactivate()
     */
    @Override
    public void deactivate() {
        deactivate(figure().shouldDisposeFont());
        getRootPart().unmapModelFromEditPart((AbstractModel) getModel());
    }

    /**
     * Called when the part is destroyed. Optionally removes the icon.
     * 
     * @param removeIcon - If true, the icon will be destroyed; otherwise, it
     * will not be destroyed.
     */
    protected void deactivate(boolean removeIcon) {
        if (removeIcon) {
            // free up memory
            figure().getIcon().dispose();
        }

        super.deactivate();
    }

    /**
     * @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
     */
    protected void refreshVisuals(IIconHolder figure) {
        updateFont();
        updateIcon(figure);
        updateLabel();
        updateVisibility();
    }

    /**
     * Updates the visibility of this member as appropriate.
     */
    private void updateVisibility() {
        try {
            // hide the model if it is filtered out
            if (getEditor().isFiltered(model().getMember())) {
                model().setVisible(false);
            }
        } catch (JavaModelException e) {
            e.printStackTrace();
        }
    }

    /**
     * Called to update the font.
     */
    public abstract void updateFont();

    /**
     * Called to update the icon.
     * 
     * @param figure - The holder within the child part which contains the icon.
     */
    protected void updateIcon(IIconHolder figure) {
        final Image image = model().getIcon();
        final Image oldImage = figure.getIcon();
        final IIconHolder figure1 = figure;

        if (Display.getCurrent() != null) {
            figure.setIcon(image);
            if (oldImage != null) {
                oldImage.dispose();
            }
        } else {
            Display.getDefault().asyncExec(new Runnable() {
                /**
                 * @see java.lang.Runnable#run()
                 */
                public void run() {
                    figure1.setIcon(image);
                    if (oldImage != null) {
                        oldImage.dispose();
                    }
                }
            });
        }
    }

    /**
     * Called to update the label.
     */
    public abstract void updateLabel();

    /**
     * Called to repaint the label's contents.
     * 
     * @param label - The label to repaint.
     */
    protected void repaintLabel(final IIconHolder label) {
        if (Display.getCurrent() != null) {
            label.setText(model().getDisplayName());
            label.repaint();
        } else {
            Display.getDefault().asyncExec(new Runnable() {
                /**
                 * @see java.lang.Runnable#run()
                 */
                public void run() {
                    label.setText(model().getDisplayName());
                    label.repaint();
                }
            });
        }
    }

    /**
     * Auxiliary method; makes reading easier. 
     */
    private MemberModel model() {
        return (MemberModel) getModel();
    }

    /**
     * @see edu.buffalo.cse.green.editor.controller.AbstractPart#setInitialBackgroundColor()
     */
    @Override
    public void setInitialBackgroundColor() {
        getFigure().setBackgroundColor(PlugIn.getColorPreference(P_COLOR_UML));
    }

    /**
     * @see edu.buffalo.cse.green.editor.controller.AbstractPart#initialize()
     */
    @Override
    public void initialize() {
        getNameLabel().addMouseMotionListener(new MouseMotionListener() {
            /**
             * @see org.eclipse.draw2d.MouseMotionListener#mouseDragged(org.eclipse.draw2d.MouseEvent)
             */
            public void mouseDragged(MouseEvent me) {
            }

            /**
             * @see org.eclipse.draw2d.MouseMotionListener#mouseEntered(org.eclipse.draw2d.MouseEvent)
             */
            public void mouseEntered(MouseEvent me) {
                if (!PlugIn.getBooleanPreference(P_DISPLAY_ELEMENT_TOOLTIPS)) {
                    return;
                }
                String doc = getJavaDoc().trim();
                doc = removeCommentMarks(doc);
                getViewer().getControl().setToolTipText(doc);
            }

            /**
             * Removes comments, converts @ tags for JavaDoc, and 
             * removes all HTML tags
             * 
             * @author zgwang
             * @param doc the JavaDoc string
             * @return the modified JavaDoc string
             */
            private String removeCommentMarks(String doc) {
                doc = doc.replace("/**", "");
                doc = doc.replace("*/", "");
                doc = doc.replace("\n * ", "\n");
                doc = doc.replace("\n@author", "\n\nAuthor:\n");
                doc = doc.replace("\n@exception", "\n\nThrows:\n");
                doc = doc.replace("\n@param", "\n\nParameters:\n");
                doc = doc.replace("\n@return", "\n\nReturns:\n");
                doc = doc.replace("\n@see", "\n\nSee:\n");
                doc = doc.replace("\n@since", "\n\nSince:\n");
                doc = doc.replace("\n@throws", "\n\nThrows:\n");
                doc = doc.replace("\n@version", "\n\nVersion:\n");

                //Removing HTML tags
                while (doc.contains("<") && doc.contains(">") && doc.indexOf('<') < doc.indexOf('>')
                        && !doc.substring(doc.indexOf('<'), doc.indexOf('>')).contains(" ")) {
                    int start = 0;
                    for (int i = 0; i < doc.length(); i++) {
                        if (doc.charAt(i) == '<')
                            start = i;
                        if (doc.charAt(i) == '>') {
                            doc = doc.substring(0, start) + doc.substring(i + 1);
                            start = 0;
                        }
                    }
                }

                return doc;
            }

            /**
             * @see org.eclipse.draw2d.MouseMotionListener#mouseExited(org.eclipse.draw2d.MouseEvent)
             */
            public void mouseExited(MouseEvent me) {
                getViewer().getControl().setToolTipText(null);
            }

            /**
             * @see org.eclipse.draw2d.MouseMotionListener#mouseHover(org.eclipse.draw2d.MouseEvent)
             */
            public void mouseHover(MouseEvent me) {
            }

            /**
             * @see org.eclipse.draw2d.MouseMotionListener#mouseMoved(org.eclipse.draw2d.MouseEvent)
             */
            public void mouseMoved(MouseEvent me) {
            }
        });
    }

    /**
     * @param doc - The <code>Javadoc</code>.
     * @return The javadoc String from the given <code>Javadoc</code>.
     */
    protected String getDoc(Javadoc doc) {
        if (doc == null) {
            return "";
        }

        return doc.toString();
    }
}

/**
 * Retrieves the javadoc string that corresponds to an
 * <code>IJavaElement</code>.
 * 
 * @author bcmartin
 */
class JavadocGrabber extends ASTVisitor {
    private IJavaElement _element;
    protected String _doc;

    /**
     * Sets the element whose doc is being grabbed.
     * 
     * @param element - The element.
     */
    public void setElement(IJavaElement element) {
        _element = element;
    }

    /**
     * Compares two <code>IJavaElement</code>s for equality.
     * 
     * @param element - The element to compare the current element to.
     * @return true if the elements are equal; false otherwise.
     */
    public boolean compareElements(IJavaElement element) {
        return (_element.getHandleIdentifier().equals(element.getHandleIdentifier()));
    }

    /**
     * @return The javadoc, if one was found; false otherwise.
     */
    public String getJavadoc() {
        return _doc != null ? _doc : "";
    }
}