/* 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.model; import static org.eclipse.draw2d.ToolbarLayout.ALIGN_CENTER; import static org.eclipse.draw2d.ToolbarLayout.ALIGN_TOPLEFT; import java.util.ArrayList; import java.util.List; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.MouseEvent; import org.eclipse.draw2d.MouseListener; import org.eclipse.draw2d.ToolbarLayout; import org.eclipse.gef.commands.Command; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.graphics.Font; import edu.buffalo.cse.green.GreenException; import edu.buffalo.cse.green.PlugIn; import edu.buffalo.cse.green.editor.DiagramEditor; import edu.buffalo.cse.green.editor.controller.CompartmentPart; import edu.buffalo.cse.green.editor.controller.TypePart; import edu.buffalo.cse.green.editor.model.commands.DeleteCommand; import edu.buffalo.cse.green.editor.model.commands.IncrementalExploreCommand; import edu.buffalo.cse.green.editor.view.CompartmentFigure; import edu.buffalo.cse.green.relationships.RelationshipGroup; /** * Holds a list of IMembers. Provides a list-like interface. * * @author hk47 * @author bcmartin */ public abstract class CompartmentModel extends AbstractModel<AbstractModel, TypeModel, IJavaElement> { private CompartmentModel() {} /** * @see edu.buffalo.cse.green.editor.model.AbstractModel#getPartClass() */ public Class getPartClass() { return CompartmentPart.class; } /** * @see edu.buffalo.cse.green.editor.model.AbstractModel#getDeleteCommand(edu.buffalo.cse.green.editor.DiagramEditor) */ public DeleteCommand getDeleteCommand(DiagramEditor editor) { return null; } /** * @param editor - The <code>DiagramEditor</code> containing this model. * * @return A command to hide this model. */ public Command getHideCommand(DiagramEditor editor) { return null; } /** * @see edu.buffalo.cse.green.editor.model.AbstractModel#getJavaElement() */ public IJavaElement getJavaElement() { return null; } /** * Adds a <code>MethodModel</code> child to this model. * * @param model - The child. */ abstract void addChild(MethodModel model); /** * Adds a <code>FieldModel</code> child to this model. * * @param model - The child. */ abstract void addChild(FieldModel model); /** * @see edu.buffalo.cse.green.editor.model.AbstractModel#removeFromParent() */ public void removeFromParent() { removeChildren(); getParent().removeChild(this); } /** * @see java.lang.Object#toString() */ public String toString() { return getChildren().toString(); } /** * @see edu.buffalo.cse.green.editor.model.AbstractModel#handleDispose() */ public void handleDispose() { // do nothing } /** * @see edu.buffalo.cse.green.editor.model.AbstractModel#getTypeModel() */ public TypeModel getTypeModel() { return getParent().getTypeModel(); } /** * @return A value indicating how the compartment should lay out its * contents (e.g. left- or center-aligned). */ public abstract int getLayout(); /** * @return A new <code>CompartmentModel</code> that holds * <code>FieldModel</code> instances. */ public static CompartmentModel newFieldCompartment() { return new CompartmentModel() { /** * @see edu.buffalo.cse.green.editor.model.CompartmentModel#addChild(edu.buffalo.cse.green.editor.model.FieldModel) */ void addChild(FieldModel model) { addChild(model, model.getJavaElement()); } /** * @see edu.buffalo.cse.green.editor.model.CompartmentModel#addChild(edu.buffalo.cse.green.editor.model.MethodModel) */ void addChild(MethodModel model) { GreenException.illegalOperation("Invalid parent."); } /** * @see edu.buffalo.cse.green.editor.model.CompartmentModel#getLayout() */ public int getLayout() { return ALIGN_TOPLEFT; } /** * @see edu.buffalo.cse.green.editor.model.CompartmentModel#dispatchLabels(edu.buffalo.cse.green.editor.controller.CompartmentPart, edu.buffalo.cse.green.editor.view.CompartmentFigure) */ public void dispatchLabels(CompartmentPart part, CompartmentFigure figure) {} public boolean isTypeLabelCompartment() { return false; } @Override public void updateLabels(boolean visible) {} }; } /** * @return A new <code>CompartmentModel</code> that holds * <code>MethodModel</code> instances. */ public static CompartmentModel newMethodCompartment() { return new CompartmentModel() { /** * @see edu.buffalo.cse.green.editor.model.CompartmentModel#addChild(edu.buffalo.cse.green.editor.model.FieldModel) */ void addChild(FieldModel model) { GreenException.illegalOperation("Invalid parent."); } /** * @see edu.buffalo.cse.green.editor.model.CompartmentModel#addChild(edu.buffalo.cse.green.editor.model.MethodModel) */ void addChild(MethodModel model) { addChild(model, model.getJavaElement()); } /** * @see edu.buffalo.cse.green.editor.model.CompartmentModel#getLayout() */ public int getLayout() { return ALIGN_TOPLEFT; } /** * @see edu.buffalo.cse.green.editor.model.CompartmentModel#dispatchLabels(edu.buffalo.cse.green.editor.controller.CompartmentPart, edu.buffalo.cse.green.editor.view.CompartmentFigure) */ public void dispatchLabels(CompartmentPart part, CompartmentFigure figure) {} public boolean isTypeLabelCompartment() { return false; } @Override public void updateLabels(boolean visible) {} }; } /** * @return A new <code>CompartmentModel</code> that holds * <code>TypeModel</code> instances. */ public static CompartmentModel newTypeCompartment() { return new CompartmentModel() { /** * Label holder for incremental exploration labels */ private IFigure _relLabel = null; /** * A reference to this model's figure equivalent */ private CompartmentFigure _figure; /** * @see edu.buffalo.cse.green.editor.model.CompartmentModel#addChild(edu.buffalo.cse.green.editor.model.FieldModel) */ void addChild(FieldModel model) { GreenException.illegalOperation("Invalid parent."); } /** * @see edu.buffalo.cse.green.editor.model.CompartmentModel#addChild(edu.buffalo.cse.green.editor.model.MethodModel) */ void addChild(MethodModel model) { GreenException.illegalOperation("Invalid parent."); } /** * @see edu.buffalo.cse.green.editor.model.CompartmentModel#getLayout() */ public int getLayout() { return ALIGN_CENTER; } /** * @see edu.buffalo.cse.green.editor.model.CompartmentModel#dispatchLabels(edu.buffalo.cse.green.editor.controller.CompartmentPart) */ public void dispatchLabels(CompartmentPart part, CompartmentFigure figure) { final TypePart parent = (TypePart) part.getParent(); _figure = figure; _figure.add(parent.getNameLabel()); _relLabel = parent.getRelLabel(); _relLabel.setLayoutManager(new ToolbarLayout(true)); _relLabel.add(new Label( " " )); Label r = new Label(" ALL ", null ); r.setFont( new Font( null, JFaceResources.getDefaultFont().getFontData()[0].getName(), 12, 0 ) ); _relLabel.add(r); r.addMouseListener(new MouseListener() { public void mousePressed(MouseEvent me) { TypeModel typeModel = (TypeModel) parent.getModel(); DiagramEditor editor = parent.getEditor(); editor.execute(new IncrementalExploreCommand(editor, typeModel, false)); } public void mouseReleased(MouseEvent me) {} public void mouseDoubleClicked(MouseEvent me) {} }); r.setToolTip(new Label( " All " )); for (final RelationshipGroup group : PlugIn.getRelationshipList()) { Label rel = new Label(" ", group.getImageDescriptor().createImage()); _relLabel.add(rel); rel.addMouseListener(new MouseListener() { public void mousePressed(MouseEvent me) { List<RelationshipGroup> relationships = new ArrayList<RelationshipGroup>(); relationships.add(group); TypeModel typeModel = (TypeModel) parent.getModel(); DiagramEditor editor = parent.getEditor(); editor.execute(new IncrementalExploreCommand(editor, typeModel, relationships, false)); } public void mouseReleased(MouseEvent me) {} public void mouseDoubleClicked(MouseEvent me) {} }); rel.setToolTip(new Label( " " + ( group.getSubtype() != null ? group.getSubtype() + " " : "" ) + group.getName() + " " )); } } public boolean isTypeLabelCompartment() { return true; } @Override public void updateLabels(boolean visible) { if(_figure != null && _relLabel != null) { if(visible) _figure.add(_relLabel); else if(!visible && _figure.getChildren().contains(_relLabel)) _figure.remove(_relLabel); } } }; } /** * Adds in extraneous labels as necessary. * * @param part - The part corresponding to this model. */ public abstract void dispatchLabels(CompartmentPart part, CompartmentFigure figure); /** * Return references to extraneous labels, if they exist. * * @author Gene Wang * @param visible - whether or not extraneous labels should be visible. */ public abstract void updateLabels(boolean visible); /** * @return true if this <code>CompartmentModel</code> holds the type label, * false otherwise. */ public abstract boolean isTypeLabelCompartment(); // /** // * @see edu.buffalo.cse.green.editor.model.AbstractModel#setSize(org.eclipse.draw2d.geometry.Dimension) // */ // public void setSize(Dimension size) { // super.setSize(size); //// GreenException.illegalOperation("Cannot set a compartment's size"); // } }