History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/javax/swing/plaf/basic/BasicLookAndFeel.java (1 of 18352 files). Show all

Unified · Split

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