Author: bobtarling
Date: 2010-04-27 07:35:02-0700
New Revision: 18338
Modified:
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/SimpleListModel.java
Log:
Issue 5777: Present toolbuttons instead of popup for baseClass in stereotype
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=18338&r1=18337&r2=18338
==============================================================================
--- 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-04-27 07:35:02-0700
@@ -17,7 +17,10 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
+import java.util.Set;
import java.util.StringTokenizer;
import javax.swing.Icon;
@@ -102,6 +105,7 @@
addGetterSetter("subvertex", new SubvertexGetterSetter());
addGetterSetter("internalTransition", new InternalTransitionGetterSetter());
addGetterSetter("classifier", new ClassifierGetterSetter());
+ addGetterSetter("baseClass", new BaseClassGetterSetter());
// UML2 only
addGetterSetter("ownedOperation", new FeatureGetterSetter());
@@ -1802,76 +1806,212 @@
}
public Command getAddCommand(Object modelElement) {
- return new AddCommand(modelElement);
- }
-
- public Command getRemoveCommand(Object modelElement, Object objectToRemove) {
- return new RemoveCommand(modelElement, objectToRemove);
- }
+ return new AddCommand(modelElement);
+ }
- private class AddCommand extends AddModelElementCommand {
-
- /**
- * Constructor for ActionAddPackageImport.
- */
- public AddCommand(Object target) {
- super(target);
+ public Command getRemoveCommand(Object modelElement, Object objectToRemove) {
+ return new RemoveCommand(modelElement, objectToRemove);
}
+
+ private class AddCommand extends AddModelElementCommand {
- protected List getChoices() {
- List list = new ArrayList();
-
- // Get all classifiers in our model
- // TODO: We need the property panels to have some reference to the
- // project they belong to instead of using deprecated functionality
- Project p = ProjectManager.getManager().getCurrentProject();
- Object model = p.getRoot();
- list.addAll(Model.getModelManagementHelper()
- .getAllModelElementsOfKindWithModel(model, Model.getMetaTypes().getClassifier()));
-
- // Get all classifiers in all top level packages of all profiles
- for (Profile profile : p.getProfileConfiguration().getProfiles()) {
- try {
- for (Object topPackage : profile.getProfilePackages()) {
- list.addAll(Model.getModelManagementHelper()
- .getAllModelElementsOfKindWithModel(topPackage,
- Model.getMetaTypes().getClassifier()));
- }
- } catch (ProfileException e) {
- // TODO: We need to rethrow this as some other exception
- // type but that is too much change for the moment.
- LOG.error("Exception", e);
- }
+ /**
+ * Constructor for ActionAddPackageImport.
+ */
+ public AddCommand(Object target) {
+ super(target);
+ }
+
+ protected List getChoices() {
+ List list = new ArrayList();
+
+ // Get all classifiers in our model
+ // TODO: We need the property panels to have some reference to the
+ // project they belong to instead of using deprecated functionality
+ Project p = ProjectManager.getManager().getCurrentProject();
+ Object model = p.getRoot();
+ list.addAll(Model.getModelManagementHelper()
+ .getAllModelElementsOfKindWithModel(model, Model.getMetaTypes().getClassifier()));
+
+ // Get all classifiers in all top level packages of all profiles
+ for (Profile profile : p.getProfileConfiguration().getProfiles()) {
+ try {
+ for (Object topPackage : profile.getProfilePackages()) {
+ list.addAll(Model.getModelManagementHelper()
+ .getAllModelElementsOfKindWithModel(topPackage,
+ Model.getMetaTypes().getClassifier()));
+ }
+ } catch (ProfileException e) {
+ // TODO: We need to rethrow this as some other exception
+ // type but that is too much change for the moment.
+ LOG.error("Exception", e);
+ }
+ }
+ return list;
+ }
+
+ protected List getSelected() {
+ List list = new ArrayList();
+ list.addAll(Model.getFacade().getClassifiers(getTarget()));
+ return list;
+ }
+
+
+ protected String getDialogTitle() {
+ return Translator.localize("dialog.title.add-specifications");
+ }
+
+
+ @Override
+ protected void doIt(Collection selected) {
+ Model.getCommonBehaviorHelper().setClassifiers(getTarget(), selected);
}
- return list;
}
-
- protected List getSelected() {
- List list = new ArrayList();
- list.addAll(Model.getFacade().getClassifiers(getTarget()));
+
+ private class RemoveCommand
+ extends NonUndoableCommand {
+
+ private final Object target;
+ private final Object objectToRemove;
+
+ /**
+ * Constructor for ActionRemovePackageImport.
+ */
+ public RemoveCommand(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.getCommonBehaviorHelper()
+ .removeClassifier(target, objectToRemove);
+ return null;
+ }
+ }
+ }
+
+ private class BaseClassGetterSetter extends ListGetterSetter implements Addable, Removeable {
+
+ public Collection getOptions(Object modelElement, String type) {
+ LinkedList<String> list = new LinkedList<String>(
+ Model.getFacade().getBaseClasses(modelElement));
+ Collections.sort(list);
return list;
}
+
+ public Object get(Object modelElement, String type) {
+ // not needed
+ return null;
+ }
+
+ 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 Class.class;
+ }
- protected String getDialogTitle() {
- return Translator.localize("dialog.title.add-specifications");
+ public Command getAddCommand(Object modelElement) {
+ return new AddCommand(modelElement);
}
+
+ public Command getRemoveCommand(Object modelElement, Object objectToRemove) {
+ return new RemoveCommand(modelElement, objectToRemove);
+ }
+
+ private class AddCommand extends AddModelElementCommand {
+ final private List<String> metaClasses;
+
+ /**
+ * Constructor for ActionAddPackageImport.
+ */
+ public AddCommand(Object target) {
+ super(target);
+ metaClasses = initMetaClasses();
+ }
+
+ /**
+ * Initialize the meta-classes list. <p>
+ *
+ * All this code is necessary to be independent of
+ * model repository implementation,
+ * i.e. to ensure that we have a
+ * sorted list of strings.
+ */
+ private List<String> initMetaClasses() {
+ Collection<String> tmpMetaClasses =
+ Model.getCoreHelper().getAllMetatypeNames();
+ List<String> metaClasses;
+ if (tmpMetaClasses instanceof List) {
+ metaClasses = (List<String>) tmpMetaClasses;
+ } else {
+ metaClasses = new LinkedList<String>(tmpMetaClasses);
+ }
+ try {
+ Collections.sort(metaClasses);
+ } catch (UnsupportedOperationException e) {
+ // We got passed an unmodifiable List. Copy it and sort the result
+ metaClasses = new LinkedList<String>(tmpMetaClasses);
+ Collections.sort(metaClasses);
+ }
+
+ return metaClasses;
+ }
+
+ protected List getChoices() {
+ return Collections.unmodifiableList(metaClasses);
+ }
+
+ protected List getSelected() {
+ LinkedList<String> list = new LinkedList<String>(
+ Model.getFacade().getBaseClasses(getTarget()));
+ Collections.sort(list);
+ return list;
+ }
+
+
+ protected String getDialogTitle() {
+ return Translator.localize("dialog.title.add-baseclasses");
+ }
+
+
+ @Override
+ protected void doIt(Collection selected) {
+ Object stereo = getTarget();
+ Set<Object> oldSet = new HashSet<Object>(getSelected());
+ Set toBeRemoved = new HashSet<Object>(oldSet);
- @Override
- protected void doIt(Collection selected) {
- Model.getCommonBehaviorHelper().setClassifiers(getTarget(), selected);
+ for (Object o : selected) {
+ if (oldSet.contains(o)) {
+ toBeRemoved.remove(o);
+ } else {
+ Model.getExtensionMechanismsHelper()
+ .addBaseClass(stereo, o);
+ }
+ }
+ for (Object o : toBeRemoved) {
+ Model.getExtensionMechanismsHelper().removeBaseClass(stereo, o);
+ }
+ }
}
- }
- private class RemoveCommand
+ private class RemoveCommand
extends NonUndoableCommand {
- private final Object target;
- private final Object objectToRemove;
+ private final Object target;
+ private final Object objectToRemove;
/**
- * Constructor for ActionRemovePackageImport.
+ * Constructor for RemoveCommand.
*/
public RemoveCommand(final Object target, final Object objectToRemove) {
this.target = target;
@@ -1882,8 +2022,7 @@
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public Object execute() {
- Model.getCommonBehaviorHelper()
- .removeClassifier(target, objectToRemove);
+ Model.getExtensionMechanismsHelper().removeBaseClass(target, objectToRemove);
return null;
}
}
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=18338&r1=18337&r2=18338
==============================================================================
--- 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-04-27 07:35:02-0700
@@ -71,8 +71,6 @@
model = new UMLClassifierRoleAvailableFeaturesListModel(modelElement);
} else if ("base".equals(propName)) {
model = new UMLClassifierRoleBaseListModel(modelElement);
- } else if ("baseClass".equals(propName)) {
- model = new UMLStereotypeBaseClassListModel(modelElement);
} else if ("classifierInState".equals(propName)) {
model = new UMLOFSStateListModel(modelElement);
} else if ("client".equals(propName)) {
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=18338&r1=18337&r2=18338
==============================================================================
--- 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-04-27 07:35:02-0700
@@ -27,6 +27,7 @@
import org.argouml.core.propertypanels.model.GetterSetterManager;
import org.argouml.kernel.Command;
import org.argouml.model.AddAssociationEvent;
+import org.argouml.model.AttributeChangeEvent;
import org.argouml.model.InvalidElementException;
import org.argouml.model.Model;
import org.argouml.model.RemoveAssociationEvent;
@@ -170,6 +171,15 @@
}
};
SwingUtilities.invokeLater(doWorkRunnable);
+ } else if (e.getPropertyName().equals("baseClass")
+ && e.getPropertyName().equals(propertyName)
+ && e instanceof AttributeChangeEvent) {
+ // TODO: We have some quirk that the a baseClass addition or
+ // removal from a steroetype comes back as an AttributeChangeEvent
+ // rather than an AssociationChangeEvent. This needs further
+ // investigation to see if this can be made consistent.
+ removeAllElements();
+ build();
} else {
if (LOG.isDebugEnabled()) {
LOG.debug("We are listening for too much here. An event we don't need " + e);
------------------------------------------------------
http://argouml.tigris.org/ds/viewMessage.do?dsForumId=5905&dsMessageId=2597004
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.