< prev index next >

application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/charts/QuantitySpanRenderer.java

Print this page




  43 import org.openjdk.jmc.common.unit.UnitLookup;
  44 import org.openjdk.jmc.ui.charts.XYQuantities.AbstractSpan;
  45 
  46 public class QuantitySpanRenderer implements IXDataRenderer {
  47         /**
  48          * Sentinel value used to indicate a missing (unknown) start timestamp.
  49          */
  50         public static final IQuantity MISSING_START = UnitLookup.EPOCH_S.quantity(0);
  51 
  52         /**
  53          * Sentinel value used to indicate a missing (unknown) end timestamp.
  54          */
  55         public static final IQuantity MISSING_END = UnitLookup.EPOCH_S.quantity(Long.MAX_VALUE);
  56 
  57         private final IQuantitySeries<?> ranges;
  58         private final Paint paint;
  59         private final int minOutlineHeight;
  60         private final IXDataRenderer content;
  61         private final String text;
  62         private final String description;

  63 
  64         public QuantitySpanRenderer(IQuantitySeries<?> ranges, IXDataRenderer content, Paint paint, int minOutlineHeight,
  65                         String text, String description) {
  66                 this.ranges = ranges;
  67                 this.content = content;
  68                 this.paint = paint;
  69                 this.minOutlineHeight = minOutlineHeight;
  70                 this.text = text;
  71                 this.description = description;

  72         }
  73 
  74         private static int calcMargin(int height) {
  75                 return Math.min(5, (height + 10) / 20);
  76         }
  77 




  78         @Override
  79         public IRenderedRow render(Graphics2D context, SubdividedQuantityRange xRange, int height) {
  80                 int margin = calcMargin(height);
  81                 int innerHeight = height - 2 * margin;
  82                 context.translate(0, margin);
  83                 context.setPaint(paint);
  84                 XYQuantities<?> quantities = ranges.getQuantities(xRange);
  85                 // Need to set y range to same as x range to be able to draw ranges (and eliminate creation of quantities).
  86                 quantities.setYRange(xRange);
  87                 AWTChartToolkit.drawRanges(context, quantities, innerHeight, true);
  88                 IRenderedRow renderedContent = content.render(context, xRange, innerHeight);
  89                 if (innerHeight >= minOutlineHeight) {
  90                         context.setPaint(Color.BLACK);
  91                         AWTChartToolkit.drawRanges(context, quantities, innerHeight, false);
  92                 }
  93                 context.translate(0, -margin);
  94                 return new QuantitySpanRendering(margin, quantities, renderedContent, paint, text, description);
  95         }
  96 
  97         private static class QuantitySpanRendering extends RenderedRowBase {
  98 
  99                 private final XYQuantities<?> points;
 100                 private final IRenderedRow content;
 101                 private final Paint paint;
 102                 private final int margin;
 103                 private String description;

 104 
 105                 public QuantitySpanRendering(int margin, XYQuantities<?> points, IRenderedRow content, Paint paint, String text,
 106                                 String description) {
 107                         super(Arrays.asList(new RenderedRowBase(margin), content, new RenderedRowBase(margin)),
 108                                         content.getHeight() + 2 * margin, text, description, null);
 109                         this.margin = margin;
 110                         this.points = points;
 111                         this.content = content;
 112                         this.paint = paint;
 113                         this.description = description;

 114                 }
 115 
 116                 @Override
 117                 public void infoAt(IChartInfoVisitor visitor, int x, int y, Point offset) {

 118                         offset = new Point(offset.x, offset.y + margin);
 119                         content.infoAt(visitor, x, y, offset);
 120 
 121                         // FIXME: Only output this if near the boundaries? At least handle infinite lengths.
 122                         if (points != null) {
 123                                 int bucket = points.floorIndexAtX(x);
 124                                 if (bucket < points.getSize()) {
 125                                         Span span = new Span(bucket, offset);
 126                                         while (bucket >= 0) {
 127                                                 double x2 = points.getPixelY(bucket);
 128                                                 if (x < x2) {
 129                                                         span.setIndex(bucket);
 130                                                         visitor.visit(span);
 131                                                         // Break now, or can there be more to collect?
 132                                                         break;
 133                                                 }
 134                                                 bucket--;
 135                                         }
 136                                 }
 137                         }




  43 import org.openjdk.jmc.common.unit.UnitLookup;
  44 import org.openjdk.jmc.ui.charts.XYQuantities.AbstractSpan;
  45 
  46 public class QuantitySpanRenderer implements IXDataRenderer {
  47         /**
  48          * Sentinel value used to indicate a missing (unknown) start timestamp.
  49          */
  50         public static final IQuantity MISSING_START = UnitLookup.EPOCH_S.quantity(0);
  51 
  52         /**
  53          * Sentinel value used to indicate a missing (unknown) end timestamp.
  54          */
  55         public static final IQuantity MISSING_END = UnitLookup.EPOCH_S.quantity(Long.MAX_VALUE);
  56 
  57         private final IQuantitySeries<?> ranges;
  58         private final Paint paint;
  59         private final int minOutlineHeight;
  60         private final IXDataRenderer content;
  61         private final String text;
  62         private final String description;
  63         private final Object data;
  64 
  65         public QuantitySpanRenderer(IQuantitySeries<?> ranges, IXDataRenderer content, Paint paint, int minOutlineHeight,
  66                         String text, String description, Object data) {
  67                 this.ranges = ranges;
  68                 this.content = content;
  69                 this.paint = paint;
  70                 this.minOutlineHeight = minOutlineHeight;
  71                 this.text = text;
  72                 this.description = description;
  73                 this.data = data;
  74         }
  75 
  76         private static int calcMargin(int height) {
  77                 return Math.min(5, (height + 10) / 20);
  78         }
  79 
  80         public Object getData() {
  81                 return data;
  82         }
  83 
  84         @Override
  85         public IRenderedRow render(Graphics2D context, SubdividedQuantityRange xRange, int height) {
  86                 int margin = calcMargin(height);
  87                 int innerHeight = height - 2 * margin;
  88                 context.translate(0, margin);
  89                 context.setPaint(paint);
  90                 XYQuantities<?> quantities = ranges.getQuantities(xRange);
  91                 // Need to set y range to same as x range to be able to draw ranges (and eliminate creation of quantities).
  92                 quantities.setYRange(xRange);
  93                 AWTChartToolkit.drawRanges(context, quantities, innerHeight, true);
  94                 IRenderedRow renderedContent = content.render(context, xRange, innerHeight);
  95                 if (innerHeight >= minOutlineHeight) {
  96                         context.setPaint(Color.BLACK);
  97                         AWTChartToolkit.drawRanges(context, quantities, innerHeight, false);
  98                 }
  99                 context.translate(0, -margin);
 100                 return new QuantitySpanRendering(margin, quantities, renderedContent, paint, text, description, data);
 101         }
 102 
 103         private static class QuantitySpanRendering extends RenderedRowBase {
 104 
 105                 private final XYQuantities<?> points;
 106                 private final IRenderedRow content;
 107                 private final Paint paint;
 108                 private final int margin;
 109                 private final String description;
 110                 private final Object data;
 111 
 112                 public QuantitySpanRendering(int margin, XYQuantities<?> points, IRenderedRow content, Paint paint, String text,
 113                                 String description, Object data) {
 114                         super(Arrays.asList(new RenderedRowBase(margin), content, new RenderedRowBase(margin)),
 115                                         content.getHeight() + 2 * margin, text, description, null);
 116                         this.margin = margin;
 117                         this.points = points;
 118                         this.content = content;
 119                         this.paint = paint;
 120                         this.description = description;
 121                         this.data = data;
 122                 }
 123 
 124                 @Override
 125                 public void infoAt(IChartInfoVisitor visitor, int x, int y, Point offset) {
 126                         visitor.hover(data);
 127                         offset = new Point(offset.x, offset.y + margin);
 128                         content.infoAt(visitor, x, y, offset);
 129 
 130                         // FIXME: Only output this if near the boundaries? At least handle infinite lengths.
 131                         if (points != null) {
 132                                 int bucket = points.floorIndexAtX(x);
 133                                 if (bucket < points.getSize()) {
 134                                         Span span = new Span(bucket, offset);
 135                                         while (bucket >= 0) {
 136                                                 double x2 = points.getPixelY(bucket);
 137                                                 if (x < x2) {
 138                                                         span.setIndex(bucket);
 139                                                         visitor.visit(span);
 140                                                         // Break now, or can there be more to collect?
 141                                                         break;
 142                                                 }
 143                                                 bucket--;
 144                                         }
 145                                 }
 146                         }


< prev index next >