svn commit: r18838 - trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels: model ui

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: bobtarling
Date: 2010-11-06 07:54:07-0700
New Revision: 18838

Modified:
   trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/MetaDataCache.java
   trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/PanelData.java
   trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/metamodel.xml
   trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/metamodel2.xml
   trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/SwingUIFactory.java

Log:
Drive the appearance of the navigate sibling by XML attribtues rather than hard coding.
Begin work to allow new child and new sibling buttons on a panel.

Modified: trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/MetaDataCache.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/MetaDataCache.java?view=diff&pathrev=18838&r1=18837&r2=18838
==============================================================================
--- trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/MetaDataCache.java	(original)
+++ trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/MetaDataCache.java	2010-11-06 07:54:07-0700
@@ -15,7 +15,9 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
 
@@ -121,30 +123,41 @@
         for (int i = 0; i < panelNodes.getLength(); ++i) {
             
             Element panelNode = (Element) panelNodes.item(i);
-            final String name = 
-    	        panelNode.getAttributes().getNamedItem("name").getNodeValue();
+            final String name = panelNode.getAttribute("name");
+
             Class<?> clazz = metaTypeByName.get(name);
 
             if (clazz == null) {
                 LOG.warn("No class name translation found for panel: " + name);
             } else {
-                PanelData pm = new PanelData(clazz, name);
+                final List<Class<?>> newChildTypes =
+                    stringToMetaTypes(panelNode.getAttribute("new-child"));
+                final List<Class<?>> newSiblingTypes =
+                    stringToMetaTypes(panelNode.getAttribute("new-sibling"));
+                
+                final boolean siblingNavigation =
+                    "true".equals(panelNode.getAttribute("navigate-sibling"));
+                
+                final PanelData pm =
+                    new PanelData(clazz, name, newChildTypes, newSiblingTypes, siblingNavigation);
                 map.put(clazz, pm);
                 
-                final NodeList controlNodes = panelNode.getElementsByTagName("*");
+                final NodeList controlNodes =
+                    panelNode.getElementsByTagName("*");
                 for (int j = 0; j < controlNodes.getLength(); ++j) {
                     Element controlNode = (Element) controlNodes.item(j);
                     
-                    final String propertyName = controlNode.getAttribute("name");
+                    final String propertyName =
+                	controlNode.getAttribute("name");
                     final String label = controlNode.getAttribute("label");
                     
                     final ControlData controlData =
                         new ControlData(controlNode.getTagName(), propertyName, label);
                     
-                    final String types = controlNode.getAttribute("type");
-                    StringTokenizer st = new StringTokenizer(types, ",");
-                    while (st.hasMoreTokens()) {
-                        controlData.addType(metaTypeByName.get(st.nextToken()));
+                    final List<Class<?>> types =
+                	stringToMetaTypes(controlNode.getAttribute("type"));
+                    for (Class<?> metaType : types) {
+                        controlData.addType(metaType);
                     }
                     
                     if (controlNode.getTagName().equals("checkgroup")) {
@@ -158,6 +171,22 @@
         return map;
     }
     
+    /**
+     * Takes as input a string of comma separated metatypes (e.g.
+     * "Class,Interface,Attribute") and converts it to a list of classes of
+     * the appropriate type.
+     * @param typesString
+     * @return 
+     */
+    private List<Class<?>> stringToMetaTypes(String typesString) {
+	List<Class<?>> classes = new ArrayList<Class<?>>();
+        StringTokenizer st = new StringTokenizer(typesString, ",");
+        while (st.hasMoreTokens()) {
+            classes.add(metaTypeByName.get(st.nextToken()));
+        }
+        return classes;
+    }
+    
     private void addCheckboxes(ControlData controlData, Element controlElement) {
         final NodeList checkBoxElements =
             controlElement.getElementsByTagName("checkbox");

Modified: trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/PanelData.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/PanelData.java?view=diff&pathrev=18838&r1=18837&r2=18838
==============================================================================
--- trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/PanelData.java	(original)
+++ trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/PanelData.java	2010-11-06 07:54:07-0700
@@ -13,6 +13,7 @@
 
 package org.argouml.core.propertypanels.model;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
@@ -22,13 +23,29 @@
     private final Class<?> clazz;
     private final List<ControlData> properties;
     private final String name;
-    
-    public PanelData(Class<?> clazz, String name) {
+    private final Collection<Class<?>> newChildElements;
+    private final Collection<Class<?>> newSiblingElements;
+    private final boolean siblingNavigation;
+    
+    public PanelData(
+	    final Class<?> clazz,
+	    final String name,
+	    final Collection<Class<?>> newChildElements,
+	    final Collection<Class<?>> newSiblingElements,
+	    final boolean siblingNavigation) {
+	
         this.clazz = clazz;
         this.name = name;
         properties = new LinkedList<ControlData>();
+        this.newChildElements = newChildElements;
+        this.newSiblingElements = newSiblingElements;
+        this.siblingNavigation = siblingNavigation;
     }
     
+    public boolean isSiblingNavigation() {
+        return siblingNavigation;
+    }
+
     public void addControlData(ControlData record) {
         properties.add(record);
     }
@@ -44,4 +61,12 @@
     public List<ControlData> getProperties () {
         return Collections.unmodifiableList(properties);
     }
+
+    public Collection<Class<?>> getNewChildElements() {
+        return newChildElements;
+    }
+
+    public Collection<Class<?>> getNewSiblingElements() {
+        return newSiblingElements;
+    }
 }

Modified: trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/metamodel.xml
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/metamodel.xml?view=diff&pathrev=18838&r1=18837&r2=18838
==============================================================================
--- trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/metamodel.xml	(original)
+++ trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/metamodel.xml	2010-11-06 07:54:07-0700
@@ -339,7 +339,7 @@
     <list name="classifierInState" type="Classifier" label="label.classifier-in-state" />
     <list name="objectFlowState" type="Classifier" />
   </panel>
-  <panel name="Class" newchild="Attribute,Operation">
+  <panel name="Class" new-child="Attribute,Operation">
     <text name="name" type="Name" />
     <combo name="namespace" type="Namespace" />    
     <optionbox name="visibility" type="VisibilityKind" />
@@ -498,7 +498,7 @@
     <attribute name="ordering" type="OrderingKind" />
     <attribute name="type" type="Classifier" />
   </panel>
-  <panel name="AssociationEnd">
+  <panel name="AssociationEnd" navigate-sibling="true" >
     <text name="name" type="Name" />
     <combo name="participant" type="Classifier" label="label.type" />
     <combo name="multiplicity" type="Multiplicity" />
@@ -683,7 +683,7 @@
     <attribute name="generalization" type="Generalization" />
     <attribute name="specialization" type="GeneralizableElement" />    
   </panel>
-  <panel name="Attribute" newsibling="Attribute">
+  <panel name="Attribute" new-sibling="Reception,Operation,Attribute" navigate-sibling="true" >
     <text name="name" type="Name" />
     <combo name="type" type="Classifier" />
     <combo name="multiplicity" type="Multiplicity" />
@@ -755,7 +755,7 @@
     <separator />
     <list name="raisedSignal" type="Signal" new="true" label="label.raisedsignals" />
   </panel>
-  <panel name="Operation" newsibling="Operation">
+  <panel name="Operation" new-sibling="Reception,Operation,Attribute" navigate-sibling="true" >
     <text name="name" type="Name" />
     <singlerow name="owner" type="Classifier" />
     <list name="parameter" type="Parameter" new="true" />
@@ -798,7 +798,7 @@
     <attribute name="callAction" type="Operation" />
     <attribute name="occurrence" type="Operation" />
   </panel>
-  <panel name="Parameter">
+  <panel name="Parameter" navigate-sibling="true" >
     <text name="name" type="Name" />
     <singlerow name="behavioralFeature" type="BehavioralFeature" />
     <combo name="type" type="Classifier" />
@@ -2185,7 +2185,7 @@
     <attribute name="value" type="Expression" />
     <attribute name="action" type="Action" />
   </panel>
-  <panel name="Reception" newsibling="Reception">
+  <panel name="Reception" new-sibling="Reception,Operation,Attribute" navigate-sibling="true" >
     <text name="name" type="Name" />
     <singlerow name="owner" type="Classifier" />
     <optionbox name="visibility" type="VisibilityKind" />

Modified: trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/metamodel2.xml
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/metamodel2.xml?view=diff&pathrev=18838&r1=18837&r2=18838
==============================================================================
--- trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/metamodel2.xml	(original)
+++ trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/metamodel2.xml	2010-11-06 07:54:07-0700
@@ -587,7 +587,7 @@
     <attribute name="generalization" type="Generalization" />
     <attribute name="specialization" type="GeneralizableElement" />    
   </panel>
-  <panel name="Property">
+  <panel name="Property" navigate-sibling="true" >
     <text name="name" type="Name" />
     <combo name="type" type="Classifier" />
     <combo name="multiplicity" type="Multiplicity" />
@@ -659,7 +659,7 @@
     <separator />
     <list name="raisedSignal" type="Signal" new="true" label="label.raisedsignals" />
   </panel>
-  <panel name="Operation">
+  <panel name="Operation" navigate-sibling="true" >
     <text name="name" type="Name" />
     <singlerow name="owner" type="Classifier" />
     <list name="parameter" type="Parameter" new="true" />
@@ -2049,7 +2049,7 @@
     <attribute name="value" type="Expression" />
     <attribute name="action" type="Action" />
   </panel>
-  <panel name="Reception">
+  <panel name="Reception" navigate-sibling="true" >
     <text name="name" type="Name" />
     <singlerow name="owner" type="Classifier" />
     <optionbox name="visibility" type="VisibilityKind" />

Modified: trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/SwingUIFactory.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/SwingUIFactory.java?view=diff&pathrev=18838&r1=18837&r2=18838
==============================================================================
--- trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/SwingUIFactory.java	(original)
+++ trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/SwingUIFactory.java	2010-11-06 07:54:07-0700
@@ -54,6 +54,7 @@
 import org.argouml.core.propertypanels.model.CheckBoxData;
 import org.argouml.core.propertypanels.model.ControlData;
 import org.argouml.core.propertypanels.model.GetterSetterManager;
+import org.argouml.core.propertypanels.model.MetaDataCache;
 import org.argouml.core.propertypanels.model.PanelData;
 import org.argouml.i18n.Translator;
 import org.argouml.model.Model;
@@ -81,13 +82,13 @@
     public void createGUI (
             final Object target,
             final JPanel panel) throws Exception {
-        PanelData data = 
+        PanelData panelData = 
             XMLPropPanelFactory.getInstance().getPropertyPanelsData(
               	target.getClass());
             
-        createLabel(target, panel);
+        createLabel(target, panelData, panel);
             
-        for (ControlData prop : data.getProperties()) {
+        for (ControlData prop : panelData.getProperties()) {
             try {
                 if ("text".equals(prop.getControlType())) {
                     buildTextboxPanel(panel, target, prop);
@@ -120,7 +121,10 @@
      * @param target
      * @param panel
      */
-    private void createLabel (Object target, JPanel panel) {
+    private void createLabel(
+	    final Object target,
+	    final PanelData panelData,
+	    final JPanel panel) {
         final String metaTypeName = Model.getMetaTypes().getName(target);
         final ToolBarFactory tbf = new ToolBarFactory(new Object[0]);
         tbf.setRollover(true);
@@ -139,12 +143,7 @@
         if (!Model.getModelManagementHelper().isReadOnly(target)) {
             tb.add(new NavigateUpAction(target));
             
-            // TODO: This should not be hard coded but should be driven from the panel xml
-            if (Model.getFacade().isAAttribute(target)
-                || Model.getFacade().isAOperation(target)
-                || Model.getFacade().isAReception(target)
-                || Model.getFacade().isAParameter(target)
-                || Model.getFacade().isAAssociationEnd(target)) {
+            if (panelData.isSiblingNavigation()) {
                 tb.add(new NavigatePreviousAction(target));
                 tb.add(new NavigateNextAction(target));
             }
@@ -153,6 +152,15 @@
             // We only have this here until we have stereotypes
             // list on property panel
             tb.add(new ActionNewStereotype());
+            
+            for (Class<?> newChildElement : panelData.getNewChildElements()) {
+        	LOG.debug("Child = " + newChildElement);
+        	// TODO: Create new child action here
+            }
+            for (Class<?> newSiblingElement : panelData.getNewSiblingElements()) {
+        	LOG.debug("Sibling = " + newSiblingElement);
+        	// TODO: Create new sibling action here
+            }
         }
         panel.add(tb);
     }

------------------------------------------------------
http://argouml.tigris.org/ds/viewMessage.do?dsForumId=5905&dsMessageId=2679536

To unsubscribe from this discussion, e-mail: [[email protected]].
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.