|
What this is
Other links
The source code
// $Id: ClassdiagramNode.java,v 1.12 2004/09/09 18:07:18 mvw Exp $
// Copyright (c) 1996-2004 The Regents of the University of California. All
// Rights Reserved. Permission to use, copy, modify, and distribute this
// software and its documentation without fee, and without a written
// agreement is hereby granted, provided that the above copyright notice
// and this paragraph appear in all copies. This software program and
// documentation are copyrighted by The Regents of the University of
// California. The software program and documentation are supplied "AS
// IS", without any accompanying services from The Regents. The Regents
// does not warrant that the operation of the program will be
// uninterrupted or error-free. The end-user understands that the program
// was developed for research purposes and is advised not to rely
// exclusively on the program for any reason. IN NO EVENT SHALL THE
// UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
// SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
// ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
// THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
// PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
// CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
// UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
package org.argouml.uml.diagram.static_structure.layout;
import java.awt.Dimension;
import java.awt.Point;
import java.util.Vector;
import org.argouml.uml.diagram.layout.LayoutedNode;
import org.argouml.uml.diagram.static_structure.ui.FigPackage;
import org.tigris.gef.presentation.Fig;
import org.tigris.gef.presentation.FigNode;
/**
* This class represents a node in the classdiagram (a class, interface or
* package).
*/
class ClassdiagramNode implements LayoutedNode {
/**
* Operation ClassdiagramNode creates a new ClassdiagramNode.
*
* @param f
* represents the figure in the diagram, that peers this layout
* node.
*/
public ClassdiagramNode(FigNode f) {
setFigure(f);
}
/**
* Operation getSize returns the size of the figure associated with this
* layout node.
*
* @return The size of the associated figure.
*/
public Dimension getSize() {
return getFigure().getSize();
}
/**
* Operation getLocation returns the location of the associated figure in
* the diagram.
*
* @return The location of the associated figure.
*/
public Point getLocation() {
return getFigure().getLocation();
}
/**
* Operation setLocation set the new location of the associated figure in
* the diagram.
*
* @param newLocation
* represents the new location for this figure.
*/
public void setLocation(Point newLocation) {
Point oldLocation = getFigure().getLocation();
getFigure().setLocation(newLocation);
int xTrans = newLocation.x - oldLocation.x;
int yTrans = newLocation.y - oldLocation.y;
Vector enclosingFigs = getFigure().getEnclosedFigs();
if (enclosingFigs != null) {
for (int i = 0; i < enclosingFigs.size(); i++)
((Fig) (enclosingFigs.elementAt(i))).translate(xTrans, yTrans);
}
}
/**
* Check if this node is associated with a package.
*
* @return true, if this node is associated with a package, false otherwise.
*/
boolean isPackage() {
return (getFigure() instanceof FigPackage);
}
public int getRealRank() {
return rank;
}
/**
* Compute or just return the rank of this node.
*
* @return The rank for this node.
*/
public int getRank() {
if (rank == NORANK) {
// If the rank was not computed yet, compute it now.
if (getUplinks().size() == 0) { // If there are no uplinks,
rank = 0; // place the node in the 1st row.
} else { // Otherwise compute the max rank of the uplinks + 1
for (int i = 0; i < getUplinks().size(); i++) {
// avoid recursing, causing stack overflow error, if the
// uplinks are cyclic.
if (getUplink(i) == this) { return rank; }
if (getUplink(i).getRank() + 1 > rank) {
rank = getUplink(i).getRank() + 1;
}
}
}
}
return rank;
}
/**
* Operation setRank changes the value of the attribute _rank.
*
* @param newRank
* represents the new value of _rank.
*/
public void setRank(int newRank) {
rank = newRank;
}
/**
* Add a constant to the rank of this node.
*
* @param n
* The value to add.
*/
public void addRank(int n) {
setRank(n + getRank());
}
/**
* Operation getColumn returns the value of the attribute _column.
*
* @return The value of the attribute _column.
*/
public int getColumn() {
return column;
}
/**
* Operation setColumn changes the value of the attribute _column.
*
* @param newColumn
* represents the new value of _column.
*/
public void setColumn(int newColumn) {
column = newColumn;
}
/**
* Operation getUplinks returns the value of the attribute _uplinks.
*
* @return The value of the attribute _uplinks.
*/
public Vector getUplinks() {
return uplinks;
}
/**
* Get the uplink for a given index.
*
* @param i The index of this uplink.
* @return The ClassdiagramNode for this uplink.
*/
public ClassdiagramNode getUplink(int i) {
return (ClassdiagramNode) (uplinks.elementAt(i));
}
/**
* Add an uplink to this node.
*
* @param newUplink
* represents the new uplinks.
*/
public void addUplink(ClassdiagramNode newUplink) {
uplinks.add(newUplink);
}
/**
* Operation getDownlinks returns the value of the attribute _downlinks.
*
* @return The value of the attribute _downlinks.
*/
public Vector getDownlinks() {
return downlinks;
}
/**
* Get the downlink for a given index.
*
* @param i The index of this downlink.
* @return The ClassdiagramNode of this downlink.
*/
public ClassdiagramNode getDownlink(int i) {
return (ClassdiagramNode) (downlinks.elementAt(i));
}
/**
* Operation setDownlinks changes the value of the attribute _downlinks.
*
* @param newDownlink Represents the new value of _downlinks.
*/
public void addDownlink(ClassdiagramNode newDownlink) {
downlinks.add(newDownlink);
}
/**
* Operation getFigure returns the value of the attribute _figure.
*
* @return The value of the attribute _figure.
*/
public FigNode getFigure() {
return figure;
}
/**
* Operation setFigure changes the value of the attribute _figure.
*
* @param newFigure
* represents the new value of _figure.
*/
public void setFigure(FigNode newFigure) {
figure = newFigure;
}
/**
* Return the weight of this node.
*
* @return The weight of this node.
*/
public float getWeight() {
return weight;
}
/**
* Set a new weight for this node.
*
* @param w
* The new weight of this node.
*/
public void setWeight(float w) {
weight = w;
}
/**
* a node is movable when it hasn't got any up- or downlinks.
*
* @return whether the node is movable
*/
public boolean isMovable() {
return (downlinks.size() == 0 && uplinks.size() == 0);
}
/**
* A placementhint gives an indication where it might be feasible to place
* this node. It is used by the layouter, and there is no guarantee that it
* will be used.
*
* @param hint
* x coordinate of the desired placement
*/
public void setPlacementHint(int hint) {
placementHint = hint;
}
/** get the current placementhint. */
public int getPlacementHint() {
return placementHint;
}
// Attributes
/**
* Constant to be used as an initializer when this node has no rank assigned
* yet.
*/
public static final int NORANK = -1;
/**
* Attribute _rank represents the current rank of this node.
*/
private int rank = NORANK;
/**
* Constant to be used as an initializer when this node is not placed at an
* column.
*/
public static final int NOCOLUMN = -1;
/**
* Attribute _column represents the current column of this node.
*/
private int column = NOCOLUMN;
/**
* Attribute _uplinks represents the links I consider as an 'uplink'. An
* uplink is a link going to a superclass or a interface that this class
* implements. Figures that are usually placed above this figure.
*/
private Vector uplinks = new Vector();
/**
* Attribute _downlinks represents the links I consider as an 'downlink'.
* The opposite of an uplink. See explanation above.
*/
private Vector downlinks = new Vector();
/**
* Attribute _figure represents the figure, that this ClassdiagramNode
* represents during the layout process.
*/
private FigNode figure = null;
/**
* This attributes stores the 'weight' of this node. This is a computed
* attribute that is used during the horizontal placement process. It's
* based on the position of the 'uplinked' objects. The actual purpose is to
* minimize the number of link crossings in the diagram. Since we don't
* compute the actual number of link crossings, we look where our uplinked
* objects are, and then try to place our object in a way, that we can
* expect to have a minimal number of crossings.
*/
private float weight = 1;
/**
* a Node is movable when it has associations and no up- or downlinks. The
* logic behind this is, that we would like to move nodes which were skipped
* during the rankking process to a position where they are as close as
* possible to the respective(s) nodes they share an association to
*/
private boolean movable = false;
private int placementHint = -1;
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.