Author: tfmorris
Date: 2008-11-11 13:06:36-0800
New Revision: 16028

Modified:
   
trunk/src/argouml-app/src/org/argouml/uml/ui/foundation/extension_mechanisms/UMLTagDefinitionComboBoxModel.java

Log:
RESOLVED issue 4720: Tag type combobox not updating when stereotype applied 
http://argouml.tigris.org/issues/show_bug.cgi?id=4720

Modified: 
trunk/src/argouml-app/src/org/argouml/uml/ui/foundation/extension_mechanisms/UMLTagDefinitionComboBoxModel.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/ui/foundation/extension_mechanisms/UMLTagDefinitionComboBoxModel.java?view=diff&rev=16028&p1=trunk/src/argouml-app/src/org/argouml/uml/ui/foundation/extension_mechanisms/UMLTagDefinitionComboBoxModel.java&p2=trunk/src/argouml-app/src/org/argouml/uml/ui/foundation/extension_mechanisms/UMLTagDefinitionComboBoxModel.java&r1=16027&r2=16028
==============================================================================
--- 
trunk/src/argouml-app/src/org/argouml/uml/ui/foundation/extension_mechanisms/UMLTagDefinitionComboBoxModel.java
     (original)
+++ 
trunk/src/argouml-app/src/org/argouml/uml/ui/foundation/extension_mechanisms/UMLTagDefinitionComboBoxModel.java
     2008-11-11 13:06:36-0800
@@ -31,9 +31,11 @@
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.apache.log4j.Logger;
 import org.argouml.kernel.Project;
 import org.argouml.kernel.ProjectManager;
 import org.argouml.model.Model;
+import org.argouml.model.UmlChangeEvent;
 import org.argouml.uml.ui.UMLComboBoxModel2;
 import org.argouml.uml.util.PathComparator;
 
@@ -43,14 +45,57 @@
  * @since October 27, 2005
  */
 public class UMLTagDefinitionComboBoxModel  extends UMLComboBoxModel2 {
+    
+    private static final Logger LOG = 
+        Logger.getLogger(UMLTagDefinitionComboBoxModel.class);
 
     /**
      * Constructor for UMLTagDefinitionComboBoxModel.
      */
     public UMLTagDefinitionComboBoxModel() {
-        // TODO: What property name do we need here?  
-        // We're forced to have something, but nothing will really work.
-        super("definedTag", false);
+        // stereotypes applied to the target mostly control which TDs
+        // (but see below for other listeners too)
+        super("stereotype", false);
+    }
+
+    @Override
+    protected void addOtherModelEventListeners(Object target) {
+        // Ask to be notified of any changes to TagDefinitions so that we
+        // can track new ones, name changes, etc
+        Model.getPump().addClassModelEventListener(this, 
+                Model.getMetaTypes().getTagDefinition(), (String[]) null);
+    }    
+
+    @Override
+    protected void removeOtherModelEventListeners(Object target) {
+        Model.getPump().addClassModelEventListener(this, 
+                Model.getMetaTypes().getTagDefinition(), (String[]) null);
+    }
+
+    @Override
+    public void modelChanged(UmlChangeEvent evt) {
+        // because we're listening for stereotypes being added and removed
+        // but we're really interested in their owned tag definitions,
+        // the default implementation won't work for us
+        
+        if (Model.getFacade().isATagDefinition(evt.getSource())) {
+            LOG.debug("Got TagDefinition event " + evt.toString());
+            // Just mark for rebuild next time since we use lazy loading
+            setModelInvalid();
+        } else if ("stereotype".equals(evt.getPropertyName())) {
+            LOG.debug("Got stereotype event " + evt.toString());
+            // A stereotype got applied or removed
+            // Just mark for rebuild next time since we use lazy loading
+            setModelInvalid();
+        } else {
+            LOG.debug("Got other event " + evt.toString());
+        }    
+    }
+
+
+    @Override
+    public boolean isLazy() {
+        return true;
     }
 
 
@@ -80,8 +125,8 @@
      */
     protected void buildModelList() {
         removeAllElements();
-        Object t = getTarget();
-        addAll(getApplicableTagDefinitions(t));
+        Object target = getTarget();
+        addAll(getApplicableTagDefinitions(target));
     }
 
     /*
@@ -91,18 +136,20 @@
         return getSelectedItem();
     }
 
-    private Collection getApplicableTagDefinitions(Object t) {
+    private Collection getApplicableTagDefinitions(Object element) {
         Set<List<String>> paths = new HashSet<List<String>>();
         Set<Object> availableTagDefs = 
             new TreeSet<Object>(new PathComparator());
-        Collection stereotypes = Model.getFacade().getStereotypes(t);
+        Collection stereotypes = Model.getFacade().getStereotypes(element);
         Project project = ProjectManager.getManager().getCurrentProject();
         for (Object model : project.getModels()) {
+            // TODO: Won't our use of PathComparator take care of uniqueness?
             addAllUniqueModelElementsFrom(availableTagDefs, paths,
                     Model.getModelManagementHelper().getAllModelElementsOfKind(
                             model,
                             Model.getMetaTypes().getTagDefinition()));
         }
+        // TODO: Won't our use of PathComparator take care of uniqueness?
         addAllUniqueModelElementsFrom(availableTagDefs, paths, project
                 .getProfileConfiguration().findByMetaType(
                         Model.getMetaTypes().getTagDefinition()));

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

Reply via email to