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