Author: tfmorris
Date: 2008-10-06 11:26:18-0700
New Revision: 15891

Modified:
   trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java

Log:
Issue 5438: Add minimal update for listeners.  Clean up logging format.
http://argouml.tigris.org/issues/show_bug.cgi?id=5438

Modified: 
trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java?view=diff&rev=15891&p1=trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java&p2=trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java&r1=15890&r2=15891
==============================================================================
--- 
trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java   
    (original)
+++ 
trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java   
    2008-10-06 11:26:18-0700
@@ -42,8 +42,10 @@
 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;
@@ -283,7 +285,7 @@
     private boolean editable = true;
 
     // TODO: A more strongly typed data structure could be used here.
-    private Collection<Object[]> listeners = new ArrayList<Object[]>();
+    private Set<Object[]> listeners = new HashSet<Object[]>();
 
 
     /**
@@ -997,11 +999,8 @@
                 modelChanged(event);
             } catch (InvalidElementException e) {
                 if (LOG.isDebugEnabled()) {
-                    LOG.debug("event = " + event.getClass().getName());
-                    LOG.debug("source = " + event.getSource());
-                    LOG.debug("old = " + event.getOldValue());
-                    LOG.debug("name = " + event.getPropertyName());
-                    LOG.debug("modelChanged method accessed deleted element ",
+                    LOG.debug("modelChanged method accessed deleted element"
+                            + formatEvent(event),
                             e);
                 }
             }
@@ -1017,13 +1016,9 @@
                         updateLayout(event);
                     } catch (InvalidElementException e) {
                         if (LOG.isDebugEnabled()) {
-                            LOG.debug("event = "
-                                    + event.getClass().getName());
-                            LOG.debug("source = " + event.getSource());
-                            LOG.debug("old = " + event.getOldValue());
-                            LOG.debug("name = " + event.getPropertyName());
                             LOG.debug("updateLayout method accessed "
-                                    + "deleted element ", e);
+                                    + "deleted element " 
+                                    + formatEvent(event), e);
                         }
                     }
                 }  
@@ -1032,6 +1027,13 @@
         }
     }
     
+    private String formatEvent(PropertyChangeEvent event) {
+        return "\n\t event = " + event.getClass().getName() 
+                + "\n\t source = " + event.getSource() 
+                + "\n\t old = " + event.getOldValue()
+                + "\n\t name = " + event.getPropertyName();
+    }
+    
     /**
      * Return true if the model element that this Fig represents is read only
      * @return The model element is read only.
@@ -1447,8 +1449,8 @@
      */
     protected void updateStereotypeText() {
         if (getOwner() == null) {
-            LOG.warn("Owner of [" + this.toString() + "/" + this.getClass()
-                    + "] is null.");
+            LOG.warn("Null owner for [" + this.toString() + "/"
+                    + this.getClass());
             return;
         }
 
@@ -2075,7 +2077,7 @@
     }
     
     /**
-     * Remove an element listener and remember the registration.
+     * Remove an element listener and remembered registration.
      * 
      * @param element
      *            element to listen for changes on
@@ -2091,7 +2093,11 @@
      * @see #addElementListener(Object, String)
      */
     protected void removeAllElementListeners() {
-        for (Object[] listener : listeners) {
+        removeElementListeners(listeners);
+    }
+
+    private void removeElementListeners(Set<Object[]> listenerSet) {
+        for (Object[] listener : listenerSet) {
             Object property = listener[1];
             if (property == null) {
                 Model.getPump().removeModelEventListener(this, listener[0]);
@@ -2106,9 +2112,43 @@
                         "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() {
         return npArguments;
     }

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to