0001 /*
0002 * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved.
0003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0004 *
0005 * This code is free software; you can redistribute it and/or modify it
0006 * under the terms of the GNU General Public License version 2 only, as
0007 * published by the Free Software Foundation. Sun designates this
0008 * particular file as subject to the "Classpath" exception as provided
0009 * by Sun in the LICENSE file that accompanied this code.
0010 *
0011 * This code is distributed in the hope that it will be useful, but WITHOUT
0012 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0013 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0014 * version 2 for more details (a copy is included in the LICENSE file that
0015 * accompanied this code).
0016 *
0017 * You should have received a copy of the GNU General Public License version
0018 * 2 along with this work; if not, write to the Free Software Foundation,
0019 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0020 *
0021 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
0022 * CA 95054 USA or visit www.sun.com if you need additional information or
0023 * have any questions.
0024 */
0025 package javax.swing.plaf.synth;
0026
0027 import java.awt.*;
0028 import javax.swing.*;
0029 import javax.swing.border.Border;
0030 import javax.swing.plaf.UIResource;
0031 import javax.swing.plaf.basic.BasicLookAndFeel;
0032 import javax.swing.text.DefaultEditorKit;
0033 import java.util.HashMap;
0034 import java.util.Map;
0035 import sun.swing.plaf.synth.SynthUI;
0036
0037 /**
0038 * <code>SynthStyle</code> is a set of style properties.
0039 * Each <code>SynthUI</code> references at least one
0040 * <code>SynthStyle</code> that is obtained using a
0041 * <code>SynthStyleFactory</code>. You typically don't need to interact with
0042 * this class directly, rather you will load a
0043 * <a href="doc-files/synthFileFormat.html">Synth File Format file</a> into
0044 * <code>SynthLookAndFeel</code> that will create a set of SynthStyles.
0045 *
0046 * @see SynthLookAndFeel
0047 * @see SynthStyleFactory
0048 *
0049 * @version 1.44, 05/05/07
0050 * @since 1.5
0051 * @author Scott Violet
0052 */
0053 public abstract class SynthStyle {
0054 /**
0055 * Contains the default values for certain properties.
0056 */
0057 private static Map DEFAULT_VALUES;
0058
0059 /**
0060 * Shared SynthGraphics.
0061 */
0062 private static final SynthGraphicsUtils SYNTH_GRAPHICS = new SynthGraphicsUtils();
0063
0064 /**
0065 * Adds the default values that we know about to DEFAULT_VALUES.
0066 */
0067 private static void populateDefaultValues() {
0068 Object buttonMap = new UIDefaults.LazyInputMap(new Object[] {
0069 "SPACE", "pressed", "released SPACE", "released" });
0070 DEFAULT_VALUES.put("Button.focusInputMap", buttonMap);
0071 DEFAULT_VALUES.put("CheckBox.focusInputMap", buttonMap);
0072 DEFAULT_VALUES.put("RadioButton.focusInputMap", buttonMap);
0073 DEFAULT_VALUES.put("ToggleButton.focusInputMap", buttonMap);
0074 DEFAULT_VALUES.put("SynthArrowButton.focusInputMap", buttonMap);
0075 DEFAULT_VALUES.put("List.dropLineColor", Color.BLACK);
0076 DEFAULT_VALUES.put("Tree.dropLineColor", Color.BLACK);
0077 DEFAULT_VALUES.put("Table.dropLineColor", Color.BLACK);
0078 DEFAULT_VALUES.put("Table.dropLineShortColor", Color.RED);
0079
0080 Object multilineInputMap = new UIDefaults.LazyInputMap(
0081 new Object[] { "ctrl C", DefaultEditorKit.copyAction,
0082 "ctrl V", DefaultEditorKit.pasteAction,
0083 "ctrl X", DefaultEditorKit.cutAction, "COPY",
0084 DefaultEditorKit.copyAction, "PASTE",
0085 DefaultEditorKit.pasteAction, "CUT",
0086 DefaultEditorKit.cutAction, "control INSERT",
0087 DefaultEditorKit.copyAction, "shift INSERT",
0088 DefaultEditorKit.pasteAction, "shift DELETE",
0089 DefaultEditorKit.cutAction, "shift LEFT",
0090 DefaultEditorKit.selectionBackwardAction,
0091 "shift KP_LEFT",
0092 DefaultEditorKit.selectionBackwardAction,
0093 "shift RIGHT",
0094 DefaultEditorKit.selectionForwardAction,
0095 "shift KP_RIGHT",
0096 DefaultEditorKit.selectionForwardAction,
0097 "ctrl LEFT",
0098 DefaultEditorKit.previousWordAction,
0099 "ctrl KP_LEFT",
0100 DefaultEditorKit.previousWordAction,
0101 "ctrl RIGHT", DefaultEditorKit.nextWordAction,
0102 "ctrl KP_RIGHT",
0103 DefaultEditorKit.nextWordAction,
0104 "ctrl shift LEFT",
0105 DefaultEditorKit.selectionPreviousWordAction,
0106 "ctrl shift KP_LEFT",
0107 DefaultEditorKit.selectionPreviousWordAction,
0108 "ctrl shift RIGHT",
0109 DefaultEditorKit.selectionNextWordAction,
0110 "ctrl shift KP_RIGHT",
0111 DefaultEditorKit.selectionNextWordAction,
0112 "ctrl A", DefaultEditorKit.selectAllAction,
0113 "HOME", DefaultEditorKit.beginLineAction,
0114 "END", DefaultEditorKit.endLineAction,
0115 "shift HOME",
0116 DefaultEditorKit.selectionBeginLineAction,
0117 "shift END",
0118 DefaultEditorKit.selectionEndLineAction,
0119
0120 "UP", DefaultEditorKit.upAction, "KP_UP",
0121 DefaultEditorKit.upAction, "DOWN",
0122 DefaultEditorKit.downAction, "KP_DOWN",
0123 DefaultEditorKit.downAction, "PAGE_UP",
0124 DefaultEditorKit.pageUpAction, "PAGE_DOWN",
0125 DefaultEditorKit.pageDownAction,
0126 "shift PAGE_UP", "selection-page-up",
0127 "shift PAGE_DOWN", "selection-page-down",
0128 "ctrl shift PAGE_UP", "selection-page-left",
0129 "ctrl shift PAGE_DOWN", "selection-page-right",
0130 "shift UP", DefaultEditorKit.selectionUpAction,
0131 "shift KP_UP",
0132 DefaultEditorKit.selectionUpAction,
0133 "shift DOWN",
0134 DefaultEditorKit.selectionDownAction,
0135 "shift KP_DOWN",
0136 DefaultEditorKit.selectionDownAction, "ENTER",
0137 DefaultEditorKit.insertBreakAction,
0138 "BACK_SPACE",
0139 DefaultEditorKit.deletePrevCharAction,
0140 "shift BACK_SPACE",
0141 DefaultEditorKit.deletePrevCharAction,
0142 "ctrl H",
0143 DefaultEditorKit.deletePrevCharAction,
0144 "DELETE",
0145 DefaultEditorKit.deleteNextCharAction,
0146 "ctrl DELETE",
0147 DefaultEditorKit.deleteNextWordAction,
0148 "ctrl BACK_SPACE",
0149 DefaultEditorKit.deletePrevWordAction, "RIGHT",
0150 DefaultEditorKit.forwardAction, "LEFT",
0151 DefaultEditorKit.backwardAction, "KP_RIGHT",
0152 DefaultEditorKit.forwardAction, "KP_LEFT",
0153 DefaultEditorKit.backwardAction, "TAB",
0154 DefaultEditorKit.insertTabAction,
0155 "ctrl BACK_SLASH",
0156 "unselect"/*DefaultEditorKit.unselectAction*/,
0157 "ctrl HOME", DefaultEditorKit.beginAction,
0158 "ctrl END", DefaultEditorKit.endAction,
0159 "ctrl shift HOME",
0160 DefaultEditorKit.selectionBeginAction,
0161 "ctrl shift END",
0162 DefaultEditorKit.selectionEndAction, "ctrl T",
0163 "next-link-action", "ctrl shift T",
0164 "previous-link-action", "ctrl SPACE",
0165 "activate-link-action", "control shift O",
0166 "toggle-componentOrientation"/*DefaultEditorKit.toggleComponentOrientation*/
0167 });
0168 DEFAULT_VALUES.put("EditorPane.focusInputMap",
0169 multilineInputMap);
0170 DEFAULT_VALUES.put("TextArea.focusInputMap", multilineInputMap);
0171 DEFAULT_VALUES.put("TextPane.focusInputMap", multilineInputMap);
0172
0173 Object fieldInputMap = new UIDefaults.LazyInputMap(
0174 new Object[] { "ctrl C", DefaultEditorKit.copyAction,
0175 "ctrl V", DefaultEditorKit.pasteAction,
0176 "ctrl X", DefaultEditorKit.cutAction, "COPY",
0177 DefaultEditorKit.copyAction, "PASTE",
0178 DefaultEditorKit.pasteAction, "CUT",
0179 DefaultEditorKit.cutAction, "control INSERT",
0180 DefaultEditorKit.copyAction, "shift INSERT",
0181 DefaultEditorKit.pasteAction, "shift DELETE",
0182 DefaultEditorKit.cutAction, "shift LEFT",
0183 DefaultEditorKit.selectionBackwardAction,
0184 "shift KP_LEFT",
0185 DefaultEditorKit.selectionBackwardAction,
0186 "shift RIGHT",
0187 DefaultEditorKit.selectionForwardAction,
0188 "shift KP_RIGHT",
0189 DefaultEditorKit.selectionForwardAction,
0190 "ctrl LEFT",
0191 DefaultEditorKit.previousWordAction,
0192 "ctrl KP_LEFT",
0193 DefaultEditorKit.previousWordAction,
0194 "ctrl RIGHT", DefaultEditorKit.nextWordAction,
0195 "ctrl KP_RIGHT",
0196 DefaultEditorKit.nextWordAction,
0197 "ctrl shift LEFT",
0198 DefaultEditorKit.selectionPreviousWordAction,
0199 "ctrl shift KP_LEFT",
0200 DefaultEditorKit.selectionPreviousWordAction,
0201 "ctrl shift RIGHT",
0202 DefaultEditorKit.selectionNextWordAction,
0203 "ctrl shift KP_RIGHT",
0204 DefaultEditorKit.selectionNextWordAction,
0205 "ctrl A", DefaultEditorKit.selectAllAction,
0206 "HOME", DefaultEditorKit.beginLineAction,
0207 "END", DefaultEditorKit.endLineAction,
0208 "shift HOME",
0209 DefaultEditorKit.selectionBeginLineAction,
0210 "shift END",
0211 DefaultEditorKit.selectionEndLineAction,
0212 "BACK_SPACE",
0213 DefaultEditorKit.deletePrevCharAction,
0214 "shift BACK_SPACE",
0215 DefaultEditorKit.deletePrevCharAction,
0216 "ctrl H",
0217 DefaultEditorKit.deletePrevCharAction,
0218 "DELETE",
0219 DefaultEditorKit.deleteNextCharAction,
0220 "ctrl DELETE",
0221 DefaultEditorKit.deleteNextWordAction,
0222 "ctrl BACK_SPACE",
0223 DefaultEditorKit.deletePrevWordAction, "RIGHT",
0224 DefaultEditorKit.forwardAction, "LEFT",
0225 DefaultEditorKit.backwardAction, "KP_RIGHT",
0226 DefaultEditorKit.forwardAction, "KP_LEFT",
0227 DefaultEditorKit.backwardAction, "ENTER",
0228 JTextField.notifyAction, "ctrl BACK_SLASH",
0229 "unselect"/*DefaultEditorKit.unselectAction*/,
0230 "control shift O",
0231 "toggle-componentOrientation"/*DefaultEditorKit.toggleComponentOrientation*/
0232 });
0233 DEFAULT_VALUES.put("TextField.focusInputMap", fieldInputMap);
0234 DEFAULT_VALUES
0235 .put("PasswordField.focusInputMap", fieldInputMap);
0236
0237 DEFAULT_VALUES.put("ComboBox.ancestorInputMap",
0238 new UIDefaults.LazyInputMap(new Object[] { "ESCAPE",
0239 "hidePopup", "PAGE_UP", "pageUpPassThrough",
0240 "PAGE_DOWN", "pageDownPassThrough", "HOME",
0241 "homePassThrough", "END", "endPassThrough",
0242 "DOWN", "selectNext", "KP_DOWN", "selectNext",
0243 "alt DOWN", "togglePopup", "alt KP_DOWN",
0244 "togglePopup", "alt UP", "togglePopup",
0245 "alt KP_UP", "togglePopup", "SPACE",
0246 "spacePopup", "ENTER", "enterPressed", "UP",
0247 "selectPrevious", "KP_UP", "selectPrevious" }));
0248
0249 DEFAULT_VALUES.put("Desktop.ancestorInputMap",
0250 new UIDefaults.LazyInputMap(new Object[] { "ctrl F5",
0251 "restore", "ctrl F4", "close", "ctrl F7",
0252 "move", "ctrl F8", "resize", "RIGHT", "right",
0253 "KP_RIGHT", "right", "shift RIGHT",
0254 "shrinkRight", "shift KP_RIGHT", "shrinkRight",
0255 "LEFT", "left", "KP_LEFT", "left",
0256 "shift LEFT", "shrinkLeft", "shift KP_LEFT",
0257 "shrinkLeft", "UP", "up", "KP_UP", "up",
0258 "shift UP", "shrinkUp", "shift KP_UP",
0259 "shrinkUp", "DOWN", "down", "KP_DOWN", "down",
0260 "shift DOWN", "shrinkDown", "shift KP_DOWN",
0261 "shrinkDown", "ESCAPE", "escape", "ctrl F9",
0262 "minimize", "ctrl F10", "maximize", "ctrl F6",
0263 "selectNextFrame", "ctrl TAB",
0264 "selectNextFrame", "ctrl alt F6",
0265 "selectNextFrame", "shift ctrl alt F6",
0266 "selectPreviousFrame", "ctrl F12",
0267 "navigateNext", "shift ctrl F12",
0268 "navigatePrevious" }));
0269
0270 DEFAULT_VALUES.put("FileChooser.ancestorInputMap",
0271 new UIDefaults.LazyInputMap(new Object[] { "ESCAPE",
0272 "cancelSelection", "F2", "editFileName", "F5",
0273 "refresh", "BACK_SPACE", "Go Up", "ENTER",
0274 "approveSelection", "ctrl ENTER",
0275 "approveSelection" }));
0276
0277 DEFAULT_VALUES.put("FormattedTextField.focusInputMap",
0278 new UIDefaults.LazyInputMap(new Object[] { "ctrl C",
0279 DefaultEditorKit.copyAction, "ctrl V",
0280 DefaultEditorKit.pasteAction, "ctrl X",
0281 DefaultEditorKit.cutAction, "COPY",
0282 DefaultEditorKit.copyAction, "PASTE",
0283 DefaultEditorKit.pasteAction, "CUT",
0284 DefaultEditorKit.cutAction, "control INSERT",
0285 DefaultEditorKit.copyAction, "shift INSERT",
0286 DefaultEditorKit.pasteAction, "shift DELETE",
0287 DefaultEditorKit.cutAction, "shift LEFT",
0288 DefaultEditorKit.selectionBackwardAction,
0289 "shift KP_LEFT",
0290 DefaultEditorKit.selectionBackwardAction,
0291 "shift RIGHT",
0292 DefaultEditorKit.selectionForwardAction,
0293 "shift KP_RIGHT",
0294 DefaultEditorKit.selectionForwardAction,
0295 "ctrl LEFT",
0296 DefaultEditorKit.previousWordAction,
0297 "ctrl KP_LEFT",
0298 DefaultEditorKit.previousWordAction,
0299 "ctrl RIGHT", DefaultEditorKit.nextWordAction,
0300 "ctrl KP_RIGHT",
0301 DefaultEditorKit.nextWordAction,
0302 "ctrl shift LEFT",
0303 DefaultEditorKit.selectionPreviousWordAction,
0304 "ctrl shift KP_LEFT",
0305 DefaultEditorKit.selectionPreviousWordAction,
0306 "ctrl shift RIGHT",
0307 DefaultEditorKit.selectionNextWordAction,
0308 "ctrl shift KP_RIGHT",
0309 DefaultEditorKit.selectionNextWordAction,
0310 "ctrl A", DefaultEditorKit.selectAllAction,
0311 "HOME", DefaultEditorKit.beginLineAction,
0312 "END", DefaultEditorKit.endLineAction,
0313 "shift HOME",
0314 DefaultEditorKit.selectionBeginLineAction,
0315 "shift END",
0316 DefaultEditorKit.selectionEndLineAction,
0317 "BACK_SPACE",
0318 DefaultEditorKit.deletePrevCharAction,
0319 "shift BACK_SPACE",
0320 DefaultEditorKit.deletePrevCharAction,
0321 "ctrl H",
0322 DefaultEditorKit.deletePrevCharAction,
0323 "DELETE",
0324 DefaultEditorKit.deleteNextCharAction,
0325 "ctrl DELETE",
0326 DefaultEditorKit.deleteNextWordAction,
0327 "ctrl BACK_SPACE",
0328 DefaultEditorKit.deletePrevWordAction, "RIGHT",
0329 DefaultEditorKit.forwardAction, "LEFT",
0330 DefaultEditorKit.backwardAction, "KP_RIGHT",
0331 DefaultEditorKit.forwardAction, "KP_LEFT",
0332 DefaultEditorKit.backwardAction, "ENTER",
0333 JTextField.notifyAction, "ctrl BACK_SLASH",
0334 "unselect", "control shift O",
0335 "toggle-componentOrientation", "ESCAPE",
0336 "reset-field-edit", "UP", "increment", "KP_UP",
0337 "increment", "DOWN", "decrement", "KP_DOWN",
0338 "decrement", }));
0339
0340 DEFAULT_VALUES.put("InternalFrame.icon", LookAndFeel.makeIcon(
0341 BasicLookAndFeel.class, "icons/JavaCup16.png"));
0342
0343 DEFAULT_VALUES.put("InternalFrame.windowBindings",
0344 new Object[] { "shift ESCAPE", "showSystemMenu",
0345 "ctrl SPACE", "showSystemMenu", "ESCAPE",
0346 "hideSystemMenu" });
0347
0348 DEFAULT_VALUES.put("List.focusInputMap",
0349 new UIDefaults.LazyInputMap(new Object[] { "ctrl C",
0350 "copy", "ctrl V", "paste", "ctrl X", "cut",
0351 "COPY", "copy", "PASTE", "paste", "CUT", "cut",
0352 "control INSERT", "copy", "shift INSERT",
0353 "paste", "shift DELETE", "cut", "UP",
0354 "selectPreviousRow", "KP_UP",
0355 "selectPreviousRow", "shift UP",
0356 "selectPreviousRowExtendSelection",
0357 "shift KP_UP",
0358 "selectPreviousRowExtendSelection",
0359 "ctrl shift UP",
0360 "selectPreviousRowExtendSelection",
0361 "ctrl shift KP_UP",
0362 "selectPreviousRowExtendSelection", "ctrl UP",
0363 "selectPreviousRowChangeLead", "ctrl KP_UP",
0364 "selectPreviousRowChangeLead", "DOWN",
0365 "selectNextRow", "KP_DOWN", "selectNextRow",
0366 "shift DOWN", "selectNextRowExtendSelection",
0367 "shift KP_DOWN",
0368 "selectNextRowExtendSelection",
0369 "ctrl shift DOWN",
0370 "selectNextRowExtendSelection",
0371 "ctrl shift KP_DOWN",
0372 "selectNextRowExtendSelection", "ctrl DOWN",
0373 "selectNextRowChangeLead", "ctrl KP_DOWN",
0374 "selectNextRowChangeLead", "LEFT",
0375 "selectPreviousColumn", "KP_LEFT",
0376 "selectPreviousColumn", "shift LEFT",
0377 "selectPreviousColumnExtendSelection",
0378 "shift KP_LEFT",
0379 "selectPreviousColumnExtendSelection",
0380 "ctrl shift LEFT",
0381 "selectPreviousColumnExtendSelection",
0382 "ctrl shift KP_LEFT",
0383 "selectPreviousColumnExtendSelection",
0384 "ctrl LEFT", "selectPreviousColumnChangeLead",
0385 "ctrl KP_LEFT",
0386 "selectPreviousColumnChangeLead", "RIGHT",
0387 "selectNextColumn", "KP_RIGHT",
0388 "selectNextColumn", "shift RIGHT",
0389 "selectNextColumnExtendSelection",
0390 "shift KP_RIGHT",
0391 "selectNextColumnExtendSelection",
0392 "ctrl shift RIGHT",
0393 "selectNextColumnExtendSelection",
0394 "ctrl shift KP_RIGHT",
0395 "selectNextColumnExtendSelection",
0396 "ctrl RIGHT", "selectNextColumnChangeLead",
0397 "ctrl KP_RIGHT", "selectNextColumnChangeLead",
0398 "HOME", "selectFirstRow", "shift HOME",
0399 "selectFirstRowExtendSelection",
0400 "ctrl shift HOME",
0401 "selectFirstRowExtendSelection", "ctrl HOME",
0402 "selectFirstRowChangeLead", "END",
0403 "selectLastRow", "shift END",
0404 "selectLastRowExtendSelection",
0405 "ctrl shift END",
0406 "selectLastRowExtendSelection", "ctrl END",
0407 "selectLastRowChangeLead", "PAGE_UP",
0408 "scrollUp", "shift PAGE_UP",
0409 "scrollUpExtendSelection",
0410 "ctrl shift PAGE_UP",
0411 "scrollUpExtendSelection", "ctrl PAGE_UP",
0412 "scrollUpChangeLead", "PAGE_DOWN",
0413 "scrollDown", "shift PAGE_DOWN",
0414 "scrollDownExtendSelection",
0415 "ctrl shift PAGE_DOWN",
0416 "scrollDownExtendSelection", "ctrl PAGE_DOWN",
0417 "scrollDownChangeLead", "ctrl A", "selectAll",
0418 "ctrl SLASH", "selectAll", "ctrl BACK_SLASH",
0419 "clearSelection", "SPACE", "addToSelection",
0420 "ctrl SPACE", "toggleAndAnchor", "shift SPACE",
0421 "extendTo", "ctrl shift SPACE",
0422 "moveSelectionTo" }));
0423
0424 DEFAULT_VALUES.put("List.focusInputMap.RightToLeft",
0425 new UIDefaults.LazyInputMap(new Object[] { "LEFT",
0426 "selectNextColumn", "KP_LEFT",
0427 "selectNextColumn", "shift LEFT",
0428 "selectNextColumnExtendSelection",
0429 "shift KP_LEFT",
0430 "selectNextColumnExtendSelection",
0431 "ctrl shift LEFT",
0432 "selectNextColumnExtendSelection",
0433 "ctrl shift KP_LEFT",
0434 "selectNextColumnExtendSelection", "ctrl LEFT",
0435 "selectNextColumnChangeLead", "ctrl KP_LEFT",
0436 "selectNextColumnChangeLead", "RIGHT",
0437 "selectPreviousColumn", "KP_RIGHT",
0438 "selectPreviousColumn", "shift RIGHT",
0439 "selectPreviousColumnExtendSelection",
0440 "shift KP_RIGHT",
0441 "selectPreviousColumnExtendSelection",
0442 "ctrl shift RIGHT",
0443 "selectPreviousColumnExtendSelection",
0444 "ctrl shift KP_RIGHT",
0445 "selectPreviousColumnExtendSelection",
0446 "ctrl RIGHT", "selectPreviousColumnChangeLead",
0447 "ctrl KP_RIGHT",
0448 "selectPreviousColumnChangeLead", }));
0449
0450 DEFAULT_VALUES.put("MenuBar.windowBindings", new Object[] {
0451 "F10", "takeFocus" });
0452
0453 DEFAULT_VALUES.put("OptionPane.windowBindings", new Object[] {
0454 "ESCAPE", "close" });
0455
0456 DEFAULT_VALUES.put("RootPane.defaultButtonWindowKeyBindings",
0457 new Object[] { "ENTER", "press", "released ENTER",
0458 "release", "ctrl ENTER", "press",
0459 "ctrl released ENTER", "release" });
0460
0461 DEFAULT_VALUES.put("RootPane.ancestorInputMap",
0462 new UIDefaults.LazyInputMap(new Object[] { "shift F10",
0463 "postPopup" }));
0464
0465 DEFAULT_VALUES.put("ScrollBar.anecstorInputMap",
0466 new UIDefaults.LazyInputMap(new Object[] { "RIGHT",
0467 "positiveUnitIncrement", "KP_RIGHT",
0468 "positiveUnitIncrement", "DOWN",
0469 "positiveUnitIncrement", "KP_DOWN",
0470 "positiveUnitIncrement", "PAGE_DOWN",
0471 "positiveBlockIncrement", "LEFT",
0472 "negativeUnitIncrement", "KP_LEFT",
0473 "negativeUnitIncrement", "UP",
0474 "negativeUnitIncrement", "KP_UP",
0475 "negativeUnitIncrement", "PAGE_UP",
0476 "negativeBlockIncrement", "HOME", "minScroll",
0477 "END", "maxScroll" }));
0478
0479 DEFAULT_VALUES.put("ScrollBar.ancestorInputMap.RightToLeft",
0480 new UIDefaults.LazyInputMap(new Object[] { "RIGHT",
0481 "negativeUnitIncrement", "KP_RIGHT",
0482 "negativeUnitIncrement", "LEFT",
0483 "positiveUnitIncrement", "KP_LEFT",
0484 "positiveUnitIncrement", }));
0485
0486 DEFAULT_VALUES.put("ScrollPane.ancestorInputMap",
0487 new UIDefaults.LazyInputMap(new Object[] { "RIGHT",
0488 "unitScrollRight", "KP_RIGHT",
0489 "unitScrollRight", "DOWN", "unitScrollDown",
0490 "KP_DOWN", "unitScrollDown", "LEFT",
0491 "unitScrollLeft", "KP_LEFT", "unitScrollLeft",
0492 "UP", "unitScrollUp", "KP_UP", "unitScrollUp",
0493 "PAGE_UP", "scrollUp", "PAGE_DOWN",
0494 "scrollDown", "ctrl PAGE_UP", "scrollLeft",
0495 "ctrl PAGE_DOWN", "scrollRight", "ctrl HOME",
0496 "scrollHome", "ctrl END", "scrollEnd" }));
0497 DEFAULT_VALUES.put("ScrollPane.ancestorInputMap.RightToLeft",
0498 new UIDefaults.LazyInputMap(new Object[] {
0499 "ctrl PAGE_UP", "scrollRight",
0500 "ctrl PAGE_DOWN", "scrollLeft", }));
0501
0502 DEFAULT_VALUES.put("SplitPane.ancestorInputMap",
0503 new UIDefaults.LazyInputMap(new Object[] { "UP",
0504 "negativeIncrement", "DOWN",
0505 "positiveIncrement", "LEFT",
0506 "negativeIncrement", "RIGHT",
0507 "positiveIncrement", "KP_UP",
0508 "negativeIncrement", "KP_DOWN",
0509 "positiveIncrement", "KP_LEFT",
0510 "negativeIncrement", "KP_RIGHT",
0511 "positiveIncrement", "HOME", "selectMin",
0512 "END", "selectMax", "F8", "startResize", "F6",
0513 "toggleFocus", "ctrl TAB", "focusOutForward",
0514 "ctrl shift TAB", "focusOutBackward" }));
0515
0516 DEFAULT_VALUES.put("Spinner.ancestorInputMap",
0517 new UIDefaults.LazyInputMap(new Object[] { "UP",
0518 "increment", "KP_UP", "increment", "DOWN",
0519 "decrement", "KP_DOWN", "decrement" }));
0520
0521 DEFAULT_VALUES.put("Slider.focusInputMap",
0522 new UIDefaults.LazyInputMap(new Object[] { "RIGHT",
0523 "positiveUnitIncrement", "KP_RIGHT",
0524 "positiveUnitIncrement", "DOWN",
0525 "negativeUnitIncrement", "KP_DOWN",
0526 "negativeUnitIncrement", "PAGE_DOWN",
0527 "negativeBlockIncrement", "ctrl PAGE_DOWN",
0528 "negativeBlockIncrement", "LEFT",
0529 "negativeUnitIncrement", "KP_LEFT",
0530 "negativeUnitIncrement", "UP",
0531 "positiveUnitIncrement", "KP_UP",
0532 "positiveUnitIncrement", "PAGE_UP",
0533 "positiveBlockIncrement", "ctrl PAGE_UP",
0534 "positiveBlockIncrement", "HOME", "minScroll",
0535 "END", "maxScroll" }));
0536
0537 DEFAULT_VALUES.put("Slider.focusInputMap.RightToLeft",
0538 new UIDefaults.LazyInputMap(new Object[] { "RIGHT",
0539 "negativeUnitIncrement", "KP_RIGHT",
0540 "negativeUnitIncrement", "LEFT",
0541 "positiveUnitIncrement", "KP_LEFT",
0542 "positiveUnitIncrement", }));
0543
0544 DEFAULT_VALUES
0545 .put("TabbedPane.ancestorInputMap",
0546 new UIDefaults.LazyInputMap(new Object[] {
0547 "ctrl PAGE_DOWN", "navigatePageDown",
0548 "ctrl PAGE_UP", "navigatePageUp",
0549 "ctrl UP", "requestFocus",
0550 "ctrl KP_UP", "requestFocus", }));
0551
0552 DEFAULT_VALUES.put("TabbedPane.focusInputMap",
0553 new UIDefaults.LazyInputMap(new Object[] { "RIGHT",
0554 "navigateRight", "KP_RIGHT", "navigateRight",
0555 "LEFT", "navigateLeft", "KP_LEFT",
0556 "navigateLeft", "UP", "navigateUp", "KP_UP",
0557 "navigateUp", "DOWN", "navigateDown",
0558 "KP_DOWN", "navigateDown", "ctrl DOWN",
0559 "requestFocusForVisibleComponent",
0560 "ctrl KP_DOWN",
0561 "requestFocusForVisibleComponent", }));
0562
0563 DEFAULT_VALUES.put("Table.ancestorInputMap",
0564 new UIDefaults.LazyInputMap(new Object[] { "ctrl C",
0565 "copy", "ctrl V", "paste", "ctrl X", "cut",
0566 "COPY", "copy", "PASTE", "paste", "CUT", "cut",
0567 "control INSERT", "copy", "shift INSERT",
0568 "paste", "shift DELETE", "cut", "RIGHT",
0569 "selectNextColumn", "KP_RIGHT",
0570 "selectNextColumn", "shift RIGHT",
0571 "selectNextColumnExtendSelection",
0572 "shift KP_RIGHT",
0573 "selectNextColumnExtendSelection",
0574 "ctrl shift RIGHT",
0575 "selectNextColumnExtendSelection",
0576 "ctrl shift KP_RIGHT",
0577 "selectNextColumnExtendSelection",
0578 "ctrl RIGHT", "selectNextColumnChangeLead",
0579 "ctrl KP_RIGHT", "selectNextColumnChangeLead",
0580 "LEFT", "selectPreviousColumn", "KP_LEFT",
0581 "selectPreviousColumn", "shift LEFT",
0582 "selectPreviousColumnExtendSelection",
0583 "shift KP_LEFT",
0584 "selectPreviousColumnExtendSelection",
0585 "ctrl shift LEFT",
0586 "selectPreviousColumnExtendSelection",
0587 "ctrl shift KP_LEFT",
0588 "selectPreviousColumnExtendSelection",
0589 "ctrl LEFT", "selectPreviousColumnChangeLead",
0590 "ctrl KP_LEFT",
0591 "selectPreviousColumnChangeLead", "DOWN",
0592 "selectNextRow", "KP_DOWN", "selectNextRow",
0593 "shift DOWN", "selectNextRowExtendSelection",
0594 "shift KP_DOWN",
0595 "selectNextRowExtendSelection",
0596 "ctrl shift DOWN",
0597 "selectNextRowExtendSelection",
0598 "ctrl shift KP_DOWN",
0599 "selectNextRowExtendSelection", "ctrl DOWN",
0600 "selectNextRowChangeLead", "ctrl KP_DOWN",
0601 "selectNextRowChangeLead", "UP",
0602 "selectPreviousRow", "KP_UP",
0603 "selectPreviousRow", "shift UP",
0604 "selectPreviousRowExtendSelection",
0605 "shift KP_UP",
0606 "selectPreviousRowExtendSelection",
0607 "ctrl shift UP",
0608 "selectPreviousRowExtendSelection",
0609 "ctrl shift KP_UP",
0610 "selectPreviousRowExtendSelection", "ctrl UP",
0611 "selectPreviousRowChangeLead", "ctrl KP_UP",
0612 "selectPreviousRowChangeLead", "HOME",
0613 "selectFirstColumn", "shift HOME",
0614 "selectFirstColumnExtendSelection",
0615 "ctrl shift HOME",
0616 "selectFirstRowExtendSelection", "ctrl HOME",
0617 "selectFirstRow", "END", "selectLastColumn",
0618 "shift END", "selectLastColumnExtendSelection",
0619 "ctrl shift END",
0620 "selectLastRowExtendSelection", "ctrl END",
0621 "selectLastRow", "PAGE_UP",
0622 "scrollUpChangeSelection", "shift PAGE_UP",
0623 "scrollUpExtendSelection",
0624 "ctrl shift PAGE_UP",
0625 "scrollLeftExtendSelection", "ctrl PAGE_UP",
0626 "scrollLeftChangeSelection", "PAGE_DOWN",
0627 "scrollDownChangeSelection", "shift PAGE_DOWN",
0628 "scrollDownExtendSelection",
0629 "ctrl shift PAGE_DOWN",
0630 "scrollRightExtendSelection", "ctrl PAGE_DOWN",
0631 "scrollRightChangeSelection", "TAB",
0632 "selectNextColumnCell", "shift TAB",
0633 "selectPreviousColumnCell", "ENTER",
0634 "selectNextRowCell", "shift ENTER",
0635 "selectPreviousRowCell", "ctrl A", "selectAll",
0636 "ctrl SLASH", "selectAll", "ctrl BACK_SLASH",
0637 "clearSelection", "ESCAPE", "cancel", "F2",
0638 "startEditing", "SPACE", "addToSelection",
0639 "ctrl SPACE", "toggleAndAnchor", "shift SPACE",
0640 "extendTo", "ctrl shift SPACE",
0641 "moveSelectionTo", "F8", "focusHeader" }));
0642
0643 DEFAULT_VALUES.put("TableHeader.ancestorInputMap",
0644 new UIDefaults.LazyInputMap(new Object[] { "SPACE",
0645 "toggleSortOrder", "LEFT",
0646 "selectColumnToLeft", "KP_LEFT",
0647 "selectColumnToLeft", "RIGHT",
0648 "selectColumnToRight", "KP_RIGHT",
0649 "selectColumnToRight", "alt LEFT",
0650 "moveColumnLeft", "alt KP_LEFT",
0651 "moveColumnLeft", "alt RIGHT",
0652 "moveColumnRight", "alt KP_RIGHT",
0653 "moveColumnRight", "alt shift LEFT",
0654 "resizeLeft", "alt shift KP_LEFT",
0655 "resizeLeft", "alt shift RIGHT", "resizeRight",
0656 "alt shift KP_RIGHT", "resizeRight", "ESCAPE",
0657 "focusTable", }));
0658
0659 DEFAULT_VALUES.put("Tree.ancestorInputMap",
0660 new UIDefaults.LazyInputMap(new Object[] { "ESCAPE",
0661 "cancel" }));
0662 DEFAULT_VALUES.put("Tree.focusInputMap",
0663 new UIDefaults.LazyInputMap(new Object[] { "ADD",
0664 "expand", "SUBTRACT", "collapse", "ctrl C",
0665 "copy", "ctrl V", "paste", "ctrl X", "cut",
0666 "COPY", "copy", "PASTE", "paste", "CUT", "cut",
0667 "control INSERT", "copy", "shift INSERT",
0668 "paste", "shift DELETE", "cut", "UP",
0669 "selectPrevious", "KP_UP", "selectPrevious",
0670 "shift UP", "selectPreviousExtendSelection",
0671 "shift KP_UP", "selectPreviousExtendSelection",
0672 "ctrl shift UP",
0673 "selectPreviousExtendSelection",
0674 "ctrl shift KP_UP",
0675 "selectPreviousExtendSelection", "ctrl UP",
0676 "selectPreviousChangeLead", "ctrl KP_UP",
0677 "selectPreviousChangeLead", "DOWN",
0678 "selectNext", "KP_DOWN", "selectNext",
0679 "shift DOWN", "selectNextExtendSelection",
0680 "shift KP_DOWN", "selectNextExtendSelection",
0681 "ctrl shift DOWN", "selectNextExtendSelection",
0682 "ctrl shift KP_DOWN",
0683 "selectNextExtendSelection", "ctrl DOWN",
0684 "selectNextChangeLead", "ctrl KP_DOWN",
0685 "selectNextChangeLead", "RIGHT", "selectChild",
0686 "KP_RIGHT", "selectChild", "LEFT",
0687 "selectParent", "KP_LEFT", "selectParent",
0688 "PAGE_UP", "scrollUpChangeSelection",
0689 "shift PAGE_UP", "scrollUpExtendSelection",
0690 "ctrl shift PAGE_UP",
0691 "scrollUpExtendSelection", "ctrl PAGE_UP",
0692 "scrollUpChangeLead", "PAGE_DOWN",
0693 "scrollDownChangeSelection", "shift PAGE_DOWN",
0694 "scrollDownExtendSelection",
0695 "ctrl shift PAGE_DOWN",
0696 "scrollDownExtendSelection", "ctrl PAGE_DOWN",
0697 "scrollDownChangeLead", "HOME", "selectFirst",
0698 "shift HOME", "selectFirstExtendSelection",
0699 "ctrl shift HOME",
0700 "selectFirstExtendSelection", "ctrl HOME",
0701 "selectFirstChangeLead", "END", "selectLast",
0702 "shift END", "selectLastExtendSelection",
0703 "ctrl shift END", "selectLastExtendSelection",
0704 "ctrl END", "selectLastChangeLead", "F2",
0705 "startEditing", "ctrl A", "selectAll",
0706 "ctrl SLASH", "selectAll", "ctrl BACK_SLASH",
0707 "clearSelection", "ctrl LEFT", "scrollLeft",
0708 "ctrl KP_LEFT", "scrollLeft", "ctrl RIGHT",
0709 "scrollRight", "ctrl KP_RIGHT", "scrollRight",
0710 "SPACE", "addToSelection", "ctrl SPACE",
0711 "toggleAndAnchor", "shift SPACE", "extendTo",
0712 "ctrl shift SPACE", "moveSelectionTo" }));
0713 DEFAULT_VALUES.put("Tree.focusInputMap.RightToLeft",
0714 new UIDefaults.LazyInputMap(new Object[] { "RIGHT",
0715 "selectParent", "KP_RIGHT", "selectParent",
0716 "LEFT", "selectChild", "KP_LEFT",
0717 "selectChild", }));
0718 }
0719
0720 /**
0721 * Returns the default value for the specified property, or null if there
0722 * is no default for the specified value.
0723 */
0724 private static Object getDefaultValue(Object key) {
0725 synchronized (SynthStyle.class) {
0726 if (DEFAULT_VALUES == null) {
0727 DEFAULT_VALUES = new HashMap();
0728 populateDefaultValues();
0729 }
0730 Object value = DEFAULT_VALUES.get(key);
0731 if (value instanceof UIDefaults.LazyValue) {
0732 value = ((UIDefaults.LazyValue) value)
0733 .createValue(null);
0734 DEFAULT_VALUES.put(key, value);
0735 }
0736 return value;
0737 }
0738 }
0739
0740 /**
0741 * Constructs a SynthStyle.
0742 */
0743 public SynthStyle() {
0744 }
0745
0746 /**
0747 * Returns the <code>SynthGraphicUtils</code> for the specified context.
0748 *
0749 * @param context SynthContext identifying requester
0750 * @return SynthGraphicsUtils
0751 */
0752 public SynthGraphicsUtils getGraphicsUtils(SynthContext context) {
0753 return SYNTH_GRAPHICS;
0754 }
0755
0756 /**
0757 * Returns the color for the specified state. This gives precedence to
0758 * foreground and background of the <code>JComponent</code>. If the
0759 * <code>Color</code> from the <code>JComponent</code> is not appropriate,
0760 * or not used, this will invoke <code>getColorForState</code>. Subclasses
0761 * should generally not have to override this, instead override
0762 * {@link #getColorForState}.
0763 *
0764 * @param context SynthContext identifying requester
0765 * @param type Type of color being requested.
0766 * @return Color
0767 */
0768 public Color getColor(SynthContext context, ColorType type) {
0769 JComponent c = context.getComponent();
0770 Region id = context.getRegion();
0771 int cs = context.getComponentState();
0772 // For the enabled state, prefer the widget's colors
0773 if (!id.isSubregion() && cs == SynthConstants.ENABLED) {
0774 if (type == ColorType.BACKGROUND) {
0775 return c.getBackground();
0776 } else if (type == ColorType.FOREGROUND) {
0777 return c.getForeground();
0778 } else if (type == ColorType.TEXT_FOREGROUND) {
0779 // If getForeground returns a non-UIResource it means the
0780 // developer has explicitly set the foreground, use it over
0781 // that of TEXT_FOREGROUND as that is typically the expected
0782 // behavior.
0783 Color color = c.getForeground();
0784 if (!(color instanceof UIResource)) {
0785 return color;
0786 }
0787 }
0788 }
0789 // Then use what we've locally defined
0790 Color color = getColorForState(context, type);
0791 if (color == null) {
0792 // No color, fallback to that of the widget.
0793 if (type == ColorType.BACKGROUND
0794 || type == ColorType.TEXT_BACKGROUND) {
0795 return c.getBackground();
0796 } else if (type == ColorType.FOREGROUND
0797 || type == ColorType.TEXT_FOREGROUND) {
0798 return c.getForeground();
0799 }
0800 }
0801 return color;
0802 }
0803
0804 /**
0805 * Returns the color for the specified state. This should NOT call any
0806 * methods on the <code>JComponent</code>.
0807 *
0808 * @param context SynthContext identifying requester
0809 * @param type Type of color being requested.
0810 * @return Color to render with
0811 */
0812 protected abstract Color getColorForState(SynthContext context,
0813 ColorType type);
0814
0815 /**
0816 * Returns the Font for the specified state. This redirects to the
0817 * <code>JComponent</code> from the <code>context</code> as necessary.
0818 * If this does not redirect
0819 * to the JComponent {@link #getFontForState} is invoked.
0820 *
0821 * @param context SynthContext identifying requester
0822 * @return Font to render with
0823 */
0824 public Font getFont(SynthContext context) {
0825 JComponent c = context.getComponent();
0826 if (context.getComponentState() == SynthConstants.ENABLED) {
0827 return c.getFont();
0828 }
0829 Font cFont = c.getFont();
0830 if (cFont != null && !(cFont instanceof UIResource)) {
0831 return cFont;
0832 }
0833 return getFontForState(context);
0834 }
0835
0836 /**
0837 * Returns the font for the specified state. This should NOT call any
0838 * method on the <code>JComponent</code>.
0839 *
0840 * @param context SynthContext identifying requester
0841 * @return Font to render with
0842 */
0843 protected abstract Font getFontForState(SynthContext context);
0844
0845 /**
0846 * Returns the Insets that are used to calculate sizing information.
0847 *
0848 * @param context SynthContext identifying requester
0849 * @param insets Insets to place return value in.
0850 * @return Sizing Insets.
0851 */
0852 public Insets getInsets(SynthContext context, Insets insets) {
0853 if (insets == null) {
0854 insets = new Insets(0, 0, 0, 0);
0855 }
0856 insets.top = insets.bottom = insets.left = insets.right = 0;
0857 return insets;
0858 }
0859
0860 /**
0861 * Returns the <code>SynthPainter</code> that will be used for painting.
0862 * This may return null.
0863 *
0864 * @param context SynthContext identifying requester
0865 * @return SynthPainter to use
0866 */
0867 public SynthPainter getPainter(SynthContext context) {
0868 return null;
0869 }
0870
0871 /**
0872 * Returns true if the region is opaque.
0873 *
0874 * @param context SynthContext identifying requester
0875 * @return true if region is opaque.
0876 */
0877 public boolean isOpaque(SynthContext context) {
0878 return true;
0879 }
0880
0881 /**
0882 * Getter for a region specific style property.
0883 *
0884 * @param context SynthContext identifying requester
0885 * @param key Property being requested.
0886 * @return Value of the named property
0887 */
0888 public Object get(SynthContext context, Object key) {
0889 return getDefaultValue(key);
0890 }
0891
0892 void installDefaults(SynthContext context, SynthUI ui) {
0893 // Special case the Border as this will likely change when the LAF
0894 // can have more control over this.
0895 if (!context.isSubregion()) {
0896 JComponent c = context.getComponent();
0897 Border border = c.getBorder();
0898
0899 if (border == null || border instanceof UIResource) {
0900 c.setBorder(new SynthBorder(ui,
0901 getInsets(context, null)));
0902 }
0903 }
0904 installDefaults(context);
0905 }
0906
0907 /**
0908 * Installs the necessary state from this Style on the
0909 * <code>JComponent</code> from <code>context</code>.
0910 *
0911 * @param context SynthContext identifying component to install properties
0912 * to.
0913 */
0914 public void installDefaults(SynthContext context) {
0915 if (!context.isSubregion()) {
0916 JComponent c = context.getComponent();
0917 Region region = context.getRegion();
0918 Font font = c.getFont();
0919
0920 if (font == null || (font instanceof UIResource)) {
0921 c.setFont(getFontForState(context));
0922 }
0923 Color background = c.getBackground();
0924 if (background == null
0925 || (background instanceof UIResource)) {
0926 c.setBackground(getColorForState(context,
0927 ColorType.BACKGROUND));
0928 }
0929 Color foreground = c.getForeground();
0930 if (foreground == null
0931 || (foreground instanceof UIResource)) {
0932 c.setForeground(getColorForState(context,
0933 ColorType.FOREGROUND));
0934 }
0935 LookAndFeel.installProperty(c, "opaque", Boolean
0936 .valueOf(isOpaque(context)));
0937 }
0938 }
0939
0940 /**
0941 * Uninstalls any state that this style installed on
0942 * the <code>JComponent</code> from <code>context</code>.
0943 * <p>
0944 * Styles should NOT depend upon this being called, in certain cases
0945 * it may never be called.
0946 *
0947 * @param context SynthContext identifying component to install properties
0948 * to.
0949 */
0950 public void uninstallDefaults(SynthContext context) {
0951 if (!context.isSubregion()) {
0952 // NOTE: because getForeground, getBackground and getFont will look
0953 // at the parent Container, if we set them to null it may
0954 // mean we they return a non-null and non-UIResource value
0955 // preventing install from correctly settings its colors/font. For
0956 // this reason we do not uninstall the fg/bg/font.
0957
0958 JComponent c = context.getComponent();
0959 Border border = c.getBorder();
0960
0961 if (border instanceof UIResource) {
0962 c.setBorder(null);
0963 }
0964 }
0965 }
0966
0967 /**
0968 * Convenience method to get a specific style property whose value is
0969 * a <code>Number</code>. If the value is a <code>Number</code>,
0970 * <code>intValue</code> is returned, otherwise <code>defaultValue</code>
0971 * is returned.
0972 *
0973 * @param context SynthContext identifying requester
0974 * @param key Property being requested.
0975 * @param defaultValue Value to return if the property has not been
0976 * specified, or is not a Number
0977 * @return Value of the named property
0978 */
0979 public int getInt(SynthContext context, Object key, int defaultValue) {
0980 Object value = get(context, key);
0981
0982 if (value instanceof Number) {
0983 return ((Number) value).intValue();
0984 }
0985 return defaultValue;
0986 }
0987
0988 /**
0989 * Convenience method to get a specific style property whose value is
0990 * an Boolean.
0991 *
0992 * @param context SynthContext identifying requester
0993 * @param key Property being requested.
0994 * @param defaultValue Value to return if the property has not been
0995 * specified, or is not a Boolean
0996 * @return Value of the named property
0997 */
0998 public boolean getBoolean(SynthContext context, Object key,
0999 boolean defaultValue) {
1000 Object value = get(context, key);
1001
1002 if (value instanceof Boolean) {
1003 return ((Boolean) value).booleanValue();
1004 }
1005 return defaultValue;
1006 }
1007
1008 /**
1009 * Convenience method to get a specific style property whose value is
1010 * an Icon.
1011 *
1012 * @param context SynthContext identifying requester
1013 * @param key Property being requested.
1014 * @return Value of the named property, or null if not specified
1015 */
1016 public Icon getIcon(SynthContext context, Object key) {
1017 Object value = get(context, key);
1018
1019 if (value instanceof Icon) {
1020 return (Icon) value;
1021 }
1022 return null;
1023 }
1024
1025 /**
1026 * Convenience method to get a specific style property whose value is
1027 * a String.
1028 *
1029 * @param context SynthContext identifying requester
1030 * @param key Property being requested.
1031 * @param defaultValue Value to return if the property has not been
1032 * specified, or is not a String
1033 * @return Value of the named property
1034 */
1035 public String getString(SynthContext context, Object key,
1036 String defaultValue) {
1037 Object value = get(context, key);
1038
1039 if (value instanceof String) {
1040 return (String) value;
1041 }
1042 return defaultValue;
1043 }
1044 }
|