1. /*
  2. * @(#)SynthStyle.java 1.23 03/12/19
  3. *
  4. * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package javax.swing.plaf.synth;
  8. import java.awt.*;
  9. import javax.swing.*;
  10. import javax.swing.border.Border;
  11. import javax.swing.plaf.UIResource;
  12. import javax.swing.text.DefaultEditorKit;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15. import sun.swing.plaf.synth.SynthUI;
  16. /**
  17. * <code>SynthStyle</code> is a set of style properties.
  18. * Each <code>SynthUI</code> references at least one
  19. * <code>SynthStyle</code> that is obtained using a
  20. * <code>SynthStyleFactory</code>. You typically don't need to interact with
  21. * this class directly, rather you will load a
  22. * <a href="doc-files/synthFileFormat.html">Synth File Format file</a> into
  23. * <code>SynthLookAndFeel</code> that will create a set of SynthStyles.
  24. *
  25. * @see SynthLookAndFeel
  26. * @see SynthStyleFactory
  27. *
  28. * @version 1.23, 12/19/03
  29. * @since 1.5
  30. * @author Scott Violet
  31. */
  32. public abstract class SynthStyle {
  33. /**
  34. * Contains the default values for certain properties.
  35. */
  36. private static Map DEFAULT_VALUES;
  37. /**
  38. * Shared SynthGraphics.
  39. */
  40. private static final SynthGraphicsUtils SYNTH_GRAPHICS =
  41. new SynthGraphicsUtils();
  42. /**
  43. * Adds the default values that we know about to DEFAULT_VALUES.
  44. */
  45. private static void populateDefaultValues() {
  46. Object buttonMap = new UIDefaults.LazyInputMap(new Object[] {
  47. "SPACE", "pressed",
  48. "released SPACE", "released"
  49. });
  50. DEFAULT_VALUES.put("Button.focusInputMap", buttonMap);
  51. DEFAULT_VALUES.put("JCheckBox.focusInputMap", buttonMap);
  52. DEFAULT_VALUES.put("JRadioButton.focusInputMap", buttonMap);
  53. DEFAULT_VALUES.put("JToggleButton.focusInputMap", buttonMap);
  54. DEFAULT_VALUES.put("SynthArrowButton.focusInputMap", buttonMap);
  55. Object multilineInputMap = new UIDefaults.LazyInputMap(new Object[] {
  56. "ctrl C", DefaultEditorKit.copyAction,
  57. "ctrl V", DefaultEditorKit.pasteAction,
  58. "ctrl X", DefaultEditorKit.cutAction,
  59. "COPY", DefaultEditorKit.copyAction,
  60. "PASTE", DefaultEditorKit.pasteAction,
  61. "CUT", DefaultEditorKit.cutAction,
  62. "shift LEFT", DefaultEditorKit.selectionBackwardAction,
  63. "shift KP_LEFT", DefaultEditorKit.selectionBackwardAction,
  64. "shift RIGHT", DefaultEditorKit.selectionForwardAction,
  65. "shift KP_RIGHT", DefaultEditorKit.selectionForwardAction,
  66. "ctrl LEFT", DefaultEditorKit.previousWordAction,
  67. "ctrl KP_LEFT", DefaultEditorKit.previousWordAction,
  68. "ctrl RIGHT", DefaultEditorKit.nextWordAction,
  69. "ctrl KP_RIGHT", DefaultEditorKit.nextWordAction,
  70. "ctrl shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
  71. "ctrl shift KP_LEFT", DefaultEditorKit.selectionPreviousWordAction,
  72. "ctrl shift RIGHT", DefaultEditorKit.selectionNextWordAction,
  73. "ctrl shift KP_RIGHT", DefaultEditorKit.selectionNextWordAction,
  74. "ctrl A", DefaultEditorKit.selectAllAction,
  75. "HOME", DefaultEditorKit.beginLineAction,
  76. "END", DefaultEditorKit.endLineAction,
  77. "shift HOME", DefaultEditorKit.selectionBeginLineAction,
  78. "shift END", DefaultEditorKit.selectionEndLineAction,
  79. "UP", DefaultEditorKit.upAction,
  80. "KP_UP", DefaultEditorKit.upAction,
  81. "DOWN", DefaultEditorKit.downAction,
  82. "KP_DOWN", DefaultEditorKit.downAction,
  83. "PAGE_UP", DefaultEditorKit.pageUpAction,
  84. "PAGE_DOWN", DefaultEditorKit.pageDownAction,
  85. "shift PAGE_UP", "selection-page-up",
  86. "shift PAGE_DOWN", "selection-page-down",
  87. "ctrl shift PAGE_UP", "selection-page-left",
  88. "ctrl shift PAGE_DOWN", "selection-page-right",
  89. "shift UP", DefaultEditorKit.selectionUpAction,
  90. "shift KP_UP", DefaultEditorKit.selectionUpAction,
  91. "shift DOWN", DefaultEditorKit.selectionDownAction,
  92. "shift KP_DOWN", DefaultEditorKit.selectionDownAction,
  93. "ENTER", DefaultEditorKit.insertBreakAction,
  94. "BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
  95. "ctrl H", DefaultEditorKit.deletePrevCharAction,
  96. "DELETE", DefaultEditorKit.deleteNextCharAction,
  97. "RIGHT", DefaultEditorKit.forwardAction,
  98. "LEFT", DefaultEditorKit.backwardAction,
  99. "KP_RIGHT", DefaultEditorKit.forwardAction,
  100. "KP_LEFT", DefaultEditorKit.backwardAction,
  101. "TAB", DefaultEditorKit.insertTabAction,
  102. "ctrl BACK_SLASH", "unselect"/*DefaultEditorKit.unselectAction*/,
  103. "ctrl HOME", DefaultEditorKit.beginAction,
  104. "ctrl END", DefaultEditorKit.endAction,
  105. "ctrl shift HOME", DefaultEditorKit.selectionBeginAction,
  106. "ctrl shift END", DefaultEditorKit.selectionEndAction,
  107. "ctrl T", "next-link-action",
  108. "ctrl shift T", "previous-link-action",
  109. "ctrl SPACE", "activate-link-action",
  110. "control shift O", "toggle-componentOrientation"/*DefaultEditorKit.toggleComponentOrientation*/
  111. });
  112. DEFAULT_VALUES.put("EditorPane.focusInputMap", multilineInputMap);
  113. DEFAULT_VALUES.put("TextArea.focusInputMap", multilineInputMap);
  114. DEFAULT_VALUES.put("TextPane.focusInputMap", multilineInputMap);
  115. Object fieldInputMap = new UIDefaults.LazyInputMap(new Object[] {
  116. "ctrl C", DefaultEditorKit.copyAction,
  117. "ctrl V", DefaultEditorKit.pasteAction,
  118. "ctrl X", DefaultEditorKit.cutAction,
  119. "COPY", DefaultEditorKit.copyAction,
  120. "PASTE", DefaultEditorKit.pasteAction,
  121. "CUT", DefaultEditorKit.cutAction,
  122. "shift LEFT", DefaultEditorKit.selectionBackwardAction,
  123. "shift KP_LEFT", DefaultEditorKit.selectionBackwardAction,
  124. "shift RIGHT", DefaultEditorKit.selectionForwardAction,
  125. "shift KP_RIGHT", DefaultEditorKit.selectionForwardAction,
  126. "ctrl LEFT", DefaultEditorKit.previousWordAction,
  127. "ctrl KP_LEFT", DefaultEditorKit.previousWordAction,
  128. "ctrl RIGHT", DefaultEditorKit.nextWordAction,
  129. "ctrl KP_RIGHT", DefaultEditorKit.nextWordAction,
  130. "ctrl shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
  131. "ctrl shift KP_LEFT", DefaultEditorKit.selectionPreviousWordAction,
  132. "ctrl shift RIGHT", DefaultEditorKit.selectionNextWordAction,
  133. "ctrl shift KP_RIGHT", DefaultEditorKit.selectionNextWordAction,
  134. "ctrl A", DefaultEditorKit.selectAllAction,
  135. "HOME", DefaultEditorKit.beginLineAction,
  136. "END", DefaultEditorKit.endLineAction,
  137. "shift HOME", DefaultEditorKit.selectionBeginLineAction,
  138. "shift END", DefaultEditorKit.selectionEndLineAction,
  139. "BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
  140. "ctrl H", DefaultEditorKit.deletePrevCharAction,
  141. "DELETE", DefaultEditorKit.deleteNextCharAction,
  142. "RIGHT", DefaultEditorKit.forwardAction,
  143. "LEFT", DefaultEditorKit.backwardAction,
  144. "KP_RIGHT", DefaultEditorKit.forwardAction,
  145. "KP_LEFT", DefaultEditorKit.backwardAction,
  146. "ENTER", JTextField.notifyAction,
  147. "ctrl BACK_SLASH", "unselect"/*DefaultEditorKit.unselectAction*/,
  148. "control shift O", "toggle-componentOrientation"/*DefaultEditorKit.toggleComponentOrientation*/
  149. });
  150. DEFAULT_VALUES.put("TextField.focusInputMap", fieldInputMap);
  151. DEFAULT_VALUES.put("PasswordField.focusInputMap", fieldInputMap);
  152. DEFAULT_VALUES.put("ComboBox.ancestorInputMap",
  153. new UIDefaults.LazyInputMap(new Object[] {
  154. "ESCAPE", "hidePopup",
  155. "PAGE_UP", "pageUpPassThrough",
  156. "PAGE_DOWN", "pageDownPassThrough",
  157. "HOME", "homePassThrough",
  158. "END", "endPassThrough",
  159. "DOWN", "selectNext",
  160. "KP_DOWN", "selectNext",
  161. "alt DOWN", "togglePopup",
  162. "alt KP_DOWN", "togglePopup",
  163. "alt UP", "togglePopup",
  164. "alt KP_UP", "togglePopup",
  165. "SPACE", "spacePopup",
  166. "ENTER", "enterPressed",
  167. "UP", "selectPrevious",
  168. "KP_UP", "selectPrevious"
  169. }));
  170. DEFAULT_VALUES.put("Desktop.ancestorInputMap",
  171. new UIDefaults.LazyInputMap(new Object[] {
  172. "ctrl F5", "restore",
  173. "ctrl F4", "close",
  174. "ctrl F7", "move",
  175. "ctrl F8", "resize",
  176. "RIGHT", "right",
  177. "KP_RIGHT", "right",
  178. "shift RIGHT", "shrinkRight",
  179. "shift KP_RIGHT", "shrinkRight",
  180. "LEFT", "left",
  181. "KP_LEFT", "left",
  182. "shift LEFT", "shrinkLeft",
  183. "shift KP_LEFT", "shrinkLeft",
  184. "UP", "up",
  185. "KP_UP", "up",
  186. "shift UP", "shrinkUp",
  187. "shift KP_UP", "shrinkUp",
  188. "DOWN", "down",
  189. "KP_DOWN", "down",
  190. "shift DOWN", "shrinkDown",
  191. "shift KP_DOWN", "shrinkDown",
  192. "ESCAPE", "escape",
  193. "ctrl F9", "minimize",
  194. "ctrl F10", "maximize",
  195. "ctrl F6", "selectNextFrame",
  196. "ctrl TAB", "selectNextFrame",
  197. "ctrl alt F6", "selectNextFrame",
  198. "shift ctrl alt F6", "selectPreviousFrame",
  199. "ctrl F12", "navigateNext",
  200. "shift ctrl F12", "navigatePrevious"
  201. }));
  202. DEFAULT_VALUES.put("FileChooser.ancestorInputMap",
  203. new UIDefaults.LazyInputMap(new Object[] {
  204. "ESCAPE", "cancelSelection",
  205. "F2", "editFileName",
  206. "F5", "refresh",
  207. "BACK_SPACE", "Go Up",
  208. "ENTER", "approveSelection"
  209. }));
  210. DEFAULT_VALUES.put("FormattedTextField.focusInputMap",
  211. new UIDefaults.LazyInputMap(new Object[] {
  212. "ctrl C", DefaultEditorKit.copyAction,
  213. "ctrl V", DefaultEditorKit.pasteAction,
  214. "ctrl X", DefaultEditorKit.cutAction,
  215. "COPY", DefaultEditorKit.copyAction,
  216. "PASTE", DefaultEditorKit.pasteAction,
  217. "CUT", DefaultEditorKit.cutAction,
  218. "shift LEFT", DefaultEditorKit.selectionBackwardAction,
  219. "shift KP_LEFT", DefaultEditorKit.selectionBackwardAction,
  220. "shift RIGHT", DefaultEditorKit.selectionForwardAction,
  221. "shift KP_RIGHT", DefaultEditorKit.selectionForwardAction,
  222. "ctrl LEFT", DefaultEditorKit.previousWordAction,
  223. "ctrl KP_LEFT", DefaultEditorKit.previousWordAction,
  224. "ctrl RIGHT", DefaultEditorKit.nextWordAction,
  225. "ctrl KP_RIGHT", DefaultEditorKit.nextWordAction,
  226. "ctrl shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
  227. "ctrl shift KP_LEFT", DefaultEditorKit.selectionPreviousWordAction,
  228. "ctrl shift RIGHT", DefaultEditorKit.selectionNextWordAction,
  229. "ctrl shift KP_RIGHT", DefaultEditorKit.selectionNextWordAction,
  230. "ctrl A", DefaultEditorKit.selectAllAction,
  231. "HOME", DefaultEditorKit.beginLineAction,
  232. "END", DefaultEditorKit.endLineAction,
  233. "shift HOME", DefaultEditorKit.selectionBeginLineAction,
  234. "shift END", DefaultEditorKit.selectionEndLineAction,
  235. "BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
  236. "ctrl H", DefaultEditorKit.deletePrevCharAction,
  237. "DELETE", DefaultEditorKit.deleteNextCharAction,
  238. "RIGHT", DefaultEditorKit.forwardAction,
  239. "LEFT", DefaultEditorKit.backwardAction,
  240. "KP_RIGHT", DefaultEditorKit.forwardAction,
  241. "KP_LEFT", DefaultEditorKit.backwardAction,
  242. "ENTER", JTextField.notifyAction,
  243. "ctrl BACK_SLASH", "unselect",
  244. "control shift O", "toggle-componentOrientation",
  245. "ESCAPE", "reset-field-edit",
  246. "UP", "increment",
  247. "KP_UP", "increment",
  248. "DOWN", "decrement",
  249. "KP_DOWN", "decrement",
  250. }));
  251. DEFAULT_VALUES.put("InternalFrame.windowBindings",
  252. new Object[] {
  253. "shift ESCAPE", "showSystemMenu",
  254. "ctrl SPACE", "showSystemMenu",
  255. "ESCAPE", "hideSystemMenu"});
  256. DEFAULT_VALUES.put("List.focusInputMap",
  257. new UIDefaults.LazyInputMap(new Object[] {
  258. "ctrl C", "copy",
  259. "ctrl V", "paste",
  260. "ctrl X", "cut",
  261. "COPY", "copy",
  262. "PASTE", "paste",
  263. "CUT", "cut",
  264. "UP", "selectPreviousRow",
  265. "KP_UP", "selectPreviousRow",
  266. "shift UP", "selectPreviousRowExtendSelection",
  267. "shift KP_UP", "selectPreviousRowExtendSelection",
  268. "ctrl shift UP", "selectPreviousRowExtendSelection",
  269. "ctrl shift KP_UP", "selectPreviousRowExtendSelection",
  270. "ctrl UP", "selectPreviousRowChangeLead",
  271. "ctrl KP_UP", "selectPreviousRowChangeLead",
  272. "DOWN", "selectNextRow",
  273. "KP_DOWN", "selectNextRow",
  274. "shift DOWN", "selectNextRowExtendSelection",
  275. "shift KP_DOWN", "selectNextRowExtendSelection",
  276. "ctrl shift DOWN", "selectNextRowExtendSelection",
  277. "ctrl shift KP_DOWN", "selectNextRowExtendSelection",
  278. "ctrl DOWN", "selectNextRowChangeLead",
  279. "ctrl KP_DOWN", "selectNextRowChangeLead",
  280. "LEFT", "selectPreviousColumn",
  281. "KP_LEFT", "selectPreviousColumn",
  282. "shift LEFT", "selectPreviousColumnExtendSelection",
  283. "shift KP_LEFT", "selectPreviousColumnExtendSelection",
  284. "ctrl shift LEFT", "selectPreviousColumnExtendSelection",
  285. "ctrl shift KP_LEFT", "selectPreviousColumnExtendSelection",
  286. "ctrl LEFT", "selectPreviousColumnChangeLead",
  287. "ctrl KP_LEFT", "selectPreviousColumnChangeLead",
  288. "RIGHT", "selectNextColumn",
  289. "KP_RIGHT", "selectNextColumn",
  290. "shift RIGHT", "selectNextColumnExtendSelection",
  291. "shift KP_RIGHT", "selectNextColumnExtendSelection",
  292. "ctrl shift RIGHT", "selectNextColumnExtendSelection",
  293. "ctrl shift KP_RIGHT", "selectNextColumnExtendSelection",
  294. "ctrl RIGHT", "selectNextColumnChangeLead",
  295. "ctrl KP_RIGHT", "selectNextColumnChangeLead",
  296. "HOME", "selectFirstRow",
  297. "shift HOME", "selectFirstRowExtendSelection",
  298. "ctrl shift HOME", "selectFirstRowExtendSelection",
  299. "ctrl HOME", "selectFirstRowChangeLead",
  300. "END", "selectLastRow",
  301. "shift END", "selectLastRowExtendSelection",
  302. "ctrl shift END", "selectLastRowExtendSelection",
  303. "ctrl END", "selectLastRowChangeLead",
  304. "PAGE_UP", "scrollUp",
  305. "shift PAGE_UP", "scrollUpExtendSelection",
  306. "ctrl shift PAGE_UP", "scrollUpExtendSelection",
  307. "ctrl PAGE_UP", "scrollUpChangeLead",
  308. "PAGE_DOWN", "scrollDown",
  309. "shift PAGE_DOWN", "scrollDownExtendSelection",
  310. "ctrl shift PAGE_DOWN", "scrollDownExtendSelection",
  311. "ctrl PAGE_DOWN", "scrollDownChangeLead",
  312. "ctrl A", "selectAll",
  313. "ctrl SLASH", "selectAll",
  314. "ctrl BACK_SLASH", "clearSelection",
  315. "SPACE", "addToSelection",
  316. "ctrl SPACE", "toggleAndAnchor",
  317. "shift SPACE", "extendTo",
  318. "ctrl shift SPACE", "moveSelectionTo"
  319. }));
  320. DEFAULT_VALUES.put("List.focusInputMap.RightToLeft",
  321. new UIDefaults.LazyInputMap(new Object[] {
  322. "LEFT", "selectNextColumn",
  323. "KP_LEFT", "selectNextColumn",
  324. "shift LEFT", "selectNextColumnExtendSelection",
  325. "shift KP_LEFT", "selectNextColumnExtendSelection",
  326. "ctrl shift LEFT", "selectNextColumnExtendSelection",
  327. "ctrl shift KP_LEFT", "selectNextColumnExtendSelection",
  328. "ctrl LEFT", "selectNextColumnChangeLead",
  329. "ctrl KP_LEFT", "selectNextColumnChangeLead",
  330. "RIGHT", "selectPreviousColumn",
  331. "KP_RIGHT", "selectPreviousColumn",
  332. "shift RIGHT", "selectPreviousColumnExtendSelection",
  333. "shift KP_RIGHT", "selectPreviousColumnExtendSelection",
  334. "ctrl shift RIGHT", "selectPreviousColumnExtendSelection",
  335. "ctrl shift KP_RIGHT", "selectPreviousColumnExtendSelection",
  336. "ctrl RIGHT", "selectPreviousColumnChangeLead",
  337. "ctrl KP_RIGHT", "selectPreviousColumnChangeLead",
  338. }));
  339. DEFAULT_VALUES.put("MenuBar.windowBindings",
  340. new Object[] { "F10", "takeFocus" });
  341. DEFAULT_VALUES.put("OptionPane.windowBindings",
  342. new Object[] { "ESCAPE", "close" });
  343. DEFAULT_VALUES.put("RootPane.defaultButtonWindowKeyBindings",
  344. new Object[] {
  345. "ENTER", "press",
  346. "released ENTER", "release",
  347. "ctrl ENTER", "press",
  348. "ctrl released ENTER", "release"
  349. });
  350. DEFAULT_VALUES.put("ScrollBar.anecstorInputMap",
  351. new UIDefaults.LazyInputMap(new Object[] {
  352. "RIGHT", "positiveUnitIncrement",
  353. "KP_RIGHT", "positiveUnitIncrement",
  354. "DOWN", "positiveUnitIncrement",
  355. "KP_DOWN", "positiveUnitIncrement",
  356. "PAGE_DOWN", "positiveBlockIncrement",
  357. "LEFT", "negativeUnitIncrement",
  358. "KP_LEFT", "negativeUnitIncrement",
  359. "UP", "negativeUnitIncrement",
  360. "KP_UP", "negativeUnitIncrement",
  361. "PAGE_UP", "negativeBlockIncrement",
  362. "HOME", "minScroll",
  363. "END", "maxScroll"
  364. }));
  365. DEFAULT_VALUES.put("ScrollBar.ancestorInputMap.RightToLeft",
  366. new UIDefaults.LazyInputMap(new Object[] {
  367. "RIGHT", "negativeUnitIncrement",
  368. "KP_RIGHT", "negativeUnitIncrement",
  369. "LEFT", "positiveUnitIncrement",
  370. "KP_LEFT", "positiveUnitIncrement",
  371. }));
  372. DEFAULT_VALUES.put("ScrollPane.ancestorInputMap",
  373. new UIDefaults.LazyInputMap(new Object[] {
  374. "RIGHT", "unitScrollRight",
  375. "KP_RIGHT", "unitScrollRight",
  376. "DOWN", "unitScrollDown",
  377. "KP_DOWN", "unitScrollDown",
  378. "LEFT", "unitScrollLeft",
  379. "KP_LEFT", "unitScrollLeft",
  380. "UP", "unitScrollUp",
  381. "KP_UP", "unitScrollUp",
  382. "PAGE_UP", "scrollUp",
  383. "PAGE_DOWN", "scrollDown",
  384. "ctrl PAGE_UP", "scrollLeft",
  385. "ctrl PAGE_DOWN", "scrollRight",
  386. "ctrl HOME", "scrollHome",
  387. "ctrl END", "scrollEnd"
  388. }));
  389. DEFAULT_VALUES.put("ScrollPane.ancestorInputMap.RightToLeft",
  390. new UIDefaults.LazyInputMap(new Object[] {
  391. "ctrl PAGE_UP", "scrollRight",
  392. "ctrl PAGE_DOWN", "scrollLeft",
  393. }));
  394. DEFAULT_VALUES.put("SplitPane.ancestorInputMap",
  395. new UIDefaults.LazyInputMap(new Object[] {
  396. "UP", "negativeIncrement",
  397. "DOWN", "positiveIncrement",
  398. "LEFT", "negativeIncrement",
  399. "RIGHT", "positiveIncrement",
  400. "KP_UP", "negativeIncrement",
  401. "KP_DOWN", "positiveIncrement",
  402. "KP_LEFT", "negativeIncrement",
  403. "KP_RIGHT", "positiveIncrement",
  404. "HOME", "selectMin",
  405. "END", "selectMax",
  406. "F8", "startResize",
  407. "F6", "toggleFocus",
  408. "ctrl TAB", "focusOutForward",
  409. "ctrl shift TAB", "focusOutBackward"
  410. }));
  411. DEFAULT_VALUES.put("Slider.focusInputMap",
  412. new UIDefaults.LazyInputMap(new Object[] {
  413. "RIGHT", "positiveUnitIncrement",
  414. "KP_RIGHT", "positiveUnitIncrement",
  415. "DOWN", "negativeUnitIncrement",
  416. "KP_DOWN", "negativeUnitIncrement",
  417. "PAGE_DOWN", "negativeBlockIncrement",
  418. "ctrl PAGE_DOWN", "negativeBlockIncrement",
  419. "LEFT", "negativeUnitIncrement",
  420. "KP_LEFT", "negativeUnitIncrement",
  421. "UP", "positiveUnitIncrement",
  422. "KP_UP", "positiveUnitIncrement",
  423. "PAGE_UP", "positiveBlockIncrement",
  424. "ctrl PAGE_UP", "positiveBlockIncrement",
  425. "HOME", "minScroll",
  426. "END", "maxScroll"
  427. }));
  428. DEFAULT_VALUES.put("Slider.focusInputMap.RightToLeft",
  429. new UIDefaults.LazyInputMap(new Object[] {
  430. "RIGHT", "negativeUnitIncrement",
  431. "KP_RIGHT", "negativeUnitIncrement",
  432. "LEFT", "positiveUnitIncrement",
  433. "KP_LEFT", "positiveUnitIncrement",
  434. }));
  435. DEFAULT_VALUES.put("TabbedPane.ancestorInputMap",
  436. new UIDefaults.LazyInputMap(new Object[] {
  437. "ctrl PAGE_DOWN", "navigatePageDown",
  438. "ctrl PAGE_UP", "navigatePageUp",
  439. "ctrl UP", "requestFocus",
  440. "ctrl KP_UP", "requestFocus",
  441. }));
  442. DEFAULT_VALUES.put("TabbedPane.focusInputMap",
  443. new UIDefaults.LazyInputMap(new Object[] {
  444. "RIGHT", "navigateRight",
  445. "KP_RIGHT", "navigateRight",
  446. "LEFT", "navigateLeft",
  447. "KP_LEFT", "navigateLeft",
  448. "UP", "navigateUp",
  449. "KP_UP", "navigateUp",
  450. "DOWN", "navigateDown",
  451. "KP_DOWN", "navigateDown",
  452. "ctrl DOWN", "requestFocusForVisibleComponent",
  453. "ctrl KP_DOWN", "requestFocusForVisibleComponent",
  454. }));
  455. DEFAULT_VALUES.put("Table.ancestorInputMap",
  456. new UIDefaults.LazyInputMap(new Object[] {
  457. "ctrl C", "copy",
  458. "ctrl V", "paste",
  459. "ctrl X", "cut",
  460. "COPY", "copy",
  461. "PASTE", "paste",
  462. "CUT", "cut",
  463. "RIGHT", "selectNextColumn",
  464. "KP_RIGHT", "selectNextColumn",
  465. "shift RIGHT", "selectNextColumnExtendSelection",
  466. "shift KP_RIGHT", "selectNextColumnExtendSelection",
  467. "ctrl shift RIGHT", "selectNextColumnExtendSelection",
  468. "ctrl shift KP_RIGHT", "selectNextColumnExtendSelection",
  469. "ctrl RIGHT", "selectNextColumnChangeLead",
  470. "ctrl KP_RIGHT", "selectNextColumnChangeLead",
  471. "LEFT", "selectPreviousColumn",
  472. "KP_LEFT", "selectPreviousColumn",
  473. "shift LEFT", "selectPreviousColumnExtendSelection",
  474. "shift KP_LEFT", "selectPreviousColumnExtendSelection",
  475. "ctrl shift LEFT", "selectPreviousColumnExtendSelection",
  476. "ctrl shift KP_LEFT", "selectPreviousColumnExtendSelection",
  477. "ctrl LEFT", "selectPreviousColumnChangeLead",
  478. "ctrl KP_LEFT", "selectPreviousColumnChangeLead",
  479. "DOWN", "selectNextRow",
  480. "KP_DOWN", "selectNextRow",
  481. "shift DOWN", "selectNextRowExtendSelection",
  482. "shift KP_DOWN", "selectNextRowExtendSelection",
  483. "ctrl shift DOWN", "selectNextRowExtendSelection",
  484. "ctrl shift KP_DOWN", "selectNextRowExtendSelection",
  485. "ctrl DOWN", "selectNextRowChangeLead",
  486. "ctrl KP_DOWN", "selectNextRowChangeLead",
  487. "UP", "selectPreviousRow",
  488. "KP_UP", "selectPreviousRow",
  489. "shift UP", "selectPreviousRowExtendSelection",
  490. "shift KP_UP", "selectPreviousRowExtendSelection",
  491. "ctrl shift UP", "selectPreviousRowExtendSelection",
  492. "ctrl shift KP_UP", "selectPreviousRowExtendSelection",
  493. "ctrl UP", "selectPreviousRowChangeLead",
  494. "ctrl KP_UP", "selectPreviousRowChangeLead",
  495. "HOME", "selectFirstColumn",
  496. "shift HOME", "selectFirstColumnExtendSelection",
  497. "ctrl shift HOME", "selectFirstRowExtendSelection",
  498. "ctrl HOME", "selectFirstRow",
  499. "END", "selectLastColumn",
  500. "shift END", "selectLastColumnExtendSelection",
  501. "ctrl shift END", "selectLastRowExtendSelection",
  502. "ctrl END", "selectLastRow",
  503. "PAGE_UP", "scrollUpChangeSelection",
  504. "shift PAGE_UP", "scrollUpExtendSelection",
  505. "ctrl shift PAGE_UP", "scrollLeftExtendSelection",
  506. "ctrl PAGE_UP", "scrollLeftChangeSelection",
  507. "PAGE_DOWN", "scrollDownChangeSelection",
  508. "shift PAGE_DOWN", "scrollDownExtendSelection",
  509. "ctrl shift PAGE_DOWN", "scrollRightExtendSelection",
  510. "ctrl PAGE_DOWN", "scrollRightChangeSelection",
  511. "TAB", "selectNextColumnCell",
  512. "shift TAB", "selectPreviousColumnCell",
  513. "ENTER", "selectNextRowCell",
  514. "shift ENTER", "selectPreviousRowCell",
  515. "ctrl A", "selectAll",
  516. "ctrl SLASH", "selectAll",
  517. "ctrl BACK_SLASH", "clearSelection",
  518. "ESCAPE", "cancel",
  519. "F2", "startEditing",
  520. "SPACE", "addToSelection",
  521. "ctrl SPACE", "toggleAndAnchor",
  522. "shift SPACE", "extendTo",
  523. "ctrl shift SPACE", "moveSelectionTo"
  524. }));
  525. DEFAULT_VALUES.put("Tree.ancestorInputMap",
  526. new UIDefaults.LazyInputMap(new Object[] {
  527. "ESCAPE", "cancel"
  528. }));
  529. DEFAULT_VALUES.put("Tree.focusInputMap",
  530. new UIDefaults.LazyInputMap(new Object[] {
  531. "ADD", "expand",
  532. "SUBTRACT", "collapse",
  533. "ctrl C", "copy",
  534. "ctrl V", "paste",
  535. "ctrl X", "cut",
  536. "COPY", "copy",
  537. "PASTE", "paste",
  538. "CUT", "cut",
  539. "UP", "selectPrevious",
  540. "KP_UP", "selectPrevious",
  541. "shift UP", "selectPreviousExtendSelection",
  542. "shift KP_UP", "selectPreviousExtendSelection",
  543. "ctrl shift UP", "selectPreviousExtendSelection",
  544. "ctrl shift KP_UP", "selectPreviousExtendSelection",
  545. "ctrl UP", "selectPreviousChangeLead",
  546. "ctrl KP_UP", "selectPreviousChangeLead",
  547. "DOWN", "selectNext",
  548. "KP_DOWN", "selectNext",
  549. "shift DOWN", "selectNextExtendSelection",
  550. "shift KP_DOWN", "selectNextExtendSelection",
  551. "ctrl shift DOWN", "selectNextExtendSelection",
  552. "ctrl shift KP_DOWN", "selectNextExtendSelection",
  553. "ctrl DOWN", "selectNextChangeLead",
  554. "ctrl KP_DOWN", "selectNextChangeLead",
  555. "RIGHT", "selectChild",
  556. "KP_RIGHT", "selectChild",
  557. "LEFT", "selectParent",
  558. "KP_LEFT", "selectParent",
  559. "PAGE_UP", "scrollUpChangeSelection",
  560. "shift PAGE_UP", "scrollUpExtendSelection",
  561. "ctrl shift PAGE_UP", "scrollUpExtendSelection",
  562. "ctrl PAGE_UP", "scrollUpChangeLead",
  563. "PAGE_DOWN", "scrollDownChangeSelection",
  564. "shift PAGE_DOWN", "scrollDownExtendSelection",
  565. "ctrl shift PAGE_DOWN", "scrollDownExtendSelection",
  566. "ctrl PAGE_DOWN", "scrollDownChangeLead",
  567. "HOME", "selectFirst",
  568. "shift HOME", "selectFirstExtendSelection",
  569. "ctrl shift HOME", "selectFirstExtendSelection",
  570. "ctrl HOME", "selectFirstChangeLead",
  571. "END", "selectLast",
  572. "shift END", "selectLastExtendSelection",
  573. "ctrl shift END", "selectLastExtendSelection",
  574. "ctrl END", "selectLastChangeLead",
  575. "F2", "startEditing",
  576. "ctrl A", "selectAll",
  577. "ctrl SLASH", "selectAll",
  578. "ctrl BACK_SLASH", "clearSelection",
  579. "ctrl LEFT", "scrollLeft",
  580. "ctrl KP_LEFT", "scrollLeft",
  581. "ctrl RIGHT", "scrollRight",
  582. "ctrl KP_RIGHT", "scrollRight",
  583. "SPACE", "addToSelection",
  584. "ctrl SPACE", "toggleAndAnchor",
  585. "shift SPACE", "extendTo",
  586. "ctrl shift SPACE", "moveSelectionTo"
  587. }));
  588. DEFAULT_VALUES.put("Tree.focusInputMap.RightToLeft",
  589. new UIDefaults.LazyInputMap(new Object[] {
  590. "RIGHT", "selectParent",
  591. "KP_RIGHT", "selectParent",
  592. "LEFT", "selectChild",
  593. "KP_LEFT", "selectChild",
  594. }));
  595. }
  596. /**
  597. * Returns the default value for the specified property, or null if there
  598. * is no default for the specified value.
  599. */
  600. private static Object getDefaultValue(Object key) {
  601. synchronized(SynthStyle.class) {
  602. if (DEFAULT_VALUES == null) {
  603. DEFAULT_VALUES = new HashMap();
  604. populateDefaultValues();
  605. }
  606. Object value = DEFAULT_VALUES.get(key);
  607. if (value instanceof UIDefaults.LazyValue) {
  608. value = ((UIDefaults.LazyValue)value).createValue(null);
  609. DEFAULT_VALUES.put(key, value);
  610. }
  611. return value;
  612. }
  613. }
  614. /**
  615. * Constructs a SynthStyle.
  616. */
  617. public SynthStyle() {
  618. }
  619. /**
  620. * Returns the <code>SynthGraphicUtils</code> for the specified context.
  621. *
  622. * @param context SynthContext identifying requester
  623. * @return SynthGraphicsUtils
  624. */
  625. public SynthGraphicsUtils getGraphicsUtils(SynthContext context) {
  626. return SYNTH_GRAPHICS;
  627. }
  628. /**
  629. * Returns the color for the specified state. This gives precedence to
  630. * foreground and background of the <code>JComponent</code>. If the
  631. * <code>Color</code> from the <code>JComponent</code> is not appropriate,
  632. * or not used, this will invoke <code>getColorForState</code>. Subclasses
  633. * should generally not have to override this, instead override
  634. * {@link #getColorForState}.
  635. *
  636. * @param context SynthContext identifying requester
  637. * @param type Type of color being requested.
  638. * @return Color
  639. */
  640. public Color getColor(SynthContext context, ColorType type) {
  641. JComponent c = context.getComponent();
  642. Region id = context.getRegion();
  643. int cs = context.getComponentState();
  644. // For the enabled state, prefer the widget's colors
  645. if (!id.isSubregion() && cs == SynthConstants.ENABLED) {
  646. if (type == ColorType.BACKGROUND) {
  647. return c.getBackground();
  648. }
  649. else if (type == ColorType.FOREGROUND) {
  650. return c.getForeground();
  651. }
  652. else if (type == ColorType.TEXT_FOREGROUND) {
  653. // If getForeground returns a non-UIResource it means the
  654. // developer has explicitly set the foreground, use it over
  655. // that of TEXT_FOREGROUND as that is typically the expected
  656. // behavior.
  657. Color color = c.getForeground();
  658. if (!(color instanceof UIResource)) {
  659. return color;
  660. }
  661. }
  662. }
  663. // Then use what we've locally defined
  664. Color color = getColorForState(context, type);
  665. if (color == null) {
  666. // No color, fallback to that of the widget.
  667. if (type == ColorType.BACKGROUND ||
  668. type == ColorType.TEXT_BACKGROUND) {
  669. return c.getBackground();
  670. }
  671. else if (type == ColorType.FOREGROUND ||
  672. type == ColorType.TEXT_FOREGROUND) {
  673. return c.getForeground();
  674. }
  675. }
  676. return color;
  677. }
  678. /**
  679. * Returns the color for the specified state. This should NOT call any
  680. * methods on the <code>JComponent</code>.
  681. *
  682. * @param context SynthContext identifying requester
  683. * @param type Type of color being requested.
  684. * @return Color to render with
  685. */
  686. protected abstract Color getColorForState(SynthContext context,
  687. ColorType type);
  688. /**
  689. * Returns the Font for the specified state. This redirects to the
  690. * <code>JComponent</code> from the <code>context</code> as necessary.
  691. * If this does not redirect
  692. * to the JComponent {@link #getFontForState} is invoked.
  693. *
  694. * @param context SynthContext identifying requester
  695. * @return Font to render with
  696. */
  697. public Font getFont(SynthContext context) {
  698. JComponent c = context.getComponent();
  699. if (context.getComponentState() == SynthConstants.ENABLED) {
  700. return c.getFont();
  701. }
  702. Font cFont = c.getFont();
  703. if (cFont != null && !(cFont instanceof UIResource)) {
  704. return cFont;
  705. }
  706. return getFontForState(context);
  707. }
  708. /**
  709. * Returns the font for the specified state. This should NOT call any
  710. * method on the <code>JComponent</code>.
  711. *
  712. * @param context SynthContext identifying requester
  713. * @return Font to render with
  714. */
  715. protected abstract Font getFontForState(SynthContext context);
  716. /**
  717. * Returns the Insets that are used to calculate sizing information.
  718. *
  719. * @param context SynthContext identifying requester
  720. * @param insets Insets to place return value in.
  721. * @return Sizing Insets.
  722. */
  723. public Insets getInsets(SynthContext context, Insets insets) {
  724. if (insets == null) {
  725. insets = new Insets(0, 0, 0, 0);
  726. }
  727. insets.top = insets.bottom = insets.left = insets.right = 0;
  728. return insets;
  729. }
  730. /**
  731. * Returns the <code>SynthPainter</code> that will be used for painting.
  732. * This may return null.
  733. *
  734. * @param context SynthContext identifying requester
  735. * @return SynthPainter to use
  736. */
  737. public SynthPainter getPainter(SynthContext context) {
  738. return null;
  739. }
  740. /**
  741. * Returns true if the region is opaque.
  742. *
  743. * @param context SynthContext identifying requester
  744. * @return true if region is opaque.
  745. */
  746. public boolean isOpaque(SynthContext context) {
  747. return true;
  748. }
  749. /**
  750. * Getter for a region specific style property.
  751. *
  752. * @param context SynthContext identifying requester
  753. * @param key Property being requested.
  754. * @return Value of the named property
  755. */
  756. public Object get(SynthContext context, Object key) {
  757. return getDefaultValue(key);
  758. }
  759. void installDefaults(SynthContext context, SynthUI ui) {
  760. // Special case the Border as this will likely change when the LAF
  761. // can have more control over this.
  762. if (!context.isSubregion()) {
  763. JComponent c = context.getComponent();
  764. Border border = c.getBorder();
  765. if (border == null || border instanceof UIResource) {
  766. c.setBorder(new SynthBorder(ui, getInsets(context, null)));
  767. }
  768. }
  769. installDefaults(context);
  770. }
  771. /**
  772. * Installs the necessary state from this Style on the
  773. * <code>JComponent</code> from <code>context</code>.
  774. *
  775. * @param context SynthContext identifying component to install properties
  776. * to.
  777. */
  778. public void installDefaults(SynthContext context) {
  779. if (!context.isSubregion()) {
  780. JComponent c = context.getComponent();
  781. Region region = context.getRegion();
  782. Font font = c.getFont();
  783. if (font == null || (font instanceof UIResource)) {
  784. c.setFont(getFontForState(context));
  785. }
  786. Color background = c.getBackground();
  787. if (background == null || (background instanceof UIResource)) {
  788. c.setBackground(getColorForState(context,
  789. ColorType.BACKGROUND));
  790. }
  791. Color foreground = c.getForeground();
  792. if (foreground == null || (foreground instanceof UIResource)) {
  793. c.setForeground(getColorForState(context,
  794. ColorType.FOREGROUND));
  795. }
  796. LookAndFeel.installProperty(c, "opaque", Boolean.valueOf(isOpaque(context)));
  797. }
  798. }
  799. /**
  800. * Uninstalls any state that this style installed on
  801. * the <code>JComponent</code> from <code>context</code>.
  802. * <p>
  803. * Styles should NOT depend upon this being called, in certain cases
  804. * it may never be called.
  805. *
  806. * @param context SynthContext identifying component to install properties
  807. * to.
  808. */
  809. public void uninstallDefaults(SynthContext context) {
  810. if (!context.isSubregion()) {
  811. // NOTE: because getForeground, getBackground and getFont will look
  812. // at the parent Container, if we set them to null it may
  813. // mean we they return a non-null and non-UIResource value
  814. // preventing install from correctly settings its colors/font. For
  815. // this reason we do not uninstall the fg/bg/font.
  816. JComponent c = context.getComponent();
  817. Border border = c.getBorder();
  818. if (border instanceof UIResource) {
  819. c.setBorder(null);
  820. }
  821. }
  822. }
  823. /**
  824. * Convenience method to get a specific style property whose value is
  825. * a <code>Number</code>. If the value is a <code>Number</code>,
  826. * <code>intValue</code> is returned, otherwise <code>defaultValue</code>
  827. * is returned.
  828. *
  829. * @param context SynthContext identifying requester
  830. * @param key Property being requested.
  831. * @param defaultValue Value to return if the property has not been
  832. * specified, or is not a Number
  833. * @return Value of the named property
  834. */
  835. public int getInt(SynthContext context, Object key, int defaultValue) {
  836. Object value = get(context, key);
  837. if (value instanceof Number) {
  838. return ((Number)value).intValue();
  839. }
  840. return defaultValue;
  841. }
  842. /**
  843. * Convenience method to get a specific style property whose value is
  844. * an Boolean.
  845. *
  846. * @param context SynthContext identifying requester
  847. * @param key Property being requested.
  848. * @param defaultValue Value to return if the property has not been
  849. * specified, or is not a Boolean
  850. * @return Value of the named property
  851. */
  852. public boolean getBoolean(SynthContext context, Object key,
  853. boolean defaultValue) {
  854. Object value = get(context, key);
  855. if (value instanceof Boolean) {
  856. return ((Boolean)value).booleanValue();
  857. }
  858. return defaultValue;
  859. }
  860. /**
  861. * Convenience method to get a specific style property whose value is
  862. * an Icon.
  863. *
  864. * @param context SynthContext identifying requester
  865. * @param key Property being requested.
  866. * @return Value of the named property, or null if not specified
  867. */
  868. public Icon getIcon(SynthContext context, Object key) {
  869. Object value = get(context, key);
  870. if (value instanceof Icon) {
  871. return (Icon)value;
  872. }
  873. return null;
  874. }
  875. /**
  876. * Convenience method to get a specific style property whose value is
  877. * a String.
  878. *
  879. * @param context SynthContext identifying requester
  880. * @param key Property being requested.
  881. * @param defaultValue Value to return if the property has not been
  882. * specified, or is not a String
  883. * @return Value of the named property
  884. */
  885. public String getString(SynthContext context, Object key,
  886. String defaultValue) {
  887. Object value = get(context, key);
  888. if (value instanceof String) {
  889. return (String)value;
  890. }
  891. return defaultValue;
  892. }
  893. }