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]].
