001: /*
002: *
003: * Copyright (c) 2007, Sun Microsystems, Inc.
004: *
005: * All rights reserved.
006: *
007: * Redistribution and use in source and binary forms, with or without
008: * modification, are permitted provided that the following conditions
009: * are met:
010: *
011: * * Redistributions of source code must retain the above copyright
012: * notice, this list of conditions and the following disclaimer.
013: * * Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in the
015: * documentation and/or other materials provided with the distribution.
016: * * Neither the name of Sun Microsystems nor the names of its contributors
017: * may be used to endorse or promote products derived from this software
018: * without specific prior written permission.
019: *
020: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
021: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
022: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
023: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
024: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
025: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
026: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
027: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
028: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
029: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
030: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
031: */
032: package example.chooser;
033:
034: import javax.microedition.lcdui.*;
035:
036: /**
037: * A Color chooser. This screen can be used to display and
038: * choose colors. The current color is always available
039: * via the getColor methods. It can be set with setColor.
040: */
041: public class MiniColorChooser extends Canvas {
042: /** Border width */
043: static final int BORDER = 2;
044:
045: /** Color bar height */
046: static final int BAR_H = 14;
047:
048: /** current color */
049: int rgbColor;
050:
051: /** current index */
052: int ndx = 0;
053:
054: /**
055: * Create a new MiniColorChooser for a single color.
056: */
057: public MiniColorChooser() {
058: setColor(0xffff00);
059: }
060:
061: /**
062: * Sets the current color to the specified RGB values. All subsequent
063: * rendering operations will use this specified color. The RGB value
064: * passed in is interpreted with the least significant eight bits
065: * giving the blue component, the next eight more significant bits
066: * giving the green component, and the next eight more significant
067: * bits giving the red component. That is to say, the color component
068: * is specified like 0x00RRGGBB.
069: * @param RGB The color being set.
070: */
071: public void setColor(int RGB) {
072: rgbColor = RGB & 0x00ffffff;
073: }
074:
075: /**
076: * Gets the current color.
077: * @return an integer in form 0x00RRGGBB
078: * @see #setColor
079: */
080: public int getColor() {
081: return rgbColor;
082: }
083:
084: /**
085: * Paint the canvas with the current color and controls to change it.
086: * @param g the graphics context to draw to the screen.
087: */
088: protected void paint(Graphics g) {
089: int w = getWidth();
090: int h = getHeight();
091:
092: int sample_w = w - 1;
093: int sample_h = h - ((BAR_H + BORDER) * 3);
094: int sample_y = BORDER;
095:
096: int b_y = sample_y + sample_h + (BORDER * 2);
097: int g_y = b_y + BAR_H;
098: int r_y = g_y + BAR_H;
099:
100: // Fill the background
101: g.setColor(0x000000);
102: g.fillRect(0, 0, w, h);
103:
104: // Fill in the color sample
105: g.setColor(rgbColor);
106: g.fillRect(BORDER, sample_y, sample_w, sample_h);
107:
108: // Draw the color bars
109: int blue = (rgbColor >> 0) & 0xff;
110: g.setColor(0, 0, 255);
111: g.fillRect(20, b_y, blue / 4, 10);
112:
113: int green = (rgbColor >> 8) & 0xff;
114: g.setColor(0, 255, 0);
115: g.fillRect(20, g_y, green / 4, 10);
116:
117: int red = (rgbColor >> 16) & 0xff;
118: g.setColor(255, 0, 0);
119: g.fillRect(20, r_y, red / 4, 10);
120:
121: g.setColor(255, 255, 255);
122: g.drawString(Integer.toString(blue), 18, b_y - 3,
123: Graphics.RIGHT | Graphics.TOP);
124: g.drawString(Integer.toString(green), 18, g_y - 3,
125: Graphics.RIGHT | Graphics.TOP);
126: g.drawString(Integer.toString(red), 18, r_y - 3, Graphics.RIGHT
127: | Graphics.TOP);
128:
129: if (ndx >= 0) {
130: int y = b_y + (ndx * BAR_H);
131: g.drawRect(20, y, 63, 10);
132: }
133: }
134:
135: /**
136: * Handle repeat as in pressed.
137: * @param key was pressed
138: */
139: public void keyRepeated(int key) {
140: keyPressed(key);
141: }
142:
143: /**
144: * Left and Right are used to change which color bar to change
145: * Up and Down are used to increase/decrease the value of that bar.
146: * @param key was pressed
147: */
148: protected void keyPressed(int key) {
149: int action = getGameAction(key);
150: int dir = 0;
151:
152: switch (action) {
153: case RIGHT:
154: dir += 1;
155:
156: break;
157:
158: case LEFT:
159: dir -= 1;
160:
161: break;
162:
163: case UP:
164: ndx -= 1;
165:
166: break;
167:
168: case DOWN:
169: ndx += 1;
170:
171: break;
172:
173: default:
174: return; // nothing we recognize, exit
175: }
176:
177: // Limit selection to r,g,b and palette
178: if (ndx < 0) {
179: ndx = 0;
180: }
181:
182: if (ndx > 2) {
183: ndx = 2;
184: }
185:
186: if (ndx >= 0) {
187: int v = (rgbColor >> (ndx * 8)) & 0xff;
188: v += (dir * 0x20);
189:
190: if (v < 0) {
191: v = 0;
192: }
193:
194: if (v > 255) {
195: v = 255;
196: }
197:
198: int mask = 0xff << (ndx * 8);
199: rgbColor = (rgbColor & ~mask) | (v << (ndx * 8));
200: }
201:
202: repaint();
203: }
204: }
|