svn commit: r13473 - trunk/src_new/org/argouml: i18n uml/ui uml/ui/foundation/extension_mechanisms

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
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.