svn commit: r15951 - trunk/src: argouml-app/src/org/argouml/uml/diagram/activity/ui argouml-app/src/org/argouml/uml/diagram/collaboration/ui argouml-app/src/org/argouml/uml/diagram/deployment/ui argouml-app/src/org/argouml/uml/diagram/state/ui argouml-app/src/org/argouml/uml/diagram/ui argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: bszanto
Date: 2008-10-31 11:54:06-0700
New Revision: 15951

Modified:
   trunk/src/argouml-app/src/org/argouml/uml/diagram/activity/ui/UMLActivityDiagram.java
   trunk/src/argouml-app/src/org/argouml/uml/diagram/collaboration/ui/UMLCollaborationDiagram.java
   trunk/src/argouml-app/src/org/argouml/uml/diagram/deployment/ui/UMLDeploymentDiagram.java
   trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/UMLStateDiagram.java
   trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/DnDJGraph.java
   trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeAddToDiagram.java
   trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/SequenceDiagramRenderer.java
   trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/UMLSequenceDiagram.java

Log:
Fixed [1] some missing states in the DnD feature for Activity and State diagrams, [2] the NullPointerException when a fig is not accepted for DnD, [3] the non working "Add to Diagram" when trying to add a Class to a Seq2 diagram.

Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/activity/ui/UMLActivityDiagram.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/activity/ui/UMLActivityDiagram.java?view=diff&rev=15951&p1=trunk/src/argouml-app/src/org/argouml/uml/diagram/activity/ui/UMLActivityDiagram.java&p2=trunk/src/argouml-app/src/org/argouml/uml/diagram/activity/ui/UMLActivityDiagram.java&r1=15950&r2=15951
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/activity/ui/UMLActivityDiagram.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/activity/ui/UMLActivityDiagram.java	2008-10-31 11:54:06-0700
@@ -51,7 +51,14 @@
 import org.argouml.uml.diagram.state.ui.ButtonActionNewChangeEvent;
 import org.argouml.uml.diagram.state.ui.ButtonActionNewSignalEvent;
 import org.argouml.uml.diagram.state.ui.ButtonActionNewTimeEvent;
+import org.argouml.uml.diagram.state.ui.FigBranchState;
+import org.argouml.uml.diagram.state.ui.FigFinalState;
+import org.argouml.uml.diagram.state.ui.FigForkState;
+import org.argouml.uml.diagram.state.ui.FigInitialState;
+import org.argouml.uml.diagram.state.ui.FigJoinState;
+import org.argouml.uml.diagram.state.ui.FigJunctionState;
 import org.argouml.uml.diagram.state.ui.FigStateVertex;
+import org.argouml.uml.diagram.static_structure.ui.FigComment;
 import org.argouml.uml.diagram.ui.ActionSetMode;
 import org.argouml.uml.diagram.ui.RadioAction;
 import org.argouml.uml.diagram.ui.UMLDiagram;
