/*
* @(#)WindowsProgressBarUI.java 1.24 04/04/16
*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.sun.java.swing.plaf.windows;
import javax.swing.plaf.basic.*;
import javax.swing.plaf.*;
import javax.swing.*;
import java.awt.*;
/**
* Windows rendition of the component.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
* future Swing releases. The current serialization support is appropriate
* for short term storage or RMI between applications running the same
* version of Swing. A future release of Swing will provide support for
* long term persistence.
*
* @version 1.24 04/16/04
* @author Michael C. Albers
*/
public class WindowsProgressBarUI extends BasicProgressBarUI
{
private Rectangle boxRect;
public static ComponentUI createUI(JComponent x) {
return new WindowsProgressBarUI();
}
protected void installDefaults() {
super.installDefaults();
if (XPStyle.getXP() != null) {
LookAndFeel.installProperty(progressBar, "opaque", Boolean.FALSE);
progressBar.setBorder(null);
}
}
protected Dimension getPreferredInnerHorizontal() {
XPStyle xp = XPStyle.getXP();
if (xp != null) {
return xp.getDimension("progress.bar.normalsize");
} else {
return super.getPreferredInnerHorizontal();
}
}
protected Dimension getPreferredInnerVertical() {
if (XPStyle.getXP() != null) {
Dimension d = getPreferredInnerHorizontal();
return new Dimension(d.height, d.width); // Reverse values
} else {
return super.getPreferredInnerVertical();
}
}
protected void paintDeterminate(Graphics g, JComponent c) {
XPStyle xp = XPStyle.getXP();
if (xp != null) {
boolean vertical = (progressBar.getOrientation() == JProgressBar.VERTICAL);
boolean isLeftToRight = WindowsGraphicsUtils.isLeftToRight(c);
int barRectWidth = progressBar.getWidth();
int barRectHeight = progressBar.getHeight()-1;
// amount of progress to draw
int amountFull = getAmountFull(null, barRectWidth, barRectHeight);
paintXPBackground(g, vertical, barRectWidth, barRectHeight);
// Paint progress
if (progressBar.isStringPainted()) {
// Do not paint the standard stripes from the skin, because they obscure
// the text
g.setColor(progressBar.getForeground());
barRectHeight -= 2;
barRectWidth -= 2;
Graphics2D g2 = (Graphics2D)g;
g2.setStroke(new BasicStroke((float)(vertical ? barRectWidth : barRectHeight),
BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
if (!vertical) {
if (isLeftToRight) {
g2.drawLine(2, barRectHeight / 2 + 1,
amountFull - 2, barRectHeight / 2 + 1);
} else {
g2.drawLine(2 + barRectWidth,
barRectHeight / 2 + 1,
2 + barRectWidth - (amountFull - 2),
barRectHeight / 2 + 1);
}
paintString(g, 0, 0, barRectWidth, barRectHeight, amountFull, null);
} else {
g2.drawLine(barRectWidth/2 + 1, barRectHeight + 1,
barRectWidth/2 + 1, barRectHeight + 1 - amountFull + 2);
paintString(g, 2, 2, barRectWidth, barRectHeight, amountFull, null);
}
} else {
XPStyle.Skin skin =
xp.getSkin(vertical ? "progress.chunkvert" : "progress.chunk");
int thickness;
if (vertical) {
thickness = barRectWidth - 5;
} else {
thickness = barRectHeight - 5;
}
int chunkSize = xp.getInt("progress.progresschunksize", 2);
int spaceSize = xp.getInt("progress.progressspacesize", 0);
int nChunks = (amountFull-4) / (chunkSize + spaceSize);
// See if we can squeeze in an extra chunk without spacing after
if (spaceSize > 0 && (nChunks * (chunkSize + spaceSize) + chunkSize) < (amountFull-4)) {
nChunks++;
}
for (int i = 0; i < nChunks; i++) {
if (vertical) {
skin.paintSkin(g,
3, barRectHeight - i * (chunkSize + spaceSize) - chunkSize - 2,
thickness, chunkSize, 0);
} else {
if (isLeftToRight) {
skin.paintSkin(g,
4 + i * (chunkSize + spaceSize), 2,
chunkSize, thickness, 0);
} else {
skin.paintSkin(g,
barRectWidth - (2 + (i+1) * (chunkSize + spaceSize)), 2,
chunkSize, thickness, 0);
}
}
}
}
} else {
super.paintDeterminate(g, c);
}
}
protected void paintIndeterminate(Graphics g, JComponent c) {
XPStyle xp = XPStyle.getXP();
if (xp != null) {
boolean vertical = (progressBar.getOrientation() == JProgressBar.VERTICAL);
int barRectWidth = progressBar.getWidth();
int barRectHeight = progressBar.getHeight()-1;
paintXPBackground(g, vertical, barRectWidth, barRectHeight);
// Paint the bouncing box.
boxRect = getBox(boxRect);
if (boxRect != null) {
g.setColor(progressBar.getForeground());
if (!vertical) {
g.fillRect(boxRect.x, boxRect.y + 2, boxRect.width, boxRect.height - 4);
} else {
g.fillRect(boxRect.x + 2, boxRect.y, boxRect.width - 3, boxRect.height);
}
if (progressBar.isStringPainted()) {
if (!vertical) {
paintString(g, -1, -1, barRectWidth, barRectHeight, 0, null);
} else {
paintString(g, 1, 1, barRectWidth, barRectHeight, 0, null);
}
}
}
} else {
super.paintIndeterminate(g, c);
}
}
private void paintXPBackground(Graphics g, boolean vertical,
int barRectWidth, int barRectHeight) {
XPStyle xp = XPStyle.getXP();
String category = vertical ? "progress.barvert" : "progress.bar";
XPStyle.Skin skin = xp.getSkin(category);
// Paint background
Color fillColor = xp.getColor(category + ".fillcolorhint", null);
if (fillColor != null) {
g.setColor(fillColor);
g.fillRect(2, 2, barRectWidth-4, barRectHeight-4);
}
skin.paintSkin(g, 0, 0, barRectWidth, barRectHeight, 0);
}
}
|