Author: mvw
Date: 2007-08-31 10:13:14-0700
New Revision: 13473
Removed:
trunk/src_new/org/argouml/uml/ui/foundation/extension_mechanisms/StereotypeBCSelectionPanel.java
Modified:
trunk/src_new/org/argouml/i18n/button.properties
trunk/src_new/org/argouml/i18n/dialog.properties
trunk/src_new/org/argouml/uml/ui/UMLListCellRenderer2.java
trunk/src_new/org/argouml/uml/ui/UMLMutableLinkedList.java
trunk/src_new/org/argouml/uml/ui/foundation/extension_mechanisms/PropPanelStereotype.java
Log:
Fix for issue 3849: Support multiple BaseClasses for Stereotypes.
Modified: trunk/src_new/org/argouml/i18n/button.properties
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/i18n/button.properties?view=diff&rev=13473&p1=trunk/src_new/org/argouml/i18n/button.properties&p2=trunk/src_new/org/argouml/i18n/button.properties&r1=13472&r2=13473
==============================================================================
--- trunk/src_new/org/argouml/i18n/button.properties (original)
+++ trunk/src_new/org/argouml/i18n/button.properties 2007-08-31 10:13:14-0700
@@ -25,7 +25,6 @@
# Keys in alphabetical order.
#
button.add = Add
-button.add-base-class = Add BaseClass
button.add-rule = Add Rule
button.add-stereo = Add Stereotype
button.add-element-import = Import Elements
@@ -174,7 +173,6 @@
button.reason-given-below = Reason given below
button.reason-given-below.mnemonic = R
button.remove = Remove
-button.remove-base-class = Remove BaseClass
button.remove-rule = Remove Rule
button.remove-stereo = Remove Stereotype
button.remove.mnemonic = R
Modified: trunk/src_new/org/argouml/i18n/dialog.properties
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/i18n/dialog.properties?view=diff&rev=13473&p1=trunk/src_new/org/argouml/i18n/dialog.properties&p2=trunk/src_new/org/argouml/i18n/dialog.properties&r1=13472&r2=13473
==============================================================================
--- trunk/src_new/org/argouml/i18n/dialog.properties (original)
+++ trunk/src_new/org/argouml/i18n/dialog.properties 2007-08-31 10:13:14-0700
@@ -128,6 +128,7 @@
dialog.tabresults.related-items = Related Elements:
dialog.tabresults.results-items = Results: {0} items
dialog.title.add-associated-usecases = Add/Remove Associated UseCases
+dialog.title.add-baseclasses = Add/Remove BaseClasses
dialog.title.add-bases = Add/Remove Bases
dialog.title.add-client-dependency = Add/Remove Client Dependencies
dialog.title.add-contents = Add/Remove Contents
Modified: trunk/src_new/org/argouml/uml/ui/UMLListCellRenderer2.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/uml/ui/UMLListCellRenderer2.java?view=diff&rev=13473&p1=trunk/src_new/org/argouml/uml/ui/UMLListCellRenderer2.java&p2=trunk/src_new/org/argouml/uml/ui/UMLListCellRenderer2.java&r1=13472&r2=13473
==============================================================================
--- trunk/src_new/org/argouml/uml/ui/UMLListCellRenderer2.java (original)
+++ trunk/src_new/org/argouml/uml/ui/UMLListCellRenderer2.java 2007-08-31 10:13:14-0700
@@ -132,8 +132,8 @@
}
} else if (value instanceof String) {
- JLabel label = new JLabel(value.toString());
- return label;
+ return super.getListCellRendererComponent(list, value, index,
+ isSelected, cellHasFocus);
} else if (value == null || value.equals("")) {
JLabel label = new JLabel(" ");
label.setIcon(null);
Modified: trunk/src_new/org/argouml/uml/ui/UMLMutableLinkedList.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/uml/ui/UMLMutableLinkedList.java?view=diff&rev=13473&p1=trunk/src_new/org/argouml/uml/ui/UMLMutableLinkedList.java&p2=trunk/src_new/org/argouml/uml/ui/UMLMutableLinkedList.java&r1=13472&r2=13473
==============================================================================
--- trunk/src_new/org/argouml/uml/ui/UMLMutableLinkedList.java (original)
+++ trunk/src_new/org/argouml/uml/ui/UMLMutableLinkedList.java 2007-08-31 10:13:14-0700
@@ -306,14 +306,13 @@
}
/**
- * Returns the popupMenu.
+ * Returns a new popupMenu, initialised
+ * with the current target and selected item.
*
* @return JPopupMenu
*/
public JPopupMenu getPopupMenu() {
- if (popupMenu == null) {
- popupMenu = new PopupMenu();
- }
+ popupMenu = new PopupMenu();
return popupMenu;
}
Modified: trunk/src_new/org/argouml/uml/ui/foundation/extension_mechanisms/PropPanelStereotype.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/uml/ui/foundation/extension_mechanisms/PropPanelStereotype.java?view=diff&rev=13473&p1=trunk/src_new/org/argouml/uml/ui/foundation/extension_mechanisms/PropPanelStereotype.java&p2=trunk/src_new/org/argouml/uml/ui/foundation/extension_mechanisms/PropPanelStereotype.java&r1=13472&r2=13473
==============================================================================
--- trunk/src_new/org/argouml/uml/ui/foundation/extension_mechanisms/PropPanelStereotype.java (original)
+++ trunk/src_new/org/argouml/uml/ui/foundation/extension_mechanisms/PropPanelStereotype.java 2007-08-31 10:13:14-0700
@@ -1,5 +1,5 @@
// $Id$
-// Copyright (c) 1996-2006 The Regents of the University of California. All
+// Copyright (c) 1996-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
@@ -24,15 +24,28 @@
package org.argouml.uml.ui.foundation.extension_mechanisms;
-import javax.swing.JComboBox;
+import java.awt.event.ActionEvent;
+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.Vector;
+
+import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import org.argouml.i18n.Translator;
+import org.argouml.model.Model;
+import org.argouml.uml.ui.AbstractActionAddModelElement;
+import org.argouml.uml.ui.AbstractActionRemoveElement;
import org.argouml.uml.ui.ActionNavigateNamespace;
-import org.argouml.uml.ui.UMLComboBox2;
import org.argouml.uml.ui.UMLLinkedList;
+import org.argouml.uml.ui.UMLModelElementListModel2;
+import org.argouml.uml.ui.UMLMutableLinkedList;
import org.argouml.uml.ui.foundation.core.PropPanelModelElement;
import org.argouml.uml.ui.foundation.core.UMLGeneralizableElementAbstractCheckBox;
import org.argouml.uml.ui.foundation.core.UMLGeneralizableElementGeneralizationListModel;
@@ -40,6 +53,7 @@
import org.argouml.uml.ui.foundation.core.UMLGeneralizableElementRootCheckBox;
import org.argouml.uml.ui.foundation.core.UMLGeneralizableElementSpecializationListModel;
import org.argouml.util.ConfigLoader;
+import org.tigris.gef.undo.UndoManager;
/**
* The properties panel for a Stereotype.
@@ -51,6 +65,8 @@
*/
private static final long serialVersionUID = 8038077991746618130L;
+ private List<String> metaClasses;
+
private static UMLGeneralizableElementSpecializationListModel
specializationListModel =
new UMLGeneralizableElementSpecializationListModel();
@@ -84,11 +100,6 @@
addField(Translator.localize("label.name"), getNameTextField());
-
-// JComboBox baseClass = new UMLComboBox2(new UMLMetaClassComboBoxModel(),
-// ActionSetMetaClass.SINGLETON, false);
-// addField(Translator.localize("label.base-class"), baseClass);
-
addField(Translator.localize("label.namespace"),
getNamespaceSelector());
@@ -115,8 +126,15 @@
addSeparator();
- addField(Translator.localize("label.base-class"),
- new StereotypeBCSelectionPanel());
+ initMetaClasses();
+ UMLMutableLinkedList umll = new UMLMutableLinkedList(
+ new UMLStereotypeBaseClassListModel(),
+ new ActionAddStereotypeBaseClass(),
+ null);
+ umll.setDeleteAction(new ActionDeleteStereotypeBaseClass());
+ umll.setCellRenderer(new DefaultListCellRenderer());
+ addField(Translator.localize("label.base-class"),
+ new JScrollPane(umll));
addField(Translator.localize("label.extended-elements"),
getExtendedElementsScroll());
@@ -173,4 +191,138 @@
}
return extendedElementsScroll;
}
+
+ /**
+ * Initialise 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.
+ */
+ void initMetaClasses() {
+ Collection<String> tmpMetaClasses =
+ Model.getCoreHelper().getAllMetatypeNames();
+ 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);
+ }
+ }
+
+ /**
+ * The list model for the BaseClasses of the stereotype.
+ *
+ * @author Michiel
+ */
+ class UMLStereotypeBaseClassListModel extends UMLModelElementListModel2 {
+
+ /**
+ * Construct the model, listen to changes of "baseClass".
+ */
+ UMLStereotypeBaseClassListModel() {
+ super("baseClass");
+ }
+
+ @Override
+ protected void buildModelList() {
+ removeAllElements();
+ if (Model.getFacade().isAStereotype(getTarget())) {
+ // keep them sorted
+ LinkedList<String> lst = new LinkedList<String>(
+ Model.getFacade().getBaseClasses(getTarget()));
+ Collections.sort(lst);
+ addAll(lst);
+ }
+ }
+
+ @Override
+ protected boolean isValidElement(Object element) {
+ if (Model.getFacade().isAStereotype(element)) {
+ return true;
+ }
+ return false;
+ }
+ }
+
+ /**
+ * The Action to add a baseclass to the stereotype.
+ *
+ * @author Michiel
+ */
+ class ActionAddStereotypeBaseClass extends AbstractActionAddModelElement {
+
+ @Override
+ protected Vector getChoices() {
+ return new Vector<String>(metaClasses);
+ }
+
+ @Override
+ protected String getDialogTitle() {
+ return Translator.localize("dialog.title.add-baseclasses");
+ }
+
+ @Override
+ protected Vector getSelected() {
+ Vector vec = new Vector();
+ if (Model.getFacade().isAStereotype(getTarget())) {
+ Collection bases =
+ Model.getFacade().getBaseClasses(getTarget());
+ vec.addAll(bases);
+ }
+ return vec;
+ }
+
+ @Override
+ protected void doIt(Vector selected) {
+ Object stereo = getTarget();
+ Set<Object> oldSet = new HashSet<Object>(getSelected());
+ Set toBeRemoved = new HashSet<Object>(oldSet);
+
+ 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);
+ }
+ }
+
+ }
+
+ /**
+ * The Action to remove a baseclass from a stereotype.
+ *
+ * @author Michiel
+ */
+ class ActionDeleteStereotypeBaseClass extends AbstractActionRemoveElement {
+
+ public ActionDeleteStereotypeBaseClass() {
+ super(Translator.localize("menu.popup.remove"));
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ UndoManager.getInstance().startChain();
+ Object baseclass = getObjectToRemove();
+ if (baseclass != null) {
+ Object st = getTarget();
+ if (Model.getFacade().isAStereotype(st)) {
+ Model.getExtensionMechanismsHelper()
+ .removeBaseClass(st, baseclass);
+ }
+ }
+ }
+ }
} /* end class PropPanelStereotype */
\ No newline at end of file
Removed: trunk/src_new/org/argouml/uml/ui/foundation/extension_mechanisms/StereotypeBCSelectionPanel.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/uml/ui/foundation/extension_mechanisms/StereotypeBCSelectionPanel.java?view=auto&rev=13472
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.