⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gauge.java

📁 j2me is based on j2mepolish, client & server for mobile application. menu sample
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
//#condition polish.usePolishGui
// generated by de.enough.doc2java.Doc2Java (www.enough.de) on Sat Dec 06 15:06:44 CET 2003
/*
 * Copyright (c) 2004-2005 Robert Virkus / Enough Software
 *
 * This file is part of J2ME Polish.
 *
 * J2ME Polish is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * J2ME Polish 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with J2ME Polish; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * 
 * Commercial licenses are also available, please
 * refer to the accompanying LICENSE.txt or visit
 * http://www.j2mepolish.org for details.
 */
package de.enough.polish.ui;

import java.io.IOException;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

/**
 * Implements a graphical display, such as a bar graph, of an integer
 * value.  The <code>Gauge</code> contains a <em>current value</em>
 * that lies between zero and the <em>maximum value</em>, inclusive.
 * The application can control the current value and maximum value.
 * The range of values specified by the application may be larger than
 * the number of distinct visual states possible on the device, so
 * more than one value may have the same visual representation.
 * 
 * <P>For example, consider a <code>Gauge</code> object that has a
 * range of values from zero to <code>99</code>, running on a device
 * that displays the <code>Gauge's</code> approximate value using a
 * set of one to ten bars. The device might show one bar for values
 * zero through nine, two bars for values ten through <code>19</code>,
 * three bars for values <code>20</code> through <code>29</code>, and
 * so forth. </p>
 * 
 * <P>A <code>Gauge</code> may be interactive or
 * non-interactive. Applications may set or retrieve the
 * <code>Gauge's</code> value at any time regardless of the
 * interaction mode.  The implementation may change the visual
 * appearance of the bar graph depending on whether the object is
 * created in interactive mode. </p>
 * 
 * <P>In interactive mode, the user is allowed to modify the
 * value. The user will always have the means to change the value up
 * or down by one and may also have the means to change the value in
 * greater increments.  The user is prohibited from moving the value
 * outside the established range. The expected behavior is that the
 * application sets the initial value and then allows the user to
 * modify the value thereafter. However, the application is not
 * prohibited from modifying the value even while the user is
 * interacting with it. </p>
 * 
 * <p> In many cases the only means for the user to modify the value
 * will be to press a button to increase or decrease the value by one
 * unit at a time.  Therefore, applications should specify a range of
 * no more than a few dozen values. </p>
 * 
 * <P>In non-interactive mode, the user is prohibited from modifying
 * the value.  Non-interactive mode is used to provide feedback to the
 * user on the state of a long-running operation. One expected use of
 * the non-interactive mode is as a &quot;progress indicator&quot; or
 * &quot;activity indicator&quot; to give the user some feedback
 * during a long-running operation. The application may update the
 * value periodically using the <code>setValue()</code> method. </P>
 * 
 * <P>A non-interactive <code>Gauge</code> can have a definite or
 * indefinite range.  If a <code>Gauge</code> has definite range, it
 * will have an integer value between zero and the maximum value set
 * by the application, inclusive.  The implementation will provide a
 * graphical representation of this value such as described above.</p>
 * 
 * <P>A non-interactive <code>Gauge</code> that has indefinite range
 * will exist in one of four states: continuous-idle,
 * incremental-idle, continuous-running, or incremental-updating.
 * These states are intended to indicate to the user that some level
 * of activity is occurring.  With incremental-updating, progress can
 * be indicated to the user even though there is no known endpoint to
 * the activity.  With continuous-running, there is no progress that
 * gets reported to the user and there is no known endpoint;
 * continuous-running is merely a busy state indicator. The
 * implementation should use a graphical display that shows this
 * appropriately.  The implementation may use different graphics for
 * indefinite continuous gauges and indefinite incremental gauges.
 * Because of this, separate idle states exist for each mode.  For
 * example, the implementation might show an hourglass or spinning
 * watch in the continuous-running state, but show an animation with
 * different states, like a beach ball or candy-striped bar, in the
 * incremental-updating state.</p>
 * 
 * <p>In the continuous-idle or incremental-idle state, the
 * <code>Gauge</code> indicates that no activity is occurring. In the
 * incremental-updating state, the <code>Gauge</code> indicates
 * activity, but its graphical representation should be updated only
 * when the application requests an update with a call to
 * <code>setValue()</code>.  In the continuous-running state, the
 * <code>Gauge</code> indicates activity by showing an animation that
 * runs continuously, without update requests from the
 * application.</p>
 * 
 * <p>The values <code>CONTINUOUS_IDLE</code>,
 * <code>INCREMENTAL_IDLE</code>, <code>CONTINUOUS_RUNNING</code>, and
 * <code>INCREMENTAL_UPDATING</code> have their special meaning only
 * when the <code>Gauge</code> is non-interactive and has been set to
 * have indefinite range.  They are treated as ordinary values if the
 * <code>Gauge</code> is interactive or if it has been set to have a
 * definite range.</p>
 * 
 * <P>An application using the <code>Gauge</code> as a progress
 * indicator should typically also attach a <A HREF="../../../javax/microedition/lcdui/Command.html#STOP"><CODE>STOP</CODE></A>
 * command to the container containing the <code>Gauge</code> to allow
 * the user to halt the operation in progress.</p>
 * 
 * <h3>Notes for Application Developers</h3>
 * 
 * <P>As mentioned above, a non-interactive <code>Gauge</code> may be
 * used to give user feedback during a long-running operation.  If the
 * application can observe the progress of the operation as it
 * proceeds to an endpoint known in advance, then the application
 * should use a non-interactive <code>Gauge</code> with a definite
 * range.  For example, consider an application that is downloading a
 * file known to be <code>20</code> kilobytes in size.  The
 * application could set the <code>Gauge's</code> maximum value to be
 * <code>20</code> and set its value to the number of kilobytes
 * downloaded so far.  The user will be presented with a
 * <code>Gauge</code> that shows the portion of the task completed at
 * any given time.</P>
 * 
 * <P>If, on the other hand, the application is downloading a file of
 * unknown size, it should use a non-interactive <code>Gauge</code>
 * with indefinite range.  Ideally, the application should call
 * <CODE>setValue(INCREMENTAL_UPDATING)</CODE> periodically, perhaps
 * each time its input buffer has filled.  This will give the user an
 * indication of the rate at which progress is occurring.</P>
 * 
 * <P>Finally, if the application is performing an operation but has
 * no means of detecting progress, it should set a non-interactive
 * <code>Gauge</code> to have indefinite range and set its value to
 * <CODE>CONTINUOUS_RUNNING</CODE> or <CODE>CONTINUOUS_IDLE</CODE> as
 * appropriate.  For example, if the application has issued a request
 * to a network server and is about to block waiting for the server to
 * respond, it should set the <code>Gauge's</code> state to
 * <CODE>CONTINUOUS_RUNNING</CODE> before awaiting the response, and it
 * should set the state to <CODE>CONTINUOUS_IDLE</CODE> after it has
 * received the response.</P>
 * <HR>
 * 
 * @author Robert Virkus, robert@enough.de
 * @since MIDP 1.0
 */
