import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import java.text.Format;
+import java.util.ArrayList;
+import java.util.List;
import org.simantics.g2d.utils.GridSpacing;
import org.simantics.g2d.utils.GridUtil;
boolean autoscroll = true; // Autoscroll on/off
boolean manualscale = false; // Autoscale / manual scale
double labelWidth = 7;
-
+ List<String> extra_labels = new ArrayList<>();
+ List<Color> extra_label_colors = new ArrayList<>();
+ double extra_width = 0.0;
+ int singleAxisShowLegendsMaxLegends = 10;
+
static final double TRIANGLE_SIZE = 7;
static final Path2D TRIANGLE;
ValueFormat vf = trend.valueFormat;
spacing = GridSpacing.makeGridSpacing(max-min, getHeight(), 15);
labelWidth = Math.max(7, GridUtil.calcLabelWidth(min, max, vf.format, spacing));
+
double w = 30 + labelWidth;
+
// Snap w -> next 20 pixels
double quantization = 10;
int x = (int) Math.ceil( w / quantization );
bounds.setFrame(0, 0, w, getHeight());
trend.shapedirty = true;
}
-
+
+ public void addExtraLabel(String label, Color color) {
+ extra_labels.add(label);
+ extra_label_colors.add(color);
+ }
+
public void setHeight(double height) {
if (height==bounds.getHeight()) return;
bounds.setFrame(0, 0, bounds.getWidth(), height);
getTrend().shapedirty = true;
}
+ @Override
+ public double getWidth() {
+ if(extra_labels.size() == 0) {
+ return super.getWidth();
+ } else {
+ if(extra_width == 0.0) {
+ extra_width = 15.0 * extra_labels.size();
+ double w = bounds.getWidth();
+ return w + extra_width;
+ } else {
+ double w = bounds.getWidth();
+ return w + extra_width;
+ }
+ }
+
+ }
+
public boolean setMinMax(double min, double max) {
if (min==this.min && max==this.max) return false;
spacing = GridSpacing.makeGridSpacing(max-min, getHeight(), 15);
protected void doRender(Graphics2D g) {
TrendNode trend = (TrendNode) getParent();
+ VertRuler master = trend.vertRuler;
+ VertRuler slave = this;
+
// Draw little "Frozen"
if ( !trend.printing )
{
// Draw at top
g.drawString(txt, 5.f, -9.f );
}
-
+
g.setPaint( color );
g.setStroke( GridUtil.RULER_LINE_STROKE );
-
+
ValueFormat vf = trend.valueFormat;
- VertRuler master = trend.vertRuler;
- VertRuler slave = this;
+
if ( master != slave )
{
// Paint "slave" ruler - a ruler with ticks from master and labels from this
int tickCount = GridUtil.getTickCount(master.spacing, master.min, master.getHeight());
int noOfDecimals = calcNoOfDecimals(tickCount, slave.max-slave.min);
Format format = vf.toFormat(noOfDecimals);
-
+
GridUtil.paintVerticalSlaveRuler(
master.spacing,
spacing,
format);
} else {
Format format = vf.format;
-
+
// Paint normal ruler
GridUtil.paintVerticalRuler(
- spacing,
- g,
- min,
- getHeight(),
- format);
+ spacing,
+ g,
+ min,
+ getHeight(),
+ format);
}
-
+
// Draw label
{
// Shape oldClip = g2d.getClip();
Font font = selected ? RULER_FONT_BOLD : RULER_FONT;
FontMetrics fm = g.getFontMetrics( font );
//LineMetrics lm = fm.getLineMetrics(label, g);
- double wid = fm.stringWidth(label);
- AffineTransform at = g.getTransform();
- g.translate( getWidth()-15, (getHeight()-wid)/2);
-// g2d.translate( 18+labelWidth, (getHeight()-wid)/2);
- g.transform( AffineTransform.getQuadrantRotateInstance(1) );
- g.setColor( color );
- g.setFont( font );
- g.drawString( label, (float) 0, (float) 0);
- g.setTransform( at );
-// g2d.setClip(oldClip);
-
- // Triangle
- if (selected) {
- at = g.getTransform();
- g.translate( getWidth() - TRIANGLE_SIZE - 5, 0 );
+ if(extra_labels.size() == 0) {
+ double wid = fm.stringWidth(label);
+
+ AffineTransform at = g.getTransform();
+ g.translate( getWidth()-15, (getHeight()-wid)/2);
+ // g2d.translate( 18+labelWidth, (getHeight()-wid)/2);
+ g.transform( AffineTransform.getQuadrantRotateInstance(1) );
g.setColor( color );
- g.fill( TRIANGLE );
+ g.setFont( font );
+ g.drawString( label, (float) 0, (float) 0);
g.setTransform( at );
+ // g2d.setClip(oldClip);
+
+ // Triangle
+ if (selected) {
+ at = g.getTransform();
+ g.translate( getWidth() - TRIANGLE_SIZE - 5, 0 );
+ g.setColor( color );
+ g.fill( TRIANGLE );
+ g.setTransform( at );
+ }
+ } else {
+ extra_width = 0.0;
+ double bounds_width = bounds.getWidth();
+
+ for(int label_index = 0; label_index < extra_labels.size(); label_index++) {
+ if(label_index >= singleAxisShowLegendsMaxLegends) {
+ break; // Maximum amount of labels that we should display has been reached
+ }
+
+ String label = extra_labels.get(label_index);
+ Color color = extra_label_colors.get(label_index);
+
+ double wid = fm.stringWidth(label);
+ double font_height = fm.getHeight();
+ extra_width += font_height;
+ //Letters are displayed in 90 degree angle, so font height is the width of the label as seen in X-direction
+
+ AffineTransform at = g.getTransform();
+ g.translate( bounds_width + label_index*font_height, (getHeight()-wid)/2);
+ // g2d.translate( 18+labelWidth, (getHeight()-wid)/2);
+ g.transform( AffineTransform.getQuadrantRotateInstance(1) );
+ g.setColor( color );
+ g.setFont( font );
+ g.drawString( label, (float) 0, (float) 0);
+ g.setTransform( at );
+ }
}
}
}