You could just make it styleable in TerraMeterSkin... (setTextColor()).
When the text overlapped with the fill, it would use the text color -
otherwise it'd use the fill color.

-T

On Thu, Oct 29, 2009 at 10:32 AM, Noel Grandin <[email protected]>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.
> >>>      *
> >>>
> >>>
> >>>
> >>
> >
>
>

Reply via email to