/*
* 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.ejs.control;
import java.awt.Color;
import java.awt.Font;
import java.awt.Rectangle;
import java.util.StringTokenizer;
import org.opensourcephysics.ejs.control.value.BooleanValue;
import org.opensourcephysics.ejs.control.value.ObjectValue;
import org.opensourcephysics.ejs.control.value.Value;
/**
* This class provides static methods that parse a string and return
* a Value with the corresponding type and value, ready to be used by
* the setValue() method of ControlElements
*/
public class ConstantParser {
// -------------- public variables and methods -----------
public static final java.awt.Color NULL_COLOR = new java.awt.Color(0, 0, 0, 0);
static private Font defaultFont = new Font("Dialog", 12, Font.PLAIN); //$NON-NLS-1$
static public Value fontConstant(Font _currentFont, String _value) {
if(_value.indexOf(',')<0) {
return null; // No commas, not a valid constant
}
if(_currentFont==null) {
_currentFont = defaultFont;
}
int style = _currentFont.getStyle();
int size = _currentFont.getSize();
String name = null;
StringTokenizer t = new StringTokenizer(_value, ",", true); //$NON-NLS-1$
if(t.hasMoreTokens()) {
name = t.nextToken();
if(name.equals(",")) { //$NON-NLS-1$
name = _currentFont.getName();
} else if(t.hasMoreTokens()) {
t.nextToken(); // read out next ','
}
} else {
name = _currentFont.getName();
}
if(t.hasMoreTokens()) {
String styleStr = t.nextToken().toLowerCase();
style = _currentFont.getStyle();
if(!styleStr.equals(",")) { //$NON-NLS-1$
if(styleStr.indexOf("plain")!=-1) { //$NON-NLS-1$
style = java.awt.Font.PLAIN;
}
if(styleStr.indexOf("bold")!=-1) { //$NON-NLS-1$
style = java.awt.Font.BOLD;
}
if(styleStr.indexOf("italic")!=-1) { //$NON-NLS-1$
style = style|java.awt.Font.ITALIC;
}
if(t.hasMoreTokens()) {
t.nextToken(); // read out next ','
}
}
}
if(t.hasMoreTokens()) {
try {
size = Integer.parseInt(t.nextToken());
} catch(Exception exc) {
size = _currentFont.getSize();
}
}
return new ObjectValue(new Font(name, style, size));
}
static public Value booleanConstant(String _value) {
if(_value.equals("true")) { //$NON-NLS-1$
return new BooleanValue(true);
}
if(_value.equals("false")) { //$NON-NLS-1$
return new BooleanValue(false);
}
return null; // Not a valid constant
}
static public Value colorConstant(String _value) {
if(_value.indexOf(',')>=0) { // format is red,green,blue
try {
StringTokenizer t = new StringTokenizer(_value, ":,"); //$NON-NLS-1$
int r = Integer.parseInt(t.nextToken());
int g = Integer.parseInt(t.nextToken());
int b = Integer.parseInt(t.nextToken());
int alpha;
if(t.hasMoreTokens()) {
alpha = Integer.parseInt(t.nextToken());
} else {
alpha = 255;
}
if(r<0) {
r = 0;
} else if(r>255) {
r = 255;
}
if(g<0) {
g = 0;
} else if(g>255) {
g = 255;
}
if(b<0) {
b = 0;
} else if(b>255) {
b = 255;
}
if(alpha<0) {
alpha = 0;
} else if(alpha>255) {
alpha = 255;
}
return new ObjectValue(new Color(r, g, b, alpha));
} catch(Exception exc) {
exc.printStackTrace();
return null;
}
}
if(_value.equals("null")||_value.equals("none")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(NULL_COLOR);
}
if(_value.equals("black")||_value.equals("Color.black")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(Color.black);
}
if(_value.equals("blue")||_value.equals("Color.blue")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(Color.blue);
}
if(_value.equals("cyan")||_value.equals("Color.cyan")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(Color.cyan);
}
if(_value.equals("darkGray")||_value.equals("Color.darkGray")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(Color.darkGray);
}
if(_value.equals("gray")||_value.equals("Color.gray")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(Color.gray);
}
if(_value.equals("green")||_value.equals("Color.green")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(Color.green);
}
if(_value.equals("lightGray")||_value.equals("Color.lightGray")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(Color.lightGray);
}
if(_value.equals("magenta")||_value.equals("Color.magenta")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(Color.magenta);
}
if(_value.equals("orange")||_value.equals("Color.orange")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(Color.orange);
}
if(_value.equals("pink")||_value.equals("Color.pink")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(Color.pink);
}
if(_value.equals("red")||_value.equals("Color.red")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(Color.red);
}
if(_value.equals("white")||_value.equals("Color.white")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(Color.white);
}
if(_value.equals("yellow")||_value.equals("Color.yellow")) { //$NON-NLS-1$ //$NON-NLS-2$
return new ObjectValue(Color.yellow);
}
return null; // Not a valid constant
}
static public Value formatConstant(String _value) {
if(_value.indexOf(";")==-1) { // FKH 021103 //$NON-NLS-1$
int id1 = _value.indexOf("0"), id2 = _value.indexOf("#"), id = -1; //$NON-NLS-1$ //$NON-NLS-2$
if((id1>0)&&(id2>0)) {
id = (id1<id2) ? id1 : id2;
} else if(id1>0) {
id = id1;
} else if(id2>0) {
id = id2;
}
if(id>0) {
_value = _value+";"+_value.substring(0, id)+"-"+_value.substring(id); //$NON-NLS-1$ //$NON-NLS-2$
}
} // endFKH 021103
try {
return new ObjectValue(new java.text.DecimalFormat(_value));
} catch(IllegalArgumentException _exc) {
return null;
}
}
static public Value rectangleConstant(String _value) {
if(_value.indexOf(',')<0) {
return null; // No commas, not a valid constant
}
try { // x,y,w,h
StringTokenizer t = new StringTokenizer(_value, ","); //$NON-NLS-1$
int x = Integer.parseInt(t.nextToken());
int y = Integer.parseInt(t.nextToken());
int w = Integer.parseInt(t.nextToken());
int h = Integer.parseInt(t.nextToken());
return new ObjectValue(new Rectangle(x, y, w, h));
} catch(Exception exc) {
exc.printStackTrace();
return null;
}
}
} // end of class
/*
* 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
*/