public MeterFigure() { super(); // TODO, remove this if clip is supported by RAP if (SWT.getPlatform().startsWith("rap")) // $NON-NLS-1$ ramp.setVisible(false); setTransparent(false); scale.setScaleLineVisible(false); ((RoundScale) scale).setStartAngle(180 - SPACE_ANGLE); ((RoundScale) scale).setEndAngle(SPACE_ANGLE); ramp.setRampWidth(12); setLoColor(XYGraphMediaFactory.getInstance().getColor(XYGraphMediaFactory.COLOR_YELLOW)); setHiColor(XYGraphMediaFactory.getInstance().getColor(XYGraphMediaFactory.COLOR_YELLOW)); valueLabel = new Label(); valueLabel.setFont(DEFAULT_LABEL_FONT); needle = new Needle(); needle.setFill(true); needle.setOutline(false); // needleCenter = new Ellipse(); // needleCenter.setOutline(false); setLayoutManager(new XMeterLayout()); add(ramp, XMeterLayout.RAMP); add(scale, XMeterLayout.SCALE); add(needle, XMeterLayout.NEEDLE); // add(needleCenter, XMeterLayout.NEEDLE_CENTER); add(valueLabel, XMeterLayout.VALUE_LABEL); addFigureListener( new FigureListener() { public void figureMoved(IFigure source) { ramp.setDirty(true); revalidate(); } }); }
public void layout(IFigure container) { Rectangle area = container.getClientArea(); // calculate a virtual area if (scale != null && scale.isDirty()) M = Math.max( FigureUtilities.getTextWidth( scale.format(scale.getRange().getLower()), scale.getFont()), FigureUtilities.getTextWidth( scale.format(scale.getRange().getUpper()), scale.getFont())) / 2; int h = area.height; int w = area.width; if (h > HW_RATIO * (w - 2 * M)) h = (int) (HW_RATIO * (w - 2 * M)); // else if (w > h/HW_RATIO + 2*M) // w = (int) (h/HW_RATIO + 2*M); double r = h / (1 - Math.sin(ALPHA) / 2); int x = (int) (area.x - r * (1.0 - Math.cos(ALPHA)) + M); int y = area.y; area = new Rectangle(x, y, (int) (2 * r), (int) (2 * r)); Point center = area.getCenter(); if (scale != null) { scale.setBounds(area); } if (ramp != null && ramp.isVisible()) { Rectangle rampBounds = area.getCopy(); ramp.setBounds( rampBounds.shrink( area.width / 4 - ramp.getRampWidth(), area.height / 4 - ramp.getRampWidth())); } if (valueLabel != null) { Dimension labelSize = valueLabel.getPreferredSize(); valueLabel.setBounds( new Rectangle( area.x + area.width / 2 - labelSize.width / 2, area.y + area.height / 2 - area.height / 4 - (scale.getInnerRadius() - area.height / 4) / 2 - labelSize.height / 2, labelSize.width, labelSize.height)); } if (needle != null && scale != null) { needlePoints.setPoint( new Point(center.x + area.width / 4, center.y - NEEDLE_WIDTH / 2 + 3), 0); scale.getScaleTickMarks(); needlePoints.setPoint( new Point(center.x + scale.getInnerRadius() - GAP_BTW_NEEDLE_SCALE, center.y), 1); needlePoints.setPoint( new Point(center.x + area.width / 4, center.y + NEEDLE_WIDTH / 2 - 3), 2); double valuePosition = 360 - scale.getValuePosition(getCoercedValue(), false); if (maximum > minimum) { if (value > maximum) valuePosition += 8; else if (value < minimum) valuePosition -= 8; } else { if (value > minimum) valuePosition -= 8; else if (value < maximum) valuePosition += 8; } needlePoints.setPoint( PointsUtil.rotate(needlePoints.getPoint(0), valuePosition, center), 0); needlePoints.setPoint( PointsUtil.rotate(needlePoints.getPoint(1), valuePosition, center), 1); needlePoints.setPoint( PointsUtil.rotate(needlePoints.getPoint(2), valuePosition, center), 2); needle.setPoints(needlePoints); } // if(needleCenter != null){ // needleCenter.setBounds(new Rectangle(center.x - area.width/4, // center.y - area.height/4, // area.width/2, area.height/2)); // } }