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
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 "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}