org.gems.ajax.client.edit.DiagramElementEditPart.java Source code

Java tutorial

Introduction

Here is the source code for org.gems.ajax.client.edit.DiagramElementEditPart.java

Source

package org.gems.ajax.client.edit;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.gems.ajax.client.dnd.DnDManager;
import org.gems.ajax.client.dnd.DropTarget;
import org.gems.ajax.client.edit.exdata.ExtendedData;
import org.gems.ajax.client.edit.exdata.RectangleData;
import org.gems.ajax.client.figures.AbstractDiagramElement;
import org.gems.ajax.client.figures.AbstractFloatingFigure;
import org.gems.ajax.client.figures.ConnectableDiagramElement;
import org.gems.ajax.client.figures.DetailFigure;
import org.gems.ajax.client.figures.DiagramElement;
import org.gems.ajax.client.figures.DiagramElementListener;
import org.gems.ajax.client.figures.DiagramPanel;
import org.gems.ajax.client.figures.FloatingHorizontalPanel;
import org.gems.ajax.client.figures.FloatingVerticalPanel;
import org.gems.ajax.client.figures.GEMSDiagram;
import org.gems.ajax.client.figures.PaletteFigure;
import org.gems.ajax.client.figures.Port;
import org.gems.ajax.client.figures.properties.PropertyEditor;
import org.gems.ajax.client.figures.toolbox.ConnectionHandle;
import org.gems.ajax.client.figures.toolbox.OpenFullDiagramViewTool;
import org.gems.ajax.client.figures.toolbox.ToolBox;
import org.gems.ajax.client.geometry.Rectangle;
import org.gems.ajax.client.model.ModelHelper;
import org.gems.ajax.client.model.Property;
import org.gems.ajax.client.model.Type;
import org.gems.ajax.client.model.event.InstantiationEvent;
import org.gems.ajax.client.model.event.ModelListener;
import org.gems.ajax.client.util.GraphicsConstants;
import org.gems.ajax.client.util.Util;

import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HasFocus;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

/*******************************************************************************
 * Copyright (c) 2007 Jules White. 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: Jules White - initial API and implementation
 ******************************************************************************/

