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]].