Author: bobtarling
Date: 2010-11-21 18:32:46-0800
New Revision: 18856

Added:
   
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/CreateDiagramElementAction.java
   
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/ModePlaceDiagramElement.java
Modified:
   
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/UMLActivityDiagram.java
   
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/diagram.xml

Log:
Begin work to interpret diagram xml

Added: 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/CreateDiagramElementAction.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/CreateDiagramElementAction.java?view=markup&pathrev=18856
==============================================================================
--- (empty file)
+++ 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/CreateDiagramElementAction.java
 2010-11-21 18:32:46-0800
@@ -0,0 +1,40 @@
+/* $Id: $
+ *****************************************************************************
+ * Copyright (c) 2010 Contributors - see below
+ * 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:
+ *    Bob Tarling
+ *****************************************************************************
+ */
+
+package org.argouml.activity2.diagram;
+
+import java.awt.event.ActionEvent;
+import org.argouml.application.helpers.ResourceLoaderWrapper;
+import org.argouml.ui.UndoableAction;
+import org.tigris.gef.base.Globals;
+import org.tigris.gef.base.Mode;
+
+class CreateDiagramElementAction extends UndoableAction {
+    
+    final Object metaType;
+    final String style;
+
+    CreateDiagramElementAction(Object metaType, String style, String name) {
+        super(name, ResourceLoaderWrapper.lookupIconResource(
+                ResourceLoaderWrapper.getImageBinding(name)));
+        this.metaType = metaType;
+        this.style = style;
+    }
+    
+    public void actionPerformed(ActionEvent e) {
+        super.actionPerformed(e);
+
+        Mode placeMode = new ModePlaceDiagramElement(metaType, style, "Click 
to place diagram element");
+        Globals.mode(placeMode, false);
+    }
+}

Added: 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/ModePlaceDiagramElement.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/ModePlaceDiagramElement.java?view=markup&pathrev=18856
==============================================================================
--- (empty file)
+++ 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/ModePlaceDiagramElement.java
    2010-11-21 18:32:46-0800
@@ -0,0 +1,142 @@
+package org.argouml.activity2.diagram;
+
+import java.awt.Cursor;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.util.Iterator;
+import java.util.List;
+
+import org.argouml.model.Model;
+import org.argouml.uml.diagram.DiagramSettings;
+import org.tigris.gef.base.FigModifyingModeImpl;
+import org.tigris.gef.base.Globals;
+import org.tigris.gef.base.Layer;
+import org.tigris.gef.di.GraphNode;
+import org.tigris.gef.graph.GraphModel;
+import org.tigris.gef.graph.GraphNodeHooks;
+import org.tigris.gef.graph.GraphNodeRenderer;
+import org.tigris.gef.graph.MutableGraphModel;
+import org.tigris.gef.presentation.Fig;
+import org.tigris.gef.presentation.FigNode;
+import org.tigris.gef.undo.UndoManager;
+
+public class ModePlaceDiagramElement extends FigModifyingModeImpl {
+
+    private final Object metaType;
+    private final String style;
+    private final String instructions;
+    
+    private Object modelElement;
+    private GraphNode graphNode;
+
+    private static final int WIDTH = 90;
+    private static final int HEIGHT = 25;
+    
+    public ModePlaceDiagramElement(
+            Object metaType,
+            String style,
+            String instructions) {
+        this.metaType = metaType;
+        this.style = style;
+        if (instructions == null) {
+            this.instructions = "";
+        } else {
+            this.instructions = instructions;
+        }
+    }
+
+    public String instructions() {
+        return instructions;
+    }
+
+    public Cursor getInitialCursor() {
+        return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
+    }
+
+    // //////////////////////////////////////////////////////////////
+    // event handlers
+
+    /** Move the perpective along with the mouse. */
+    public void mousePressed(MouseEvent me) {
+        if (me.isConsumed()) {
+            return;
+        }
+        UndoManager.getInstance().addMementoLock(this);
+        modelElement = Model.getUmlFactory().buildNode(metaType);
+        start();
+        editor = Globals.curEditor();
+        Layer lay = editor.getLayerManager().getActiveLayer();
+        graphNode = createDiagramElement(lay, modelElement, null);
+        mouseMoved(me);
+        me.consume();
+    }
+    
+    private GraphNode createDiagramElement(Layer lay, Object owner, 
DiagramSettings settings) {
+        FigBaseNode fig = new FigBaseNode(modelElement, new Rectangle(0, 0, 0, 
0), settings);
+        fig.setLayer(lay);
+        DiagramElementBuilder.buildDiagramElement(fig, style, owner, settings);
+        return fig;
+    }
+
+    public void mouseExited(MouseEvent me) {
+        editor.damageAll();
+        me.consume();
+    }
+
+    public void mouseMoved(MouseEvent me) {
+        mouseDragged(me);
+    }
+
+    public void mouseDragged(MouseEvent me) {
+        if (me.isConsumed()) {
+            return;
+        }
+        if (graphNode == null) {
+            me.consume();
+            return;
+        }
+        editor.damageAll();
+        Point snapPt = new Point(me.getX(), me.getY());
+        editor.snap(snapPt);
+        ((Fig) graphNode).setLocation(snapPt.x, snapPt.y);
+        editor.damageAll();
+        me.consume();
+    }
+
+    public void mouseEntered(MouseEvent me) {
+        me.consume();
+    }
+
+    public void mouseReleased(MouseEvent me) {
+        if (me.isConsumed()) {
+            return;
+        }
+
+        MutableGraphModel mgm =
+            (MutableGraphModel) editor.getGraphModel();
+        if (mgm.canAddNode(modelElement)) {
+            UndoManager.getInstance().startChain();
+            editor.add((Fig) graphNode);
+            mgm.addNode(modelElement);
+
+            editor.getSelectionManager().select((Fig) graphNode);
+        }
+        done();
+        me.consume();
+    }
+
+    public void keyTyped(KeyEvent ke) {
+        if (ke.getKeyChar() == KeyEvent.VK_ESCAPE) {
+            leave();
+        }
+    }
+
+    public void paint(Graphics g) {
+        if (graphNode != null) {
+            ((Fig) graphNode).paint(g);
+        }
+    }
+}

Modified: 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/UMLActivityDiagram.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/UMLActivityDiagram.java?view=diff&pathrev=18856&r1=18855&r2=18856
==============================================================================
--- 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/UMLActivityDiagram.java
 (original)
+++ 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/UMLActivityDiagram.java
 2010-11-21 18:32:46-0800
@@ -14,6 +14,16 @@
 package org.argouml.activity2.diagram;
 
 import java.awt.Rectangle;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.log4j.Logger;
 import org.argouml.i18n.Translator;
@@ -25,6 +35,13 @@
 import org.argouml.uml.diagram.UmlDiagramRenderer;
 import org.argouml.uml.diagram.static_structure.ui.FigComment;
 import org.argouml.uml.diagram.ui.FigNodeModelElement;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
 
 public class UMLActivityDiagram extends BaseDiagram implements ActivityDiagram 
{
     
@@ -72,6 +89,100 @@
             Model.getMetaTypes().getOutputPin(),
         };
     }
