| /* |
| * Copyright 2002-2008 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 javax.swing.text.JTextComponent; |
| 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<Object, Object> 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<Object, Object>(); |
| 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(); |
| |
| if ((context.getComponentState() & SynthConstants.DISABLED) != 0) { |
| //This component is disabled, so return the disabled color. |
| //In some cases this means ignoring the color specified by the |
| //developer on the component. In other cases it means using a |
| //specified disabledTextColor, such as on JTextComponents. |
| //For example, JLabel doesn't specify a disabled color that the |
| //developer can set, yet it should have a disabled color to the |
| //text when the label is disabled. This code allows for that. |
| if (c instanceof JTextComponent) { |
| JTextComponent txt = (JTextComponent)c; |
| Color disabledColor = txt.getDisabledTextColor(); |
| if (disabledColor == null || disabledColor instanceof UIResource) { |
| return getColorForState(context, type); |
| } |
| } else if (c instanceof JLabel && |
| (type == ColorType.FOREGROUND || |
| type == ColorType.TEXT_FOREGROUND)) { |
| return getColorForState(context, type); |
| } |
| } |
| |
| // If the developer has specified a color, prefer it. Otherwise, get |
| // the color for the state. |
| Color color = null; |
| if (!id.isSubregion()) { |
| if (type == ColorType.BACKGROUND) { |
| color = c.getBackground(); |
| } |
| else if (type == ColorType.FOREGROUND) { |
| color = c.getForeground(); |
| } |
| else if (type == ColorType.TEXT_FOREGROUND) { |
| color = c.getForeground(); |
| } |
| } |
| |
| if (color == null || color instanceof UIResource) { |
| // Then use what we've locally defined |
| 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; |
| } |
| } |