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