X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.trend%2Fsrc%2Forg%2Fsimantics%2Ftrend%2Fimpl%2FVertRuler.java;h=d9560b0c3620192b4011d42cef23d6b06d1cef70;hb=refs%2Fheads%2Frelease%2F1.43.0-CVM2;hp=a6a234c805c126e5a7af20665627bf3d422f1370;hpb=636ddc0d966151e334b01039c94ff3dee743db99;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.trend/src/org/simantics/trend/impl/VertRuler.java b/bundles/org.simantics.trend/src/org/simantics/trend/impl/VertRuler.java index a6a234c80..d9560b0c3 100644 --- a/bundles/org.simantics.trend/src/org/simantics/trend/impl/VertRuler.java +++ b/bundles/org.simantics.trend/src/org/simantics/trend/impl/VertRuler.java @@ -18,6 +18,8 @@ import java.awt.Graphics2D; 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; @@ -37,7 +39,11 @@ public class VertRuler extends TrendGraphicalNode { boolean autoscroll = true; // Autoscroll on/off boolean manualscale = false; // Autoscale / manual scale double labelWidth = 7; - + List extra_labels = new ArrayList<>(); + List extra_label_colors = new ArrayList<>(); + double extra_width = 0.0; + int singleAxisShowLegendsMaxLegends = 10; + static final double TRIANGLE_SIZE = 7; static final Path2D TRIANGLE; @@ -47,7 +53,9 @@ public class VertRuler extends TrendGraphicalNode { 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 ); @@ -57,13 +65,35 @@ public class VertRuler extends TrendGraphicalNode { 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); @@ -77,6 +107,9 @@ public class VertRuler extends TrendGraphicalNode { protected void doRender(Graphics2D g) { TrendNode trend = (TrendNode) getParent(); + VertRuler master = trend.vertRuler; + VertRuler slave = this; + // Draw little "Frozen" if ( !trend.printing ) { @@ -88,20 +121,19 @@ public class VertRuler extends TrendGraphicalNode { // 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, @@ -112,16 +144,16 @@ public class VertRuler extends TrendGraphicalNode { 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(); @@ -133,25 +165,54 @@ public class VertRuler extends TrendGraphicalNode { 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 ); + } } } }