Importing release version 322 from old repos
This commit is contained in:
726
src/wsi/ra/chart2d/DArea.java
Normal file
726
src/wsi/ra/chart2d/DArea.java
Normal file
@@ -0,0 +1,726 @@
|
||||
/**
|
||||
* Filename: $RCSfile: DArea.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:41 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/*==========================================================================*
|
||||
* IMPORTS
|
||||
*==========================================================================*/
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.Border;
|
||||
import java.util.Vector;
|
||||
|
||||
// zum Drucken:
|
||||
import java.awt.print.*;
|
||||
import wsi.ra.print.PagePrinter;
|
||||
|
||||
/*==========================================================================*
|
||||
* CLASS DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
/**
|
||||
* DArea is the crossing of the <code>JComponent</code>s and the
|
||||
* <code>DComponent</code>s. It's the <code>DParent</code> which can be added to
|
||||
* <code>JComponent</code>s
|
||||
*/
|
||||
public class DArea extends JComponent implements DParent, Printable
|
||||
{
|
||||
private static final boolean under_construction = false;
|
||||
|
||||
/**
|
||||
* the default minimal rectangle which is shown
|
||||
*/
|
||||
public static final DRectangle DEFAULT_MIN_RECT = new DRectangle(-1, -1, 2, 2);
|
||||
|
||||
|
||||
/**
|
||||
* the container in which all DElements of the area are contained except
|
||||
* the grid
|
||||
*/
|
||||
private DContainer container;
|
||||
|
||||
/**
|
||||
* min_rectangle is set, when all elements are removed
|
||||
* the intersection of visible_rect and max_rectangle is the currently visible
|
||||
* rectangle
|
||||
*/
|
||||
protected DRectangle min_rect = DEFAULT_MIN_RECT,
|
||||
visible_rect = DEFAULT_MIN_RECT;
|
||||
|
||||
protected Double min_x, min_y, max_x, max_y;
|
||||
|
||||
/**
|
||||
* the grid of the area
|
||||
*/
|
||||
private DGrid grid;
|
||||
|
||||
private boolean auto_focus = false,
|
||||
auto_grid = false,
|
||||
grid_to_front = false;
|
||||
|
||||
/**
|
||||
* maximal number of grid lines
|
||||
*/
|
||||
private int max_grid = 10;
|
||||
|
||||
/**
|
||||
* the measures of the area
|
||||
* it calculates the coordinates
|
||||
*/
|
||||
private DMeasures measures;
|
||||
|
||||
|
||||
private DBorder dborder = new DBorder();
|
||||
|
||||
/**
|
||||
* initializes the DArea with the initial capacity of 10 components
|
||||
*/
|
||||
public DArea(){
|
||||
this( 10 );
|
||||
}
|
||||
|
||||
/**
|
||||
* initializes the DArea with the specialized initial capacity of components
|
||||
* (@see java.util.Vector)
|
||||
*
|
||||
* @param the initial capacity
|
||||
*/
|
||||
public DArea( int initial_capacity ){
|
||||
container = new DContainer();
|
||||
container.setDParent( this );
|
||||
grid = new DGrid( visible_rect, 1, 1 );
|
||||
grid.setVisible( false );
|
||||
grid.setDParent( this );
|
||||
measures = new DMeasures( this );
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the currently visible rectangle in DArea coordinates
|
||||
*
|
||||
* @return DRectangle the size and position of the visible area
|
||||
*/
|
||||
public DRectangle getDRectangle(){
|
||||
DRectangle rect = (DRectangle)visible_rect.clone();
|
||||
if( min_x != null ) rect.x = Math.max(rect.x, getMinX() );
|
||||
if( min_y != null ) rect.y = Math.max(rect.y, getMinY() );
|
||||
if( max_x != null ) rect.width = Math.min(rect.width, getMaxX() - getMinX());
|
||||
if( max_y != null ) rect.height = Math.min(rect.height, getMaxY() - getMinY());
|
||||
return rect;
|
||||
}
|
||||
|
||||
/**
|
||||
* switches the auto focus of this DArea on or off
|
||||
*
|
||||
* @param b on or off
|
||||
*/
|
||||
public void setAutoFocus( boolean b ){
|
||||
boolean old = auto_focus;
|
||||
auto_focus = b;
|
||||
if( old != b ) repaint();
|
||||
}
|
||||
|
||||
/**
|
||||
* returns whether the DArea's auto focus is on or not
|
||||
*
|
||||
* @return <code>true</code> or <code>false</code>
|
||||
*/
|
||||
public boolean isOnAutoFocus(){ return auto_focus; }
|
||||
|
||||
/**
|
||||
* sets the visible rectangle to this size
|
||||
*
|
||||
* @param x the x coordinate of the left border
|
||||
* @param y the y coordinate of the bottom border
|
||||
* @param width the width of the area
|
||||
* @param height the height of the area
|
||||
*/
|
||||
public void setVisibleRectangle( double x, double y, double width, double height ){
|
||||
//System.out.println("DArea.setVisibleRectangle(...)");
|
||||
setVisibleRectangle( new DRectangle( x, y, width, height ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* sets the visible rectangle
|
||||
*
|
||||
* @param rect the visible <code>DRectangle</code> in DArea coordinates
|
||||
*/
|
||||
public void setVisibleRectangle( DRectangle rect ){
|
||||
if( under_construction )System.out.println("DArea.setVisibleRectangle(DRectangle)");
|
||||
if( rect.isEmpty() ) throw
|
||||
new IllegalArgumentException(
|
||||
"You shopuld never try to set an empty rectangle\n"
|
||||
+ "as the visible rectangle of an DArea" );
|
||||
|
||||
if( !rect.equals( visible_rect ) && rect.width > 0 && rect.height > 0 ){
|
||||
auto_focus = false;
|
||||
visible_rect = (DRectangle)rect.clone();
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* sets the minimal rectangle
|
||||
*
|
||||
* @param x
|
||||
* @param y
|
||||
* @param width
|
||||
* @param height
|
||||
*/
|
||||
public void setMinRectangle( double x, double y, double width, double height ){
|
||||
setMinRectangle( new DRectangle( x, y, width, height ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* sets the minimal rectangle
|
||||
*
|
||||
* @param rect the visible <code>DRectangle</code> in DArea coordinates
|
||||
*/
|
||||
public void setMinRectangle( DRectangle rect ){
|
||||
if( rect.isEmpty() ) min_rect = DEFAULT_MIN_RECT;
|
||||
else min_rect = (DRectangle)rect.clone();
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the minimal rectangle which is set as the visible when all
|
||||
* elements are removed and the area is on auto focus
|
||||
*
|
||||
* @return the minmal rectangle
|
||||
*/
|
||||
public DRectangle getMinRectangle(){
|
||||
return (DRectangle)min_rect.clone();
|
||||
}
|
||||
|
||||
/**
|
||||
* method sets the maximal rectangle whioch can be viewed with the
|
||||
* DArea. This method can be used if the area is used with scale functions
|
||||
* which are not invertible on all reals
|
||||
*
|
||||
* @param x the minmal x value
|
||||
* @param y the minmal y value
|
||||
* @param width of the maximal rectangle
|
||||
* @param height of the maximal rectangle
|
||||
*/
|
||||
public void setMaxRectangle( double x, double y, double width, double height ){
|
||||
setMaxRectangle( new DRectangle( x, y, width, height ) );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* method sets the maximal rectangle whioch can be viewed with the
|
||||
* DArea. This method can be used if the area is used with scale functions
|
||||
* which are not invertible on all reals
|
||||
*
|
||||
* @param the rect maximal rectangle of the DArea
|
||||
* @deprecated see setMinX, setMinY, setMaxX, setMaxY
|
||||
*/
|
||||
public void setMaxRectangle( DRectangle rect ){
|
||||
if( !rect.contains( min_rect ) ) throw
|
||||
new IllegalArgumentException("Maximal rectangle does not contain minmal rectangle");
|
||||
|
||||
setMinX( rect.x );
|
||||
setMinY( rect.y );
|
||||
setMaxX( rect.x + rect.width );
|
||||
setMaxY( rect.y + rect.height );
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the maximal rectangle of the area
|
||||
*
|
||||
* @return the maximal rectangle
|
||||
* @deprecated see getMaxX, getMaxY, getMinX, getMinY
|
||||
*/
|
||||
public DRectangle getMaxRectangle(){
|
||||
return new DRectangle(min_x.doubleValue(),
|
||||
min_y.doubleValue(),
|
||||
max_x.doubleValue() - min_x.doubleValue(),
|
||||
max_y.doubleValue() - min_y.doubleValue() );
|
||||
}
|
||||
|
||||
/**
|
||||
* method sets the minimal x-value which can be displayed by the DArea
|
||||
* might be helpful, if scale functions are used which are not defined overall
|
||||
*
|
||||
* @param mix the minimal x-value
|
||||
*/
|
||||
public void setMinX( double mix ){
|
||||
if( mix > min_rect.x ) throw
|
||||
new IllegalArgumentException(
|
||||
"Mimimal y-value axes intersects minmal rectangle.");
|
||||
min_x = new Double( mix );
|
||||
}
|
||||
|
||||
/**
|
||||
* method resets the minimal x-value
|
||||
*/
|
||||
public void releaseMinX(){
|
||||
min_x = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the minmal x-value which can be displayed in the DArea
|
||||
*
|
||||
* @return the minmal x-value
|
||||
*/
|
||||
public double getMinX(){
|
||||
if( min_x != null ) return min_x.doubleValue();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* method sets the minimal y-value which can be displayed by the DArea
|
||||
* might be helpful, if scale functions are used which are not defined overall
|
||||
*
|
||||
* @param miy the minimal y-value
|
||||
*/
|
||||
public void setMinY( double miy ){
|
||||
if( miy > min_rect.y ) throw
|
||||
new IllegalArgumentException(
|
||||
"Mimimal y-value axes intersects minmal rectangle.");
|
||||
min_y = new Double( miy );
|
||||
}
|
||||
|
||||
/**
|
||||
* method resets the minimal y-value
|
||||
*/
|
||||
public void releaseMinY(){
|
||||
min_y = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the minmal y-value which can be displayed in the DArea
|
||||
*
|
||||
* @return the minmal y-value
|
||||
*/
|
||||
public double getMinY(){
|
||||
if( min_y != null ) return min_y.doubleValue();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* method sets the maximal x-value which can be displayed by the DArea
|
||||
* might be helpful, if scale functions are used which are not defined overall
|
||||
*
|
||||
* @param max the maximal x-value
|
||||
*/
|
||||
public void setMaxX( double max ){
|
||||
if( max < min_rect.x + min_rect.width ) throw
|
||||
new IllegalArgumentException(
|
||||
"Maximal x-value axes intersects minmal rectangle.");
|
||||
max_x = new Double( max );
|
||||
}
|
||||
|
||||
/**
|
||||
* method resets the maximal x-value
|
||||
*/
|
||||
public void releaseMaxX(){
|
||||
max_x = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the maxmal x-value which can be displayed in the DArea
|
||||
*
|
||||
* @return the maxmal x-value
|
||||
*/
|
||||
public double getMaxX(){
|
||||
if( max_x != null ) return max_x.doubleValue();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* method sets the maximal y-values which can be displayed by the DArea
|
||||
* might be helpful, if scale functions are used which are not defined overall
|
||||
*
|
||||
* @param may the maximal y-value
|
||||
*/
|
||||
public void setMaxY( double may ){
|
||||
if( may < min_rect.y + min_rect.height ) throw
|
||||
new IllegalArgumentException(
|
||||
"Maximal y-value axes intersects minmal rectangle.");
|
||||
max_y = new Double( may );
|
||||
}
|
||||
|
||||
/**
|
||||
* method resets the maximal y-value
|
||||
*/
|
||||
public void releaseMaxY(){
|
||||
max_y = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the maximal y-value which can be displayed in the DArea
|
||||
*
|
||||
* @return the maximal y-value
|
||||
*/
|
||||
public double getMaxY(){
|
||||
if( max_y != null ) return max_y.doubleValue();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* paints the DArea by a Graphics object
|
||||
*
|
||||
* @param g the java.awt.Graphics object
|
||||
*/
|
||||
public void paint( Graphics g ){
|
||||
if( under_construction ) System.out.println("DArea.paint(Graphics)");
|
||||
if( auto_focus ) {
|
||||
container.restore();
|
||||
visible_rect = (DRectangle)container.getRectangle().clone();
|
||||
}
|
||||
if( visible_rect.isEmpty() ) visible_rect = (DRectangle)min_rect.clone();
|
||||
super.paint( g );
|
||||
|
||||
measures.setGraphics( g );
|
||||
if( grid.isVisible() && !grid_to_front ) paintGrid( measures );
|
||||
container.paint( measures );
|
||||
if( grid.isVisible() && grid_to_front ) paintGrid( measures );
|
||||
}
|
||||
|
||||
/**
|
||||
* repaints a part of the visible area
|
||||
*
|
||||
* @param r the rectangle to repaint
|
||||
*/
|
||||
public void repaint( DRectangle r ){
|
||||
if( under_construction ) System.out.println("DArea.repaint(DRectangle)"+r);
|
||||
if( r == null ) throw
|
||||
new IllegalArgumentException("Cannot repaint a null DRectangle");
|
||||
if( r.isAll() || auto_focus ) repaint();
|
||||
else{
|
||||
Point p1 = measures.getPoint( r.x, r.y ),
|
||||
p2 = measures.getPoint( r.x + r.width, r.y + r.height);
|
||||
if( p1 == null || p2 == null ) repaint();
|
||||
else {
|
||||
DBorder b = getDBorder();
|
||||
repaint( p1.x - b.left,
|
||||
p2.y - b.top,
|
||||
p2.x - p1.x + 1 + b.left + b.right,
|
||||
p1.y - p2.y + 1 + b.top + b.bottom );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* adds a new component to the area
|
||||
*
|
||||
* @param e the new DElement
|
||||
*/
|
||||
public void addDElement( DElement e ){
|
||||
container.addDElement( e );
|
||||
}
|
||||
|
||||
/**
|
||||
* removes a certain element from the area
|
||||
*
|
||||
* @param e the element to remove
|
||||
*/
|
||||
public boolean removeDElement( DElement e ){
|
||||
return container.removeDElement( e );
|
||||
}
|
||||
|
||||
/**
|
||||
* removes all elements from the area
|
||||
*/
|
||||
public void removeAllDElements()
|
||||
{
|
||||
visible_rect = (DRectangle)min_rect.clone();
|
||||
container.removeAllDElements();
|
||||
}
|
||||
|
||||
/**
|
||||
* returnes all DElements in the container
|
||||
*
|
||||
* @return the elements of the container
|
||||
*/
|
||||
public DElement[] getDElements(){
|
||||
return container.getDElements();
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns true, if the given element is contained in the container
|
||||
*
|
||||
* @param e the element
|
||||
* @return if it is contained
|
||||
*/
|
||||
public boolean contains( DElement e ){
|
||||
return container.contains( e );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* sets the grid visible or not
|
||||
*
|
||||
* @param aFlag visible or not
|
||||
*/
|
||||
public void setGridVisible( boolean aFlag ){
|
||||
if( under_construction ) System.out.println("DArea.setGridVisisble: "+aFlag);
|
||||
grid.rectangle = getDRectangle();
|
||||
grid.setVisible( aFlag );
|
||||
}
|
||||
|
||||
/**
|
||||
* returns if the grid is visible
|
||||
* <code>true</code> if the grid is visible or <code>false</code> if not
|
||||
*
|
||||
* @return true or false
|
||||
*/
|
||||
public boolean isGridVisible(){
|
||||
return grid.isVisible();
|
||||
}
|
||||
|
||||
/**
|
||||
* sets the grid to the front
|
||||
* that means that the grid is painted as last element
|
||||
* default value is <code>false</code>
|
||||
*
|
||||
* @param aFlag grid t front or not
|
||||
*/
|
||||
public void setGridToFront( boolean aFlag ){
|
||||
boolean old = grid_to_front;
|
||||
grid_to_front = aFlag;
|
||||
if( old != aFlag && grid.isVisible() ) repaint();
|
||||
}
|
||||
|
||||
/**
|
||||
* sets the grid's horizontal and vertical distance
|
||||
* that means that the grid's lines will have these distances
|
||||
* in area coordinates
|
||||
*
|
||||
* @param hor_dist the horizontal distance
|
||||
* @param ver_dist the vertical distance
|
||||
*/
|
||||
public void setGrid( double hor_dist, double ver_dist ){
|
||||
grid = new DGrid( visible_rect, hor_dist, ver_dist );
|
||||
grid.setDParent( this );
|
||||
auto_grid = false;
|
||||
repaint();
|
||||
}
|
||||
|
||||
/**
|
||||
* sets the auto grid on or off
|
||||
* if it's on, the grid's distances (@see #setGrid(double, double))
|
||||
* are automatically calculated
|
||||
*
|
||||
* @param b auto grid on or not
|
||||
*/
|
||||
public void setAutoGrid( boolean b ){
|
||||
if( b ) {
|
||||
grid.rectangle = getDRectangle();
|
||||
grid.setVisible( true );
|
||||
}
|
||||
if( b == auto_grid ) return;
|
||||
auto_grid = b;
|
||||
repaint();
|
||||
}
|
||||
|
||||
/**
|
||||
* returns if the auto grid is switched on
|
||||
*
|
||||
* @return true if the grid is on, else false
|
||||
*/
|
||||
public boolean hasAutoGrid(){ return auto_grid; }
|
||||
|
||||
/**
|
||||
* sets the color of the grid
|
||||
*
|
||||
* @param java.awt.Color
|
||||
*/
|
||||
public void setGridColor( Color color ){
|
||||
grid.setColor( color );
|
||||
}
|
||||
|
||||
/**
|
||||
* sets the maximal number of grid lines
|
||||
* default value is 10
|
||||
*
|
||||
* @param no maximal number of grid lines
|
||||
*/
|
||||
public void setMaxGrid( int no ){
|
||||
if( no < 1 ) return;
|
||||
int old = max_grid;
|
||||
max_grid = no;
|
||||
if( old != no ) repaint();
|
||||
}
|
||||
|
||||
/**
|
||||
* prints the area and it's content
|
||||
* @see java.awt.print.Printable and
|
||||
* @see java.awt.print.PrintJob
|
||||
*
|
||||
* @param g the Graphics object
|
||||
* @param pf the @see java.awt.print.PageFormat
|
||||
* @param pi the page index
|
||||
*
|
||||
* @return int @see java.awt.print.Printable
|
||||
*/
|
||||
public int print( Graphics g, PageFormat pf, int pi ){
|
||||
if( under_construction ) System.out.println("DArea.print(...)");
|
||||
if( pi > 0 ) return Printable.NO_SUCH_PAGE;
|
||||
|
||||
Border sb = getBorder();
|
||||
if( !(sb instanceof ScaledBorder) ) sb = null;
|
||||
else ( (ScaledBorder)sb ).show_outer_border = false;
|
||||
PagePrinter printer = new PagePrinter( this, g, pf );
|
||||
int ret = printer.print();
|
||||
if( sb != null ) ( (ScaledBorder)sb ).show_outer_border = true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* sets a new scale function to the x-axis
|
||||
* That means that not the standard linear scale is shown but the image
|
||||
* of the linear scale under the given function
|
||||
*
|
||||
* @param x_s the scale function for the x-axis
|
||||
*/
|
||||
public void setXScale( DFunction x_s ){
|
||||
if( x_s == null && measures.x_scale == null ) return;
|
||||
measures.x_scale = x_s;
|
||||
repaint();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* sets a new scale function to the y-axis
|
||||
* That means that not the standard linear scale is shown but the image
|
||||
* of the linear scale under the given function
|
||||
*
|
||||
* @param y_s the scale function for the y-axis
|
||||
*/
|
||||
public void setYScale( DFunction y_s ){
|
||||
if( y_s == null && measures.y_scale == null ) return;
|
||||
measures.y_scale = y_s;
|
||||
repaint();
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the measures of the DArea
|
||||
* The DMeasures object calculates the different coodinates and contains a
|
||||
* Graphics object to paint the DElements of the area
|
||||
*
|
||||
* @return the measures of the DArea
|
||||
*/
|
||||
public DMeasures getDMeasures(){
|
||||
return measures;
|
||||
}
|
||||
|
||||
/**
|
||||
* method 'adds' a certain border around the contained rectangle
|
||||
* that means that it takes the old border
|
||||
* and takes the maxima of the old and the new values
|
||||
*
|
||||
* @param clip the java.awt.Insets object of the new clip
|
||||
*/
|
||||
public void addDBorder( DBorder b ){
|
||||
dborder.insert(b);
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the current border around the rectangle
|
||||
*
|
||||
* @return the border
|
||||
*/
|
||||
public DBorder getDBorder(){
|
||||
return dborder;
|
||||
}
|
||||
|
||||
public void restoreBorder(){
|
||||
dborder = container.getDBorder();
|
||||
if( under_construction ) System.out.println("DArea.restoreBorder -> "+dborder);
|
||||
}
|
||||
|
||||
/**
|
||||
* method paints the grid
|
||||
* how the method paints the grid depends on whether the area is wrapped in a
|
||||
* <code>ScaledBorder</code> or not and on the auto_grid option
|
||||
*/
|
||||
private void paintGrid( DMeasures m ){
|
||||
if( under_construction ) System.out.println("DArea.paintGrid(DMeasures)");
|
||||
grid.rectangle = getDRectangle();
|
||||
if( auto_grid ){
|
||||
Border b = getBorder();
|
||||
if( b instanceof ScaledBorder ){
|
||||
ScaledBorder sb = (ScaledBorder)b;
|
||||
paintGrid( sb, m );
|
||||
return;
|
||||
}
|
||||
else{
|
||||
grid.hor_dist = ScaledBorder.aBitBigger( grid.rectangle.width / max_grid );
|
||||
grid.ver_dist = ScaledBorder.aBitBigger( grid.rectangle.height / max_grid );
|
||||
}
|
||||
}
|
||||
grid.paint( m );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* paints the grid when auto_grid is selected and the area is surrounded
|
||||
* by an instance of ScaledBorder
|
||||
*
|
||||
* @param sb the ScaledBorder around the area
|
||||
* @param m the measures of the area
|
||||
*/
|
||||
private void paintGrid(ScaledBorder sb, DMeasures m){
|
||||
if( under_construction ) System.out.println("DArea.paintGrid(ScaledBorder, DMeasures)");
|
||||
Dimension d = getSize();
|
||||
FontMetrics fm = m.getGraphics().getFontMetrics();
|
||||
grid.hor_dist = sb.getSrcdX(fm, d);
|
||||
grid.ver_dist = sb.getSrcdY(fm, d);
|
||||
|
||||
if( m.x_scale == null && m.y_scale == null ) grid.paint( m );
|
||||
|
||||
else{// selber malen
|
||||
Graphics g = m.g;
|
||||
g.setColor( grid.getColor() );
|
||||
|
||||
DRectangle rect = getDRectangle(),
|
||||
src_rect = m.getSourceOf( rect );
|
||||
|
||||
int x = (int)(src_rect.x / grid.hor_dist),
|
||||
y = (int)(src_rect.y / grid.ver_dist);
|
||||
if( x * grid.hor_dist < src_rect.x ) x++;
|
||||
if( y * grid.ver_dist < src_rect.y ) y++;
|
||||
|
||||
DPoint min = new DPoint( rect.x, rect.y ),
|
||||
max = new DPoint( min.x + rect.width, min.y + rect.height );
|
||||
|
||||
double pos;
|
||||
|
||||
for( ; (pos = x * grid.hor_dist) < src_rect.x + src_rect.width; x++ ){
|
||||
if( m.x_scale != null ) pos = m.x_scale.getImageOf( pos );
|
||||
Point p1 = m.getPoint( pos, min.y ),
|
||||
p2 = m.getPoint( pos, max.y );
|
||||
g.drawLine( p1.x, p1.y, p2.x, p2.y );
|
||||
}
|
||||
|
||||
for( ; (pos = y * grid.ver_dist) < src_rect.y + src_rect.height; y++ ){
|
||||
if( m.y_scale != null ) pos = m.y_scale.getImageOf( pos );
|
||||
Point p1 = m.getPoint( min.x, pos ),
|
||||
p2 = m.getPoint( max.x, pos );
|
||||
g.drawLine( p1.x, p1.y, p2.x, p2.y );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************/
|
205
src/wsi/ra/chart2d/DArray.java
Normal file
205
src/wsi/ra/chart2d/DArray.java
Normal file
@@ -0,0 +1,205 @@
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/**
|
||||
* Title:
|
||||
* Description:
|
||||
* Copyright: Copyright (c) 2001
|
||||
* Company:
|
||||
* @author
|
||||
* @version 1.0
|
||||
*/
|
||||
|
||||
/**
|
||||
* This class stores an array of double values.
|
||||
* It can be used as data stack for an DPointSet object.
|
||||
* For that use, it is important to tell the DPoitSet object, when the data has
|
||||
* been modified.
|
||||
*/
|
||||
public class DArray implements DIntDoubleMap{
|
||||
private int initial_capacity, size;
|
||||
private double capacity_multiplier = 2, max, min;
|
||||
private double[] value;
|
||||
|
||||
/**
|
||||
* Constructor for an DArray object with default values for the initial
|
||||
* capacity (5) and the capacity multiplier (2).
|
||||
*/
|
||||
public DArray(){
|
||||
this(5, 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor for an DArray object with default value for the capacity
|
||||
* multiplier (2).
|
||||
*
|
||||
* @param initial_capacity the initial capacity of the array
|
||||
*/
|
||||
public DArray(int initial_capacity){
|
||||
this(initial_capacity, 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor for an DArray object
|
||||
*
|
||||
* @param initial_capacity the initial capacity of the array
|
||||
* @param capacity_multiplier the capacity multiplier when the array overflows
|
||||
*/
|
||||
public DArray(int initial_capacity, double capacity_multiplier){
|
||||
if( initial_capacity < 1 ) throw
|
||||
new IllegalArgumentException("The initial capacity has to be at least 1");
|
||||
if( capacity_multiplier <= 1 ) throw
|
||||
new IllegalArgumentException("The capacity multiplier has to be bigger than 1");
|
||||
this.initial_capacity = initial_capacity;
|
||||
value = new double[initial_capacity];
|
||||
this.capacity_multiplier = capacity_multiplier;
|
||||
}
|
||||
|
||||
/**
|
||||
* method sets the image value to the given source value
|
||||
*
|
||||
* @param source the source value
|
||||
* @param image the image value
|
||||
*/
|
||||
public boolean setImage(int source, double image){
|
||||
if(source<0 || source>=size) throw
|
||||
new ArrayIndexOutOfBoundsException(source);
|
||||
boolean min_max_changed = false, restore = false;
|
||||
if( image < min ){ min = image; min_max_changed = true; }
|
||||
else if( image > max ){ max = image; min_max_changed = true; }
|
||||
if( value[source] == min || value[source] == max ) restore = true;
|
||||
value[source] = image;
|
||||
if( restore ) min_max_changed = restore() || min_max_changed;
|
||||
return min_max_changed;
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the image value of the given source value
|
||||
*
|
||||
* @param source the source value
|
||||
* @return the image value
|
||||
*/
|
||||
// public double getImage(int source){
|
||||
// if(source<0 || source>=size) throw
|
||||
// new ArrayIndexOutOfBoundsException(source);
|
||||
// return value[source];
|
||||
// }
|
||||
public double getImage(int source){
|
||||
if(source<0) new ArrayIndexOutOfBoundsException(source);
|
||||
if(source>=size && size > 1) return value[size-1];
|
||||
return value[source];
|
||||
}
|
||||
|
||||
/**
|
||||
* the given image value becomes the image of (highest source value + 1)
|
||||
*
|
||||
* @param image the new image value
|
||||
* @return <code>true<\code> when the minmal or the maximal image value
|
||||
* has been changed by this method call, else it returns
|
||||
* <code>false</code> @see #getMinImageValue(), #getMaxImageValue()
|
||||
*/
|
||||
public boolean addImage(double image){
|
||||
if( size >= value.length ){
|
||||
int new_length = (int)(value.length * capacity_multiplier);
|
||||
if( !(new_length > value.length) ) new_length++;
|
||||
double[] new_val = new double[new_length];
|
||||
System.arraycopy(value,0,new_val,0,value.length);
|
||||
value = new_val;
|
||||
}
|
||||
boolean min_max_changed = false;
|
||||
if( size == 0 ){ min = image; max = image; min_max_changed = true;}
|
||||
else
|
||||
if( image > max ) { max = image; min_max_changed = true; }
|
||||
else if( image < min ) { min = image; min_max_changed = true; }
|
||||
value[size++] = image;
|
||||
return min_max_changed;
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the number of (source,image)-pairs stored in the array
|
||||
*
|
||||
* @return the size of the source value set
|
||||
*/
|
||||
public int getSize(){
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* this method checks if the minimal and the maximal image value has changed
|
||||
*
|
||||
* @return <code>true</code> if one of them changed
|
||||
*/
|
||||
public boolean restore(){
|
||||
if( size == 0 ) return false;
|
||||
double old_min = min, old_max = max;
|
||||
min = value[0];
|
||||
max = value[0];
|
||||
for( int i=1; i<size; i++ )
|
||||
if( value[i] < min ) min = value[i];
|
||||
else if( value[i] > max ) max = value[i];
|
||||
return (old_min != min) || (old_max != max);
|
||||
}
|
||||
|
||||
/**
|
||||
* throws all information away
|
||||
*/
|
||||
public void reset(){
|
||||
size = 0;
|
||||
value = new double[initial_capacity];
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the minmal image value
|
||||
*
|
||||
* @return the minmal image value
|
||||
*/
|
||||
public double getMinImageValue(){
|
||||
if( size == 0 ) throw
|
||||
new IllegalArgumentException("DArray is empty. No minimal value exists");
|
||||
return min;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* returns the maxmal image value
|
||||
*
|
||||
* @return the maxmal image value
|
||||
*/
|
||||
public double getMaxImageValue(){
|
||||
if( size == 0 ) throw
|
||||
new IllegalArgumentException("DArray is empty. No maximal value exists");
|
||||
return max;
|
||||
}
|
||||
|
||||
/**
|
||||
* method checks if the given object is equal to this DArray object.
|
||||
* It looks for differences in the stored image values
|
||||
*
|
||||
* @param o the object to compare with
|
||||
* @return <code>true</code> when the object is an DArray object, containing
|
||||
* the same values
|
||||
*/
|
||||
public boolean equals(Object o){
|
||||
if( !(o instanceof DArray) ) return false;
|
||||
DArray comp = (DArray)o;
|
||||
if( comp.size != size ) return false;
|
||||
if( comp.max != max ) return false;
|
||||
if( comp.min != min ) return false;
|
||||
for( int i=0; i<size; i++ )
|
||||
if( comp.value[i] != value[i] ) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public String toString(){
|
||||
String text = "wsi.ra.chart2d.DArray[size:"+size;
|
||||
if( size < 11 )
|
||||
for( int i=0; i<size; i++ ) text += ", "+value[i];
|
||||
text += "]";
|
||||
return text;
|
||||
}
|
||||
|
||||
public double[] toArray(double[] v){
|
||||
if( v == null || v.length < size ) v = new double[size];
|
||||
System.arraycopy(value,0,v,0,size);
|
||||
return v;
|
||||
}
|
||||
}
|
45
src/wsi/ra/chart2d/DBorder.java
Normal file
45
src/wsi/ra/chart2d/DBorder.java
Normal file
@@ -0,0 +1,45 @@
|
||||
/**
|
||||
* Filename: $RCSfile: DBorder.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:41 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
import java.awt.Insets;
|
||||
|
||||
public class DBorder extends Insets{
|
||||
|
||||
public DBorder(){
|
||||
this( 0, 0, 0, 0 );
|
||||
}
|
||||
|
||||
public DBorder(int top, int left, int bottom, int right ){
|
||||
super( top, left, bottom, right );
|
||||
}
|
||||
|
||||
public boolean insert( DBorder b ){
|
||||
boolean changed = false;
|
||||
if( b.top > top ){ top = b.top; changed = true; }
|
||||
if( b.bottom > bottom ){ bottom = b.bottom; changed = true; }
|
||||
if( b.left > left ){ left = b.left; changed = true; }
|
||||
if( b.right > right ){ right = b.right; changed = true; }
|
||||
return changed;
|
||||
}
|
||||
|
||||
public boolean equals( Object o ){
|
||||
if( o instanceof DBorder )
|
||||
return super.equals( o );
|
||||
return false;
|
||||
}
|
||||
|
||||
public String toString(){
|
||||
return "wsi.ra.chart2d.DBorder[top="+top+",left="+left
|
||||
+",bottom="+bottom+",right="+right+"]";
|
||||
}
|
||||
}
|
159
src/wsi/ra/chart2d/DComponent.java
Normal file
159
src/wsi/ra/chart2d/DComponent.java
Normal file
@@ -0,0 +1,159 @@
|
||||
/**
|
||||
* Filename: $RCSfile: DComponent.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:41 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/*==========================================================================*
|
||||
* IMPORTS
|
||||
*==========================================================================*/
|
||||
|
||||
import java.awt.Color ;
|
||||
|
||||
/*==========================================================================*
|
||||
* CLASS DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
/**
|
||||
* <code>DComponent</code> is the mother of all objects which can be displayed
|
||||
* by a <code>DArea</code> object, even when it would be also enough to
|
||||
* implement the <code>DElement</code> interface to an class
|
||||
*
|
||||
* DComponent is abstract because the paint method has to be overridden
|
||||
*/
|
||||
public abstract class DComponent implements DElement
|
||||
{
|
||||
/**
|
||||
* the color of the component
|
||||
*/
|
||||
protected Color color;
|
||||
|
||||
/**
|
||||
* the rectangle in which the component lies
|
||||
*/
|
||||
protected DRectangle rectangle;
|
||||
|
||||
/**
|
||||
* the parent of the component which is responsible for repainting
|
||||
*/
|
||||
protected DParent parent;
|
||||
|
||||
|
||||
private boolean visible = true;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* this border respresents the additional space around the clip of the
|
||||
* graphics context, which is calculated by the union of all DRectangles of
|
||||
* the components. For example it is used by DPointIcons or DLabels.
|
||||
*/
|
||||
private DBorder border = new DBorder();
|
||||
|
||||
|
||||
/**
|
||||
* this constructor is necessary to avoid infinite loops in constructing
|
||||
* DRectangles
|
||||
*/
|
||||
DComponent(boolean is_rect){}
|
||||
|
||||
public DComponent(){ rectangle = DRectangle.getEmpty(); }
|
||||
|
||||
/**
|
||||
* returns the rectangle in which the object lies
|
||||
*/
|
||||
public DRectangle getRectangle(){
|
||||
return (DRectangle)rectangle.clone();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* method sets a certain border around the contained rectangle
|
||||
*
|
||||
* @param b the new DBorder
|
||||
*/
|
||||
public void setDBorder( DBorder b ){
|
||||
if( parent != null ) {
|
||||
if( border.insert(b) ) { parent.addDBorder( b ); repaint(); }
|
||||
else { border = b; parent.restoreBorder(); }
|
||||
}
|
||||
else border = b;
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the current border around the rectangle
|
||||
*
|
||||
* @return the DBorder of the DComponent
|
||||
*/
|
||||
public DBorder getDBorder(){
|
||||
return border;
|
||||
}
|
||||
|
||||
/**
|
||||
* sets the parent of the component, which should take care of painting the
|
||||
* component to the right time
|
||||
*/
|
||||
public void setDParent( DParent parent ){
|
||||
if( this.parent != null && this.parent != parent ){
|
||||
this.parent.removeDElement( this );
|
||||
this.parent.repaint( getRectangle() );
|
||||
}
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the parent of the component
|
||||
*/
|
||||
public DParent getDParent(){ return parent; }
|
||||
|
||||
/**
|
||||
* invoces the parent to repaint the rectangle in which the component lies
|
||||
*/
|
||||
public void repaint(){
|
||||
//System.out.println("DComponent.repaint()");
|
||||
if( parent != null ) parent.repaint( getRectangle() );
|
||||
}
|
||||
|
||||
/**
|
||||
* sets the color of the component
|
||||
*/
|
||||
public void setColor( Color color ){
|
||||
if( this.color == null || !this.color.equals( color ) ) {
|
||||
this.color = color;
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the color of the component
|
||||
*/
|
||||
public Color getColor(){ return color; }
|
||||
|
||||
/**
|
||||
* sets the component visible or not
|
||||
*/
|
||||
public void setVisible( boolean aFlag ){
|
||||
boolean changed = ( aFlag != visible );
|
||||
visible = aFlag;
|
||||
if( changed ) repaint();
|
||||
}
|
||||
|
||||
/**
|
||||
* returns if the component should be visible when the parent shows the right
|
||||
* area
|
||||
*/
|
||||
public boolean isVisible(){ return visible; }
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************/
|
223
src/wsi/ra/chart2d/DContainer.java
Normal file
223
src/wsi/ra/chart2d/DContainer.java
Normal file
@@ -0,0 +1,223 @@
|
||||
/**
|
||||
* Filename: $RCSfile: DContainer.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:41 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/*==========================================================================*
|
||||
* IMPORTS
|
||||
*==========================================================================*/
|
||||
|
||||
import java.util.Vector ;
|
||||
import java.awt.Color ;
|
||||
import java.awt.Graphics;
|
||||
|
||||
/*==========================================================================*
|
||||
* CLASS DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
public class DContainer extends DComponent implements DParent{
|
||||
/**
|
||||
* the elements of the container and their keys ( Strings )
|
||||
*/
|
||||
protected Vector elements, keys;
|
||||
|
||||
public DContainer(){ this(10); }
|
||||
|
||||
public DContainer(int initial_capacity){
|
||||
super();
|
||||
elements = new Vector(initial_capacity);
|
||||
keys = new Vector(initial_capacity);
|
||||
}
|
||||
|
||||
public void repaint( DRectangle r ){
|
||||
DParent parent = getDParent();
|
||||
if( parent != null ) parent.repaint( r );
|
||||
}
|
||||
|
||||
/**
|
||||
* method adds a new DElement to the container
|
||||
* if the container already contains this element, the method simply returns
|
||||
* the method checks whether the DElement is an ancestor of the container
|
||||
* itself. In that case it throws an IllegalArgumentException.
|
||||
*
|
||||
* @param e the new DElement to add
|
||||
*/
|
||||
public void addDElement( DElement e ){
|
||||
addDElement( null, e );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* method adds a new DElement to the container by a certain key name
|
||||
* if the container already contains this element, the method simply returns
|
||||
* the method checks whether the DElement is an ancestor of the container
|
||||
* itself. In that case it throws an IllegalArgumentException.
|
||||
*
|
||||
* @param key the name of the DElement in the container
|
||||
* @param e the new DElement to add
|
||||
*/
|
||||
public void addDElement( String key, DElement e ){
|
||||
if( elements.contains( e ) ) return;
|
||||
if( e instanceof DParent ){
|
||||
DParent he = (DParent)e, me = (DParent)this;
|
||||
if( he == me ) throw new
|
||||
IllegalArgumentException("Adding DParent to itself");
|
||||
me = getDParent();
|
||||
while( me != null ){
|
||||
if( he == me )throw new
|
||||
IllegalArgumentException("Adding DContainer's parent to itself");
|
||||
if( me instanceof DElement )
|
||||
me = ((DElement)me).getDParent();
|
||||
else me = null;
|
||||
}
|
||||
}
|
||||
elements.add( e );
|
||||
addDBorder( e.getDBorder() );
|
||||
keys.add( key );
|
||||
e.setDParent( this );
|
||||
DRectangle r = e.getRectangle();
|
||||
rectangle.insert( r );
|
||||
if( e.isVisible() ) repaint( r );
|
||||
}
|
||||
|
||||
/**
|
||||
* method removes a certain DElement from the container an returns whether it
|
||||
* contained it before
|
||||
*
|
||||
* @param e the DElement to remove
|
||||
* @return if this was possible
|
||||
*/
|
||||
public boolean removeDElement( DElement e ){
|
||||
int index = elements.indexOf( e );
|
||||
if( index > -1 ){
|
||||
elements.remove( index );
|
||||
keys.remove( index );
|
||||
repaint( e.getRectangle() );
|
||||
restore();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* method removes all DElements from the container
|
||||
*/
|
||||
public void removeAllDElements()
|
||||
{
|
||||
elements.removeAllElements();
|
||||
keys.removeAllElements();
|
||||
rectangle = DRectangle.getEmpty();
|
||||
repaint();
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns all DElements of the container
|
||||
*
|
||||
* @return the elements of the container
|
||||
*/
|
||||
public DElement[] getDElements(){
|
||||
DElement[] es = new DElement[ elements.size() ];
|
||||
elements.toArray(es);
|
||||
return es;
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the first DElement of the contaioner belonging to
|
||||
* the given key
|
||||
*
|
||||
* @param key the name of the DElement in the container
|
||||
* @return the element when it could be found or null else
|
||||
*/
|
||||
public DElement getDElement( String key ){
|
||||
int index = -1;
|
||||
for( int i=0; index == -1 && i < keys.size(); i++ )
|
||||
if( ((String)keys.get(i)).equals( key ) ) index = i;
|
||||
return (index<keys.size())? (DElement)elements.get(index):(DElement)null;
|
||||
}
|
||||
|
||||
// implementing DComponent:
|
||||
/**
|
||||
* method calls all currently visible DElements of the container to paint
|
||||
* themselves by the given DMeasures object
|
||||
*
|
||||
* @param m the DMeasures object
|
||||
*/
|
||||
public void paint( DMeasures m ){
|
||||
DElement e;
|
||||
for( int i=0; i<elements.size(); i++ ){
|
||||
e = (DElement)elements.elementAt(i);
|
||||
if( e.isVisible() && !m.getDRectangle().getIntersection( e.getRectangle() ).isEmpty()){
|
||||
m.g.setColor( DEFAULT_COLOR );
|
||||
e.paint( m );
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* method returns true, if the given element is contained in the container
|
||||
*
|
||||
* @param e the element
|
||||
* @return if it is contained
|
||||
*/
|
||||
public boolean contains( DElement e ){
|
||||
return elements.contains( e );
|
||||
}
|
||||
|
||||
/**
|
||||
* method sets the given color to all contained DElements of the container
|
||||
*
|
||||
* @param c the new Color of the elements
|
||||
*/
|
||||
public void setColor(Color c){
|
||||
for( int i=0; i<elements.size(); i++ )
|
||||
((DElement)elements.get(i)).setColor(c);
|
||||
super.setColor(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* method adds the given border to the current border of the container
|
||||
* that means, that if necessary it will enlarge it and tells it to its
|
||||
* parent
|
||||
*
|
||||
* @param b the border to add
|
||||
*/
|
||||
public void addDBorder(DBorder b){
|
||||
if( getDBorder().insert(b) && parent != null ) parent.addDBorder(b);
|
||||
}
|
||||
|
||||
public void restoreBorder(){
|
||||
DBorder b = new DBorder();
|
||||
for( int i=0; i<elements.size(); i++ )
|
||||
b.insert( ((DElement)elements.get(i)).getDBorder() );
|
||||
setDBorder( b );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* restores the container, that means that the rectangle is completely new calculated
|
||||
* this method is used after removing one of the elements
|
||||
*/
|
||||
boolean restore(){
|
||||
DRectangle old = (DRectangle)rectangle.clone();
|
||||
rectangle = DRectangle.getEmpty();
|
||||
setDBorder( new DBorder() );
|
||||
for( int i=0; i<elements.size(); i++ ){
|
||||
DElement elt = (DElement)elements.elementAt(i);
|
||||
rectangle.insert(elt.getRectangle());
|
||||
addDBorder( elt.getDBorder() );
|
||||
}
|
||||
return !old.equals( rectangle );
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************/
|
51
src/wsi/ra/chart2d/DElement.java
Normal file
51
src/wsi/ra/chart2d/DElement.java
Normal file
@@ -0,0 +1,51 @@
|
||||
/**
|
||||
* Filename: $RCSfile: DElement.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:41 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/*==========================================================================*
|
||||
* IMPORTS
|
||||
*==========================================================================*/
|
||||
|
||||
import java.awt.Color ;
|
||||
|
||||
/*==========================================================================*
|
||||
* INTERFACE DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
/**
|
||||
* some useful methods for objects which should be paintable in a scaled area
|
||||
*/
|
||||
public interface DElement
|
||||
{
|
||||
Color DEFAULT_COLOR = Color.black;
|
||||
DRectangle getRectangle();
|
||||
|
||||
void setDParent( DParent parent );
|
||||
DParent getDParent();
|
||||
|
||||
void paint( DMeasures m );
|
||||
void repaint();
|
||||
|
||||
void setVisible( boolean aFlag );
|
||||
boolean isVisible();
|
||||
|
||||
void setColor( Color color );
|
||||
Color getColor();
|
||||
|
||||
void setDBorder( DBorder b );
|
||||
DBorder getDBorder();
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************/
|
63
src/wsi/ra/chart2d/DFunction.java
Normal file
63
src/wsi/ra/chart2d/DFunction.java
Normal file
@@ -0,0 +1,63 @@
|
||||
/**
|
||||
* Filename: $RCSfile: DFunction.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:41 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/*==========================================================================*
|
||||
* IMPORTS
|
||||
*==========================================================================*/
|
||||
|
||||
import java.awt.Point ;
|
||||
import java.awt.Color ;
|
||||
import java.awt.Graphics ;
|
||||
|
||||
/*==========================================================================*
|
||||
* ABSTRACT CLASS DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
public abstract class DFunction extends DComponent
|
||||
{
|
||||
public DFunction(){
|
||||
rectangle = DRectangle.getAll();
|
||||
}
|
||||
|
||||
public abstract boolean isDefinedAt( double source );
|
||||
public abstract boolean isInvertibleAt( double image );
|
||||
public abstract double getSourceOf( double image ) throws IllegalArgumentException;
|
||||
public abstract double getImageOf( double source ) throws IllegalArgumentException;
|
||||
|
||||
public void paint( DMeasures m ){
|
||||
Graphics g = m.getGraphics();
|
||||
if( color != null ) g.setColor( color );
|
||||
|
||||
DRectangle rect = m.getDRectangle(),
|
||||
src_rect = m.getSourceOf( rect );
|
||||
Point sw = m.getPoint( rect.x, rect.y ),
|
||||
ne = m.getPoint( rect.x + rect.width, rect.y + rect.height );
|
||||
int int_w = ne.x - sw.x;
|
||||
Point last = null, next;
|
||||
for( int i = 0; i < int_w; i++ ){
|
||||
double x_val = src_rect.x + i / (double)int_w * src_rect.width ;
|
||||
if( m.x_scale != null ) x_val = m.x_scale.getImageOf( x_val );
|
||||
if( isDefinedAt( x_val ) ){
|
||||
next = m.getPoint( x_val, getImageOf( x_val ) );
|
||||
if( last != null ) g.drawLine( last.x, last.y, next.x, next.y );
|
||||
last = next;
|
||||
}
|
||||
else last = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************/
|
115
src/wsi/ra/chart2d/DGrid.java
Normal file
115
src/wsi/ra/chart2d/DGrid.java
Normal file
@@ -0,0 +1,115 @@
|
||||
/**
|
||||
* Filename: $RCSfile: DGrid.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:41 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/*==========================================================================*
|
||||
* IMPORTS
|
||||
*==========================================================================*/
|
||||
|
||||
import java.awt.Color ;
|
||||
import java.awt.Graphics ;
|
||||
|
||||
/*==========================================================================*
|
||||
* CLASS DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
/**
|
||||
* this class paints a grid with certain line distances on a DParent
|
||||
*/
|
||||
public class DGrid extends DComponent
|
||||
{
|
||||
/**
|
||||
* the distances between the lines
|
||||
*/
|
||||
double hor_dist, ver_dist;
|
||||
|
||||
private Color DEFAULT_COLOR = Color.lightGray;
|
||||
|
||||
/**
|
||||
* constructor with the size and position of the grid and the line distances
|
||||
*
|
||||
* @param rectangle the rectangle around the grid
|
||||
* @param hor_dist the horizontal distance between the lines in D-coordinates,
|
||||
* not in pixel coordinates!
|
||||
* @param ver_dist vertical distance between the lines in D-coordinates,
|
||||
* not in pixel coordinates!
|
||||
*/
|
||||
public DGrid( DRectangle rectangle, double hor_dist, double ver_dist ){
|
||||
this.rectangle = rectangle;
|
||||
this.hor_dist = hor_dist;
|
||||
this.ver_dist = ver_dist;
|
||||
color = DEFAULT_COLOR;
|
||||
}
|
||||
|
||||
/**
|
||||
* constructor with the size and position of the grid and the line distances
|
||||
*
|
||||
* @param rectangle the rectangle around the grid
|
||||
* @param hor_dist the horizontal distance between the lines in D-coordinates,
|
||||
* not in pixel coordinates!
|
||||
* @param ver_dist the vertical distance between the lines in D-coordinates,
|
||||
* not in pixel coordinates!
|
||||
* @param color the color of the grid
|
||||
* ( can also be set by setColor( java.awt.Color ) )
|
||||
*/
|
||||
public DGrid( DRectangle rectangle, double hor_dist, double ver_dist, Color color ){
|
||||
this.rectangle = rectangle;
|
||||
this.hor_dist = hor_dist;
|
||||
this.ver_dist = ver_dist;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
/**
|
||||
* paints the grid...
|
||||
*
|
||||
* @param m the <code>DMeasures</code> object to paint the grid
|
||||
*/
|
||||
public void paint( DMeasures m ){
|
||||
Graphics g = m.getGraphics();
|
||||
if( color != null ) g.setColor( color );
|
||||
double minX, minY, pos;
|
||||
DPoint p1, p2;
|
||||
DLine l;
|
||||
|
||||
minX = (int)( rectangle.x / hor_dist );
|
||||
if( minX * hor_dist <= rectangle.x ) minX++;
|
||||
minX *= hor_dist;
|
||||
minY = (int)( rectangle.y / ver_dist );
|
||||
if( minY * ver_dist <= rectangle.y ) minY++;
|
||||
minY *= ver_dist;
|
||||
|
||||
p1 = new DPoint( 0, rectangle.y );
|
||||
p2 = new DPoint( 0, rectangle.y + rectangle.height );
|
||||
for( pos = minX; pos<=rectangle.x + rectangle.width; pos += hor_dist ){
|
||||
p1.x = p2.x = pos;
|
||||
l = new DLine( p1, p2, color );
|
||||
l.paint( m );
|
||||
}
|
||||
|
||||
p1.x = rectangle.x;
|
||||
p2.x = p1.x + rectangle.width;
|
||||
for( pos = minY; pos<=rectangle.y + rectangle.height; pos += ver_dist ){
|
||||
p1.y = p2.y = pos;
|
||||
l = new DLine( p1, p2, color );
|
||||
l.paint( m );
|
||||
}
|
||||
}
|
||||
|
||||
public String toString(){
|
||||
return "chart2d.DGrid[ hor: "+hor_dist+", ver: "+ver_dist+" ]";
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************/
|
88
src/wsi/ra/chart2d/DIntDoubleMap.java
Normal file
88
src/wsi/ra/chart2d/DIntDoubleMap.java
Normal file
@@ -0,0 +1,88 @@
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/**
|
||||
* Title:
|
||||
* Description:
|
||||
* Copyright: Copyright (c) 2001
|
||||
* Company:
|
||||
* @author
|
||||
* @version 1.0
|
||||
*/
|
||||
|
||||
/**
|
||||
* This interface is used by DPointSet to store values as images of integer
|
||||
* values which can be displayed in a DArea. All modifications of the values can
|
||||
* only be shown by the DArea, when the DPointSet.repaint method is
|
||||
* called. This should be done in the implementation of the #setImage and
|
||||
* #addImage method. To get the functionality of the DArea, the methods
|
||||
* #getMaxImageValue and #getMinImageValue are necessary.
|
||||
*/
|
||||
public interface DIntDoubleMap {
|
||||
|
||||
/**
|
||||
* implementation should change the map in that way, that from now the
|
||||
* image of index is v
|
||||
*
|
||||
* @param source the preimage of the image
|
||||
* @param image the new image of the source value
|
||||
* @return <code>true<\code> when the minmal or the maximal image value
|
||||
* has been changed by this method call, else it returns
|
||||
* <code>false</code> @see #getMinImageValue(), #getMaxImageValue()
|
||||
*/
|
||||
boolean setImage(int source, double image);
|
||||
|
||||
/**
|
||||
* implementation should return the image of source
|
||||
*
|
||||
* @param source the preimage
|
||||
* @return the image value
|
||||
*/
|
||||
double getImage(int source);
|
||||
|
||||
/**
|
||||
* the image of the highest source value + 1 should be the given image value
|
||||
*
|
||||
* @param image the new image value
|
||||
* @return <code>true<\code> when the minmal or the maximal image value
|
||||
* has been changed by this method call, else it returns
|
||||
* <code>false</code> @see #getMinImageValue(), #getMaxImageValue()
|
||||
*/
|
||||
boolean addImage(double image);
|
||||
|
||||
/**
|
||||
* implementation should return the number of source values
|
||||
*
|
||||
* @return the number of source values
|
||||
*/
|
||||
int getSize();
|
||||
|
||||
/**
|
||||
* returns the maximal image value
|
||||
*
|
||||
* @return the maximal image value
|
||||
* @throw an IllegalArgumentException when it has no image values
|
||||
*/
|
||||
double getMaxImageValue();
|
||||
|
||||
/**
|
||||
* returns the minimal image value
|
||||
*
|
||||
* @return the minmal image value
|
||||
* @throw an IllegalArgumentException when it has no image values
|
||||
*/
|
||||
double getMinImageValue();
|
||||
|
||||
/**
|
||||
* checks the minimal and the maximal image values and returns <code>true</code>
|
||||
* when at least one of them has changed
|
||||
*
|
||||
* @return <code>true</code> when either the maximal image value or the
|
||||
* minmal image value has changed
|
||||
*/
|
||||
boolean restore();
|
||||
|
||||
/**
|
||||
* method removes all image values and sets the size to 0
|
||||
*/
|
||||
void reset();
|
||||
}
|
70
src/wsi/ra/chart2d/DLine.java
Normal file
70
src/wsi/ra/chart2d/DLine.java
Normal file
@@ -0,0 +1,70 @@
|
||||
/**
|
||||
* Filename: $RCSfile: DLine.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:41 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/*==========================================================================*
|
||||
* IMPORTS
|
||||
*==========================================================================*/
|
||||
|
||||
import java.awt.* ;
|
||||
|
||||
/*==========================================================================*
|
||||
* CLASS DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
public class DLine extends DComponent
|
||||
{
|
||||
DPoint start, end;
|
||||
|
||||
public DLine( double x1, double y1, double x2, double y2 ){
|
||||
this( new DPoint( x1, y1 ), new DPoint( x2, y2 ) );
|
||||
}
|
||||
|
||||
public DLine( DPoint start, DPoint end ){
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
}
|
||||
public DLine( double x1, double y1, double x2, double y2, Color color ){
|
||||
this( new DPoint( x1, y1 ), new DPoint( x2, y2 ), color );
|
||||
}
|
||||
|
||||
public DLine( DPoint start, DPoint end, Color color ){
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public DRectangle getRectangle(){
|
||||
double x = start.x, y = start.y, width = end.x - x, height = end.y - y;
|
||||
if( width < 0 ) { x += width; width *= -1; }
|
||||
if( height < 0 ) { y += height; height *= -1; }
|
||||
return new DRectangle( x, y, width, height );
|
||||
}
|
||||
|
||||
public void paint( DMeasures m ){
|
||||
//System.out.println("DLine.paint(Measures): "+this);
|
||||
Graphics g = m.getGraphics();
|
||||
if( color != null ) g.setColor( color );
|
||||
Point p1 = m.getPoint( start ),
|
||||
p2 = m.getPoint( end ) ;
|
||||
g.drawLine( p1.x, p1.y, p2.x, p2.y );
|
||||
}
|
||||
|
||||
public String toString(){
|
||||
return "DLine[("+start.x+","+start.y+") --> ("+end.x+","+end.y+", color: "+color+"]";
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************/
|
274
src/wsi/ra/chart2d/DMeasures.java
Normal file
274
src/wsi/ra/chart2d/DMeasures.java
Normal file
@@ -0,0 +1,274 @@
|
||||
/**
|
||||
* Filename: $RCSfile: DMeasures.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:41 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/*==========================================================================*
|
||||
* IMPORTS
|
||||
*==========================================================================*/
|
||||
|
||||
import java.awt.Point ;
|
||||
import java.awt.Graphics ;
|
||||
import java.awt.Dimension ;
|
||||
import java.awt.Insets ;
|
||||
|
||||
import java.awt.Component ;
|
||||
//import javax.swing.JComponent ;
|
||||
import java.io.Serializable;
|
||||
|
||||
/*==========================================================================*
|
||||
* CLASS DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
public class DMeasures implements Serializable
|
||||
{
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 243092480517044848L;
|
||||
private boolean under_construction = false;
|
||||
// when in use for a DArea:
|
||||
Graphics g;
|
||||
// when in use for a ScaledBorder:
|
||||
ScaledBorder sb;
|
||||
// for both:
|
||||
DFunction x_scale, y_scale;
|
||||
Component comp;
|
||||
Insets insets;
|
||||
|
||||
/**
|
||||
* package private constructor for the DMeasures object
|
||||
* the object can be obtained by calling the method getDMeasures of an DArea
|
||||
* object
|
||||
*
|
||||
* @param area the DArea object
|
||||
*/
|
||||
DMeasures( DArea area ){
|
||||
comp = area;
|
||||
}
|
||||
|
||||
DMeasures( ScaledBorder sb ){
|
||||
this.sb = sb;
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the pixel-point which belongs to the DPoint in the
|
||||
* D-coordinates
|
||||
* it says where to paint a certain DPoint
|
||||
* returns <code>null</code> if the double coordinates do not belong to the
|
||||
* image of the scale functions
|
||||
*
|
||||
* @param p the DPoint
|
||||
* @return the coresponding pixel Point
|
||||
*/
|
||||
public Point getPoint( DPoint p ){
|
||||
//System.out.println("DMeasures.getPoint :"+org );
|
||||
return getPoint( p.x, p.y );
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the pixel-point which belongs to the given D-coordinates
|
||||
* it says where to paint a certain DPoint
|
||||
* returns <code>null</code> if the double coordinates do not belong to the
|
||||
* image of the scale functions
|
||||
*
|
||||
* @param x the double x D-coordinate
|
||||
* @param y the double y D-coordinate
|
||||
* @return the coresponding pixel Point
|
||||
*/
|
||||
public Point getPoint( double x, double y ){
|
||||
DRectangle rect = getSourceOf( getDRectangle() );
|
||||
try{
|
||||
if( x_scale != null ) x = x_scale.getSourceOf( x );
|
||||
if( y_scale != null ) y = y_scale.getSourceOf( y );
|
||||
}
|
||||
catch( IllegalArgumentException e ){ return null; }
|
||||
Point dp = new Point();
|
||||
Dimension dim = getInner();
|
||||
Insets insets = getInsets();
|
||||
dp.x = (int)( dim.width * (x - rect.x)/(double)rect.width ) + insets.left;
|
||||
dp.y = (int)( dim.height * (1 - (y - rect.y)/(double)rect.height)) + insets.top;
|
||||
return dp;
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the point in D-coordinates which corresponds to the
|
||||
* given pixel-point
|
||||
* returns <code>null</code> if the given coordinates can not be calculated to
|
||||
* the double coordinates, when they represent a point outside of the definition
|
||||
* area of the scale functions
|
||||
*
|
||||
* @param p Point in pixel coordinates
|
||||
* @return the coresponding DPoint
|
||||
*/
|
||||
public DPoint getDPoint( Point p ){
|
||||
return getDPoint( p.x, p.y );
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the point in D-coordinates which corresponds to the
|
||||
* given pixel-coordinates
|
||||
* returns <code>null</code> if the given coordinates can not be calculated to
|
||||
* the double coordinates, when they represent a point outside of the definition
|
||||
* area of the scale functions
|
||||
*
|
||||
* @param x x-pixel coordinate
|
||||
* @param y y-pixel coordinate
|
||||
* @return the coresponding DPoint
|
||||
*/
|
||||
public DPoint getDPoint( int x, int y ){
|
||||
DRectangle rect = getSourceOf( getDRectangle() );
|
||||
Dimension dim = getInner();
|
||||
Insets insets = getInsets();
|
||||
x -= insets.left;
|
||||
y -= insets.top;
|
||||
double dx, dy;
|
||||
dx = rect.x + rect.width * x/(double)dim.width;
|
||||
dy = rect.y + rect.height * (1 - y/(double)dim.height );
|
||||
try{
|
||||
if( x_scale != null ) dx = x_scale.getImageOf( dx );
|
||||
if( y_scale != null ) dy = y_scale.getImageOf( dy );
|
||||
}
|
||||
catch( IllegalArgumentException nde ){ return null; }
|
||||
return new DPoint( dx, dy );
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the visible rectangle in D-coordinates of the shown component
|
||||
*
|
||||
* return the visible rectangle
|
||||
*/
|
||||
public DRectangle getDRectangle(){
|
||||
if( under_construction ) System.out.println("DMeasures.getDRectangle");
|
||||
if( sb != null ) return getImageOf( sb.src_rect );
|
||||
return ((DArea)comp).getDRectangle();
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the current Graphics object, which might be used by components to
|
||||
* paint themselves
|
||||
* the method sets the clipping area of the Graphics object to the currently
|
||||
* visible rectangle
|
||||
*
|
||||
* @return the Graphics object ( or null if no object was set )
|
||||
*/
|
||||
public Graphics getGraphics(){
|
||||
if( under_construction ) System.out.println("DMeasures.getGraphics");
|
||||
if( g != null ){
|
||||
Dimension d = comp.getSize();
|
||||
Insets insets = getInsets();
|
||||
g.setClip( insets.left + 1, // dann sieht man noch was von der linken Achse
|
||||
insets.top,
|
||||
d.width - insets.left - insets.right,
|
||||
d.height - insets.top - insets.bottom);
|
||||
}
|
||||
return g;
|
||||
}
|
||||
|
||||
/**
|
||||
* used by DArea to set a new Graphics object
|
||||
*/
|
||||
void setGraphics( Graphics g ){
|
||||
if( under_construction ) System.out.println("DMeasures.setGraphics");
|
||||
this.g = g;
|
||||
}
|
||||
|
||||
/**
|
||||
* used by ScaledBorder to update the DMeasures object
|
||||
*
|
||||
* @param c the parent component the border
|
||||
*/
|
||||
void update( Component c, Insets insets ){
|
||||
this.comp = c;
|
||||
this.insets = insets;
|
||||
x_scale = sb.x_scale;
|
||||
y_scale = sb.y_scale;
|
||||
}
|
||||
|
||||
private Dimension getInner(){
|
||||
Dimension d = comp.getSize();
|
||||
Insets insets = getInsets();
|
||||
d.width -= insets.left + insets.right;
|
||||
d.height -= insets.top + insets.bottom;
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* method returns the source rectangle of the given rectangle
|
||||
* they differ if there are scale functions selected which are not the identity
|
||||
* if the given rectangle does not belong to the image area of the scale
|
||||
* functions, the method returns <code>null</code>
|
||||
*
|
||||
* @param rect the image rectangle
|
||||
* @return the source of it
|
||||
*/
|
||||
DRectangle getSourceOf( DRectangle rect ){
|
||||
if( under_construction ) System.out.println("DMeasures.getSourceOf: "+rect);
|
||||
if( !getDRectangle().contains( rect ) ) throw
|
||||
new IllegalArgumentException("The rectangle lies not in the currently painted rectangle");
|
||||
if( x_scale == null && y_scale == null ) return rect;
|
||||
if( rect.isEmpty() ) return (DRectangle)rect.clone();
|
||||
DPoint p1 = new DPoint( rect.x, rect.y ),
|
||||
p2 = new DPoint( rect.x + rect.width, rect.y + rect.height );
|
||||
try{
|
||||
if( x_scale != null ){
|
||||
p1.x = x_scale.getSourceOf( p1.x );
|
||||
p2.x = x_scale.getSourceOf( p2.x );
|
||||
}
|
||||
if( y_scale != null ){
|
||||
p1.y = y_scale.getSourceOf( p1.y );
|
||||
p2.y = y_scale.getSourceOf( p2.y );
|
||||
}
|
||||
}
|
||||
catch( IllegalArgumentException nde ){ return null; }
|
||||
return new DRectangle( p1.x, p1.y, p2.x - p1.x, p2.y - p1.y );
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the image rectangle of the given rectangle
|
||||
* they differ if there are scale functions selected which are not the identity
|
||||
* if the given rectangle does not belong to the defintion area of the scale
|
||||
* functions, the method returns <code>null</code>
|
||||
*
|
||||
* @param rect the source rectangle
|
||||
* @return the source of it
|
||||
*/
|
||||
DRectangle getImageOf( DRectangle rect ){
|
||||
if( under_construction ) System.out.println("DMeasures.getImageOf: "+rect);
|
||||
if( x_scale == null && y_scale == null ) return rect;
|
||||
if( rect.isEmpty() ) return (DRectangle)rect.clone();
|
||||
DPoint p1 = new DPoint( rect.x, rect.y ),
|
||||
p2 = new DPoint( rect.x + rect.width, rect.y + rect.height );
|
||||
try{
|
||||
if( x_scale != null ){
|
||||
p1.x = x_scale.getImageOf( p1.x );
|
||||
p2.x = x_scale.getImageOf( p2.x );
|
||||
}
|
||||
if( y_scale != null ){
|
||||
p1.y = y_scale.getImageOf( p1.y );
|
||||
p2.y = y_scale.getImageOf( p2.y );
|
||||
}
|
||||
}
|
||||
catch( IllegalArgumentException nde ){ return null; }
|
||||
return new DRectangle( p1.x, p1.y, p2.x - p1.x, p2.y - p1.y );
|
||||
}
|
||||
|
||||
private Insets getInsets(){
|
||||
if( sb != null ) return insets;
|
||||
return ((DArea)comp).getInsets();
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************/
|
34
src/wsi/ra/chart2d/DParent.java
Normal file
34
src/wsi/ra/chart2d/DParent.java
Normal file
@@ -0,0 +1,34 @@
|
||||
/**
|
||||
* Filename: $RCSfile: DParent.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:41 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
import java.awt.Graphics;
|
||||
|
||||
/*==========================================================================*
|
||||
* INTERFACE DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
public interface DParent
|
||||
{
|
||||
void addDElement( DElement e );
|
||||
boolean removeDElement( DElement e );
|
||||
void repaint( DRectangle r );
|
||||
DElement[] getDElements();
|
||||
boolean contains( DElement e );
|
||||
void addDBorder( DBorder b );
|
||||
void restoreBorder();
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************/
|
99
src/wsi/ra/chart2d/DPoint.java
Normal file
99
src/wsi/ra/chart2d/DPoint.java
Normal file
@@ -0,0 +1,99 @@
|
||||
/**
|
||||
* Filename: $RCSfile: DPoint.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:42 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/*==========================================================================*
|
||||
* IMPORTS
|
||||
*==========================================================================*/
|
||||
|
||||
import java.awt.* ;
|
||||
|
||||
/*==========================================================================*
|
||||
* CLASS DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
public class DPoint extends DComponent
|
||||
{
|
||||
public double x, y;
|
||||
public String label;
|
||||
protected DPointIcon icon = null;
|
||||
public DPoint( ){
|
||||
}
|
||||
public void initpoint( double x, double y ){
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
rectangle = new DRectangle( x, y, 0, 0 );
|
||||
}
|
||||
public DPoint( double x, double y ){
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
rectangle = new DRectangle( x, y, 0, 0 );
|
||||
}
|
||||
|
||||
public void paint( DMeasures m ){
|
||||
Graphics g = m.getGraphics();
|
||||
if( color != null ) g.setColor( color );
|
||||
Point dp = m.getPoint( this );
|
||||
if( label != null ){
|
||||
FontMetrics fm = g.getFontMetrics();
|
||||
g.drawString( label,
|
||||
dp.x - fm.stringWidth( label ) / 2,
|
||||
dp.y + fm.getAscent()
|
||||
);
|
||||
}
|
||||
if( icon == null )
|
||||
g.drawRect( dp.x, dp.y, 1, 1 );
|
||||
else{
|
||||
g.translate( dp.x, dp.y );
|
||||
icon.paint( g );
|
||||
g.translate( -dp.x, -dp.y );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* method sets an icon for a better displaying of the point
|
||||
*
|
||||
* @param icon the DPointIcon
|
||||
*/
|
||||
public void setIcon( DPointIcon icon ){
|
||||
this.icon = icon;
|
||||
if( icon == null ) setDBorder(new DBorder(1,1,1,1));
|
||||
else setDBorder( icon.getDBorder() );
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the current icon of the point
|
||||
*
|
||||
* @return the DPointIcon
|
||||
*/
|
||||
public DPointIcon getIcon(){
|
||||
return icon;
|
||||
}
|
||||
|
||||
public Object clone(){
|
||||
DPoint copy = new DPoint( x, y );
|
||||
copy.color = color;
|
||||
return copy;
|
||||
}
|
||||
|
||||
public String toString(){
|
||||
String text = "DPoint[";
|
||||
if( label != null ) text += label+", ";
|
||||
text += "x: "+x+", y: "+y+", color: "+color+"]";
|
||||
return text;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************/
|
38
src/wsi/ra/chart2d/DPointIcon.java
Normal file
38
src/wsi/ra/chart2d/DPointIcon.java
Normal file
@@ -0,0 +1,38 @@
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/**
|
||||
* Filename: $RCSfile: DPointIcon.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version:
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
import java.awt.Graphics;
|
||||
/**
|
||||
* A simple interface which can be used to paint certain icons at DPoints
|
||||
* ( @see chart2d.DPoint.setIcon or chart2d.DPointSet.setIcon ).
|
||||
* Different points may be easier recognized in a complex graph.
|
||||
* The container does not guarantee that the whole icon is visible in the graph
|
||||
* because the icon does not concern the DRectangle of the DElement.
|
||||
*/
|
||||
|
||||
public interface DPointIcon {
|
||||
|
||||
/**
|
||||
* this method has to be overridden to paint the icon. The point itself lies
|
||||
* at coordinates (0, 0)
|
||||
*/
|
||||
void paint( Graphics g );
|
||||
|
||||
/**
|
||||
* the border which is necessary to be paint around the DPoint that the whole
|
||||
* icon is visible
|
||||
*
|
||||
* @return the border
|
||||
*/
|
||||
DBorder getDBorder();
|
||||
}
|
||||
|
350
src/wsi/ra/chart2d/DPointSet.java
Normal file
350
src/wsi/ra/chart2d/DPointSet.java
Normal file
@@ -0,0 +1,350 @@
|
||||
/**
|
||||
* Filename: $RCSfile: DPointSet.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:42 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/*==========================================================================*
|
||||
* IMPORTS
|
||||
*==========================================================================*/
|
||||
|
||||
import java.awt.* ;
|
||||
import wsi.ra.tool.IntegerArrayList;
|
||||
|
||||
/*==========================================================================*
|
||||
* CLASS DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
public class DPointSet extends DComponent
|
||||
{
|
||||
protected DPointIcon icon = null;
|
||||
|
||||
/*-------------------------------------------------------------------------*
|
||||
* private member variables
|
||||
*-------------------------------------------------------------------------*/
|
||||
|
||||
protected DIntDoubleMap x, y;
|
||||
protected boolean connected;
|
||||
protected Stroke stroke = new BasicStroke();
|
||||
protected JumpManager jumper = new JumpManager();
|
||||
|
||||
/*-------------------------------------------------------------------------*
|
||||
* constructor
|
||||
*-------------------------------------------------------------------------*/
|
||||
public DPointSet(){
|
||||
this(10, 2);
|
||||
}
|
||||
|
||||
|
||||
public DPointSet( int initial_capacity ){
|
||||
this(initial_capacity, 2);
|
||||
}
|
||||
|
||||
public DPointSet( int initial_capacity, int length_multiplier ){
|
||||
this( new DArray(initial_capacity, length_multiplier),
|
||||
new DArray(initial_capacity, length_multiplier) );
|
||||
}
|
||||
|
||||
public DPointSet(DIntDoubleMap x_values, DIntDoubleMap y_values){
|
||||
if( x_values.getSize() != y_values.getSize() ) throw
|
||||
new IllegalArgumentException(
|
||||
"The number of x-values has to be the same than the number of y-values"
|
||||
);
|
||||
x = x_values;
|
||||
y = y_values;
|
||||
restore();
|
||||
setDBorder(new DBorder(1,1,1,1));
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*
|
||||
* public methods
|
||||
*-------------------------------------------------------------------------*/
|
||||
|
||||
public void paint( DMeasures m ){
|
||||
Graphics2D g = (Graphics2D)m.getGraphics();
|
||||
g.setStroke(stroke);
|
||||
if( color != null ) g.setColor( color );
|
||||
int size = getSize();
|
||||
if( connected && size > 1 ){
|
||||
jumper.restore();
|
||||
while( jumper.hasMoreIntervals() ){
|
||||
int[] interval = jumper.nextInterval();
|
||||
Point p1 = null, p2;
|
||||
for( int i=interval[0]; i<interval[1]; i++ ){
|
||||
p2 = m.getPoint( x.getImage(i), y.getImage(i) );
|
||||
if( p1 != null)
|
||||
g.drawLine( p1.x, p1.y, p2.x, p2.y );
|
||||
if( icon != null ){
|
||||
g.setStroke( new BasicStroke() );
|
||||
g.translate(p2.x, p2.y);
|
||||
icon.paint(g);
|
||||
g.translate(-p2.x, -p2.y);
|
||||
g.setStroke( stroke );
|
||||
}
|
||||
p1 = p2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
Point p;
|
||||
for( int i=0; i<size; i++ ){
|
||||
p = m.getPoint( x.getImage(i), y.getImage(i) );
|
||||
if( icon == null ){
|
||||
g.drawLine(p.x - 1, p.y - 1, p.x + 1, p.y + 1);
|
||||
g.drawLine(p.x + 1, p.y - 1, p.x - 1, p.y + 1);
|
||||
}
|
||||
else{
|
||||
g.setStroke( new BasicStroke() );
|
||||
g.translate(p.x, p.y);
|
||||
icon.paint(g);
|
||||
g.translate(-p.x, -p.y);
|
||||
}
|
||||
}
|
||||
}
|
||||
g.setStroke( new BasicStroke() );
|
||||
}
|
||||
|
||||
public void addDPoint( DPoint p ){
|
||||
x.addImage(p.x);
|
||||
y.addImage(p.y);
|
||||
rectangle.insert(p);
|
||||
repaint();
|
||||
}
|
||||
|
||||
public void addDPoint( double x, double y ){
|
||||
addDPoint(new DPoint(x, y));
|
||||
}
|
||||
|
||||
/**
|
||||
* method causes the DPointSet to interupt the connected painting at the
|
||||
* current position
|
||||
*/
|
||||
public void jump(){
|
||||
jumper.addJump();
|
||||
}
|
||||
|
||||
/**
|
||||
* method removes all jump positions
|
||||
* if the DPointSet is connected, all points will be painted connected to
|
||||
* their following point
|
||||
*/
|
||||
public void removeJumps(){
|
||||
jumper.reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the DPoint at the given index
|
||||
*
|
||||
* @param index the index of the DPoint
|
||||
* @return the DPoint at the given index
|
||||
*/
|
||||
public DPoint getDPoint( int index ){
|
||||
if( index >= x.getSize() ) {
|
||||
System.out.println("getDPoint() index"+index);
|
||||
System.out.println("x.getSize() "+x.getSize());
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
DPoint p = new DPoint( x.getImage( index ), y.getImage( index ) );
|
||||
p.setIcon( icon );
|
||||
p.setColor( color );
|
||||
return p;
|
||||
}
|
||||
|
||||
/**
|
||||
* method puts the given DPoint at the given position in the set
|
||||
*
|
||||
* @param index the index of the point
|
||||
* @param p the point to insert
|
||||
*/
|
||||
public void setDPoint( int index, DPoint p ){
|
||||
if( index >= x.getSize() ) throw new ArrayIndexOutOfBoundsException(index);
|
||||
rectangle.insert(p);
|
||||
x.setImage(index,p.x);
|
||||
y.setImage(index,p.y);
|
||||
restore();
|
||||
repaint();
|
||||
}
|
||||
|
||||
/**
|
||||
* method sets an icon for a better displaying of the point set
|
||||
*
|
||||
* @param icon the DPointIcon
|
||||
*/
|
||||
public void setIcon( DPointIcon icon ){
|
||||
this.icon = icon;
|
||||
if( icon == null ) setDBorder(new DBorder(1,1,1,1));
|
||||
else setDBorder( icon.getDBorder() );
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the current icon of the point set
|
||||
*
|
||||
* @return the DPointIcon
|
||||
*/
|
||||
public DPointIcon getIcon(){
|
||||
return icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* method sets the stroke of the line
|
||||
* if the points were not connected, they now will be connected
|
||||
*
|
||||
* @param s the new stroke
|
||||
*/
|
||||
public void setStroke( Stroke s ){
|
||||
if( s == null ) s = new BasicStroke();
|
||||
stroke = s;
|
||||
repaint();
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the current stroke of the line
|
||||
*
|
||||
* @return the stroke
|
||||
*/
|
||||
public Stroke getStroke(){
|
||||
return stroke;
|
||||
}
|
||||
|
||||
public void setConnected( boolean aFlag ){
|
||||
boolean changed = !( aFlag == connected );
|
||||
connected = aFlag;
|
||||
if( changed ) repaint();
|
||||
}
|
||||
|
||||
public void removeAllPoints(){
|
||||
if( x.getSize() == 0 ) return;
|
||||
x.reset();
|
||||
y.reset();
|
||||
jumper.reset();
|
||||
repaint();
|
||||
rectangle = DRectangle.getEmpty();
|
||||
}
|
||||
|
||||
public String toString(){
|
||||
String text = "wsi.ra.chart2d.DPointSet[size:"+getSize();
|
||||
for( int i=0; i<x.getSize(); i++ )
|
||||
text += ",("+x.getImage(i)+","+y.getImage(i)+")";
|
||||
text += "]";
|
||||
return text;
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the index to the nearest <code>DPoint</code> in this <code>DPointSet</code>.
|
||||
*
|
||||
* @return the index to the nearest <code>DPoint</code>. -1 if no nearest <code>DPoint</code> was found.
|
||||
*/
|
||||
public int getNearestDPointIndex(DPoint point){
|
||||
double minValue = Double.MAX_VALUE;
|
||||
int minIndex = -1;
|
||||
for( int i=0; i<x.getSize(); i++ ){
|
||||
double dx = point.x - x.getImage(i);
|
||||
double dy = point.y - y.getImage(i);
|
||||
double dummy = dx*dx + dy*dy;
|
||||
if (dummy < minValue){
|
||||
minValue = dummy;
|
||||
minIndex = i;
|
||||
}
|
||||
}
|
||||
return minIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns the nearest <code>DPoint</code> in this <code>DPointSet</code>.
|
||||
*
|
||||
* @return the nearest <code>DPoint</code>
|
||||
*/
|
||||
public DPoint getNearestDPoint(DPoint point){
|
||||
int minIndex = getNearestDPointIndex(point);
|
||||
|
||||
if(minIndex == -1) return null;
|
||||
else return new DPoint(x.getImage(minIndex), y.getImage(minIndex));
|
||||
}
|
||||
|
||||
// public int getSize(){
|
||||
// int size = x.getSize();
|
||||
// if( size != y.getSize() ) throw
|
||||
// new ArrayStoreException(
|
||||
// "The number of x-values is not equal to the number of y-values.\n"
|
||||
// +"The size of the DPointSet isn<73>t clear."
|
||||
// );
|
||||
// return size;
|
||||
// }
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public int getSize(){ // testhu
|
||||
int size = x.getSize();
|
||||
if( size <= y.getSize() )
|
||||
return size;
|
||||
return x.getSize();
|
||||
}
|
||||
|
||||
|
||||
protected void restore(){
|
||||
if( getSize() == 0){
|
||||
rectangle = DRectangle.getEmpty();
|
||||
return;
|
||||
}
|
||||
double min_x = x.getMinImageValue(),
|
||||
max_x = x.getMaxImageValue(),
|
||||
min_y = y.getMinImageValue(),
|
||||
max_y = y.getMaxImageValue();
|
||||
rectangle = new DRectangle(min_x, min_y, max_x - min_x, max_y - min_y );
|
||||
}
|
||||
|
||||
/**
|
||||
* this class stores the jump positions (see this.jump)
|
||||
*/
|
||||
class JumpManager{
|
||||
protected IntegerArrayList jumps = new IntegerArrayList();
|
||||
protected int index = -1;
|
||||
|
||||
public void addJump(){
|
||||
jumps.add(getSize());
|
||||
}
|
||||
|
||||
public int[] nextInterval(){
|
||||
int no_jumps = jumps.size();
|
||||
if( index >= no_jumps ) throw
|
||||
new ArrayIndexOutOfBoundsException("No more intervals in JumpManager");
|
||||
|
||||
int[] inter = new int[2];
|
||||
|
||||
if( index == -1 ) inter[0] = 0;
|
||||
else inter[0] = jumps.get(index);
|
||||
|
||||
index++;
|
||||
|
||||
if( index < no_jumps ) inter[1] = jumps.get(index);
|
||||
else inter[1] = getSize();
|
||||
|
||||
return inter;
|
||||
}
|
||||
|
||||
public boolean hasMoreIntervals(){
|
||||
return index < jumps.size();
|
||||
}
|
||||
|
||||
public void restore(){
|
||||
index = -1;
|
||||
}
|
||||
|
||||
public void reset(){
|
||||
index = -1;
|
||||
jumps.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************/
|
207
src/wsi/ra/chart2d/DRectangle.java
Normal file
207
src/wsi/ra/chart2d/DRectangle.java
Normal file
@@ -0,0 +1,207 @@
|
||||
/**
|
||||
* Filename: $RCSfile: DRectangle.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:42 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/*==========================================================================*
|
||||
* IMPORTS
|
||||
*==========================================================================*/
|
||||
|
||||
import java.awt.* ;
|
||||
|
||||
/*==========================================================================*
|
||||
* CLASS DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
public class DRectangle extends DComponent
|
||||
{
|
||||
public double x, y, width, height;
|
||||
public static final int PART = 0, ALL = 1, EMPTY = 2;
|
||||
protected int status;
|
||||
protected Color fillColor;
|
||||
|
||||
private DRectangle( int status ){
|
||||
super(true);
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public DRectangle( double x, double y, double width, double height ){
|
||||
super(true);
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
if( width < 0 ) throw
|
||||
new IllegalArgumentException("Width of a DRectangle has to be >= 0");
|
||||
this.width = width;
|
||||
if( height < 0 ) throw
|
||||
new IllegalArgumentException("Height of a DRectangle has to be >= 0");
|
||||
this.height = height;
|
||||
status = PART;
|
||||
}
|
||||
|
||||
public DRectangle getRectangle(){ return this; }
|
||||
|
||||
public void paint( DMeasures m ){
|
||||
if( isEmpty() ) return;
|
||||
Graphics g = m.getGraphics();
|
||||
Color old_color = g.getColor();
|
||||
DRectangle rect = m.getDRectangle();
|
||||
rect = rect.getIntersection( this );
|
||||
Point p1 = m.getPoint( rect.x, rect.y ),
|
||||
p2 = m.getPoint( rect.x + rect.width, rect.y + rect.height );
|
||||
if( fillColor != null ){
|
||||
g.setColor( fillColor );
|
||||
g.fillRect( p1.x, p2.y, p2.x - p1.x, p1.y - p2.y );
|
||||
}
|
||||
if( !isAll() ){
|
||||
if( color != null ) g.setColor( color );
|
||||
else g.setColor( DEFAULT_COLOR );
|
||||
g.drawRect( p1.x, p2.y, p2.x - p1.x, p1.y - p2.y );
|
||||
}
|
||||
g.setColor( old_color );
|
||||
}
|
||||
|
||||
public boolean contains( DPoint p ){
|
||||
if( status == ALL ) return true;
|
||||
if( status == EMPTY ) return false;
|
||||
if( p.x < x ) return false;
|
||||
if( p.y < y ) return false;
|
||||
if( p.x > x + width ) return false;
|
||||
if( p.y > y + height ) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean contains( DRectangle rect ){
|
||||
if( status == ALL || rect.isEmpty() ) return true;
|
||||
if( status == EMPTY || rect.isAll() ) return false;
|
||||
if( !contains( new DPoint( rect.x, rect.y ) ) ) return false;
|
||||
if( !contains( new DPoint( rect.x + rect.width, rect.y + rect.height ) ) ) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public DRectangle getIntersection( DRectangle r ){
|
||||
if( status == ALL ) return (DRectangle)r.clone();
|
||||
if( status == EMPTY ) return DRectangle.getEmpty();
|
||||
if( r.status == ALL ) return (DRectangle)clone();
|
||||
if( r.status == EMPTY ) return DRectangle.getEmpty();
|
||||
DRectangle s = (DRectangle)this.clone();
|
||||
if( s.x < r.x ){
|
||||
s.x = r.x;
|
||||
s.width -= r.x - s.x;
|
||||
}
|
||||
if( s.y < r.y ){
|
||||
s.y = r.y;
|
||||
s.height -= r.y - s.y;
|
||||
}
|
||||
if( s.x + s.width > r.x + r.width )
|
||||
s.width = r.x + r.width - s.x;
|
||||
if( s.y + s.height > r.y + r.height )
|
||||
s.height = r.y + r.height - s.y;
|
||||
if( s.width < 0 || s.height < 0 ) return DRectangle.getEmpty();
|
||||
else return s;
|
||||
}
|
||||
|
||||
/**
|
||||
* method resizes the rectangle to insert p
|
||||
*
|
||||
* @param the dPoint p to insert
|
||||
* @return true when the size of the rectangle changed
|
||||
*/
|
||||
public boolean insert( DPoint p ){
|
||||
if( p.x == Double.NaN || p.y == Double.NaN ) return false;
|
||||
if( isAll() ) return false;
|
||||
if( contains( p ) ) return false;
|
||||
if( isEmpty() ){
|
||||
x = p.x; y = p.y; width = height = 0;
|
||||
status = PART;
|
||||
return true;
|
||||
}
|
||||
if( p.x < x ) {
|
||||
width += x - p.x;
|
||||
x = p.x;
|
||||
}
|
||||
else if( p.x > x + width ) width = p.x - x;
|
||||
if( p.y < y ) {
|
||||
height += y - p.y;
|
||||
y = p.y;
|
||||
}
|
||||
else if( p.y > y + height ) height = p.y - y;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* method inserts the given rectangle to this instance of it
|
||||
* and returns true when the size changed
|
||||
*
|
||||
* @param rect the rectangle to inserts
|
||||
* @return true if the size changed
|
||||
*/
|
||||
public boolean insert( DRectangle rect ){
|
||||
if( isAll() || rect.isEmpty() ) return false;
|
||||
if( rect.isAll() ){ status = ALL; return true; }
|
||||
if( isEmpty() ){
|
||||
x = rect.x; y = rect.y; width = rect.width; height = rect.height;
|
||||
status = PART;
|
||||
return true;
|
||||
}
|
||||
boolean changed = false;
|
||||
changed = insert( new DPoint( rect.x, rect.y ) );
|
||||
changed = insert( new DPoint( rect.x + rect.width, rect.y + rect.height ) )? true : changed;
|
||||
return changed;
|
||||
}
|
||||
|
||||
public Object clone(){
|
||||
DRectangle copy = new DRectangle( x, y, width, height );
|
||||
copy.status = status;
|
||||
if( color != null ) copy.color = new Color( color.getRGB() );
|
||||
return copy;
|
||||
}
|
||||
|
||||
public String toString(){
|
||||
String text = "DRectangle[ ";
|
||||
switch( status ){
|
||||
case ALL : text += "all"; break;
|
||||
case EMPTY : text += "empty"; break;
|
||||
case PART : text += x+", "+y+", "+width+", "+height;
|
||||
}
|
||||
text += " ]";
|
||||
return text;
|
||||
}
|
||||
|
||||
public boolean equals( DRectangle r ){
|
||||
if( r.status != status ) return false;
|
||||
if( r.x != x ) return false;
|
||||
if( r.y != y ) return false;
|
||||
if( r.width != width ) return false;
|
||||
if( r.height != height ) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void setFillColor( Color fill_color ){
|
||||
if( fillColor == null || !fillColor.equals( fill_color ) ){
|
||||
fillColor = fill_color;
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
||||
public Color getFillColor(){
|
||||
return fillColor;
|
||||
}
|
||||
|
||||
public static DRectangle getAll(){ return new DRectangle( ALL ); }
|
||||
public boolean isAll(){ return status == ALL; }
|
||||
public static DRectangle getEmpty(){ return new DRectangle( EMPTY ); }
|
||||
public boolean isEmpty(){ return status == EMPTY; }
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************/
|
493
src/wsi/ra/chart2d/ScaledBorder.java
Normal file
493
src/wsi/ra/chart2d/ScaledBorder.java
Normal file
@@ -0,0 +1,493 @@
|
||||
/**
|
||||
* Filename: $RCSfile: ScaledBorder.java,v $
|
||||
* Purpose:
|
||||
* Language: Java
|
||||
* Compiler: JDK 1.3
|
||||
* Authors: Fabian Hennecke
|
||||
* Version: $Revision: 1.1.1.1 $
|
||||
* $Date: 2003/07/03 14:59:42 $
|
||||
* $Author: ulmerh $
|
||||
* Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
|
||||
*/
|
||||
|
||||
|
||||
|
||||
package wsi.ra.chart2d;
|
||||
|
||||
/*==========================================================================*
|
||||
* IMPORTS
|
||||
*==========================================================================*/
|
||||
|
||||
import java.awt.* ;
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.border.* ;
|
||||
import java.awt.geom.AffineTransform ;
|
||||
import java.text.NumberFormat;
|
||||
import java.text.DecimalFormat;
|
||||
|
||||
/*==========================================================================*
|
||||
* CLASS DECLARATION
|
||||
*==========================================================================*/
|
||||
|
||||
/**
|
||||
* ScaledBorder puts an border around Components
|
||||
* ( especially around DrawingAreas ) with scaled and labeled axes
|
||||
*/
|
||||
public class ScaledBorder implements Border
|
||||
{
|
||||
private boolean under_construction = false;
|
||||
|
||||
/**
|
||||
* length of the distance markers on the axes in pixels
|
||||
*/
|
||||
int marker_length = 2;
|
||||
|
||||
/**
|
||||
* length in pixels of the arrows at the ends of the axes
|
||||
*/
|
||||
int arrow_length = 10;
|
||||
|
||||
/**
|
||||
* a flag if the arrows should be visible
|
||||
*/
|
||||
public boolean show_arrows = true;
|
||||
|
||||
/**
|
||||
* distance between the x-values in digits
|
||||
*/
|
||||
int x_value2value = 2;
|
||||
|
||||
/**
|
||||
* distance between y-label and y-values in digit width
|
||||
*/
|
||||
int y_label2values = 1;
|
||||
|
||||
/**
|
||||
* distance between y-values and y-axis markers in parts of the digit width
|
||||
*/
|
||||
int y_values2marker = 2;
|
||||
|
||||
/**
|
||||
* distance between values and arrows in pixels
|
||||
*/
|
||||
int x_values2arrow = 10,
|
||||
y_values2arrow = 10;
|
||||
|
||||
/**
|
||||
* distance between arrows and outer border
|
||||
*/
|
||||
int axis2border = 4;
|
||||
|
||||
/**
|
||||
* distance between labels and the border in pixels
|
||||
*/
|
||||
public int x_label2border = 6,
|
||||
y_label2border = 6;
|
||||
|
||||
/**
|
||||
* the size of the source rectangle
|
||||
* that means before the values are mdified by scale functions
|
||||
*/
|
||||
DRectangle src_rect;
|
||||
|
||||
/**
|
||||
* the minimal increment of the scales
|
||||
*/
|
||||
public double minimal_increment;
|
||||
|
||||
/**
|
||||
* the displayed labels
|
||||
*/
|
||||
public String x_label, y_label;
|
||||
|
||||
/**
|
||||
* foreground and background colors
|
||||
*/
|
||||
public Color foreground, background;
|
||||
|
||||
/**
|
||||
* the border which is shown around the scaled border
|
||||
*/
|
||||
Border outer_border;
|
||||
|
||||
/**
|
||||
* flag if the outer border should be displayed
|
||||
*/
|
||||
boolean show_outer_border = true;
|
||||
|
||||
/**
|
||||
* scale functions if, for example, an logarithmic function is needed instead
|
||||
* of a linear.
|
||||
*/
|
||||
public DFunction x_scale, y_scale;
|
||||
|
||||
/**
|
||||
* formatters of the x- and y-axis numbers
|
||||
* @see java.text.NumberFormat
|
||||
*/
|
||||
public NumberFormat format_x = new DecimalFormat(),
|
||||
format_y = new DecimalFormat();
|
||||
|
||||
private double src_dX = -1, src_dY = -1;
|
||||
|
||||
private boolean do_refresh,
|
||||
auto_scale_x = true,
|
||||
auto_scale_y = true;
|
||||
|
||||
private Insets old_insets;
|
||||
|
||||
private DMeasures m;
|
||||
|
||||
/**
|
||||
* constructor creates a default ScaledBorder inside of a lowered BevelBorder
|
||||
*/
|
||||
public ScaledBorder(){
|
||||
this(
|
||||
BorderFactory.createBevelBorder(
|
||||
BevelBorder.LOWERED,
|
||||
Color.white,
|
||||
Color.lightGray,
|
||||
Color.black,
|
||||
Color.lightGray
|
||||
)
|
||||
);
|
||||
}
|
||||
/**
|
||||
* constructor creates a new <code>ScaledBorder<code/>
|
||||
* surrounded by the specified <code>Border<code/>
|
||||
*/
|
||||
public ScaledBorder( Border outer ){
|
||||
outer_border = outer;
|
||||
m = new DMeasures( this );
|
||||
}
|
||||
|
||||
/**
|
||||
* method tells the border to calculate the differences between displayed
|
||||
* x-values by itself
|
||||
*/
|
||||
public void setAutoScaleX(){ auto_scale_x = true; }
|
||||
|
||||
/**
|
||||
* method tells the border to calculate the differences between displayed
|
||||
* y-values by itself
|
||||
*/
|
||||
public void setAutoScaleY(){ auto_scale_y = true; }
|
||||
|
||||
/**
|
||||
* method sets the differences between source x-values of the displayed values
|
||||
* @see setAutoScaleX().
|
||||
* If scale functions are used there might be a difference between the shown values
|
||||
* and the source values
|
||||
*/
|
||||
public void setSrcdX(double dX){
|
||||
auto_scale_x = false;
|
||||
src_dX = dX;
|
||||
}
|
||||
|
||||
/**
|
||||
* method sets the differences between source y-values of the displayed values
|
||||
* @see setAutoScaleY().
|
||||
* If scale functions are used there might be a difference between the shown values
|
||||
* and the source values
|
||||
*/
|
||||
public void setSrcdY(double dY){
|
||||
auto_scale_y = false;
|
||||
src_dY = dY;
|
||||
}
|
||||
|
||||
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height){
|
||||
if( under_construction ) System.out.println("ScaledBorder.paintBorder()");
|
||||
if( foreground == null ) foreground = c.getForeground();
|
||||
if( background == null ) background = c.getBackground();
|
||||
Color old_color = g.getColor();
|
||||
g.setColor( background );
|
||||
g.fillRect( x, y, width, height );
|
||||
g.setColor( old_color );
|
||||
|
||||
Insets outer_insets = new Insets( 0, 0, 0, 0);// insets of the outer border
|
||||
if( show_outer_border ) {
|
||||
outer_border.paintBorder( c, g, x, y, width, height );
|
||||
outer_insets = outer_border.getBorderInsets( c );
|
||||
}
|
||||
|
||||
do_refresh = true;
|
||||
Insets inner_insets = getBorderInsets(c);
|
||||
|
||||
Dimension d = c.getSize(),
|
||||
cd = new Dimension( d.width - inner_insets.left - inner_insets.right,
|
||||
d.height - inner_insets.top - inner_insets.bottom );
|
||||
FontMetrics fm = g.getFontMetrics();
|
||||
int fontAsc = fm.getAscent();
|
||||
do_refresh = false;
|
||||
|
||||
m.update(c, inner_insets);
|
||||
|
||||
// axes
|
||||
g.setColor( foreground );
|
||||
g.drawLine( inner_insets.left, inner_insets.top,
|
||||
inner_insets.left, inner_insets.top + cd.height );
|
||||
g.drawLine( inner_insets.left, inner_insets.top + cd.height,
|
||||
inner_insets.left + cd.width, inner_insets.top + cd.height );
|
||||
|
||||
if( show_arrows ){
|
||||
g.drawLine( inner_insets.left, inner_insets.top,
|
||||
inner_insets.left, inner_insets.top - y_values2arrow );
|
||||
g.drawLine( inner_insets.left - marker_length, inner_insets.top - y_values2arrow,
|
||||
inner_insets.left, inner_insets.top - y_values2arrow - arrow_length );
|
||||
g.drawLine( inner_insets.left + marker_length, inner_insets.top - y_values2arrow,
|
||||
inner_insets.left, inner_insets.top - y_values2arrow - arrow_length);
|
||||
g.drawLine( inner_insets.left - marker_length, inner_insets.top - y_values2arrow,
|
||||
inner_insets.left + marker_length, inner_insets.top - y_values2arrow );
|
||||
|
||||
g.drawLine( inner_insets.left + cd.width , inner_insets.top + cd.height,
|
||||
inner_insets.left + cd.width + x_values2arrow, inner_insets.top + cd.height );
|
||||
g.drawLine( inner_insets.left + cd.width + x_values2arrow,
|
||||
inner_insets.top + cd.height - marker_length,
|
||||
inner_insets.left + cd.width + x_values2arrow + arrow_length,
|
||||
inner_insets.top + cd.height );
|
||||
g.drawLine( inner_insets.left + cd.width + x_values2arrow,
|
||||
inner_insets.top + cd.height + marker_length,
|
||||
inner_insets.left + cd.width + x_values2arrow + arrow_length,
|
||||
inner_insets.top + cd.height );
|
||||
g.drawLine( inner_insets.left + cd.width + x_values2arrow,
|
||||
inner_insets.top + cd.height - marker_length,
|
||||
inner_insets.left + cd.width + x_values2arrow,
|
||||
inner_insets.top + cd.height + marker_length );
|
||||
}
|
||||
|
||||
if( y_label != null ) {
|
||||
Dimension yld = new Dimension(fm.getAscent()+fm.getDescent(), fm.stringWidth(y_label));
|
||||
AffineTransform T = new AffineTransform(0, -1, 1, 0, 0, 0);
|
||||
Font old = g.getFont(), f = old.deriveFont( T );
|
||||
g.setFont( f );
|
||||
g.drawString( y_label, y_label2border + fm.getAscent(), inner_insets.top + ( cd.height + yld.height )/ 2 );
|
||||
g.setFont( old );
|
||||
}
|
||||
|
||||
if( x_label != null )
|
||||
g.drawString(
|
||||
x_label, inner_insets.left + ( cd.width - fm.stringWidth( x_label ) ) / 2,
|
||||
d.height - outer_insets.bottom - x_label2border - fm.getDescent() );
|
||||
|
||||
if( src_rect.x == 0 && src_rect.y == 0 ){
|
||||
int v2m = fm.stringWidth("0") / y_values2marker;
|
||||
g.drawString( "0", inner_insets.left - fm.stringWidth( "0" ) - v2m - marker_length,
|
||||
inner_insets.top + cd.height + fontAsc );
|
||||
g.drawLine( inner_insets.left, inner_insets.top + cd.height + fm.getAscent(),
|
||||
inner_insets.left, inner_insets.top + cd.height);
|
||||
g.drawLine( inner_insets.left, inner_insets.top + cd.height,
|
||||
inner_insets.left - fm.stringWidth( "0" ) - v2m - marker_length,
|
||||
inner_insets.top + cd.height );
|
||||
}
|
||||
|
||||
drawYValues( g, inner_insets, cd );
|
||||
drawXValues( g, inner_insets, cd );
|
||||
|
||||
g.setColor( old_color );
|
||||
}
|
||||
|
||||
private void drawYValues( Graphics g, Insets insets, Dimension cd ){
|
||||
if( under_construction ) System.out.println("ScaledBorder.drawYValues()");
|
||||
|
||||
FontMetrics fm = g.getFontMetrics();
|
||||
int n, fontAsc = fm.getAscent(), v2m = fm.stringWidth("0") / y_values2marker;
|
||||
n = (int)( src_rect.y / src_dY );
|
||||
if( n * src_dY < src_rect.y || ( src_rect.x == 0 && src_rect.y == 0 ) ) n++;
|
||||
|
||||
|
||||
double v, minx = src_rect.x;
|
||||
if( x_scale != null ) minx = x_scale.getImageOf( minx );
|
||||
for(; (v = n * src_dY) <= src_rect.y + src_rect.height; n++ ){
|
||||
if( y_scale != null ) v = y_scale.getImageOf( v );
|
||||
String text = format_y.format(v);
|
||||
try{ v = format_y.parse(text).doubleValue(); }
|
||||
catch( java.text.ParseException ex ){ }
|
||||
Point p = m.getPoint( minx, v );
|
||||
if( p != null ){
|
||||
g.drawString( text,
|
||||
insets.left - fm.stringWidth( text ) - v2m - marker_length,
|
||||
p.y + fontAsc / 2 );
|
||||
g.drawLine( insets.left - marker_length, p.y, insets.left, p.y );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public double getSrcdY( FontMetrics fm, Dimension cd ){
|
||||
if( under_construction ) System.out.println("ScaledBorder.getSrcdY()");
|
||||
if( (!do_refresh && src_dY != -1) || !auto_scale_y ) return src_dY;
|
||||
int max = cd.height / fm.getHeight();
|
||||
double minsrc_dY = 2 * src_rect.height / (double)max; // die 2 einfach mal so eingesetzt <--------------------------
|
||||
src_dY = aBitBigger( minsrc_dY );
|
||||
if( src_dY < minimal_increment ) src_dY = minimal_increment;
|
||||
return src_dY;
|
||||
}
|
||||
|
||||
private void drawXValues( Graphics g, Insets insets, Dimension cd ){
|
||||
if( under_construction ) System.out.println("ScaledBorder.drawXValues()");
|
||||
|
||||
FontMetrics fm = g.getFontMetrics();
|
||||
double mx = cd.width / src_rect.width;
|
||||
int n, labelX,
|
||||
xnull = insets.left + (int)( - src_rect.x * mx );
|
||||
|
||||
n = (int)( src_rect.x / src_dX );
|
||||
if( n * src_dX < src_rect.x || ( src_rect.x == 0 && src_rect.y == 0 ) ) n++;
|
||||
|
||||
int fontAsc = fm.getAscent(), xLineY = insets.top + cd.height;
|
||||
labelX = xnull + (int)(n * src_dX * mx);
|
||||
while( n * src_dX <= src_rect.x + src_rect.width ){
|
||||
double v = n * src_dX;
|
||||
if( x_scale != null ) v = x_scale.getImageOf(v);
|
||||
String text = format_x.format(v);
|
||||
try{ v = format_x.parse(text).doubleValue(); }
|
||||
catch( java.text.ParseException ex ){ }
|
||||
int strW = fm.stringWidth( text );
|
||||
g.drawString( text, labelX - strW / 2, xLineY + fontAsc );
|
||||
g.drawLine( labelX, xLineY, labelX, xLineY + marker_length );
|
||||
n++;
|
||||
labelX = xnull + (int)( n * src_dX * mx);
|
||||
}
|
||||
}
|
||||
|
||||
public double getSrcdX( FontMetrics fm, Dimension cd ){
|
||||
if( under_construction ) System.out.println("ScaledBorder.getSrcdX()");
|
||||
if( (!do_refresh && src_dX != - 1) || !auto_scale_x ) return src_dX;
|
||||
int digit_width = fm.stringWidth("0"),
|
||||
max = cd.width / ( digit_width * ( x_value2value + 1 ) );
|
||||
src_dX = src_rect.width / (double)max;
|
||||
int n, labelX, olsrc_dX;
|
||||
|
||||
boolean ok = false;
|
||||
while( !ok ){
|
||||
src_dX = aBitBigger( src_dX );
|
||||
|
||||
n = (int)( src_rect.x / src_dX );
|
||||
if( n * src_dX < src_rect.x ) n++;
|
||||
|
||||
olsrc_dX = 0;
|
||||
|
||||
boolean suits = true, first = true;
|
||||
while( suits && n * src_dX <= src_rect.x + src_rect.width ){
|
||||
double v = n * src_dX;
|
||||
if( x_scale != null ) v = x_scale.getImageOf( v );
|
||||
String text = format_x.format(v);
|
||||
int strW = fm.stringWidth( text );
|
||||
labelX = (int)((( n * src_dX - src_rect.x ) / src_rect.width ) * cd.width ) - strW / 2;
|
||||
if( !first && labelX <= olsrc_dX + digit_width * x_value2value ) suits = false;
|
||||
else{
|
||||
olsrc_dX = labelX + strW;
|
||||
n++;
|
||||
}
|
||||
first = false;
|
||||
}
|
||||
if( !suits ) ok = false;
|
||||
else ok = true;
|
||||
}
|
||||
if( src_dX < minimal_increment ) src_dX = minimal_increment;
|
||||
return src_dX;
|
||||
}
|
||||
|
||||
/**
|
||||
* method returns to a certain minimal value the next higher value which can be
|
||||
* displayed, which looks a bit nicer
|
||||
* it returns values like ... 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, ...
|
||||
*
|
||||
* @param the double value next to which the displayable value should be found
|
||||
* @return the displayable value
|
||||
*/
|
||||
public static double aBitBigger( double min ){
|
||||
if( min <= 0 ) return 1;
|
||||
double d = 1;
|
||||
if( min < d ){
|
||||
while( d * .5 > min ) {
|
||||
d *= .5;
|
||||
if( d * .4 > min ) d *= .4;
|
||||
if( d * .5 > min ) d *= .5;
|
||||
}
|
||||
}
|
||||
else{
|
||||
while( d <= min ) {
|
||||
d *= 2;
|
||||
if( d <= min ) d *= 2.5;
|
||||
if( d <= min ) d *= 2;
|
||||
}
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
public boolean isBorderOpaque(){
|
||||
return outer_border.isBorderOpaque();
|
||||
}
|
||||
//
|
||||
// private String stringOf( double v ){
|
||||
// if( (int)v == v ) return String.valueOf( (int)v );
|
||||
// return String.valueOf( v );
|
||||
// }
|
||||
|
||||
public Insets getBorderInsets(Component c){
|
||||
if( under_construction ) System.out.println("ScaledBorder.getBorderInsets()");
|
||||
if( !do_refresh && old_insets != null ) return old_insets;
|
||||
|
||||
Graphics g = c.getGraphics();
|
||||
|
||||
Insets insets = new Insets(0, 0, 0, 0);
|
||||
if( show_outer_border ) insets = outer_border.getBorderInsets( c );
|
||||
|
||||
if( g == null ) return insets;
|
||||
|
||||
FontMetrics fm = g.getFontMetrics();
|
||||
// int fontAsc = fm.getAscent();
|
||||
int fontHeight = fm.getHeight(),
|
||||
digit_width = fm.stringWidth("0");
|
||||
|
||||
if( c instanceof DArea ){
|
||||
DArea area = (DArea)c;
|
||||
DMeasures m = area.getDMeasures();
|
||||
DRectangle rect = m.getSourceOf( area.getDRectangle() );
|
||||
src_rect = (DRectangle)rect.clone();
|
||||
x_scale = area.getDMeasures().x_scale;
|
||||
y_scale = area.getDMeasures().y_scale;
|
||||
}
|
||||
|
||||
// left:
|
||||
if( y_label != null ) insets.left += fm.getAscent() + fm.getDescent();
|
||||
insets.left += y_label2values * digit_width;
|
||||
getSrcdY( fm, c.getSize() );
|
||||
int n, maxWidth = 0;
|
||||
n = (int)( src_rect.y / src_dY );
|
||||
if( n * src_dY < src_rect.y ) n++;
|
||||
while( n * src_dY <= src_rect.y + src_rect.height ){
|
||||
// TODO here might be a bug for mean values
|
||||
double v = n * src_dY;
|
||||
if( y_scale != null ) v = y_scale.getImageOf( v );
|
||||
int w = fm.stringWidth( format_y.format(v) );
|
||||
if( w > maxWidth ) maxWidth = w;
|
||||
n++;
|
||||
}
|
||||
insets.left += 1 + y_label2border + maxWidth + digit_width / y_values2marker + marker_length;
|
||||
|
||||
// bottom:
|
||||
insets.bottom += 1 + fontHeight + x_label2border;
|
||||
if( x_label != null ) insets.bottom += fontHeight;
|
||||
|
||||
// top:
|
||||
if( show_arrows ) insets.top += y_values2arrow + arrow_length;
|
||||
insets.top += axis2border;
|
||||
|
||||
// right:
|
||||
if( show_arrows ) insets.right += x_values2arrow + arrow_length;
|
||||
insets.right += axis2border;
|
||||
getSrcdX( fm, c.getSize() );
|
||||
n = (int)( src_rect.x + src_rect.width / src_dX );
|
||||
if( n < 0 ) n ++;
|
||||
int w = fm.stringWidth( format_x.format(n * src_dX) );
|
||||
if( w / 2 > insets.right ) insets.right = w / 2;
|
||||
|
||||
old_insets = insets;
|
||||
return insets;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* END OF FILE
|
||||
****************************************************************************/
|
Reference in New Issue
Block a user