/*
* Open Source Physics software is free software as described near the bottom of this code file.
*
* For additional information and documentation on Open Source Physics please see:
* <http://www.opensourcephysics.org/>
*/
package org.opensourcephysics.display;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
/**
* A text line that is offset relative to a drawing panel's display area.
*
* @author Wolfgang Christian
* @version 1.0
*/
public class TitleText extends DrawableTextLine {
public static final int CENTER = 0; // shadows superclass field
public static final int BOTTOM = 1;
public static final int LEFT = 2; // shadows superclass field
public static final int TOP = 3;
public static final int RIGHT = 4; // shadows superclass field
public static final int CUSTOM = 5;
int location = TOP;
int xoff = 0, yoff = 0; // offsets
boolean dirty = true;
/**
* TitleText draws a TextLine relative to a drawing panel's edge.
*
* @param text String
*/
public TitleText(String text) {
super(text, 0, 0);
setFont(new Font("TimesRoman", Font.BOLD, 14)); //$NON-NLS-1$
setJustification(TextLine.CENTER);
}
/**
* Sets the x and y offsets.
*
* @param xoff double
* @param yoff double
*/
public void setOffsets(int xoff, int yoff) {
this.xoff = xoff;
this.yoff = yoff;
}
/**
* Sets the location of the text relative to a display area edge
* @param location int
*/
public void setLocation(int location) {
this.location = location;
switch(location) {
case LEFT :
case RIGHT :
theta = Math.PI/2;
break;
default :
theta = 0;
}
}
/**
* Sets the font used to display the text.
*
* @param font Font
*/
public void setFont(Font font) {
super.setFont(font);
dirty = true;
}
/**
* Sets the text to be displayed.
*
* @param text String
*/
public void setText(String text) {
super.setText(text);
dirty = true;
}
/**
* Draws the TextLine offset from the location.
*
* @param panel DrawingPanel
* @param g Graphics
*/
public void draw(DrawingPanel panel, Graphics g) {
if(dirty) {
parseText(g);
dirty = false;
}
int xpix = 0, ypix = 0;
switch(location) {
case CENTER :
xpix = panel.getLeftGutter()+(panel.width-panel.getLeftGutter()-panel.getRightGutter())/2;
ypix = panel.getTopGutter()+(panel.height-panel.getTopGutter()-panel.getBottomGutter())/2;
break;
case BOTTOM :
xpix = panel.getLeftGutter()+(panel.width-panel.leftGutter-panel.rightGutter)/2;
ypix = (panel.getBottomGutter()>height+yoff) ? // is gutter large enough?
panel.getHeight()-panel.bottomGutter+yoff+height : // draw in bottom gutter
panel.getHeight()-panel.bottomGutter-yoff; // draw in display area
break;
case LEFT :
xpix = (panel.leftGutter>height+xoff) ? // is left gutter large enought?
panel.leftGutter-xoff : // draw in left of gutter
panel.leftGutter+xoff+height; // draw in display area
ypix = panel.getTopGutter()+(panel.height-panel.getTopGutter()-panel.getBottomGutter())/2;
break;
default :
case TOP :
xpix = panel.getLeftGutter()+(panel.width-panel.leftGutter-panel.rightGutter)/2;
ypix = (panel.getTopGutter()>ascent+yoff) ? // is gutter large enough?
panel.getTopGutter()-yoff-descent-1 : // draw in gutter
panel.getTopGutter()+yoff+ascent+1; // draw in display area
break;
case RIGHT :
xpix = (panel.rightGutter>height+xoff) ? // is right gutter large enought?
panel.width-panel.leftGutter+xoff+height : // draw in left of gutter
panel.width-panel.leftGutter-xoff; // draw in display area
ypix = panel.getTopGutter()+(panel.height-panel.getTopGutter()-panel.getBottomGutter())/2;
break;
case CUSTOM :
xpix = xoff;
ypix = yoff;
break;
}
Graphics2D g2 = (Graphics2D) g;
Shape currentClip = g2.getClip();
Rectangle viewRect = panel.getViewRect();
if(viewRect==null) {
g2.setClip(0, 0, panel.getWidth(), panel.getHeight());
} else { // set the clip to the entire viewport
g2.setClip(viewRect.x, viewRect.y, viewRect.x+viewRect.width, viewRect.y+viewRect.height);
}
drawText(g, xpix, ypix);
g2.setClip(currentClip); // restore the original clipping
}
}
/*
* Open Source Physics software is free software; you can redistribute
* it and/or modify it under the terms of the GNU General Public License (GPL) as
* published by the Free Software Foundation; either version 2 of the License,
* or(at your option) any later version.
* Code that uses any portion of the code in the org.opensourcephysics package
* or any subpackage (subdirectory) of this package must must also be be released
* under the GNU GPL license.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA
* or view the license online at http://www.gnu.org/copyleft/gpl.html
*
* Copyright (c) 2007 The Open Source Physics project
* http://www.opensourcephysics.org
*/