All Downloads are FREE. Search and download functionalities are using the official Maven repository.

echopointng.ProgressBar Maven / Gradle / Ivy

Go to download

Echo2 bundled with Echo2_Extras, Echo2_FileTransfer and echopointing and various improvements/bugfixes

There is a newer version: 2.0.4
Show newest version
package echopointng;

/* 
 * This file is part of the Echo Point Project.  This project is a collection
 * of Components that have extended the Echo Web Application Framework.
 *
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 */

import java.io.Serializable;
import java.util.EventListener;

import nextapp.echo2.app.Border;
import nextapp.echo2.app.Color;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.ImageReference;
import nextapp.echo2.app.Style;
import nextapp.echo2.app.event.ChangeEvent;
import nextapp.echo2.app.event.ChangeListener;
import echopointng.model.BoundedRangeModel;
import echopointng.model.DefaultBoundedRangeModel;
import echopointng.progressbar.DefaultProgressBarRenderer;
import echopointng.progressbar.ProgressBarRenderer;
import echopointng.util.ColorKit;

/**
 * The ProgressBar> component provides a visual display for an
 * integer value within a bounded interval.
 * 

* A ProgressBar typically communicates the progress of an event * by displaying its percentage of completion and possibly a textual display of * this percentage. *

* The ProgressBar comes with a standard width and height that is optimised for * HORIZONATL orientation. If you change the orientation, be sure to flip the * height and width otherwise it will look strange. This is done by default on * the basic setOrientation() method. *

* The width and height of the ProgressBar can be adjusted slightly by the * ProgressBarRenderer, so it can fit the block size exactly. So dont assume its * size is always exact. * */ public class ProgressBar extends AbleComponent { /* * We pass each Change event to the listeners with the the progress bar as * the event source. We also update our image reference to reflect the * change. */ private class InternalModelListener implements ChangeListener, Serializable { public void stateChanged(ChangeEvent e) { // // set the flag that tells use to redraw our image reference // just before it gets rendered invalidate(); // // then inform all listeners fireStateChanged(); } } public static final String PROPERTY_COMPLETED_COLOR = "completedColor"; public static final String PROPERTY_MODEL = "model"; public static final String PROPERTY_NUMBER_OF_BLOCKS = "numberOfBlocks"; public static final String PROPERTY_ORIENTATION = "orientation"; public static final String PROPERTY_PROGRESS_STRING = "progressString"; public static final String PROPERTY_PROGRESS_STRING_PAINTED = "progressStringPainted"; public static final String PROPERTY_PROGRESSBAR_IMAGE = "progressBarImage"; public static final String PROPERTY_RENDERER = "renderer"; public static final String PROPERTY_UNCOMPLETED_COLOR = "uncompletedColor"; public static final int ORIENTATION_HORIZONTAL = 0; public static final int ORIENTATION_VERTICAL = 1; public static final Style DEFAULT_STYLE; static { MutableStyleEx style = new MutableStyleEx(); style.setProperty(PROPERTY_BORDER, new Border(1, ColorKit.makeColor("#D6D3CE"), Border.STYLE_SOLID)); style.setProperty(PROPERTY_HEIGHT, new ExtentEx("30px")); style.setProperty(PROPERTY_WIDTH, new ExtentEx("146px")); style.setProperty(PROPERTY_COMPLETED_COLOR, Color.ORANGE); style.setProperty(PROPERTY_UNCOMPLETED_COLOR, Color.LIGHTGRAY); DEFAULT_STYLE = style; } /** * Only one ChangeEvent is needed per instance since the event's only * interesting property is the immutable source, which is the progress bar. */ protected transient ChangeEvent changeEvent = null; protected ChangeListener changeListener = null; private boolean invalid = true; /** * Creates a horizontal progress bar. The default orientation for progress * bars is ProgressBar.HORIZONTAL. *

* By default, the ProgressString is set to null and the * ProgressStringPainted is not painted. *

* Uses the defaultMinimum (0) and defaultMaximum (100). Uses the * defaultMinimum for the initial value of the progress bar. */ public ProgressBar() { this(new DefaultBoundedRangeModel()); } /** * Creates a horizontal progress bar, the default orientation. *

* By default, the ProgressString is set to null and the * ProgressStringPainted is not painted. *

* Uses the specified BoundedRangeModel which holds the minimum, value, and * maximum. * */ public ProgressBar(BoundedRangeModel newModel) { super(); setModel(newModel); setRenderer(new DefaultProgressBarRenderer()); } /** * Creates a horizontal progress bar, which is the default. *

* By default, the ProgressString is set to null and the * ProgressStringPainted is not painted. *

* Uses the specified minimum and maximum. Uses the specified minimum for * the initial value of the progress bar. */ public ProgressBar(int min, int max) { this(new DefaultBoundedRangeModel(0, 0, min, max)); } /** * Adds a ChangeListener to the ProgressBar. * * @param l * the ChangeListener to add */ public void addChangeListener(ChangeListener l) { getEventListenerList().addListener(ChangeListener.class, l); } /** * Subclasses that want to handle ChangeEvents differently can override this * to return a subclass of ModelListener or another ChangeListener * implementation. */ protected ChangeListener createChangeListener() { return new InternalModelListener(); } /** * Notify all listeners that have registered interest for notification on * this event type. */ protected void fireStateChanged() { EventListener[] listeners = getEventListenerList().getListeners(ChangeListener.class); for (int index = 0; index < listeners.length; ++index) { if (changeEvent == null) changeEvent = new ChangeEvent(this); ((ChangeListener) listeners[index]).stateChanged(changeEvent); } } /** * @return The Color of the ProgressBar's * completed blocks. */ public Color getCompletedColor() { return (Color) getProperty(PROPERTY_COMPLETED_COLOR); } /** * Returns the model's maximum value. By default, this is 100. * * @return an int -- the model's maximum */ public int getMaximum() { return getModel().getMaximum(); } /** * Returns the model's minimum value. By default, this is 0. * */ public int getMinimum() { return getModel().getMinimum(); } /** * Returns the data model used by the ProgressBar. * */ public BoundedRangeModel getModel() { return (BoundedRangeModel) getProperty(PROPERTY_MODEL); } /** * @return The number of blocks used when displaying the * ProgressBar. */ public int getNumberOfBlocks() { return getProperty(PROPERTY_NUMBER_OF_BLOCKS, 10); } /** * Returns ProgressBar.ORIENTATION_VERTICAL or * ProgressBar.ORIENTATION_HORIZONTAL, depending on the * orientation of the progress bar. The default orientation is * ORIENTATION_HORIZONTAL. * */ public int getOrientation() { return getProperty(PROPERTY_ORIENTATION, ORIENTATION_HORIZONTAL); } /** * Returns the percentage/percent complete for the progress bar. Note that, * as a double, this number is between 0.00 and 1.00. * * @return the percent complete for this progress bar. */ public double getPercentComplete() { BoundedRangeModel model = getModel(); double pc = 0; if (model != null) { long span = model.getMaximum() - model.getMinimum(); double currentValue = model.getValue(); pc = (currentValue - model.getMinimum()) / span; } return pc; } /** * This returns the image used to represent the ProgressBar. *

* Notice that their is no setProgressBarImage() method. The internal image * is updated whenever the model is changed. *

* This is done by making a call to the ProgressBarRenderer.drawProgressBar * method, which subclasses can override to customise how the progress bar * is drawn. *

* */ public ImageReference getProgressBarImage() { return (ImageReference) getProperty(PROPERTY_PROGRESSBAR_IMAGE); } /** * Returns the current value of the Progress String. * */ public String getProgressString() { String progressString = (String) getProperty(PROPERTY_PROGRESS_STRING); if (progressString != null) { return progressString; } else { int pc = (int) Math.round(100 * getPercentComplete()); return new String(pc + "%"); } } /** * Returns the renderer used by the ProgressBar. * */ public ProgressBarRenderer getRenderer() { return (ProgressBarRenderer) getProperty(PROPERTY_RENDERER); } /** * @return The Color of the ProgressBar's * uncompleted blocks. */ public Color getUncompletedColor() { return (Color) getProperty(PROPERTY_UNCOMPLETED_COLOR); } /** * Returns the model's current value. The value is always between the * model's minimum and maximum values, inclusive. By default, the value * equals the minimum. * */ public int getValue() { return getModel().getValue(); } /** * Can be called to invalidate the ProgressBar so that it will redraw its * internals when next rendered. */ public void invalidate() { invalid = true; } /** * Returns true if the progress bar will render a string onto the * representation of the progress bar. Returns false if it will not do this * rendering. The default is false - the progress bar does not draw the * string by default. * */ public boolean isProgressStringPainted() { return getProperty(PROPERTY_PROGRESS_STRING_PAINTED, false); } /** * Removes a ChangeListener from the ProgressBar. * * @param l * the ChangeListener to remove */ public void removeChangeListener(ChangeListener l) { getEventListenerList().removeListener(ChangeListener.class, l); } /** * Sets the completed Color of the ProgressBar. */ public void setCompletedColor(Color newColor) { setProperty(PROPERTY_COMPLETED_COLOR, newColor); } /** * Sets the model's maximum to n . * * The underlying BoundedRangeModel will handle any mathematical issues * arrising from assigning faulty values. *

* Notifies any listeners if the data changes. * */ public void setMaximum(int n) { getModel().setMaximum(n); } /** * Sets the model's minimum to n . *

* The underlying BoundedRangeModel will handle any mathematical issues * arrising from assigning faulty values. *

* Notifies any listeners if the data changes. * */ public void setMinimum(int n) { getModel().setMinimum(n); } /** * Sets the data model used by the ProgressBar. * */ public void setModel(BoundedRangeModel newModel) { BoundedRangeModel oldModel = getModel(); setProperty(PROPERTY_MODEL, newModel); if (newModel != oldModel) { if (oldModel != null) { oldModel.removeChangeListener(changeListener); changeListener = null; } if (newModel != null) { changeListener = createChangeListener(); newModel.addChangeListener(changeListener); } newModel.setExtent(0); } } /** * Sets the number of blocks used when displaying the * ProgressBar< * */ public void setNumberOfBlocks(int newValue) { if (newValue < 0) newValue = 1; setProperty(PROPERTY_NUMBER_OF_BLOCKS, newValue); } /** * Sets the progress bar's orientation to newOrientation , which must * be ProgressBar.ORIENTATION_VERTICAL or * ProgressBar.ORIENTATION_HORIZONTAL. The default * orientation is ORIENTATION_HORIZONTAL. *

* * */ public void setOrientation(int newOrientation) { setOrientation(newOrientation, true); } /** * Sets the progress bar's orientation to newOrientation , which must * be ProgressBar.ORIENTATION_VERTICAL or * ProgressBar.ORIENTATION_HORIZONTAL. The default * orientation is ORIENTATION_HORIZONTAL. *

* If the flipWidthAndHeight parameter is true, then the width and height * properties will be flipped around. * */ public void setOrientation(int newOrientation, boolean flipWidthAndHeight) { int oldOrientation = getOrientation(); if (oldOrientation != newOrientation) { switch (newOrientation) { case ORIENTATION_VERTICAL: case ORIENTATION_HORIZONTAL: if (flipWidthAndHeight) { Extent temp = getWidth(); setWidth(getHeight()); setHeight(temp); } setProperty(PROPERTY_ORIENTATION, newOrientation); break; default: throw new IllegalArgumentException(newOrientation + " is not a legal orientation"); } } } /** * Sets the value of the Progress String. By default, this String is set to * null. *

* */ public void setProgressString(String newValue) { setProperty(PROPERTY_PROGRESS_STRING, newValue); } /** * Sets whether the progress bar will render a string. * */ public void setProgressStringPainted(boolean newValue) { setProperty(PROPERTY_PROGRESS_STRING_PAINTED, newValue); } /** * Sets the renderer used by the ProgressBar. * */ public void setRenderer(ProgressBarRenderer newRenderer) { setProperty(PROPERTY_RENDERER, newRenderer); } /** * Sets the uncompleted Color of the ProgressBar. * */ public void setUncompletedColor(Color newColor) { setProperty(PROPERTY_UNCOMPLETED_COLOR, newColor); } /** * Sets the model's value to n . *

* The underlying BoundedRangeModel will handle any mathematical issues * arrising from assigning faulty values. *

* Notifies any listeners if the data changes. * */ public void setValue(int n) { getModel().setValue(n); } /** * */ public String toString() { StringBuffer sb = new StringBuffer(); sb.append("w="); sb.append(getWidth()); sb.append(" h="); sb.append(getHeight()); sb.append(" orient="); sb.append((getOrientation() == ORIENTATION_HORIZONTAL ? "horz" : "vert")); sb.append(" val="); sb.append(getValue()); return sb.toString(); } /** * @see nextapp.echo2.app.Component#validate() */ public void validate() { super.validate(); if (invalid) { /** * The image needs to be redraw when ever the model or properties * change. We are listening for both. */ ImageReference newValue; ProgressBarRenderer renderer = getRenderer(); if (renderer == null) { newValue = null; } else { newValue = renderer.drawProgressBar(this); } setProperty(PROPERTY_PROGRESSBAR_IMAGE, newValue); invalid = false; } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy