Author: bobtarling
Date: 2011-03-25 08:10:04-0700
New Revision: 19135

Modified:
   trunk/src/argouml-app/src/org/argouml/i18n/action.properties
   
trunk/src/argouml-app/src/org/argouml/profile/internal/ocl/uml14/ModelAccessModelInterpreter.java
   trunk/src/argouml-app/src/org/argouml/uml/GenCompositeClasses2.java
   
trunk/src/argouml-app/src/org/argouml/uml/cognitive/critics/WizAssocComposite.java
   
trunk/src/argouml-app/src/org/argouml/uml/cognitive/critics/WizBreakCircularComp.java
   
trunk/src/argouml-app/src/org/argouml/uml/diagram/static_structure/ui/SelectionClass.java
   trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/ActionAggregation.java
   trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociation.java
   
trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/CoreHelperEUMLImpl.java
   
trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/FacadeEUMLImpl.java
   
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreHelperMDRImpl.java
   trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/FacadeMDRImpl.java
   
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/UndoCoreHelperDecorator.java
   trunk/src/argouml-core-model/src/org/argouml/model/CoreHelper.java
   trunk/src/argouml-core-model/src/org/argouml/model/Facade.java

Log:
3 different set and get aggregation methods
1 always emulates UML 1.4
1 always emulates UML2
The other does behaviour of current implementation


Modified: trunk/src/argouml-app/src/org/argouml/i18n/action.properties
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/i18n/action.properties?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/i18n/action.properties        
(original)
+++ trunk/src/argouml-app/src/org/argouml/i18n/action.properties        
2011-03-25 08:10:04-0700
@@ -55,6 +55,9 @@
 action.adjust-grid.none = Adjust Grid - None
 action.adjust-grid-snap = Adjust Grid Snap
 action.adjust-page-breaks = Adjust Page Breaks
+action.aggregation.composite = {0} is a composite part of {1}
+action.aggregation.aggregate = {0} is an aggregate part of {1}
+action.aggregation.none = No Aggregation
 action.align-bottoms = Align Bottoms
 action.align-horizontal-centers = Align Horizontal Centers
 action.align-lefts = Align Lefts

Modified: 
trunk/src/argouml-app/src/org/argouml/profile/internal/ocl/uml14/ModelAccessModelInterpreter.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/profile/internal/ocl/uml14/ModelAccessModelInterpreter.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- 
trunk/src/argouml-app/src/org/argouml/profile/internal/ocl/uml14/ModelAccessModelInterpreter.java
   (original)
+++ 
trunk/src/argouml-app/src/org/argouml/profile/internal/ocl/uml14/ModelAccessModelInterpreter.java
   2011-03-25 08:10:04-0700
