1 /*
2  * Copyright (c) 2005, 2014, Oracle and/or its affiliates. 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.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 /*
27  * <p>These classes are designed to be used while the
28  * corresponding <code>LookAndFeel</code> class has been installed
29  * (<code>UIManager.setLookAndFeel(new <i>XXX</i>LookAndFeel())</code>).
30  * Using them while a different <code>LookAndFeel</code> is installed
31  * may produce unexpected results, including exceptions.
32  * Additionally, changing the <code>LookAndFeel</code>
33  * maintained by the <code>UIManager</code> without updating the
34  * corresponding <code>ComponentUI</code> of any
35  * <code>JComponent</code>s may also produce unexpected results,
36  * such as the wrong colors showing up, and is generally not
37  * encouraged.
38  *
39  */
40 
41 package com.sun.java.swing.plaf.windows;
42 
43 import java.awt.*;
44 import java.util.*;
45 
46 import javax.swing.*;
47 
48 import sun.awt.windows.ThemeReader;
49 
50 /**
51  * Implements Windows Parts and their States and Properties for the Windows Look and Feel.
52  *
53  * See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/userex/topics/partsandstates.asp
54  * See tmschema.h (or vssym32.h & vsstyle.h for MS Vista)
55  *
56  * @author Leif Samuelsson
57  */
58 class TMSchema {
59 
60     /**
61      * An enumeration of the various Windows controls (also known as
62      * components, or top-level parts)
63      */
64     public static enum Control {
65         BUTTON,
66         COMBOBOX,
67         EDIT,
68         HEADER,
69         LISTBOX,
70         LISTVIEW,
71         MENU,
72         PROGRESS,
73         REBAR,
74         SCROLLBAR,
75         SPIN,
76         TAB,
77         TOOLBAR,
78         TRACKBAR,
79         TREEVIEW,
80         WINDOW
81     }
82 
83 
84     /**
85      * An enumeration of the Windows compoent parts
86      */
87     public static enum Part {
88         MENU (Control.MENU, 0), // Special case, not in native
89         MP_BARBACKGROUND   (Control.MENU, 7),
90         MP_BARITEM         (Control.MENU, 8),
91         MP_POPUPBACKGROUND (Control.MENU, 9),
92         MP_POPUPBORDERS    (Control.MENU, 10),
93         MP_POPUPCHECK      (Control.MENU, 11),
94         MP_POPUPCHECKBACKGROUND (Control.MENU, 12),
95         MP_POPUPGUTTER     (Control.MENU, 13),
96         MP_POPUPITEM       (Control.MENU, 14),
97         MP_POPUPSEPARATOR  (Control.MENU, 15),
98         MP_POPUPSUBMENU    (Control.MENU, 16),
99 
100         BP_PUSHBUTTON (Control.BUTTON, 1),
101         BP_RADIOBUTTON(Control.BUTTON, 2),
102         BP_CHECKBOX   (Control.BUTTON, 3),
103         BP_GROUPBOX   (Control.BUTTON, 4),
104 
105         CP_COMBOBOX      (Control.COMBOBOX, 0),
106         CP_DROPDOWNBUTTON(Control.COMBOBOX, 1),
107         CP_BACKGROUND    (Control.COMBOBOX, 2),
108         CP_TRANSPARENTBACKGROUND (Control.COMBOBOX, 3),
109         CP_BORDER                (Control.COMBOBOX, 4),
110         CP_READONLY              (Control.COMBOBOX, 5),
111         CP_DROPDOWNBUTTONRIGHT   (Control.COMBOBOX, 6),
112         CP_DROPDOWNBUTTONLEFT    (Control.COMBOBOX, 7),
113         CP_CUEBANNER             (Control.COMBOBOX, 8),
114 
115 
116         EP_EDIT    (Control.EDIT, 0),
117         EP_EDITTEXT(Control.EDIT, 1),
118 
119         HP_HEADERITEM(Control.HEADER,      1),
120         HP_HEADERSORTARROW(Control.HEADER, 4),
121 
122         LBP_LISTBOX(Control.LISTBOX, 0),
123 
124         LBCP_BORDER_HSCROLL  (Control.LISTBOX, 1),
125         LBCP_BORDER_HVSCROLL (Control.LISTBOX, 2),
126         LBCP_BORDER_NOSCROLL (Control.LISTBOX, 3),
127         LBCP_BORDER_VSCROLL  (Control.LISTBOX, 4),
128         LBCP_ITEM            (Control.LISTBOX, 5),
129 
130         LVP_LISTVIEW(Control.LISTVIEW, 0),
131 
132         PP_PROGRESS (Control.PROGRESS, 0),
133         PP_BAR      (Control.PROGRESS, 1),
134         PP_BARVERT  (Control.PROGRESS, 2),
135         PP_CHUNK    (Control.PROGRESS, 3),
136         PP_CHUNKVERT(Control.PROGRESS, 4),
137 
138         RP_GRIPPER    (Control.REBAR, 1),
139         RP_GRIPPERVERT(Control.REBAR, 2),
140 
141         SBP_SCROLLBAR     (Control.SCROLLBAR,  0),
142         SBP_ARROWBTN      (Control.SCROLLBAR,  1),
143         SBP_THUMBBTNHORZ  (Control.SCROLLBAR,  2),
144         SBP_THUMBBTNVERT  (Control.SCROLLBAR,  3),
145         SBP_LOWERTRACKHORZ(Control.SCROLLBAR,  4),
146         SBP_UPPERTRACKHORZ(Control.SCROLLBAR,  5),
147         SBP_LOWERTRACKVERT(Control.SCROLLBAR,  6),
148         SBP_UPPERTRACKVERT(Control.SCROLLBAR,  7),
149         SBP_GRIPPERHORZ   (Control.SCROLLBAR,  8),
150         SBP_GRIPPERVERT   (Control.SCROLLBAR,  9),
151         SBP_SIZEBOX       (Control.SCROLLBAR, 10),
152 
153         SPNP_UP  (Control.SPIN, 1),
154         SPNP_DOWN(Control.SPIN, 2),
155 
156         TABP_TABITEM         (Control.TAB, 1),
157         TABP_TABITEMLEFTEDGE (Control.TAB, 2),
158         TABP_TABITEMRIGHTEDGE(Control.TAB, 3),
159         TABP_PANE            (Control.TAB, 9),
160 
161         TP_TOOLBAR        (Control.TOOLBAR, 0),
162         TP_BUTTON         (Control.TOOLBAR, 1),
163         TP_SEPARATOR      (Control.TOOLBAR, 5),
164         TP_SEPARATORVERT  (Control.TOOLBAR, 6),
165 
166         TKP_TRACK      (Control.TRACKBAR,  1),
167         TKP_TRACKVERT  (Control.TRACKBAR,  2),
168         TKP_THUMB      (Control.TRACKBAR,  3),
169         TKP_THUMBBOTTOM(Control.TRACKBAR,  4),
170         TKP_THUMBTOP   (Control.TRACKBAR,  5),
171         TKP_THUMBVERT  (Control.TRACKBAR,  6),
172         TKP_THUMBLEFT  (Control.TRACKBAR,  7),
173         TKP_THUMBRIGHT (Control.TRACKBAR,  8),
174         TKP_TICS       (Control.TRACKBAR,  9),
175         TKP_TICSVERT   (Control.TRACKBAR, 10),
176 
177         TVP_TREEVIEW(Control.TREEVIEW, 0),
178         TVP_GLYPH   (Control.TREEVIEW, 2),
179 
180         WP_WINDOW          (Control.WINDOW,  0),
181         WP_CAPTION         (Control.WINDOW,  1),
182         WP_MINCAPTION      (Control.WINDOW,  3),
183         WP_MAXCAPTION      (Control.WINDOW,  5),
184         WP_FRAMELEFT       (Control.WINDOW,  7),
185         WP_FRAMERIGHT      (Control.WINDOW,  8),
186         WP_FRAMEBOTTOM     (Control.WINDOW,  9),
187         WP_SYSBUTTON       (Control.WINDOW, 13),
188         WP_MDISYSBUTTON    (Control.WINDOW, 14),
189         WP_MINBUTTON       (Control.WINDOW, 15),
190         WP_MDIMINBUTTON    (Control.WINDOW, 16),
191         WP_MAXBUTTON       (Control.WINDOW, 17),
192         WP_CLOSEBUTTON     (Control.WINDOW, 18),
193         WP_MDICLOSEBUTTON  (Control.WINDOW, 20),
194         WP_RESTOREBUTTON   (Control.WINDOW, 21),
195         WP_MDIRESTOREBUTTON(Control.WINDOW, 22);
196 
197         private final Control control;
198         private final int value;
199 
Part(Control control, int value)200         private Part(Control control, int value) {
201             this.control = control;
202             this.value = value;
203         }
204 
getValue()205         public int getValue() {
206             return value;
207         }
208 
getControlName(Component component)209         public String getControlName(Component component) {
210             String str = "";
211             if (component instanceof JComponent) {
212                 JComponent c = (JComponent)component;
213                 String subAppName = (String)c.getClientProperty("XPStyle.subAppName");
214                 if (subAppName != null) {
215                     str = subAppName + "::";
216                 }
217             }
218             return str + control.toString();
219         }
220 
toString()221         public String toString() {
222             return control.toString()+"."+name();
223         }
224     }
225 
226 
227     /**
228      * An enumeration of the possible component states
229      */
230     public static enum State {
231         ACTIVE,
232         ASSIST,
233         BITMAP,
234         CHECKED,
235         CHECKEDDISABLED,
236         CHECKEDHOT,
237         CHECKEDNORMAL,
238         CHECKEDPRESSED,
239         CHECKMARKNORMAL,
240         CHECKMARKDISABLED,
241         BULLETNORMAL,
242         BULLETDISABLED,
243         CLOSED,
244         DEFAULTED,
245         DISABLED,
246         DISABLEDHOT,
247         DISABLEDPUSHED,
248         DOWNDISABLED,
249         DOWNHOT,
250         DOWNNORMAL,
251         DOWNPRESSED,
252         FOCUSED,
253         HOT,
254         HOTCHECKED,
255         ICONHOT,
256         ICONNORMAL,
257         ICONPRESSED,
258         ICONSORTEDHOT,
259         ICONSORTEDNORMAL,
260         ICONSORTEDPRESSED,
261         INACTIVE,
262         INACTIVENORMAL,         // See note 1
263         INACTIVEHOT,            // See note 1
264         INACTIVEPUSHED,         // See note 1
265         INACTIVEDISABLED,       // See note 1
266         LEFTDISABLED,
267         LEFTHOT,
268         LEFTNORMAL,
269         LEFTPRESSED,
270         MIXEDDISABLED,
271         MIXEDHOT,
272         MIXEDNORMAL,
273         MIXEDPRESSED,
274         NORMAL,
275         PRESSED,
276         OPENED,
277         PUSHED,
278         READONLY,
279         RIGHTDISABLED,
280         RIGHTHOT,
281         RIGHTNORMAL,
282         RIGHTPRESSED,
283         SELECTED,
284         UNCHECKEDDISABLED,
285         UNCHECKEDHOT,
286         UNCHECKEDNORMAL,
287         UNCHECKEDPRESSED,
288         UPDISABLED,
289         UPHOT,
290         UPNORMAL,
291         UPPRESSED,
292         HOVER,
293         UPHOVER,
294         DOWNHOVER,
295         LEFTHOVER,
296         RIGHTHOVER,
297         SORTEDDOWN,
298         SORTEDHOT,
299         SORTEDNORMAL,
300         SORTEDPRESSED,
301         SORTEDUP;
302 
303 
304         /**
305          * A map of allowed states for each Part
306          */
307         private static EnumMap<Part, State[]> stateMap;
308 
initStates()309         private static synchronized void initStates() {
310             stateMap = new EnumMap<Part, State[]>(Part.class);
311 
312             stateMap.put(Part.EP_EDITTEXT,
313                        new State[] {
314                         NORMAL, HOT, SELECTED, DISABLED, FOCUSED, READONLY, ASSIST
315             });
316 
317             stateMap.put(Part.BP_PUSHBUTTON,
318                        new State[] { NORMAL, HOT, PRESSED, DISABLED, DEFAULTED });
319 
320             stateMap.put(Part.BP_RADIOBUTTON,
321                        new State[] {
322                         UNCHECKEDNORMAL, UNCHECKEDHOT, UNCHECKEDPRESSED, UNCHECKEDDISABLED,
323                         CHECKEDNORMAL,   CHECKEDHOT,   CHECKEDPRESSED,   CHECKEDDISABLED
324             });
325 
326             stateMap.put(Part.BP_CHECKBOX,
327                        new State[] {
328                         UNCHECKEDNORMAL, UNCHECKEDHOT, UNCHECKEDPRESSED, UNCHECKEDDISABLED,
329                         CHECKEDNORMAL,   CHECKEDHOT,   CHECKEDPRESSED,   CHECKEDDISABLED,
330                         MIXEDNORMAL,     MIXEDHOT,     MIXEDPRESSED,     MIXEDDISABLED
331             });
332 
333             State[] comboBoxStates = new State[] { NORMAL, HOT, PRESSED, DISABLED };
334             stateMap.put(Part.CP_COMBOBOX, comboBoxStates);
335             stateMap.put(Part.CP_DROPDOWNBUTTON, comboBoxStates);
336             stateMap.put(Part.CP_BACKGROUND, comboBoxStates);
337             stateMap.put(Part.CP_TRANSPARENTBACKGROUND, comboBoxStates);
338             stateMap.put(Part.CP_BORDER, comboBoxStates);
339             stateMap.put(Part.CP_READONLY, comboBoxStates);
340             stateMap.put(Part.CP_DROPDOWNBUTTONRIGHT, comboBoxStates);
341             stateMap.put(Part.CP_DROPDOWNBUTTONLEFT, comboBoxStates);
342             stateMap.put(Part.CP_CUEBANNER, comboBoxStates);
343 
344             stateMap.put(Part.HP_HEADERITEM, new State[] { NORMAL, HOT, PRESSED,
345                           SORTEDNORMAL, SORTEDHOT, SORTEDPRESSED,
346                           ICONNORMAL, ICONHOT, ICONPRESSED,
347                           ICONSORTEDNORMAL, ICONSORTEDHOT, ICONSORTEDPRESSED });
348 
349             stateMap.put(Part.HP_HEADERSORTARROW,
350                          new State[] {SORTEDDOWN, SORTEDUP});
351 
352             State[] listBoxStates = new State[] { NORMAL, PRESSED, HOT, DISABLED};
353             stateMap.put(Part.LBCP_BORDER_HSCROLL, listBoxStates);
354             stateMap.put(Part.LBCP_BORDER_HVSCROLL, listBoxStates);
355             stateMap.put(Part.LBCP_BORDER_NOSCROLL, listBoxStates);
356             stateMap.put(Part.LBCP_BORDER_VSCROLL, listBoxStates);
357 
358             State[] scrollBarStates = new State[] { NORMAL, HOT, PRESSED, DISABLED, HOVER };
359             stateMap.put(Part.SBP_SCROLLBAR,    scrollBarStates);
360             stateMap.put(Part.SBP_THUMBBTNVERT, scrollBarStates);
361             stateMap.put(Part.SBP_THUMBBTNHORZ, scrollBarStates);
362             stateMap.put(Part.SBP_GRIPPERVERT,  scrollBarStates);
363             stateMap.put(Part.SBP_GRIPPERHORZ,  scrollBarStates);
364 
365             stateMap.put(Part.SBP_ARROWBTN,
366                        new State[] {
367                 UPNORMAL,    UPHOT,     UPPRESSED,    UPDISABLED,
368                 DOWNNORMAL,  DOWNHOT,   DOWNPRESSED,  DOWNDISABLED,
369                 LEFTNORMAL,  LEFTHOT,   LEFTPRESSED,  LEFTDISABLED,
370                 RIGHTNORMAL, RIGHTHOT,  RIGHTPRESSED, RIGHTDISABLED,
371                 UPHOVER,     DOWNHOVER, LEFTHOVER,    RIGHTHOVER
372             });
373 
374 
375             State[] spinnerStates = new State[] { NORMAL, HOT, PRESSED, DISABLED };
376             stateMap.put(Part.SPNP_UP,   spinnerStates);
377             stateMap.put(Part.SPNP_DOWN, spinnerStates);
378 
379             stateMap.put(Part.TVP_GLYPH, new State[] { CLOSED, OPENED });
380 
381             State[] frameButtonStates = new State[] {
382                         NORMAL,         HOT,         PUSHED,         DISABLED,  // See note 1
383                         INACTIVENORMAL, INACTIVEHOT, INACTIVEPUSHED, INACTIVEDISABLED,
384             };
385             // Note 1: The INACTIVE frame button states apply when the frame
386             //         is inactive. They are not defined in tmschema.h
387 
388             // Fix for 6316538: Vista has five frame button states
389             if (ThemeReader.getInt(Control.WINDOW.toString(),
390                                    Part.WP_CLOSEBUTTON.getValue(), 1,
391                                    Prop.IMAGECOUNT.getValue()) == 10) {
392                 frameButtonStates = new State[] {
393                         NORMAL,         HOT,         PUSHED,         DISABLED,         null,
394                         INACTIVENORMAL, INACTIVEHOT, INACTIVEPUSHED, INACTIVEDISABLED, null
395                 };
396             }
397 
398             stateMap.put(Part.WP_MINBUTTON,     frameButtonStates);
399             stateMap.put(Part.WP_MAXBUTTON,     frameButtonStates);
400             stateMap.put(Part.WP_RESTOREBUTTON, frameButtonStates);
401             stateMap.put(Part.WP_CLOSEBUTTON,   frameButtonStates);
402 
403             // States for Slider (trackbar)
404             stateMap.put(Part.TKP_TRACK,     new State[] { NORMAL });
405             stateMap.put(Part.TKP_TRACKVERT, new State[] { NORMAL });
406 
407             State[] sliderThumbStates =
408                 new State[] { NORMAL, HOT, PRESSED, FOCUSED, DISABLED };
409             stateMap.put(Part.TKP_THUMB,       sliderThumbStates);
410             stateMap.put(Part.TKP_THUMBBOTTOM, sliderThumbStates);
411             stateMap.put(Part.TKP_THUMBTOP,    sliderThumbStates);
412             stateMap.put(Part.TKP_THUMBVERT,   sliderThumbStates);
413             stateMap.put(Part.TKP_THUMBRIGHT,  sliderThumbStates);
414 
415             // States for Tabs
416             State[] tabStates = new State[] { NORMAL, HOT, SELECTED, DISABLED, FOCUSED };
417             stateMap.put(Part.TABP_TABITEM,          tabStates);
418             stateMap.put(Part.TABP_TABITEMLEFTEDGE,  tabStates);
419             stateMap.put(Part.TABP_TABITEMRIGHTEDGE, tabStates);
420 
421 
422             stateMap.put(Part.TP_BUTTON,
423                        new State[] {
424                         NORMAL, HOT, PRESSED, DISABLED, CHECKED, HOTCHECKED
425             });
426 
427             State[] frameStates = new State[] { ACTIVE, INACTIVE };
428             stateMap.put(Part.WP_WINDOW,      frameStates);
429             stateMap.put(Part.WP_FRAMELEFT,   frameStates);
430             stateMap.put(Part.WP_FRAMERIGHT,  frameStates);
431             stateMap.put(Part.WP_FRAMEBOTTOM, frameStates);
432 
433             State[] captionStates = new State[] { ACTIVE, INACTIVE, DISABLED };
434             stateMap.put(Part.WP_CAPTION,    captionStates);
435             stateMap.put(Part.WP_MINCAPTION, captionStates);
436             stateMap.put(Part.WP_MAXCAPTION, captionStates);
437 
438             stateMap.put(Part.MP_BARBACKGROUND,
439                          new State[] { ACTIVE, INACTIVE });
440             stateMap.put(Part.MP_BARITEM,
441                          new State[] { NORMAL, HOT, PUSHED,
442                                        DISABLED, DISABLEDHOT, DISABLEDPUSHED });
443             stateMap.put(Part.MP_POPUPCHECK,
444                          new State[] { CHECKMARKNORMAL, CHECKMARKDISABLED,
445                                        BULLETNORMAL, BULLETDISABLED });
446             stateMap.put(Part.MP_POPUPCHECKBACKGROUND,
447                          new State[] { DISABLEDPUSHED, NORMAL, BITMAP });
448             stateMap.put(Part.MP_POPUPITEM,
449                          new State[] { NORMAL, HOT, DISABLED, DISABLEDHOT });
450             stateMap.put(Part.MP_POPUPSUBMENU,
451                          new State[] { NORMAL, DISABLED });
452 
453         }
454 
455 
getValue(Part part, State state)456         public static synchronized int getValue(Part part, State state) {
457             if (stateMap == null) {
458                 initStates();
459             }
460 
461             Enum<?>[] states = stateMap.get(part);
462             if (states != null) {
463                 for (int i = 0; i < states.length; i++) {
464                     if (state == states[i]) {
465                         return i + 1;
466                     }
467                 }
468             }
469 
470             if (state == null || state == State.NORMAL) {
471                 return 1;
472             }
473 
474             return 0;
475         }
476 
477     }
478 
479 
480     /**
481      * An enumeration of the possible component attributes and the
482      * corresponding value type
483      */
484     public static enum Prop {
485         COLOR(Color.class,                204),
486         SIZE(Dimension.class,             207),
487 
488         FLATMENUS(Boolean.class,         1001),
489 
490         BORDERONLY(Boolean.class,        2203), // only draw the border area of the image
491 
492         IMAGECOUNT(Integer.class,        2401), // the number of state images in an imagefile
493         BORDERSIZE(Integer.class,        2403), // the size of the border line for bgtype=BorderFill
494 
495         PROGRESSCHUNKSIZE(Integer.class, 2411), // size of progress control chunks
496         PROGRESSSPACESIZE(Integer.class, 2412), // size of progress control spaces
497 
498         TEXTSHADOWOFFSET(Point.class,    3402), // where char shadows are drawn, relative to orig. chars
499 
500         NORMALSIZE(Dimension.class,      3409), // size of dest rect that exactly source
501 
502 
503         SIZINGMARGINS ( Insets.class,    3601), // margins used for 9-grid sizing
504         CONTENTMARGINS(Insets.class,     3602), // margins that define where content can be placed
505         CAPTIONMARGINS(Insets.class,     3603), // margins that define where caption text can be placed
506 
507         BORDERCOLOR(Color.class,         3801), // color of borders for BorderFill
508         FILLCOLOR  (  Color.class,       3802), // color of bg fill
509         TEXTCOLOR  (  Color.class,       3803), // color text is drawn in
510 
511         TEXTSHADOWCOLOR(Color.class,     3818), // color of text shadow
512 
513         BGTYPE(Integer.class,            4001), // basic drawing type for each part
514 
515         TEXTSHADOWTYPE(Integer.class,    4010), // type of shadow to draw with text
516 
517         TRANSITIONDURATIONS(Integer.class, 6000);
518 
519         private final Class<?> type;
520         private final int value;
521 
Prop(Class<?> type, int value)522         private Prop(Class<?> type, int value) {
523             this.type     = type;
524             this.value    = value;
525         }
526 
getValue()527         public int getValue() {
528             return value;
529         }
530 
toString()531         public String toString() {
532             return name()+"["+type.getName()+"] = "+value;
533         }
534     }
535 
536 
537     /**
538      * An enumeration of attribute values for some Props
539      */
540     public static enum TypeEnum {
541         BT_IMAGEFILE (Prop.BGTYPE, "imagefile",  0),
542         BT_BORDERFILL(Prop.BGTYPE, "borderfill", 1),
543 
544         TST_NONE(Prop.TEXTSHADOWTYPE, "none", 0),
545         TST_SINGLE(Prop.TEXTSHADOWTYPE, "single", 1),
546         TST_CONTINUOUS(Prop.TEXTSHADOWTYPE, "continuous", 2);
547 
548 
TypeEnum(Prop prop, String enumName, int value)549         private TypeEnum(Prop prop, String enumName, int value) {
550             this.prop = prop;
551             this.enumName = enumName;
552             this.value = value;
553         }
554 
555         private final Prop prop;
556         private final String enumName;
557         private final int value;
558 
toString()559         public String toString() {
560             return prop+"="+enumName+"="+value;
561         }
562 
getName()563         String getName() {
564             return enumName;
565         }
566 
567 
getTypeEnum(Prop prop, int enumval)568         static TypeEnum getTypeEnum(Prop prop, int enumval) {
569             for (TypeEnum e : TypeEnum.values()) {
570                 if (e.prop == prop && e.value == enumval) {
571                     return e;
572                 }
573             }
574             return null;
575         }
576     }
577 }
578