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