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
41package com.sun.java.swing.plaf.windows;
42
43import java.awt.*;
44import java.util.*;
45
46import javax.swing.*;
47
48import 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 */
58class 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
200        private Part(Control control, int value) {
201            this.control = control;
202            this.value = value;
203        }
204
205        public int getValue() {
206            return value;
207        }
208
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
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
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
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
522        private Prop(Class<?> type, int value) {
523            this.type     = type;
524            this.value    = value;
525        }
526
527        public int getValue() {
528            return value;
529        }
530
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
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
559        public String toString() {
560            return prop+"="+enumName+"="+value;
561        }
562
563        String getName() {
564            return enumName;
565        }
566
567
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