jdk/src/share/classes/javax/swing/plaf/synth/SynthStyle.java
changeset 2 90ce3da70b43
child 1290 da8902cd496c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyle.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,1033 @@
+/*
+ * Copyright 2002-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package javax.swing.plaf.synth;
+
+import java.awt.*;
+import javax.swing.*;
+import javax.swing.border.Border;
+import javax.swing.plaf.UIResource;
+import javax.swing.plaf.basic.BasicLookAndFeel;
+import javax.swing.text.DefaultEditorKit;
+import java.util.HashMap;
+import java.util.Map;
+import sun.swing.plaf.synth.SynthUI;
+
+/**
+ * <code>SynthStyle</code> is a set of style properties.
+ * Each <code>SynthUI</code> references at least one
+ * <code>SynthStyle</code> that is obtained using a
+ * <code>SynthStyleFactory</code>. You typically don't need to interact with
+ * this class directly, rather you will load a
+ * <a href="doc-files/synthFileFormat.html">Synth File Format file</a> into
+ * <code>SynthLookAndFeel</code> that will create a set of SynthStyles.
+ *
+ * @see SynthLookAndFeel
+ * @see SynthStyleFactory
+ *
+ * @since 1.5
+ * @author Scott Violet
+ */
+public abstract class SynthStyle {
+    /**
+     * Contains the default values for certain properties.
+     */
+    private static Map DEFAULT_VALUES;
+
+    /**
+     * Shared SynthGraphics.
+     */
+    private static final SynthGraphicsUtils SYNTH_GRAPHICS =
+                              new SynthGraphicsUtils();
+
+    /**
+     * Adds the default values that we know about to DEFAULT_VALUES.
+     */
+    private static void populateDefaultValues() {
+        Object buttonMap = new UIDefaults.LazyInputMap(new Object[] {
+                          "SPACE", "pressed",
+                 "released SPACE", "released"
+        });
+        DEFAULT_VALUES.put("Button.focusInputMap", buttonMap);
+        DEFAULT_VALUES.put("CheckBox.focusInputMap", buttonMap);
+        DEFAULT_VALUES.put("RadioButton.focusInputMap", buttonMap);
+        DEFAULT_VALUES.put("ToggleButton.focusInputMap", buttonMap);
+        DEFAULT_VALUES.put("SynthArrowButton.focusInputMap", buttonMap);
+        DEFAULT_VALUES.put("List.dropLineColor", Color.BLACK);
+        DEFAULT_VALUES.put("Tree.dropLineColor", Color.BLACK);
+        DEFAULT_VALUES.put("Table.dropLineColor", Color.BLACK);
+        DEFAULT_VALUES.put("Table.dropLineShortColor", Color.RED);
+
+        Object multilineInputMap = new UIDefaults.LazyInputMap(new Object[] {
+                           "ctrl C", DefaultEditorKit.copyAction,
+                           "ctrl V", DefaultEditorKit.pasteAction,
+                           "ctrl X", DefaultEditorKit.cutAction,
+                             "COPY", DefaultEditorKit.copyAction,
+                            "PASTE", DefaultEditorKit.pasteAction,
+                              "CUT", DefaultEditorKit.cutAction,
+                   "control INSERT", DefaultEditorKit.copyAction,
+                     "shift INSERT", DefaultEditorKit.pasteAction,
+                     "shift DELETE", DefaultEditorKit.cutAction,
+                       "shift LEFT", DefaultEditorKit.selectionBackwardAction,
+                    "shift KP_LEFT", DefaultEditorKit.selectionBackwardAction,
+                      "shift RIGHT", DefaultEditorKit.selectionForwardAction,
+                   "shift KP_RIGHT", DefaultEditorKit.selectionForwardAction,
+                        "ctrl LEFT", DefaultEditorKit.previousWordAction,
+                     "ctrl KP_LEFT", DefaultEditorKit.previousWordAction,
+                       "ctrl RIGHT", DefaultEditorKit.nextWordAction,
+                    "ctrl KP_RIGHT", DefaultEditorKit.nextWordAction,
+                  "ctrl shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
+               "ctrl shift KP_LEFT", DefaultEditorKit.selectionPreviousWordAction,
+                 "ctrl shift RIGHT", DefaultEditorKit.selectionNextWordAction,
+              "ctrl shift KP_RIGHT", DefaultEditorKit.selectionNextWordAction,
+                           "ctrl A", DefaultEditorKit.selectAllAction,
+                             "HOME", DefaultEditorKit.beginLineAction,
+                              "END", DefaultEditorKit.endLineAction,
+                       "shift HOME", DefaultEditorKit.selectionBeginLineAction,
+                        "shift END", DefaultEditorKit.selectionEndLineAction,
+
+                               "UP", DefaultEditorKit.upAction,
+                            "KP_UP", DefaultEditorKit.upAction,
+                             "DOWN", DefaultEditorKit.downAction,
+                          "KP_DOWN", DefaultEditorKit.downAction,
+                          "PAGE_UP", DefaultEditorKit.pageUpAction,
+                        "PAGE_DOWN", DefaultEditorKit.pageDownAction,
+                    "shift PAGE_UP", "selection-page-up",
+                  "shift PAGE_DOWN", "selection-page-down",
+               "ctrl shift PAGE_UP", "selection-page-left",
+             "ctrl shift PAGE_DOWN", "selection-page-right",
+                         "shift UP", DefaultEditorKit.selectionUpAction,
+                      "shift KP_UP", DefaultEditorKit.selectionUpAction,
+                       "shift DOWN", DefaultEditorKit.selectionDownAction,
+                    "shift KP_DOWN", DefaultEditorKit.selectionDownAction,
+                            "ENTER", DefaultEditorKit.insertBreakAction,
+                       "BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
+                 "shift BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
+                           "ctrl H", DefaultEditorKit.deletePrevCharAction,
+                           "DELETE", DefaultEditorKit.deleteNextCharAction,
+                      "ctrl DELETE", DefaultEditorKit.deleteNextWordAction,
+                  "ctrl BACK_SPACE", DefaultEditorKit.deletePrevWordAction,
+                            "RIGHT", DefaultEditorKit.forwardAction,
+                             "LEFT", DefaultEditorKit.backwardAction,
+                         "KP_RIGHT", DefaultEditorKit.forwardAction,
+                          "KP_LEFT", DefaultEditorKit.backwardAction,
+                              "TAB", DefaultEditorKit.insertTabAction,
+                  "ctrl BACK_SLASH", "unselect"/*DefaultEditorKit.unselectAction*/,
+                        "ctrl HOME", DefaultEditorKit.beginAction,
+                         "ctrl END", DefaultEditorKit.endAction,
+                  "ctrl shift HOME", DefaultEditorKit.selectionBeginAction,
+                   "ctrl shift END", DefaultEditorKit.selectionEndAction,
+                           "ctrl T", "next-link-action",
+                     "ctrl shift T", "previous-link-action",
+                       "ctrl SPACE", "activate-link-action",
+                   "control shift O", "toggle-componentOrientation"/*DefaultEditorKit.toggleComponentOrientation*/
+        });
+        DEFAULT_VALUES.put("EditorPane.focusInputMap", multilineInputMap);
+        DEFAULT_VALUES.put("TextArea.focusInputMap", multilineInputMap);
+        DEFAULT_VALUES.put("TextPane.focusInputMap", multilineInputMap);
+
+        Object fieldInputMap = new UIDefaults.LazyInputMap(new Object[] {
+                           "ctrl C", DefaultEditorKit.copyAction,
+                           "ctrl V", DefaultEditorKit.pasteAction,
+                           "ctrl X", DefaultEditorKit.cutAction,
+                             "COPY", DefaultEditorKit.copyAction,
+                            "PASTE", DefaultEditorKit.pasteAction,
+                              "CUT", DefaultEditorKit.cutAction,
+                   "control INSERT", DefaultEditorKit.copyAction,
+                     "shift INSERT", DefaultEditorKit.pasteAction,
+                     "shift DELETE", DefaultEditorKit.cutAction,
+                       "shift LEFT", DefaultEditorKit.selectionBackwardAction,
+                    "shift KP_LEFT", DefaultEditorKit.selectionBackwardAction,
+                      "shift RIGHT", DefaultEditorKit.selectionForwardAction,
+                   "shift KP_RIGHT", DefaultEditorKit.selectionForwardAction,
+                        "ctrl LEFT", DefaultEditorKit.previousWordAction,
+                     "ctrl KP_LEFT", DefaultEditorKit.previousWordAction,
+                       "ctrl RIGHT", DefaultEditorKit.nextWordAction,
+                    "ctrl KP_RIGHT", DefaultEditorKit.nextWordAction,
+                  "ctrl shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
+               "ctrl shift KP_LEFT", DefaultEditorKit.selectionPreviousWordAction,
+                 "ctrl shift RIGHT", DefaultEditorKit.selectionNextWordAction,
+              "ctrl shift KP_RIGHT", DefaultEditorKit.selectionNextWordAction,
+                           "ctrl A", DefaultEditorKit.selectAllAction,
+                             "HOME", DefaultEditorKit.beginLineAction,
+                              "END", DefaultEditorKit.endLineAction,
+                       "shift HOME", DefaultEditorKit.selectionBeginLineAction,
+                        "shift END", DefaultEditorKit.selectionEndLineAction,
+                       "BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
+                 "shift BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
+                           "ctrl H", DefaultEditorKit.deletePrevCharAction,
+                           "DELETE", DefaultEditorKit.deleteNextCharAction,
+                      "ctrl DELETE", DefaultEditorKit.deleteNextWordAction,
+                  "ctrl BACK_SPACE", DefaultEditorKit.deletePrevWordAction,
+                            "RIGHT", DefaultEditorKit.forwardAction,
+                             "LEFT", DefaultEditorKit.backwardAction,
+                         "KP_RIGHT", DefaultEditorKit.forwardAction,
+                          "KP_LEFT", DefaultEditorKit.backwardAction,
+                            "ENTER", JTextField.notifyAction,
+                  "ctrl BACK_SLASH", "unselect"/*DefaultEditorKit.unselectAction*/,
+                   "control shift O", "toggle-componentOrientation"/*DefaultEditorKit.toggleComponentOrientation*/
+        });
+        DEFAULT_VALUES.put("TextField.focusInputMap", fieldInputMap);
+        DEFAULT_VALUES.put("PasswordField.focusInputMap", fieldInputMap);
+
+
+        DEFAULT_VALUES.put("ComboBox.ancestorInputMap",
+                  new UIDefaults.LazyInputMap(new Object[] {
+                     "ESCAPE", "hidePopup",
+                    "PAGE_UP", "pageUpPassThrough",
+                  "PAGE_DOWN", "pageDownPassThrough",
+                       "HOME", "homePassThrough",
+                        "END", "endPassThrough",
+                       "DOWN", "selectNext",
+                    "KP_DOWN", "selectNext",
+                   "alt DOWN", "togglePopup",
+                "alt KP_DOWN", "togglePopup",
+                     "alt UP", "togglePopup",
+                  "alt KP_UP", "togglePopup",
+                      "SPACE", "spacePopup",
+                     "ENTER", "enterPressed",
+                         "UP", "selectPrevious",
+                      "KP_UP", "selectPrevious"
+                  }));
+
+        DEFAULT_VALUES.put("Desktop.ancestorInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                 "ctrl F5", "restore",
+                 "ctrl F4", "close",
+                 "ctrl F7", "move",
+                 "ctrl F8", "resize",
+                   "RIGHT", "right",
+                "KP_RIGHT", "right",
+             "shift RIGHT", "shrinkRight",
+          "shift KP_RIGHT", "shrinkRight",
+                    "LEFT", "left",
+                 "KP_LEFT", "left",
+              "shift LEFT", "shrinkLeft",
+           "shift KP_LEFT", "shrinkLeft",
+                      "UP", "up",
+                   "KP_UP", "up",
+                "shift UP", "shrinkUp",
+             "shift KP_UP", "shrinkUp",
+                    "DOWN", "down",
+                 "KP_DOWN", "down",
+              "shift DOWN", "shrinkDown",
+           "shift KP_DOWN", "shrinkDown",
+                  "ESCAPE", "escape",
+                 "ctrl F9", "minimize",
+                "ctrl F10", "maximize",
+                 "ctrl F6", "selectNextFrame",
+                "ctrl TAB", "selectNextFrame",
+             "ctrl alt F6", "selectNextFrame",
+       "shift ctrl alt F6", "selectPreviousFrame",
+                "ctrl F12", "navigateNext",
+           "shift ctrl F12", "navigatePrevious"
+               }));
+
+        DEFAULT_VALUES.put("FileChooser.ancestorInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                     "ESCAPE", "cancelSelection",
+                     "F2", "editFileName",
+                     "F5", "refresh",
+                     "BACK_SPACE", "Go Up",
+                     "ENTER", "approveSelection",
+                "ctrl ENTER", "approveSelection"
+               }));
+
+        DEFAULT_VALUES.put("FormattedTextField.focusInputMap",
+              new UIDefaults.LazyInputMap(new Object[] {
+                           "ctrl C", DefaultEditorKit.copyAction,
+                           "ctrl V", DefaultEditorKit.pasteAction,
+                           "ctrl X", DefaultEditorKit.cutAction,
+                             "COPY", DefaultEditorKit.copyAction,
+                            "PASTE", DefaultEditorKit.pasteAction,
+                              "CUT", DefaultEditorKit.cutAction,
+                   "control INSERT", DefaultEditorKit.copyAction,
+                     "shift INSERT", DefaultEditorKit.pasteAction,
+                     "shift DELETE", DefaultEditorKit.cutAction,
+                       "shift LEFT", DefaultEditorKit.selectionBackwardAction,
+                    "shift KP_LEFT", DefaultEditorKit.selectionBackwardAction,
+                      "shift RIGHT", DefaultEditorKit.selectionForwardAction,
+                   "shift KP_RIGHT", DefaultEditorKit.selectionForwardAction,
+                        "ctrl LEFT", DefaultEditorKit.previousWordAction,
+                     "ctrl KP_LEFT", DefaultEditorKit.previousWordAction,
+                       "ctrl RIGHT", DefaultEditorKit.nextWordAction,
+                    "ctrl KP_RIGHT", DefaultEditorKit.nextWordAction,
+                  "ctrl shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
+               "ctrl shift KP_LEFT", DefaultEditorKit.selectionPreviousWordAction,
+                 "ctrl shift RIGHT", DefaultEditorKit.selectionNextWordAction,
+              "ctrl shift KP_RIGHT", DefaultEditorKit.selectionNextWordAction,
+                           "ctrl A", DefaultEditorKit.selectAllAction,
+                             "HOME", DefaultEditorKit.beginLineAction,
+                              "END", DefaultEditorKit.endLineAction,
+                       "shift HOME", DefaultEditorKit.selectionBeginLineAction,
+                        "shift END", DefaultEditorKit.selectionEndLineAction,
+                       "BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
+                 "shift BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
+                           "ctrl H", DefaultEditorKit.deletePrevCharAction,
+                           "DELETE", DefaultEditorKit.deleteNextCharAction,
+                      "ctrl DELETE", DefaultEditorKit.deleteNextWordAction,
+                  "ctrl BACK_SPACE", DefaultEditorKit.deletePrevWordAction,
+                            "RIGHT", DefaultEditorKit.forwardAction,
+                             "LEFT", DefaultEditorKit.backwardAction,
+                         "KP_RIGHT", DefaultEditorKit.forwardAction,
+                          "KP_LEFT", DefaultEditorKit.backwardAction,
+                            "ENTER", JTextField.notifyAction,
+                  "ctrl BACK_SLASH", "unselect",
+                   "control shift O", "toggle-componentOrientation",
+                           "ESCAPE", "reset-field-edit",
+                               "UP", "increment",
+                            "KP_UP", "increment",
+                             "DOWN", "decrement",
+                          "KP_DOWN", "decrement",
+              }));
+
+        DEFAULT_VALUES.put("InternalFrame.icon",
+                           LookAndFeel.makeIcon(BasicLookAndFeel.class,
+                                                    "icons/JavaCup16.png"));
+
+        DEFAULT_VALUES.put("InternalFrame.windowBindings",
+            new Object[] {
+              "shift ESCAPE", "showSystemMenu",
+                "ctrl SPACE", "showSystemMenu",
+              "ESCAPE", "hideSystemMenu"});
+
+        DEFAULT_VALUES.put("List.focusInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                           "ctrl C", "copy",
+                           "ctrl V", "paste",
+                           "ctrl X", "cut",
+                             "COPY", "copy",
+                            "PASTE", "paste",
+                              "CUT", "cut",
+                   "control INSERT", "copy",
+                     "shift INSERT", "paste",
+                     "shift DELETE", "cut",
+                               "UP", "selectPreviousRow",
+                            "KP_UP", "selectPreviousRow",
+                         "shift UP", "selectPreviousRowExtendSelection",
+                      "shift KP_UP", "selectPreviousRowExtendSelection",
+                    "ctrl shift UP", "selectPreviousRowExtendSelection",
+                 "ctrl shift KP_UP", "selectPreviousRowExtendSelection",
+                          "ctrl UP", "selectPreviousRowChangeLead",
+                       "ctrl KP_UP", "selectPreviousRowChangeLead",
+                             "DOWN", "selectNextRow",
+                          "KP_DOWN", "selectNextRow",
+                       "shift DOWN", "selectNextRowExtendSelection",
+                    "shift KP_DOWN", "selectNextRowExtendSelection",
+                  "ctrl shift DOWN", "selectNextRowExtendSelection",
+               "ctrl shift KP_DOWN", "selectNextRowExtendSelection",
+                        "ctrl DOWN", "selectNextRowChangeLead",
+                     "ctrl KP_DOWN", "selectNextRowChangeLead",
+                             "LEFT", "selectPreviousColumn",
+                          "KP_LEFT", "selectPreviousColumn",
+                       "shift LEFT", "selectPreviousColumnExtendSelection",
+                    "shift KP_LEFT", "selectPreviousColumnExtendSelection",
+                  "ctrl shift LEFT", "selectPreviousColumnExtendSelection",
+               "ctrl shift KP_LEFT", "selectPreviousColumnExtendSelection",
+                        "ctrl LEFT", "selectPreviousColumnChangeLead",
+                     "ctrl KP_LEFT", "selectPreviousColumnChangeLead",
+                            "RIGHT", "selectNextColumn",
+                         "KP_RIGHT", "selectNextColumn",
+                      "shift RIGHT", "selectNextColumnExtendSelection",
+                   "shift KP_RIGHT", "selectNextColumnExtendSelection",
+                 "ctrl shift RIGHT", "selectNextColumnExtendSelection",
+              "ctrl shift KP_RIGHT", "selectNextColumnExtendSelection",
+                       "ctrl RIGHT", "selectNextColumnChangeLead",
+                    "ctrl KP_RIGHT", "selectNextColumnChangeLead",
+                             "HOME", "selectFirstRow",
+                       "shift HOME", "selectFirstRowExtendSelection",
+                  "ctrl shift HOME", "selectFirstRowExtendSelection",
+                        "ctrl HOME", "selectFirstRowChangeLead",
+                              "END", "selectLastRow",
+                        "shift END", "selectLastRowExtendSelection",
+                   "ctrl shift END", "selectLastRowExtendSelection",
+                         "ctrl END", "selectLastRowChangeLead",
+                          "PAGE_UP", "scrollUp",
+                    "shift PAGE_UP", "scrollUpExtendSelection",
+               "ctrl shift PAGE_UP", "scrollUpExtendSelection",
+                     "ctrl PAGE_UP", "scrollUpChangeLead",
+                        "PAGE_DOWN", "scrollDown",
+                  "shift PAGE_DOWN", "scrollDownExtendSelection",
+             "ctrl shift PAGE_DOWN", "scrollDownExtendSelection",
+                   "ctrl PAGE_DOWN", "scrollDownChangeLead",
+                           "ctrl A", "selectAll",
+                       "ctrl SLASH", "selectAll",
+                  "ctrl BACK_SLASH", "clearSelection",
+                            "SPACE", "addToSelection",
+                       "ctrl SPACE", "toggleAndAnchor",
+                      "shift SPACE", "extendTo",
+                 "ctrl shift SPACE", "moveSelectionTo"
+               }));
+
+        DEFAULT_VALUES.put("List.focusInputMap.RightToLeft",
+               new UIDefaults.LazyInputMap(new Object[] {
+                             "LEFT", "selectNextColumn",
+                          "KP_LEFT", "selectNextColumn",
+                       "shift LEFT", "selectNextColumnExtendSelection",
+                    "shift KP_LEFT", "selectNextColumnExtendSelection",
+                  "ctrl shift LEFT", "selectNextColumnExtendSelection",
+               "ctrl shift KP_LEFT", "selectNextColumnExtendSelection",
+                        "ctrl LEFT", "selectNextColumnChangeLead",
+                     "ctrl KP_LEFT", "selectNextColumnChangeLead",
+                            "RIGHT", "selectPreviousColumn",
+                         "KP_RIGHT", "selectPreviousColumn",
+                      "shift RIGHT", "selectPreviousColumnExtendSelection",
+                   "shift KP_RIGHT", "selectPreviousColumnExtendSelection",
+                 "ctrl shift RIGHT", "selectPreviousColumnExtendSelection",
+              "ctrl shift KP_RIGHT", "selectPreviousColumnExtendSelection",
+                       "ctrl RIGHT", "selectPreviousColumnChangeLead",
+                    "ctrl KP_RIGHT", "selectPreviousColumnChangeLead",
+               }));
+
+        DEFAULT_VALUES.put("MenuBar.windowBindings",
+                                new Object[] { "F10", "takeFocus" });
+
+        DEFAULT_VALUES.put("OptionPane.windowBindings",
+                 new Object[] { "ESCAPE", "close" });
+
+        DEFAULT_VALUES.put("RootPane.defaultButtonWindowKeyBindings",
+                 new Object[] {
+                             "ENTER", "press",
+                    "released ENTER", "release",
+                        "ctrl ENTER", "press",
+               "ctrl released ENTER", "release"
+                 });
+
+        DEFAULT_VALUES.put("RootPane.ancestorInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                    "shift F10", "postPopup"
+               }));
+
+        DEFAULT_VALUES.put("ScrollBar.anecstorInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                       "RIGHT", "positiveUnitIncrement",
+                    "KP_RIGHT", "positiveUnitIncrement",
+                        "DOWN", "positiveUnitIncrement",
+                     "KP_DOWN", "positiveUnitIncrement",
+                   "PAGE_DOWN", "positiveBlockIncrement",
+                        "LEFT", "negativeUnitIncrement",
+                     "KP_LEFT", "negativeUnitIncrement",
+                          "UP", "negativeUnitIncrement",
+                       "KP_UP", "negativeUnitIncrement",
+                     "PAGE_UP", "negativeBlockIncrement",
+                        "HOME", "minScroll",
+                         "END", "maxScroll"
+               }));
+
+        DEFAULT_VALUES.put("ScrollBar.ancestorInputMap.RightToLeft",
+               new UIDefaults.LazyInputMap(new Object[] {
+                       "RIGHT", "negativeUnitIncrement",
+                    "KP_RIGHT", "negativeUnitIncrement",
+                        "LEFT", "positiveUnitIncrement",
+                     "KP_LEFT", "positiveUnitIncrement",
+               }));
+
+        DEFAULT_VALUES.put("ScrollPane.ancestorInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                           "RIGHT", "unitScrollRight",
+                        "KP_RIGHT", "unitScrollRight",
+                            "DOWN", "unitScrollDown",
+                         "KP_DOWN", "unitScrollDown",
+                            "LEFT", "unitScrollLeft",
+                         "KP_LEFT", "unitScrollLeft",
+                              "UP", "unitScrollUp",
+                           "KP_UP", "unitScrollUp",
+                         "PAGE_UP", "scrollUp",
+                       "PAGE_DOWN", "scrollDown",
+                    "ctrl PAGE_UP", "scrollLeft",
+                  "ctrl PAGE_DOWN", "scrollRight",
+                       "ctrl HOME", "scrollHome",
+                        "ctrl END", "scrollEnd"
+               }));
+        DEFAULT_VALUES.put("ScrollPane.ancestorInputMap.RightToLeft",
+               new UIDefaults.LazyInputMap(new Object[] {
+                    "ctrl PAGE_UP", "scrollRight",
+                  "ctrl PAGE_DOWN", "scrollLeft",
+               }));
+
+        DEFAULT_VALUES.put("SplitPane.ancestorInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                        "UP", "negativeIncrement",
+                      "DOWN", "positiveIncrement",
+                      "LEFT", "negativeIncrement",
+                     "RIGHT", "positiveIncrement",
+                     "KP_UP", "negativeIncrement",
+                   "KP_DOWN", "positiveIncrement",
+                   "KP_LEFT", "negativeIncrement",
+                  "KP_RIGHT", "positiveIncrement",
+                      "HOME", "selectMin",
+                       "END", "selectMax",
+                        "F8", "startResize",
+                        "F6", "toggleFocus",
+                  "ctrl TAB", "focusOutForward",
+            "ctrl shift TAB", "focusOutBackward"
+               }));
+
+        DEFAULT_VALUES.put("Spinner.ancestorInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                          "UP", "increment",
+                       "KP_UP", "increment",
+                        "DOWN", "decrement",
+                     "KP_DOWN", "decrement"
+               }));
+
+        DEFAULT_VALUES.put("Slider.focusInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                       "RIGHT", "positiveUnitIncrement",
+                    "KP_RIGHT", "positiveUnitIncrement",
+                        "DOWN", "negativeUnitIncrement",
+                     "KP_DOWN", "negativeUnitIncrement",
+                   "PAGE_DOWN", "negativeBlockIncrement",
+              "ctrl PAGE_DOWN", "negativeBlockIncrement",
+                        "LEFT", "negativeUnitIncrement",
+                     "KP_LEFT", "negativeUnitIncrement",
+                          "UP", "positiveUnitIncrement",
+                       "KP_UP", "positiveUnitIncrement",
+                     "PAGE_UP", "positiveBlockIncrement",
+                "ctrl PAGE_UP", "positiveBlockIncrement",
+                        "HOME", "minScroll",
+                         "END", "maxScroll"
+               }));
+
+        DEFAULT_VALUES.put("Slider.focusInputMap.RightToLeft",
+               new UIDefaults.LazyInputMap(new Object[] {
+                       "RIGHT", "negativeUnitIncrement",
+                    "KP_RIGHT", "negativeUnitIncrement",
+                        "LEFT", "positiveUnitIncrement",
+                     "KP_LEFT", "positiveUnitIncrement",
+               }));
+
+        DEFAULT_VALUES.put("TabbedPane.ancestorInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                   "ctrl PAGE_DOWN", "navigatePageDown",
+                     "ctrl PAGE_UP", "navigatePageUp",
+                          "ctrl UP", "requestFocus",
+                       "ctrl KP_UP", "requestFocus",
+               }));
+
+        DEFAULT_VALUES.put("TabbedPane.focusInputMap",
+              new UIDefaults.LazyInputMap(new Object[] {
+                         "RIGHT", "navigateRight",
+                      "KP_RIGHT", "navigateRight",
+                          "LEFT", "navigateLeft",
+                       "KP_LEFT", "navigateLeft",
+                            "UP", "navigateUp",
+                         "KP_UP", "navigateUp",
+                          "DOWN", "navigateDown",
+                       "KP_DOWN", "navigateDown",
+                     "ctrl DOWN", "requestFocusForVisibleComponent",
+                  "ctrl KP_DOWN", "requestFocusForVisibleComponent",
+              }));
+
+        DEFAULT_VALUES.put("Table.ancestorInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                               "ctrl C", "copy",
+                               "ctrl V", "paste",
+                               "ctrl X", "cut",
+                                 "COPY", "copy",
+                                "PASTE", "paste",
+                                  "CUT", "cut",
+                       "control INSERT", "copy",
+                         "shift INSERT", "paste",
+                         "shift DELETE", "cut",
+                                "RIGHT", "selectNextColumn",
+                             "KP_RIGHT", "selectNextColumn",
+                          "shift RIGHT", "selectNextColumnExtendSelection",
+                       "shift KP_RIGHT", "selectNextColumnExtendSelection",
+                     "ctrl shift RIGHT", "selectNextColumnExtendSelection",
+                  "ctrl shift KP_RIGHT", "selectNextColumnExtendSelection",
+                           "ctrl RIGHT", "selectNextColumnChangeLead",
+                        "ctrl KP_RIGHT", "selectNextColumnChangeLead",
+                                 "LEFT", "selectPreviousColumn",
+                              "KP_LEFT", "selectPreviousColumn",
+                           "shift LEFT", "selectPreviousColumnExtendSelection",
+                        "shift KP_LEFT", "selectPreviousColumnExtendSelection",
+                      "ctrl shift LEFT", "selectPreviousColumnExtendSelection",
+                   "ctrl shift KP_LEFT", "selectPreviousColumnExtendSelection",
+                            "ctrl LEFT", "selectPreviousColumnChangeLead",
+                         "ctrl KP_LEFT", "selectPreviousColumnChangeLead",
+                                 "DOWN", "selectNextRow",
+                              "KP_DOWN", "selectNextRow",
+                           "shift DOWN", "selectNextRowExtendSelection",
+                        "shift KP_DOWN", "selectNextRowExtendSelection",
+                      "ctrl shift DOWN", "selectNextRowExtendSelection",
+                   "ctrl shift KP_DOWN", "selectNextRowExtendSelection",
+                            "ctrl DOWN", "selectNextRowChangeLead",
+                         "ctrl KP_DOWN", "selectNextRowChangeLead",
+                                   "UP", "selectPreviousRow",
+                                "KP_UP", "selectPreviousRow",
+                             "shift UP", "selectPreviousRowExtendSelection",
+                          "shift KP_UP", "selectPreviousRowExtendSelection",
+                        "ctrl shift UP", "selectPreviousRowExtendSelection",
+                     "ctrl shift KP_UP", "selectPreviousRowExtendSelection",
+                              "ctrl UP", "selectPreviousRowChangeLead",
+                           "ctrl KP_UP", "selectPreviousRowChangeLead",
+                                 "HOME", "selectFirstColumn",
+                           "shift HOME", "selectFirstColumnExtendSelection",
+                      "ctrl shift HOME", "selectFirstRowExtendSelection",
+                            "ctrl HOME", "selectFirstRow",
+                                  "END", "selectLastColumn",
+                            "shift END", "selectLastColumnExtendSelection",
+                       "ctrl shift END", "selectLastRowExtendSelection",
+                             "ctrl END", "selectLastRow",
+                              "PAGE_UP", "scrollUpChangeSelection",
+                        "shift PAGE_UP", "scrollUpExtendSelection",
+                   "ctrl shift PAGE_UP", "scrollLeftExtendSelection",
+                         "ctrl PAGE_UP", "scrollLeftChangeSelection",
+                            "PAGE_DOWN", "scrollDownChangeSelection",
+                      "shift PAGE_DOWN", "scrollDownExtendSelection",
+                 "ctrl shift PAGE_DOWN", "scrollRightExtendSelection",
+                       "ctrl PAGE_DOWN", "scrollRightChangeSelection",
+                                  "TAB", "selectNextColumnCell",
+                            "shift TAB", "selectPreviousColumnCell",
+                                "ENTER", "selectNextRowCell",
+                          "shift ENTER", "selectPreviousRowCell",
+                               "ctrl A", "selectAll",
+                           "ctrl SLASH", "selectAll",
+                      "ctrl BACK_SLASH", "clearSelection",
+                               "ESCAPE", "cancel",
+                                   "F2", "startEditing",
+                                "SPACE", "addToSelection",
+                           "ctrl SPACE", "toggleAndAnchor",
+                          "shift SPACE", "extendTo",
+                     "ctrl shift SPACE", "moveSelectionTo",
+                                   "F8", "focusHeader"
+               }));
+
+       DEFAULT_VALUES.put("TableHeader.ancestorInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                                "SPACE", "toggleSortOrder",
+                                 "LEFT", "selectColumnToLeft",
+                              "KP_LEFT", "selectColumnToLeft",
+                                "RIGHT", "selectColumnToRight",
+                             "KP_RIGHT", "selectColumnToRight",
+                             "alt LEFT", "moveColumnLeft",
+                          "alt KP_LEFT", "moveColumnLeft",
+                            "alt RIGHT", "moveColumnRight",
+                         "alt KP_RIGHT", "moveColumnRight",
+                       "alt shift LEFT", "resizeLeft",
+                    "alt shift KP_LEFT", "resizeLeft",
+                      "alt shift RIGHT", "resizeRight",
+                   "alt shift KP_RIGHT", "resizeRight",
+                               "ESCAPE", "focusTable",
+               }));
+
+        DEFAULT_VALUES.put("Tree.ancestorInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                     "ESCAPE", "cancel"
+               }));
+        DEFAULT_VALUES.put("Tree.focusInputMap",
+               new UIDefaults.LazyInputMap(new Object[] {
+                                    "ADD", "expand",
+                               "SUBTRACT", "collapse",
+                                 "ctrl C", "copy",
+                                 "ctrl V", "paste",
+                                 "ctrl X", "cut",
+                                   "COPY", "copy",
+                                  "PASTE", "paste",
+                                    "CUT", "cut",
+                         "control INSERT", "copy",
+                           "shift INSERT", "paste",
+                           "shift DELETE", "cut",
+                                     "UP", "selectPrevious",
+                                  "KP_UP", "selectPrevious",
+                               "shift UP", "selectPreviousExtendSelection",
+                            "shift KP_UP", "selectPreviousExtendSelection",
+                          "ctrl shift UP", "selectPreviousExtendSelection",
+                       "ctrl shift KP_UP", "selectPreviousExtendSelection",
+                                "ctrl UP", "selectPreviousChangeLead",
+                             "ctrl KP_UP", "selectPreviousChangeLead",
+                                   "DOWN", "selectNext",
+                                "KP_DOWN", "selectNext",
+                             "shift DOWN", "selectNextExtendSelection",
+                          "shift KP_DOWN", "selectNextExtendSelection",
+                        "ctrl shift DOWN", "selectNextExtendSelection",
+                     "ctrl shift KP_DOWN", "selectNextExtendSelection",
+                              "ctrl DOWN", "selectNextChangeLead",
+                           "ctrl KP_DOWN", "selectNextChangeLead",
+                                  "RIGHT", "selectChild",
+                               "KP_RIGHT", "selectChild",
+                                   "LEFT", "selectParent",
+                                "KP_LEFT", "selectParent",
+                                "PAGE_UP", "scrollUpChangeSelection",
+                          "shift PAGE_UP", "scrollUpExtendSelection",
+                     "ctrl shift PAGE_UP", "scrollUpExtendSelection",
+                           "ctrl PAGE_UP", "scrollUpChangeLead",
+                              "PAGE_DOWN", "scrollDownChangeSelection",
+                        "shift PAGE_DOWN", "scrollDownExtendSelection",
+                   "ctrl shift PAGE_DOWN", "scrollDownExtendSelection",
+                         "ctrl PAGE_DOWN", "scrollDownChangeLead",
+                                   "HOME", "selectFirst",
+                             "shift HOME", "selectFirstExtendSelection",
+                        "ctrl shift HOME", "selectFirstExtendSelection",
+                              "ctrl HOME", "selectFirstChangeLead",
+                                    "END", "selectLast",
+                              "shift END", "selectLastExtendSelection",
+                         "ctrl shift END", "selectLastExtendSelection",
+                               "ctrl END", "selectLastChangeLead",
+                                     "F2", "startEditing",
+                                 "ctrl A", "selectAll",
+                             "ctrl SLASH", "selectAll",
+                        "ctrl BACK_SLASH", "clearSelection",
+                              "ctrl LEFT", "scrollLeft",
+                           "ctrl KP_LEFT", "scrollLeft",
+                             "ctrl RIGHT", "scrollRight",
+                          "ctrl KP_RIGHT", "scrollRight",
+                                  "SPACE", "addToSelection",
+                             "ctrl SPACE", "toggleAndAnchor",
+                            "shift SPACE", "extendTo",
+                       "ctrl shift SPACE", "moveSelectionTo"
+               }));
+        DEFAULT_VALUES.put("Tree.focusInputMap.RightToLeft",
+               new UIDefaults.LazyInputMap(new Object[] {
+                                  "RIGHT", "selectParent",
+                               "KP_RIGHT", "selectParent",
+                                   "LEFT", "selectChild",
+                                "KP_LEFT", "selectChild",
+               }));
+    }
+
+    /**
+     * Returns the default value for the specified property, or null if there
+     * is no default for the specified value.
+     */
+    private static Object getDefaultValue(Object key) {
+        synchronized(SynthStyle.class) {
+            if (DEFAULT_VALUES == null) {
+                DEFAULT_VALUES = new HashMap();
+                populateDefaultValues();
+            }
+            Object value = DEFAULT_VALUES.get(key);
+            if (value instanceof UIDefaults.LazyValue) {
+                value = ((UIDefaults.LazyValue)value).createValue(null);
+                DEFAULT_VALUES.put(key, value);
+            }
+            return value;
+        }
+    }
+
+    /**
+     * Constructs a SynthStyle.
+     */
+    public SynthStyle() {
+    }
+
+    /**
+     * Returns the <code>SynthGraphicUtils</code> for the specified context.
+     *
+     * @param context SynthContext identifying requester
+     * @return SynthGraphicsUtils
+     */
+    public SynthGraphicsUtils getGraphicsUtils(SynthContext context) {
+        return SYNTH_GRAPHICS;
+    }
+
+    /**
+     * Returns the color for the specified state. This gives precedence to
+     * foreground and background of the <code>JComponent</code>. If the
+     * <code>Color</code> from the <code>JComponent</code> is not appropriate,
+     * or not used, this will invoke <code>getColorForState</code>. Subclasses
+     * should generally not have to override this, instead override
+     * {@link #getColorForState}.
+     *
+     * @param context SynthContext identifying requester
+     * @param type Type of color being requested.
+     * @return Color
+     */
+    public Color getColor(SynthContext context, ColorType type) {
+        JComponent c = context.getComponent();
+        Region id = context.getRegion();
+        int cs = context.getComponentState();
+        // For the enabled state, prefer the widget's colors
+        if (!id.isSubregion() && cs == SynthConstants.ENABLED) {
+            if (type == ColorType.BACKGROUND) {
+                return c.getBackground();
+            }
+            else if (type == ColorType.FOREGROUND) {
+                return c.getForeground();
+            }
+            else if (type == ColorType.TEXT_FOREGROUND) {
+                // If getForeground returns a non-UIResource it means the
+                // developer has explicitly set the foreground, use it over
+                // that of TEXT_FOREGROUND as that is typically the expected
+                // behavior.
+                Color color = c.getForeground();
+                if (!(color instanceof UIResource)) {
+                    return color;
+                }
+            }
+        }
+        // Then use what we've locally defined
+        Color color = getColorForState(context, type);
+        if (color == null) {
+            // No color, fallback to that of the widget.
+            if (type == ColorType.BACKGROUND ||
+                        type == ColorType.TEXT_BACKGROUND) {
+                return c.getBackground();
+            }
+            else if (type == ColorType.FOREGROUND ||
+                     type == ColorType.TEXT_FOREGROUND) {
+                return c.getForeground();
+            }
+        }
+        return color;
+    }
+
+    /**
+     * Returns the color for the specified state. This should NOT call any
+     * methods on the <code>JComponent</code>.
+     *
+     * @param context SynthContext identifying requester
+     * @param type Type of color being requested.
+     * @return Color to render with
+     */
+    protected abstract Color getColorForState(SynthContext context,
+                                              ColorType type);
+
+    /**
+     * Returns the Font for the specified state. This redirects to the
+     * <code>JComponent</code> from the <code>context</code> as necessary.
+     * If this does not redirect
+     * to the JComponent {@link #getFontForState} is invoked.
+     *
+     * @param context SynthContext identifying requester
+     * @return Font to render with
+     */
+    public Font getFont(SynthContext context) {
+        JComponent c = context.getComponent();
+        if (context.getComponentState() == SynthConstants.ENABLED) {
+            return c.getFont();
+        }
+        Font cFont = c.getFont();
+        if (cFont != null && !(cFont instanceof UIResource)) {
+            return cFont;
+        }
+        return getFontForState(context);
+    }
+
+    /**
+     * Returns the font for the specified state. This should NOT call any
+     * method on the <code>JComponent</code>.
+     *
+     * @param context SynthContext identifying requester
+     * @return Font to render with
+     */
+    protected abstract Font getFontForState(SynthContext context);
+
+    /**
+     * Returns the Insets that are used to calculate sizing information.
+     *
+     * @param context SynthContext identifying requester
+     * @param insets Insets to place return value in.
+     * @return Sizing Insets.
+     */
+    public Insets getInsets(SynthContext context, Insets insets) {
+        if (insets == null) {
+            insets = new Insets(0, 0, 0, 0);
+        }
+        insets.top = insets.bottom = insets.left = insets.right = 0;
+        return insets;
+    }
+
+    /**
+     * Returns the <code>SynthPainter</code> that will be used for painting.
+     * This may return null.
+     *
+     * @param context SynthContext identifying requester
+     * @return SynthPainter to use
+     */
+    public SynthPainter getPainter(SynthContext context) {
+        return null;
+    }
+
+    /**
+     * Returns true if the region is opaque.
+     *
+     * @param context SynthContext identifying requester
+     * @return true if region is opaque.
+     */
+    public boolean isOpaque(SynthContext context) {
+        return true;
+    }
+
+    /**
+     * Getter for a region specific style property.
+     *
+     * @param context SynthContext identifying requester
+     * @param key Property being requested.
+     * @return Value of the named property
+     */
+    public Object get(SynthContext context, Object key) {
+        return getDefaultValue(key);
+    }
+
+    void installDefaults(SynthContext context, SynthUI ui) {
+        // Special case the Border as this will likely change when the LAF
+        // can have more control over this.
+        if (!context.isSubregion()) {
+            JComponent c = context.getComponent();
+            Border border = c.getBorder();
+
+            if (border == null || border instanceof UIResource) {
+                c.setBorder(new SynthBorder(ui, getInsets(context, null)));
+            }
+        }
+        installDefaults(context);
+    }
+
+    /**
+     * Installs the necessary state from this Style on the
+     * <code>JComponent</code> from <code>context</code>.
+     *
+     * @param context SynthContext identifying component to install properties
+     *        to.
+     */
+    public void installDefaults(SynthContext context) {
+        if (!context.isSubregion()) {
+            JComponent c = context.getComponent();
+            Region region = context.getRegion();
+            Font font = c.getFont();
+
+            if (font == null || (font instanceof UIResource)) {
+                c.setFont(getFontForState(context));
+            }
+            Color background = c.getBackground();
+            if (background == null || (background instanceof UIResource)) {
+                c.setBackground(getColorForState(context,
+                                                 ColorType.BACKGROUND));
+            }
+            Color foreground = c.getForeground();
+            if (foreground == null || (foreground instanceof UIResource)) {
+                c.setForeground(getColorForState(context,
+                         ColorType.FOREGROUND));
+            }
+            LookAndFeel.installProperty(c, "opaque", Boolean.valueOf(isOpaque(context)));
+        }
+    }
+
+    /**
+     * Uninstalls any state that this style installed on
+     * the <code>JComponent</code> from <code>context</code>.
+     * <p>
+     * Styles should NOT depend upon this being called, in certain cases
+     * it may never be called.
+     *
+     * @param context SynthContext identifying component to install properties
+     *        to.
+     */
+    public void uninstallDefaults(SynthContext context) {
+        if (!context.isSubregion()) {
+            // NOTE: because getForeground, getBackground and getFont will look
+            // at the parent Container, if we set them to null it may
+            // mean we they return a non-null and non-UIResource value
+            // preventing install from correctly settings its colors/font. For
+            // this reason we do not uninstall the fg/bg/font.
+
+            JComponent c = context.getComponent();
+            Border border = c.getBorder();
+
+            if (border instanceof UIResource) {
+                c.setBorder(null);
+            }
+        }
+    }
+
+    /**
+     * Convenience method to get a specific style property whose value is
+     * a <code>Number</code>. If the value is a <code>Number</code>,
+     * <code>intValue</code> is returned, otherwise <code>defaultValue</code>
+     * is returned.
+     *
+     * @param context SynthContext identifying requester
+     * @param key Property being requested.
+     * @param defaultValue Value to return if the property has not been
+     *        specified, or is not a Number
+     * @return Value of the named property
+     */
+    public int getInt(SynthContext context, Object key, int defaultValue) {
+        Object value = get(context, key);
+
+        if (value instanceof Number) {
+            return ((Number)value).intValue();
+        }
+        return defaultValue;
+    }
+
+    /**
+     * Convenience method to get a specific style property whose value is
+     * an Boolean.
+     *
+     * @param context SynthContext identifying requester
+     * @param key Property being requested.
+     * @param defaultValue Value to return if the property has not been
+     *        specified, or is not a Boolean
+     * @return Value of the named property
+     */
+    public boolean getBoolean(SynthContext context, Object key,
+                              boolean defaultValue) {
+        Object value = get(context, key);
+
+        if (value instanceof Boolean) {
+            return ((Boolean)value).booleanValue();
+        }
+        return defaultValue;
+    }
+
+    /**
+     * Convenience method to get a specific style property whose value is
+     * an Icon.
+     *
+     * @param context SynthContext identifying requester
+     * @param key Property being requested.
+     * @return Value of the named property, or null if not specified
+     */
+    public Icon getIcon(SynthContext context, Object key) {
+        Object value = get(context, key);
+
+        if (value instanceof Icon) {
+            return (Icon)value;
+        }
+        return null;
+    }
+
+    /**
+     * Convenience method to get a specific style property whose value is
+     * a String.
+     *
+     * @param context SynthContext identifying requester
+     * @param key Property being requested.
+     * @param defaultValue Value to return if the property has not been
+     *        specified, or is not a String
+     * @return Value of the named property
+     */
+    public String getString(SynthContext context, Object key,
+                              String defaultValue) {
+        Object value = get(context, key);
+
+        if (value instanceof String) {
+            return (String)value;
+        }
+        return defaultValue;
+    }
+}