@@ -757,11 +764,23 @@
     public boolean doesAccept(Object objectToAccept) {
         if (Model.getFacade().isAPartition(objectToAccept)) {
             return true;
-        } else if (Model.getFacade().isACallState(objectToAccept)) {
+        } else if (Model.getFacade().isAState(objectToAccept)) {
             return true;
-        } else if (Model.getFacade().isAObjectFlowState(objectToAccept)) {
+        } else if (Model.getFacade().isAPseudostate(objectToAccept)) {
+            Object kind = Model.getFacade().getKind(objectToAccept);
+            if (kind == null) {
+                LOG.warn("found a null type pseudostate");
+                return false;
+            }
+            if (kind.equals(
+                    Model.getPseudostateKind().getShallowHistory())) {
+                return false;
+            } else if (kind.equals(
+                    Model.getPseudostateKind().getDeepHistory())) {
+                return false;
+            }
             return true;
-        } else if (Model.getFacade().isASubactivityState(objectToAccept)) {
+        } else if (Model.getFacade().isAComment(objectToAccept)) {
             return true;
         }
         return false;
@@ -774,12 +793,41 @@
         
         if (Model.getFacade().isAPartition(droppedObject)) {
             figNode = new FigPartition(gm, droppedObject);
+        } else if (Model.getFacade().isAActionState(droppedObject)) {
+            figNode = new FigActionState(gm, droppedObject);
         } else if (Model.getFacade().isACallState(droppedObject)) {
             figNode = new FigCallState(gm, droppedObject);
         } else if (Model.getFacade().isAObjectFlowState(droppedObject)) {
             figNode = new FigObjectFlowState(gm, droppedObject);
         } else if (Model.getFacade().isASubactivityState(droppedObject)) {
             figNode = new FigSubactivityState(gm, droppedObject);
+        } else if (Model.getFacade().isAFinalState(droppedObject)) {
+            figNode = new FigFinalState(gm, droppedObject);
+        } else if (Model.getFacade().isAPseudostate(droppedObject)) {
+            Object kind = Model.getFacade().getKind(droppedObject);
+            if (kind == null) {
+                LOG.warn("found a null type pseudostate");
+                return null;
+            }
+            if (kind.equals(Model.getPseudostateKind().getInitial())) {
+                figNode = new FigInitialState(gm, droppedObject);
+            } else if (kind.equals(
+                    Model.getPseudostateKind().getChoice())) {
+                figNode = new FigBranchState(gm, droppedObject);
+            } else if (kind.equals(
+                    Model.getPseudostateKind().getJunction())) {
+                figNode = new FigJunctionState(gm, droppedObject);
+            } else if (kind.equals(
+                    Model.getPseudostateKind().getFork())) {
+                figNode = new FigForkState(gm, droppedObject);
+            } else if (kind.equals(
+                    Model.getPseudostateKind().getJoin())) {
+                figNode = new FigJoinState(gm, droppedObject);
+            } else {
+                LOG.warn("found a type not known");
+            }
+        } else if (Model.getFacade().isAComment(droppedObject)) {
+            figNode = new FigComment(gm, droppedObject);
         }
         
         if (figNode != null) {
@@ -791,7 +839,8 @@
             LOG.debug("Dropped object " + droppedObject + " converted to " 
                     + figNode);
         } else {
-            LOG.debug("Dropped object NOT added " + figNode);
+            LOG.debug("Dropped object NOT added. This usualy means that this " 
+                    + "type of object is not accepted!");
         }
         
         return figNode;

Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/collaboration/ui/UMLCollaborationDiagram.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/collaboration/ui/UMLCollaborationDiagram.java?view=diff&rev=15951&p1=trunk/src/argouml-app/src/org/argouml/uml/diagram/collaboration/ui/UMLCollaborationDiagram.java&p2=trunk/src/argouml-app/src/org/argouml/uml/diagram/collaboration/ui/UMLCollaborationDiagram.java&r1=15950&r2=15951
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/collaboration/ui/UMLCollaborationDiagram.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/collaboration/ui/UMLCollaborationDiagram.java	2008-10-31 11:54:06-0700
@@ -446,8 +446,6 @@
             return true;
         } else if (Model.getFacade().isAComment(objectToAccept)) {
             return true;
-        } else if (Model.getFacade().isAClassifierRole(objectToAccept)) {
-            return true;           
         } else if (Model.getFacade().isAClassifier(objectToAccept)) {
             return true;
         }
@@ -484,15 +482,18 @@
      */
     private FigClassifierRole makeNewFigCR(Object classifierRole, 
             Point location) {
+        if (classifierRole != null) {
+            FigClassifierRole newCR = new FigClassifierRole(getGraphModel(),
+                    getLayer(), classifierRole);
+            
+            getGraphModel().getNodes().add(newCR.getOwner());
+            
+            newCR.setY(location.y);
+            newCR.setX(location.x);
+            return newCR;
+        }
         
-        FigClassifierRole newCR = new FigClassifierRole(getGraphModel(),
-                getLayer(), classifierRole);
-        
-        getGraphModel().getNodes().add(newCR.getOwner());
-        
-        newCR.setY(location.y);
-        newCR.setX(location.x);
-        return newCR;
+        return null;
     }
     
     @Override

Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/deployment/ui/UMLDeploymentDiagram.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/deployment/ui/UMLDeploymentDiagram.java?view=diff&rev=15951&p1=trunk/src/argouml-app/src/org/argouml/uml/diagram/deployment/ui/UMLDeploymentDiagram.java&p2=trunk/src/argouml-app/src/org/argouml/uml/diagram/deployment/ui/UMLDeploymentDiagram.java&r1=15950&r2=15951
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/deployment/ui/UMLDeploymentDiagram.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/deployment/ui/UMLDeploymentDiagram.java	2008-10-31 11:54:06-0700
@@ -45,6 +45,7 @@
 import org.argouml.uml.diagram.ui.FigNodeAssociation;
 import org.argouml.uml.diagram.ui.RadioAction;
 import org.argouml.uml.diagram.ui.UMLDiagram;
