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