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

Bob Tarling <[email protected]>
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: bobtarling
Date: 2010-03-27 09:22:29-0700
New Revision: 18176

Added:
   trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/AbstractActionAddModelElement.java
Removed:
   trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/UMLClassifierPackageImportsListModel.java
Modified:
   trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/GetterSetterManager.java
   trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/GetterSetterManagerImpl.java
   trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/ListFactory.java
   trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/RowSelector.java
   trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/SimpleListModel.java

Log:
Provide buttons to add/remove element imports from package

Modified: trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/GetterSetterManager.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/GetterSetterManager.java?view=diff&pathrev=18176&r1=18175&r2=18176
==============================================================================
--- trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/GetterSetterManager.java	(original)
+++ trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/GetterSetterManager.java	2010-03-27 09:22:29-0700
@@ -17,6 +17,10 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.swing.Action;
+
+import org.argouml.kernel.Command;
+
 public abstract class GetterSetterManager {
     
     /**
@@ -50,6 +54,15 @@
     
     public abstract boolean isValidElement(String propertyName, String type, Object umlElement);
     
+    public abstract Command getRemoveCommand(String propertyName, Object umlElement, Object objectToRemove);
+    
+    public abstract Command getAddCommand(String propertyName, Object umlElement);
+    
+    /** This forces component to fully rebuild when items are added and removed
+     *  Used for pragmatic purposes but not advised long term we should remove this in time
+     */
+    public abstract boolean isFullBuildOnly(String propertyName);
+    
     public boolean contains(String propertyName) {
         return getterSetterByPropertyName.containsKey(propertyName);
     }
@@ -86,6 +99,15 @@
     protected abstract class ListGetterSetter extends OptionGetterSetter {
         abstract boolean isValidElement(Object modelElement, String type);
         abstract Object getMetaType();
+        Action getAddAction(Object modelElement) {
+        	return null;
+        }
+        Action getRemoveAction(Object modelElement) {
+        	return null;
+        }
+        boolean isFullBuildOnly() {
+        	return false;
+        }
     }
     
 }
\ No newline at end of file

Modified: trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/GetterSetterManagerImpl.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/GetterSetterManagerImpl.java?view=diff&pathrev=18176&r1=18175&r2=18176
==============================================================================
--- trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/GetterSetterManagerImpl.java	(original)
+++ trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/model/GetterSetterManagerImpl.java	2010-03-27 09:22:29-0700
@@ -17,10 +17,18 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 import java.util.StringTokenizer;
 
+import javax.swing.JOptionPane;
+
 import org.apache.log4j.Logger;
+import org.argouml.i18n.Translator;
+import org.argouml.kernel.Command;
+import org.argouml.kernel.NonUndoableCommand;
 import org.argouml.model.Model;
+import org.argouml.uml.ui.UMLAddDialog;
+import org.argouml.util.ArgoFrame;
 
 /**
  * Property getters and setters for UML1.4
@@ -75,6 +83,7 @@
         addGetterSetter("guard", new GuardGetterSetter());
         addGetterSetter("effect", new EffectGetterSetter());
         addGetterSetter("trigger", new TriggerGetterSetter());
+        addGetterSetter("elementImport", new ElementImportGetterSetter());
         
         // UML2 only
         addGetterSetter("ownedOperation", new FeatureGetterSetter());
@@ -129,6 +138,16 @@
         return null;
     }
     
+    public boolean isFullBuildOnly(
+            final String propertyName) {
+        BaseGetterSetter bgs = getterSetterByPropertyName.get(propertyName);
+        if (bgs instanceof ListGetterSetter) {
+            return ((ListGetterSetter) bgs).isFullBuildOnly();
+        }
+        
+        return false;
+    }
+    
     
     public Object create(String propertyName, String language, String body) {
         BaseGetterSetter bgs = getterSetterByPropertyName.get(propertyName);
@@ -160,6 +179,34 @@
         return null;
     }
     
+
+	@Override
+	public Command getAddCommand(String propertyName, Object umlElement) {
+        BaseGetterSetter bgs = getterSetterByPropertyName.get(propertyName);
+        if (bgs instanceof Addable) {
+            return ((Addable) bgs).getAddCommand(umlElement);
+        }
+		return null;
+	}
+
+	@Override
+	public Command getRemoveCommand(String propertyName, Object umlElement, Object objectToRemove) {
+        BaseGetterSetter bgs = getterSetterByPropertyName.get(propertyName);
+        if (bgs instanceof Removeable) {
+            return ((Removeable) bgs).getRemoveCommand(umlElement, objectToRemove);
+        }
+		return null;
+	}
+	
+	private interface Addable {
+		Command getAddCommand(Object umlElement);
+	}
+    
+	private interface Removeable {
+		Command getRemoveCommand(Object umlElement, Object objectToRemove);
+	}
+    
+    
     /**
      * The getter/setter for the Absrtact property
      * @author Bob Tarling
@@ -619,7 +666,7 @@
             // not needed
         }
 
-        protected boolean isValidElement(
+        public boolean isValidElement(
                 final Object element,
                 final String type) {
             return getOptions(element, type).contains(element);
@@ -657,7 +704,7 @@
             // not needed
         }
 
-        protected boolean isValidElement(
+        public boolean isValidElement(
                 final Object element,
                 final String type) {
             return getOptions(element, type).contains(element);
@@ -693,7 +740,7 @@
             // not needed
         }
 
-        protected boolean isValidElement(
+        public boolean isValidElement(
                 final Object element,
                 final String type) {
             return getOptions(element, type).contains(element);
@@ -728,7 +775,7 @@
             // not needed
         }
 
-        protected boolean isValidElement(
+        public boolean isValidElement(
                 final Object element,
                 final String type) {
             return getOptions(element, type).contains(element);
@@ -764,7 +811,7 @@
             // not needed
         }
 
-        protected boolean isValidElement(
+        public boolean isValidElement(
                 final Object element,
                 final String type) {
             return getOptions(element, type).contains(element);
@@ -800,7 +847,7 @@
             // not needed
         }
 
-        protected boolean isValidElement(
+        public boolean isValidElement(
                 final Object element,
                 final String type) {
             return getOptions(element, type).contains(element);
@@ -836,7 +883,7 @@
             // not needed
         }
 
-        protected boolean isValidElement(
+        public boolean isValidElement(
                 final Object element,
                 final String type) {
             return getOptions(element, type).contains(element);
@@ -873,7 +920,7 @@
             // not needed
         }
 
-        protected boolean isValidElement(
+        public boolean isValidElement(
                 final Object element,
                 final String type) {
             return getOptions(element, type).contains(element);
@@ -910,7 +957,7 @@
             // not needed
         }
 
-        protected boolean isValidElement(
+        public boolean isValidElement(
                 final Object element,
                 final String type) {
             return getOptions(element, type).contains(element);
@@ -947,7 +994,7 @@
             // not needed
         }
 
-        protected boolean isValidElement(
+        public boolean isValidElement(
                 final Object element,
                 final String type) {
             return getOptions(element, type).contains(element);
@@ -973,7 +1020,7 @@
             // not needed
         }
 
-        protected boolean isValidElement(Object element, String type) {
+        public boolean isValidElement(Object element, String type) {
             return getOptions(element, type).contains(element);
         }
         
@@ -982,6 +1029,219 @@
         }
     }
     
+    private class ElementImportGetterSetter extends ListGetterSetter implements Addable, Removeable {
+        
+        public Collection getOptions(Object modelElement, String type) {
+            return Model.getFacade().getImportedElements(modelElement);
+        }
+      
+        public Object get(Object modelElement, String type) {
+            // not needed
+            return null;
+        }
+        
+        public boolean isFullBuildOnly() {
+        	return true;
+        }
+      
+        public void set(Object element, Object x) {
+            // not needed
+        }
+
+        public boolean isValidElement(Object element, String type) {
+            return getOptions(element, type).contains(element);
+        }
+        
+        public Object getMetaType() {
+            return Model.getMetaTypes().getModelElement();
+        }
+        
+        public Command getAddCommand(Object modelElement) {
+        	return new AddElementImportCommand(modelElement);
+        }
+        
+        public Command getRemoveCommand(Object modelElement, Object objectToRemove) {
+        	return new RemoveElementImportCommand(modelElement, objectToRemove);
+        }
+        
+        private class AddElementImportCommand extends AddModelElementCommand {
+
+        	final Object target;
+        	
+            /**
+             * Constructor for ActionAddPackageImport.
+             */
+            public AddElementImportCommand(Object target) {
+                super();
+                this.target = target;
+            }
+
+
+            protected List getChoices() {
+                List list = new ArrayList();
+                /* TODO: correctly implement next function 
+                 * in the model subsystem for 
+                 * issue 1942: */
+                list.addAll(Model.getModelManagementHelper()
+                        .getAllPossibleImports(target));
+                return list;
+            }
+
+
+            protected List getSelected() {
+                List list = new ArrayList();
+                list.addAll(Model.getFacade().getImportedElements(target));
+                return list;
+            }
+
+
+            protected String getDialogTitle() {
+                return Translator.localize("dialog.title.add-imported-elements");
+            }
+
+
+            @Override
+            protected void doIt(Collection selected) {
+            	if (LOG.isInfoEnabled()) {
+                	LOG.info("Setting " + selected.size() + "imported elements");
+            	}
+                Model.getModelManagementHelper().setImportedElements(target, selected);
+            }
+        }
+        
+        private class RemoveElementImportCommand
+    	    extends NonUndoableCommand {
+        	
+        	private final Object target;
+        	private final Object objectToRemove;
+        	
+    	    /**
+    	     * Constructor for ActionRemovePackageImport.
+    	     */
+    	    public RemoveElementImportCommand(final Object target, final Object objectToRemove) {
+    	        this.target = target;
+    	        this.objectToRemove = objectToRemove;
+    	    }
+    	    
+    	    /*
+    	     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+    	     */
+    	    public Object execute() {
+    	        Model.getModelManagementHelper()
+    	            .removeImportedElement(target, objectToRemove);
+    	        return null;
+    	    }
+    	}
+        
+        public abstract class AddModelElementCommand extends NonUndoableCommand {
+
+            private Object target;
+            private boolean multiSelect = true;
+            private boolean exclusive = true;
+
+            /**
+             * Construct a command to add a model element to some list.
+             */
+            protected AddModelElementCommand() {
+            }
+
+            /*
+             * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+             */
+            public Object execute() {
+                UMLAddDialog dialog =
+                    new UMLAddDialog(getChoices(), getSelected(), getDialogTitle(),
+                                     isMultiSelect(),
+                                     isExclusive());
+                int result = dialog.showDialog(ArgoFrame.getFrame());
+                if (result == JOptionPane.OK_OPTION) {
+                    doIt(dialog.getSelected());
+                }
+                return null;
+            }
+            
+            /**
+             * Returns the choices the user has in the UMLAddDialog. The choices are
+             * depicted on the left side of the UMLAddDialog (sorry Arabic users) and
+             * can be moved via the buttons on the dialog to the right side. On the
+             * right side are the selected modelelements.
+             * @return List of choices
+             */
+            protected abstract List getChoices();
+
+            
+            /**
+             * The modelelements already selected BEFORE the dialog is shown.
+             * @return List of model elements
+             */
+            protected abstract List getSelected();
+
+            /**
+             * The action that has to be done by ArgoUml after the user clicks ok in the
+             * UMLAddDialog.
+             * @param selected The choices the user has selected in the UMLAddDialog
+             */
+            protected abstract void doIt(Collection selected);
+
+            /**
+             * Returns the UML model target.
+             * @return UML ModelElement
+             */
+            protected Object getTarget() {
+                return target;
+            }
+
+            /**
+             * Sets the UML model target.
+             * @param theTarget The target to set
+             */
+            public void setTarget(Object theTarget) {
+                target = theTarget;
+            }
+
+            /**
+             * Returns the title of the dialog.
+             * @return String
+             */
+            protected abstract String getDialogTitle();
+
+            /**
+             * Returns the exclusive.
+             * @return boolean
+             */
+            public boolean isExclusive() {
+                return exclusive;
+            }
+
+            /**
+             * Returns the multiSelect.
+             * @return boolean
+             */
+            public boolean isMultiSelect() {
+                return multiSelect;
+            }
+
+            /**
+             * Sets the exclusive.
+             * @param theExclusive The exclusive to set
+             */
+            public void setExclusive(boolean theExclusive) {
+                exclusive = theExclusive;
+            }
+
+            /**
+             * Sets the multiSelect.
+             * @param theMultiSelect The multiSelect to set
+             */
+            public void setMultiSelect(boolean theMultiSelect) {
+                multiSelect = theMultiSelect;
+            }
+
+        }
+        
+        
+    }
+    
     
     private class MethodExpressionGetterSetter extends ExpressionGetterSetter {
         
@@ -996,7 +1256,7 @@
         }
 
         @Override
