/* * 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.display3d.simple3d; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Stroke; import org.opensourcephysics.controls.XML; import org.opensourcephysics.controls.XMLControl; public class Style implements org.opensourcephysics.display3d.core.Style { static final int STYLE_LINE_COLOR = 0; static final int STYLE_LINE_WIDTH = 1; static final int STYLE_FILL_COLOR = 2; static final int STYLE_RESOLUTION = 3; static final int STYLE_DRAWING_FILL = 4; static final int STYLE_DRAWING_LINES = 5; static final int STYLE_RELATIVE_POSITION = 6; // Configuration variables private boolean drawsFill = true, drawsLines = true; private Color lineColor = Color.black; private float lineWidth = 1.0f; private Color fillColor = Color.blue; private org.opensourcephysics.display3d.core.Resolution resolution = null; private double depthFactor = 1.0; /** * Indicates if the drawable should displace itself from the drawing point. * Standard values are provided as static class members. Default is CENTERED. */ private int position = CENTERED; // Implementation variables private boolean drawFillsSet = false, drawLinesSet = false; private String textureFile1 = null; private String textureFile2 = null; private double transpTexture = Double.NaN; private boolean combineTexture = false; /** * The owner element. This is needed to report to the element any change. */ private Element element = null; private Stroke lineStroke = new BasicStroke(lineWidth); /** * Package-private constructor * User must obtain Style objects from elements, by using the getStyle() method * @param _element Element */ Style(Element _element) { this.element = _element; } /** * Sets the element. For the use of ElementLoader only. * @param _element Element */ void setElement(Element _element) { this.element = _element; } public void setLineColor(Color _color) { if(_color==null) { return; // Ignore null colors } this.lineColor = _color; if(element!=null) { element.styleChanged(STYLE_LINE_COLOR); } } final public Color getLineColor() { return this.lineColor; } public void setLineWidth(float _width) { if(this.lineWidth==_width) { return; } this.lineStroke = new BasicStroke(this.lineWidth = _width); if(element!=null) { element.styleChanged(STYLE_LINE_WIDTH); } } final public float getLineWidth() { return this.lineWidth; } /** * Gets the Stroke derived from the line width * @return Stroke * @see java.awt.Stroke */ final Stroke getLineStroke() { return this.lineStroke; } public void setFillColor(Color _color) { if(_color==null) { return; // Ignore null colors } this.fillColor = _color; if(element!=null) { element.styleChanged(STYLE_FILL_COLOR); } } final public Color getFillColor() { return this.fillColor; } public void setResolution(org.opensourcephysics.display3d.core.Resolution _res) { this.resolution = _res; // No need to clone. Resolution is unmutable if(element!=null) { element.styleChanged(STYLE_RESOLUTION); } } // No danger. Resolution is unmutable final public org.opensourcephysics.display3d.core.Resolution getResolution() { return this.resolution; } public boolean isDrawingFill() { return drawsFill; } public void setDrawingFill(boolean _drawsFill) { this.drawsFill = _drawsFill; drawFillsSet = true; if(element!=null) { element.styleChanged(STYLE_DRAWING_FILL); } } public boolean isDrawingLines() { return drawsLines; } public void setDrawingLines(boolean _drawsLines) { this.drawsLines = _drawsLines; drawLinesSet = true; if(element!=null) { element.styleChanged(STYLE_DRAWING_LINES); } } public void setDepthFactor(double factor) { this.depthFactor = factor; } public double getDepthFactor() { return this.depthFactor; } //CJB public void setTexture(String file1, String file2, double transparency, boolean combine) { textureFile1 = file1; textureFile2 = file2; this.transpTexture = transparency; this.combineTexture = combine; } public String[] getTextures() { return new String[] {textureFile1, textureFile2}; } public double getTransparency() { return transpTexture; } public boolean getCombine() { return combineTexture; } //CJB final public void setRelativePosition(int _position) { this.position = _position; element.styleChanged(STYLE_RELATIVE_POSITION); } final public int getRelativePosition() { return this.position; } public void copyTo(org.opensourcephysics.display3d.core.Style target) { target.setDrawingFill(drawsFill); target.setDrawingLines(drawsLines); target.setLineColor(lineColor); target.setLineWidth(lineWidth); target.setFillColor(fillColor); target.setResolution(resolution); target.setDepthFactor(depthFactor); target.setRelativePosition(position); } // ---------------------------------------------------- // XML loader // ---------------------------------------------------- public static XML.ObjectLoader getLoader() { return new StyleLoader(); } protected static class StyleLoader extends org.opensourcephysics.display3d.core.Style.Loader { public Object createObject(XMLControl control) { return new Style((Element) null); } public void saveObject(XMLControl control, Object obj) { Style style = (Style) obj; control.setValue("line color", style.getLineColor()); //$NON-NLS-1$ control.setValue("line width", style.getLineWidth()); //$NON-NLS-1$ control.setValue("fill color", style.getFillColor()); //$NON-NLS-1$ control.setValue("resolution", style.getResolution()); //$NON-NLS-1$ if(style.drawFillsSet) { control.setValue("drawing fill", style.isDrawingFill()); //$NON-NLS-1$ } if(style.drawLinesSet) { control.setValue("drawing lines", style.isDrawingLines()); //$NON-NLS-1$ } } public Object loadObject(XMLControl control, Object obj) { Style style = (Style) obj; style.setLineColor((Color) control.getObject("line color")); //$NON-NLS-1$ style.setLineWidth((float) control.getDouble("line width")); //$NON-NLS-1$ style.setFillColor((Color) control.getObject("fill color")); //$NON-NLS-1$ style.setResolution((org.opensourcephysics.display3d.core.Resolution) control.getObject("resolution")); //$NON-NLS-1$ if(control.getPropertyType("drawing fill")!=null) { //$NON-NLS-1$ System.out.println("Reading drawFills"); //$NON-NLS-1$ style.setDrawingFill(control.getBoolean("drawing fill")); //$NON-NLS-1$ } else { System.out.println("Not reading drawFills"); //$NON-NLS-1$ } if(control.getPropertyType("drawing lines")!=null) { //$NON-NLS-1$ System.out.println("Reading drawLines"); //$NON-NLS-1$ style.setDrawingLines(control.getBoolean("drawing lines")); //$NON-NLS-1$ } else { System.out.println("Not reading drawLines"); //$NON-NLS-1$ } return obj; } } } /* * 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 */