package org.openswing.swing.miscellaneous.client; import java.util.*; import java.awt.*; import javax.swing.*; import org.openswing.swing.util.client.*; /** * <p>Title: OpenSwing Framework</p> * <p>Description: Progress bar that allows to: * - define minimum and maxixum values * - background color * - internal intervals and colors to use inside each interval.</p> * <p>Copyright: Copyright (C) 2006 Mauro Carniel</p> * * <p> This file is part of OpenSwing Framework. * This library is free software; you can redistribute it and/or * modify it under the terms of the (LGPL) Lesser General Public * License as published by the Free Software Foundation; * * GNU LESSER GENERAL PUBLIC LICENSE * Version 2.1, February 1999 * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * The author may be contacted at: * maurocarniel@tin.it</p> * * @author Mauro Carniel * @version 1.0 */ public class ProgressBar extends JPanel { /** minimum value allowed in the progress bar; default value = 0 */ private double minValue = 0; /** maximum value allowed in the progress bar; default value: 100 */ private double maxValue = 100; /** current value to set */ private double currentValue = 0; /** current used color; default value: ClientSettings.GRID_SELECTION_BACKGROUND */ private Color currentColor = ClientSettings.GRID_SELECTION_BACKGROUND; /** list of bands included in [minValue,maxValue] interval, having a specific color */ private ArrayList coloredBands = new ArrayList(); /** flag used to determine how to color the progress bar: <code>true</code> to paint the bar with many colors, each band with its color, <code>false</code> to paint the bar with ony one color: the color related to the last matched band */ private boolean showAllBands = true; public ProgressBar() { setPreferredSize(new Dimension(300,20)); setBorder(BorderFactory.createLoweredBevelBorder()); setOpaque(false); } public final void paint(Graphics g) { if (coloredBands.size()>0) { if (showAllBands) { // color several bands, each one with its color, until "currentValue" limit... ColoredBand band = null; double val; for(int i=0;i<coloredBands.size();i++) { band = (ColoredBand)coloredBands.get(i); if (band.getMaxValue()<=currentValue) { val = Math.min(band.getMaxValue(),currentValue); g.setColor(band.getColor()); g.fillRect( 1+(int)((double)getWidth()*band.getMinValue()/(maxValue-minValue)), 1, (int)((double)getWidth()*val/(maxValue-minValue)), getHeight()-2 ); } else break; } } else { // color the whole bar with only one color: the color related to the band that matches "currentValue" limit... ColoredBand band = null; double val; for(int i=coloredBands.size()-1;i>=0;i--) { band = (ColoredBand)coloredBands.get(i); if (band.getMaxValue()>=currentValue && band.getMinValue()<=currentValue) { g.setColor(band.getColor()); g.fillRect( 1, 1, (int)((double)getWidth()*currentValue/(maxValue-minValue)), getHeight()-2 ); break; } } } } else { g.setColor(currentColor); g.fillRect(1,1,(int)((double)getWidth()*currentValue/(maxValue-minValue)),getHeight()-2); } super.paint(g); } /** * Set current color to used to color the bar. * @param currentColor current color to used to color the bar */ public final void setColor(Color currentColor) { this.currentColor = currentColor; repaint(); } /** * @return current color to used to color the bar */ public final Color getColor() { return this.currentColor; } /** * Set current value. * @param currentValue current value (between minValue and maxValue), used to show the bar inside this panel. */ public synchronized final void setValue(double currentValue) { if (currentValue>maxValue) currentValue = maxValue; if (currentValue<minValue) currentValue = minValue; this.currentValue = currentValue; repaint(); } /** * @return currentValue current value (between minValue and maxValue) showed in the bar inside this panel. */ public final double getValue() { return currentValue; } /** * @return maximum value allowed in the progress bar */ public final double getMaxValue() { return maxValue; } /** * @return minimum value allowed in the progress bar; default value = 0 */ public final double getMinValue() { return minValue; } /** * Set the maximum value allowed in the progress bar. * @param maxValue maximum value allowed in the progress bar */ public final void setMaxValue(double maxValue) { this.maxValue = maxValue; repaint(); } /** * Set the minimum value allowed in the progress bar. * @param minValue minimum value allowed in the progress bar */ public final void setMinValue(double minValue) { this.minValue = minValue; repaint(); } /** * Add an interval [minValue,maxValue] and a color to use to paint that interval. * @param minValue minimum value of this interval * @param maxValue maximum value of this interval * @param color color to use to paint this band * @return <code>true</code> if the specified interval does not match any other interval, <code>false</code> otherwise */ public final boolean addColoredBand(double minValue,double maxValue,Color color) { if (minValue<this.minValue) minValue = this.minValue; if (maxValue>this.maxValue) maxValue = this.maxValue; if (minValue>=maxValue) return false; ColoredBand interv = null; int pos = 0; for(int i=0;i<coloredBands.size();i++) { interv = (ColoredBand)coloredBands.get(i); if (minValue>interv.getMinValue() && minValue<interv.getMaxValue()) return false; if (maxValue>interv.getMinValue() && maxValue<interv.getMaxValue()) return false; if (minValue>=interv.getMaxValue()) pos = i+1; } coloredBands.add(pos,new ColoredBand(minValue,maxValue,color)); return true; } /** * @return flag used to determine how to color the progress bar: <code>true</code> to paint the bar with many colors, each band with its color, <code>false</code> to paint the bar with ony one color: the color related to the last matched band */ public final boolean isShowAllBands() { return showAllBands; } /** * Determine how to color the progress bar: <code>true</code> to paint the bar with many colors, each band with its color, <code>false</code> to paint the bar with ony one color: the color related to the last matched band. * @param showAllBands flag used to determine how to color the progress bar: <code>true</code> to paint the bar with many colors, each band with its color, <code>false</code> to paint the bar with ony one color: the color related to the last matched band */ public final void setShowAllBands(boolean showAllBands) { this.showAllBands = showAllBands; } /** * <p>Title: OpenSwing Framework</p> * <p>Description: Inner class used to store a colored band.</p> * <p>Copyright: Copyright (C) 2006 Mauro Carniel</p> * @author Mauro Carniel * @version 1.0 */ class ColoredBand { /** minimum value of this band */ private double minValue; /** maximum value of this band */ private double maxValue; /** color used to paint this band */ private Color color; public ColoredBand(double minValue,double maxValue,Color color) { this.minValue = minValue; this.maxValue = maxValue; this.color = color; } public double getMinValue() { return minValue; } public double getMaxValue() { return maxValue; } public Color getColor() { return color; } } }