-        Object create(final String language, final String body) {
+        public Object create(final String language, final String body) {
             return Model.getDataTypesFactory().createProcedureExpression(language, body);
         }
     }
@@ -1016,7 +1276,7 @@
             // not needed
         }
 
-        protected boolean isValidElement(Object element, String type) {
+        public boolean isValidElement(Object element, String type) {
           
             return getOptions(element, type).contains(element);
         }
@@ -1041,7 +1301,7 @@
             // not needed
         }
 
-        protected boolean isValidElement(Object element, String type) {
+        public boolean isValidElement(Object element, String type) {
           
             return getOptions(element, type).contains(element);
         }

Added: trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/AbstractActionAddModelElement.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/AbstractActionAddModelElement.java?view=markup&pathrev=18176
==============================================================================
--- (empty file)
+++ trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/AbstractActionAddModelElement.java	2010-03-27 09:22:29-0700
@@ -0,0 +1,200 @@
+/* $Id: AbstractActionAddModelElement2.java 17881 2010-01-12 21:09:28Z linus $
+ *****************************************************************************
+ * Copyright (c) 2009 Contributors - see below
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    bobtarling
+ *****************************************************************************
+ *
+ * Some portions of this file was previously release using the BSD License:
+ */
+
+// Copyright (c) 2007 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
+// and this paragraph appear in all copies. This software program and
+// documentation are copyrighted by The Regents of the University of
+// California. The software program and documentation are supplied "AS
+// IS", without any accompanying services from The Regents. The Regents
+// does not warrant that the operation of the program will be
+// uninterrupted or error-free. The end-user understands that the program
+// was developed for research purposes and is advised not to rely
+// exclusively on the program for any reason. IN NO EVENT SHALL THE
+// UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
+// SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
+// ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
+// THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
+// PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
+// CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
+// UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+
+package org.argouml.core.propertypanels.ui;
+
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+import java.util.List;
+
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.JOptionPane;
+
+import org.argouml.i18n.Translator;
+import org.argouml.kernel.UmlModelMutator;
+import org.argouml.util.ArgoFrame;
+import org.argouml.ui.UndoableAction;
+import org.argouml.uml.ui.UMLAddDialog;
+
+/**
+ * Abstract action that is the parent to all add actions that add the
+ * modelelements via the UMLAddDialog.
+ * 
+ * @since Oct 2, 2002
+ * @author [email protected]
+ */
+@UmlModelMutator
+public abstract class AbstractActionAddModelElement extends UndoableAction {
+
+    private Object target;
+    private boolean multiSelect = true;
+    private boolean exclusive = true;
+
+    /**
+     * Construct an action to add a model element to some list.
+     */
+    protected AbstractActionAddModelElement() {
+        super(Translator.localize("menu.popup.add-modelelement"), null);
+        // Set the tooltip string:
+        putValue(Action.SHORT_DESCRIPTION, 
+                Translator.localize("menu.popup.add-modelelement"));
+    }
+
+    /**
+     * Construct a named action to add a model element to some list.
+     * @param name name for action
+     */
+    public AbstractActionAddModelElement(String name) {
+        super(name);
+    }
+
+    /**
+     * Construct an action to add a model element to some list with the
+     * given name and icon.
+     * @param name name for action
+     * @param icon icon for action
+     */
+    public AbstractActionAddModelElement(String name, Icon icon) {
+        super(name, icon);
+    }
+    
+
+    /*
+     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+     */
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        super.actionPerformed(e);
+        UMLAddDialog dialog =
+            new UMLAddDialog(getChoices(), getSelected(), getDialogTitle(),
+                             isMultiSelect(),
+                             isExclusive());
+        int result = dialog.showDialog(ArgoFrame.getFrame());
+        if (result == JOptionPane.OK_OPTION) {
+            doIt(dialog.getSelected());
+        }
+    }
+    
+    /**
+     * Returns the choices the user has in the UMLAddDialog. The choices are
+     * depicted on the left side of the UMLAddDialog (sorry Arabic users) and
+     * can be moved via the buttons on the dialog to the right side. On the
+     * right side are the selected modelelements.
+     * @return List of choices
+     */
+    protected abstract List getChoices();
+
+    
+    /**
+     * The modelelements already selected BEFORE the dialog is shown.
+     * @return List of model elements
+     */
+    protected abstract List getSelected();
+
+    /**
+     * The action that has to be done by ArgoUml after the user clicks ok in the
+     * UMLAddDialog.
+     * @param selected The choices the user has selected in the UMLAddDialog
+     */
+    protected abstract void doIt(Collection selected);
+
+    /*
+     * @see javax.swing.Action#isEnabled()
+     */
+    @Override
+    public boolean isEnabled() {
+        return !getChoices().isEmpty();
+    }
+    
+    
+    /**
+     * Returns the UML model target.
+     * @return UML ModelElement
+     */
+    protected Object getTarget() {
+        return target;
+    }
+
+    /**
+     * Sets the UML model target.
+     * @param theTarget The target to set
+     */
+    public void setTarget(Object theTarget) {
+        target = theTarget;
+    }
+
+    /**
+     * Returns the title of the dialog.
+     * @return String
+     */
+    protected abstract String getDialogTitle();
+
+    /**
+     * Returns the exclusive.
+     * @return boolean
+     */
+    public boolean isExclusive() {
+        return exclusive;
+    }
+
+    /**
+     * Returns the multiSelect.
+     * @return boolean
+     */
+    public boolean isMultiSelect() {
+        return multiSelect;
+    }
+
+    /**
+     * Sets the exclusive.
+     * @param theExclusive The exclusive to set
+     */
+    public void setExclusive(boolean theExclusive) {
+        exclusive = theExclusive;
+    }
+
+    /**
+     * Sets the multiSelect.
+     * @param theMultiSelect The multiSelect to set
+     */
+    public void setMultiSelect(boolean theMultiSelect) {
+        multiSelect = theMultiSelect;
+    }
+
+}

