001: /* ====================================================================
002: * The JRefactory License, Version 1.0
003: *
004: * Copyright (c) 2001 JRefactory. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by the
021: * JRefactory (http://www.sourceforge.org/projects/jrefactory)."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. The names "JRefactory" must not be used to endorse or promote
026: * products derived from this software without prior written
027: * permission. For written permission, please contact seguin@acm.org.
028: *
029: * 5. Products derived from this software may not be called "JRefactory",
030: * nor may "JRefactory" appear in their name, without prior written
031: * permission of Chris Seguin.
032: *
033: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
034: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
035: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
036: * DISCLAIMED. IN NO EVENT SHALL THE CHRIS SEGUIN OR
037: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
038: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
039: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
040: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
041: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
042: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
043: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
044: * SUCH DAMAGE.
045: * ====================================================================
046: *
047: * This software consists of voluntary contributions made by many
048: * individuals on behalf of JRefactory. For more information on
049: * JRefactory, please see
050: * <http://www.sourceforge.org/projects/jrefactory>.
051: */
052: package org.acm.seguin.uml.line;
053:
054: import java.awt.Color;
055: import java.awt.Dimension;
056: import java.awt.Point;
057: import java.awt.Rectangle;
058: import java.awt.Graphics2D;
059: import java.io.PrintWriter;
060: import javax.swing.JPanel;
061: import org.acm.seguin.uml.UMLField;
062:
063: /**
064: * AssociationRelationship
065: *
066: *@author Chris Seguin
067: *@author Mike Atkinson
068: *@created August 1, 1999
069: */
070: public class AssociationRelationship extends SegmentedLine {
071: private UMLField field;
072: private boolean dead;
073:
074: /**
075: * Constructor for the InheretenceRelationship object
076: *
077: *@param start Description of Parameter
078: *@param end Description of Parameter
079: *@param init Description of Parameter
080: */
081: public AssociationRelationship(EndPointPanel start,
082: EndPointPanel end, UMLField init) {
083: super (start, end);
084:
085: field = init;
086: dead = false;
087:
088: Point startPt = vertices[vertices.length - 2].getPoint();
089: Point endPt = vertices[vertices.length - 1].getPoint();
090: Dimension fieldSize = field.getSize();
091:
092: int nX = (startPt.x < endPt.x) ? endPt.x - fieldSize.width - 10
093: : endPt.x + 10;
094: int nY = (startPt.y < endPt.y) ? endPt.y - fieldSize.height
095: - 10 : endPt.y + 10;
096:
097: field.setLocation(nX, nY);
098: }
099:
100: /**
101: * Gets the Field attribute of the AssociationRelationship object
102: *
103: *@return The Field value
104: */
105: public UMLField getField() {
106: return field;
107: }
108:
109: /**
110: * Saves a segmented to the output stream
111: *
112: *@param output the output stream
113: */
114: public void save(PrintWriter output) {
115: output.print("A[");
116: saveStartPanel(output);
117: output.print(",");
118: output.print(field.getSummary().getName());
119: output.print("]");
120: saveVertices(output);
121: Point pt = field.getUnscaledLocation();
122: output.println("{" + pt.x + "," + pt.y + "}");
123: }
124:
125: /**
126: * Delete this segmented line
127: */
128: public void delete() {
129: dead = true;
130: }
131:
132: /**
133: * Draws the arrow and the last segment
134: *
135: *@param g the graphics object
136: */
137: protected void drawArrow(Graphics2D g) {
138: Point shortPt = getShortPoint();
139: int last = vertices.length;
140: //double X0 = vertices[last - 2].getPoint().getX();
141: //double Y0 = vertices[last - 2].getPoint().getY();
142: double X0 = shortPt.getX();
143: double Y0 = shortPt.getY();
144:
145: Point end = vertices[last - 1].getPoint();
146: Point above = getArrowPointAbove();
147: Point below = getArrowPointBelow();
148:
149: Xs[0] = (int) X0;
150: Xs[1] = (int) end.getX();
151: Xs[2] = (int) below.getX();
152: Xs[3] = (int) end.getX();
153: Xs[4] = (int) above.getX();
154:
155: Ys[0] = (int) Y0;
156: Ys[1] = (int) end.getY();
157: Ys[2] = (int) below.getY();
158: Ys[3] = (int) end.getY();
159: Ys[4] = (int) above.getY();
160:
161: g.drawPolyline(Xs, Ys, 5);
162: }
163:
164: /**
165: * Updates the location of the end vertex
166: */
167: protected void updateEnd() {
168: if (dead) {
169: return;
170: }
171:
172: int last = vertices.length;
173:
174: // Remember where we came from
175: Point before = vertices[last - 1].getPoint();
176: int beforeX = before.x;
177: int beforeY = before.y;
178:
179: // Update the end point
180: super .updateEnd();
181:
182: // Learn where we went to
183: Point after = vertices[last - 1].getPoint();
184:
185: // shift field the difference between before and after points
186: field.shift(after.x - beforeX, after.y - beforeY);
187: }
188: }
|