svn commit: r15896 - trunk/src/argouml-app/src/org/argouml/uml/diagram: static_structure/ui ui use_case/ui

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: tfmorris
Date: 2008-10-06 13:05:27-0700
New Revision: 15896

Modified:
   trunk/src/argouml-app/src/org/argouml/uml/diagram/static_structure/ui/FigStereotypeDeclaration.java
   trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociation.java
   trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociationEnd.java
   trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java
   trunk/src/argouml-app/src/org/argouml/uml/diagram/use_case/ui/FigExtend.java

Log:
Issue 5438: Minimal listener update for more figs, including FigEdgeModelElement and some of its subclasses
http://argouml.tigris.org/issues/show_bug.cgi?id=5438

Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/static_structure/ui/FigStereotypeDeclaration.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/static_structure/ui/FigStereotypeDeclaration.java?view=diff&rev=15896&p1=trunk/src/argouml-app/src/org/argouml/uml/diagram/static_structure/ui/FigStereotypeDeclaration.java&p2=trunk/src/argouml-app/src/org/argouml/uml/diagram/static_structure/ui/FigStereotypeDeclaration.java&r1=15895&r2=15896
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/static_structure/ui/FigStereotypeDeclaration.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/static_structure/ui/FigStereotypeDeclaration.java	2008-10-06 13:05:27-0700
@@ -1,5 +1,5 @@
 // $Id$
-// Copyright (c) 1996-2007 The Regents of the University of California. All
+// Copyright (c) 1996-2008 The Regents of the University of California. All
 // Rights Reserved. Permission to use, copy, modify, and distribute this
 // software and its documentation without fee, and without a written
 // agreement is hereby granted, provided that the above copyright notice
@@ -29,7 +29,9 @@
 import java.awt.Rectangle;
 import java.awt.event.MouseEvent;
 import java.beans.PropertyChangeEvent;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Set;
 import java.util.Vector;
 
 import javax.swing.Action;
@@ -105,6 +107,7 @@
     /*
      * @see org.tigris.gef.presentation.Fig#makeSelection()
      */
+    @Override
     public Selection makeSelection() {
         return new SelectionStereotype(this);
     }
@@ -114,6 +117,7 @@
      * popup menu on a Stereotype.
      * {@inheritDoc}
      */