+import org.argouml.uml.diagram.use_case.ui.FigActor;
 import org.argouml.util.ToolBarUtility;
 import org.tigris.gef.base.LayerPerspective;
 import org.tigris.gef.base.LayerPerspectiveMutable;
@@ -546,6 +547,8 @@
             return true;
         } else if (Model.getFacade().isAComment(objectToAccept)) {
             return true;
+        } else if (Model.getFacade().isAActor(objectToAccept)) {
+            return true;
         }
         return false;
     }
@@ -571,6 +574,8 @@
             figNode = new FigInterface(gm, droppedObject);
         } else if (Model.getFacade().isAObject(droppedObject)) {
             figNode = new FigObject(gm, droppedObject);
+        } else if (Model.getFacade().isAActor(droppedObject)) {
+            figNode = new FigActor(gm, droppedObject);
         } else if (Model.getFacade().isAComment(droppedObject)) {
             figNode = new FigComment(gm, droppedObject);
         }

Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/UMLStateDiagram.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/UMLStateDiagram.java?view=diff&rev=15951&p1=trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/UMLStateDiagram.java&p2=trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/UMLStateDiagram.java&r1=15950&r2=15951
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/UMLStateDiagram.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/state/ui/UMLStateDiagram.java	2008-10-31 11:54:06-0700
@@ -733,25 +733,17 @@
 
     @Override
     public boolean doesAccept(Object objectToAccept) {
-        if (Model.getFacade().isAActionState(objectToAccept)) {
+        if (Model.getFacade().isAState(objectToAccept)) {
             return true;
-        } else if (Model.getFacade().isAFinalState(objectToAccept)) {
+        } else if (Model.getFacade().isASynchState(objectToAccept)) {
             return true;
         } else if (Model.getFacade().isAStubState(objectToAccept)) {
             return true;
-        } else if (Model.getFacade().isASubmachineState(objectToAccept)) {
-            return true;
-        } else if (Model.getFacade().isACompositeState(objectToAccept)) {
-            return true;
-        } else if (Model.getFacade().isASynchState(objectToAccept)) {
-            return true;
-        } else if (Model.getFacade().isAState(objectToAccept)) {
+        } else if (Model.getFacade().isAPseudostate(objectToAccept)) {
             return true;
         } else if (Model.getFacade().isAComment(objectToAccept)) {
             return true;
-        } else if (Model.getFacade().isAPseudostate(objectToAccept)) {
-            return true;
-        }
+        } 
         return false;
     }
     