+    
+    private Map<String, Class<?>> metaTypeByName;
+    private Map<Class<?>, String> nameByMetaType;
+    private List<Object> getCreateDiagramElementActions() {
+        try {
+            final Document doc = getDocument();
+            final NodeList nl = doc.getDocumentElement().getChildNodes();
+            for (int i = 0; i < nl.getLength(); ++i) {
+                final Node n = nl.item(i);
+                if (n.getNodeName().equals("classes")) {
+                    final int size = n.getChildNodes().getLength();
+                    nameByMetaType = new HashMap<Class<?>, String>(size);
+                    metaTypeByName = new HashMap<String, Class<?>>(size);
+                    populateClassMaps((Element) n, nameByMetaType, 
metaTypeByName);
+                } else if (n.getNodeName().equals("toolbar")) {
+                    List<Object> actions = getToolbarActions((Element) n);
+                    return actions;
+                }
+            }
+        } catch (DOMException e) {
+            LOG.error("", e);
+        } catch (IOException e) {
+            LOG.error("", e);
+        } catch (ParserConfigurationException e) {
+            LOG.error("", e);
+        } catch (SAXException e) {
+            LOG.error("", e);
+        }
+        return null;
+    }
+
+    private List<Object> getToolbarActions(Element toolbarNode) {
+        List<Object> toolbarActions = new ArrayList<Object>();
+        final NodeList nl = toolbarNode.getElementsByTagName("*");
+        for (int i = 0; i < nl.getLength(); ++i) {
+            final Element itemNode = (Element) nl.item(i);
+            Object o;
+            String style = itemNode.getNodeName();
+            if (style.equals("dropdown")) {
+                o = getToolbarActions(itemNode);
+            } else {
+                String type = itemNode.getAttribute("type");
+                Class<?> metaType = metaTypeByName.get(type);
+                o = new CreateDiagramElementAction(
+                        metaType, 
+                        style, 
+                        Model.getMetaTypes().getName(metaType));
+            }
+            toolbarActions.add(o);
+        }
+        return toolbarActions;
+    }
+    
+    // TODO: This is currently duplicated from MetaDataCache - must find a
+    // common place in model facade
+    private void populateClassMaps(
+            final Element classesNode,
+            final Map<Class<?>, String> nameByMetaType,
+            final Map<String, Class<?>> metaTypeByName) {
+        final NodeList nl = classesNode.getElementsByTagName("class");
+        for (int i = 0; i < nl.getLength(); ++i) {
+            Node classNode = nl.item(i);
+            String className = classNode.getTextContent();
+            try {
+                final String name = 
+                    
classNode.getAttributes().getNamedItem("name").getNodeValue();
+                Class<?> clazz = Class.forName(className);
+                metaTypeByName.put(name, clazz);
+                nameByMetaType.put(clazz, name);
+            } catch (ClassNotFoundException e) {
+                    LOG.error("Class not found " + className, e);
+            }
+        }
+    }
+    
+    
+    private Document getDocument() throws IOException, DOMException, 
ParserConfigurationException, SAXException {
+        final String filename;
+        filename = "org/argouml/activity2/diagram/diagram.xml";
+        InputStream inputStream = 
this.getClass().getClassLoader().getResourceAsStream(filename);
+        InputSource inputSource = new InputSource(inputStream);
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        return db.parse(inputSource);
+    }
+    
+    @Override
+    protected Object[] getUmlActions() {
+        Object[] actions = super.getUmlActions();
+        getCreateDiagramElementActions();
+        return actions;
+    }
+    
+    
 
 
     @Override

