svn commit: r15891 - trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigNodeModelElement.java

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
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;
     }
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.