package org.limewire.ui.swing.components;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;
import javax.swing.JProgressBar;
import org.jdesktop.swingx.painter.AbstractPainter;
/**
* A wrapper for JProgressBar that can accept a foreground and background painter
* The background painter is responsible for painting the basic component with
* no progress and any borders, the foreground painter paints the current progress.
* <p>
* NOTE: This component implements a lazy caching update model.
* Directly changing the model will not fire repaints. setValue()
* and setEnabled() will clear the cache if the components
* state is changed.
*/
public class LimeProgressBar extends JProgressBar {
/**
* If false caching will be disabled on incoming painters.
* Only use this temporarily until the caching model
* is upgraded to account for the desired changes.
*/
private static final boolean CACHING_SUPPORTED = true;
private AbstractPainter<JProgressBar> foregroundPainter;
private AbstractPainter<JComponent> backgroundPainter;
/**
* Creates an unskinned instance with the default l&f and
* properties used by JProgressBar.
*/
public LimeProgressBar() {
}
/**
* Creates an unskinned instance with a minimum and maximum value.
*/
public LimeProgressBar(int min, int max) {
super(min, max);
}
/**
* Sets a painter for painting the progress portion.
* <p>
* Both background and foreground painter must be set to have an effect.
*/
public void setForegroundPainter(AbstractPainter<JProgressBar> painter) {
this.foregroundPainter = painter;
painter.setCacheable(hasCacheSupport());
}
/**
* Sets the painter that will be used to draw the components background
* and border.
* <p>
* Both background and foreground painter must be set to have an effect.
*/
public void setBackgroundPainter(AbstractPainter<JComponent> painter) {
this.backgroundPainter = painter;
}
/**
* Note: This component implements a lazy caching update model.
* Changing the model directly will not fire repaints.
*/
public boolean hasCacheSupport() {
return CACHING_SUPPORTED;
}
@Override
public void setValue(int v) {
if (this.getValue() != v) {
this.foregroundPainter.clearCache();
this.backgroundPainter.clearCache();
}
super.setValue(v);
}
@Override
public void setEnabled(boolean b) {
if (this.isEnabled() != b) {
this.foregroundPainter.clearCache();
this.backgroundPainter.clearCache();
}
super.setEnabled(b);
}
@Override
protected void paintComponent(Graphics g) {
if (foregroundPainter == null || backgroundPainter == null) {
super.paintComponent(g);
}
else {
backgroundPainter.paint((Graphics2D) g, this, this.getWidth(), this.getHeight());
foregroundPainter.paint((Graphics2D) g, this, this.getWidth(), this.getHeight());
}
}
}