Modified: 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/diagram.xml
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/diagram.xml?view=diff&pathrev=18856&r1=18855&r2=18856
==============================================================================
--- 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/diagram.xml
     (original)
+++ 
trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/diagram.xml
     2010-11-21 18:32:46-0800
@@ -23,25 +23,42 @@
    The other element types indicates the representation used to display
    diagram element when it is created.
    
-   poly-edge - an edge two join two nodes, the edge can be multiple parts
+   poly-edge - an edge to join two nodes, the edge can be multiple parts
                (essentially an unconnected polygon)
    rect - a rectangular node
    rrect - a rectangular node with rounded corners
    pentagon - a pentagon that is formed by a combined rectangle and a triangle 
much
-               like a direction sign on a signpost. If the concave attribute
-               is set the triangle forms a notch into the rectangle.
-   connector - A connection point required for some nodes.
+               like a direction sign on a signpost.
+   concave-pentagon - similar to a pentagon but with the triangle forms a 
notch into
+                      the rectangle.
+   connector - A connection point required for some nodes to attach edges.
 -->
 <diagram name="Activity">
+<classes>
+  <class 
name="AcceptEventAction">org.eclipse.uml2.uml.AcceptEventAction</class>
+  <class 
name="ActivityParameterNode">org.eclipse.uml2.uml.ActivityParameterNode</class>
+  <class 
name="CallBehaviorAction">org.eclipse.uml2.uml.CallBehaviorAction</class>
+  <class 
name="CentralBufferNode">org.eclipse.uml2.uml.CentralBufferNode</class>
+  <class name="ControlFlow">org.eclipse.uml2.uml.ControlFlow</class>
+  <class 
name="CreateObjectAction">org.eclipse.uml2.uml.CreateObjectAction</class>
+  <class name="DataStoreNode">org.eclipse.uml2.uml.DataStoreNode</class>
+  <class name="DataType">org.eclipse.uml2.uml.DataType</class>
+  <class 
name="DestroyObjectAction">org.eclipse.uml2.uml.DestroyObjectAction</class>
+  <class name="InputPin">org.eclipse.uml2.uml.InputPin</class>
+  <class name="ObjectFlow">org.eclipse.uml2.uml.ObjectFlow</class>
+  <class name="OutputPin">org.eclipse.uml2.uml.OutputPin</class>
+  <class name="SendSignalAction">org.eclipse.uml2.uml.SendSignalAction</class>
+</classes>
+<toolbar>
   <poly-edge type="ControlFlow" destarrow="true" />
   <poly-edge type="ObjectFlow" destarrow="true" />
   <dropdown>
-    <rrect type="CallObjectAction" />
+    <rrect type="CallBehaviorAction" />
     <rrect type="CreateObjectAction" />
     <rrect type="DestroyObjectAction" />
   </dropdown>
   <pentagon type="SendSignalAction" />
-  <pentagon type="AcceptEventAction" concave="true" />
+  <concave-pentagon type="AcceptEventAction" />
   <dropdown>
     <rect type="ActivityParameterNode" />
     <rect type="CentralBufferNode" />
@@ -49,4 +66,5 @@
   </dropdown>
   <connector type="InputPin" />
   <connector type="OutputPin" />
+</toolbar>
 </diagram>

------------------------------------------------------
http://argouml.tigris.org/ds/viewMessage.do?dsForumId=5905&dsMessageId=2684165

To unsubscribe from this discussion, e-mail: 
[[email protected]].

Reply via email to