
eu.hansolo.steelseries.tools.TickmarkImageFactory Maven / Gradle / Ivy
Go to download
The SteelSeries is a javabeans component library that contains gauges.
You will find linear and radial gauges. In addition you will also find
digital displays.
package eu.hansolo.steelseries.tools;
/**
* @author Gerrit Grunwald
*/
public enum TickmarkImageFactory
{
INSTANCE;
private final eu.hansolo.steelseries.tools.Util UTIL = eu.hansolo.steelseries.tools.Util.INSTANCE;
private static final java.awt.BasicStroke MAJOR_TICKMARK_STROKE = new java.awt.BasicStroke(1.0f, java.awt.BasicStroke.CAP_ROUND, java.awt.BasicStroke.JOIN_BEVEL);
private static final java.awt.BasicStroke MEDIUM_TICKMARK_STROKE = new java.awt.BasicStroke(0.5f, java.awt.BasicStroke.CAP_ROUND, java.awt.BasicStroke.JOIN_BEVEL);
private static final java.awt.BasicStroke MINOR_TICKMARK_STROKE = new java.awt.BasicStroke(0.3f, java.awt.BasicStroke.CAP_ROUND, java.awt.BasicStroke.JOIN_BEVEL);
private eu.hansolo.steelseries.tools.NumberFormat numberFormat = eu.hansolo.steelseries.tools.NumberFormat.STANDARD;
// Buffer variables of radial gauges
private java.awt.image.BufferedImage imageBufferRad = UTIL.createImage(1, 1, java.awt.Transparency.TRANSLUCENT);
private int widthBufferRad = 200;
private double minValueBufferRad = 0;
private double maxValueBufferRad = 100;
private int noOfMinorTicksBufferRad = 0;
private int noOfMajorTicksBufferRad = 0;
private double minorTickSpacingBufferRad = 10;
private double majorTickSpacingBufferRad = 10;
private eu.hansolo.steelseries.tools.GaugeType gaugeTypeBufferRad = eu.hansolo.steelseries.tools.GaugeType.TYPE4;
private eu.hansolo.steelseries.tools.TickmarkType minorTickmarkTypeBufferRad = eu.hansolo.steelseries.tools.TickmarkType.LINE;
private eu.hansolo.steelseries.tools.TickmarkType majorTickmarkTypeBufferRad = eu.hansolo.steelseries.tools.TickmarkType.LINE;
private boolean ticksVisibleBufferRad = true;
private boolean ticklabelsVisibleBufferRad = true;
private boolean tickmarkSectionsVisibleBufferRad = false;
private boolean minorTicksVisibleBufferRad = true;
private boolean majorTicksVisibleBufferRad = true;
private eu.hansolo.steelseries.tools.NumberFormat numberFormatBufferRad = eu.hansolo.steelseries.tools.NumberFormat.AUTO;
private eu.hansolo.steelseries.tools.BackgroundColor backgroundColorBufferRad = eu.hansolo.steelseries.tools.BackgroundColor.DARK_GRAY;
private java.awt.Color tickmarkColorBufferRad = backgroundColorBufferRad.LABEL_COLOR;
private boolean tickmarkColorFromThemeBufferRad = true;
private java.util.List tickmarkSectionsBufferRad = new java.util.ArrayList(10);
private float radiusFactorBufferRad = 0.38f;
private float textDistanceFactorBufferRad = 0.09f;
private java.awt.geom.Point2D centerBufferRad = new java.awt.geom.Point2D.Double();
private java.awt.geom.Point2D offsetBufferRad = new java.awt.geom.Point2D.Double();
private eu.hansolo.steelseries.tools.Orientation orientationBufferRad = eu.hansolo.steelseries.tools.Orientation.NORTH;
// Buffer variables of linear gauges
private java.awt.image.BufferedImage imageBufferLin = UTIL.createImage(1, 1, java.awt.Transparency.TRANSLUCENT);
private int widthBufferLin = 140;
private int heightBufferLin = 0;
private double minValueBufferLin = 0;
private double maxValueBufferLin = 100;
private int noOfMinorTicksBufferLin = 0;
private int noOfMajorTicksBufferLin = 0;
private double minorTickSpacingBufferLin = 10;
private double majorTickSpacingBufferLin = 10;
private eu.hansolo.steelseries.tools.TickmarkType minorTickmarkTypeBufferLin = eu.hansolo.steelseries.tools.TickmarkType.LINE;
private eu.hansolo.steelseries.tools.TickmarkType majorTickmarkTypeBufferLin = eu.hansolo.steelseries.tools.TickmarkType.LINE;
private boolean ticksVisibleBufferLin = true;
private boolean ticklabelsVisibleBufferLin = true;
private boolean minorTicksVisibleBufferLin = true;
private boolean majorTicksVisibleBufferLin = true;
private eu.hansolo.steelseries.tools.NumberFormat numberFormatBufferLin = eu.hansolo.steelseries.tools.NumberFormat.AUTO;
private boolean tickmarkSectionsVisibleBufferLin = false;
private eu.hansolo.steelseries.tools.BackgroundColor backgroundColorBufferLin = eu.hansolo.steelseries.tools.BackgroundColor.DARK_GRAY;
private java.awt.Color tickmarkColorBufferLin = backgroundColorBufferLin.LABEL_COLOR;
private boolean tickmarkColorFromThemeBufferLin = true;
private java.util.List tickmarkSectionsBufferLin = new java.util.ArrayList(10);
private java.awt.geom.Point2D offsetBufferLin = new java.awt.geom.Point2D.Double();
private eu.hansolo.steelseries.tools.Orientation orientationBufferLin = eu.hansolo.steelseries.tools.Orientation.VERTICAL;
public java.awt.image.BufferedImage create_RADIAL_TICKMARKS_Image(final int WIDTH,
final double MIN_VALUE,
final double MAX_VALUE,
final int NO_OF_MINOR_TICKS,
final int NO_OF_MAJOR_TICKS,
final double MINOR_TICK_SPACING,
final double MAJOR_TICK_SPACING,
final eu.hansolo.steelseries.tools.GaugeType GAUGE_TYPE,
final eu.hansolo.steelseries.tools.TickmarkType MINOR_TICKMARK_TYPE,
final eu.hansolo.steelseries.tools.TickmarkType MAJOR_TICKMARK_TYPE,
final boolean TICKS_VISIBLE,
final boolean TICKLABELS_VISIBLE,
final boolean MINOR_TICKS_VISIBLE,
final boolean MAJOR_TICKS_VISIBLE,
final eu.hansolo.steelseries.tools.NumberFormat NUMBER_FORMAT,
final boolean TICKMARK_SECTIONS_VISIBLE,
final eu.hansolo.steelseries.tools.BackgroundColor BACKGROUND_COLOR,
final java.awt.Color TICKMARK_COLOR,
final boolean TICKMARK_COLOR_FROM_THEME,
final java.util.List TICKMARK_SECTIONS,
final float RADIUS_FACTOR,
final float TEXT_DISTANCE_FACTOR,
final java.awt.geom.Point2D CENTER,
final java.awt.geom.Point2D OFFSET,
final eu.hansolo.steelseries.tools.Orientation ORIENTATION,
final java.awt.image.BufferedImage BACKGROUND_IMAGE)
{
if (WIDTH <= 0)
{
return UTIL.createImage(1, 1, java.awt.Transparency.TRANSLUCENT);
}
// Buffer check
if (WIDTH == widthBufferRad &&
Double.compare(MIN_VALUE, minValueBufferRad) == 0 &&
Double.compare(MAX_VALUE, maxValueBufferRad) == 0 &&
NO_OF_MINOR_TICKS == noOfMinorTicksBufferRad &&
NO_OF_MAJOR_TICKS == noOfMajorTicksBufferRad &&
Double.compare(MINOR_TICK_SPACING, minorTickSpacingBufferRad) == 0 &&
Double.compare(MAJOR_TICK_SPACING, majorTickSpacingBufferRad) == 0 &&
GAUGE_TYPE == gaugeTypeBufferRad &&
MINOR_TICKMARK_TYPE == minorTickmarkTypeBufferRad &&
MAJOR_TICKMARK_TYPE == majorTickmarkTypeBufferRad &&
TICKS_VISIBLE == ticksVisibleBufferRad &&
TICKLABELS_VISIBLE == ticklabelsVisibleBufferRad &&
MINOR_TICKS_VISIBLE == minorTicksVisibleBufferRad &&
MAJOR_TICKS_VISIBLE == majorTicksVisibleBufferRad &&
TICKMARK_SECTIONS_VISIBLE == tickmarkSectionsVisibleBufferRad &&
NUMBER_FORMAT == numberFormatBufferRad &&
BACKGROUND_COLOR == backgroundColorBufferRad &&
TICKMARK_COLOR.equals(tickmarkColorBufferRad) &&
TICKMARK_COLOR_FROM_THEME == tickmarkColorFromThemeBufferRad &&
TICKMARK_SECTIONS.containsAll(tickmarkSectionsBufferRad) &&
Float.compare(RADIUS_FACTOR, radiusFactorBufferRad) == 0 &&
Float.compare(TEXT_DISTANCE_FACTOR, textDistanceFactorBufferRad) == 0 &&
CENTER.equals(centerBufferRad) &&
OFFSET.equals(offsetBufferRad) &&
orientationBufferRad == ORIENTATION)
{
if (BACKGROUND_IMAGE != null)
{
final java.awt.Graphics2D G = BACKGROUND_IMAGE.createGraphics();
G.drawImage(imageBufferRad, 0, 0, null);
G.dispose();
return imageBufferRad;
}
}
// Create image if it equals null
if (imageBufferRad != null)
{
imageBufferRad.flush();
}
imageBufferRad = UTIL.createImage(WIDTH, WIDTH, java.awt.Transparency.TRANSLUCENT);
// Adjust the number format of the ticklabels
if (NUMBER_FORMAT == eu.hansolo.steelseries.tools.NumberFormat.AUTO)
{
if (Math.abs(MAJOR_TICK_SPACING) > 1000)
{
numberFormat = eu.hansolo.steelseries.tools.NumberFormat.SCIENTIFIC;
}
else if (MAJOR_TICK_SPACING % 1.0 != 0)
{
numberFormat = eu.hansolo.steelseries.tools.NumberFormat.FRACTIONAL;
}
}
else
{
numberFormat = NUMBER_FORMAT;
}
// Definitions
final java.awt.Font STD_FONT = new java.awt.Font("Verdana", 0, (int) (0.04 * WIDTH));
final int TEXT_DISTANCE = (int) (TEXT_DISTANCE_FACTOR * WIDTH);
final double TICKLABEL_ROTATION_OFFSET = 0;
final int MINOR_TICK_LENGTH = (int) (0.0133333333 * WIDTH);
final int MEDIUM_TICK_LENGTH = (int) (0.02 * WIDTH);
final int MAJOR_TICK_LENGTH = (int) (0.03 * WIDTH);
final int MINOR_DIAMETER = (int) (0.0093457944 * WIDTH);
//final int MEDIUM_DIAMETER = (int) (0.0186915888 * WIDTH);
final int MAJOR_DIAMETER = (int) (0.03 * WIDTH);
final java.awt.geom.Point2D TEXT_POINT = new java.awt.geom.Point2D.Double(0, 0);
final java.awt.geom.Point2D INNER_POINT = new java.awt.geom.Point2D.Double(0, 0);
final java.awt.geom.Point2D OUTER_POINT = new java.awt.geom.Point2D.Double(0, 0);
final java.awt.geom.Point2D OUTER_POINT_LEFT = new java.awt.geom.Point2D.Double(0,0);
final java.awt.geom.Point2D OUTER_POINT_RIGHT = new java.awt.geom.Point2D.Double(0,0);
final java.awt.geom.Line2D TICK_LINE = new java.awt.geom.Line2D.Double(0, 0, 1, 1);
final java.awt.geom.Ellipse2D TICK_CIRCLE = new java.awt.geom.Ellipse2D.Double(0, 0, 1, 1);
final java.awt.geom.GeneralPath TICK_TRIANGLE = new java.awt.geom.GeneralPath();
final double ROTATION_OFFSET = GAUGE_TYPE.ROTATION_OFFSET; // Depends on GaugeType
final float RADIUS = WIDTH * RADIUS_FACTOR;
final double ANGLE_STEP = (GAUGE_TYPE.ANGLE_RANGE / ((MAX_VALUE - MIN_VALUE) / MINOR_TICK_SPACING));
double sinValue = 0;
double cosValue = 0;
double valueCounter = MIN_VALUE;
int majorTickCounter = NO_OF_MINOR_TICKS - 1; // Indicator when to draw the major tickmark
// Create the image
final java.awt.Graphics2D G2 = imageBufferRad.createGraphics();
G2.setRenderingHint(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON);
//G2.setRenderingHint(java.awt.RenderingHints.KEY_FRACTIONALMETRICS, java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_ON);
G2.setRenderingHint(java.awt.RenderingHints.KEY_STROKE_CONTROL, java.awt.RenderingHints.VALUE_STROKE_PURE);
G2.setRenderingHint(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING, java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
// Set some default parameters for the graphics object
if (OFFSET != null)
{
G2.translate(OFFSET.getX(), OFFSET.getY());
}
G2.setFont(STD_FONT);
G2.rotate(ROTATION_OFFSET - Math.PI, CENTER.getX(), CENTER.getY());
if (TICKMARK_COLOR_FROM_THEME)
{
G2.setColor(BACKGROUND_COLOR.LABEL_COLOR);
}
else
{
G2.setColor(TICKMARK_COLOR);
}
for (double alpha = 0, counter = MIN_VALUE; Float.compare((float) counter, (float) MAX_VALUE) <= 0; alpha -= ANGLE_STEP, counter += MINOR_TICK_SPACING)
{
// Set the color
if (TICKMARK_SECTIONS != null && !TICKMARK_SECTIONS.isEmpty())
{
if (TICKMARK_SECTIONS_VISIBLE)
{
for (eu.hansolo.steelseries.tools.Section section : TICKMARK_SECTIONS)
{
if (Double.compare(valueCounter, section.getStart()) >= 0 && Double.compare(valueCounter, section.getStop()) <= 0)
{
G2.setColor(section.getColor());
break;
}
else if (TICKMARK_COLOR_FROM_THEME)
{
G2.setColor(BACKGROUND_COLOR.LABEL_COLOR);
}
else
{
G2.setColor(TICKMARK_COLOR);
}
}
}
else
{
if (TICKMARK_COLOR_FROM_THEME)
{
G2.setColor(BACKGROUND_COLOR.LABEL_COLOR);
}
else
{
G2.setColor(TICKMARK_COLOR);
}
}
}
sinValue = Math.sin(alpha);
cosValue = Math.cos(alpha);
majorTickCounter++;
// Draw tickmark every major tickmark spacing
if (majorTickCounter == NO_OF_MINOR_TICKS)
{
G2.setStroke(MAJOR_TICKMARK_STROKE);
INNER_POINT.setLocation(CENTER.getX() + (RADIUS - MAJOR_TICK_LENGTH) * sinValue, CENTER.getY() + (RADIUS - MAJOR_TICK_LENGTH) * cosValue);
OUTER_POINT.setLocation(CENTER.getX() + RADIUS * sinValue, CENTER.getY() + RADIUS * cosValue);
TEXT_POINT.setLocation(CENTER.getX() + (RADIUS - TEXT_DISTANCE) * sinValue, CENTER.getY() + (RADIUS - TEXT_DISTANCE) * cosValue);
// Draw the major tickmarks
if (TICKS_VISIBLE && MAJOR_TICKS_VISIBLE)
{
drawRadialTicks(G2, INNER_POINT, OUTER_POINT, CENTER, RADIUS, MAJOR_TICKMARK_TYPE, TICK_LINE, TICK_CIRCLE, TICK_TRIANGLE, MAJOR_TICK_LENGTH, MAJOR_DIAMETER, OUTER_POINT_LEFT, OUTER_POINT_RIGHT, alpha);
}
// Draw the standard tickmark labels
if (TICKLABELS_VISIBLE)
{
G2.fill(UTIL.rotateTextAroundCenter(G2, numberFormat.format(valueCounter), (int) TEXT_POINT.getX(), (int) TEXT_POINT.getY(), Math.toDegrees(Math.PI - alpha + TICKLABEL_ROTATION_OFFSET)));
}
valueCounter += MAJOR_TICK_SPACING;
majorTickCounter = 0;
continue;
}
// Draw tickmark every minor tickmark spacing
{
INNER_POINT.setLocation(CENTER.getX() + (RADIUS - MINOR_TICK_LENGTH) * sinValue, CENTER.getY() + (RADIUS - MINOR_TICK_LENGTH) * cosValue);
OUTER_POINT.setLocation(CENTER.getX() + RADIUS * sinValue, CENTER.getY() + RADIUS * cosValue);
G2.setStroke(MINOR_TICKMARK_STROKE);
if (NO_OF_MINOR_TICKS % 2 == 0 && majorTickCounter == (NO_OF_MINOR_TICKS / 2))
{
G2.setStroke(MEDIUM_TICKMARK_STROKE);
INNER_POINT.setLocation(CENTER.getX() + (RADIUS - MEDIUM_TICK_LENGTH) * sinValue,
CENTER.getY() + (RADIUS - MEDIUM_TICK_LENGTH) * cosValue);
OUTER_POINT.setLocation(CENTER.getX() + RADIUS * sinValue, CENTER.getY() + RADIUS * cosValue);
}
// Draw the minor tickmarks
if (TICKS_VISIBLE && MINOR_TICKS_VISIBLE)
{
drawRadialTicks(G2, INNER_POINT, OUTER_POINT, CENTER, RADIUS, MINOR_TICKMARK_TYPE, TICK_LINE, TICK_CIRCLE, TICK_TRIANGLE, MINOR_TICK_LENGTH, MINOR_DIAMETER, OUTER_POINT_LEFT, OUTER_POINT_RIGHT, alpha);
}
}
}
G2.dispose();
if (BACKGROUND_IMAGE != null)
{
final java.awt.Graphics2D G = BACKGROUND_IMAGE.createGraphics();
G.drawImage(imageBufferRad, 0, 0, null);
G.dispose();
}
// Buffer the current parameters
widthBufferRad = WIDTH;
minValueBufferRad = MIN_VALUE;
maxValueBufferRad = MAX_VALUE;
noOfMinorTicksBufferRad = NO_OF_MINOR_TICKS;
noOfMajorTicksBufferRad = NO_OF_MAJOR_TICKS;
minorTickSpacingBufferRad = MINOR_TICK_SPACING;
majorTickSpacingBufferRad = MAJOR_TICK_SPACING;
gaugeTypeBufferRad = GAUGE_TYPE;
minorTickmarkTypeBufferRad = MINOR_TICKMARK_TYPE;
majorTickmarkTypeBufferRad = MAJOR_TICKMARK_TYPE;
ticksVisibleBufferRad = TICKS_VISIBLE;
ticklabelsVisibleBufferRad = TICKLABELS_VISIBLE;
minorTicksVisibleBufferRad = MINOR_TICKS_VISIBLE;
majorTicksVisibleBufferRad = MAJOR_TICKS_VISIBLE;
tickmarkSectionsVisibleBufferRad = TICKMARK_SECTIONS_VISIBLE;
numberFormatBufferRad = NUMBER_FORMAT;
backgroundColorBufferRad = BACKGROUND_COLOR;
tickmarkColorBufferRad = TICKMARK_COLOR;
tickmarkColorFromThemeBufferRad = TICKMARK_COLOR_FROM_THEME;
if (TICKMARK_SECTIONS != null)
{
tickmarkSectionsBufferRad.clear();
tickmarkSectionsBufferRad.addAll(TICKMARK_SECTIONS);
}
radiusFactorBufferRad = RADIUS_FACTOR;
textDistanceFactorBufferRad = TEXT_DISTANCE_FACTOR;
centerBufferRad.setLocation(CENTER);
if (OFFSET != null)
{
offsetBufferRad.setLocation(OFFSET);
}
orientationBufferRad = ORIENTATION;
return imageBufferRad;
}
public java.awt.image.BufferedImage create_LINEAR_TICKMARKS_Image(final int WIDTH,
final int HEIGHT,
final double MIN_VALUE,
final double MAX_VALUE,
final int NO_OF_MINOR_TICKS,
final int NO_OF_MAJOR_TICKS,
final double MINOR_TICK_SPACING,
final double MAJOR_TICK_SPACING,
final eu.hansolo.steelseries.tools.TickmarkType MINOR_TICKMARK_TYPE,
final eu.hansolo.steelseries.tools.TickmarkType MAJOR_TICKMARK_TYPE,
final boolean TICKS_VISIBLE,
final boolean TICKLABELS_VISIBLE,
final boolean MINOR_TICKS_VISIBLE,
final boolean MAJOR_TICKS_VISIBLE,
final eu.hansolo.steelseries.tools.NumberFormat NUMBER_FORMAT,
final boolean TICKMARK_SECTIONS_VISIBLE,
final eu.hansolo.steelseries.tools.BackgroundColor BACKGROUND_COLOR,
final java.awt.Color TICKMARK_COLOR,
final boolean TICKMARK_COLOR_FROM_THEME,
final java.util.List TICKMARK_SECTIONS,
final java.awt.geom.Point2D OFFSET,
final eu.hansolo.steelseries.tools.Orientation ORIENTATION,
final java.awt.image.BufferedImage BACKGROUND_IMAGE)
{
if (WIDTH <= 0 || HEIGHT <= 0)
{
return UTIL.createImage(1, 1, java.awt.Transparency.TRANSLUCENT);
}
// Buffer check
if (WIDTH == widthBufferLin &&
HEIGHT == heightBufferLin &&
Double.compare(MIN_VALUE, minValueBufferLin) == 0 &&
Double.compare(MAX_VALUE, maxValueBufferLin) == 0 &&
NO_OF_MINOR_TICKS == noOfMinorTicksBufferLin &&
NO_OF_MAJOR_TICKS == noOfMajorTicksBufferLin &&
Double.compare(MINOR_TICK_SPACING, minorTickSpacingBufferLin) == 0 &&
Double.compare(MAJOR_TICK_SPACING, majorTickSpacingBufferLin) == 0 &&
MINOR_TICKMARK_TYPE == minorTickmarkTypeBufferLin &&
MAJOR_TICKMARK_TYPE == majorTickmarkTypeBufferLin &&
TICKS_VISIBLE == ticksVisibleBufferLin &&
MINOR_TICKS_VISIBLE == minorTicksVisibleBufferLin &&
MAJOR_TICKS_VISIBLE == majorTicksVisibleBufferLin &&
TICKLABELS_VISIBLE == ticklabelsVisibleBufferLin &&
NUMBER_FORMAT == numberFormatBufferLin &&
TICKMARK_SECTIONS_VISIBLE == tickmarkSectionsVisibleBufferLin &&
BACKGROUND_COLOR == backgroundColorBufferLin &&
TICKMARK_COLOR.equals(tickmarkColorBufferLin) &&
TICKMARK_COLOR_FROM_THEME == tickmarkColorFromThemeBufferLin &&
TICKMARK_SECTIONS.containsAll(tickmarkSectionsBufferLin) &&
OFFSET.equals(offsetBufferLin) &&
ORIENTATION == orientationBufferLin)
{
if (BACKGROUND_IMAGE != null)
{
final java.awt.Graphics2D G = BACKGROUND_IMAGE.createGraphics();
G.drawImage(imageBufferLin, 0, 0, null);
G.dispose();
return imageBufferLin;
}
}
// Create image if it equals null
if (imageBufferLin != null)
{
imageBufferLin.flush();
}
imageBufferLin = UTIL.createImage(WIDTH, HEIGHT, java.awt.Transparency.TRANSLUCENT);
// Adjust the number format of the ticklabels
if (NUMBER_FORMAT == eu.hansolo.steelseries.tools.NumberFormat.AUTO)
{
if (Math.abs(MAJOR_TICK_SPACING) > 1000)
{
numberFormat = eu.hansolo.steelseries.tools.NumberFormat.SCIENTIFIC;
}
else if (MAJOR_TICK_SPACING % 1.0 != 0)
{
numberFormat = eu.hansolo.steelseries.tools.NumberFormat.FRACTIONAL;
}
}
else
{
numberFormat = NUMBER_FORMAT;
}
// Definitions
final java.awt.Font STD_FONT;
final java.awt.geom.Rectangle2D SCALE_BOUNDS;
if (ORIENTATION == eu.hansolo.steelseries.tools.Orientation.VERTICAL)
{
// Vertical orientation
STD_FONT = new java.awt.Font("Verdana", 0, (int) (0.062 * WIDTH));
SCALE_BOUNDS = new java.awt.geom.Rectangle2D.Double(0, HEIGHT * 0.12864077669902912, 0, (HEIGHT * 0.8567961165048543 - HEIGHT * 0.12864077669902912));
}
else
{
// Horizontal orientation
STD_FONT = new java.awt.Font("Verdana", 0, (int) (0.062 * HEIGHT));
SCALE_BOUNDS = new java.awt.geom.Rectangle2D.Double(WIDTH * 0.14285714285714285, 0, (WIDTH * 0.8710124827 - WIDTH * 0.14285714285714285), 0);
}
final int MINOR_DIAMETER;
final int MAJOR_DIAMETER;
final int MINOR_TICK_START;
final int MINOR_TICK_STOP;
final int MEDIUM_TICK_START;
final int MEDIUM_TICK_STOP;
final int MAJOR_TICK_START;
final int MAJOR_TICK_STOP;
if (ORIENTATION == eu.hansolo.steelseries.tools.Orientation.VERTICAL)
{
MINOR_DIAMETER = (int) (0.0186915888 * WIDTH);
MAJOR_DIAMETER = (int) (0.0280373832 * WIDTH);
MINOR_TICK_START = (int) (0.34 * WIDTH);
MINOR_TICK_STOP = (int) (0.36 * WIDTH);
MEDIUM_TICK_START = (int) (0.33 * WIDTH);
MEDIUM_TICK_STOP = (int) (0.36 * WIDTH);
MAJOR_TICK_START = (int) (0.32 * WIDTH);
MAJOR_TICK_STOP = (int) (0.36 * WIDTH);
}
else
{
MINOR_DIAMETER = (int) (0.0186915888 * HEIGHT);
MAJOR_DIAMETER = (int) (0.0280373832 * HEIGHT);
MINOR_TICK_START = (int) (0.65 * HEIGHT);
MINOR_TICK_STOP = (int) (0.63 * HEIGHT);
MEDIUM_TICK_START = (int) (0.66 * HEIGHT);
MEDIUM_TICK_STOP = (int) (0.63 * HEIGHT);
MAJOR_TICK_START = (int) (0.67 * HEIGHT);
MAJOR_TICK_STOP = (int) (0.63 * HEIGHT);
}
final java.awt.Graphics2D G2 = imageBufferLin.createGraphics();
G2.setRenderingHint(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON);
G2.setRenderingHint(java.awt.RenderingHints.KEY_STROKE_CONTROL, java.awt.RenderingHints.VALUE_STROKE_PURE);
G2.setRenderingHint(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING, java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
// Set some default parameters for the graphics object
if (OFFSET != null)
{
G2.translate(OFFSET.getX(), OFFSET.getY());
}
G2.setFont(STD_FONT);
if (TICKMARK_COLOR_FROM_THEME)
{
G2.setColor(BACKGROUND_COLOR.LABEL_COLOR);
}
else
{
G2.setColor(TICKMARK_COLOR);
}
final java.awt.font.FontRenderContext RENDER_CONTEXT = new java.awt.font.FontRenderContext(null, true, true);
final java.awt.font.TextLayout TEXT_LAYOUT = new java.awt.font.TextLayout(numberFormat.format(MAX_VALUE), G2.getFont(), RENDER_CONTEXT);
final java.awt.geom.Rectangle2D MAX_BOUNDS = TEXT_LAYOUT.getBounds(); // needed to align the numbers on the right (in vertical layout)
final java.awt.geom.Line2D TICK_LINE = new java.awt.geom.Line2D.Double(0, 0, 1, 1);
final java.awt.geom.Ellipse2D TICK_CIRCLE = new java.awt.geom.Ellipse2D.Double(0, 0, 1, 1);
final java.awt.geom.GeneralPath TICK_TRIANGLE = new java.awt.geom.GeneralPath();
java.awt.font.TextLayout currentLayout;
java.awt.geom.Rectangle2D currentBounds;
float textOffset = 0;
double currentPos = 0;
double valueCounter = MIN_VALUE;
int majorTickCounter = NO_OF_MINOR_TICKS - 1; // Indicator when to draw the major tickmark
double tickSpaceScaling = 1.0;
switch (ORIENTATION)
{
case VERTICAL:
tickSpaceScaling = SCALE_BOUNDS.getHeight() / (MAX_VALUE - MIN_VALUE);
break;
case HORIZONTAL:
tickSpaceScaling = SCALE_BOUNDS.getWidth() / (MAX_VALUE - MIN_VALUE);
break;
}
for (double labelCounter = MIN_VALUE, tickCounter = 0; Float.compare((float) labelCounter, (float) MAX_VALUE) <= 0; labelCounter += MINOR_TICK_SPACING, tickCounter += MINOR_TICK_SPACING)
{
// Adjust the color for the tickmark and labels
if (TICKMARK_SECTIONS != null && !TICKMARK_SECTIONS.isEmpty())
{
if (TICKMARK_SECTIONS_VISIBLE)
{
for (eu.hansolo.steelseries.tools.Section section : TICKMARK_SECTIONS)
{
if ((Double.compare(tickCounter, section.getStart()) >= 0) && (Double.compare(tickCounter, section.getStop()) <= 0))
{
G2.setColor(section.getColor());
break;
}
else if(TICKMARK_COLOR_FROM_THEME)
{
G2.setColor(BACKGROUND_COLOR.LABEL_COLOR);
}
else
{
G2.setColor(TICKMARK_COLOR);
}
}
}
else
{
if(TICKMARK_COLOR_FROM_THEME)
{
G2.setColor(BACKGROUND_COLOR.LABEL_COLOR);
}
else
{
G2.setColor(TICKMARK_COLOR);
}
}
}
else
{
if(TICKMARK_COLOR_FROM_THEME)
{
G2.setColor(BACKGROUND_COLOR.LABEL_COLOR);
}
else
{
G2.setColor(TICKMARK_COLOR);
}
}
// Calculate the bounds of the scaling
if (ORIENTATION == eu.hansolo.steelseries.tools.Orientation.VERTICAL)
{
currentPos = SCALE_BOUNDS.getMaxY() - tickCounter * tickSpaceScaling;
}
else
{
currentPos = SCALE_BOUNDS.getX() + tickCounter * tickSpaceScaling;
}
majorTickCounter++;
// Draw tickmark every major tickmark spacing
if (majorTickCounter == NO_OF_MINOR_TICKS)
{
G2.setStroke(MAJOR_TICKMARK_STROKE);
// Draw the major tickmarks
if (TICKS_VISIBLE && MAJOR_TICKS_VISIBLE)
{
drawLinearTicks(G2, WIDTH, HEIGHT, ORIENTATION, currentPos, MAJOR_TICKMARK_TYPE, TICK_LINE, TICK_CIRCLE, TICK_TRIANGLE, MAJOR_TICK_START, MAJOR_TICK_STOP, MAJOR_DIAMETER);
}
// Draw the standard tickmark labels
if (TICKLABELS_VISIBLE)
{
currentLayout = new java.awt.font.TextLayout(numberFormat.format(valueCounter), G2.getFont(), RENDER_CONTEXT);
currentBounds = currentLayout.getBounds();
if (ORIENTATION == eu.hansolo.steelseries.tools.Orientation.VERTICAL)
{
// Vertical orientation
textOffset = (float) (MAX_BOUNDS.getWidth() - currentBounds.getWidth());
G2.drawString(numberFormat.format(valueCounter), 0.18f * WIDTH + textOffset, (float)(currentPos - currentBounds.getHeight() / 2.0 + currentBounds.getHeight()));
}
else
{
// Horizontal orientation
G2.drawString(numberFormat.format(valueCounter), (float) (tickCounter * tickSpaceScaling - currentBounds.getWidth() / 3.0 + SCALE_BOUNDS.getX()), (float) (HEIGHT * 0.68 + 1.5 * currentBounds.getHeight()));
}
}
valueCounter += MAJOR_TICK_SPACING;
majorTickCounter = 0;
continue;
}
// Draw tickmark every minor tickmark spacing
if (TICKS_VISIBLE && MINOR_TICKS_VISIBLE)
{
G2.setStroke(MINOR_TICKMARK_STROKE);
if (NO_OF_MINOR_TICKS % 2 == 0 && majorTickCounter == (NO_OF_MINOR_TICKS / 2))
{
G2.setStroke(MEDIUM_TICKMARK_STROKE);
drawLinearTicks(G2, WIDTH, HEIGHT, ORIENTATION, currentPos, MINOR_TICKMARK_TYPE, TICK_LINE, TICK_CIRCLE, TICK_TRIANGLE, MEDIUM_TICK_START, MEDIUM_TICK_STOP, MINOR_DIAMETER);
}
else
{
drawLinearTicks(G2, WIDTH, HEIGHT, ORIENTATION, currentPos, MINOR_TICKMARK_TYPE, TICK_LINE, TICK_CIRCLE, TICK_TRIANGLE, MINOR_TICK_START, MINOR_TICK_STOP, MINOR_DIAMETER);
}
}
}
G2.dispose();
if (BACKGROUND_IMAGE != null)
{
final java.awt.Graphics2D G = BACKGROUND_IMAGE.createGraphics();
G.drawImage(imageBufferLin, 0, 0, null);
G.dispose();
}
// Buffer the current parameters
widthBufferLin = WIDTH;
heightBufferLin = HEIGHT;
minValueBufferLin = MIN_VALUE;
maxValueBufferLin = MAX_VALUE;
noOfMinorTicksBufferLin = NO_OF_MINOR_TICKS;
noOfMajorTicksBufferLin = NO_OF_MAJOR_TICKS;
minorTickSpacingBufferLin = MINOR_TICK_SPACING;
majorTickSpacingBufferLin = MAJOR_TICK_SPACING;
minorTickmarkTypeBufferLin = MINOR_TICKMARK_TYPE;
majorTickmarkTypeBufferLin = MAJOR_TICKMARK_TYPE;
ticksVisibleBufferLin = TICKS_VISIBLE;
ticklabelsVisibleBufferLin = TICKLABELS_VISIBLE;
minorTicksVisibleBufferLin = MINOR_TICKS_VISIBLE;
majorTicksVisibleBufferLin = MAJOR_TICKS_VISIBLE;
numberFormatBufferLin = NUMBER_FORMAT;
tickmarkSectionsVisibleBufferLin = TICKMARK_SECTIONS_VISIBLE;
backgroundColorBufferLin = BACKGROUND_COLOR;
tickmarkColorBufferLin = TICKMARK_COLOR;
tickmarkColorFromThemeBufferLin = TICKMARK_COLOR_FROM_THEME;
if (TICKMARK_SECTIONS != null)
{
tickmarkSectionsBufferLin.clear();
tickmarkSectionsBufferLin.addAll(TICKMARK_SECTIONS);
}
if (OFFSET != null)
{
offsetBufferLin.setLocation(OFFSET);
}
orientationBufferLin = ORIENTATION;
return imageBufferLin;
}
private void drawRadialTicks(final java.awt.Graphics2D G2,
final java.awt.geom.Point2D INNER_POINT,
final java.awt.geom.Point2D OUTER_POINT,
final java.awt.geom.Point2D CENTER,
final double RADIUS,
final eu.hansolo.steelseries.tools.TickmarkType TICKMARK_TYPE,
final java.awt.geom.Line2D TICK_LINE,
final java.awt.geom.Ellipse2D TICK_CIRCLE,
final java.awt.geom.GeneralPath TICK_TRIANGLE,
final double TICK_LENGTH,
final double DIAMETER,
final java.awt.geom.Point2D OUTER_POINT_LEFT,
final java.awt.geom.Point2D OUTER_POINT_RIGHT,
final double ALPHA)
{
// Draw tickmark every major tickmark spacing
switch(TICKMARK_TYPE)
{
case CIRCLE:
TICK_CIRCLE.setFrame(OUTER_POINT.getX() - DIAMETER / 2.0, OUTER_POINT.getY() - DIAMETER / 2.0, DIAMETER, DIAMETER);
G2.fill(TICK_CIRCLE);
break;
case TRIANGLE:
OUTER_POINT_LEFT.setLocation(CENTER.getX() + RADIUS * Math.sin(ALPHA - Math.toRadians(Math.asin(TICK_LENGTH / 16.0))), CENTER.getY() + RADIUS * Math.cos(ALPHA - Math.toRadians(Math.asin(TICK_LENGTH / 16.0))));
OUTER_POINT_RIGHT.setLocation(CENTER.getX() + RADIUS * Math.sin(ALPHA + Math.toRadians(Math.asin(TICK_LENGTH / 16.0))), CENTER.getY() + RADIUS * Math.cos(ALPHA + Math.toRadians(Math.asin(TICK_LENGTH / 16.0))));
TICK_TRIANGLE.reset();
TICK_TRIANGLE.moveTo(INNER_POINT.getX(), INNER_POINT.getY());
TICK_TRIANGLE.lineTo(OUTER_POINT_LEFT.getX(), OUTER_POINT_LEFT.getY());
TICK_TRIANGLE.lineTo(OUTER_POINT_RIGHT.getX(), OUTER_POINT_RIGHT.getY());
TICK_TRIANGLE.closePath();
G2.fill(TICK_TRIANGLE);
break;
case LINE:
default:
TICK_LINE.setLine(INNER_POINT, OUTER_POINT);
G2.draw(TICK_LINE);
break;
}
}
private void drawLinearTicks(final java.awt.Graphics2D G2,
final int WIDTH,
final int HEIGHT,
final eu.hansolo.steelseries.tools.Orientation ORIENTATION,
final double CURRENT_POS,
final eu.hansolo.steelseries.tools.TickmarkType TICKMARK_TYPE,
final java.awt.geom.Line2D TICK_LINE,
final java.awt.geom.Ellipse2D TICK_CIRCLE,
final java.awt.geom.GeneralPath TICK_TRIANGLE,
final double TICK_START,
final double TICK_STOP,
final double DIAMETER)
{
switch(TICKMARK_TYPE)
{
case CIRCLE:
if (ORIENTATION == eu.hansolo.steelseries.tools.Orientation.VERTICAL)
{
TICK_CIRCLE.setFrame(TICK_START, CURRENT_POS - DIAMETER / 2.0, DIAMETER, DIAMETER);
}
else
{
TICK_CIRCLE.setFrame(CURRENT_POS - DIAMETER / 2.0, TICK_STOP, DIAMETER, DIAMETER);
}
G2.fill(TICK_CIRCLE);
break;
case TRIANGLE:
TICK_TRIANGLE.reset();
if (ORIENTATION == eu.hansolo.steelseries.tools.Orientation.VERTICAL)
{
// Vertical orientation
TICK_TRIANGLE.moveTo(TICK_START, CURRENT_POS + WIDTH * 0.005);
TICK_TRIANGLE.lineTo(TICK_START, CURRENT_POS - WIDTH * 0.005);
TICK_TRIANGLE.lineTo(TICK_STOP, CURRENT_POS);
TICK_TRIANGLE.closePath();
}
else
{
// Horizontal orientation
TICK_TRIANGLE.moveTo(CURRENT_POS - HEIGHT * 0.005, TICK_START);
TICK_TRIANGLE.lineTo(CURRENT_POS + HEIGHT * 0.005, TICK_START);
TICK_TRIANGLE.lineTo(CURRENT_POS, TICK_STOP);
TICK_TRIANGLE.closePath();
}
G2.fill(TICK_TRIANGLE);
break;
case LINE:
default:
if (ORIENTATION == eu.hansolo.steelseries.tools.Orientation.VERTICAL)
{
// Vertical orientation
TICK_LINE.setLine(TICK_START, CURRENT_POS, TICK_STOP, CURRENT_POS);
}
else
{
// Horizontal orientation
TICK_LINE.setLine(CURRENT_POS, TICK_START, CURRENT_POS, TICK_STOP);
}
G2.draw(TICK_LINE);
break;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy