edu.buffalo.cse.green.editor.model.CompartmentModel.java Source code

Java tutorial

Introduction

Here is the source code for edu.buffalo.cse.green.editor.model.CompartmentModel.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.model;

import static org.eclipse.draw2d.OrderedLayout.ALIGN_CENTER;
import static org.eclipse.draw2d.OrderedLayout.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");
    //   }
}