blob: 77f46be88c18a27c5380699975ddf7acb5a88f8e [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package javax.swing.plaf.basic;
27
28import java.awt.Font;
29import java.awt.Color;
30import java.awt.SystemColor;
31import java.awt.event.*;
32import java.awt.Insets;
33import java.awt.Component;
34import java.awt.Container;
35import java.awt.FocusTraversalPolicy;
36import java.awt.AWTEvent;
37import java.awt.Toolkit;
38import java.awt.Point;
39import java.net.URL;
40import java.io.*;
41import java.awt.Dimension;
42import java.awt.KeyboardFocusManager;
43import java.security.AccessController;
44import java.security.PrivilegedAction;
45import java.util.*;
46import java.lang.reflect.*;
47import javax.sound.sampled.*;
48
49import sun.awt.AppContext;
50
51import sun.swing.SwingLazyValue;
52import sun.swing.SwingUtilities2;
53
54import javax.swing.LookAndFeel;
55import javax.swing.AbstractAction;
56import javax.swing.Action;
57import javax.swing.ActionMap;
58import javax.swing.BorderFactory;
59import javax.swing.JComponent;
60import javax.swing.ImageIcon;
61import javax.swing.UIDefaults;
62import javax.swing.UIManager;
63import javax.swing.KeyStroke;
64import javax.swing.JTextField;
65import javax.swing.DefaultListCellRenderer;
66import javax.swing.FocusManager;
67import javax.swing.LayoutFocusTraversalPolicy;
68import javax.swing.SwingUtilities;
69import javax.swing.MenuSelectionManager;
70import javax.swing.MenuElement;
71import javax.swing.border.*;
72import javax.swing.plaf.*;
73import javax.swing.text.JTextComponent;
74import javax.swing.text.DefaultEditorKit;
75import javax.swing.JInternalFrame;
76import java.beans.PropertyVetoException;
77import java.awt.Window;
78import java.beans.PropertyChangeListener;
79import java.beans.PropertyChangeEvent;
80
81
82/**
83 * A base class to use in creating a look and feel for Swing.
84 * <p>
85 * Each of the {@code ComponentUI}s provided by {@code
86 * BasicLookAndFeel} derives its behavior from the defaults
87 * table. Unless otherwise noted each of the {@code ComponentUI}
88 * implementations in this package document the set of defaults they
89 * use. Unless otherwise noted the defaults are installed at the time
90 * {@code installUI} is invoked, and follow the recommendations
91 * outlined in {@code LookAndFeel} for installing defaults.
92 * <p>
93 * <strong>Warning:</strong>
94 * Serialized objects of this class will not be compatible with
95 * future Swing releases. The current serialization support is
96 * appropriate for short term storage or RMI between applications running
97 * the same version of Swing. As of 1.4, support for long term storage
98 * of all JavaBeans<sup><font size="-2">TM</font></sup>
99 * has been added to the <code>java.beans</code> package.
100 * Please see {@link java.beans.XMLEncoder}.
101 *
102 * @author unattributed
103 */
104public abstract class BasicLookAndFeel extends LookAndFeel implements Serializable
105{
106 /**
107 * Whether or not the developer has created a JPopupMenu.
108 */
109 static boolean needsEventHelper;
110
111 /**
112 * Lock used when manipulating clipPlaying.
113 */
114 private transient Object audioLock = new Object();
115 /**
116 * The Clip that is currently playing (set in AudioAction).
117 */
118 private Clip clipPlaying;
119
120 AWTEventHelper invocator = null;
121
122 /*
123 * Listen for our AppContext being disposed
124 */
125 private PropertyChangeListener disposer = null;
126
127 /**
128 * Returns the look and feel defaults. The returned {@code UIDefaults}
129 * is populated by invoking, in order, {@code initClassDefaults},
130 * {@code initSystemColorDefaults} and {@code initComponentDefaults}.
131 * <p>
132 * While this method is public, it should only be invoked by the
133 * {@code UIManager} when the look and feel is set as the current
134 * look and feel and after {@code initialize} has been invoked.
135 *
136 * @return the look and feel defaults
137 *
138 * @see #initClassDefaults
139 * @see #initSystemColorDefaults
140 * @see #initComponentDefaults
141 */
142 public UIDefaults getDefaults() {
143 UIDefaults table = new UIDefaults(610, 0.75f);
144
145 initClassDefaults(table);
146 initSystemColorDefaults(table);
147 initComponentDefaults(table);
148
149 return table;
150 }
151
152 /**
153 * {@inheritDoc}
154 */
155 public void initialize() {
156 if (needsEventHelper) {
157 installAWTEventListener();
158 }
159 }
160
161 void installAWTEventListener() {
162 if (invocator == null) {
163 invocator = new AWTEventHelper();
164 needsEventHelper = true;
165
166 // Add a PropertyChangeListener to our AppContext so we're alerted
167 // when the AppContext is disposed(), at which time this laf should
168 // be uninitialize()d.
169 disposer = new PropertyChangeListener() {
170 public void propertyChange(PropertyChangeEvent prpChg) {
171 uninitialize();
172 }
173 };
174 AppContext.getAppContext().addPropertyChangeListener(
175 AppContext.GUI_DISPOSED,
176 disposer);
177 }
178 }
179
180 /**
181 * {@inheritDoc}
182 */
183 public void uninitialize() {
184 AppContext context = AppContext.getAppContext();
185 synchronized (BasicPopupMenuUI.MOUSE_GRABBER_KEY) {
186 Object grabber = context.get(BasicPopupMenuUI.MOUSE_GRABBER_KEY);
187 if (grabber != null) {
188 ((BasicPopupMenuUI.MouseGrabber)grabber).uninstall();
189 }
190 }
191 synchronized (BasicPopupMenuUI.MENU_KEYBOARD_HELPER_KEY) {
192 Object helper =
193 context.get(BasicPopupMenuUI.MENU_KEYBOARD_HELPER_KEY);
194 if (helper != null) {
195 ((BasicPopupMenuUI.MenuKeyboardHelper)helper).uninstall();
196 }
197 }
198
199 if(invocator != null) {
200 AccessController.doPrivileged(invocator);
201 invocator = null;
202 }
203
204 if (disposer != null) {
205 // Note that we're likely calling removePropertyChangeListener()
206 // during the course of AppContext.firePropertyChange().
207 // However, EventListenerAggreggate has code to safely modify
208 // the list under such circumstances.
209 context.removePropertyChangeListener(AppContext.GUI_DISPOSED,
210 disposer);
211 disposer = null;
212 }
213 }
214
215 /**
216 * Populates {@code table} with mappings from {@code uiClassID} to the
217 * fully qualified name of the ui class. The value for a
218 * particular {@code uiClassID} is {@code
219 * "javax.swing.plaf.basic.Basic + uiClassID"}. For example, the
220 * value for the {@code uiClassID} {@code TreeUI} is {@code
221 * "javax.swing.plaf.basic.BasicTreeUI"}.
222 *
223 * @param table the {@code UIDefaults} instance the entries are
224 * added to
225 * @throws NullPointerException if {@code table} is {@code null}
226 *
227 * @see javax.swing.LookAndFeel
228 * @see #getDefaults
229 */
230 protected void initClassDefaults(UIDefaults table)
231 {
232 final String basicPackageName = "javax.swing.plaf.basic.";
233 Object[] uiDefaults = {
234 "ButtonUI", basicPackageName + "BasicButtonUI",
235 "CheckBoxUI", basicPackageName + "BasicCheckBoxUI",
236 "ColorChooserUI", basicPackageName + "BasicColorChooserUI",
237 "FormattedTextFieldUI", basicPackageName + "BasicFormattedTextFieldUI",
238 "MenuBarUI", basicPackageName + "BasicMenuBarUI",
239 "MenuUI", basicPackageName + "BasicMenuUI",
240 "MenuItemUI", basicPackageName + "BasicMenuItemUI",
241 "CheckBoxMenuItemUI", basicPackageName + "BasicCheckBoxMenuItemUI",
242 "RadioButtonMenuItemUI", basicPackageName + "BasicRadioButtonMenuItemUI",
243 "RadioButtonUI", basicPackageName + "BasicRadioButtonUI",
244 "ToggleButtonUI", basicPackageName + "BasicToggleButtonUI",
245 "PopupMenuUI", basicPackageName + "BasicPopupMenuUI",
246 "ProgressBarUI", basicPackageName + "BasicProgressBarUI",
247 "ScrollBarUI", basicPackageName + "BasicScrollBarUI",
248 "ScrollPaneUI", basicPackageName + "BasicScrollPaneUI",
249 "SplitPaneUI", basicPackageName + "BasicSplitPaneUI",
250 "SliderUI", basicPackageName + "BasicSliderUI",
251 "SeparatorUI", basicPackageName + "BasicSeparatorUI",
252 "SpinnerUI", basicPackageName + "BasicSpinnerUI",
253 "ToolBarSeparatorUI", basicPackageName + "BasicToolBarSeparatorUI",
254 "PopupMenuSeparatorUI", basicPackageName + "BasicPopupMenuSeparatorUI",
255 "TabbedPaneUI", basicPackageName + "BasicTabbedPaneUI",
256 "TextAreaUI", basicPackageName + "BasicTextAreaUI",
257 "TextFieldUI", basicPackageName + "BasicTextFieldUI",
258 "PasswordFieldUI", basicPackageName + "BasicPasswordFieldUI",
259 "TextPaneUI", basicPackageName + "BasicTextPaneUI",
260 "EditorPaneUI", basicPackageName + "BasicEditorPaneUI",
261 "TreeUI", basicPackageName + "BasicTreeUI",
262 "LabelUI", basicPackageName + "BasicLabelUI",
263 "ListUI", basicPackageName + "BasicListUI",
264 "ToolBarUI", basicPackageName + "BasicToolBarUI",
265 "ToolTipUI", basicPackageName + "BasicToolTipUI",
266 "ComboBoxUI", basicPackageName + "BasicComboBoxUI",
267 "TableUI", basicPackageName + "BasicTableUI",
268 "TableHeaderUI", basicPackageName + "BasicTableHeaderUI",
269 "InternalFrameUI", basicPackageName + "BasicInternalFrameUI",
270 "DesktopPaneUI", basicPackageName + "BasicDesktopPaneUI",
271 "DesktopIconUI", basicPackageName + "BasicDesktopIconUI",
272 "OptionPaneUI", basicPackageName + "BasicOptionPaneUI",
273 "PanelUI", basicPackageName + "BasicPanelUI",
274 "ViewportUI", basicPackageName + "BasicViewportUI",
275 "RootPaneUI", basicPackageName + "BasicRootPaneUI",
276 };
277
278 table.putDefaults(uiDefaults);
279 }
280
281 /**
282 * Populates {@code table} with system colors. This creates an
283 * array of {@code name-color} pairs and invokes {@code
284 * loadSystemColors}.
285 * <p>
286 * The name is a {@code String} that corresponds to the name of
287 * one of the static {@code SystemColor} fields in the {@code
288 * SystemColor} class. A name-color pair is created for every
289 * such {@code SystemColor} field.
290 * <p>
291 * The {@code color} corresponds to a hex {@code String} as
292 * understood by {@code Color.decode}. For example, one of the
293 * {@code name-color} pairs is {@code
294 * "desktop"-"#005C5C"}. This corresponds to the {@code
295 * SystemColor} field {@code desktop}, with a color value of
296 * {@code new Color(0x005C5C)}.
297 * <p>
298 * The following shows two of the {@code name-color} pairs:
299 * <pre>
300 * String[] nameColorPairs = new String[] {
301 * "desktop", "#005C5C",
302 * "activeCaption", "#000080" };
303 * loadSystemColors(table, nameColorPairs, isNativeLookAndFeel());
304 * </pre>
305 *
306 * As previously stated, this invokes {@code loadSystemColors}
307 * with the supplied {@code table} and {@code name-color} pair
308 * array. The last argument to {@code loadSystemColors} indicates
309 * whether the value of the field in {@code SystemColor} should be
310 * used. This method passes the value of {@code
311 * isNativeLookAndFeel()} as the last argument to {@code loadSystemColors}.
312 *
313 * @param table the {@code UIDefaults} object the values are added to
314 * @throws NullPointerException if {@code table} is {@code null}
315 *
316 * @see java.awt.SystemColor
317 * @see #getDefaults
318 * @see #loadSystemColors
319 */
320 protected void initSystemColorDefaults(UIDefaults table)
321 {
322 String[] defaultSystemColors = {
323 "desktop", "#005C5C", /* Color of the desktop background */
324 "activeCaption", "#000080", /* Color for captions (title bars) when they are active. */
325 "activeCaptionText", "#FFFFFF", /* Text color for text in captions (title bars). */
326 "activeCaptionBorder", "#C0C0C0", /* Border color for caption (title bar) window borders. */
327 "inactiveCaption", "#808080", /* Color for captions (title bars) when not active. */
328 "inactiveCaptionText", "#C0C0C0", /* Text color for text in inactive captions (title bars). */
329 "inactiveCaptionBorder", "#C0C0C0", /* Border color for inactive caption (title bar) window borders. */
330 "window", "#FFFFFF", /* Default color for the interior of windows */
331 "windowBorder", "#000000", /* ??? */
332 "windowText", "#000000", /* ??? */
333 "menu", "#C0C0C0", /* Background color for menus */
334 "menuText", "#000000", /* Text color for menus */
335 "text", "#C0C0C0", /* Text background color */
336 "textText", "#000000", /* Text foreground color */
337 "textHighlight", "#000080", /* Text background color when selected */
338 "textHighlightText", "#FFFFFF", /* Text color when selected */
339 "textInactiveText", "#808080", /* Text color when disabled */
340 "control", "#C0C0C0", /* Default color for controls (buttons, sliders, etc) */
341 "controlText", "#000000", /* Default color for text in controls */
342 "controlHighlight", "#C0C0C0", /* Specular highlight (opposite of the shadow) */
343 "controlLtHighlight", "#FFFFFF", /* Highlight color for controls */
344 "controlShadow", "#808080", /* Shadow color for controls */
345 "controlDkShadow", "#000000", /* Dark shadow color for controls */
346 "scrollbar", "#E0E0E0", /* Scrollbar background (usually the "track") */
347 "info", "#FFFFE1", /* ??? */
348 "infoText", "#000000" /* ??? */
349 };
350
351 loadSystemColors(table, defaultSystemColors, isNativeLookAndFeel());
352 }
353
354
355 /**
356 * Populates {@code table} with the {@code name-color} pairs in
357 * {@code systemColors}. Refer to
358 * {@link #initSystemColorDefaults(UIDefaults)} for details on
359 * the format of {@code systemColors}.
360 * <p>
361 * An entry is added to {@code table} for each of the {@code name-color}
362 * pairs in {@code systemColors}. The entry key is
363 * the {@code name} of the {@code name-color} pair.
364 * <p>
365 * The value of the entry corresponds to the {@code color} of the
366 * {@code name-color} pair. The value of the entry is calculated
367 * in one of two ways. With either approach the value is always a
368 * {@code ColorUIResource}.
369 * <p>
370 * If {@code useNative} is {@code false}, the {@code color} is
371 * created by using {@code Color.decode} to convert the {@code
372 * String} into a {@code Color}. If {@code decode} can not convert
373 * the {@code String} into a {@code Color} ({@code
374 * NumberFormatException} is thrown) then a {@code
375 * ColorUIResource} of black is used.
376 * <p>
377 * If {@code useNative} is {@code true}, the {@code color} is the
378 * value of the field in {@code SystemColor} with the same name as
379 * the {@code name} of the {@code name-color} pair. If the field
380 * is not valid, a {@code ColorUIResource} of black is used.
381 *
382 * @param table the {@code UIDefaults} object the values are added to
383 * @param systemColors array of {@code name-color} pairs as described
384 * in {@link #initSystemColorDefaults(UIDefaults)}
385 * @param useNative whether the color is obtained from {@code SystemColor}
386 * or {@code Color.decode}
387 * @throws NullPointerException if {@code systemColors} is {@code null}; or
388 * {@code systemColors} is not empty, and {@code table} is
389 * {@code null}; or one of the
390 * names of the {@code name-color} pairs is {@code null}; or
391 * {@code useNative} is {@code false} and one of the
392 * {@code colors} of the {@code name-color} pairs is {@code null}
393 * @throws ArrayIndexOutOfBoundsException if {@code useNative} is
394 * {@code false} and {@code systemColors.length} is odd
395 *
396 * @see #initSystemColorDefaults(javax.swing.UIDefaults)
397 * @see java.awt.SystemColor
398 * @see java.awt.Color#decode(String)
399 */
400 protected void loadSystemColors(UIDefaults table, String[] systemColors, boolean useNative)
401 {
402 /* PENDING(hmuller) We don't load the system colors below because
403 * they're not reliable. Hopefully we'll be able to do better in
404 * a future version of AWT.
405 */
406 if (useNative) {
407 for(int i = 0; i < systemColors.length; i += 2) {
408 Color color = Color.black;
409 try {
410 String name = systemColors[i];
411 color = (Color)(SystemColor.class.getField(name).get(null));
412 } catch (Exception e) {
413 }
414 table.put(systemColors[i], new ColorUIResource(color));
415 }
416 } else {
417 for(int i = 0; i < systemColors.length; i += 2) {
418 Color color = Color.black;
419 try {
420 color = Color.decode(systemColors[i + 1]);
421 }
422 catch(NumberFormatException e) {
423 e.printStackTrace();
424 }
425 table.put(systemColors[i], new ColorUIResource(color));
426 }
427 }
428 }
429 /**
430 * Initialize the defaults table with the name of the ResourceBundle
431 * used for getting localized defaults. Also initialize the default
432 * locale used when no locale is passed into UIDefaults.get(). The
433 * default locale should generally not be relied upon. It is here for
434 * compatability with releases prior to 1.4.
435 */
436 private void initResourceBundle(UIDefaults table) {
437 table.setDefaultLocale( Locale.getDefault() );
438 table.addResourceBundle( "com.sun.swing.internal.plaf.basic.resources.basic" );
439 }
440
441 /**
442 * Populates {@code table} with the defaults for the basic look and
443 * feel.
444 *
445 * @param table the {@code UIDefaults} to add the values to
446 * @throws NullPointerException if {@code table} is {@code null}
447 */
448 protected void initComponentDefaults(UIDefaults table)
449 {
450
451 initResourceBundle(table);
452
453 // *** Shared Integers
454 Integer fiveHundred = new Integer(500);
455
456 // *** Shared Longs
457 Long oneThousand = new Long(1000);
458
459 // *** Shared Fonts
460 Integer twelve = new Integer(12);
461 Integer fontPlain = new Integer(Font.PLAIN);
462 Integer fontBold = new Integer(Font.BOLD);
463 Object dialogPlain12 = new SwingLazyValue(
464 "javax.swing.plaf.FontUIResource",
465 null,
466 new Object[] {Font.DIALOG, fontPlain, twelve});
467 Object serifPlain12 = new SwingLazyValue(
468 "javax.swing.plaf.FontUIResource",
469 null,
470 new Object[] {Font.SERIF, fontPlain, twelve});
471 Object sansSerifPlain12 = new SwingLazyValue(
472 "javax.swing.plaf.FontUIResource",
473 null,
474 new Object[] {Font.SANS_SERIF, fontPlain, twelve});
475 Object monospacedPlain12 = new SwingLazyValue(
476 "javax.swing.plaf.FontUIResource",
477 null,
478 new Object[] {Font.MONOSPACED, fontPlain, twelve});
479 Object dialogBold12 = new SwingLazyValue(
480 "javax.swing.plaf.FontUIResource",
481 null,
482 new Object[] {Font.DIALOG, fontBold, twelve});
483
484
485 // *** Shared Colors
486 ColorUIResource red = new ColorUIResource(Color.red);
487 ColorUIResource black = new ColorUIResource(Color.black);
488 ColorUIResource white = new ColorUIResource(Color.white);
489 ColorUIResource yellow = new ColorUIResource(Color.yellow);
490 ColorUIResource gray = new ColorUIResource(Color.gray);
491 ColorUIResource lightGray = new ColorUIResource(Color.lightGray);
492 ColorUIResource darkGray = new ColorUIResource(Color.darkGray);
493 ColorUIResource scrollBarTrack = new ColorUIResource(224, 224, 224);
494
495 Color control = table.getColor("control");
496 Color controlDkShadow = table.getColor("controlDkShadow");
497 Color controlHighlight = table.getColor("controlHighlight");
498 Color controlLtHighlight = table.getColor("controlLtHighlight");
499 Color controlShadow = table.getColor("controlShadow");
500 Color controlText = table.getColor("controlText");
501 Color menu = table.getColor("menu");
502 Color menuText = table.getColor("menuText");
503 Color textHighlight = table.getColor("textHighlight");
504 Color textHighlightText = table.getColor("textHighlightText");
505 Color textInactiveText = table.getColor("textInactiveText");
506 Color textText = table.getColor("textText");
507 Color window = table.getColor("window");
508
509 // *** Shared Insets
510 InsetsUIResource zeroInsets = new InsetsUIResource(0,0,0,0);
511 InsetsUIResource twoInsets = new InsetsUIResource(2,2,2,2);
512 InsetsUIResource threeInsets = new InsetsUIResource(3,3,3,3);
513
514 // *** Shared Borders
515 Object marginBorder = new SwingLazyValue(
516 "javax.swing.plaf.basic.BasicBorders$MarginBorder");
517 Object etchedBorder = new SwingLazyValue(
518 "javax.swing.plaf.BorderUIResource",
519 "getEtchedBorderUIResource");
520 Object loweredBevelBorder = new SwingLazyValue(
521 "javax.swing.plaf.BorderUIResource",
522 "getLoweredBevelBorderUIResource");
523
524 Object popupMenuBorder = new SwingLazyValue(
525 "javax.swing.plaf.basic.BasicBorders",
526 "getInternalFrameBorder");
527
528 Object blackLineBorder = new SwingLazyValue(
529 "javax.swing.plaf.BorderUIResource",
530 "getBlackLineBorderUIResource");
531 Object focusCellHighlightBorder = new SwingLazyValue(
532 "javax.swing.plaf.BorderUIResource$LineBorderUIResource",
533 null,
534 new Object[] {yellow});
535
536 Object noFocusBorder = new BorderUIResource.EmptyBorderUIResource(1,1,1,1);
537
538 Object tableHeaderBorder = new SwingLazyValue(
539 "javax.swing.plaf.BorderUIResource$BevelBorderUIResource",
540 null,
541 new Object[] { new Integer(BevelBorder.RAISED),
542 controlLtHighlight,
543 control,
544 controlDkShadow,
545 controlShadow });
546
547
548 // *** Button value objects
549
550 Object buttonBorder =
551 new SwingLazyValue(
552 "javax.swing.plaf.basic.BasicBorders",
553 "getButtonBorder");
554
555 Object buttonToggleBorder =
556 new SwingLazyValue(
557 "javax.swing.plaf.basic.BasicBorders",
558 "getToggleButtonBorder");
559
560 Object radioButtonBorder =
561 new SwingLazyValue(
562 "javax.swing.plaf.basic.BasicBorders",
563 "getRadioButtonBorder");
564
565 // *** FileChooser / FileView value objects
566
567 Object newFolderIcon = SwingUtilities2.makeIcon(getClass(),
568 BasicLookAndFeel.class,
569 "icons/NewFolder.gif");
570 Object upFolderIcon = SwingUtilities2.makeIcon(getClass(),
571 BasicLookAndFeel.class,
572 "icons/UpFolder.gif");
573 Object homeFolderIcon = SwingUtilities2.makeIcon(getClass(),
574 BasicLookAndFeel.class,
575 "icons/HomeFolder.gif");
576 Object detailsViewIcon = SwingUtilities2.makeIcon(getClass(),
577 BasicLookAndFeel.class,
578 "icons/DetailsView.gif");
579 Object listViewIcon = SwingUtilities2.makeIcon(getClass(),
580 BasicLookAndFeel.class,
581 "icons/ListView.gif");
582 Object directoryIcon = SwingUtilities2.makeIcon(getClass(),
583 BasicLookAndFeel.class,
584 "icons/Directory.gif");
585 Object fileIcon = SwingUtilities2.makeIcon(getClass(),
586 BasicLookAndFeel.class,
587 "icons/File.gif");
588 Object computerIcon = SwingUtilities2.makeIcon(getClass(),
589 BasicLookAndFeel.class,
590 "icons/Computer.gif");
591 Object hardDriveIcon = SwingUtilities2.makeIcon(getClass(),
592 BasicLookAndFeel.class,
593 "icons/HardDrive.gif");
594 Object floppyDriveIcon = SwingUtilities2.makeIcon(getClass(),
595 BasicLookAndFeel.class,
596 "icons/FloppyDrive.gif");
597
598
599 // *** InternalFrame value objects
600
601 Object internalFrameBorder = new SwingLazyValue(
602 "javax.swing.plaf.basic.BasicBorders",
603 "getInternalFrameBorder");
604
605 // *** List value objects
606
607 Object listCellRendererActiveValue = new UIDefaults.ActiveValue() {
608 public Object createValue(UIDefaults table) {
609 return new DefaultListCellRenderer.UIResource();
610 }
611 };
612
613
614 // *** Menus value objects
615
616 Object menuBarBorder =
617 new SwingLazyValue(
618 "javax.swing.plaf.basic.BasicBorders",
619 "getMenuBarBorder");
620
621 Object menuItemCheckIcon =
622 new SwingLazyValue(
623 "javax.swing.plaf.basic.BasicIconFactory",
624 "getMenuItemCheckIcon");
625
626 Object menuItemArrowIcon =
627 new SwingLazyValue(
628 "javax.swing.plaf.basic.BasicIconFactory",
629 "getMenuItemArrowIcon");
630
631
632 Object menuArrowIcon =
633 new SwingLazyValue(
634 "javax.swing.plaf.basic.BasicIconFactory",
635 "getMenuArrowIcon");
636
637 Object checkBoxIcon =
638 new SwingLazyValue(
639 "javax.swing.plaf.basic.BasicIconFactory",
640 "getCheckBoxIcon");
641
642 Object radioButtonIcon =
643 new SwingLazyValue(
644 "javax.swing.plaf.basic.BasicIconFactory",
645 "getRadioButtonIcon");
646
647 Object checkBoxMenuItemIcon =
648 new SwingLazyValue(
649 "javax.swing.plaf.basic.BasicIconFactory",
650 "getCheckBoxMenuItemIcon");
651
652 Object radioButtonMenuItemIcon =
653 new SwingLazyValue(
654 "javax.swing.plaf.basic.BasicIconFactory",
655 "getRadioButtonMenuItemIcon");
656
657 Object menuItemAcceleratorDelimiter = new String("+");
658
659 // *** OptionPane value objects
660
661 Object optionPaneMinimumSize = new DimensionUIResource(262, 90);
662
663 Integer zero = new Integer(0);
664 Object zeroBorder = new SwingLazyValue(
665 "javax.swing.plaf.BorderUIResource$EmptyBorderUIResource",
666 new Object[] {zero, zero, zero, zero});
667
668 Integer ten = new Integer(10);
669 Object optionPaneBorder = new SwingLazyValue(
670 "javax.swing.plaf.BorderUIResource$EmptyBorderUIResource",
671 new Object[] {ten, ten, twelve, ten});
672
673 Object optionPaneButtonAreaBorder = new SwingLazyValue(
674 "javax.swing.plaf.BorderUIResource$EmptyBorderUIResource",
675 new Object[] {new Integer(6), zero, zero, zero});
676
677
678 // *** ProgessBar value objects
679
680 Object progressBarBorder =
681 new SwingLazyValue(
682 "javax.swing.plaf.basic.BasicBorders",
683 "getProgressBarBorder");
684
685 // ** ScrollBar value objects
686
687 Object minimumThumbSize = new DimensionUIResource(8,8);
688 Object maximumThumbSize = new DimensionUIResource(4096,4096);
689
690 // ** Slider value objects
691
692 Object sliderFocusInsets = twoInsets;
693
694 Object toolBarSeparatorSize = new DimensionUIResource( 10, 10 );
695
696
697 // *** SplitPane value objects
698
699 Object splitPaneBorder =
700 new SwingLazyValue(
701 "javax.swing.plaf.basic.BasicBorders",
702 "getSplitPaneBorder");
703 Object splitPaneDividerBorder =
704 new SwingLazyValue(
705 "javax.swing.plaf.basic.BasicBorders",
706 "getSplitPaneDividerBorder");
707
708 // ** TabbedBane value objects
709
710 Object tabbedPaneTabInsets = new InsetsUIResource(0, 4, 1, 4);
711
712 Object tabbedPaneTabPadInsets = new InsetsUIResource(2, 2, 2, 1);
713
714 Object tabbedPaneTabAreaInsets = new InsetsUIResource(3, 2, 0, 2);
715
716 Object tabbedPaneContentBorderInsets = new InsetsUIResource(2, 2, 3, 3);
717
718
719 // *** Text value objects
720
721 Object textFieldBorder =
722 new SwingLazyValue(
723 "javax.swing.plaf.basic.BasicBorders",
724 "getTextFieldBorder");
725
726 Object editorMargin = threeInsets;
727
728 Object caretBlinkRate = fiveHundred;
729 Integer four = new Integer(4);
730
731 Object[] allAuditoryCues = new Object[] {
732 "CheckBoxMenuItem.commandSound",
733 "InternalFrame.closeSound",
734 "InternalFrame.maximizeSound",
735 "InternalFrame.minimizeSound",
736 "InternalFrame.restoreDownSound",
737 "InternalFrame.restoreUpSound",
738 "MenuItem.commandSound",
739 "OptionPane.errorSound",
740 "OptionPane.informationSound",
741 "OptionPane.questionSound",
742 "OptionPane.warningSound",
743 "PopupMenu.popupSound",
744 "RadioButtonMenuItem.commandSound"};
745
746 Object[] noAuditoryCues = new Object[] {"mute"};
747
748 // *** Component Defaults
749
750 Object[] defaults = {
751 // *** Auditory Feedback
752 "AuditoryCues.cueList", allAuditoryCues,
753 "AuditoryCues.allAuditoryCues", allAuditoryCues,
754 "AuditoryCues.noAuditoryCues", noAuditoryCues,
755 // this key defines which of the various cues to render.
756 // L&Fs that want auditory feedback NEED to override playList.
757 "AuditoryCues.playList", null,
758
759 // *** Buttons
760 "Button.defaultButtonFollowsFocus", Boolean.TRUE,
761 "Button.font", dialogPlain12,
762 "Button.background", control,
763 "Button.foreground", controlText,
764 "Button.shadow", controlShadow,
765 "Button.darkShadow", controlDkShadow,
766 "Button.light", controlHighlight,
767 "Button.highlight", controlLtHighlight,
768 "Button.border", buttonBorder,
769 "Button.margin", new InsetsUIResource(2, 14, 2, 14),
770 "Button.textIconGap", four,
771 "Button.textShiftOffset", zero,
772 "Button.focusInputMap", new UIDefaults.LazyInputMap(new Object[] {
773 "SPACE", "pressed",
774 "released SPACE", "released",
775 "ENTER", "pressed",
776 "released ENTER", "released"
777 }),
778
779 "ToggleButton.font", dialogPlain12,
780 "ToggleButton.background", control,
781 "ToggleButton.foreground", controlText,
782 "ToggleButton.shadow", controlShadow,
783 "ToggleButton.darkShadow", controlDkShadow,
784 "ToggleButton.light", controlHighlight,
785 "ToggleButton.highlight", controlLtHighlight,
786 "ToggleButton.border", buttonToggleBorder,
787 "ToggleButton.margin", new InsetsUIResource(2, 14, 2, 14),
788 "ToggleButton.textIconGap", four,
789 "ToggleButton.textShiftOffset", zero,
790 "ToggleButton.focusInputMap",
791 new UIDefaults.LazyInputMap(new Object[] {
792 "SPACE", "pressed",
793 "released SPACE", "released"
794 }),
795
796 "RadioButton.font", dialogPlain12,
797 "RadioButton.background", control,
798 "RadioButton.foreground", controlText,
799 "RadioButton.shadow", controlShadow,
800 "RadioButton.darkShadow", controlDkShadow,
801 "RadioButton.light", controlHighlight,
802 "RadioButton.highlight", controlLtHighlight,
803 "RadioButton.border", radioButtonBorder,
804 "RadioButton.margin", twoInsets,
805 "RadioButton.textIconGap", four,
806 "RadioButton.textShiftOffset", zero,
807 "RadioButton.icon", radioButtonIcon,
808 "RadioButton.focusInputMap",
809 new UIDefaults.LazyInputMap(new Object[] {
810 "SPACE", "pressed",
811 "released SPACE", "released",
812 "RETURN", "pressed"
813 }),
814
815 "CheckBox.font", dialogPlain12,
816 "CheckBox.background", control,
817 "CheckBox.foreground", controlText,
818 "CheckBox.border", radioButtonBorder,
819 "CheckBox.margin", twoInsets,
820 "CheckBox.textIconGap", four,
821 "CheckBox.textShiftOffset", zero,
822 "CheckBox.icon", checkBoxIcon,
823 "CheckBox.focusInputMap",
824 new UIDefaults.LazyInputMap(new Object[] {
825 "SPACE", "pressed",
826 "released SPACE", "released"
827 }),
828 "FileChooser.useSystemExtensionHiding", Boolean.FALSE,
829
830 // *** ColorChooser
831 "ColorChooser.font", dialogPlain12,
832 "ColorChooser.background", control,
833 "ColorChooser.foreground", controlText,
834
835 "ColorChooser.swatchesSwatchSize", new Dimension(10, 10),
836 "ColorChooser.swatchesRecentSwatchSize", new Dimension(10, 10),
837 "ColorChooser.swatchesDefaultRecentColor", control,
838
839 // *** ComboBox
840 "ComboBox.font", sansSerifPlain12,
841 "ComboBox.background", window,
842 "ComboBox.foreground", textText,
843 "ComboBox.buttonBackground", control,
844 "ComboBox.buttonShadow", controlShadow,
845 "ComboBox.buttonDarkShadow", controlDkShadow,
846 "ComboBox.buttonHighlight", controlLtHighlight,
847 "ComboBox.selectionBackground", textHighlight,
848 "ComboBox.selectionForeground", textHighlightText,
849 "ComboBox.disabledBackground", control,
850 "ComboBox.disabledForeground", textInactiveText,
851 "ComboBox.timeFactor", oneThousand,
852 "ComboBox.isEnterSelectablePopup", Boolean.FALSE,
853 "ComboBox.ancestorInputMap",
854 new UIDefaults.LazyInputMap(new Object[] {
855 "ESCAPE", "hidePopup",
856 "PAGE_UP", "pageUpPassThrough",
857 "PAGE_DOWN", "pageDownPassThrough",
858 "HOME", "homePassThrough",
859 "END", "endPassThrough",
860 "ENTER", "enterPressed"
861 }),
862
863 // *** FileChooser
864
865 "FileChooser.newFolderIcon", newFolderIcon,
866 "FileChooser.upFolderIcon", upFolderIcon,
867 "FileChooser.homeFolderIcon", homeFolderIcon,
868 "FileChooser.detailsViewIcon", detailsViewIcon,
869 "FileChooser.listViewIcon", listViewIcon,
870 "FileChooser.readOnly", Boolean.FALSE,
871 "FileChooser.usesSingleFilePane", Boolean.FALSE,
872 "FileChooser.ancestorInputMap",
873 new UIDefaults.LazyInputMap(new Object[] {
874 "ESCAPE", "cancelSelection",
875 "F5", "refresh",
876 }),
877
878 "FileView.directoryIcon", directoryIcon,
879 "FileView.fileIcon", fileIcon,
880 "FileView.computerIcon", computerIcon,
881 "FileView.hardDriveIcon", hardDriveIcon,
882 "FileView.floppyDriveIcon", floppyDriveIcon,
883
884 // *** InternalFrame
885 "InternalFrame.titleFont", dialogBold12,
886 "InternalFrame.borderColor", control,
887 "InternalFrame.borderShadow", controlShadow,
888 "InternalFrame.borderDarkShadow", controlDkShadow,
889 "InternalFrame.borderHighlight", controlLtHighlight,
890 "InternalFrame.borderLight", controlHighlight,
891 "InternalFrame.border", internalFrameBorder,
892 "InternalFrame.icon", SwingUtilities2.makeIcon(getClass(),
893 BasicLookAndFeel.class,
894 "icons/JavaCup16.png"),
895
896 /* Default frame icons are undefined for Basic. */
897 "InternalFrame.maximizeIcon",
898 new SwingLazyValue(
899 "javax.swing.plaf.basic.BasicIconFactory",
900 "createEmptyFrameIcon"),
901 "InternalFrame.minimizeIcon",
902 new SwingLazyValue(
903 "javax.swing.plaf.basic.BasicIconFactory",
904 "createEmptyFrameIcon"),
905 "InternalFrame.iconifyIcon",
906 new SwingLazyValue(
907 "javax.swing.plaf.basic.BasicIconFactory",
908 "createEmptyFrameIcon"),
909 "InternalFrame.closeIcon",
910 new SwingLazyValue(
911 "javax.swing.plaf.basic.BasicIconFactory",
912 "createEmptyFrameIcon"),
913 // InternalFrame Auditory Cue Mappings
914 "InternalFrame.closeSound", null,
915 "InternalFrame.maximizeSound", null,
916 "InternalFrame.minimizeSound", null,
917 "InternalFrame.restoreDownSound", null,
918 "InternalFrame.restoreUpSound", null,
919
920 "InternalFrame.activeTitleBackground", table.get("activeCaption"),
921 "InternalFrame.activeTitleForeground", table.get("activeCaptionText"),
922 "InternalFrame.inactiveTitleBackground", table.get("inactiveCaption"),
923 "InternalFrame.inactiveTitleForeground", table.get("inactiveCaptionText"),
924 "InternalFrame.windowBindings", new Object[] {
925 "shift ESCAPE", "showSystemMenu",
926 "ctrl SPACE", "showSystemMenu",
927 "ESCAPE", "hideSystemMenu"},
928
929 "InternalFrameTitlePane.iconifyButtonOpacity", Boolean.TRUE,
930 "InternalFrameTitlePane.maximizeButtonOpacity", Boolean.TRUE,
931 "InternalFrameTitlePane.closeButtonOpacity", Boolean.TRUE,
932
933 "DesktopIcon.border", internalFrameBorder,
934
935 "Desktop.minOnScreenInsets", threeInsets,
936 "Desktop.background", table.get("desktop"),
937 "Desktop.ancestorInputMap",
938 new UIDefaults.LazyInputMap(new Object[] {
939 "ctrl F5", "restore",
940 "ctrl F4", "close",
941 "ctrl F7", "move",
942 "ctrl F8", "resize",
943 "RIGHT", "right",
944 "KP_RIGHT", "right",
945 "shift RIGHT", "shrinkRight",
946 "shift KP_RIGHT", "shrinkRight",
947 "LEFT", "left",
948 "KP_LEFT", "left",
949 "shift LEFT", "shrinkLeft",
950 "shift KP_LEFT", "shrinkLeft",
951 "UP", "up",
952 "KP_UP", "up",
953 "shift UP", "shrinkUp",
954 "shift KP_UP", "shrinkUp",
955 "DOWN", "down",
956 "KP_DOWN", "down",
957 "shift DOWN", "shrinkDown",
958 "shift KP_DOWN", "shrinkDown",
959 "ESCAPE", "escape",
960 "ctrl F9", "minimize",
961 "ctrl F10", "maximize",
962 "ctrl F6", "selectNextFrame",
963 "ctrl TAB", "selectNextFrame",
964 "ctrl alt F6", "selectNextFrame",
965 "shift ctrl alt F6", "selectPreviousFrame",
966 "ctrl F12", "navigateNext",
967 "shift ctrl F12", "navigatePrevious"
968 }),
969
970 // *** Label
971 "Label.font", dialogPlain12,
972 "Label.background", control,
973 "Label.foreground", controlText,
974 "Label.disabledForeground", white,
975 "Label.disabledShadow", controlShadow,
976 "Label.border", null,
977
978 // *** List
979 "List.font", dialogPlain12,
980 "List.background", window,
981 "List.foreground", textText,
982 "List.selectionBackground", textHighlight,
983 "List.selectionForeground", textHighlightText,
984 "List.noFocusBorder", noFocusBorder,
985 "List.focusCellHighlightBorder", focusCellHighlightBorder,
986 "List.dropLineColor", controlShadow,
987 "List.border", null,
988 "List.cellRenderer", listCellRendererActiveValue,
989 "List.timeFactor", oneThousand,
990 "List.focusInputMap",
991 new UIDefaults.LazyInputMap(new Object[] {
992 "ctrl C", "copy",
993 "ctrl V", "paste",
994 "ctrl X", "cut",
995 "COPY", "copy",
996 "PASTE", "paste",
997 "CUT", "cut",
998 "control INSERT", "copy",
999 "shift INSERT", "paste",
1000 "shift DELETE", "cut",
1001 "UP", "selectPreviousRow",
1002 "KP_UP", "selectPreviousRow",
1003 "shift UP", "selectPreviousRowExtendSelection",
1004 "shift KP_UP", "selectPreviousRowExtendSelection",
1005 "ctrl shift UP", "selectPreviousRowExtendSelection",
1006 "ctrl shift KP_UP", "selectPreviousRowExtendSelection",
1007 "ctrl UP", "selectPreviousRowChangeLead",
1008 "ctrl KP_UP", "selectPreviousRowChangeLead",
1009 "DOWN", "selectNextRow",
1010 "KP_DOWN", "selectNextRow",
1011 "shift DOWN", "selectNextRowExtendSelection",
1012 "shift KP_DOWN", "selectNextRowExtendSelection",
1013 "ctrl shift DOWN", "selectNextRowExtendSelection",
1014 "ctrl shift KP_DOWN", "selectNextRowExtendSelection",
1015 "ctrl DOWN", "selectNextRowChangeLead",
1016 "ctrl KP_DOWN", "selectNextRowChangeLead",
1017 "LEFT", "selectPreviousColumn",
1018 "KP_LEFT", "selectPreviousColumn",
1019 "shift LEFT", "selectPreviousColumnExtendSelection",
1020 "shift KP_LEFT", "selectPreviousColumnExtendSelection",
1021 "ctrl shift LEFT", "selectPreviousColumnExtendSelection",
1022 "ctrl shift KP_LEFT", "selectPreviousColumnExtendSelection",
1023 "ctrl LEFT", "selectPreviousColumnChangeLead",
1024 "ctrl KP_LEFT", "selectPreviousColumnChangeLead",
1025 "RIGHT", "selectNextColumn",
1026 "KP_RIGHT", "selectNextColumn",
1027 "shift RIGHT", "selectNextColumnExtendSelection",
1028 "shift KP_RIGHT", "selectNextColumnExtendSelection",
1029 "ctrl shift RIGHT", "selectNextColumnExtendSelection",
1030 "ctrl shift KP_RIGHT", "selectNextColumnExtendSelection",
1031 "ctrl RIGHT", "selectNextColumnChangeLead",
1032 "ctrl KP_RIGHT", "selectNextColumnChangeLead",
1033 "HOME", "selectFirstRow",
1034 "shift HOME", "selectFirstRowExtendSelection",
1035 "ctrl shift HOME", "selectFirstRowExtendSelection",
1036 "ctrl HOME", "selectFirstRowChangeLead",
1037 "END", "selectLastRow",
1038 "shift END", "selectLastRowExtendSelection",
1039 "ctrl shift END", "selectLastRowExtendSelection",
1040 "ctrl END", "selectLastRowChangeLead",
1041 "PAGE_UP", "scrollUp",
1042 "shift PAGE_UP", "scrollUpExtendSelection",
1043 "ctrl shift PAGE_UP", "scrollUpExtendSelection",
1044 "ctrl PAGE_UP", "scrollUpChangeLead",
1045 "PAGE_DOWN", "scrollDown",
1046 "shift PAGE_DOWN", "scrollDownExtendSelection",
1047 "ctrl shift PAGE_DOWN", "scrollDownExtendSelection",
1048 "ctrl PAGE_DOWN", "scrollDownChangeLead",
1049 "ctrl A", "selectAll",
1050 "ctrl SLASH", "selectAll",
1051 "ctrl BACK_SLASH", "clearSelection",
1052 "SPACE", "addToSelection",
1053 "ctrl SPACE", "toggleAndAnchor",
1054 "shift SPACE", "extendTo",
1055 "ctrl shift SPACE", "moveSelectionTo"
1056 }),
1057 "List.focusInputMap.RightToLeft",
1058 new UIDefaults.LazyInputMap(new Object[] {
1059 "LEFT", "selectNextColumn",
1060 "KP_LEFT", "selectNextColumn",
1061 "shift LEFT", "selectNextColumnExtendSelection",
1062 "shift KP_LEFT", "selectNextColumnExtendSelection",
1063 "ctrl shift LEFT", "selectNextColumnExtendSelection",
1064 "ctrl shift KP_LEFT", "selectNextColumnExtendSelection",
1065 "ctrl LEFT", "selectNextColumnChangeLead",
1066 "ctrl KP_LEFT", "selectNextColumnChangeLead",
1067 "RIGHT", "selectPreviousColumn",
1068 "KP_RIGHT", "selectPreviousColumn",
1069 "shift RIGHT", "selectPreviousColumnExtendSelection",
1070 "shift KP_RIGHT", "selectPreviousColumnExtendSelection",
1071 "ctrl shift RIGHT", "selectPreviousColumnExtendSelection",
1072 "ctrl shift KP_RIGHT", "selectPreviousColumnExtendSelection",
1073 "ctrl RIGHT", "selectPreviousColumnChangeLead",
1074 "ctrl KP_RIGHT", "selectPreviousColumnChangeLead",
1075 }),
1076
1077 // *** Menus
1078 "MenuBar.font", dialogPlain12,
1079 "MenuBar.background", menu,
1080 "MenuBar.foreground", menuText,
1081 "MenuBar.shadow", controlShadow,
1082 "MenuBar.highlight", controlLtHighlight,
1083 "MenuBar.border", menuBarBorder,
1084 "MenuBar.windowBindings", new Object[] {
1085 "F10", "takeFocus" },
1086
1087 "MenuItem.font", dialogPlain12,
1088 "MenuItem.acceleratorFont", dialogPlain12,
1089 "MenuItem.background", menu,
1090 "MenuItem.foreground", menuText,
1091 "MenuItem.selectionForeground", textHighlightText,
1092 "MenuItem.selectionBackground", textHighlight,
1093 "MenuItem.disabledForeground", null,
1094 "MenuItem.acceleratorForeground", menuText,
1095 "MenuItem.acceleratorSelectionForeground", textHighlightText,
1096 "MenuItem.acceleratorDelimiter", menuItemAcceleratorDelimiter,
1097 "MenuItem.border", marginBorder,
1098 "MenuItem.borderPainted", Boolean.FALSE,
1099 "MenuItem.margin", twoInsets,
1100 "MenuItem.checkIcon", menuItemCheckIcon,
1101 "MenuItem.arrowIcon", menuItemArrowIcon,
1102 "MenuItem.commandSound", null,
1103
1104 "RadioButtonMenuItem.font", dialogPlain12,
1105 "RadioButtonMenuItem.acceleratorFont", dialogPlain12,
1106 "RadioButtonMenuItem.background", menu,
1107 "RadioButtonMenuItem.foreground", menuText,
1108 "RadioButtonMenuItem.selectionForeground", textHighlightText,
1109 "RadioButtonMenuItem.selectionBackground", textHighlight,
1110 "RadioButtonMenuItem.disabledForeground", null,
1111 "RadioButtonMenuItem.acceleratorForeground", menuText,
1112 "RadioButtonMenuItem.acceleratorSelectionForeground", textHighlightText,
1113 "RadioButtonMenuItem.border", marginBorder,
1114 "RadioButtonMenuItem.borderPainted", Boolean.FALSE,
1115 "RadioButtonMenuItem.margin", twoInsets,
1116 "RadioButtonMenuItem.checkIcon", radioButtonMenuItemIcon,
1117 "RadioButtonMenuItem.arrowIcon", menuItemArrowIcon,
1118 "RadioButtonMenuItem.commandSound", null,
1119
1120 "CheckBoxMenuItem.font", dialogPlain12,
1121 "CheckBoxMenuItem.acceleratorFont", dialogPlain12,
1122 "CheckBoxMenuItem.background", menu,
1123 "CheckBoxMenuItem.foreground", menuText,
1124 "CheckBoxMenuItem.selectionForeground", textHighlightText,
1125 "CheckBoxMenuItem.selectionBackground", textHighlight,
1126 "CheckBoxMenuItem.disabledForeground", null,
1127 "CheckBoxMenuItem.acceleratorForeground", menuText,
1128 "CheckBoxMenuItem.acceleratorSelectionForeground", textHighlightText,
1129 "CheckBoxMenuItem.border", marginBorder,
1130 "CheckBoxMenuItem.borderPainted", Boolean.FALSE,
1131 "CheckBoxMenuItem.margin", twoInsets,
1132 "CheckBoxMenuItem.checkIcon", checkBoxMenuItemIcon,
1133 "CheckBoxMenuItem.arrowIcon", menuItemArrowIcon,
1134 "CheckBoxMenuItem.commandSound", null,
1135
1136 "Menu.font", dialogPlain12,
1137 "Menu.acceleratorFont", dialogPlain12,
1138 "Menu.background", menu,
1139 "Menu.foreground", menuText,
1140 "Menu.selectionForeground", textHighlightText,
1141 "Menu.selectionBackground", textHighlight,
1142 "Menu.disabledForeground", null,
1143 "Menu.acceleratorForeground", menuText,
1144 "Menu.acceleratorSelectionForeground", textHighlightText,
1145 "Menu.border", marginBorder,
1146 "Menu.borderPainted", Boolean.FALSE,
1147 "Menu.margin", twoInsets,
1148 "Menu.checkIcon", menuItemCheckIcon,
1149 "Menu.arrowIcon", menuArrowIcon,
1150 "Menu.menuPopupOffsetX", new Integer(0),
1151 "Menu.menuPopupOffsetY", new Integer(0),
1152 "Menu.submenuPopupOffsetX", new Integer(0),
1153 "Menu.submenuPopupOffsetY", new Integer(0),
1154 "Menu.shortcutKeys", new int[] {KeyEvent.ALT_MASK},
1155 "Menu.crossMenuMnemonic", Boolean.TRUE,
1156 // Menu.cancelMode affects the cancel menu action behaviour;
1157 // currently supports:
1158 // "hideLastSubmenu" (default)
1159 // hides the last open submenu,
1160 // and move selection one step back
1161 // "hideMenuTree"
1162 // resets selection and
1163 // hide the entire structure of open menu and its submenus
1164 "Menu.cancelMode", "hideLastSubmenu",
1165
1166 // Menu.preserveTopLevelSelection affects
1167 // the cancel menu action behaviour
1168 // if set to true then top level menu selection
1169 // will be preserved when the last popup was cancelled;
1170 // the menu itself will be unselect with the next cancel action
1171 "Menu.preserveTopLevelSelection", Boolean.FALSE,
1172
1173 // PopupMenu
1174 "PopupMenu.font", dialogPlain12,
1175 "PopupMenu.background", menu,
1176 "PopupMenu.foreground", menuText,
1177 "PopupMenu.border", popupMenuBorder,
1178 // Internal Frame Auditory Cue Mappings
1179 "PopupMenu.popupSound", null,
1180 // These window InputMap bindings are used when the Menu is
1181 // selected.
1182 "PopupMenu.selectedWindowInputMapBindings", new Object[] {
1183 "ESCAPE", "cancel",
1184 "DOWN", "selectNext",
1185 "KP_DOWN", "selectNext",
1186 "UP", "selectPrevious",
1187 "KP_UP", "selectPrevious",
1188 "LEFT", "selectParent",
1189 "KP_LEFT", "selectParent",
1190 "RIGHT", "selectChild",
1191 "KP_RIGHT", "selectChild",
1192 "ENTER", "return",
1193 "ctrl ENTER", "return",
1194 "SPACE", "return"
1195 },
1196 "PopupMenu.selectedWindowInputMapBindings.RightToLeft", new Object[] {
1197 "LEFT", "selectChild",
1198 "KP_LEFT", "selectChild",
1199 "RIGHT", "selectParent",
1200 "KP_RIGHT", "selectParent",
1201 },
1202 "PopupMenu.consumeEventOnClose", Boolean.FALSE,
1203
1204 // *** OptionPane
1205 // You can additionaly define OptionPane.messageFont which will
1206 // dictate the fonts used for the message, and
1207 // OptionPane.buttonFont, which defines the font for the buttons.
1208 "OptionPane.font", dialogPlain12,
1209 "OptionPane.background", control,
1210 "OptionPane.foreground", controlText,
1211 "OptionPane.messageForeground", controlText,
1212 "OptionPane.border", optionPaneBorder,
1213 "OptionPane.messageAreaBorder", zeroBorder,
1214 "OptionPane.buttonAreaBorder", optionPaneButtonAreaBorder,
1215 "OptionPane.minimumSize", optionPaneMinimumSize,
1216 "OptionPane.errorIcon", SwingUtilities2.makeIcon(getClass(),
1217 BasicLookAndFeel.class,
1218 "icons/Error.gif"),
1219 "OptionPane.informationIcon", SwingUtilities2.makeIcon(getClass(),
1220 BasicLookAndFeel.class,
1221 "icons/Inform.gif"),
1222 "OptionPane.warningIcon", SwingUtilities2.makeIcon(getClass(),
1223 BasicLookAndFeel.class,
1224 "icons/Warn.gif"),
1225 "OptionPane.questionIcon", SwingUtilities2.makeIcon(getClass(),
1226 BasicLookAndFeel.class,
1227 "icons/Question.gif"),
1228 "OptionPane.windowBindings", new Object[] {
1229 "ESCAPE", "close" },
1230 // OptionPane Auditory Cue Mappings
1231 "OptionPane.errorSound", null,
1232 "OptionPane.informationSound", null, // Info and Plain
1233 "OptionPane.questionSound", null,
1234 "OptionPane.warningSound", null,
1235 "OptionPane.buttonClickThreshhold", fiveHundred,
1236
1237 // *** Panel
1238 "Panel.font", dialogPlain12,
1239 "Panel.background", control,
1240 "Panel.foreground", textText,
1241
1242 // *** ProgressBar
1243 "ProgressBar.font", dialogPlain12,
1244 "ProgressBar.foreground", textHighlight,
1245 "ProgressBar.background", control,
1246 "ProgressBar.selectionForeground", control,
1247 "ProgressBar.selectionBackground", textHighlight,
1248 "ProgressBar.border", progressBarBorder,
1249 "ProgressBar.cellLength", new Integer(1),
1250 "ProgressBar.cellSpacing", zero,
1251 "ProgressBar.repaintInterval", new Integer(50),
1252 "ProgressBar.cycleTime", new Integer(3000),
1253 "ProgressBar.horizontalSize", new DimensionUIResource(146, 12),
1254 "ProgressBar.verticalSize", new DimensionUIResource(12, 146),
1255
1256 // *** Separator
1257 "Separator.shadow", controlShadow, // DEPRECATED - DO NOT USE!
1258 "Separator.highlight", controlLtHighlight, // DEPRECATED - DO NOT USE!
1259
1260 "Separator.background", controlLtHighlight,
1261 "Separator.foreground", controlShadow,
1262
1263 // *** ScrollBar/ScrollPane/Viewport
1264 "ScrollBar.background", scrollBarTrack,
1265 "ScrollBar.foreground", control,
1266 "ScrollBar.track", table.get("scrollbar"),
1267 "ScrollBar.trackHighlight", controlDkShadow,
1268 "ScrollBar.thumb", control,
1269 "ScrollBar.thumbHighlight", controlLtHighlight,
1270 "ScrollBar.thumbDarkShadow", controlDkShadow,
1271 "ScrollBar.thumbShadow", controlShadow,
1272 "ScrollBar.border", null,
1273 "ScrollBar.minimumThumbSize", minimumThumbSize,
1274 "ScrollBar.maximumThumbSize", maximumThumbSize,
1275 "ScrollBar.ancestorInputMap",
1276 new UIDefaults.LazyInputMap(new Object[] {
1277 "RIGHT", "positiveUnitIncrement",
1278 "KP_RIGHT", "positiveUnitIncrement",
1279 "DOWN", "positiveUnitIncrement",
1280 "KP_DOWN", "positiveUnitIncrement",
1281 "PAGE_DOWN", "positiveBlockIncrement",
1282 "LEFT", "negativeUnitIncrement",
1283 "KP_LEFT", "negativeUnitIncrement",
1284 "UP", "negativeUnitIncrement",
1285 "KP_UP", "negativeUnitIncrement",
1286 "PAGE_UP", "negativeBlockIncrement",
1287 "HOME", "minScroll",
1288 "END", "maxScroll"
1289 }),
1290 "ScrollBar.ancestorInputMap.RightToLeft",
1291 new UIDefaults.LazyInputMap(new Object[] {
1292 "RIGHT", "negativeUnitIncrement",
1293 "KP_RIGHT", "negativeUnitIncrement",
1294 "LEFT", "positiveUnitIncrement",
1295 "KP_LEFT", "positiveUnitIncrement",
1296 }),
1297 "ScrollBar.width", new Integer(16),
1298
1299 "ScrollPane.font", dialogPlain12,
1300 "ScrollPane.background", control,
1301 "ScrollPane.foreground", controlText,
1302 "ScrollPane.border", textFieldBorder,
1303 "ScrollPane.viewportBorder", null,
1304 "ScrollPane.ancestorInputMap",
1305 new UIDefaults.LazyInputMap(new Object[] {
1306 "RIGHT", "unitScrollRight",
1307 "KP_RIGHT", "unitScrollRight",
1308 "DOWN", "unitScrollDown",
1309 "KP_DOWN", "unitScrollDown",
1310 "LEFT", "unitScrollLeft",
1311 "KP_LEFT", "unitScrollLeft",
1312 "UP", "unitScrollUp",
1313 "KP_UP", "unitScrollUp",
1314 "PAGE_UP", "scrollUp",
1315 "PAGE_DOWN", "scrollDown",
1316 "ctrl PAGE_UP", "scrollLeft",
1317 "ctrl PAGE_DOWN", "scrollRight",
1318 "ctrl HOME", "scrollHome",
1319 "ctrl END", "scrollEnd"
1320 }),
1321 "ScrollPane.ancestorInputMap.RightToLeft",
1322 new UIDefaults.LazyInputMap(new Object[] {
1323 "ctrl PAGE_UP", "scrollRight",
1324 "ctrl PAGE_DOWN", "scrollLeft",
1325 }),
1326
1327 "Viewport.font", dialogPlain12,
1328 "Viewport.background", control,
1329 "Viewport.foreground", textText,
1330
1331 // *** Slider
1332 "Slider.font", dialogPlain12,
1333 "Slider.foreground", control,
1334 "Slider.background", control,
1335 "Slider.highlight", controlLtHighlight,
1336 "Slider.tickColor", Color.black,
1337 "Slider.shadow", controlShadow,
1338 "Slider.focus", controlDkShadow,
1339 "Slider.border", null,
1340 "Slider.horizontalSize", new Dimension(200, 21),
1341 "Slider.verticalSize", new Dimension(21, 200),
1342 "Slider.minimumHorizontalSize", new Dimension(36, 21),
1343 "Slider.minimumVerticalSize", new Dimension(21, 36),
1344 "Slider.focusInsets", sliderFocusInsets,
1345 "Slider.focusInputMap",
1346 new UIDefaults.LazyInputMap(new Object[] {
1347 "RIGHT", "positiveUnitIncrement",
1348 "KP_RIGHT", "positiveUnitIncrement",
1349 "DOWN", "negativeUnitIncrement",
1350 "KP_DOWN", "negativeUnitIncrement",
1351 "PAGE_DOWN", "negativeBlockIncrement",
1352 "LEFT", "negativeUnitIncrement",
1353 "KP_LEFT", "negativeUnitIncrement",
1354 "UP", "positiveUnitIncrement",
1355 "KP_UP", "positiveUnitIncrement",
1356 "PAGE_UP", "positiveBlockIncrement",
1357 "HOME", "minScroll",
1358 "END", "maxScroll"
1359 }),
1360 "Slider.focusInputMap.RightToLeft",
1361 new UIDefaults.LazyInputMap(new Object[] {
1362 "RIGHT", "negativeUnitIncrement",
1363 "KP_RIGHT", "negativeUnitIncrement",
1364 "LEFT", "positiveUnitIncrement",
1365 "KP_LEFT", "positiveUnitIncrement",
1366 }),
1367
1368 // *** Spinner
1369 "Spinner.font", monospacedPlain12,
1370 "Spinner.background", control,
1371 "Spinner.foreground", control,
1372 "Spinner.border", textFieldBorder,
1373 "Spinner.arrowButtonBorder", null,
1374 "Spinner.arrowButtonInsets", null,
1375 "Spinner.arrowButtonSize", new Dimension(16, 5),
1376 "Spinner.ancestorInputMap",
1377 new UIDefaults.LazyInputMap(new Object[] {
1378 "UP", "increment",
1379 "KP_UP", "increment",
1380 "DOWN", "decrement",
1381 "KP_DOWN", "decrement",
1382 }),
1383 "Spinner.editorBorderPainted", Boolean.FALSE,
1384 "Spinner.editorAlignment", JTextField.TRAILING,
1385
1386 // *** SplitPane
1387 "SplitPane.background", control,
1388 "SplitPane.highlight", controlLtHighlight,
1389 "SplitPane.shadow", controlShadow,
1390 "SplitPane.darkShadow", controlDkShadow,
1391 "SplitPane.border", splitPaneBorder,
1392 "SplitPane.dividerSize", new Integer(7),
1393 "SplitPaneDivider.border", splitPaneDividerBorder,
1394 "SplitPaneDivider.draggingColor", darkGray,
1395 "SplitPane.ancestorInputMap",
1396 new UIDefaults.LazyInputMap(new Object[] {
1397 "UP", "negativeIncrement",
1398 "DOWN", "positiveIncrement",
1399 "LEFT", "negativeIncrement",
1400 "RIGHT", "positiveIncrement",
1401 "KP_UP", "negativeIncrement",
1402 "KP_DOWN", "positiveIncrement",
1403 "KP_LEFT", "negativeIncrement",
1404 "KP_RIGHT", "positiveIncrement",
1405 "HOME", "selectMin",
1406 "END", "selectMax",
1407 "F8", "startResize",
1408 "F6", "toggleFocus",
1409 "ctrl TAB", "focusOutForward",
1410 "ctrl shift TAB", "focusOutBackward"
1411 }),
1412
1413 // *** TabbedPane
1414 "TabbedPane.font", dialogPlain12,
1415 "TabbedPane.background", control,
1416 "TabbedPane.foreground", controlText,
1417 "TabbedPane.highlight", controlLtHighlight,
1418 "TabbedPane.light", controlHighlight,
1419 "TabbedPane.shadow", controlShadow,
1420 "TabbedPane.darkShadow", controlDkShadow,
1421 "TabbedPane.selected", null,
1422 "TabbedPane.focus", controlText,
1423 "TabbedPane.textIconGap", four,
1424
1425 // Causes tabs to be painted on top of the content area border.
1426 // The amount of overlap is then controlled by tabAreaInsets.bottom,
1427 // which is zero by default
1428 "TabbedPane.tabsOverlapBorder", Boolean.FALSE,
1429 "TabbedPane.selectionFollowsFocus", Boolean.TRUE,
1430
1431 "TabbedPane.labelShift", 1,
1432 "TabbedPane.selectedLabelShift", -1,
1433 "TabbedPane.tabInsets", tabbedPaneTabInsets,
1434 "TabbedPane.selectedTabPadInsets", tabbedPaneTabPadInsets,
1435 "TabbedPane.tabAreaInsets", tabbedPaneTabAreaInsets,
1436 "TabbedPane.contentBorderInsets", tabbedPaneContentBorderInsets,
1437 "TabbedPane.tabRunOverlay", new Integer(2),
1438 "TabbedPane.tabsOpaque", Boolean.TRUE,
1439 "TabbedPane.contentOpaque", Boolean.TRUE,
1440 "TabbedPane.focusInputMap",
1441 new UIDefaults.LazyInputMap(new Object[] {
1442 "RIGHT", "navigateRight",
1443 "KP_RIGHT", "navigateRight",
1444 "LEFT", "navigateLeft",
1445 "KP_LEFT", "navigateLeft",
1446 "UP", "navigateUp",
1447 "KP_UP", "navigateUp",
1448 "DOWN", "navigateDown",
1449 "KP_DOWN", "navigateDown",
1450 "ctrl DOWN", "requestFocusForVisibleComponent",
1451 "ctrl KP_DOWN", "requestFocusForVisibleComponent",
1452 }),
1453 "TabbedPane.ancestorInputMap",
1454 new UIDefaults.LazyInputMap(new Object[] {
1455 "ctrl PAGE_DOWN", "navigatePageDown",
1456 "ctrl PAGE_UP", "navigatePageUp",
1457 "ctrl UP", "requestFocus",
1458 "ctrl KP_UP", "requestFocus",
1459 }),
1460
1461
1462 // *** Table
1463 "Table.font", dialogPlain12,
1464 "Table.foreground", controlText, // cell text color
1465 "Table.background", window, // cell background color
1466 "Table.selectionForeground", textHighlightText,
1467 "Table.selectionBackground", textHighlight,
1468 "Table.dropLineColor", controlShadow,
1469 "Table.dropLineShortColor", black,
1470 "Table.gridColor", gray, // grid line color
1471 "Table.focusCellBackground", window,
1472 "Table.focusCellForeground", controlText,
1473 "Table.focusCellHighlightBorder", focusCellHighlightBorder,
1474 "Table.scrollPaneBorder", loweredBevelBorder,
1475 "Table.ancestorInputMap",
1476 new UIDefaults.LazyInputMap(new Object[] {
1477 "ctrl C", "copy",
1478 "ctrl V", "paste",
1479 "ctrl X", "cut",
1480 "COPY", "copy",
1481 "PASTE", "paste",
1482 "CUT", "cut",
1483 "control INSERT", "copy",
1484 "shift INSERT", "paste",
1485 "shift DELETE", "cut",
1486 "RIGHT", "selectNextColumn",
1487 "KP_RIGHT", "selectNextColumn",
1488 "shift RIGHT", "selectNextColumnExtendSelection",
1489 "shift KP_RIGHT", "selectNextColumnExtendSelection",
1490 "ctrl shift RIGHT", "selectNextColumnExtendSelection",
1491 "ctrl shift KP_RIGHT", "selectNextColumnExtendSelection",
1492 "ctrl RIGHT", "selectNextColumnChangeLead",
1493 "ctrl KP_RIGHT", "selectNextColumnChangeLead",
1494 "LEFT", "selectPreviousColumn",
1495 "KP_LEFT", "selectPreviousColumn",
1496 "shift LEFT", "selectPreviousColumnExtendSelection",
1497 "shift KP_LEFT", "selectPreviousColumnExtendSelection",
1498 "ctrl shift LEFT", "selectPreviousColumnExtendSelection",
1499 "ctrl shift KP_LEFT", "selectPreviousColumnExtendSelection",
1500 "ctrl LEFT", "selectPreviousColumnChangeLead",
1501 "ctrl KP_LEFT", "selectPreviousColumnChangeLead",
1502 "DOWN", "selectNextRow",
1503 "KP_DOWN", "selectNextRow",
1504 "shift DOWN", "selectNextRowExtendSelection",
1505 "shift KP_DOWN", "selectNextRowExtendSelection",
1506 "ctrl shift DOWN", "selectNextRowExtendSelection",
1507 "ctrl shift KP_DOWN", "selectNextRowExtendSelection",
1508 "ctrl DOWN", "selectNextRowChangeLead",
1509 "ctrl KP_DOWN", "selectNextRowChangeLead",
1510 "UP", "selectPreviousRow",
1511 "KP_UP", "selectPreviousRow",
1512 "shift UP", "selectPreviousRowExtendSelection",
1513 "shift KP_UP", "selectPreviousRowExtendSelection",
1514 "ctrl shift UP", "selectPreviousRowExtendSelection",
1515 "ctrl shift KP_UP", "selectPreviousRowExtendSelection",
1516 "ctrl UP", "selectPreviousRowChangeLead",
1517 "ctrl KP_UP", "selectPreviousRowChangeLead",
1518 "HOME", "selectFirstColumn",
1519 "shift HOME", "selectFirstColumnExtendSelection",
1520 "ctrl shift HOME", "selectFirstRowExtendSelection",
1521 "ctrl HOME", "selectFirstRow",
1522 "END", "selectLastColumn",
1523 "shift END", "selectLastColumnExtendSelection",
1524 "ctrl shift END", "selectLastRowExtendSelection",
1525 "ctrl END", "selectLastRow",
1526 "PAGE_UP", "scrollUpChangeSelection",
1527 "shift PAGE_UP", "scrollUpExtendSelection",
1528 "ctrl shift PAGE_UP", "scrollLeftExtendSelection",
1529 "ctrl PAGE_UP", "scrollLeftChangeSelection",
1530 "PAGE_DOWN", "scrollDownChangeSelection",
1531 "shift PAGE_DOWN", "scrollDownExtendSelection",
1532 "ctrl shift PAGE_DOWN", "scrollRightExtendSelection",
1533 "ctrl PAGE_DOWN", "scrollRightChangeSelection",
1534 "TAB", "selectNextColumnCell",
1535 "shift TAB", "selectPreviousColumnCell",
1536 "ENTER", "selectNextRowCell",
1537 "shift ENTER", "selectPreviousRowCell",
1538 "ctrl A", "selectAll",
1539 "ctrl SLASH", "selectAll",
1540 "ctrl BACK_SLASH", "clearSelection",
1541 "ESCAPE", "cancel",
1542 "F2", "startEditing",
1543 "SPACE", "addToSelection",
1544 "ctrl SPACE", "toggleAndAnchor",
1545 "shift SPACE", "extendTo",
1546 "ctrl shift SPACE", "moveSelectionTo",
1547 "F8", "focusHeader"
1548 }),
1549 "Table.ancestorInputMap.RightToLeft",
1550 new UIDefaults.LazyInputMap(new Object[] {
1551 "RIGHT", "selectPreviousColumn",
1552 "KP_RIGHT", "selectPreviousColumn",
1553 "shift RIGHT", "selectPreviousColumnExtendSelection",
1554 "shift KP_RIGHT", "selectPreviousColumnExtendSelection",
1555 "ctrl shift RIGHT", "selectPreviousColumnExtendSelection",
1556 "ctrl shift KP_RIGHT", "selectPreviousColumnExtendSelection",
1557 "ctrl RIGHT", "selectPreviousColumnChangeLead",
1558 "ctrl KP_RIGHT", "selectPreviousColumnChangeLead",
1559 "LEFT", "selectNextColumn",
1560 "KP_LEFT", "selectNextColumn",
1561 "shift LEFT", "selectNextColumnExtendSelection",
1562 "shift KP_LEFT", "selectNextColumnExtendSelection",
1563 "ctrl shift LEFT", "selectNextColumnExtendSelection",
1564 "ctrl shift KP_LEFT", "selectNextColumnExtendSelection",
1565 "ctrl LEFT", "selectNextColumnChangeLead",
1566 "ctrl KP_LEFT", "selectNextColumnChangeLead",
1567 "ctrl PAGE_UP", "scrollRightChangeSelection",
1568 "ctrl PAGE_DOWN", "scrollLeftChangeSelection",
1569 "ctrl shift PAGE_UP", "scrollRightExtendSelection",
1570 "ctrl shift PAGE_DOWN", "scrollLeftExtendSelection",
1571 }),
1572 "Table.ascendingSortIcon", new SwingLazyValue(
1573 "sun.swing.icon.SortArrowIcon",
1574 null, new Object[] { Boolean.TRUE,
1575 "Table.sortIconColor" }),
1576 "Table.descendingSortIcon", new SwingLazyValue(
1577 "sun.swing.icon.SortArrowIcon",
1578 null, new Object[] { Boolean.FALSE,
1579 "Table.sortIconColor" }),
1580 "Table.sortIconColor", controlShadow,
1581
1582 "TableHeader.font", dialogPlain12,
1583 "TableHeader.foreground", controlText, // header text color
1584 "TableHeader.background", control, // header background
1585 "TableHeader.cellBorder", tableHeaderBorder,
1586
1587 // Support for changing the background/border of the currently
1588 // selected header column when the header has the keyboard focus.
1589 "TableHeader.focusCellBackground", table.getColor("text"), // like text component bg
1590 "TableHeader.focusCellForeground", null,
1591 "TableHeader.focusCellBorder", null,
1592 "TableHeader.ancestorInputMap",
1593 new UIDefaults.LazyInputMap(new Object[] {
1594 "SPACE", "toggleSortOrder",
1595 "LEFT", "selectColumnToLeft",
1596 "KP_LEFT", "selectColumnToLeft",
1597 "RIGHT", "selectColumnToRight",
1598 "KP_RIGHT", "selectColumnToRight",
1599 "alt LEFT", "moveColumnLeft",
1600 "alt KP_LEFT", "moveColumnLeft",
1601 "alt RIGHT", "moveColumnRight",
1602 "alt KP_RIGHT", "moveColumnRight",
1603 "alt shift LEFT", "resizeLeft",
1604 "alt shift KP_LEFT", "resizeLeft",
1605 "alt shift RIGHT", "resizeRight",
1606 "alt shift KP_RIGHT", "resizeRight",
1607 "ESCAPE", "focusTable",
1608 }),
1609
1610 // *** Text
1611 "TextField.font", sansSerifPlain12,
1612 "TextField.background", window,
1613 "TextField.foreground", textText,
1614 "TextField.shadow", controlShadow,
1615 "TextField.darkShadow", controlDkShadow,
1616 "TextField.light", controlHighlight,
1617 "TextField.highlight", controlLtHighlight,
1618 "TextField.inactiveForeground", textInactiveText,
1619 "TextField.inactiveBackground", control,
1620 "TextField.selectionBackground", textHighlight,
1621 "TextField.selectionForeground", textHighlightText,
1622 "TextField.caretForeground", textText,
1623 "TextField.caretBlinkRate", caretBlinkRate,
1624 "TextField.border", textFieldBorder,
1625 "TextField.margin", zeroInsets,
1626
1627 "FormattedTextField.font", sansSerifPlain12,
1628 "FormattedTextField.background", window,
1629 "FormattedTextField.foreground", textText,
1630 "FormattedTextField.inactiveForeground", textInactiveText,
1631 "FormattedTextField.inactiveBackground", control,
1632 "FormattedTextField.selectionBackground", textHighlight,
1633 "FormattedTextField.selectionForeground", textHighlightText,
1634 "FormattedTextField.caretForeground", textText,
1635 "FormattedTextField.caretBlinkRate", caretBlinkRate,
1636 "FormattedTextField.border", textFieldBorder,
1637 "FormattedTextField.margin", zeroInsets,
1638 "FormattedTextField.focusInputMap",
1639 new UIDefaults.LazyInputMap(new Object[] {
1640 "ctrl C", DefaultEditorKit.copyAction,
1641 "ctrl V", DefaultEditorKit.pasteAction,
1642 "ctrl X", DefaultEditorKit.cutAction,
1643 "COPY", DefaultEditorKit.copyAction,
1644 "PASTE", DefaultEditorKit.pasteAction,
1645 "CUT", DefaultEditorKit.cutAction,
1646 "control INSERT", DefaultEditorKit.copyAction,
1647 "shift INSERT", DefaultEditorKit.pasteAction,
1648 "shift DELETE", DefaultEditorKit.cutAction,
1649 "shift LEFT", DefaultEditorKit.selectionBackwardAction,
1650 "shift KP_LEFT", DefaultEditorKit.selectionBackwardAction,
1651 "shift RIGHT", DefaultEditorKit.selectionForwardAction,
1652 "shift KP_RIGHT", DefaultEditorKit.selectionForwardAction,
1653 "ctrl LEFT", DefaultEditorKit.previousWordAction,
1654 "ctrl KP_LEFT", DefaultEditorKit.previousWordAction,
1655 "ctrl RIGHT", DefaultEditorKit.nextWordAction,
1656 "ctrl KP_RIGHT", DefaultEditorKit.nextWordAction,
1657 "ctrl shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
1658 "ctrl shift KP_LEFT", DefaultEditorKit.selectionPreviousWordAction,
1659 "ctrl shift RIGHT", DefaultEditorKit.selectionNextWordAction,
1660 "ctrl shift KP_RIGHT", DefaultEditorKit.selectionNextWordAction,
1661 "ctrl A", DefaultEditorKit.selectAllAction,
1662 "HOME", DefaultEditorKit.beginLineAction,
1663 "END", DefaultEditorKit.endLineAction,
1664 "shift HOME", DefaultEditorKit.selectionBeginLineAction,
1665 "shift END", DefaultEditorKit.selectionEndLineAction,
1666 "BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
1667 "shift BACK_SPACE", DefaultEditorKit.deletePrevCharAction,
1668 "ctrl H", DefaultEditorKit.deletePrevCharAction,
1669 "DELETE", DefaultEditorKit.deleteNextCharAction,
1670 "ctrl DELETE", DefaultEditorKit.deleteNextWordAction,
1671 "ctrl BACK_SPACE", DefaultEditorKit.deletePrevWordAction,
1672 "RIGHT", DefaultEditorKit.forwardAction,
1673 "LEFT", DefaultEditorKit.backwardAction,
1674 "KP_RIGHT", DefaultEditorKit.forwardAction,
1675 "KP_LEFT", DefaultEditorKit.backwardAction,
1676 "ENTER", JTextField.notifyAction,
1677 "ctrl BACK_SLASH", "unselect",
1678 "control shift O", "toggle-componentOrientation",
1679 "ESCAPE", "reset-field-edit",
1680 "UP", "increment",
1681 "KP_UP", "increment",
1682 "DOWN", "decrement",
1683 "KP_DOWN", "decrement",
1684 }),
1685
1686 "PasswordField.font", monospacedPlain12,
1687 "PasswordField.background", window,
1688 "PasswordField.foreground", textText,
1689 "PasswordField.inactiveForeground", textInactiveText,
1690 "PasswordField.inactiveBackground", control,
1691 "PasswordField.selectionBackground", textHighlight,
1692 "PasswordField.selectionForeground", textHighlightText,
1693 "PasswordField.caretForeground", textText,
1694 "PasswordField.caretBlinkRate", caretBlinkRate,
1695 "PasswordField.border", textFieldBorder,
1696 "PasswordField.margin", zeroInsets,
1697 "PasswordField.echoChar", '*',
1698
1699 "TextArea.font", monospacedPlain12,
1700 "TextArea.background", window,
1701 "TextArea.foreground", textText,
1702 "TextArea.inactiveForeground", textInactiveText,
1703 "TextArea.selectionBackground", textHighlight,
1704 "TextArea.selectionForeground", textHighlightText,
1705 "TextArea.caretForeground", textText,
1706 "TextArea.caretBlinkRate", caretBlinkRate,
1707 "TextArea.border", marginBorder,
1708 "TextArea.margin", zeroInsets,
1709
1710 "TextPane.font", serifPlain12,
1711 "TextPane.background", white,
1712 "TextPane.foreground", textText,
1713 "TextPane.selectionBackground", textHighlight,
1714 "TextPane.selectionForeground", textHighlightText,
1715 "TextPane.caretForeground", textText,
1716 "TextPane.caretBlinkRate", caretBlinkRate,
1717 "TextPane.inactiveForeground", textInactiveText,
1718 "TextPane.border", marginBorder,
1719 "TextPane.margin", editorMargin,
1720
1721 "EditorPane.font", serifPlain12,
1722 "EditorPane.background", white,
1723 "EditorPane.foreground", textText,
1724 "EditorPane.selectionBackground", textHighlight,
1725 "EditorPane.selectionForeground", textHighlightText,
1726 "EditorPane.caretForeground", textText,
1727 "EditorPane.caretBlinkRate", caretBlinkRate,
1728 "EditorPane.inactiveForeground", textInactiveText,
1729 "EditorPane.border", marginBorder,
1730 "EditorPane.margin", editorMargin,
1731
1732 "html.pendingImage", SwingUtilities2.makeIcon(getClass(),
1733 BasicLookAndFeel.class,
1734 "icons/image-delayed.png"),
1735 "html.missingImage", SwingUtilities2.makeIcon(getClass(),
1736 BasicLookAndFeel.class,
1737 "icons/image-failed.png"),
1738 // *** TitledBorder
1739 "TitledBorder.font", dialogPlain12,
1740 "TitledBorder.titleColor", controlText,
1741 "TitledBorder.border", etchedBorder,
1742
1743 // *** ToolBar
1744 "ToolBar.font", dialogPlain12,
1745 "ToolBar.background", control,
1746 "ToolBar.foreground", controlText,
1747 "ToolBar.shadow", controlShadow,
1748 "ToolBar.darkShadow", controlDkShadow,
1749 "ToolBar.light", controlHighlight,
1750 "ToolBar.highlight", controlLtHighlight,
1751 "ToolBar.dockingBackground", control,
1752 "ToolBar.dockingForeground", red,
1753 "ToolBar.floatingBackground", control,
1754 "ToolBar.floatingForeground", darkGray,
1755 "ToolBar.border", etchedBorder,
1756 "ToolBar.separatorSize", toolBarSeparatorSize,
1757 "ToolBar.ancestorInputMap",
1758 new UIDefaults.LazyInputMap(new Object[] {
1759 "UP", "navigateUp",
1760 "KP_UP", "navigateUp",
1761 "DOWN", "navigateDown",
1762 "KP_DOWN", "navigateDown",
1763 "LEFT", "navigateLeft",
1764 "KP_LEFT", "navigateLeft",
1765 "RIGHT", "navigateRight",
1766 "KP_RIGHT", "navigateRight"
1767 }),
1768
1769 // *** ToolTips
1770 "ToolTip.font", sansSerifPlain12,
1771 "ToolTip.background", table.get("info"),
1772 "ToolTip.foreground", table.get("infoText"),
1773 "ToolTip.border", blackLineBorder,
1774 // ToolTips also support backgroundInactive, borderInactive,
1775 // and foregroundInactive
1776
1777 // *** ToolTipManager
1778 // ToolTipManager.enableToolTipMode currently supports:
1779 // "allWindows" (default):
1780 // enables tool tips for all windows of all java applications,
1781 // whether the windows are active or inactive
1782 // "activeApplication"
1783 // enables tool tips for windows of an application only when
1784 // the application has an active window
1785 "ToolTipManager.enableToolTipMode", "allWindows",
1786
1787 // *** Tree
1788 "Tree.paintLines", Boolean.TRUE,
1789 "Tree.lineTypeDashed", Boolean.FALSE,
1790 "Tree.font", dialogPlain12,
1791 "Tree.background", window,
1792 "Tree.foreground", textText,
1793 "Tree.hash", gray,
1794 "Tree.textForeground", textText,
1795 "Tree.textBackground", table.get("text"),
1796 "Tree.selectionForeground", textHighlightText,
1797 "Tree.selectionBackground", textHighlight,
1798 "Tree.selectionBorderColor", black,
1799 "Tree.dropLineColor", controlShadow,
1800 "Tree.editorBorder", blackLineBorder,
1801 "Tree.leftChildIndent", new Integer(7),
1802 "Tree.rightChildIndent", new Integer(13),
1803 "Tree.rowHeight", new Integer(16),
1804 "Tree.scrollsOnExpand", Boolean.TRUE,
1805 "Tree.openIcon", SwingUtilities2.makeIcon(getClass(),
1806 BasicLookAndFeel.class,
1807 "icons/TreeOpen.gif"),
1808 "Tree.closedIcon", SwingUtilities2.makeIcon(getClass(),
1809 BasicLookAndFeel.class,
1810 "icons/TreeClosed.gif"),
1811 "Tree.leafIcon", SwingUtilities2.makeIcon(getClass(),
1812 BasicLookAndFeel.class,
1813 "icons/TreeLeaf.gif"),
1814 "Tree.expandedIcon", null,
1815 "Tree.collapsedIcon", null,
1816 "Tree.changeSelectionWithFocus", Boolean.TRUE,
1817 "Tree.drawsFocusBorderAroundIcon", Boolean.FALSE,
1818 "Tree.timeFactor", oneThousand,
1819 "Tree.focusInputMap",
1820 new UIDefaults.LazyInputMap(new Object[] {
1821 "ctrl C", "copy",
1822 "ctrl V", "paste",
1823 "ctrl X", "cut",
1824 "COPY", "copy",
1825 "PASTE", "paste",
1826 "CUT", "cut",
1827 "control INSERT", "copy",
1828 "shift INSERT", "paste",
1829 "shift DELETE", "cut",
1830 "UP", "selectPrevious",
1831 "KP_UP", "selectPrevious",
1832 "shift UP", "selectPreviousExtendSelection",
1833 "shift KP_UP", "selectPreviousExtendSelection",
1834 "ctrl shift UP", "selectPreviousExtendSelection",
1835 "ctrl shift KP_UP", "selectPreviousExtendSelection",
1836 "ctrl UP", "selectPreviousChangeLead",
1837 "ctrl KP_UP", "selectPreviousChangeLead",
1838 "DOWN", "selectNext",
1839 "KP_DOWN", "selectNext",
1840 "shift DOWN", "selectNextExtendSelection",
1841 "shift KP_DOWN", "selectNextExtendSelection",
1842 "ctrl shift DOWN", "selectNextExtendSelection",
1843 "ctrl shift KP_DOWN", "selectNextExtendSelection",
1844 "ctrl DOWN", "selectNextChangeLead",
1845 "ctrl KP_DOWN", "selectNextChangeLead",
1846 "RIGHT", "selectChild",
1847 "KP_RIGHT", "selectChild",
1848 "LEFT", "selectParent",
1849 "KP_LEFT", "selectParent",
1850 "PAGE_UP", "scrollUpChangeSelection",
1851 "shift PAGE_UP", "scrollUpExtendSelection",
1852 "ctrl shift PAGE_UP", "scrollUpExtendSelection",
1853 "ctrl PAGE_UP", "scrollUpChangeLead",
1854 "PAGE_DOWN", "scrollDownChangeSelection",
1855 "shift PAGE_DOWN", "scrollDownExtendSelection",
1856 "ctrl shift PAGE_DOWN", "scrollDownExtendSelection",
1857 "ctrl PAGE_DOWN", "scrollDownChangeLead",
1858 "HOME", "selectFirst",
1859 "shift HOME", "selectFirstExtendSelection",
1860 "ctrl shift HOME", "selectFirstExtendSelection",
1861 "ctrl HOME", "selectFirstChangeLead",
1862 "END", "selectLast",
1863 "shift END", "selectLastExtendSelection",
1864 "ctrl shift END", "selectLastExtendSelection",
1865 "ctrl END", "selectLastChangeLead",
1866 "F2", "startEditing",
1867 "ctrl A", "selectAll",
1868 "ctrl SLASH", "selectAll",
1869 "ctrl BACK_SLASH", "clearSelection",
1870 "ctrl LEFT", "scrollLeft",
1871 "ctrl KP_LEFT", "scrollLeft",
1872 "ctrl RIGHT", "scrollRight",
1873 "ctrl KP_RIGHT", "scrollRight",
1874 "SPACE", "addToSelection",
1875 "ctrl SPACE", "toggleAndAnchor",
1876 "shift SPACE", "extendTo",
1877 "ctrl shift SPACE", "moveSelectionTo"
1878 }),
1879 "Tree.focusInputMap.RightToLeft",
1880 new UIDefaults.LazyInputMap(new Object[] {
1881 "RIGHT", "selectParent",
1882 "KP_RIGHT", "selectParent",
1883 "LEFT", "selectChild",
1884 "KP_LEFT", "selectChild",
1885 }),
1886 "Tree.ancestorInputMap",
1887 new UIDefaults.LazyInputMap(new Object[] {
1888 "ESCAPE", "cancel"
1889 }),
1890 // Bind specific keys that can invoke popup on currently
1891 // focused JComponent
1892 "RootPane.ancestorInputMap",
1893 new UIDefaults.LazyInputMap(new Object[] {
1894 "shift F10", "postPopup",
1895 "CONTEXT_MENU", "postPopup"
1896 }),
1897
1898 // These bindings are only enabled when there is a default
1899 // button set on the rootpane.
1900 "RootPane.defaultButtonWindowKeyBindings", new Object[] {
1901 "ENTER", "press",
1902 "released ENTER", "release",
1903 "ctrl ENTER", "press",
1904 "ctrl released ENTER", "release"
1905 },
1906 };
1907
1908 table.putDefaults(defaults);
1909 }
1910
1911
1912 /**
1913 * Returns the ui that is of type <code>klass</code>, or null if
1914 * one can not be found.
1915 */
1916 static Object getUIOfType(ComponentUI ui, Class klass) {
1917 if (klass.isInstance(ui)) {
1918 return ui;
1919 }
1920 return null;
1921 }
1922
1923 // ********* Auditory Cue support methods and objects *********
1924 // also see the "AuditoryCues" section of the defaults table
1925
1926 /**
1927 * Returns an <code>ActionMap</code> containing the audio actions
1928 * for this look and feel.
1929 * <P>
1930 * The returned <code>ActionMap</code> contains <code>Actions</code> that
1931 * embody the ability to render an auditory cue. These auditory
1932 * cues map onto user and system activities that may be useful
1933 * for an end user to know about (such as a dialog box appearing).
1934 * <P>
1935 * At the appropriate time,
1936 * the {@code ComponentUI} is responsible for obtaining an
1937 * <code>Action</code> out of the <code>ActionMap</code> and passing
1938 * it to <code>playSound</code>.
1939 * <P>
1940 * This method first looks up the {@code ActionMap} from the
1941 * defaults using the key {@code "AuditoryCues.actionMap"}.
1942 * <p>
1943 * If the value is {@code non-null}, it is returned. If the value
1944 * of the default {@code "AuditoryCues.actionMap"} is {@code null}
1945 * and the value of the default {@code "AuditoryCues.cueList"} is
1946 * {@code non-null}, an {@code ActionMapUIResource} is created and
1947 * populated. Population is done by iterating over each of the
1948 * elements of the {@code "AuditoryCues.cueList"} array, and
1949 * invoking {@code createAudioAction()} to create an {@code
1950 * Action} for each element. The resulting {@code Action} is
1951 * placed in the {@code ActionMapUIResource}, using the array
1952 * element as the key. For example, if the {@code
1953 * "AuditoryCues.cueList"} array contains a single-element, {@code
1954 * "audioKey"}, the {@code ActionMapUIResource} is created, then
1955 * populated by way of {@code actionMap.put(cueList[0],
1956 * createAudioAction(cueList[0]))}.
1957 * <p>
1958 * If the value of the default {@code "AuditoryCues.actionMap"} is
1959 * {@code null} and the value of the default
1960 * {@code "AuditoryCues.cueList"} is {@code null}, an empty
1961 * {@code ActionMapUIResource} is created.
1962 *
1963 *
1964 * @return an ActionMap containing {@code Actions}
1965 * responsible for playing auditory cues
1966 * @throws ClassCastException if the value of the
1967 * default {@code "AuditoryCues.actionMap"} is not an
1968 * {@code ActionMap}, or the value of the default
1969 * {@code "AuditoryCues.cueList"} is not an {@code Object[]}
1970 * @see #createAudioAction
1971 * @see #playSound(Action)
1972 * @since 1.4
1973 */
1974 protected ActionMap getAudioActionMap() {
1975 ActionMap audioActionMap = (ActionMap)UIManager.get(
1976 "AuditoryCues.actionMap");
1977 if (audioActionMap == null) {
1978 Object[] acList = (Object[])UIManager.get("AuditoryCues.cueList");
1979 if (acList != null) {
1980 audioActionMap = new ActionMapUIResource();
1981 for(int counter = acList.length-1; counter >= 0; counter--) {
1982 audioActionMap.put(acList[counter],
1983 createAudioAction(acList[counter]));
1984 }
1985 }
1986 UIManager.getLookAndFeelDefaults().put("AuditoryCues.actionMap",
1987 audioActionMap);
1988 }
1989 return audioActionMap;
1990 }
1991
1992 /**
1993 * Creates and returns an {@code Action} used to play a sound.
1994 * <p>
1995 * If {@code key} is {@code non-null}, an {@code Action} is created
1996 * using the value from the defaults with key {@code key}. The value
1997 * identifies the sound resource to load when
1998 * {@code actionPerformed} is invoked on the {@code Action}. The
1999 * sound resource is loaded into a {@code byte[]} by way of
2000 * {@code getClass().getResourceAsStream()}.
2001 *
2002 * @param key the key identifying the audio action
2003 * @return an {@code Action} used to play the source, or {@code null}
2004 * if {@code key} is {@code null}
2005 * @see #playSound(Action)
2006 * @since 1.4
2007 */
2008 protected Action createAudioAction(Object key) {
2009 if (key != null) {
2010 String audioKey = (String)key;
2011 String audioValue = (String)UIManager.get(key);
2012 return new AudioAction(audioKey, audioValue);
2013 } else {
2014 return null;
2015 }
2016 }
2017
2018 /**
2019 * Pass the name String to the super constructor. This is used
2020 * later to identify the Action and decide whether to play it or
2021 * not. Store the resource String. I is used to get the audio
2022 * resource. In this case, the resource is an audio file.
2023 *
2024 * @since 1.4
2025 */
2026 private class AudioAction extends AbstractAction implements LineListener {
2027 // We strive to only play one sound at a time (other platforms
2028 // appear to do this). This is done by maintaining the field
2029 // clipPlaying. Every time a sound is to be played,
2030 // cancelCurrentSound is invoked to cancel any sound that may be
2031 // playing.
2032 private String audioResource;
2033 private byte[] audioBuffer;
2034
2035 /**
2036 * The String is the name of the Action and
2037 * points to the audio resource.
2038 * The byte[] is a buffer of the audio bits.
2039 */
2040 public AudioAction(String name, String resource) {
2041 super(name);
2042 audioResource = resource;
2043 }
2044
2045 public void actionPerformed(ActionEvent e) {
2046 if (audioBuffer == null) {
2047 audioBuffer = loadAudioData(audioResource);
2048 }
2049 if (audioBuffer != null) {
2050 cancelCurrentSound(null);
2051 try {
2052 AudioInputStream soundStream =
2053 AudioSystem.getAudioInputStream(
2054 new ByteArrayInputStream(audioBuffer));
2055 DataLine.Info info =
2056 new DataLine.Info(Clip.class, soundStream.getFormat());
2057 Clip clip = (Clip) AudioSystem.getLine(info);
2058 clip.open(soundStream);
2059 clip.addLineListener(this);
2060
2061 synchronized(audioLock) {
2062 clipPlaying = clip;
2063 }
2064
2065 clip.start();
2066 } catch (Exception ex) {}
2067 }
2068 }
2069
2070 public void update(LineEvent event) {
2071 if (event.getType() == LineEvent.Type.STOP) {
2072 cancelCurrentSound((Clip)event.getLine());
2073 }
2074 }
2075
2076 /**
2077 * If the parameter is null, or equal to the currently
2078 * playing sound, then cancel the currently playing sound.
2079 */
2080 private void cancelCurrentSound(Clip clip) {
2081 Clip lastClip = null;
2082
2083 synchronized(audioLock) {
2084 if (clip == null || clip == clipPlaying) {
2085 lastClip = clipPlaying;
2086 clipPlaying = null;
2087 }
2088 }
2089
2090 if (lastClip != null) {
2091 lastClip.removeLineListener(this);
2092 lastClip.close();
2093 }
2094 }
2095 }
2096
2097 /**
2098 * Utility method that loads audio bits for the specified
2099 * <code>soundFile</code> filename. If this method is unable to
2100 * build a viable path name from the <code>baseClass</code> and
2101 * <code>soundFile</code> passed into this method, it will
2102 * return <code>null</code>.
2103 *
2104 * @param baseClass used as the root class/location to get the
2105 * soundFile from
2106 * @param soundFile the name of the audio file to be retrieved
2107 * from disk
2108 * @return A byte[] with audio data or null
2109 * @since 1.4
2110 */
2111 private byte[] loadAudioData(final String soundFile){
2112 if (soundFile == null) {
2113 return null;
2114 }
2115 /* Copy resource into a byte array. This is
2116 * necessary because several browsers consider
2117 * Class.getResource a security risk since it
2118 * can be used to load additional classes.
2119 * Class.getResourceAsStream just returns raw
2120 * bytes, which we can convert to a sound.
2121 */
2122 byte[] buffer = (byte[])AccessController.doPrivileged(
2123 new PrivilegedAction() {
2124 public Object run() {
2125 try {
2126 InputStream resource = BasicLookAndFeel.this.
2127 getClass().getResourceAsStream(soundFile);
2128 if (resource == null) {
2129 return null;
2130 }
2131 BufferedInputStream in =
2132 new BufferedInputStream(resource);
2133 ByteArrayOutputStream out =
2134 new ByteArrayOutputStream(1024);
2135 byte[] buffer = new byte[1024];
2136 int n;
2137 while ((n = in.read(buffer)) > 0) {
2138 out.write(buffer, 0, n);
2139 }
2140 in.close();
2141 out.flush();
2142 buffer = out.toByteArray();
2143 return buffer;
2144 } catch (IOException ioe) {
2145 System.err.println(ioe.toString());
2146 return null;
2147 }
2148 }
2149 });
2150 if (buffer == null) {
2151 System.err.println(getClass().getName() + "/" +
2152 soundFile + " not found.");
2153 return null;
2154 }
2155 if (buffer.length == 0) {
2156 System.err.println("warning: " + soundFile +
2157 " is zero-length");
2158 return null;
2159 }
2160 return buffer;
2161 }
2162
2163 /**
2164 * If necessary, invokes {@code actionPerformed} on
2165 * {@code audioAction} to play a sound.
2166 * The {@code actionPerformed} method is invoked if the value of
2167 * the {@code "AuditoryCues.playList"} default is a {@code
2168 * non-null} {@code Object[]} containing a {@code String} entry
2169 * equal to the name of the {@code audioAction}.
2170 *
2171 * @param audioAction an Action that knows how to render the audio
2172 * associated with the system or user activity
2173 * that is occurring; a value of {@code null}, is
2174 * ignored
2175 * @throws ClassCastException if {@code audioAction} is {@code non-null}
2176 * and the value of the default {@code "AuditoryCues.playList"}
2177 * is not an {@code Object[]}
2178 * @since 1.4
2179 */
2180 protected void playSound(Action audioAction) {
2181 if (audioAction != null) {
2182 Object[] audioStrings = (Object[])
2183 UIManager.get("AuditoryCues.playList");
2184 if (audioStrings != null) {
2185 // create a HashSet to help us decide to play or not
2186 HashSet audioCues = new HashSet();
2187 for (int i = 0; i < audioStrings.length; i++) {
2188 audioCues.add(audioStrings[i]);
2189 }
2190 // get the name of the Action
2191 String actionName = (String)audioAction.getValue(Action.NAME);
2192 // if the actionName is in the audioCues HashSet, play it.
2193 if (audioCues.contains(actionName)) {
2194 audioAction.actionPerformed(new
2195 ActionEvent(this, ActionEvent.ACTION_PERFORMED,
2196 actionName));
2197 }
2198 }
2199 }
2200 }
2201
2202
2203 /**
2204 * Sets the parent of the passed in ActionMap to be the audio action
2205 * map.
2206 */
2207 static void installAudioActionMap(ActionMap map) {
2208 LookAndFeel laf = UIManager.getLookAndFeel();
2209 if (laf instanceof BasicLookAndFeel) {
2210 map.setParent(((BasicLookAndFeel)laf).getAudioActionMap());
2211 }
2212 }
2213
2214
2215 /**
2216 * Helper method to play a named sound.
2217 *
2218 * @param c JComponent to play the sound for.
2219 * @param actionKey Key for the sound.
2220 */
2221 static void playSound(JComponent c, Object actionKey) {
2222 LookAndFeel laf = UIManager.getLookAndFeel();
2223 if (laf instanceof BasicLookAndFeel) {
2224 ActionMap map = c.getActionMap();
2225 if (map != null) {
2226 Action audioAction = map.get(actionKey);
2227 if (audioAction != null) {
2228 // pass off firing the Action to a utility method
2229 ((BasicLookAndFeel)laf).playSound(audioAction);
2230 }
2231 }
2232 }
2233 }
2234
2235 /**
2236 * This class contains listener that watches for all the mouse
2237 * events that can possibly invoke popup on the component
2238 */
2239 class AWTEventHelper implements AWTEventListener,PrivilegedAction {
2240 AWTEventHelper() {
2241 super();
2242 AccessController.doPrivileged(this);
2243 }
2244
2245 public Object run() {
2246 Toolkit tk = Toolkit.getDefaultToolkit();
2247 if(invocator == null) {
2248 tk.addAWTEventListener(this, AWTEvent.MOUSE_EVENT_MASK);
2249 } else {
2250 tk.removeAWTEventListener(invocator);
2251 }
2252 // Return value not used.
2253 return null;
2254 }
2255
2256 public void eventDispatched(AWTEvent ev) {
2257 int eventID = ev.getID();
2258 if((eventID & AWTEvent.MOUSE_EVENT_MASK) != 0) {
2259 MouseEvent me = (MouseEvent) ev;
2260 if(me.isPopupTrigger()) {
2261 MenuElement[] elems = MenuSelectionManager
2262 .defaultManager()
2263 .getSelectedPath();
2264 if(elems != null && elems.length != 0) {
2265 return;
2266 // We shall not interfere with already opened menu
2267 }
2268 Object c = me.getSource();
2269 JComponent src = null;
2270 if(c instanceof JComponent) {
2271 src = (JComponent) c;
2272 } else if(c instanceof BasicSplitPaneDivider) {
2273 // Special case - if user clicks on divider we must
2274 // invoke popup from the SplitPane
2275 src = (JComponent)
2276 ((BasicSplitPaneDivider)c).getParent();
2277 }
2278 if(src != null) {
2279 if(src.getComponentPopupMenu() != null) {
2280 Point pt = src.getPopupLocation(me);
2281 if(pt == null) {
2282 pt = me.getPoint();
2283 pt = SwingUtilities.convertPoint((Component)c,
2284 pt, src);
2285 }
2286 src.getComponentPopupMenu().show(src, pt.x, pt.y);
2287 me.consume();
2288 }
2289 }
2290 }
2291 }
2292 /* Activate a JInternalFrame if necessary. */
2293 if (eventID == MouseEvent.MOUSE_PRESSED) {
2294 Object object = ev.getSource();
2295 if (!(object instanceof Component)) {
2296 return;
2297 }
2298 Component component = (Component)object;
2299 if (component != null) {
2300 Component parent = component;
2301 while (parent != null && !(parent instanceof Window)) {
2302 if (parent instanceof JInternalFrame) {
2303 // Activate the frame.
2304 try { ((JInternalFrame)parent).setSelected(true); }
2305 catch (PropertyVetoException e1) { }
2306 }
2307 parent = parent.getParent();
2308 }
2309 }
2310 }
2311 }
2312 }
2313}