public class Gauge extends Item
//#ifdef polish.images.backgroundLoad
//# implements ImageConsumer
//#endif
{
	private static int ANIMATION_MODE_BACKANDFORTH = 1;
	
	/**
	 * A special value used for the maximum value in order to indicate that
	 * the <code>Gauge</code> has indefinite range.  This value may be
	 * used as the <code>maxValue</code>
	 * parameter to the constructor, the parameter passed to
	 * <code>setMaxValue()</code>, and
	 * as the return value of <code>getMaxValue()</code>.
	 * <P>
	 * The value of <code>INDEFINITE</code> is <code>-1</code>.</P>
	 * 
	 * 
	 * @since MIDP 2.0
	 */
	public static final int INDEFINITE = -1;

	/**
	 * The value representing the continuous-idle state of a
	 * non-interactive <code>Gauge</code> with indefinite range.  In
	 * the continuous-idle state, the gauge shows a graphic
	 * indicating that no work is in progress.
	 * 
	 * <p>This value has special meaning only for non-interactive
	 * gauges with indefinite range.  It is treated as an ordinary
	 * value for interactive gauges and for non-interactive gauges
	 * with definite range.</p>
	 * 
	 * <p>The value of <code>CONTINUOUS_IDLE</code> is
	 * <code>0</code>.</p>
	 * 
	 * 
	 * @since MIDP 2.0
	 */
	public static final int CONTINUOUS_IDLE = 0;

	/**
	 * The value representing the incremental-idle state of a
	 * non-interactive <code>Gauge</code> with indefinite range.  In
	 * the incremental-idle state, the gauge shows a graphic
	 * indicating that no work is in progress.
	 * 
	 * <p>This value has special meaning only for non-interactive
	 * gauges with indefinite range.  It is treated as an ordinary
	 * value for interactive gauges and for non-interactive gauges
	 * with definite range.</p>
	 * 
	 * <p>The value of <code>INCREMENTAL_IDLE</code> is
	 * <code>1</code>.</p>
	 * 
	 * 
	 * @since MIDP 2.0
	 */
	public static final int INCREMENTAL_IDLE = 1;

	/**
	 * The value representing the continuous-running state of a
	 * non-interactive <code>Gauge</code> with indefinite range.  In
	 * the continuous-running state, the gauge shows a
	 * continually-updating animation sequence that indicates that
	 * work is in progress.  Once the application sets a gauge into
	 * the continuous-running state, the animation should proceed
	 * without further requests from the application.
	 * 
	 * <p>This value has special meaning only for non-interactive
	 * gauges with indefinite range.  It is treated as an ordinary
	 * value for interactive gauges and for non-interactive gauges
	 * with definite range.</p>
	 * 
	 * <p>The value of <code>CONTINUOUS_RUNNING</code> is
	 * <code>2</code>.</p>
	 * 
	 * 
	 * @since MIDP 2.0
	 */
	public static final int CONTINUOUS_RUNNING = 2;

	/**
	 * The value representing the incremental-updating state of a
	 * non-interactive <code>Gauge</code> with indefinite range.  In
	 * the incremental-updating state, the gauge shows a graphic
	 * indicating that work is in progress, typically one frame of an
	 * animation sequence.  The graphic should be updated to the next
	 * frame in the sequence only when the application calls
	 * <code>setValue(INCREMENTAL_UPDATING)</code>.
	 * 
	 * <p>This value has special meaning only for non-interactive
	 * gauges with indefinite range.  It is treated as an ordinary
	 * value for interactive gauges and for non-interactive gauges
	 * with definite range.</p>
	 * 
	 * <p> The value of <code>INCREMENTAL_UPDATING</code> is
	 * <code>3</code>.</p>
	 * 
	 * 
	 * 
	 * @since MIDP 2.0
	 */
	public static final int INCREMENTAL_UPDATING = 3;
	
	private static final int MODE_CONTINUOUS = 0; 
	private static final int MODE_CHUNKED = 1;

	private int value;
	private String valueString;
	private int maxValue;
	private boolean isInteractive;
	private int color = 0x0000FF; //default color is blue
	private int mode = MODE_CHUNKED;
	private int chunkWidth = 6;
	private int gapWidth = 3;
	private int gapColor = 0xFFFFFF; // default gap color is white
	private Image image;
	//#if polish.css.gauge-button-image
		//# private boolean useImageAsButton;
		//# private int sliderWidth;
	//#endif
	//#if polish.css.gauge-slider-image
		//# private Image sliderImage;
	//#endif
	private int imageYOffset;
	private Image indicatorImage;
	private boolean isIndefinite;
	private int indefinitePos;
	private boolean showValue = true;
	private boolean isValueLeft = true;
	private int fontColor;
	private Font font;
	private int valueWidth;

	//#if polish.css.gauge-animation-speed
		//# private int animationSpeed = 1;
	//#endif
	//#if polish.css.gauge-animation-mode
		//# private int animationMode;
		//# private boolean animationDirectionDownwards;
	//#endif
	//#if polish.css.gauge-inactive-image
		//# private Image inactiveImage;
	//#endif
	private boolean isShown;

	/**
	 * Creates a new <code>Gauge</code> object with the given
	 * label, in interactive or non-interactive mode, with the given
	 * maximum and initial values.  In interactive mode (where
	 * <code>interactive</code> is <code>true</code>) the maximum
	 * value must be greater than zero, otherwise an exception is
	 * thrown.  In non-interactive mode (where
	 * <code>interactive</code> is <code>false</code>) the maximum
	 * value must be greater than zero or equal to the special value
	 * <code>INDEFINITE</code>, otherwise an exception is thrown.
	 * 
	 * <p>If the maximum value is greater than zero, the gauge has
	 * definite range.  In this case the initial value must be within
	 * the range zero to <code>maxValue</code>, inclusive.  If the
	 * initial value is less than zero, the value is set to zero.  If
	 * the initial value is greater than <code>maxValue</code>, it is
	 * set to <code>maxValue</code>.</p>
	 * 
	 * <p>If <code>interactive</code> is <code>false</code> and the
	 * maximum value is <code>INDEFINITE</code>, this creates a
	 * non-interactive gauge with indefinite range. The initial value
	 * must be one of <code>CONTINUOUS_IDLE</code>,
	 * <code>INCREMENTAL_IDLE</code>, <code>CONTINUOUS_RUNNING</code>,
	 * or <code>INCREMENTAL_UPDATING</code>.</p>
	 * 
	 * @param label the Gauge's label
	 * @param interactive tells whether the user can change the value
	 * @param maxValue the maximum value, or INDEFINITE
	 * @param initialValue the initial value in the range [0..maxValue], or one of CONTINUOUS_IDLE, INCREMENTAL_IDLE, CONTINUOUS_RUNNING, or INCREMENTAL_UPDATING if maxValue is INDEFINITE.
	 * @throws IllegalArgumentException if maxValue is not positive for interactive gauges
	 * 												  or if maxValue is neither positive nor INDEFINITE for non-interactive gauges
	 * 												  or if initialValue is not one of CONTINUOUS_IDLE, INCREMENTAL_IDLE, CONTINUOUS_RUNNING, or INCREMENTAL_UPDATING for a non-interactive gauge with indefinite range
	 * @see #INDEFINITE
	 * @see #CONTINUOUS_IDLE
	 * @see #INCREMENTAL_IDLE
	 * @see #CONTINUOUS_RUNNING
	 * @see #INCREMENTAL_UPDATING
	 */
	public Gauge( String label, boolean interactive, int maxValue, int initialValue)
	{
		this( label, interactive, maxValue, initialValue, null );
	}

	/**
	 * Creates a new <code>Gauge</code> object with the given
	 * label, in interactive or non-interactive mode, with the given
	 * maximum and initial values.  In interactive mode (where
	 * <code>interactive</code> is <code>true</code>) the maximum
	 * value must be greater than zero, otherwise an exception is
	 * thrown.  In non-interactive mode (where
	 * <code>interactive</code> is <code>false</code>) the maximum
	 * value must be greater than zero or equal to the special value
	 * <code>INDEFINITE</code>, otherwise an exception is thrown.
	 * 
	 * <p>If the maximum value is greater than zero, the gauge has
	 * definite range.  In this case the initial value must be within
	 * the range zero to <code>maxValue</code>, inclusive.  If the
	 * initial value is less than zero, the value is set to zero.  If
	 * the initial value is greater than <code>maxValue</code>, it is
	 * set to <code>maxValue</code>.</p>
	 * 
	 * <p>If <code>interactive</code> is <code>false</code> and the
	 * maximum value is <code>INDEFINITE</code>, this creates a
	 * non-interactive gauge with indefinite range. The initial value
	 * must be one of <code>CONTINUOUS_IDLE</code>,
	 * <code>INCREMENTAL_IDLE</code>, <code>CONTINUOUS_RUNNING</code>,
	 * or <code>INCREMENTAL_UPDATING</code>.</p>
	 * 
	 * @param label the Gauge's label
	 * @param interactive tells whether the user can change the value
	 * @param maxValue the maximum value, or INDEFINITE
	 * @param initialValue the initial value in the range [0..maxValue], or one of CONTINUOUS_IDLE, INCREMENTAL_IDLE, CONTINUOUS_RUNNING, or INCREMENTAL_UPDATING if maxValue is INDEFINITE.
	 * @param style the CSS style for this item
	 * @throws IllegalArgumentException if maxValue is not positive for interactive gauges
	 * 												  or if maxValue is neither positive nor INDEFINITE for non-interactive gauges
	 * 												  or if initialValue is not one of CONTINUOUS_IDLE, INCREMENTAL_IDLE, CONTINUOUS_RUNNING, or INCREMENTAL_UPDATING for a non-interactive gauge with indefinite range
	 * @see #INDEFINITE
	 * @see #CONTINUOUS_IDLE
	 * @see #INCREMENTAL_IDLE
	 * @see #CONTINUOUS_RUNNING
	 * @see #INCREMENTAL_UPDATING

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -