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;
053:
054: import java.awt.Color;
055: import java.awt.Dimension;
056: import java.awt.FontMetrics;
057: import java.awt.Graphics;
058: import java.awt.Label;
059: import java.awt.Point;
060: import java.awt.Rectangle;
061: import java.util.Iterator;
062: import java.util.LinkedList;
063: import javax.swing.JLabel;
064: import javax.swing.JPanel;
065: import org.acm.seguin.uml.line.DragPanelAdapter;
066: import org.acm.seguin.uml.line.SizableLabel;
067: import org.acm.seguin.uml.line.ScalablePanel;
068:
069: /**
070: * Holds the roles associated with a type
071: *
072: *@author Chris Seguin
073: *@author Mike Atkinson
074: *@created September 30, 1999
075: */
076: public class RoleHolder extends ScalablePanel {
077: private LinkedList labels;
078: private int wide;
079: private int high;
080: private UMLMouseAdapter popupMenuListener;
081: private DragPanelAdapter panelDragAdapter;
082:
083: /**
084: * Constructor for the RoleHolder object
085: *
086: *@param popupMenuListener listener that launches the popup menu
087: *@param panelDragAdapter listener that drags the type
088: */
089: public RoleHolder(UMLMouseAdapter popupMenuListener,
090: DragPanelAdapter panelDragAdapter) {
091: setLayout(null);
092: labels = new LinkedList();
093: wide = 0;
094: high = 0;
095: this .popupMenuListener = popupMenuListener;
096: this .panelDragAdapter = panelDragAdapter;
097: }
098:
099: /**
100: * Gets the preferred size
101: *
102: *@return the preferred size for this object
103: */
104: public Dimension getPreferredSize() {
105: return new Dimension(wide, high);
106: }
107:
108: /**
109: * Gets the minimum size
110: *
111: *@return The minimum size for this object
112: */
113: public Dimension getMinimumSize() {
114: return getPreferredSize();
115: }
116:
117: /**
118: * Adds a role
119: *
120: *@param msg the role name
121: */
122: public void add(String msg) {
123: SizableLabel roleLabel = new SizableLabel(msg);
124: roleLabel.setSLFont(UMLLine.defaultFont);
125: roleLabel.setSLHorizontalAlignment(JLabel.CENTER);
126: roleLabel.setLocation(0, high);
127: add(roleLabel);
128:
129: Dimension dim = roleLabel.getPreferredSize();
130: roleLabel.setSize(dim);
131: wide = Math.max(wide, dim.width);
132: high = high + dim.height;
133:
134: roleLabel.addMouseListener(popupMenuListener);
135: roleLabel.addMouseListener(panelDragAdapter);
136: roleLabel.addMouseMotionListener(panelDragAdapter);
137:
138: labels.add(roleLabel);
139: setSize(getPreferredSize());
140: }
141:
142: /**
143: * Determines if there are any roles
144: *
145: *@return Description of the Returned Value
146: */
147: public boolean hasAny() {
148: return (high > 0);
149: }
150:
151: /**
152: * Reset width
153: *
154: *@param newWidth the new width
155: */
156: public void resetWidth(int newWidth) {
157: Dimension temp = getPreferredSize();
158: temp.width = newWidth;
159: setSize(temp);
160:
161: Iterator iter = labels.iterator();
162: while (iter.hasNext()) {
163: SizableLabel next = (SizableLabel) iter.next();
164: temp = next.getPreferredSize();
165: temp.width = newWidth;
166: next.setSize(temp);
167: }
168: }
169:
170: /**
171: * Print the roles
172: *
173: *@param g Description of Parameter
174: *@param x Description of Parameter
175: *@param y Description of Parameter
176: */
177: public void print(Graphics g, int x, int y) {
178: Rectangle bounds = getBounds();
179: g.setFont(UMLLine.defaultFont);
180: FontMetrics fm = g.getFontMetrics();
181:
182: Iterator iter = labels.iterator();
183: while (iter.hasNext()) {
184: SizableLabel roleLabel = (SizableLabel) iter.next();
185: Point pt = roleLabel.getLocation();
186: roleLabel.print(g, x + pt.x, y + pt.y);
187: }
188: }
189:
190: /**
191: * Sets the scaling factor
192: *
193: *@param value scaling factor
194: */
195: public void scale(double value) {
196: //wide = 0;
197: //high = 0;
198: Iterator iter = labels.iterator();
199: while (iter.hasNext()) {
200: SizableLabel roleLabel = (SizableLabel) iter.next();
201: roleLabel.scale(value);
202: }
203: super.scale(value);
204: }
205:
206: }
|