]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.trend/src/org/simantics/trend/impl/VertRuler.java
New trend axis mode SingleAxisShowLegends
[simantics/platform.git] / bundles / org.simantics.trend / src / org / simantics / trend / impl / VertRuler.java
index a6a234c805c126e5a7af20665627bf3d422f1370..d9560b0c3620192b4011d42cef23d6b06d1cef70 100644 (file)
@@ -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<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;
                        
@@ -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 );   
+                               }
                        }
                }
        }