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. > * > > >
