private void drawLabels(Graphics2D g2d) { final FontMetrics fontMetrics = g2d.getFontMetrics(); final int n = getNumGradationCurvePoints(); g2d.setStroke(new BasicStroke(2)); Color c1 = (foregroundColor != null ? foregroundColor : Color.black).brighter(); Color c2 = (backgroundColor != null ? backgroundColor : Color.white).darker(); for (int i = 0; i < n; i++) { ColorPaletteDef.Point slider = getGradationCurvePointAt(i); final double normalizedSample = normalizeSample(slider.getSample()); double sliderPos = normalizedSample * (palettePos2 - palettePos1); double tx; double ty; if (orientation == HORIZONTAL) { tx = palettePos1 + sliderPos; ty = paletteRect.y + paletteRect.height; } else { tx = paletteRect.x + paletteRect.width; ty = palettePos1 + sliderPos; } g2d.translate(tx, ty); g2d.setPaint(slider.getColor()); g2d.fill(sliderShape); int gray = (slider.getColor().getRed() + slider.getColor().getGreen() + slider.getColor().getBlue()) / 3; g2d.setColor(gray < 128 ? c2 : c1); g2d.draw(sliderShape); float x0; float y0; if (orientation == HORIZONTAL) { x0 = -0.5f * labelWidths[i]; y0 = _LABEL_GAP + fontMetrics.getMaxAscent(); } else { x0 = _LABEL_GAP; y0 = fontMetrics.getMaxAscent(); } g2d.setPaint(foregroundColor); g2d.drawString(labels[i], x0, y0); g2d.translate(-tx, -ty); } }
private void initDrawing() { final FontMetrics fontMetrics = createFontMetrics(); final int n = getNumGradationCurvePoints(); labels = new String[n]; labelWidths = new int[n]; int textHeight = fontMetrics.getHeight(); final double minValue = imageInfo.getColorPaletteDef().getMinDisplaySample(); final double maxValue = imageInfo.getColorPaletteDef().getMaxDisplaySample(); double roundFactor = MathUtils.computeRoundFactor(minValue, maxValue, 2); for (int i = 0; i < n; i++) { ColorPaletteDef.Point slider = getGradationCurvePointAt(i); labels[i] = String.valueOf(MathUtils.round(slider.getSample(), roundFactor)); labelWidths[i] = fontMetrics.stringWidth(labels[i]); } int headerTextVSpace = 0; int headerTextWidth = 0; if (hasHeaderText()) { headerTextVSpace = textHeight + _GAP; headerTextWidth = fontMetrics.stringWidth(headerText); } int legendWidth = 0; int legendHeight = 0; int maxLabelWidth = 0; for (int i = 0; i < n; i++) { legendWidth += _LABEL_GAP + labelWidths[i]; legendHeight += 2 * textHeight; maxLabelWidth = Math.max(labelWidths[i], maxLabelWidth); } if (orientation == HORIZONTAL) { legendWidth = Math.max(legendWidth, _MIN_PALETTE_HEIGHT); legendWidth = _GAP + Math.max(legendWidth, headerTextWidth) + _GAP; legendHeight = _GAP + headerTextVSpace + _MIN_PALETTE_HEIGHT + _LABEL_GAP + textHeight + _GAP; legendWidth = Math.max(_MIN_LEGEND_WIDTH, adjust(legendWidth, 16)); legendHeight = Math.max(_MIN_LEGEND_HEIGHT, adjust(legendHeight, 16)); } else { legendWidth = _MIN_PALETTE_HEIGHT + _LABEL_GAP + maxLabelWidth; legendWidth = _GAP + Math.max(legendWidth, headerTextWidth) + _GAP; legendHeight = _GAP + headerTextVSpace + Math.max(legendHeight, _MIN_PALETTE_WIDTH) + _LABEL_GAP + textHeight + _GAP; legendWidth = Math.max(_MIN_LEGEND_HEIGHT, adjust(legendWidth, 16)); legendHeight = Math.max(_MIN_LEGEND_WIDTH, adjust(legendHeight, 16)); } legendSize = new Dimension(legendWidth, legendHeight); final int headerTextSpace = headerText != null ? textHeight + _GAP : 0; final int labelTextSpace = _LABEL_GAP + textHeight; if (orientation == HORIZONTAL) { paletteRect = new Rectangle( _GAP, _GAP + headerTextSpace, legendSize.width - (_GAP + _GAP), legendSize.height - (_GAP + headerTextSpace + labelTextSpace + _GAP)); int paletteGap = Math.max(labelWidths[0], labelWidths[n - 1]) / 2; palettePos1 = paletteRect.x + paletteGap; palettePos2 = paletteRect.x + paletteRect.width - paletteGap; } else { paletteRect = new Rectangle( _GAP, _GAP + headerTextSpace, legendSize.width - (_GAP + labelTextSpace + maxLabelWidth + _GAP), legendSize.height - (_GAP + headerTextSpace + _GAP)); int paletteGap = Math.max(textHeight, _SLIDER_WIDTH) / 2; palettePos1 = paletteRect.y + paletteGap; palettePos2 = paletteRect.y + paletteRect.height - paletteGap; } sliderShape = createSliderShape(); }