+    @Override
     public Vector getPopUpActions(MouseEvent me) {
         Vector popUpActions = super.getPopUpActions(me);
 
@@ -155,6 +159,7 @@
      *
      * @return  the size of the minimum bounding box.
      */
+    @Override
     public Dimension getMinimumSize() {
         Dimension aSize = getNameFig().getMinimumSize();
         if (getStereotypeFig().isVisible()) {
@@ -193,6 +198,7 @@
      *
      * @see org.tigris.gef.presentation.Fig#setBoundsImpl(int, int, int, int)
      */
+    @Override
     protected void setStandardBounds(final int x, final int y,
             final int w, final int h) {
         Rectangle oldBounds = getBounds();
@@ -240,6 +246,7 @@
     /*
      * @see org.argouml.uml.diagram.static_structure.ui.FigCompartmentBox#unhighlight()
      */
+    @Override
     protected CompartmentFigText unhighlight() {
         CompartmentFigText fc = super.unhighlight();
         if (fc == null) {
@@ -253,9 +260,10 @@
      * Handles changes to the model. Takes into account the event that
      * occurred. If you need to update the whole fig, consider using
      * renderingChanged.
-     *
+     * {@inheritDoc}
      * @see org.argouml.uml.diagram.ui.FigNodeModelElement#modelChanged(java.beans.PropertyChangeEvent)
      */
+    @Override
     protected void modelChanged(PropertyChangeEvent mee) {
         super.modelChanged(mee);
         if (mee instanceof AssociationChangeEvent 
@@ -269,21 +277,19 @@
     /*
      * @see org.argouml.uml.diagram.ui.FigNodeModelElement#updateListeners(java.lang.Object)
      */
+    @Override
     protected void updateListeners(Object oldOwner, Object newOwner) {
-        if (oldOwner != null) {
-            removeAllElementListeners();
-        }
+        
+        Set<Object[]> listeners = new HashSet<Object[]>();
         if (newOwner != null) {
-            addElementListener(newOwner);
+            listeners.add(new Object[] {newOwner, null});
             // register for tagdefinitions:
-            Iterator it =
-                Model.getFacade().getTagDefinitions(newOwner).iterator();
-            while (it.hasNext()) {
-                Object td = it.next();
-                addElementListener(td, 
-                        new String[] {"name", "tagType", "multiplicity"});
+            for (Object td : Model.getFacade().getTagDefinitions(newOwner)) {
+                listeners.add(new Object[] {td,
+                    new String[] {"name", "tagType", "multiplicity"}});
             }
             /* TODO: constraints, ... */
         }
+        updateElementListeners(listeners);
     }
-} /* end class FigClass */
+}

Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociation.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociation.java?view=diff&rev=15896&p1=trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociation.java&p2=trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociation.java&r1=15895&r2=15896
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociation.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociation.java	2008-10-06 13:05:27-0700
@@ -32,7 +32,9 @@
 import java.beans.PropertyChangeListener;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Set;
 import java.util.Vector;
 
 import org.apache.log4j.Logger;
@@ -194,10 +196,14 @@
      */
     @Override
     public void updateListeners(Object oldOwner, Object newOwner) {
-        removeAllElementListeners();
+        Set<Object[]> listeners = new HashSet<Object[]>();
         if (newOwner != null) {
-            addElementListener(newOwner, new String[] {"isAbstract", "remove"});
+            listeners.add(
+                    new Object[] {newOwner,
+                                  new String[] {"isAbstract", "remove"}
+                    });
         }
+        updateElementListeners(listeners);
         /* No further listeners required in this case - the rest is handled 
          * by the notationProvider and sub-Figs. */
     }

Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociationEnd.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociationEnd.java?view=diff&rev=15896&p1=trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociationEnd.java&p2=trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociationEnd.java&r1=15895&r2=15896
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociationEnd.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociationEnd.java	2008-10-06 13:05:27-0700
@@ -27,6 +27,8 @@
 import java.awt.Color;
 import java.awt.Graphics;
 import java.beans.PropertyChangeEvent;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.apache.log4j.Logger;
 import org.argouml.kernel.Project;
@@ -159,20 +161,11 @@
      */
     @Override
     public void updateListeners(Object oldOwner, Object newOwner) {
-        if (oldOwner == newOwner) {
-            LOG.warn("Listeners being added and removed from the same owner");
-        }
-        if (oldOwner != null) {
-            removeAllElementListeners();
-        }
-        /* Now, let's register for events from all modelelements
-         * that change the association-end representation: 
-         */
+        Set<Object[]> l = new HashSet<Object[]>();
         if (newOwner != null) {
-            /* Many different event types are needed, 
-             * so let's register for them all: */
-            addElementListener(newOwner);
+            l.add(new Object[] {newOwner, null});
         }
+        updateElementListeners(l);
     }
 
     /** Returns the name of the OrderingKind.

Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java?view=diff&rev=15896&p1=trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java&p2=trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java&r1=15895&r2=15896
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigEdgeModelElement.java	2008-10-06 13:05:27-0700
@@ -36,11 +36,11 @@
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.beans.VetoableChangeListener;
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 import java.util.Vector;
 
 import javax.swing.Action;
@@ -65,6 +65,7 @@
 import org.argouml.kernel.DelayedChangeNotify;
 import org.argouml.kernel.DelayedVChangeListener;
 import org.argouml.kernel.Project;
+import org.argouml.kernel.ProjectSettings;
 import org.argouml.model.AddAssociationEvent;
 import org.argouml.model.AssociationChangeEvent;
 import org.argouml.model.AttributeChangeEvent;
@@ -156,7 +157,7 @@
     /*
      * List of model element listeners we've registered.
      */
-    private Collection listeners = new ArrayList();
+    private Set<Object[]> listeners = new HashSet<Object[]>();
 
     ////////////////////////////////////////////////////////////////
     // constructors
@@ -261,8 +262,9 @@
     }
 
     /**
-     * @return a Vector containing a combination of these 4 types:
-     * Action, JMenu, JMenuItem, JSeparator.
+     * @param me the MouseEvent that triggered the popup menu request
+     * @return a Vector containing a combination of these 4 types: Action,
+     *         JMenu, JMenuItem, JSeparator.
      */
     @Override
     public Vector getPopUpActions(MouseEvent me) {
@@ -421,8 +423,9 @@
             if (y >= p.y + yOff
                 && y <= p.y + height + yOff
                 && x >= p.x + xOff
-                && x <= p.x + width + xOff)
+                && x <= p.x + width + xOff) {
                 return item;
+            }
             iconPos += width;
         }
         for (ToDoItem item : items) {
@@ -430,8 +433,9 @@
             if (icon instanceof Clarifier) {
                 ((Clarifier) icon).setFig(this);
                 ((Clarifier) icon).setToDoItem(item);
-                if (((Clarifier) icon).hit(x, y))
+                if (((Clarifier) icon).hit(x, y)) {
                     return item;
+                }
             }
         }
         items = tdList.elementListForOffender(this);
@@ -443,8 +447,9 @@
             if (y >= p.y + yOff
                 && y <= p.y + height + yOff
                 && x >= p.x + xOff
-                && x <= p.x + width + xOff)
+                && x <= p.x + width + xOff) {
                 return item;
+            }
             iconPos += width;
         }
         for (ToDoItem item : items) {
@@ -452,8 +457,9 @@
             if (icon instanceof Clarifier) {
                 ((Clarifier) icon).setFig(this);
                 ((Clarifier) icon).setToDoItem(item);
-                if (((Clarifier) icon).hit(x, y))
+                if (((Clarifier) icon).hit(x, y)) {
                     return item;
+                }
             }
         }
         return null;
@@ -656,8 +662,9 @@
      */
     protected void textEdited(FigText ft) {
         if (ft == nameFig) {
-            if (getOwner() == null)
+            if (getOwner() == null) {
                 return;
+            }
             notationProviderName.parse(getOwner(), ft.getText());
             ft.setText(notationProviderName.toString(getOwner(), npArguments));
         }
@@ -959,15 +966,11 @@
      *          or null if there was none, and all listeners have to be set
      */
     protected void updateListeners(Object oldOwner, Object newOwner) {
-        if (oldOwner == newOwner) {
-            LOG.debug("Listeners being added and removed from the same owner");
-        }
-        if (oldOwner != null) {
-            removeElementListener(oldOwner);
-        }
+        Set<Object[]> l = new HashSet<Object[]>();
         if (newOwner != null) {
-            addElementListener(newOwner, "remove");
+            l.add(new Object[] {newOwner, "remove"});
         }
+        updateElementListeners(l);
     }
 
     /*
@@ -1001,7 +1004,9 @@
      * @see org.argouml.application.events.ArgoNotationEventListener#notationChanged(org.argouml.application.events.ArgoNotationEvent)
      */
     public void notationChanged(ArgoNotationEvent event) {
-        if (getOwner() == null) return;
+        if (getOwner() == null) {
+            return;
+        }
         initNotationProviders(getOwner());
         renderingChanged();
     }
@@ -1045,8 +1050,9 @@
 	Iterator it = getPathItemFigs().iterator();
 	while (it.hasNext()) {
 	    Fig f = (Fig) it.next();
-	    if (f.hit(r))
+	    if (f.hit(r)) {
 		return true;
+	    }
 	}
 	return super.hit(r);
     }
@@ -1054,6 +1060,7 @@
     /*
      * @see org.tigris.gef.presentation.Fig#removeFromDiagram()
      */
+    @Override
     public final void removeFromDiagram() {
         Fig delegate = getRemoveDelegate();
         if (delegate instanceof FigNodeModelElement) {
@@ -1364,28 +1371,66 @@
         Model.getPump().removeModelEventListener(this, element);
     }
    
+    
     /**
      * Unregister all listeners registered through addElementListener
      * @see #addElementListener(Object, String)
      */
     protected void removeAllElementListeners() {
-        for (Iterator iter = listeners.iterator(); iter.hasNext();) {
-            Object[] l = (Object[]) iter.next();
-            Object property = l[1];
+        removeElementListeners(listeners);
+    }
+
+    private void removeElementListeners(Set<Object[]> listenerSet) {
+        for (Object[] listener : listenerSet) {
+            Object property = listener[1];
             if (property == null) {
-                Model.getPump().removeModelEventListener(this, l[0]);
+                Model.getPump().removeModelEventListener(this, listener[0]);
             } else if (property instanceof String[]) {
-                Model.getPump().removeModelEventListener(this, l[0],
+                Model.getPump().removeModelEventListener(this, listener[0],
                         (String[]) property);
             } else if (property instanceof String) {
-                Model.getPump().removeModelEventListener(this, l[0],
+                Model.getPump().removeModelEventListener(this, listener[0],
                         (String) property);
             } else {
                 throw new RuntimeException(
                         "Internal error in removeAllElementListeners");
             }
         }
-        listeners.clear();
+        listeners.removeAll(listenerSet);
+    }
+
+    private void addElementListeners(Set<Object[]> listenerSet) {
+        for (Object[] listener : listenerSet) {
+            Object property = listener[1];
+            if (property == null) {
+                addElementListener(listener[0]);
+            } else if (property instanceof String[]) {
+                addElementListener(listener[0], (String[]) property);
+            } else if (property instanceof String) {
+                addElementListener(listener[0], (String) property);
+            } else {
+                throw new RuntimeException(
+                        "Internal error in addElementListeners");
+            }
+        }
+    }
+
+    /**
+     * Update the set of registered listeners to match the given set using 
+     * a minimal update strategy to remove unneeded listeners and add new 
+     * listeners.
+     * 
+     * @param listenerSet a set of arrays containing a tuple of a UML element
+     * to be listened to and a set of property to be listened for.  
+     */
+    protected void updateElementListeners(Set<Object[]> listenerSet) {
+        Set<Object[]> removes = new HashSet<Object[]>(listeners);
+        removes.removeAll(listenerSet);
+        removeElementListeners(removes);
+        
+        Set<Object[]> adds = new HashSet<Object[]>(listenerSet);
+        adds.removeAll(listeners);
+        addElementListeners(adds);
     }
 
     protected HashMap<String, Object> getNotationArguments() {

Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/use_case/ui/FigExtend.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/use_case/ui/FigExtend.java?view=diff&rev=15896&p1=trunk/src/argouml-app/src/org/argouml/uml/diagram/use_case/ui/FigExtend.java&p2=trunk/src/argouml-app/src/org/argouml/uml/diagram/use_case/ui/FigExtend.java&r1=15895&r2=15896
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/use_case/ui/FigExtend.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/use_case/ui/FigExtend.java	2008-10-06 13:05:27-0700
@@ -1,5 +1,5 @@
 // $Id$
-// Copyright (c) 1996-2007 The Regents of the University of California. All
+// Copyright (c) 1996-2008 The Regents of the University of California. All
 // Rights Reserved. Permission to use, copy, modify, and distribute this
 // software and its documentation without fee, and without a written
 // agreement is hereby granted, provided that the above copyright notice
@@ -27,6 +27,8 @@
 import java.awt.Color;
 import java.awt.Graphics;
 import java.beans.PropertyChangeEvent;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.argouml.kernel.Project;
 import org.argouml.kernel.ProjectManager;
@@ -72,11 +74,6 @@
 
     private ArrowHeadGreater endArrow = new ArrowHeadGreater();
 
-    ///////////////////////////////////////////////////////////////////////////
-    //
-    // Constructors
-    //
-    ///////////////////////////////////////////////////////////////////////////
 
     /**
      * The default constructor, but should never be called directly
@@ -154,12 +151,6 @@
     }
 
 
-    ///////////////////////////////////////////////////////////////////////////
-    //
-    // Accessors
-    //
-    ///////////////////////////////////////////////////////////////////////////
-
     /**
      * Set a new fig to represent this edge.<p>
      *
@@ -169,6 +160,7 @@
      *
      * @param f  The fig to use.
      */
+    @Override
     public void setFig(Fig f) {
         super.setFig(f);
 
@@ -185,6 +177,7 @@
      *
      * @return   <code>false</code> under all circumstances.
      */
+    @Override
     protected boolean canEdit(Fig f) {
         return false;
     }
@@ -192,6 +185,7 @@
     /*
      * @see org.tigris.gef.presentation.Fig#paint(java.awt.Graphics)
      */
+    @Override
     public void paint(Graphics g) {
         endArrow.setLineColor(getLineColor());
         super.paint(g);
@@ -200,11 +194,16 @@
     /*
      * @see org.argouml.uml.diagram.ui.FigEdgeModelElement#updateListeners(java.lang.Object, java.lang.Object)
      */
+    @Override
     protected void updateListeners(Object oldOwner, Object newOwner) {
-        removeAllElementListeners();
+        Set<Object[]> listeners = new HashSet<Object[]>();
         if (newOwner != null) {
-            addElementListener(newOwner, new String[] {"condition", "remove"});
+            listeners.add(
+                    new Object[] {newOwner,
+                                  new String[] {"condition", "remove"}
+                    });
         }
+        updateElementListeners(listeners);
     }
 
 
@@ -213,6 +212,7 @@
      * 
      * @see org.argouml.uml.diagram.ui.FigEdgeModelElement#modelChanged(java.beans.PropertyChangeEvent)
      */
+    @Override
     protected void modelChanged(PropertyChangeEvent e) {
         Object extend = getOwner();
         if (extend == null) {
@@ -228,6 +228,7 @@
     /*
      * @see org.argouml.uml.diagram.ui.FigEdgeModelElement#renderingChanged()
      */
+    @Override
     protected void renderingChanged() {
         if (getOwner() != null) {
             updateConditionText();
@@ -242,7 +243,9 @@
      * so we show the "body" of it, and ignore the "language".
      */
     protected void updateConditionText() {
-        if (getOwner() == null) return;
+        if (getOwner() == null) {
+            return;
+        }
 
         Object c = Model.getFacade().getCondition(getOwner());
         if (c == null) {
@@ -270,4 +273,4 @@
                 + ps.getRightGuillemot());
     }
 
-} /* end class FigExtend */
+}
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.