@@ -777,8 +769,7 @@
         } else if (Model.getFacade().isAComment(droppedObject)) {
             figNode = new FigComment(gm, droppedObject);
         } else if (Model.getFacade().isAPseudostate(droppedObject)) {
-            Object pState = droppedObject;
-            Object kind = Model.getFacade().getKind(pState);
+            Object kind = Model.getFacade().getKind(droppedObject);
             if (kind == null) {
                 LOG.warn("found a null type pseudostate");
                 return null;

Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/DnDJGraph.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/DnDJGraph.java?view=diff&rev=15951&p1=trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/DnDJGraph.java&p2=trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/DnDJGraph.java&r1=15950&r2=15951
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/DnDJGraph.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/DnDJGraph.java	2008-10-31 11:54:06-0700
@@ -40,11 +40,9 @@
 import org.argouml.kernel.ProjectManager;
 import org.argouml.ui.TransferableModelElements;
 import org.argouml.uml.diagram.ArgoDiagram;
-import org.argouml.uml.diagram.use_case.ui.UMLUseCaseDiagram;
 import org.tigris.gef.base.Diagram;
 import org.tigris.gef.base.Editor;
 import org.tigris.gef.base.Globals;
-import org.tigris.gef.base.Layer;
 import org.tigris.gef.graph.ConnectionConstrainer;
 import org.tigris.gef.graph.GraphModel;
 import org.tigris.gef.graph.presentation.JGraph;
@@ -201,7 +199,7 @@
                 FigNode figNode = ((UMLDiagram )diagram).drop(i.next(),
                         dropTargetDropEvent.getLocation());
                 
-//                if (diagram instanceof UMLUseCaseDiagram) {
+                if (figNode != null) {
                     GraphModel gm = diagram.getGraphModel();
                     if (!gm.getNodes().contains(figNode.getOwner())) {
                         gm.getNodes().add(figNode.getOwner());
@@ -209,13 +207,10 @@
                     
                     Globals.curEditor().getLayerManager().getActiveLayer()
                             .add(figNode);
-//                }
+                }
                 
             }
 
-//            ActionAddExistingNodes.addNodes(modelElements, 
-//                    dropTargetDropEvent.getLocation(), diagram);
-
             dropTargetDropEvent.getDropTargetContext().dropComplete(true);
         } catch (UnsupportedFlavorException e) {
             LOG.debug(e);

Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeAddToDiagram.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeAddToDiagram.java?view=diff&rev=15951&p1=trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeAddToDiagram.java&p2=trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeAddToDiagram.java&r1=15950&r2=15951
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeAddToDiagram.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/ModeAddToDiagram.java	2008-10-31 11:54:06-0700
@@ -34,6 +34,8 @@
 import java.util.List;

 

 import org.apache.log4j.Logger;

+import org.argouml.kernel.ProjectManager;

+import org.argouml.uml.diagram.ArgoDiagram;

 import org.tigris.gef.base.Editor;

 import org.tigris.gef.base.FigModifyingModeImpl;

 import org.tigris.gef.base.Layer;

@@ -129,50 +131,54 @@
         final List<FigNode> placedFigs =

             new ArrayList<FigNode>(modelElements.size());

         

-        for (final Object node : modelElements) {

-            if (gm.canAddNode(node)) {

-                final FigNode pers =

-                    renderer.getFigNodeFor(gm, lay, node, null);

-                pers.setLocation(snapPt.x + (count++ * 100), snapPt.y);

-                if (LOG.isDebugEnabled()) {

-                    LOG.debug("mouseMoved: Location set ("

-                            + pers.getX() + "," + pers.getY() + ")");

-                }

-                UndoManager.getInstance().startChain();

-                editor.add(pers);

-                gm.addNode(node);

-                if (addRelatedEdges) {

-                    gm.addNodeRelatedEdges(node);

-                }

-

-                Fig encloser = null;

-                final Rectangle bbox = pers.getBounds();

-                final List<Fig> otherFigs = lay.getContents();

-                for (final Fig otherFig : otherFigs) {

-                    if (!(otherFig.getUseTrapRect())) {

-                        continue;

+        ArgoDiagram diag = ProjectManager.getManager().getCurrentProject()

+        	.getActiveDiagram();

+        if (diag instanceof UMLDiagram) {

+            for (final Object node : modelElements) {

+                if (((UMLDiagram) diag).doesAccept(node)) {

+                    final FigNode pers =

+                        renderer.getFigNodeFor(gm, lay, node, null);

+                    pers.setLocation(snapPt.x + (count++ * 100), snapPt.y);

+                    if (LOG.isDebugEnabled()) {

+                        LOG.debug("mouseMoved: Location set ("

+                                + pers.getX() + "," + pers.getY() + ")");

                     }

-                    if (!(otherFig instanceof FigNode)) {

-                        continue;

+                    UndoManager.getInstance().startChain();

+                    editor.add(pers);

+                    gm.addNode(node);

+                    if (addRelatedEdges) {

+                        gm.addNodeRelatedEdges(node);

                     }

-                    if (!otherFig.isVisible()) {

-                        continue;

-                    }

-                    if (otherFig.equals(pers)) {

-                        continue;

-                    }

-                    final Rectangle trap = otherFig.getTrapRect();

-                    if (trap != null

-                            && trap.contains(bbox.x, bbox.y)

-                            && trap.contains(

-                                    bbox.x + bbox.width, 

-                                    bbox.y + bbox.height)) {

-                        encloser = otherFig;

+    

+                    Fig encloser = null;

+                    final Rectangle bbox = pers.getBounds();

+                    final List<Fig> otherFigs = lay.getContents();

+                    for (final Fig otherFig : otherFigs) {

+                        if (!(otherFig.getUseTrapRect())) {

+                            continue;

+                        }

+                        if (!(otherFig instanceof FigNode)) {

+                            continue;

+                        }

+                        if (!otherFig.isVisible()) {

+                            continue;

+                        }

+                        if (otherFig.equals(pers)) {

+                            continue;

+                        }

+                        final Rectangle trap = otherFig.getTrapRect();

+                        if (trap != null

+                                && trap.contains(bbox.x, bbox.y)

+                                && trap.contains(

+                                        bbox.x + bbox.width, 

+                                        bbox.y + bbox.height)) {

+                            encloser = otherFig;

+                        }

                     }

+                    pers.setEnclosingFig(encloser);

+                    

+                    placedFigs.add(pers);

                 }

-                pers.setEnclosingFig(encloser);

-                

-                placedFigs.add(pers);

             }

         }

         


Modified: trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/SequenceDiagramRenderer.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/SequenceDiagramRenderer.java?view=diff&rev=15951&p1=trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/SequenceDiagramRenderer.java&p2=trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/SequenceDiagramRenderer.java&r1=15950&r2=15951
==============================================================================
--- trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/SequenceDiagramRenderer.java	(original)
+++ trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/SequenceDiagramRenderer.java	2008-10-31 11:54:06-0700
@@ -32,7 +32,6 @@
 import org.argouml.uml.CommentEdge;
 import org.argouml.uml.diagram.ArgoDiagram;
 import org.argouml.uml.diagram.UmlDiagramRenderer;
-import org.argouml.uml.diagram.static_structure.ui.FigComment;
 import org.argouml.uml.diagram.static_structure.ui.FigEdgeNote;
 import org.argouml.uml.diagram.ui.UMLDiagram;
 import org.tigris.gef.base.Layer;
@@ -61,13 +60,14 @@
                                  Map styleAttributes) {
         FigNode result = null;
         ArgoDiagram diag = ProjectManager.getManager().getCurrentProject()
-            .getActiveDiagram();
+            	.getActiveDiagram();
         if (diag instanceof UMLDiagram
                 && ((UMLDiagram) diag).doesAccept(node)) {
             result = ((UMLDiagram) diag).drop(node, null);
         } else {
         	return null;
         }
+        LOG.debug("SequenceDiagramRenderer getFigNodeFor " + result);
         lay.add(result);
         return result;       
     }

Modified: trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/UMLSequenceDiagram.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/UMLSequenceDiagram.java?view=diff&rev=15951&p1=trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/UMLSequenceDiagram.java&p2=trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/UMLSequenceDiagram.java&r1=15950&r2=15951
==============================================================================
--- trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/UMLSequenceDiagram.java	(original)
+++ trunk/src/argouml-core-diagrams-sequence2/src/org/argouml/uml/diagram/sequence2/ui/UMLSequenceDiagram.java	2008-10-31 11:54:06-0700
@@ -228,34 +228,36 @@
      */
     private FigClassifierRole makeNewFigCR(Object classifierRole, 
             Point location) {
-        
-        FigClassifierRole newCR = new FigClassifierRole(classifierRole);
-        
-        getGraphModel().getNodes().add(newCR.getOwner());
-        
-        // Y position of the new CR should match existing CRs Y position
-        List nodes = getLayer().getContentsNoEdges();
-        int i = 0;
-        boolean figClassifierRoleFound = false;
-        Fig fig = null;
-        while (i < nodes.size() && !figClassifierRoleFound) {
-            fig = (Fig) nodes.get(i);
-            if (nodes.get(i) instanceof Fig) {
-                if (fig != newCR && fig instanceof FigClassifierRole) {
-                    newCR.setY(((Fig) fig).getY());
-                    newCR.setHeight(((Fig) fig).getHeight());
-                    figClassifierRoleFound = true;
+        if (classifierRole != null) {
+        	FigClassifierRole newCR = new FigClassifierRole(classifierRole);
+            
+            getGraphModel().getNodes().add(newCR.getOwner());
+            
+            // Y position of the new CR should match existing CRs Y position
+            List nodes = getLayer().getContentsNoEdges();
+            int i = 0;
+            boolean figClassifierRoleFound = false;
+            Fig fig = null;
+            while (i < nodes.size() && !figClassifierRoleFound) {
+                fig = (Fig) nodes.get(i);
+                if (nodes.get(i) instanceof Fig) {
+                    if (fig != newCR && fig instanceof FigClassifierRole) {
+                        newCR.setY(((Fig) fig).getY());
+                        newCR.setHeight(((Fig) fig).getHeight());
+                        figClassifierRoleFound = true;
+                    }
                 }
+                i++;
             }
-            i++;
-        }
-        if (location != null) {
-            if (newCR.getY() == 0) {
-                newCR.setY(location.y);
+            if (location != null) {
+                if (newCR.getY() == 0) {
+                    newCR.setY(location.y);
+                }
+                newCR.setX(location.x);
             }
-            newCR.setX(location.x);
+            return newCR;
         }
-        return newCR;
+        return null;
     }
     
     @Override
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.