public class DiagramElementEditPart extends AbstractModelEditPart implements ModelListener, ModelEditPart,
        EditConstants, DiagramElementListener, MovementAware, GraphicsConstants {

    public static final String DEFAULT_CONTAINER_ID = "children";
    private ConnectableDiagramElement figure_;
    private ToolBox toolBox_;
    private Map<Type, String> containerIds_;

    private Map<PropertyEditor, Property> propertyEditors_;
    private VerticalPanel propertiesPanel_ = new VerticalPanel();
    private AbstractFloatingFigure detailFigure_;

    private PaletteFigure paletteFigure_;

    private FloatingVerticalPanel leftPortPanel_;
    private FloatingVerticalPanel rightPortPanel_;
    private FloatingHorizontalPanel topPortPanel_;
    private FloatingHorizontalPanel bottomPortPanel_;

    private boolean selected_ = false;

    public DiagramElementEditPart(ModelHelper modelHelper, EditPartFactory fact, Object model) {
        super(modelHelper, fact, model);
        HTMLPanel hp = new HTMLPanel(
                "<table><tbody><tr><td>Properties:</td></tr><tr><td id=\"attrs\"></td></tr><tr><td></td></tr></tbody></table>");
        hp.add(propertiesPanel_, "attrs");
        detailFigure_ = new DetailFigure(hp);
    }

    public void dispose() {
        if (leftPortPanel_ != null)
            leftPortPanel_.detach();
        if (rightPortPanel_ != null)
            rightPortPanel_.detach();
        if (topPortPanel_ != null)
            topPortPanel_.detach();
        if (bottomPortPanel_ != null)
            bottomPortPanel_.detach();

        if (detailFigure_.isAttached())
            detailFigure_.detach();

        figure_.dispose();
    }

    public ConnectableDiagramElement createFigure(GEMSDiagram d) {
        figure_ = new DiagramPanel(d);
        figure_.addDiagramElementListener(this);

        DeferredCommand.addCommand(new Command() {
            public void execute() {
                DnDManager.getInstance()
                        .addDropTarget(new DropTarget(DiagramElementEditPart.this, figure_.getDiagramWidget()));
            }
        });
        // extPanel_.addListener(new ContainerListenerAdapter(){
        //
        // public void onRender(Component component) {
        // extPanel_.getEl().addListener("click", new EventCallback(){
        // public void execute(com.gwtext.client.core.EventObject e) {
        // System.out.println("clicked");
        // } });
        //            
        // }
        //         
        // });
        // extPanel_.setHtml(fillTemplate(template_));
        // extPanel_.setSize("200px", "200px");
        // extPanel_.setHtml("<p>Lorem ipsum dolor sit amet, consectetuer
        // adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget,
        // dui. In pellentesque nisl non sem. Suspendisse nunc sem, pretium
        // eget, cursus a, fringilla vel, urna.");
        EditPartManager.mapPart(getModel(), figure_, this);
        EditPartManager.mapPartToElement(figure_.getDiagramWidget().getElement(), this);
        updateTags();

        return figure_;
    }

    public ToolBox getToolBox() {
        if (toolBox_ == null) {
            toolBox_ = new ToolBox(getEditDomain().getCommandStack());
            toolBox_.addTool(new ConnectionHandle());
            toolBox_.addTool(new OpenFullDiagramViewTool());
        }
        return toolBox_;
    }

    public void onDeSelect() {
        selected_ = false;
        figure_.onDeSelect();
        getToolBox().detach();
        writePropertiesToModel();
        detailFigure_.detach();
        if (paletteFigure_ != null) {
            paletteFigure_.detach();
            paletteFigure_ = null;
        }
    }

    public void onSelect() {
        selected_ = true;
        focus();
        figure_.onSelect();
        getToolBox().attach(getModelFigure());

        populateDetailFigure();
        detailFigure_.addStyleDependentName("small");
        detailFigure_.attach(figure_);

        if (paletteFigure_ == null) {
            paletteFigure_ = new PaletteFigure();
            paletteFigure_.attach(getFigure());
        }

        Util.bringToFront(toolBox_);
        Util.moveBehind(detailFigure_, toolBox_);
    }

    protected Widget getDiagramWidget() {
        return getFigure().getDiagramWidget();
    }

    public boolean isSelected() {
        return selected_;
    }

    public void focus() {
        // extPanel_.focus();
        if (getDiagramWidget() instanceof HasFocus)
            ((HasFocus) getDiagramWidget()).setFocus(true);
    }

    public void addChild(EditPart child) {
        super.addChild(child);
        addChild((Widget) child.getFigure(), child.getModel(), child.getExtendedData());
    }

    public void removeChild(EditPart child) {
        super.removeChild(child);
        removeChild((Widget) child.getFigure(), child.getModel());
    }

    public String fillTemplate(String template) {
        String id = figure_.getId();
        template = template.replaceAll("\\sid[\\s]*\\=[\\s]*\\\"[\\s]*", " id=\"" + id + "-");
        return template;
    }

    public Widget getContainer(Object child) {
        return null;
    }

    public Element getContainerElement(Object child) {
        if (containerIds_ != null) {

            Type[] types = getModelHelper().getTypes(child);
            if (types != null) {
                for (Type type : types) {
                    String cid = containerIds_.get(type);
                    if (cid != null) {
                        Element el = Util.getDescendantById(figure_.getElement(), cid);
                        if (el != null)
                            return el;
                    }
                }
            }

            String cid = DEFAULT_CONTAINER_ID;
            Element el = Util.getDescendantById(figure_.getElement(), cid);
            if (el != null)
                return el;
        }
        return null;
    }

    // protected void addChild(DiagramPanel child, Object model) {
    // Element el = getContainerElement(model);
    // if (el != null) {
    // DOM.appendChild(el, child.getElement());
    // } else {
    // ((AbsolutePanel)extPanel_.getBodyPanel()).add(child);
    // }
    // // extPanel_.doLayout();
    // }
    //
    // protected void removeChild(DiagramPanel child, Object model) {
    // Element el = getContainerElement(model);
    // if (el != null) {
    // DOM.removeChild(el, child.getElement());
    // } else {
    // ((AbsolutePanel)extPanel_.getBodyPanel()).remove(child);
    // }
    // }

    protected void addChild(Widget child, Object model, ExtendedData d) {
        Widget w = getContainer(model);
        if (w != null) {
            if (w instanceof AbsolutePanel) {
                Rectangle bounds = d.get(BOUNDS_ATTR, RectangleData.INSTANCE);
                ((AbsolutePanel) w).add(child, bounds.x, bounds.y);
            }
        } else {
            Element el = getContainerElement(model);
            if (el != null) {
                el.appendChild(child.getElement());
            }
        }
    }

    protected void removeChild(Widget child, Object model) {
        Widget w = getContainer(model);
        if (w != null) {
            child.removeFromParent();
        } else {
            Element el = getContainerElement(model);
            if (el != null) {
                el.removeChild(child.getElement());
            }
        }
    }

    public void objectInstantiated(InstantiationEvent evt) {
    }

    public void onChildAdded(AbstractDiagramElement p) {
    }

    public void onChildRemoved(AbstractDiagramElement p) {
    }

    public void onCollapse(AbstractDiagramElement p) {
    }

    public void onExpand(AbstractDiagramElement p) {
    }

    public void onMove(DiagramElement p) {
        getModelFigure().updateConnections();

        DeferredCommand.addCommand(new Command() {
            public void execute() {
                writePropertiesToModel();
                detailFigure_.detach();
            }
        });

        for (EditPart ep : getChildren()) {
            if (ep instanceof MovementAware) {
                ((MovementAware) ep).onAncestorMoved(p);
            }
        }
    }

    public void onAncestorMoved(DiagramElement p) {
        getModelFigure().onMove();
    }

    public void onResize(AbstractDiagramElement p, String w, String h) {
    }

    protected Widget createPortFigure() {
        return new Port(getModelFigure().getDiagram());
    }

    public int getPreferredPortSide() {
        return RIGHT;
    }

    public FloatingVerticalPanel getLeftPortPanel() {
        if (leftPortPanel_ == null) {
            leftPortPanel_ = new FloatingVerticalPanel(false);
            DeferredCommand.addCommand(new Command() {

                public void execute() {
                    leftPortPanel_.attach(figure_);
                }

            });
        }
        return leftPortPanel_;
    }

    public FloatingVerticalPanel getRightPortPanel() {
        if (rightPortPanel_ == null) {
            rightPortPanel_ = new FloatingVerticalPanel(true);
            DeferredCommand.addCommand(new Command() {

                public void execute() {
                    rightPortPanel_.attach(figure_);
                }

            });
        }
        return rightPortPanel_;
    }

    public FloatingHorizontalPanel getTopPortPanel() {
        if (topPortPanel_ == null) {
            topPortPanel_ = new FloatingHorizontalPanel(false);
            DeferredCommand.addCommand(new Command() {

                public void execute() {
                    topPortPanel_.attach(figure_);
                }

            });
        }
        return topPortPanel_;
    }

    public FloatingHorizontalPanel getBottomPortPanel() {
        if (bottomPortPanel_ == null) {
            bottomPortPanel_ = new FloatingHorizontalPanel(true);
            DeferredCommand.addCommand(new Command() {

                public void execute() {
                    bottomPortPanel_.attach(figure_);
                }

            });
        }
        return bottomPortPanel_;
    }

    public ConnectableDiagramElement getModelFigure() {
        return (ConnectableDiagramElement) getFigure();
    }

    public ConnectableDiagramElement getFigure() {
        if (figure_ == null) {
            figure_ = createFigure(getDiagram());
            registerFigure();
        }
        return figure_;
    }

    protected void registerFigure() {
        figure_.addDiagramElementListener(this);

        DeferredCommand.addCommand(new Command() {
            public void execute() {
                DnDManager.getInstance().addDropTarget(new DropTarget(DiagramElementEditPart.this,
                        figure_.getDiagramWidget(), new String[] { CONTAINMENT_TARGET, CONNECTION_TARGET }));
            }
        });

        EditPartManager.mapPart(getModel(), figure_, this);
        EditPartManager.mapPartToElement(figure_.getDiagramWidget().getElement(), this);
        updateTags();
    }

    protected void populateDetailFigure() {
        propertiesPanel_.clear();
        if (propertyEditors_ == null)
            propertyEditors_ = new HashMap<PropertyEditor, Property>();

        List<Property> props = getModelHelper().getProperties(getModel());
        for (Property p : props) {
            PropertyEditor editor = getFactory().createPropertyEditor(getView(), getModel(), p);
            propertyEditors_.put(editor, p);
            HorizontalPanel holder = new HorizontalPanel();
            holder.add(new Label(p.getName() + ":"));
            holder.add(editor.getWidget());
            propertiesPanel_.add(holder);
        }
    }

    protected void writePropertiesToModel() {
        if (propertyEditors_ != null) {
            for (PropertyEditor ed : propertyEditors_.keySet()) {
                Property p = propertyEditors_.get(ed);
                getModelHelper().setProperty(getModel(), p.getName(), ed.getValue());
            }
            propertyEditors_.clear();
        }
    }

    protected void setFigure(ConnectableDiagramElement figure) {
        figure_ = figure;
    }

    public boolean showsPorts() {
        return true;
    }

    public Map<Type, String> getContainerIds() {
        return containerIds_;
    }

    public void setContainerIds(Map<Type, String> containerIds) {
        containerIds_ = containerIds;
    }

    public String toString() {
        return "EditPart[" + getModel() + "]";
    }
}