package edu.byu.cs.roots.opg.chart.circ; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.geom.AffineTransform; import java.awt.geom.Arc2D; import edu.byu.cs.roots.opg.chart.cmds.DrawCommand; import edu.byu.cs.roots.opg.chart.cmds.DrawState; public class FilledArcSeg extends DrawCommand { /** * */ private static final long serialVersionUID = 5022278031240974944L; float radius, width; float startang, sweep; Color c, outline; public String[] textlines = null; float maxfontsize; float minfontsize; float fontsize; int maxlines; public FilledArcSeg(float rad, float width, float startang, float sweep, Color c) { super(); this.radius = rad; this.width = width; this.startang = startang; this.sweep = sweep; this.c = c; outline = Color.black; textlines = null; fontsize = 12; maxfontsize = 12; minfontsize = 4; } public FilledArcSeg(float rad, float width, float startang, float sweep, Color c, Color outline) { super(); this.radius = rad; this.width = width; this.startang = startang; this.sweep = sweep; this.c = c; textlines = null; fontsize = 12; maxfontsize = 12; minfontsize = 4; } public void execute(Graphics2D g, DrawState state) { float x = (float) state.pos.x; float y = (float) state.pos.y; float dia = 2*radius; float line = .5f; g.setColor(outline); BasicStroke s = new BasicStroke((float) (width),BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); g.setStroke(s); g.draw(new Arc2D.Double( (x-radius), (y-radius), dia, dia, startang, sweep, Arc2D.OPEN)); float edge = (float)((360*line)/(2*Math.PI*radius)); if(width - 2*line > 0 ){ g.setColor(c); s = new BasicStroke((float) width-2*line,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); g.setStroke(s); g.draw(new Arc2D.Double( (x-radius), (y-radius), dia, dia, startang+edge,sweep-2*edge, Arc2D.OPEN)); } //text processing if (textlines != null) { // float fontsize = (float) (Math.toRadians(.8*sweep/textlines.length) * radius); Font f = g.getFont(); // for(String textline:textlines){ // float tmp = FontMaximizer.getMaxFontSize(g, f, textline, width); // if(tmp < fontsize) fontsize = tmp; // } // // // if(fontsize > maxfontsize) fontsize = maxfontsize; // else if(fontsize < minfontsize) fontsize = minfontsize; // maxlines = (int) (Math.toRadians(.8*sweep) * radius / fontsize); // maxlines = (maxlines >textlines.length)? textlines.length: // (maxlines == 0)? 1:maxlines; // f = f.deriveFont(fontsize); // f = f.deriveFont(fontsize).deriveFont(new AffineTransform()); // double textspacing = g.getFontMetrics(f).getHeight(); double textspacing = 1.1*f.getSize(); // System.out.println("text height "+ textspacing); double textanglespace = Math.toDegrees(textspacing/radius); // System.out.println(textanglespace); g.setColor(outline); // maxlines = textlines.length; // System.out.println("maxlines: " + maxlines); for(int i = 0; i < maxlines ; i++){ // double textangle = Math.toRadians(startang + .5 * sweep ); // double textangleadj = ((i+1)*textanglespace - maxlines*textanglespace*.5 - .5*textspacing/(radius)); // double rotate; // int offset; // if (textangle > Math.PI * .5 && textangle < Math.PI * 1.5){ // textangle+=textangleadj; // rotate = Math.PI - textangle; // offset = 1; // }else{ // textangle-=textangleadj; // rotate = 0 - textangle; // offset = -1; // } // AffineTransform at = AffineTransform.getRotateInstance(rotate); double textangle = (startang > 90 && startang < 270) ? startang + (i+.75)*textanglespace + .5*sweep - (maxlines)*textanglespace*.5 : startang + (maxlines-(i+.75))*textanglespace +.5*sweep - (maxlines)*textanglespace*.5; double rotate = (startang > 90 && startang < 270) ? 180-textangle:0-textangle; // System.out.println(textangle + " " + textlines[i]); rotate = Math.toRadians(rotate); textangle = Math.toRadians(textangle); AffineTransform at = AffineTransform.getRotateInstance(rotate); int offset = (startang > 90 && startang < 270) ? 1 : -1; g.setFont(f.deriveFont(at)); // System.out.println(textlines[i]); g.drawString(textlines[i], (float) (x + (radius + offset * width * .48) * Math.cos(textangle)), (float) (y - (radius + offset * width * .48) * Math.sin(textangle))); } } } public void execute(Graphics2D g, DrawState state, int width, int height, double zoom, Point multiChartOffset) { execute(g, state); } @Override public void executeAbsolute(Graphics2D g, DrawState state, int width, int height, double zoom) { } @Override public Rectangle getShapeBox() { return null; } }