/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* Edge.java
* Copyright (C) 1999 University of Waikato, Hamilton, New Zealand
*
*/
package weka.gui.treevisualizer;
import java.util.*;
import java.awt.*;
/**
* This class is used in conjunction with the Node class to form a tree
* structure.
* This in particular contains information about an edges in the tree.
*
* @author Malcolm Ware (mfw4@cs.waikato.ac.nz)
* @version $Revision: 1.4 $
*/
public class Edge {
/** The text caption for the edge. */
private String m_label;
/** The ID string of the parent Node of this edge (used for consrtuction
* purposes). */
private String m_rsource;
/** The ID string of the child Node of this edge (used for construction
* purposes). */
private String m_rtarget;
/** The parent Node of this edge. */
private Node m_source;
/** The child Node of this edge. */
private Node m_target;
/** The label broken up into lines. */
private Vector m_lines;
/**
* This constructs an Edge with the specified label
* and parent , child serial tags.
*
* @param label The text caption for the edge.
* @param source The ID string for this edges parent.
* @param target The ID string for this edges child.
*/
public Edge(String label,String source,String target) {
m_label = label;
m_rsource = source;
m_rtarget = target;
m_lines = new Vector(3,2);
breakupLabel();
}
/**
* Get the value of label.
*
* @return Value of label.
*/
public String getLabel() {
return m_label;
}
/**
* This function is called to break the label of the edge up in to
* seperate lines
*/
private void breakupLabel() {
int prev = 0,noa;
for (noa = 0;noa < m_label.length();noa++) {
if (m_label.charAt(noa) == '\n') {
m_lines.addElement(m_label.substring(prev,noa));
prev = noa+1;
}
}
m_lines.addElement(m_label.substring(prev,noa));
}
/**
* This will calculate how large a rectangle using the FontMetrics
* passed that the lines of the label will take up
*
* @param f The size information for a particular Font
* @return A Dimension containing the size and width of the text
*/
public Dimension stringSize(FontMetrics f) {
Dimension d = new Dimension();
int old = 0;
String s;
int noa = 0;
while ((s = getLine(noa)) != null) {
noa++;
old = f.stringWidth(s);
if (old > d.width) {
d.width = old;
}
}
d.height = noa * f.getHeight();
return d;
}
/**
* Returns line number n
*
* @param n The number of the line requested
* @return The string for the line number or NULL if it didn't exist
*/
public String getLine(int n) {
if (n < m_lines.size()) {
return (String)m_lines.elementAt(n);
}
else {
return null;
}
}
/**
* Get the value of rsource.
*
* @return Value of rsource.
*/
public String getRsource() {
return m_rsource;
}
/**
* Set the value of rsource.
*
* @param v Value to assign to rsource.
*/
public void setRsource(String v) {
m_rsource = v;
}
/**
* Get the value of rtarget.
*
* @return Value of rtarget.
*/
public String getRtarget() {
return m_rtarget;
}
/**
* Set the value of rtarget.
*
* @param v Value to assign to rtarget.
*/
public void setRtarget(String v) {
m_rtarget = v;
}
/**
* Get the value of source.
*
* @return Value of source.
*/
public Node getSource() {
return m_source;
}
/**
* Set the value of source. And then call v.addChild to add the edge to
* the Node.
*
* @param v Value to assign to source.
*/
public void setSource(Node v) {
m_source = v;
v.addChild(this);
}
/**
* Get the value of target.
*
* @return Value of target.
*/
public Node getTarget() {
return m_target;
}
/**
* Set the value of target. And then call v.addParent to add the edge to
* the Node.
*
* @param v Value to assign to target.
*/
public void setTarget(Node v) {
m_target = v;
v.setParent(this);
}
}