blob: fb51d7196d11e86bbc5c021c5b38cd9055ecb781 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25package java.awt;
26
27import java.io.ObjectStreamException;
28
29/**
30 * A class to encapsulate symbolic colors representing the color of
31 * native GUI objects on a system. For systems which support the dynamic
32 * update of the system colors (when the user changes the colors)
33 * the actual RGB values of these symbolic colors will also change
34 * dynamically. In order to compare the "current" RGB value of a
35 * <code>SystemColor</code> object with a non-symbolic Color object,
36 * <code>getRGB</code> should be used rather than <code>equals</code>.
37 * <p>
38 * Note that the way in which these system colors are applied to GUI objects
39 * may vary slightly from platform to platform since GUI objects may be
40 * rendered differently on each platform.
41 * <p>
42 * System color values may also be available through the <code>getDesktopProperty</code>
43 * method on <code>java.awt.Toolkit</code>.
44 *
45 * @see Toolkit#getDesktopProperty
46 *
47 * @author Carl Quinn
48 * @author Amy Fowler
49 */
50public final class SystemColor extends Color implements java.io.Serializable {
51
52 /**
53 * The array index for the
54 * {@link #desktop} system color.
55 * @see SystemColor#desktop
56 */
57 public final static int DESKTOP = 0;
58
59 /**
60 * The array index for the
61 * {@link #activeCaption} system color.
62 * @see SystemColor#activeCaption
63 */
64 public final static int ACTIVE_CAPTION = 1;
65
66 /**
67 * The array index for the
68 * {@link #activeCaptionText} system color.
69 * @see SystemColor#activeCaptionText
70 */
71 public final static int ACTIVE_CAPTION_TEXT = 2;
72
73 /**
74 * The array index for the
75 * {@link #activeCaptionBorder} system color.
76 * @see SystemColor#activeCaptionBorder
77 */
78 public final static int ACTIVE_CAPTION_BORDER = 3;
79
80 /**
81 * The array index for the
82 * {@link #inactiveCaption} system color.
83 * @see SystemColor#inactiveCaption
84 */
85 public final static int INACTIVE_CAPTION = 4;
86
87 /**
88 * The array index for the
89 * {@link #inactiveCaptionText} system color.
90 * @see SystemColor#inactiveCaptionText
91 */
92 public final static int INACTIVE_CAPTION_TEXT = 5;
93
94 /**
95 * The array index for the
96 * {@link #inactiveCaptionBorder} system color.
97 * @see SystemColor#inactiveCaptionBorder
98 */
99 public final static int INACTIVE_CAPTION_BORDER = 6;
100
101 /**
102 * The array index for the
103 * {@link #window} system color.
104 * @see SystemColor#window
105 */
106 public final static int WINDOW = 7;
107
108 /**
109 * The array index for the
110 * {@link #windowBorder} system color.
111 * @see SystemColor#windowBorder
112 */
113 public final static int WINDOW_BORDER = 8;
114
115 /**
116 * The array index for the
117 * {@link #windowText} system color.
118 * @see SystemColor#windowText
119 */
120 public final static int WINDOW_TEXT = 9;
121
122 /**
123 * The array index for the
124 * {@link #menu} system color.
125 * @see SystemColor#menu
126 */
127 public final static int MENU = 10;
128
129 /**
130 * The array index for the
131 * {@link #menuText} system color.
132 * @see SystemColor#menuText
133 */
134 public final static int MENU_TEXT = 11;
135
136 /**
137 * The array index for the
138 * {@link #text} system color.
139 * @see SystemColor#text
140 */
141 public final static int TEXT = 12;
142
143 /**
144 * The array index for the
145 * {@link #textText} system color.
146 * @see SystemColor#textText
147 */
148 public final static int TEXT_TEXT = 13;
149
150 /**
151 * The array index for the
152 * {@link #textHighlight} system color.
153 * @see SystemColor#textHighlight
154 */
155 public final static int TEXT_HIGHLIGHT = 14;
156
157 /**
158 * The array index for the
159 * {@link #textHighlightText} system color.
160 * @see SystemColor#textHighlightText
161 */
162 public final static int TEXT_HIGHLIGHT_TEXT = 15;
163
164 /**
165 * The array index for the
166 * {@link #textInactiveText} system color.
167 * @see SystemColor#textInactiveText
168 */
169 public final static int TEXT_INACTIVE_TEXT = 16;
170
171 /**
172 * The array index for the
173 * {@link #control} system color.
174 * @see SystemColor#control
175 */
176 public final static int CONTROL = 17;
177
178 /**
179 * The array index for the
180 * {@link #controlText} system color.
181 * @see SystemColor#controlText
182 */
183 public final static int CONTROL_TEXT = 18;
184
185 /**
186 * The array index for the
187 * {@link #controlHighlight} system color.
188 * @see SystemColor#controlHighlight
189 */
190 public final static int CONTROL_HIGHLIGHT = 19;
191
192 /**
193 * The array index for the
194 * {@link #controlLtHighlight} system color.
195 * @see SystemColor#controlLtHighlight
196 */
197 public final static int CONTROL_LT_HIGHLIGHT = 20;
198
199 /**
200 * The array index for the
201 * {@link #controlShadow} system color.
202 * @see SystemColor#controlShadow
203 */
204 public final static int CONTROL_SHADOW = 21;
205
206 /**
207 * The array index for the
208 * {@link #controlDkShadow} system color.
209 * @see SystemColor#controlDkShadow
210 */
211 public final static int CONTROL_DK_SHADOW = 22;
212
213 /**
214 * The array index for the
215 * {@link #scrollbar} system color.
216 * @see SystemColor#scrollbar
217 */
218 public final static int SCROLLBAR = 23;
219
220 /**
221 * The array index for the
222 * {@link #info} system color.
223 * @see SystemColor#info
224 */
225 public final static int INFO = 24;
226
227 /**
228 * The array index for the
229 * {@link #infoText} system color.
230 * @see SystemColor#infoText
231 */
232 public final static int INFO_TEXT = 25;
233
234 /**
235 * The number of system colors in the array.
236 */
237 public final static int NUM_COLORS = 26;
238
239 /******************************************************************************************/
240
241 /*
242 * System colors with default initial values, overwritten by toolkit if
243 * system values differ and are available.
244 * Should put array initialization above first field that is using
245 * SystemColor constructor to initialize.
246 */
247 private static int[] systemColors = {
248 0xFF005C5C, // desktop = new Color(0,92,92);
249 0xFF000080, // activeCaption = new Color(0,0,128);
250 0xFFFFFFFF, // activeCaptionText = Color.white;
251 0xFFC0C0C0, // activeCaptionBorder = Color.lightGray;
252 0xFF808080, // inactiveCaption = Color.gray;
253 0xFFC0C0C0, // inactiveCaptionText = Color.lightGray;
254 0xFFC0C0C0, // inactiveCaptionBorder = Color.lightGray;
255 0xFFFFFFFF, // window = Color.white;
256 0xFF000000, // windowBorder = Color.black;
257 0xFF000000, // windowText = Color.black;
258 0xFFC0C0C0, // menu = Color.lightGray;
259 0xFF000000, // menuText = Color.black;
260 0xFFC0C0C0, // text = Color.lightGray;
261 0xFF000000, // textText = Color.black;
262 0xFF000080, // textHighlight = new Color(0,0,128);
263 0xFFFFFFFF, // textHighlightText = Color.white;
264 0xFF808080, // textInactiveText = Color.gray;
265 0xFFC0C0C0, // control = Color.lightGray;
266 0xFF000000, // controlText = Color.black;
267 0xFFFFFFFF, // controlHighlight = Color.white;
268 0xFFE0E0E0, // controlLtHighlight = new Color(224,224,224);
269 0xFF808080, // controlShadow = Color.gray;
270 0xFF000000, // controlDkShadow = Color.black;
271 0xFFE0E0E0, // scrollbar = new Color(224,224,224);
272 0xFFE0E000, // info = new Color(224,224,0);
273 0xFF000000, // infoText = Color.black;
274 };
275
276 /**
277 * The color rendered for the background of the desktop.
278 */
279 public final static SystemColor desktop = new SystemColor((byte)DESKTOP);
280
281 /**
282 * The color rendered for the window-title background of the currently active window.
283 */
284 public final static SystemColor activeCaption = new SystemColor((byte)ACTIVE_CAPTION);
285
286 /**
287 * The color rendered for the window-title text of the currently active window.
288 */
289 public final static SystemColor activeCaptionText = new SystemColor((byte)ACTIVE_CAPTION_TEXT);
290
291 /**
292 * The color rendered for the border around the currently active window.
293 */
294 public final static SystemColor activeCaptionBorder = new SystemColor((byte)ACTIVE_CAPTION_BORDER);
295
296 /**
297 * The color rendered for the window-title background of inactive windows.
298 */
299 public final static SystemColor inactiveCaption = new SystemColor((byte)INACTIVE_CAPTION);
300
301 /**
302 * The color rendered for the window-title text of inactive windows.
303 */
304 public final static SystemColor inactiveCaptionText = new SystemColor((byte)INACTIVE_CAPTION_TEXT);
305
306 /**
307 * The color rendered for the border around inactive windows.
308 */
309 public final static SystemColor inactiveCaptionBorder = new SystemColor((byte)INACTIVE_CAPTION_BORDER);
310
311 /**
312 * The color rendered for the background of interior regions inside windows.
313 */
314 public final static SystemColor window = new SystemColor((byte)WINDOW);
315
316 /**
317 * The color rendered for the border around interior regions inside windows.
318 */
319 public final static SystemColor windowBorder = new SystemColor((byte)WINDOW_BORDER);
320
321 /**
322 * The color rendered for text of interior regions inside windows.
323 */
324 public final static SystemColor windowText = new SystemColor((byte)WINDOW_TEXT);
325
326 /**
327 * The color rendered for the background of menus.
328 */
329 public final static SystemColor menu = new SystemColor((byte)MENU);
330
331 /**
332 * The color rendered for the text of menus.
333 */
334 public final static SystemColor menuText = new SystemColor((byte)MENU_TEXT);
335
336 /**
337 * The color rendered for the background of text control objects, such as
338 * textfields and comboboxes.
339 */
340 public final static SystemColor text = new SystemColor((byte)TEXT);
341
342 /**
343 * The color rendered for the text of text control objects, such as textfields
344 * and comboboxes.
345 */
346 public final static SystemColor textText = new SystemColor((byte)TEXT_TEXT);
347
348 /**
349 * The color rendered for the background of selected items, such as in menus,
350 * comboboxes, and text.
351 */
352 public final static SystemColor textHighlight = new SystemColor((byte)TEXT_HIGHLIGHT);
353
354 /**
355 * The color rendered for the text of selected items, such as in menus, comboboxes,
356 * and text.
357 */
358 public final static SystemColor textHighlightText = new SystemColor((byte)TEXT_HIGHLIGHT_TEXT);
359
360 /**
361 * The color rendered for the text of inactive items, such as in menus.
362 */
363 public final static SystemColor textInactiveText = new SystemColor((byte)TEXT_INACTIVE_TEXT);
364
365 /**
366 * The color rendered for the background of control panels and control objects,
367 * such as pushbuttons.
368 */
369 public final static SystemColor control = new SystemColor((byte)CONTROL);
370
371 /**
372 * The color rendered for the text of control panels and control objects,
373 * such as pushbuttons.
374 */
375 public final static SystemColor controlText = new SystemColor((byte)CONTROL_TEXT);
376
377 /**
378 * The color rendered for light areas of 3D control objects, such as pushbuttons.
379 * This color is typically derived from the <code>control</code> background color
380 * to provide a 3D effect.
381 */
382 public final static SystemColor controlHighlight = new SystemColor((byte)CONTROL_HIGHLIGHT);
383
384 /**
385 * The color rendered for highlight areas of 3D control objects, such as pushbuttons.
386 * This color is typically derived from the <code>control</code> background color
387 * to provide a 3D effect.
388 */
389 public final static SystemColor controlLtHighlight = new SystemColor((byte)CONTROL_LT_HIGHLIGHT);
390
391 /**
392 * The color rendered for shadow areas of 3D control objects, such as pushbuttons.
393 * This color is typically derived from the <code>control</code> background color
394 * to provide a 3D effect.
395 */
396 public final static SystemColor controlShadow = new SystemColor((byte)CONTROL_SHADOW);
397
398 /**
399 * The color rendered for dark shadow areas on 3D control objects, such as pushbuttons.
400 * This color is typically derived from the <code>control</code> background color
401 * to provide a 3D effect.
402 */
403 public final static SystemColor controlDkShadow = new SystemColor((byte)CONTROL_DK_SHADOW);
404
405 /**
406 * The color rendered for the background of scrollbars.
407 */
408 public final static SystemColor scrollbar = new SystemColor((byte)SCROLLBAR);
409
410 /**
411 * The color rendered for the background of tooltips or spot help.
412 */
413 public final static SystemColor info = new SystemColor((byte)INFO);
414
415 /**
416 * The color rendered for the text of tooltips or spot help.
417 */
418 public final static SystemColor infoText = new SystemColor((byte)INFO_TEXT);
419
420 /*
421 * JDK 1.1 serialVersionUID.
422 */
423 private static final long serialVersionUID = 4503142729533789064L;
424
425 /*
426 * An index into either array of SystemColor objects or values.
427 */
428 private transient int index;
429
430 private static SystemColor systemColorObjects [] = {
431 SystemColor.desktop,
432 SystemColor.activeCaption,
433 SystemColor.activeCaptionText,
434 SystemColor.activeCaptionBorder,
435 SystemColor.inactiveCaption,
436 SystemColor.inactiveCaptionText,
437 SystemColor.inactiveCaptionBorder,
438 SystemColor.window,
439 SystemColor.windowBorder,
440 SystemColor.windowText,
441 SystemColor.menu,
442 SystemColor.menuText,
443 SystemColor.text,
444 SystemColor.textText,
445 SystemColor.textHighlight,
446 SystemColor.textHighlightText,
447 SystemColor.textInactiveText,
448 SystemColor.control,
449 SystemColor.controlText,
450 SystemColor.controlHighlight,
451 SystemColor.controlLtHighlight,
452 SystemColor.controlShadow,
453 SystemColor.controlDkShadow,
454 SystemColor.scrollbar,
455 SystemColor.info,
456 SystemColor.infoText
457 };
458
459 static {
460 updateSystemColors();
461 }
462
463 /**
464 * Called from <init> & toolkit to update the above systemColors cache.
465 */
466 private static void updateSystemColors() {
467 if (!GraphicsEnvironment.isHeadless()) {
468 Toolkit.getDefaultToolkit().loadSystemColors(systemColors);
469 }
470 for (int i = 0; i < systemColors.length; i++) {
471 systemColorObjects[i].value = systemColors[i];
472 }
473 }
474
475 /**
476 * Creates a symbolic color that represents an indexed entry into system
477 * color cache. Used by above static system colors.
478 */
479 private SystemColor(byte index) {
480 super(systemColors[index]);
481 this.index = index;
482 }
483
484 /**
485 * Returns a string representation of this <code>Color</code>'s values.
486 * This method is intended to be used only for debugging purposes,
487 * and the content and format of the returned string may vary between
488 * implementations.
489 * The returned string may be empty but may not be <code>null</code>.
490 *
491 * @return a string representation of this <code>Color</code>
492 */
493 public String toString() {
494 return getClass().getName() + "[i=" + (index) + "]";
495 }
496
497 /**
498 * The design of the {@code SystemColor} class assumes that
499 * the {@code SystemColor} object instances stored in the
500 * static final fields above are the only instances that can
501 * be used by developers.
502 * This method helps maintain those limits on instantiation
503 * by using the index stored in the value field of the
504 * serialized form of the object to replace the serialized
505 * object with the equivalent static object constant field
506 * of {@code SystemColor}.
507 * See the {@link #writeReplace} method for more information
508 * on the serialized form of these objects.
509 * @return one of the {@code SystemColor} static object
510 * fields that refers to the same system color.
511 */
512 private Object readResolve() {
513 // The instances of SystemColor are tightly controlled and
514 // only the canonical instances appearing above as static
515 // constants are allowed. The serial form of SystemColor
516 // objects stores the color index as the value. Here we
517 // map that index back into the canonical instance.
518 return systemColorObjects[value];
519 }
520
521 /**
522 * Returns a specialized version of the {@code SystemColor}
523 * object for writing to the serialized stream.
524 * @serialData
525 * The value field of a serialized {@code SystemColor} object
526 * contains the array index of the system color instead of the
527 * rgb data for the system color.
528 * This index is used by the {@link #readResolve} method to
529 * resolve the deserialized objects back to the original
530 * static constant versions to ensure unique instances of
531 * each {@code SystemColor} object.
532 * @return a proxy {@code SystemColor} object with its value
533 * replaced by the corresponding system color index.
534 */
535 private Object writeReplace() throws ObjectStreamException
536 {
537 // we put an array index in the SystemColor.value while serialize
538 // to keep compatibility.
539 SystemColor color = new SystemColor((byte)index);
540 color.value = index;
541 return color;
542 }
543}