@@ -104,7 +104,7 @@
         if (Model.getFacade().isAAssociationEnd(subject)) {
             if (type.equals(".")) {
                 if (feature.equals("aggregation")) {
-                    return Model.getFacade().getAggregation(subject);
+                    return Model.getFacade().getAggregation1(subject);
                 }
                 if (feature.equals("changeability")) {
                     return Model.getFacade().getChangeability(subject);

Modified: trunk/src/argouml-app/src/org/argouml/uml/GenCompositeClasses2.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/GenCompositeClasses2.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/GenCompositeClasses2.java 
(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/GenCompositeClasses2.java 
2011-03-25 08:10:04-0700
@@ -95,7 +95,7 @@
         while (assocEnds.hasNext()) {
             Object ae = assocEnds.next();
             if (Model.getAggregationKind().getComposite().equals(
-                    Model.getFacade().getAggregation(ae))) {
+                    Model.getFacade().getAggregation1(ae))) {
                 Object asc = Model.getFacade().getAssociation(ae);
                 ArrayList conn =
                     new ArrayList(Model.getFacade().getConnections(asc));

Modified: 
trunk/src/argouml-app/src/org/argouml/uml/cognitive/critics/WizAssocComposite.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/cognitive/critics/WizAssocComposite.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- 
trunk/src/argouml-app/src/org/argouml/uml/cognitive/critics/WizAssocComposite.java
  (original)
+++ 
trunk/src/argouml-app/src/org/argouml/uml/cognitive/critics/WizAssocComposite.java
  2011-03-25 08:10:04-0700
@@ -333,9 +333,9 @@
 
                     // Start is a composite aggregation of end
 
-                    Model.getCoreHelper().setAggregation(ae0,
+                    Model.getCoreHelper().setAggregation1(ae0,
                             Model.getAggregationKind().getComposite());
-                    Model.getCoreHelper().setAggregation(ae1,
+                    Model.getCoreHelper().setAggregation1(ae1,
                             Model.getAggregationKind().getNone());
                     break;
 
@@ -343,9 +343,9 @@
 
                     // Start is a shared aggregation of end
 
-                    Model.getCoreHelper().setAggregation(ae0,
+                    Model.getCoreHelper().setAggregation1(ae0,
                             Model.getAggregationKind().getAggregate());
-                    Model.getCoreHelper().setAggregation(ae1,
+                    Model.getCoreHelper().setAggregation1(ae1,
                             Model.getAggregationKind().getNone());
                     break;
 
@@ -353,27 +353,27 @@
 
                     // End is a composite aggregation of start
 
-                    Model.getCoreHelper().setAggregation(ae0,
+                    Model.getCoreHelper().setAggregation1(ae0,
                             Model.getAggregationKind().getNone());
-                    Model.getCoreHelper().setAggregation(ae1,
+                    Model.getCoreHelper().setAggregation1(ae1,
                             Model.getAggregationKind().getComposite());
                     break;
 
                 case 3:
 
                     // End is a shared aggregation of start
-                    Model.getCoreHelper().setAggregation(ae0,
+                    Model.getCoreHelper().setAggregation1(ae0,
                             Model.getAggregationKind().getNone());
-                    Model.getCoreHelper().setAggregation(ae1,
+                    Model.getCoreHelper().setAggregation1(ae1,
                             Model.getAggregationKind().getAggregate());
                     break;
 
                 case 4:
 
                     // No aggregation
-                    Model.getCoreHelper().setAggregation(ae0,
+                    Model.getCoreHelper().setAggregation1(ae0,
                             Model.getAggregationKind().getNone());
-                    Model.getCoreHelper().setAggregation(ae1,
+                    Model.getCoreHelper().setAggregation1(ae1,
                             Model.getAggregationKind().getNone());
                     break;
 

Modified: 
trunk/src/argouml-app/src/org/argouml/uml/cognitive/critics/WizBreakCircularComp.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/cognitive/critics/WizBreakCircularComp.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- 
trunk/src/argouml-app/src/org/argouml/uml/cognitive/critics/WizBreakCircularComp.java
       (original)
+++ 
trunk/src/argouml-app/src/org/argouml/uml/cognitive/critics/WizBreakCircularComp.java
       2011-03-25 08:10:04-0700
@@ -208,10 +208,10 @@
                Object ae0 = conns.get(0);
                Object ae1 = conns.get(1);
                try {
-                   Model.getCoreHelper().setAggregation(
+                   Model.getCoreHelper().setAggregation1(
                            ae0,
                            Model.getAggregationKind().getNone());
-                   Model.getCoreHelper().setAggregation(
+                   Model.getCoreHelper().setAggregation1(
                            ae1,
                            Model.getAggregationKind().getNone());
                } catch (Exception pve) {

Modified: 
trunk/src/argouml-app/src/org/argouml/uml/diagram/static_structure/ui/SelectionClass.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/static_structure/ui/SelectionClass.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- 
trunk/src/argouml-app/src/org/argouml/uml/diagram/static_structure/ui/SelectionClass.java
   (original)
+++ 
trunk/src/argouml-app/src/org/argouml/uml/diagram/static_structure/ui/SelectionClass.java
   2011-03-25 08:10:04-0700
@@ -183,7 +183,7 @@
             Collection assocEnds = Model.getFacade().getConnections(newEdge);
             Object firstAE = assocEnds.iterator().next();
             Object aggregationKind = Model.getAggregationKind().getComposite();
-            Model.getCoreHelper().setAggregation(firstAE, aggregationKind);
+            Model.getCoreHelper().setAggregation1(firstAE, aggregationKind);
         }
     }
 

Modified: 
trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/ActionAggregation.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/ActionAggregation.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/ActionAggregation.java 
(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/ActionAggregation.java 
2011-03-25 08:10:04-0700
@@ -57,9 +57,19 @@
  *
  */
 public class ActionAggregation extends UndoableAction {
+    
+    public static final int NONE = 0;
+    public static final int AGGREGATE_END1 = 1;
+    public static final int AGGREGATE_END2 = 2;
+    public static final int COMPOSITE_END1 = 3;
+    public static final int COMPOSITE_END2 = 4;
+    
     private String str = "";
     private Object agg = null;
 
+    Object associationEnd1;
+    Object associationEnd2;
+    int aggr;
 
     ////////////////////////////////////////////////////////////////
     // static variables
@@ -88,11 +98,120 @@
 
     ////////////////////////////////////////////////////////////////
     // constructors
+    
+    /**
+     * The <code>ActionNavigability</code> constructor.
+     *
+     * @param assocStart a <code>MAssociationEnd</code> object at the start
+     * of an association.
+     * @param assocEnd a <code>MAssociationEnd</code> object at the end of
+     * an association.
+     * @param nav the type of navigation required in the association
+     * being either <ul> <li>BIDIRECTIONAL <li>STARTTOEND
+     * <li>ENDTOSTART </ul>
+     *
+     * @return the constructed class
+     */
+    public static ActionAggregation newActionAggregation(Object assocStart,
+                                                           Object assocEnd,
+                                                           int aggr) {
+        return new ActionAggregation(getDescription(assocStart, assocEnd, 
aggr),
+                                      assocStart,
+                                      assocEnd,
+                                      aggr);
+    }
 
     /**
      * The constructor.
+     *
+     * @param label   the description as build in <code>getDescription</code>
+     * @param associationEnd1 association end 1
+     * @param associationEnd2   association end 2
+     * @param aggr     the aggregation: one of
+     *                            NONE, AGGREGATE_END1, AGGREGATE_END2,
+     *                            COMPOSITE_END1, COMPOSITE_END  
+     */
+    private ActionAggregation(
+            final String label,
+            final Object associationEnd1,
+            final Object associationEnd2,
+            final int aggr) {
+        super(label, null);
+        // Set the tooltip string:
+        putValue(Action.SHORT_DESCRIPTION, label);
+        this.aggr = aggr;
+        this.associationEnd1 = associationEnd1;
+        this.associationEnd2 = associationEnd2;
+    }
+    
+    /**
+     * Build a description string from the given association ends,
+     * and the navigability.
+     *
+     * @param assocStart association end 1
+     * @param assocEnd   association end 2
+     * @param nav        the navigability
+     * @return           the string containing a human-readible indication
+     *                   of the navigability
+     */
+    private static String getDescription(final Object assocEnd1,
+                                         final Object assocEnd2,
+                                         final int aggr) {
+        String startName =
+            Model.getFacade().getName(Model.getFacade().getType(assocEnd1));
+        String endName =
+            Model.getFacade().getName(Model.getFacade().getType(assocEnd2));
+
+        if (startName == null || startName.length() == 0) {
+            startName = Translator.localize("action.navigation.anon");
+        }
+        if (endName == null || endName.length() == 0) {
+            endName = Translator.localize("action.navigation.anon");
+        }
+        
+        if (aggr == COMPOSITE_END1) {
+            return Translator.messageFormat(
+                    "action.aggregation.composite",
+                    new Object[] {
+                        startName,
+                        endName,
+                    }
+            );
+        } else if (aggr == COMPOSITE_END2) {
+            return Translator.messageFormat(
+                    "action.aggregation.composite",
+                    new Object[] {
+                        endName,
+                        startName,
+                    }
+            );
+        } else if (aggr == AGGREGATE_END1) {
+            return Translator.messageFormat(
+                    "action.aggregation.aggregate",
+                    new Object[] {
+                        startName,
+                        endName,
+                    }
+            );
+        } else if (aggr == AGGREGATE_END2) {
+            return Translator.messageFormat(
+                    "action.aggregation.aggregate",
+                    new Object[] {
+                        endName,
+                        startName,
+                    }
+            );
+        } else {
+            return Translator.localize("action.aggregation.none");
+        }
+    }
+    
+    /**
+     * The constructor.
      * @param a the aggregation kind object
      * @param s "src" or "dest". Anything else is interpreted as "dest".
+     * @deprecated by Bob Tarling in 0.33.1 by Bob Tarling use
+     * ActionAggregation.newActionAggregation
      */
     protected ActionAggregation(Object a, String s) {
         super(Translator.localize(Model.getFacade().getName(a)),
@@ -109,26 +228,51 @@
      */
     @Override
     public void actionPerformed(ActionEvent ae) {
-       super.actionPerformed(ae);
-       List sels = Globals.curEditor().getSelectionManager().selections();
-       if (sels.size() == 1) {
-           Selection sel = (Selection) sels.get(0);
-           Fig f = sel.getContent();
-           Object owner = ((FigEdgeModelElement) f).getOwner();
-           Collection ascEnds = Model.getFacade().getConnections(owner);
+        if (agg != null) {
+            oldActionPerformed(ae);
+        } else {
+            super.actionPerformed(ae);
+            if (aggr == AGGREGATE_END1) {
+                Model.getCoreHelper().setAggregation2(associationEnd1, 
Model.getAggregationKind().getAggregate());
+                Model.getCoreHelper().setAggregation2(associationEnd2, 
Model.getAggregationKind().getNone());
+            } else if (aggr == AGGREGATE_END2) {
+                Model.getCoreHelper().setAggregation2(associationEnd1, 
Model.getAggregationKind().getNone());
+                Model.getCoreHelper().setAggregation2(associationEnd2, 
Model.getAggregationKind().getAggregate());
+            } else if (aggr == COMPOSITE_END1) {
+                Model.getCoreHelper().setAggregation2(associationEnd1, 
Model.getAggregationKind().getComposite());
+                Model.getCoreHelper().setAggregation2(associationEnd2, 
Model.getAggregationKind().getNone());
+            } else if (aggr == COMPOSITE_END2) {
+                Model.getCoreHelper().setAggregation2(associationEnd1, 
Model.getAggregationKind().getNone());
+                Model.getCoreHelper().setAggregation2(associationEnd2, 
Model.getAggregationKind().getComposite());
+            } else {
+                Model.getCoreHelper().setAggregation2(associationEnd1, 
Model.getAggregationKind().getNone());
+                Model.getCoreHelper().setAggregation2(associationEnd2, 
Model.getAggregationKind().getNone());
+            }
+        }
+    }
+
+    public void oldActionPerformed(ActionEvent ae) {
+        super.actionPerformed(ae);
+        List sels = Globals.curEditor().getSelectionManager().selections();
+        if (sels.size() == 1) {
+            Selection sel = (Selection) sels.get(0);
+            Fig f = sel.getContent();
+            Object owner = ((FigEdgeModelElement) f).getOwner();
+            Collection ascEnds = Model.getFacade().getConnections(owner);
             Iterator iter = ascEnds.iterator();
-           Object ascEnd = null;
-           if (str.equals("src")) {
-               ascEnd = iter.next();
+            Object ascEnd = null;
+            if (str.equals("src")) {
+                ascEnd = iter.next();
             } else {
                 while (iter.hasNext()) {
                     ascEnd = iter.next();
                 }
             }
-           Model.getCoreHelper().setAggregation(ascEnd, agg);
-       }
+            Model.getCoreHelper().setAggregation(ascEnd, agg);
+        }
     }
-
+    
+    
     /*
      * @see org.tigris.gef.undo.UndoableAction#isEnabled()
      */

Modified: 
trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociation.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociation.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociation.java    
(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociation.java    
2011-03-25 08:10:04-0700
@@ -419,111 +419,120 @@
     @Override
     public Vector getPopUpActions(MouseEvent me) {
        Vector popUpActions = super.getPopUpActions(me);
-        /* Check if multiple items are selected: */
-        boolean ms = TargetManager.getInstance().getTargets().size() > 1;
-        /* None of the menu-items below apply
-         * when multiple modelelements are selected:*/
-        if (ms) {
+        if (TargetManager.getInstance().getTargets().size() > 1) {
             return popUpActions;
         }
 
-       // x^2 + y^2 = r^2  (equation of a circle)
-       Point firstPoint = this.getFirstPoint();
-       Point lastPoint = this.getLastPoint();
-       int length = getPerimeterLength();
-
-       int rSquared = (int) (.3 * length);
-
-       // max distance is set at 100 pixels, (rSquared = 100^2)
-       if (rSquared > 100) {
-           rSquared = 10000;
-        } else {
-           rSquared *= rSquared;
-        }
-
-       int srcDeterminingFactor =
-           getSquaredDistance(me.getPoint(), firstPoint);
-       int destDeterminingFactor =
-           getSquaredDistance(me.getPoint(), lastPoint);
-
-       if (srcDeterminingFactor < rSquared
-           && srcDeterminingFactor < destDeterminingFactor) {
-
-            ArgoJMenu multMenu =
-               new ArgoJMenu("menu.popup.multiplicity");
-
-            multMenu.add(ActionMultiplicity.getSrcMultOne());
-            multMenu.add(ActionMultiplicity.getSrcMultZeroToOne());
-            multMenu.add(ActionMultiplicity.getSrcMultOneToMany());
-            multMenu.add(ActionMultiplicity.getSrcMultZeroToMany());
-            popUpActions.add(popUpActions.size() - getPopupAddOffset(),
-                    multMenu);
-
-            ArgoJMenu aggMenu = new ArgoJMenu("menu.popup.aggregation");
-
-           aggMenu.add(ActionAggregation.getSrcAggNone());
-           aggMenu.add(ActionAggregation.getSrcAgg());
-           aggMenu.add(ActionAggregation.getSrcAggComposite());
-           popUpActions.add(popUpActions.size() - getPopupAddOffset(),
-                    aggMenu);
-       } else if (destDeterminingFactor < rSquared) {
-            ArgoJMenu multMenu =
-               new ArgoJMenu("menu.popup.multiplicity");
-           multMenu.add(ActionMultiplicity.getDestMultOne());
-           multMenu.add(ActionMultiplicity.getDestMultZeroToOne());
-           multMenu.add(ActionMultiplicity.getDestMultOneToMany());
-           multMenu.add(ActionMultiplicity.getDestMultZeroToMany());
-           popUpActions.add(popUpActions.size() - getPopupAddOffset(),
-                    multMenu);
-
-            ArgoJMenu aggMenu = new ArgoJMenu("menu.popup.aggregation");
-           aggMenu.add(ActionAggregation.getDestAggNone());
-           aggMenu.add(ActionAggregation.getDestAgg());
-           aggMenu.add(ActionAggregation.getDestAggComposite());
-           popUpActions
-                    .add(popUpActions.size() - getPopupAddOffset(), aggMenu);
+       if (isPointCloseToEdgeEnd(me.getPoint())) {
+            buildMultiplicityMenu(popUpActions);
        }
-       // else: No particular options for right click in middle of line
 
-       // Options available when right click anywhere on line
        Object association = getOwner();
-       if (association != null) {
-           // Navigability menu with suboptions built dynamically to
-           // allow navigability from atart to end, from end to start
-           // or bidirectional
-           Collection ascEnds = Model.getFacade().getConnections(association);
-            Iterator iter = ascEnds.iterator();
-           Object ascStart = iter.next();
-           Object ascEnd = iter.next();
-
-           if (Model.getFacade().isAClassifier(
-                   Model.getFacade().getType(ascStart))
-                    && Model.getFacade().isAClassifier(
-                            Model.getFacade().getType(ascEnd))) {
-                ArgoJMenu navMenu =
-                   new ArgoJMenu("menu.popup.navigability");
-
-               navMenu.add(ActionNavigability.newActionNavigability(
-                    ascStart,
-                   ascEnd,
-                   ActionNavigability.BIDIRECTIONAL));
-               navMenu.add(ActionNavigability.newActionNavigability(
-                    ascStart,
-                   ascEnd,
-                   ActionNavigability.STARTTOEND));
-               navMenu.add(ActionNavigability.newActionNavigability(
-                    ascStart,
-                    ascEnd,
-                    ActionNavigability.ENDTOSTART));
-
-               popUpActions.add(popUpActions.size() - getPopupAddOffset(),
-                        navMenu);
-           }
-       }
+        Collection ascEnds = Model.getFacade().getConnections(association);
+        Iterator iter = ascEnds.iterator();
+        Object ascStart = iter.next();
+        Object ascEnd = iter.next();
+
+        buildNavigationMenu(popUpActions, ascStart, ascEnd);
+        buildAggregationMenu(popUpActions, ascStart, ascEnd);
 
        return popUpActions;
     }
 
+    private boolean isPointCloseToEdgeEnd(Point p) {
+        // x^2 + y^2 = r^2  (equation of a circle)
+        Point firstPoint = this.getFirstPoint();
+        Point lastPoint = this.getLastPoint();
+        int length = getPerimeterLength();
+
+        int rSquared = (int) (.3 * length);
+
+        // max distance is set at 100 pixels, (rSquared = 100^2)
+        if (rSquared > 100) {
+            rSquared = 10000;
+        } else {
+            rSquared *= rSquared;
+        }
+
+        int srcDeterminingFactor =
+            getSquaredDistance(p, firstPoint);
+        int destDeterminingFactor =
+            getSquaredDistance(p, lastPoint);
+
+        return destDeterminingFactor < rSquared || (srcDeterminingFactor < 
rSquared
+                && srcDeterminingFactor < destDeterminingFactor);
+    }
+    
+    private void buildMultiplicityMenu(
+            final Vector popUpActions) {
+        ArgoJMenu menu =
+            new ArgoJMenu("menu.popup.multiplicity");
+        menu.add(ActionMultiplicity.getDestMultOne());
+        menu.add(ActionMultiplicity.getDestMultZeroToOne());
+        menu.add(ActionMultiplicity.getDestMultOneToMany());
+        menu.add(ActionMultiplicity.getDestMultZeroToMany());
+        popUpActions.add(popUpActions.size() - getPopupAddOffset(),
+                menu);
+    }
+    
+    
+    private void buildNavigationMenu(
+            final Vector popUpActions,
+            final Object ascStart,
+            final Object ascEnd) {
+        ArgoJMenu menu =
+            new ArgoJMenu("menu.popup.navigability");
+
+        menu.add(ActionNavigability.newActionNavigability(
+            ascStart,
+            ascEnd,
+            ActionNavigability.BIDIRECTIONAL));
+        menu.add(ActionNavigability.newActionNavigability(
+            ascStart,
+            ascEnd,
+            ActionNavigability.STARTTOEND));
+        menu.add(ActionNavigability.newActionNavigability(
+            ascStart,
+            ascEnd,
+            ActionNavigability.ENDTOSTART));
+
+        popUpActions.add(
+                popUpActions.size() - getPopupAddOffset(),
+                menu);
+    }
+    
+    private void buildAggregationMenu(
+            final Vector popUpActions,
+            final Object ascStart,
+            final Object ascEnd) {
+        ArgoJMenu menu =
+            new ArgoJMenu("menu.popup.aggregation");
+
+        menu.add(ActionAggregation.newActionAggregation(
+            ascStart,
+            ascEnd,
+            ActionAggregation.NONE));
+        menu.add(ActionAggregation.newActionAggregation(
+            ascStart,
+            ascEnd,
+            ActionAggregation.AGGREGATE_END1));
+        menu.add(ActionAggregation.newActionAggregation(
+            ascStart,
+            ascEnd,
+            ActionAggregation.AGGREGATE_END2));
+        menu.add(ActionAggregation.newActionAggregation(
+            ascStart,
+            ascEnd,
+            ActionAggregation.COMPOSITE_END1));
+        menu.add(ActionAggregation.newActionAggregation(
+            ascStart,
+            ascEnd,
+            ActionAggregation.COMPOSITE_END2));
+        popUpActions.add(
+                popUpActions.size() - getPopupAddOffset(),
+                menu);
+    }
+
     /**
      * Updates the multiplicity fields.
      */
@@ -918,38 +927,14 @@
     }
 
     /**
-     * Get the aggregation kind to display at this end
-     * @return the aggregation kind or null if this is not a binary association
-     */
-    private Object getAggregateKind() {
-        if (Model.getFacade().getUmlVersion().charAt(0) == '1') {
-            return Model.getFacade().getAggregation(getOwner());
-        }
-        Object ass = Model.getFacade().getAssociation(getOwner());
-        Collection ends = Model.getFacade().getConnections(ass);
-        if (ends.size() != 2) {
-            // Aggregation is meaningless in a n-ary association
-            // so always assume none.
-            return Model.getAggregationKind().getNone();
-        }
-        Iterator it = ends.iterator();
-        Object aggEnd = it.next();
-        if (aggEnd != getOwner()) {
-            return Model.getFacade().getAggregation(aggEnd);
-        } else {
-            return Model.getFacade().getAggregation(it.next());
-        }
-    }
-    
-    /**
      * @return the current arrow type of this end of the association
      */
     public int getArrowType() {
         assert getOwner() != null;
         
 
-        final Object ak = getAggregateKind();
-        boolean nav = Model.getFacade().isNavigable(getOwner());
+        final Object ak = Model.getFacade().getAggregation1(getOwner());
+        final boolean nav = Model.getFacade().isNavigable(getOwner());
 
         int arrowType;
         if (Model.getAggregationKind().getAggregate().equals(ak)) {

Modified: 
trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/CoreHelperEUMLImpl.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/CoreHelperEUMLImpl.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- 
trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/CoreHelperEUMLImpl.java
        (original)
+++ 
trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/CoreHelperEUMLImpl.java
        2011-03-25 08:10:04-0700
@@ -20,6 +20,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -1326,7 +1327,28 @@
                         handle));
     }
 
-    public void setAggregation(final Object handle, final Object 
aggregationKind) {
+    public void setAggregation(
+            final Object handle,
+            final Object aggregationKind) {
+        setAggregation2(handle, aggregationKind);
+    }
+
+    public void setAggregation1(
+            final Object handle,
+            final Object aggregationKind) {
+        Property p = (Property) handle;
+        Association ass = p.getAssociation();
+        Collection assEnds = modelImpl.getFacade().getConnections(ass);
+        Iterator it = assEnds.iterator();
+        Object other = it.next();
+        if (other == handle) {
+            other = it.next();
+        }
+        
+        setAggregation2(handle, aggregationKind);
+    }
+
+    public void setAggregation2(final Object handle, final Object 
aggregationKind) {
         if (!(handle instanceof Property)) {
             throw new IllegalArgumentException(
                     "handle must be instance of Property"); //$NON-NLS-1$
@@ -1358,7 +1380,8 @@
                         "Set the aggregation # to the association end #",
                         aggregationKind, handle));
     }
-
+    
+    
     public void setAnnotatedElements(final Object handle, final Collection 
elems) {
         if (!(handle instanceof Comment)) {
             throw new IllegalArgumentException(

Modified: 
trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/FacadeEUMLImpl.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/FacadeEUMLImpl.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- 
trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/FacadeEUMLImpl.java
    (original)
+++ 
trunk/src/argouml-core-model-euml/src/org/argouml/model/euml/FacadeEUMLImpl.java
    2011-03-25 08:10:04-0700
@@ -219,8 +219,28 @@
     public Object getAddition(Object handle) {
         return ((Include) handle).getAddition();
     }
-
+    
     public Object getAggregation(Object handle) {
+        return getAggregation2(handle);
+    }
+    
+
+    public Object getAggregation1(Object handle) {
+        Property p = (Property) handle;
+        Association ass = p.getAssociation();
+        Collection assEnds = getConnections(ass);
+        Iterator it = assEnds.iterator();
+        if (!it.hasNext()) {
+            return null;
+        }
+        Object other = it.next();
+        if (other == handle) {
+            other = it.next();
+        }
+        return getAggregation2(other);
+    }
+
+    public Object getAggregation2(Object handle) {
         if (!(handle instanceof Property)) {
             throw new IllegalArgumentException(
                     "handle must be instance of Property"); //$NON-NLS-1$

Modified: 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreHelperMDRImpl.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreHelperMDRImpl.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreHelperMDRImpl.java
   (original)
+++ 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreHelperMDRImpl.java
   2011-03-25 08:10:04-0700
@@ -2592,8 +2592,11 @@
         throw new IllegalArgumentException("handle: " + handle);
     }
 
-
     public void setAggregation(Object handle, Object aggregationKind) {
+        setAggregation1(handle, aggregationKind);
+    }
+
+    public void setAggregation1(Object handle, Object aggregationKind) {
         if (handle instanceof AssociationEnd
                 && aggregationKind instanceof AggregationKind) {
             AggregationKind ak = (AggregationKind) aggregationKind;
@@ -2623,6 +2626,20 @@
                 + " or aggregationKind: " + aggregationKind);
     }
 
+    public void setAggregation2(Object handle, Object aggregationKind) {
+        if (handle instanceof AssociationEnd
+                && aggregationKind instanceof AggregationKind) {
+            // Simulates UML2 getting the aggregation from the opposite end
+            AssociationEnd assEnd = (AssociationEnd) handle;
+            Collection<AssociationEnd> assEnds = 
assEnd.getAssociation().getConnection();
+            Iterator<AssociationEnd> it = assEnds.iterator();
+            AssociationEnd other = it.next();
+            setAggregation1(other, aggregationKind);
+        }
+        throw new IllegalArgumentException("handle: " + handle
+                + " or aggregationKind: " + aggregationKind);
+    }
+
 
     public void setAnnotatedElements(Object handle, Collection elems) {
         if (handle instanceof Comment && elems instanceof List) {

Modified: 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/FacadeMDRImpl.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/FacadeMDRImpl.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/FacadeMDRImpl.java   
    (original)
+++ 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/FacadeMDRImpl.java   
    2011-03-25 08:10:04-0700
@@ -3786,6 +3786,10 @@
 
 
     public Object getAggregation(Object handle) {
+        return getAggregation1(handle);
+    }
+    
+    public Object getAggregation1(Object handle) {
         try {
             if (handle instanceof AssociationEnd) {
                 return ((AssociationEnd) handle).getAggregation();
@@ -3796,6 +3800,26 @@
         return illegalArgumentObject(handle);
     }
 
+    public Object getAggregation2(Object handle) {
+        try {
+            if (handle instanceof AssociationEnd) {
+                // Simulates UML2 getting the aggregation from the opposite end
+                AssociationEnd assEnd = (AssociationEnd) handle;
+                Collection<AssociationEnd> assEnds = 
assEnd.getAssociation().getConnection();
+                Iterator<AssociationEnd> it = assEnds.iterator();
+                AssociationEnd other = it.next();
+                if (other != assEnd) {
+                    return other.getAggregation();
+                } else {
+                    other = it.next();
+                    return other.getAggregation();
+                }
+            }
+        } catch (InvalidObjectException e) {
+            throw new InvalidElementException(e);
+        }
+        return illegalArgumentObject(handle);
+    }
 
     public String getAlias(Object handle) {
         try {

Modified: 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/UndoCoreHelperDecorator.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/UndoCoreHelperDecorator.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/UndoCoreHelperDecorator.java
     (original)
+++ 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/UndoCoreHelperDecorator.java
     2011-03-25 08:10:04-0700
@@ -235,6 +235,22 @@
         }, aggregationKind, Model.getFacade().getAggregation(handle));
     }
 
+    public void setAggregation1(final Object handle, Object aggregationKind) {
+        createCommand(new ObjectSetter() {
+            public void set(Object value) {
+                getComponent().setAggregation1(handle, value);
+            }
+        }, aggregationKind, Model.getFacade().getAggregation1(handle));
+    }
+
+    
+    public void setAggregation2(final Object handle, Object aggregationKind) {
+        createCommand(new ObjectSetter() {
+            public void set(Object value) {
+                getComponent().setAggregation2(handle, value);
+            }
+        }, aggregationKind, Model.getFacade().getAggregation2(handle));
+    }
 
     public void setLeaf(final Object handle, boolean flag) {
         createCommand(new BooleanSetter() {

Modified: trunk/src/argouml-core-model/src/org/argouml/model/CoreHelper.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model/src/org/argouml/model/CoreHelper.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- trunk/src/argouml-core-model/src/org/argouml/model/CoreHelper.java  
(original)
+++ trunk/src/argouml-core-model/src/org/argouml/model/CoreHelper.java  
2011-03-25 08:10:04-0700
@@ -875,6 +875,8 @@
 
     /**
      * Set the aggregation attribute of an AssociationEnd.
+     * This is implementation dependent regarding whether the UML version
+     * considers aggregation on the container or aggregated item
      * 
      * @param handle
      *            the AssociationEnd
@@ -885,6 +887,34 @@
     void setAggregation(Object handle, Object aggregationKind);
 
     /**
+     * Set the aggregation attribute of an AssociationEnd.
+     * This assumes UML1 style where the aggregation is held on the
+     * containing part of the association rather than the aggregate.
+     * 
+     * @param handle
+     *            the AssociationEnd
+     * @param aggregationKind
+     *            an {@link AggregationKind} of Aggregate, Composite, or None
+     *            returned from {@link Model#getAggregationKind()}.
+     */
+    void setAggregation1(Object handle, Object aggregationKind);
+
+
+    /**
+     * Set the aggregation attribute of an AssociationEnd.
+     * This assumes UML2 style where the aggregation is held on the
+     * aggregate part of the association rather than the container.
+     * 
+     * @param handle
+     *            the AssociationEnd
+     * @param aggregationKind
+     *            an {@link AggregationKind} of Aggregate, Composite, or None
+     *            returned from {@link Model#getAggregationKind()}.
+     */
+    void setAggregation2(Object handle, Object aggregationKind);
+    
+    
+    /**
      * Set the list of annotated elements for the given comment.
      *
      * @param handle the given comment

Modified: trunk/src/argouml-core-model/src/org/argouml/model/Facade.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model/src/org/argouml/model/Facade.java?view=diff&pathrev=19135&r1=19134&r2=19135
==============================================================================
--- trunk/src/argouml-core-model/src/org/argouml/model/Facade.java      
(original)
+++ trunk/src/argouml-core-model/src/org/argouml/model/Facade.java      
2011-03-25 08:10:04-0700
@@ -3046,6 +3046,8 @@
 
     /**
      * Return the AggregationKind of a given AssociationEnd.
+     * This is implementation dependent regarding whether the UML version
+     * considers aggregation on the container or aggregated item
      *
      * @param handle the AssociationEnd
      * @return the AggregationKind
@@ -3053,6 +3055,26 @@
     Object getAggregation(Object handle);
 
     /**
+     * Return the AggregationKind of a given AssociationEnd.
+     * This assumes UML1 style where the aggregation is held on the
+     * containing part of the association rather than the aggregate.
+     *
+     * @param handle the AssociationEnd
+     * @return the AggregationKind
+     */
+    Object getAggregation1(Object handle);
+
+    /**
+     * Return the AggregationKind of a given AssociationEnd.
+     * This assumes UML2 style where the aggregation is held on the
+     * aggregate part of the association rather than the container.
+     *
+     * @param handle the AssociationEnd
+     * @return the AggregationKind
+     */
+    Object getAggregation2(Object handle);
+
+    /**
      * Return the alias of an ElementImport.
      * 
      * @param handle the ElementImport

------------------------------------------------------
http://argouml.tigris.org/ds/viewMessage.do?dsForumId=5905&dsMessageId=2714166

To unsubscribe from this discussion, e-mail: 
[[email protected]].

Reply via email to