Modified: trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/ListFactory.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/ListFactory.java?view=diff&pathrev=18176&r1=18175&r2=18176
==============================================================================
--- trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/ListFactory.java	(original)
+++ trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/ListFactory.java	2010-03-27 09:22:29-0700
@@ -105,8 +105,6 @@
             model = new UMLStateDoActivityListModel(modelElement);
             JList l = new UMLStateDoActivityList((UMLModelElementListModel) model);
             list = new OldScrollList(l);
-        } else if ("elementImport".equals(propName)) {
-            model = new UMLClassifierPackageImportsListModel(modelElement);
         } else if ("entry".equals(propName)) {
             model = new UMLStateEntryListModel(modelElement);
             JList l = new UMLStateEntryList((UMLModelElementListModel) model);

Modified: trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/RowSelector.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/RowSelector.java?view=diff&pathrev=18176&r1=18175&r2=18176
==============================================================================
--- trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/RowSelector.java	(original)
+++ trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/RowSelector.java	2010-03-27 09:22:29-0700
@@ -73,6 +73,7 @@
 import org.apache.log4j.Logger;
 import org.argouml.application.helpers.ResourceLoaderWrapper;
 import org.argouml.i18n.Translator;
+import org.argouml.kernel.Command;
 import org.argouml.kernel.Project;
 import org.argouml.kernel.ProjectManager;
 import org.argouml.model.Model;
@@ -84,7 +85,6 @@
 import org.tigris.toolbar.ToolBar;
 import org.tigris.toolbar.ToolBarFactory;
 import org.tigris.toolbar.toolbutton.PopupToolBoxButton;
-import org.tigris.toolbar.toolbutton.ToolButton;
 
 /**
  * A control for displaying the contents of a list model elements in a panel
@@ -95,7 +95,7 @@
  * @since 0.29.2
  */
 class RowSelector extends JPanel
-        implements MouseListener, ListDataListener {
+        implements MouseListener, ListDataListener, ListSelectionListener {
 
     /**
      * The logger
@@ -200,7 +200,12 @@
      * The delete action that we must enable/disable
      */
     private final DeleteAction deleteAction;
-
+    
+    /**
+     * The remove action that we must enable/disable
+     */
+    private final Action removeAction;
+    
     /**
      * The delete action that we must enable/disable
      */
@@ -241,6 +246,7 @@
         this.expandable = expandable;
         Object metaType = null;
         List metaTypes = null;
+        final Action addAction;
 
         if (model instanceof UMLModelElementListModel) {
             // Temporary until SimpleListModel is used for all
@@ -289,6 +295,16 @@
 
         jscroll.setHorizontalScrollBarPolicy(
                 JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+        
+        if (model instanceof SimpleListModel
+        		&& ((SimpleListModel) model).getAddCommand() != null) {
+	        removeAction = new RemoveAction(scroll.getList(), ((SimpleListModel) model));
+	        addAction = new AddAction(((SimpleListModel) model).getAddCommand());
+        } else {
+        	removeAction = null;
+        	addAction = null;
+        }
+        
 
         if (!expandable && !expanded) {
             jscroll.setVerticalScrollBarPolicy(
@@ -344,8 +360,16 @@
                         actions.add(createAction);
                     }
                 }
-                deleteAction = new DeleteAction();
-                actions.add(deleteAction);
+                if (addAction != null) {
+                    actions.add(addAction);
+                }
+                if (removeAction != null) {
+                    actions.add(removeAction);
+                    deleteAction = null;
+                } else {
+                    deleteAction = new DeleteAction();
+                    actions.add(deleteAction);
+                }
 
                 if (Model.getUmlHelper().isMovable(metaType)) {
                     moveUpAction = new MoveUpAction();
@@ -385,6 +409,7 @@
             this.addMouseListener(this);
             setIcon();
             buttonPanel.add(expander);
+            // TODO: In think this will always be true
             if (toolbar != null) {
                 toolbar.setVisible(false);
                 buttonPanel.add(toolbar);
@@ -392,7 +417,12 @@
             add(buttonPanel, BorderLayout.WEST);
 
             if (!Model.getModelManagementHelper().isReadOnly(target)) {
-                getList().addListSelectionListener(deleteAction);
+            	if (deleteAction != null) {
+                    getList().addListSelectionListener(deleteAction);
+            	}
+            	if (removeAction != null) {
+                    getList().addListSelectionListener(this);
+            	}
                 // TODO: We should really test the model instead for this
                 // but we have no API yet.
                 // Can we just check if the collection to build the JList
@@ -500,6 +530,7 @@
     public void removeNotify() {
         LOG.info("The RowSelector is being removed from a panel");
     	if (!readonly) {
+            getList().removeListSelectionListener(this);
 	        getList().removeListSelectionListener(deleteAction);
 	        if (moveUpAction != null) {
 	            getList().removeListSelectionListener(moveUpAction);
@@ -581,6 +612,14 @@
 
     public void intervalRemoved(ListDataEvent e) {
     }
+    
+
+	public void valueChanged(ListSelectionEvent e) {
+		if (removeAction != null) {
+	        removeAction.setEnabled(getList().getSelectedIndex() > -1);
+		}
+	}
+    
 
     /**
      * This action deletes the model elements that are selected in the JList
@@ -829,4 +868,44 @@
             this.element = element;
         }
     }
+    
+    private static class AddAction extends UndoableAction {
+
+    	private Command command;
+    	
+    	public AddAction(Command command) {
+    		super("", ResourceLoaderWrapper.lookupIcon("Add"));
+    		this.command = command;
+    	}
+    	
+		@Override
+		public void actionPerformed(ActionEvent e) {
+			super.actionPerformed(e);
+			command.execute();
+		}
+    }
+    
+    private static class RemoveAction extends UndoableAction {
+
+    	private final SimpleListModel simpleListModel;
+    	private final JList list;
+    	
+    	public RemoveAction(JList list, SimpleListModel model) {
+    		super("", ResourceLoaderWrapper.lookupIcon("Remove"));
+    		this.simpleListModel = model;
+    		this.list = list;
+    	}
+    	
+		@Override
+		public void actionPerformed(ActionEvent e) {
+			super.actionPerformed(e);
+			final Object objectToRemove = list.getSelectedValue();
+			if (objectToRemove!= null) {
+				Command command = simpleListModel.getRemoveCommand(objectToRemove);
+				command.execute();
+			} else {
+				LOG.warn("No selcted object was found in the list control - we shouldn't be able to get here");
+			}
+		}
+    }
 }

Modified: trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/SimpleListModel.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/SimpleListModel.java?view=diff&pathrev=18176&r1=18175&r2=18176
==============================================================================
--- trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/SimpleListModel.java	(original)
+++ trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/SimpleListModel.java	2010-03-27 09:22:29-0700
@@ -25,6 +25,7 @@
 
 import org.apache.log4j.Logger;
 import org.argouml.core.propertypanels.model.GetterSetterManager;
+import org.argouml.kernel.Command;
 import org.argouml.model.AddAssociationEvent;
 import org.argouml.model.InvalidElementException;
 import org.argouml.model.Model;
@@ -104,45 +105,66 @@
         return metaTypes;
     }
     
+    public Command getRemoveCommand(Object objectToRemove) {
+    	return getterSetterManager.getRemoveCommand(propertyName, umlElement, objectToRemove);
+    }
+    
+    public Command getAddCommand() {
+    	return getterSetterManager.getAddCommand(propertyName, umlElement);
+    }
+    
     /*
      * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
      */
     public void propertyChange(final PropertyChangeEvent e) {
-        Runnable doWorkRunnable = new Runnable() {
-            public void run() {
-                try {
-                    if (e instanceof RemoveAssociationEvent) {
-                        removeElement(
-                                ((RemoveAssociationEvent) e).getChangedValue());
-                    } else if (e instanceof AddAssociationEvent) {
-                        Object newElement = ((AddAssociationEvent) e).getChangedValue();
-                        
-                        if (Model.getUmlHelper().isMovable(getMetaType())) {
-                            final Collection c =
-                                (Collection) getterSetterManager.getOptions( 
-                                    umlElement, 
-                                    propertyName, 
-                                    type);
-                            final int index =
-                                CollectionUtil.indexOf(c, newElement);
-                            if (index < 0 || index > getSize() - 1) {
-                                LOG.warn(
-                                        "Unable to add element at correct position "
-                                        + index + " added to end instead");
-                                addElement(newElement);
-                            } else {
-                                add(index, newElement);
-                            }
-                        } else {
-                            addElement(newElement);
-                        }
-                    }
-                } catch (InvalidElementException e) {
-                    LOG.debug("propertyChange accessed a deleted element ", e);
-                }
-            }  
-        };
-        SwingUtilities.invokeLater(doWorkRunnable);
+        if (e instanceof RemoveAssociationEvent
+        		|| e instanceof AddAssociationEvent) {
+	        Runnable doWorkRunnable = new Runnable() {
+	            public void run() {
+	                try {
+	                	if (getterSetterManager.isFullBuildOnly(propertyName)) {
+		                	removeAllElements();
+		                	build();
+	                	} else {
+		                    if (e instanceof RemoveAssociationEvent) {
+		                    	final Object objectToRemove =
+		                    		((RemoveAssociationEvent) e).getChangedValue();
+		                        removeElement(objectToRemove);
+		                    } else if (e instanceof AddAssociationEvent) {
+		                        Object newElement = ((AddAssociationEvent) e).getChangedValue();
+		                        
+		                        if (Model.getUmlHelper().isMovable(getMetaType())) {
+		                            final Collection c =
+		                                (Collection) getterSetterManager.getOptions( 
+		                                    umlElement, 
+		                                    propertyName, 
+		                                    type);
+		                            final int index =
+		                                CollectionUtil.indexOf(c, newElement);
+		                            if (index < 0 || index > getSize() - 1) {
+		                                LOG.warn(
+		                                        "Unable to add element at correct position "
+		                                        + index + " added to end instead");
+		                                addElement(newElement);
+		                            } else {
+		                                add(index, newElement);
+		                            }
+		                        } else {
+		                            addElement(newElement);
+		                        }
+		                    }
+	                	}
+	                } catch (InvalidElementException e) {
+	                    LOG.debug("propertyChange accessed a deleted element ", e);
+	                }
+	            }  
+	        };
+	        SwingUtilities.invokeLater(doWorkRunnable);
+        } else {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("We are listening for too much here. An event we don't need " + e);
+            }
+        }
     }
 
     /**

Removed: trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/UMLClassifierPackageImportsListModel.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-umlpropertypanels/src/org/argouml/core/propertypanels/ui/UMLClassifierPackageImportsListModel.java?view=markup&pathrev=18175

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

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.