Aaaah, I see.
An easy fix, I'll make the change later.
Greg Brown wrote:
> Not sure how you implemented it, but the original intent was to define
> two text colors - one to paint over the "blue" area and another to
> paint over the "gray" background. That way, we can ensure that there
> is good contrast between the text and the background (unless the
> caller changes the colors, but we don't have any control over that).
>
> On Oct 29, 2009, at 10:32 AM, Noel Grandin wrote:
>
>>
>> I was following the lead of the best looking widget I could find on the
>> web.
>> Of which there were only a few - Apple's HIG seems to discourage putting
>> text into Meters, and I don't personally think it looks all that great
>> myself.
>>
>> I don't know what else I could use that would be guaranteed to contrast
>> well with the fill colour.
>>
>> Greg Brown wrote:
>>> Just wondering - why are you trying to match the display background
>>> here? Might there be another color you could pull from the theme that
>>> would be appropriate?
>>>
>>> On Oct 29, 2009, at 10:23 AM, Noel Grandin wrote:
>>>
>>>>
>>>> One of the things I don't like in my commit here is that I'm
>>>> hard-coding
>>>> a color (Color.LIGHT_GRAY), which I had to do to match the background
>>>> color, which is also hard-coded in DisplaySkin.
>>>>
>>>> Surely these colours should be in the theme file?
>>>>
>>>> Mind you, now that I am searching for them I see that quite a lot of
>>>> Skin classes hard-code colors. I guess that's a problem for another
>>>> day.
>>>>
>>>> -- Noel.
>>>>
>>>> [email protected] wrote:
>>>>> Author: noelgrandin
>>>>> Date: Thu Oct 29 14:11:56 2009
>>>>> New Revision: 830954
>>>>>
>>>>> URL: http://svn.apache.org/viewvc?rev=830954&view=rev
>>>>> Log:
>>>>> PIVOT-33 Add support for Meter#text property in TerraMeterSkin
>>>>>
>>>>> Modified:
>>>>>
>>>>> incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraMeterSkin.java
>>>>>
>>>>>
>>>>>
>>>>> Modified:
>>>>> incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraMeterSkin.java
>>>>>
>>>>>
>>>>> URL:
>>>>> http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraMeterSkin.java?rev=830954&r1=830953&r2=830954&view=diff
>>>>>
>>>>>
>>>>> ==============================================================================
>>>>>
>>>>>
>>>>> ---
>>>>> incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraMeterSkin.java
>>>>>
>>>>> (original)
>>>>> +++
>>>>> incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraMeterSkin.java
>>>>>
>>>>> Thu Oct 29 14:11:56 2009
>>>>> @@ -17,16 +17,23 @@
>>>>> package org.apache.pivot.wtk.skin.terra;
>>>>>
>>>>> import java.awt.Color;
>>>>> +import java.awt.Font;
>>>>> import java.awt.GradientPaint;
>>>>> import java.awt.Graphics2D;
>>>>> import java.awt.RenderingHints;
>>>>> +import java.awt.Shape;
>>>>> +import java.awt.font.FontRenderContext;
>>>>> +import java.awt.font.LineMetrics;
>>>>> +import java.awt.geom.Rectangle2D;
>>>>>
>>>>> +import org.apache.pivot.collections.Dictionary;
>>>>> import org.apache.pivot.wtk.Component;
>>>>> import org.apache.pivot.wtk.Dimensions;
>>>>> import org.apache.pivot.wtk.GraphicsUtilities;
>>>>> import org.apache.pivot.wtk.Meter;
>>>>> import org.apache.pivot.wtk.MeterListener;
>>>>> import org.apache.pivot.wtk.Orientation;
>>>>> +import org.apache.pivot.wtk.Platform;
>>>>> import org.apache.pivot.wtk.Theme;
>>>>> import org.apache.pivot.wtk.skin.ComponentSkin;
>>>>>
>>>>> @@ -36,18 +43,23 @@
>>>>> */
>>>>> public class TerraMeterSkin extends ComponentSkin
>>>>> implements MeterListener {
>>>>> - private Color color;
>>>>> + private Color fillColor;
>>>>> private Color gridColor;
>>>>> private float gridFrequency;
>>>>> + private Font font;
>>>>> + private Color textColor;
>>>>>
>>>>> + private static final FontRenderContext FONT_RENDER_CONTEXT =
>>>>> new FontRenderContext(null, true, false);
>>>>> private static final int DEFAULT_WIDTH = 100;
>>>>> private static final int DEFAULT_HEIGHT = 12;
>>>>>
>>>>> public TerraMeterSkin() {
>>>>> TerraTheme theme = (TerraTheme)Theme.getTheme();
>>>>> - color = theme.getColor(16);
>>>>> + fillColor = theme.getColor(16);
>>>>> gridColor = theme.getColor(10);
>>>>> gridFrequency = 0.25f;
>>>>> + font = theme.getFont();
>>>>> + textColor = theme.getColor(1);
>>>>> }
>>>>>
>>>>> @Override
>>>>> @@ -65,25 +77,77 @@
>>>>>
>>>>> @Override
>>>>> public int getPreferredWidth(int height) {
>>>>> - // Meter has no content, so its preferred width is hard
>>>>> coded in the
>>>>> + Meter meter = (Meter)getComponent();
>>>>> + String text = meter.getText();
>>>>> +
>>>>> + int preferredWidth;
>>>>> + if (text != null
>>>>> + && text.length() > 0) {
>>>>> + Rectangle2D stringBounds = font.getStringBounds(text,
>>>>> FONT_RENDER_CONTEXT);
>>>>> + preferredWidth =
>>>>> (int)Math.ceil(stringBounds.getWidth()) + 2;
>>>>> + } else {
>>>>> + preferredWidth = 0;
>>>>> + }
>>>>> +
>>>>> + // If Meter has no content, its preferred width is hard
>>>>> coded in the
>>>>> // class and is not affected by the height constraint.
>>>>> - return DEFAULT_WIDTH;
>>>>> + preferredWidth = Math.max(preferredWidth, DEFAULT_WIDTH);
>>>>> +
>>>>> + return preferredWidth;
>>>>> }
>>>>>
>>>>> @Override
>>>>> public int getPreferredHeight(int width) {
>>>>> - // Meter has no content, so its preferred height is hard
>>>>> coded in the
>>>>> + Meter meter = (Meter)getComponent();
>>>>> + String text = meter.getText();
>>>>> +
>>>>> + int preferredHeight = 0;
>>>>> + if (text!=null && text.length()>0) {
>>>>> + LineMetrics lm = font.getLineMetrics("",
>>>>> FONT_RENDER_CONTEXT);
>>>>> + preferredHeight = (int)Math.ceil(lm.getHeight()) + 2;
>>>>> + }
>>>>> +
>>>>> + // If Meter has no content, its preferred height is hard
>>>>> coded in the
>>>>> // class and is not affected by the width constraint.
>>>>> - return DEFAULT_HEIGHT;
>>>>> + preferredHeight = Math.max(preferredHeight, DEFAULT_HEIGHT);
>>>>> +
>>>>> + return preferredHeight;
>>>>> }
>>>>>
>>>>> @Override
>>>>> public Dimensions getPreferredSize() {
>>>>> - // Meter has no content, so its preferred size is hard
>>>>> coded in the class.
>>>>> - return new Dimensions(DEFAULT_WIDTH, DEFAULT_HEIGHT);
>>>>> + Meter meter = (Meter)getComponent();
>>>>> + String text = meter.getText();
>>>>> +
>>>>> + int preferredWidth = 0;
>>>>> + int preferredHeight = 0;
>>>>> + if (text!=null && text.length()>0) {
>>>>> + Rectangle2D stringBounds = font.getStringBounds(text,
>>>>> FONT_RENDER_CONTEXT);
>>>>> + preferredWidth =
>>>>> (int)Math.ceil(stringBounds.getWidth()) + 2;
>>>>> + LineMetrics lm = font.getLineMetrics("",
>>>>> FONT_RENDER_CONTEXT);
>>>>> + preferredHeight = (int)Math.ceil(lm.getHeight()) + 2;
>>>>> + }
>>>>> +
>>>>> + // If Meter has no content, its preferred size is hard
>>>>> coded in the class.
>>>>> + preferredWidth = Math.max(preferredWidth, DEFAULT_WIDTH);
>>>>> + preferredHeight = Math.max(preferredHeight, DEFAULT_HEIGHT);
>>>>> +
>>>>> + return new Dimensions(preferredWidth, preferredHeight);
>>>>> }
>>>>>
>>>>> @Override
>>>>> + public int getBaseline(int width) {
>>>>> + Meter meter = (Meter)getComponent();
>>>>> + String text = meter.getText();
>>>>> + if (text!=null && text.length()>0) {
>>>>> + LineMetrics lm = font.getLineMetrics("",
>>>>> FONT_RENDER_CONTEXT);
>>>>> + return (int)Math.ceil(lm.getAscent() - 2);
>>>>> + } else {
>>>>> + return -1;
>>>>> + }
>>>>> + }
>>>>> +
>>>>> + @Override
>>>>> public void layout() {
>>>>> // No-op
>>>>> }
>>>>> @@ -92,35 +156,65 @@
>>>>> public void paint(Graphics2D graphics) {
>>>>> Meter meter = (Meter)getComponent();
>>>>>
>>>>> - // TODO Paint text
>>>>> -
>>>>> int width = getWidth();
>>>>> int height = getHeight();
>>>>> int meterStop = (int)(meter.getPercentage() * width);
>>>>>
>>>>> - graphics.setPaint(new GradientPaint(0, 0,
>>>>> TerraTheme.brighten(color),
>>>>> - 0, height, TerraTheme.darken(color)));
>>>>> graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
>>>>> RenderingHints.VALUE_ANTIALIAS_ON);
>>>>> + if (FONT_RENDER_CONTEXT.isAntiAliased()) {
>>>>> +
>>>>> graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
>>>>> + Platform.getTextAntialiasingHint());
>>>>> + }
>>>>> + if (FONT_RENDER_CONTEXT.usesFractionalMetrics()) {
>>>>> +
>>>>> graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
>>>>> + RenderingHints.VALUE_FRACTIONALMETRICS_ON);
>>>>> + }
>>>>> +
>>>>> + // Paint the interior fill
>>>>> + graphics.setPaint(new GradientPaint(0, 0,
>>>>> TerraTheme.brighten(fillColor),
>>>>> + 0, height, TerraTheme.darken(fillColor)));
>>>>> graphics.fillRect(0, 0, meterStop, height);
>>>>>
>>>>> + // Paint the grid
>>>>> graphics.setPaint(gridColor);
>>>>> GraphicsUtilities.drawRect(graphics, 0, 0, width, height);
>>>>> -
>>>>> int nLines = (int)Math.ceil(1 / gridFrequency) - 1;
>>>>> float gridSeparation = width * gridFrequency;
>>>>> for (int i = 0; i < nLines; i++) {
>>>>> int gridX = (int)((i + 1) * gridSeparation);
>>>>> GraphicsUtilities.drawLine(graphics, gridX, 0, height,
>>>>> Orientation.VERTICAL);
>>>>> }
>>>>> +
>>>>> + String text = meter.getText();
>>>>> + if (text!=null && text.length()>0) {
>>>>> + LineMetrics lm = font.getLineMetrics("",
>>>>> FONT_RENDER_CONTEXT);
>>>>> + int ascent = Math.round(lm.getAscent());
>>>>> + Rectangle2D stringBounds = font.getStringBounds(text,
>>>>> FONT_RENDER_CONTEXT);
>>>>> + int textWidth = (int)Math.ceil(stringBounds.getWidth());
>>>>> + int textX = (width - textWidth - 2) / 2 + 1;
>>>>> +
>>>>> + // Paint the text
>>>>> + Shape previousClip = graphics.getClip();
>>>>> + graphics.clipRect(0, 0, meterStop, height);
>>>>> + graphics.setPaint(Color.LIGHT_GRAY);
>>>>> + graphics.setFont(font);
>>>>> + graphics.drawString(meter.getText(), textX, ascent+1);
>>>>> + graphics.setClip(previousClip);
>>>>> + graphics.clipRect(meterStop, 0, width, height);
>>>>> + graphics.setPaint(textColor);
>>>>> + graphics.setFont(font);
>>>>> + graphics.drawString(meter.getText(), textX, ascent+1);
>>>>> + graphics.setClip(previousClip);
>>>>> + }
>>>>> }
>>>>>
>>>>> public Color getColor() {
>>>>> - return color;
>>>>> + return fillColor;
>>>>> }
>>>>>
>>>>> public void setColor(Color color) {
>>>>> - this.color = color;
>>>>> + this.fillColor = color;
>>>>> repaintComponent();
>>>>> }
>>>>>
>>>>> @@ -169,6 +263,35 @@
>>>>> setGridFrequency(gridFrequency.floatValue());
>>>>> }
>>>>>
>>>>> + public Font getFont() {
>>>>> + return font;
>>>>> + }
>>>>> +
>>>>> + public void setFont(Font font) {
>>>>> + if (font == null) {
>>>>> + throw new IllegalArgumentException("font is null.");
>>>>> + }
>>>>> +
>>>>> + this.font = font;
>>>>> + invalidateComponent();
>>>>> + }
>>>>> +
>>>>> + public final void setFont(String font) {
>>>>> + if (font == null) {
>>>>> + throw new IllegalArgumentException("font is null.");
>>>>> + }
>>>>> +
>>>>> + setFont(decodeFont(font));
>>>>> + }
>>>>> +
>>>>> + public final void setFont(Dictionary<String, ?> font) {
>>>>> + if (font == null) {
>>>>> + throw new IllegalArgumentException("font is null.");
>>>>> + }
>>>>> +
>>>>> + setFont(Theme.deriveFont(font));
>>>>> + }
>>>>> +
>>>>> /**
>>>>> * Listener for meter percentage changes.
>>>>> *
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>