svn commit: r16347 - trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociationEnd.java
Michiel van der Wulp <[email protected]>
| Newsgroups | gmane.comp.lang.uml.argouml.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: mvw Date: 2008-12-12 03:13:56-0800 New Revision: 16347 Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociationEnd.java Log: Refactoring the FigAssociationEnd (for the N-ary association) according the state of the art in FigAssociation. Modified: trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociationEnd.java Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociationEnd.java?view=diff&pathrev=16347&r1=16346&r2=16347 ============================================================================== --- trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociationEnd.java (original) +++ trunk/src/argouml-app/src/org/argouml/uml/diagram/ui/FigAssociationEnd.java 2008-12-12 03:13:56-0800 @@ -25,22 +25,14 @@ package org.argouml.uml.diagram.ui; import java.awt.Color; -import java.awt.Font; import java.awt.Graphics; -import java.awt.Rectangle; -import java.beans.PropertyChangeEvent; import java.util.HashSet; import java.util.Set; -import org.argouml.kernel.Project; -import org.argouml.model.AssociationChangeEvent; -import org.argouml.model.AttributeChangeEvent; import org.argouml.model.Model; -import org.argouml.notation.NotationProvider; import org.argouml.notation.NotationProviderFactory2; import org.argouml.uml.diagram.DiagramSettings; import org.tigris.gef.base.Layer; -import org.tigris.gef.base.PathConvPercentPlusConst; import org.tigris.gef.presentation.FigText; /** @@ -49,29 +41,24 @@ * This class represents an association End Fig on a diagram, * i.e. the line between the diamond and a node (like a class). <p> * - * This class makes use of 2 NotationProviders: - * one for the association end name, - * and one for the multiplicity. + * The direction of the lines is from the diamond outwards, + * hence the destination is the side of the classifier, + * where the labels are shown. <p> + * + * There is no support for arrows indicating navigability. <p> + * + * Showing qualifiers or aggregation is not permitted + * according the UML 1.4.2 standard. * * @author [email protected] */ public class FigAssociationEnd extends FigEdgeModelElement { /** - * Serial version generation by Eclipse for rev. 1.18 - */ - private static final long serialVersionUID = -3029436535288973358L; - /** * Group for the FigTexts concerning the association end. */ - private FigTextGroup srcGroup; - private FigText srcMult; - private FigText srcOrdering; - - /** - * The notation provider for the multiplicity. - */ - private NotationProvider multiplicityNotationProvider; + private FigAssociationEndAnnotation destGroup; + private FigMultiplicity destMult; /** * The constructor. @@ -82,34 +69,17 @@ @Deprecated public FigAssociationEnd() { super(); - srcGroup = new FigTextGroup(); - srcMult = new FigText(X0, Y0, 90, 20); - srcOrdering = new FigText(X0, Y0, 90, 20); - constructFigs(); - } - - private void constructFigs() { - srcMult.setTextColor(Color.black); - srcMult.setTextFilled(false); - srcMult.setFilled(false); - srcMult.setLineWidth(0); - srcMult.setReturnAction(FigText.END_EDITING); - srcMult.setJustification(FigText.JUSTIFY_CENTER); - - srcOrdering.setTextColor(Color.black); - srcOrdering.setTextFilled(false); - srcOrdering.setFilled(false); - srcOrdering.setLineWidth(0); - srcOrdering.setReturnAction(FigText.END_EDITING); - srcOrdering.setJustification(FigText.JUSTIFY_CENTER); - srcOrdering.setEditable(false); - - srcGroup.addFig(getNameFig()); - srcGroup.addFig(srcOrdering); - - addPathItem(srcMult, new PathConvPercentPlusConst(this, 100, -15, -15)); - addPathItem(srcGroup, new PathConvPercentPlusConst(this, 100, -40, 20)); + destMult = new FigMultiplicity(); + // Placed at a 45 degree angle close to the end + addPathItem(destMult, + new PathItemPlacement(this, destMult, 100, -5, 45, 5)); + ArgoFigUtil.markPosition(this, 100, -5, 45, 5, Color.green); + + destGroup = new FigAssociationEndAnnotation(this); + addPathItem(destGroup, + new PathItemPlacement(this, destGroup, 100, -5, -45, 5)); + ArgoFigUtil.markPosition(this, 100, -5, -45, 5, Color.blue); setBetweenNearestPoints(true); } @@ -117,36 +87,60 @@ /** * The constructor. * - * @param edge the UML object: association-end + * @param owner the UML object: association-end * @param lay the layer that contains this Fig * @deprecated for 0.27.3 by tfmorris. Use * {@link #FigAssociationEnd(Object, DiagramSettings)}. */ @SuppressWarnings("deprecation") @Deprecated - public FigAssociationEnd(Object edge, Layer lay) { + public FigAssociationEnd(Object owner, Layer lay) { this(); setLayer(lay); - setOwner(edge); - if (Model.getFacade().isAAssociationEnd(edge)) { - addElementListener(edge); + setOwner(owner); + if (Model.getFacade().isAAssociationEnd(owner)) { + addElementListener(owner); } } /** * Construct Fig. * - * @param edge owning UML element + * @param owner owning UML element (i.e. an AssociationEnd) * @param settings rendering settings */ - public FigAssociationEnd(Object edge, DiagramSettings settings) { - super(edge, settings); - srcGroup = new FigTextGroup(edge, settings); - srcMult = new ArgoFigText(edge, new Rectangle(X0, Y0, 90, 20), - settings, false); - srcOrdering = new ArgoFigText(edge, new Rectangle(X0, Y0, 90, 20), - settings, false); - constructFigs(); + public FigAssociationEnd(Object owner, DiagramSettings settings) { + super(owner, settings); + + destMult = new FigMultiplicity(owner, settings); + addPathItem(destMult, + new PathItemPlacement(this, destMult, 100, -5, 45, 5)); + ArgoFigUtil.markPosition(this, 100, -5, 45, 5, Color.green); + + destGroup = new FigAssociationEndAnnotation(this, owner, settings); + addPathItem(destGroup, + new PathItemPlacement(this, destGroup, 100, -5, -45, 5)); + ArgoFigUtil.markPosition(this, 100, -5, -45, 5, Color.blue); + + setBetweenNearestPoints(true); + + initializeNotationProvidersInternal(owner); + } + + /** + * Set the owner. + * + * @param owner the associationEnd + * @see org.argouml.uml.diagram.ui.FigEdgeModelElement#setOwner(java.lang.Object) + * @deprecated for 0.27.3 by mvw. Set the owner in the constructor. + */ + @SuppressWarnings("deprecation") + @Deprecated + @Override + public void setOwner(Object owner) { + super.setOwner(owner); + destGroup.setOwner(owner); + destMult.setOwner(owner); } /* @@ -157,24 +151,23 @@ return NotationProviderFactory2.TYPE_ASSOCIATION_END_NAME; } + @SuppressWarnings("deprecation") @Override protected void initNotationProviders(Object own) { - if (multiplicityNotationProvider != null) { - multiplicityNotationProvider.cleanListener(this, own); - } + initializeNotationProvidersInternal(own); + } + + @SuppressWarnings("deprecation") + private void initializeNotationProvidersInternal(Object own) { super.initNotationProviders(own); - if (Model.getFacade().isAAssociationEnd(own)) { - multiplicityNotationProvider = - NotationProviderFactory2.getInstance().getNotationProvider( - NotationProviderFactory2.TYPE_MULTIPLICITY, own, this); - Project p = getProject(); - if (p != null) { - putNotationArgument("singularMultiplicityVisible", - getSettings().isShowSingularMultiplicities()); - putNotationArgument("useGuillemets", - getSettings().isUseGuillemets()); - } - } + destMult.initNotationProviders(); + initNotationArguments(); + } + + protected void initNotationArguments() { + /* Nothing yet. Later maybe something like: */ +// putNotationArgument("showAssociationName", +// getSettings().isShowAssociationNames()); } /* @@ -182,31 +175,13 @@ */ @Override public void updateListeners(Object oldOwner, Object newOwner) { - Set<Object[]> l = new HashSet<Object[]>(); + Set<Object[]> listeners = new HashSet<Object[]>(); if (newOwner != null) { - l.add(new Object[] {newOwner, null}); - } - updateElementListeners(l); - } - - /** Returns the name of the OrderingKind. - * @return "{ordered}", "{sorted}" or "" if null or "unordered" - */ - private String getOrderingName(Object orderingKind) { - if (orderingKind == null) { - return ""; - } - if (Model.getFacade().getName(orderingKind) == null) { - return ""; - } - if ("".equals(Model.getFacade().getName(orderingKind))) { - return ""; + listeners.add(new Object[] {newOwner, + new String[] {"isAbstract", "remove"} + }); } - if ("unordered".equals(Model.getFacade().getName(orderingKind))) { - return ""; - } - - return "{" + Model.getFacade().getName(orderingKind) + "}"; + updateElementListeners(listeners); } /* @@ -218,13 +193,16 @@ return; } super.textEdited(ft); - if (ft == srcMult) { + if (getOwner() == null) { + return; + } + if (ft == destGroup.getRole()) { + destGroup.getRole().textEdited(); + } else if (ft == destMult) { /* The text the user has filled in the textfield is first checked * to see if it's a valid multiplicity. If so then that is the * multiplicity to be set. If not the input is rejected. */ - multiplicityNotationProvider.parse(getOwner(), ft.getText()); - ft.setText(multiplicityNotationProvider.toString(getOwner(), - getNotationArguments())); + destMult.textEdited(); } } @@ -233,82 +211,79 @@ */ @Override protected void textEditStarted(FigText ft) { - if (ft == srcMult) { - showHelp(multiplicityNotationProvider.getParsingHelp()); + if (ft == destGroup.getRole()) { + destGroup.getRole().textEditStarted(); + } else if (ft == destMult) { + destMult.textEditStarted(); } else { super.textEditStarted(ft); } } - private void updateEnd(FigText multiToUpdate, - FigText orderingToUpdate) { - - Object owner = getOwner(); - if (!Model.getFacade().isAAssociationEnd(owner)) { - throw new IllegalArgumentException(); - } - - if (multiplicityNotationProvider != null) { - multiToUpdate.setText( - multiplicityNotationProvider.toString(getOwner(), - getNotationArguments())); - } - - Object order = Model.getFacade().getOrdering(owner); - orderingToUpdate.setText(getOrderingName(order)); - } - - /* - * @see org.argouml.uml.diagram.ui.FigEdgeModelElement#modelChanged(java.beans.PropertyChangeEvent) - */ - @Override - protected void modelChanged(PropertyChangeEvent e) { - super.modelChanged(e); - if (e instanceof AttributeChangeEvent - || e instanceof AssociationChangeEvent) { - renderingChanged(); - if (multiplicityNotationProvider != null) { - multiplicityNotationProvider.updateListener(this, - getOwner(), e); - } - } - } - - @Override public void renderingChanged() { super.renderingChanged(); - // Fonts and colors should get updated automatically for contained figs - - // Do we really need to update the text? Why should it have changed? - updateEnd(srcMult, srcOrdering); - - srcMult.calcBounds(); - srcGroup.calcBounds(); + destMult.renderingChanged(); + destGroup.renderingChanged(); + initNotationArguments(); } - /* - * @see org.argouml.uml.diagram.ui.FigEdgeModelElement#updateStereotypeText() - */ @Override protected void updateStereotypeText() { /* There is none... */ } @Override - protected void removeFromDiagramImpl() { - multiplicityNotationProvider.cleanListener(this, getOwner()); - super.removeFromDiagramImpl(); - } - - /* - * @see org.argouml.uml.diagram.ui.FigEdgeModelElement#paintClarifiers(java.awt.Graphics) - */ - @Override public void paintClarifiers(Graphics g) { indicateBounds(getNameFig(), g); - indicateBounds(srcMult, g); + indicateBounds(destMult, g); + indicateBounds(destGroup.getRole(), g); super.paintClarifiers(g); - } + } + + /** + * Updates the multiplicity field. + */ + protected void updateMultiplicity() { + if (getOwner() != null + && destMult.getOwner() != null) { + destMult.setText(); + } + } + + /* TODO: Support navigability. + * The code below causes and exception in FigAssociationEndAnnotation. */ +// @Override +// public void paint(Graphics g) { +// if (getOwner() == null ) { +// LOG.error( +// "Trying to paint a FigAssociationEnd without an owner. "); +// } else { +// applyArrowHeads(); +// } +// if (getSourceArrowHead() != null) { +// getSourceArrowHead().setLineColor(getLineColor()); +// } +// super.paint(g); +// } + +// /** +// * Choose the arrowhead style for each end. <p> +// * +// * TODO: This is called from paint(). Would it not better +// * be called from renderingChanged()? +// */ +// protected void applyArrowHeads() { +// int sourceArrowType = destGroup.getArrowType(); +// +// if (!getSettings().isShowBidirectionalArrows() +// && sourceArrowType > 2) { +// sourceArrowType -= 3; +// } +// +// setSourceArrowHead(FigAssociationEndAnnotation +// .ARROW_HEADS[sourceArrowType]); +// } + } ------------------------------------------------------ http://argouml.tigris.org/ds/viewMessage.do?dsForumId=5905&dsMessageId=983347 To unsubscribe from this discussion, e-mail: [[email protected]].