/* 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.IncomingRelationship; import static edu.buffalo.cse.green.editor.controller.PropertyChange.OutgoingRelationship; import static edu.buffalo.cse.green.preferences.PreferenceInitializer.P_COLOR_SELECTED; import static edu.buffalo.cse.green.preferences.PreferenceInitializer.P_COLOR_TYPE_BORDER; import static edu.buffalo.cse.green.preferences.PreferenceInitializer.P_COLOR_TYPE_BORDER_HIDDENR; import static edu.buffalo.cse.green.preferences.PreferenceInitializer.P_COLOR_TYPE_TEXT; import static edu.buffalo.cse.green.preferences.PreferenceInitializer.P_COLOR_UML; import static edu.buffalo.cse.green.preferences.PreferenceInitializer.P_FONT; import org.eclipse.draw2d.ChopboxAnchor; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.LineBorder; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.ConnectionEditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.NodeEditPart; import org.eclipse.gef.Request; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; import org.eclipse.jdt.core.dom.EnumDeclaration; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import edu.buffalo.cse.green.PlugIn; import edu.buffalo.cse.green.editor.controller.policies.GreenSelectionEditPolicy; import edu.buffalo.cse.green.editor.controller.policies.RelationshipSourceAndTargetCreationEditPolicy; import edu.buffalo.cse.green.editor.model.TypeModel; import edu.buffalo.cse.green.editor.model.commands.DeleteCommand; import edu.buffalo.cse.green.editor.model.commands.DeleteTypeCommand; import edu.buffalo.cse.green.editor.view.IIconHolder; import edu.buffalo.cse.green.editor.view.ITypeFigure; /** * @author bcmartin * * Controller part for a UML type box. It acts as a node for relationship * connections by providing anchors as appropriate. It also handles the updating * of information regarding the type. */ public class TypePart extends MemberPart implements NodeEditPart { /** * @see edu.buffalo.cse.green.editor.controller.AbstractPart#doCreateFigure() */ protected IFigure doCreateFigure() { ITypeFigure f = (ITypeFigure) generateFigure(); f.setLocation(model().getLocation()); f.setSize(model().getSize()); f.getNameLabel().setFont( PlugIn.getFontPreference(P_FONT, false)); return f; } /** * @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals() */ protected void refreshVisuals() { super.refreshVisuals(getNameLabel()); GraphicalEditPart parent = (GraphicalEditPart) getParent(); parent.setLayoutConstraint(this, figure(), new Rectangle(model().getLocation(), model().getSize())); figure().validate(); } /** * @see edu.buffalo.cse.green.editor.controller.MemberPart#updateIcon() */ public void updateIcon() { super.updateIcon(getNameLabel()); } /** * @see edu.buffalo.cse.green.editor.controller.MemberPart#updateLabel() */ public void updateLabel() { repaintLabel(getNameLabel()); } /** * @see edu.buffalo.cse.green.editor.controller.MemberPart#updateFont() */ public void updateFont() { if (Display.getCurrent() != null) { updateFontHelper(); } else { Display.getDefault().asyncExec(new Runnable() { /** * @see java.lang.Runnable#run() */ public void run() { updateFontHelper(); } }); } } /** * Disposes the current font and creates a new one that's up to date. */ private void updateFontHelper() { try { // get rid of the old font Font font = getNameLabel().getFont(); font.dispose(); boolean italic = model().isAbstract() || model().isInterface(); // create the new font getNameLabel().setFont(PlugIn.getFontPreference(P_FONT, italic)); } catch (JavaModelException e) { e.printStackTrace(); } } /** * @see edu.buffalo.cse.green.editor.controller.AbstractPart#getDeleteCommand() */ public DeleteCommand getDeleteCommand() { return new DeleteTypeCommand(model()); } protected void addPropertyListeners() { super.addPropertyListeners(); addListener(IncomingRelationship, new ChildAndVisualsUpdater()); addListener(OutgoingRelationship, new ChildAndVisualsUpdater()); } /** * @see edu.buffalo.cse.green.editor.controller.AbstractPart#onDoubleClick() */ protected void onDoubleClick() { getOpenElementAction().run(); } /** * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies() */ protected void createEditPolicies() { super.createEditPolicies(); installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new RelationshipSourceAndTargetCreationEditPolicy()); installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new GreenSelectionEditPolicy()); } /** * @return true if this part has a field compartment, false otherwise */ protected boolean hasFieldCompartment() { try { return model().getType().isClass(); } catch (JavaModelException e) { e.printStackTrace(); return false; } } /** * @see org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.ConnectionEditPart) */ public ConnectionAnchor getSourceConnectionAnchor( ConnectionEditPart connection) { return new ChopboxAnchor(figure()); } /** * @see org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.ConnectionEditPart) */ public ConnectionAnchor getTargetConnectionAnchor( ConnectionEditPart connection) { return new ChopboxAnchor(figure()); } /** * @see org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.Request) */ public ConnectionAnchor getSourceConnectionAnchor(Request request) { return new ChopboxAnchor(figure()); } /** * @see org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.Request) */ public ConnectionAnchor getTargetConnectionAnchor(Request request) { return new ChopboxAnchor(figure()); } /** * @return the label containing the name of this part */ public IIconHolder getNameLabel() { return figure().getNameLabel(); } /** * Auxiliary method; makes reading easier. */ private TypeModel model() { return (TypeModel) getModel(); } /** * @see org.eclipse.gef.EditPart#deactivate() */ public void deactivate() { // free up memory Image image = getNameLabel().getIcon(); Font font = getNameLabel().getFont(); if (image != null) image.dispose(); if (font != null && figure().shouldDisposeFont()) font.dispose(); super.deactivate(false); } /** * Auxiliary method; makes reading easier. */ private ITypeFigure figure() { return (ITypeFigure) getFigure(); } /** * @see edu.buffalo.cse.green.editor.controller.AbstractPart#updateColors(org.eclipse.draw2d.IFigure) */ protected void updateColors(IFigure f) { ITypeFigure tf = (ITypeFigure) f; f.setBorder(new LineBorder( PlugIn.getColorPreference(P_COLOR_TYPE_BORDER), 2)); f.setBackgroundColor(PlugIn.getColorPreference(P_COLOR_UML)); tf.getNameLabel().setForegroundColor(PlugIn.getColorPreference( P_COLOR_TYPE_TEXT)); if (model().getImplicitRelationships().size() == 0) { f.setBorder(new LineBorder( PlugIn.getColorPreference(P_COLOR_TYPE_BORDER), 2)); } else { f.setBorder(new LineBorder(PlugIn.getColorPreference( P_COLOR_TYPE_BORDER_HIDDENR), 2)); } } /** * @see edu.buffalo.cse.green.editor.controller.AbstractPart#setInitialBackgroundColor() */ public void setInitialBackgroundColor() { getNameLabel().getParent().setBackgroundColor( PlugIn.getColorPreference(P_COLOR_UML)); getNameLabel().setOpaque(false); } /** * @see edu.buffalo.cse.green.editor.controller.AbstractPart#setSelectedBackgroundColor() */ public void setSelectedBackgroundColor() { getNameLabel().getParent().setBackgroundColor( PlugIn.getColorPreference(P_COLOR_SELECTED)); getNameLabel().setOpaque(false); } /** * @see edu.buffalo.cse.green.editor.controller.MemberPart#getJavadocGrabber() */ protected JavadocGrabber getJavadocGrabber() { return new JavadocGrabber() { private boolean _alive = true; /** * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.EnumDeclaration) */ public boolean visit(EnumDeclaration node) { return visitNode(node); } /** * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.TypeDeclaration) */ public boolean visit(TypeDeclaration node) { return visitNode(node); } /** * @param node - The node to visit. * @return true if child nodes should be visited, false otherwise */ private boolean visitNode(AbstractTypeDeclaration node) { if (!_alive) return false; IType type = (IType) node.resolveBinding().getJavaElement(); if (checkDoc(type)) _doc = getDoc(node.getJavadoc()); return _alive; } private boolean checkDoc(IType type) { if (compareElements(type)) { _alive = false; return true; } return false; } }; } /** * @return The label that holds the icons used for incremental exploration. */ public IFigure getRelLabel() { return figure().getRelLabel(); } }