001/* MetalLookAndFeel.java
002   Copyright (C) 2002, 2005, 2006, Free Software Foundation, Inc.
003
004This file is part of GNU Classpath.
005
006GNU Classpath is free software; you can redistribute it and/or modify
007it under the terms of the GNU General Public License as published by
008the Free Software Foundation; either version 2, or (at your option)
009any later version.
010
011GNU Classpath is distributed in the hope that it will be useful, but
012WITHOUT ANY WARRANTY; without even the implied warranty of
013MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014General Public License for more details.
015
016You should have received a copy of the GNU General Public License
017along with GNU Classpath; see the file COPYING.  If not, write to the
018Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
01902110-1301 USA.
020
021Linking this library statically or dynamically with other modules is
022making a combined work based on this library.  Thus, the terms and
023conditions of the GNU General Public License cover the whole
024combination.
025
026As a special exception, the copyright holders of this library give you
027permission to link this library with independent modules to produce an
028executable, regardless of the license terms of these independent
029modules, and to copy and distribute the resulting executable under
030terms of your choice, provided that you also meet, for each linked
031independent module, the terms and conditions of the license of that
032module.  An independent module is a module which is not derived from
033or based on this library.  If you modify this library, you may extend
034this exception to your version of the library, but you are not
035obligated to do so.  If you do not wish to do so, delete this
036exception statement from your version. */
037
038
039package javax.swing.plaf.metal;
040
041import gnu.classpath.SystemProperties;
042
043import java.awt.Color;
044import java.awt.Font;
045
046import javax.swing.LookAndFeel;
047import javax.swing.UIDefaults;
048import javax.swing.UIManager;
049import javax.swing.plaf.BorderUIResource;
050import javax.swing.plaf.ColorUIResource;
051import javax.swing.plaf.FontUIResource;
052import javax.swing.plaf.InsetsUIResource;
053import javax.swing.plaf.BorderUIResource.LineBorderUIResource;
054import javax.swing.plaf.basic.BasicLookAndFeel;
055
056
057/**
058 * A custom look and feel that is designed to look similar across different
059 * operating systems.  To install this look and feel, add the following code 
060 * (or something similar) near the start of your application:</p>
061 * <pre>
062 * try
063 * {
064 * &nbsp;&nbsp;UIManager.setLookAndFeel(new MetalLookAndFeel());
065 * }
066 * catch (UnsupportedLookAndFeelException e)
067 * {
068 * &nbsp;&nbsp;e.printStackTrace();
069 * }</pre>
070 */
071public class MetalLookAndFeel extends BasicLookAndFeel
072{          
073  private static final long serialVersionUID = 6680646159193457980L;
074  
075  /** The current theme. */
076  private static MetalTheme theme;
077  
078  /**
079   * Creates a new instance of the Metal look and feel.
080   */
081  public MetalLookAndFeel()
082  {
083    // Nothing to do here.
084  }
085
086  /**
087   * Sets the current theme to a new instance of {@link DefaultMetalTheme}.
088   */
089  protected void createDefaultTheme()
090  {
091    getCurrentTheme();
092  }
093
094  /**
095   * Returns <code>false</code> to indicate that this look and feel does not
096   * attempt to emulate the look and feel of native applications on the host
097   * platform.
098   * 
099   * @return <code>false</code>.
100   */
101  public boolean isNativeLookAndFeel()
102  {
103    return false;
104  }
105
106  /**
107   * Returns <code>true</code> to indicate that this look and feel is supported
108   * on all platforms.
109   * 
110   * @return <code>true</code>.
111   */
112  public boolean isSupportedLookAndFeel()
113  {
114    return true;
115  }
116
117  /**
118   * Returns a string describing the look and feel.  In this case, the method
119   * returns "Metal look and feel".
120   * 
121   * @return A string describing the look and feel.
122   */
123  public String getDescription()
124  {
125    return "The Java(tm) Look and Feel";
126  }
127
128  /**
129   * Returns the look and feel identifier.
130   * 
131   * @return "MetalLookAndFeel".
132   */
133  public String getID()
134  {
135    return "Metal";
136  }
137
138  /**
139   * Returns the look and feel name.
140   * 
141   * @return "MetalLookAndFeel".
142   */
143  public String getName()
144  {
145    return "Metal";
146  }
147
148  public UIDefaults getDefaults()
149  {
150    createDefaultTheme();
151    UIDefaults def = super.getDefaults();
152
153    theme.addCustomEntriesToTable(def);
154    return def;
155  }
156
157  /**
158   * Returns the accelerator foreground color from the installed theme.
159   * 
160   * @return The accelerator foreground color.
161   */
162  public static ColorUIResource getAcceleratorForeground()
163  {
164    if (theme != null)
165      return theme.getAcceleratorForeground();
166    return null;
167  }
168
169  /**
170   * Returns the accelerator selected foreground color from the installed 
171   * theme.
172   * 
173   * @return The accelerator selected foreground color.
174   */
175  public static ColorUIResource getAcceleratorSelectedForeground()
176  {
177    if (theme != null)
178      return theme.getAcceleratorSelectedForeground();
179    return null;
180  }
181
182  /**
183   * Returns the color black from the installed theme.
184   * 
185   * @return The color black.
186   */
187  public static ColorUIResource getBlack()
188  {
189    if (theme != null)
190      return theme.getBlack();
191    return null;
192  }
193
194  /**
195   * Returns the control color from the installed theme.
196   * 
197   * @return The control color.
198   */
199  public static ColorUIResource getControl()
200  {
201    if (theme != null)
202      return theme.getControl();
203    return null;
204  }
205
206  /**
207   * Returns the color used for dark shadows on controls, from the installed
208   * theme.
209   * 
210   * @return The color used for dark shadows on controls.
211   */
212  public static ColorUIResource getControlDarkShadow()
213  {
214    if (theme != null)
215      return theme.getControlDarkShadow();
216    return null;
217  }
218
219  /**
220   * Returns the color used for disabled controls, from the installed theme.
221   * 
222   * @return The color used for disabled controls.
223   */
224  public static ColorUIResource getControlDisabled()
225  {
226    if (theme != null)
227      return theme.getControlDisabled();
228    return null;
229  }
230
231  /**
232   * Returns the color used to draw highlights for controls, from the installed
233   * theme.
234   * 
235   * @return The color used to draw highlights for controls.
236   */
237  public static ColorUIResource getControlHighlight()
238  {
239    if (theme != null)
240      return theme.getControlHighlight();
241    return null;
242  }
243
244  /**
245   * Returns the color used to display control info, from the installed 
246   * theme.
247   * 
248   * @return The color used to display control info.
249   */
250  public static ColorUIResource getControlInfo()
251  {
252    if (theme != null)
253      return theme.getControlInfo();
254    return null;
255  }
256
257  /**
258   * Returns the color used to draw shadows for controls, from the installed
259   * theme.
260   * 
261   * @return The color used to draw shadows for controls.
262   */
263  public static ColorUIResource getControlShadow()
264  {
265    if (theme != null)
266      return theme.getControlShadow();
267    return null;
268  }
269
270  /**
271   * Returns the color used for text on controls, from the installed theme.
272   * 
273   * @return The color used for text on controls.
274   */
275  public static ColorUIResource getControlTextColor()
276  {
277    if (theme != null)
278      return theme.getControlTextColor();
279    return null;
280  }
281
282  /**
283   * Returns the font used for text on controls, from the installed theme.
284   * 
285   * @return The font used for text on controls.
286   */
287  public static FontUIResource getControlTextFont()
288  {
289    if (theme != null)
290      return theme.getControlTextFont();
291    return null;
292  }
293
294  /**
295   * Returns the color used for the desktop background, from the installed 
296   * theme.
297   * 
298   * @return The color used for the desktop background.
299   */
300  public static ColorUIResource getDesktopColor()
301  {
302    if (theme != null)
303      return theme.getDesktopColor();
304    return null;
305  }
306
307  /**
308   * Returns the color used to draw focus highlights, from the installed 
309   * theme.
310   * 
311   * @return The color used to draw focus highlights.
312   */
313  public static ColorUIResource getFocusColor()
314  {
315    if (theme != null)
316      return theme.getFocusColor();
317    return null;
318  }
319
320  /**
321   * Returns the color used to draw highlighted text, from the installed
322   * theme.
323   * 
324   * @return The color used to draw highlighted text.
325   */
326  public static ColorUIResource getHighlightedTextColor()
327  {
328    if (theme != null)
329      return theme.getHighlightedTextColor();
330    return null;
331  }
332
333  /**
334   * Returns the color used to draw text on inactive controls, from the
335   * installed theme.
336   * 
337   * @return The color used to draw text on inactive controls.
338   */
339  public static ColorUIResource getInactiveControlTextColor()
340  {
341    if (theme != null)
342      return theme.getInactiveControlTextColor();
343    return null;
344  }
345
346  /**
347   * Returns the color used to draw inactive system text, from the installed
348   * theme.
349   * 
350   * @return The color used to draw inactive system text.
351   */
352  public static ColorUIResource getInactiveSystemTextColor()
353  {
354    if (theme != null)
355      return theme.getInactiveSystemTextColor();
356    return null;
357  }
358
359  /**
360   * Returns the background color for menu items, from the installed theme.
361   * 
362   * @return The background color for menu items.
363   * 
364   * @see #getMenuSelectedBackground()
365   */
366  public static ColorUIResource getMenuBackground()
367  {
368    if (theme != null)
369      return theme.getMenuBackground();
370    return null;
371  }
372
373  /**
374   * Returns the foreground color for disabled menu items, from the installed
375   * theme.
376   * 
377   * @return The foreground color for disabled menu items.
378   * 
379   * @see #getMenuForeground()
380   */
381  public static ColorUIResource getMenuDisabledForeground()
382  {
383    if (theme != null)
384      return theme.getMenuDisabledForeground();
385    return null;
386  }
387
388  /**
389   * Returns the foreground color for menu items, from the installed theme.
390   * 
391   * @return The foreground color for menu items.
392   * 
393   * @see #getMenuDisabledForeground()
394   * @see #getMenuSelectedForeground()
395   */
396  public static ColorUIResource getMenuForeground()
397  {
398    if (theme != null)
399      return theme.getMenuForeground();
400    return null;
401  }
402
403  /**
404   * Returns the background color for selected menu items, from the installed
405   * theme.
406   * 
407   * @return The background color for selected menu items.
408   * 
409   * @see #getMenuBackground()
410   */
411  public static ColorUIResource getMenuSelectedBackground()
412  {
413    if (theme != null)
414      return theme.getMenuSelectedBackground();
415    return null;
416  }
417
418  /**
419   * Returns the foreground color for selected menu items, from the installed
420   * theme.
421   * 
422   * @return The foreground color for selected menu items.
423   * 
424   * @see #getMenuForeground()
425   */
426  public static ColorUIResource getMenuSelectedForeground()
427  {
428    if (theme != null)
429      return theme.getMenuSelectedForeground();
430    return null;
431  }
432
433  /**
434   * Returns the font used for text in menus, from the installed theme.
435   * 
436   * @return The font used for text in menus.
437   */
438  public static FontUIResource getMenuTextFont()
439  {
440    if (theme != null)
441      return theme.getMenuTextFont();
442    return null;
443  }
444
445  /**
446   * Returns the primary color for controls, from the installed theme.
447   * 
448   * @return The primary color for controls.
449   */
450  public static ColorUIResource getPrimaryControl()
451  {
452    if (theme != null)
453      return theme.getPrimaryControl();
454    return null;
455  }
456
457  /**
458   * Returns the primary color for the dark shadow on controls, from the 
459   * installed theme.
460   * 
461   * @return The primary color for the dark shadow on controls.
462   */
463  public static ColorUIResource getPrimaryControlDarkShadow()
464  {
465    if (theme != null)
466      return theme.getPrimaryControlDarkShadow();
467    return null;
468  }
469
470  /**
471   * Returns the primary color for the highlight on controls, from the 
472   * installed theme.
473   * 
474   * @return The primary color for the highlight on controls.
475   */
476  public static ColorUIResource getPrimaryControlHighlight()
477  {
478    if (theme != null)
479      return theme.getPrimaryControlHighlight();
480    return null;
481  }
482
483  /**
484   * Returns the primary color for the information on controls, from the 
485   * installed theme.
486   * 
487   * @return The primary color for the information on controls.
488   */
489  public static ColorUIResource getPrimaryControlInfo()
490  {
491    if (theme != null)
492      return theme.getPrimaryControlInfo();
493    return null;
494  }
495
496  /**
497   * Returns the primary color for the shadow on controls, from the installed
498   * theme.
499   * 
500   * @return The primary color for the shadow on controls.
501   */
502  public static ColorUIResource getPrimaryControlShadow()
503  {
504    if (theme != null)
505      return theme.getPrimaryControlShadow();
506    return null;
507  }
508
509  /**
510   * Returns the background color for separators, from the installed theme.
511   * 
512   * @return The background color for separators.
513   */
514  public static ColorUIResource getSeparatorBackground()
515  {
516    if (theme != null)
517      return theme.getSeparatorBackground();
518    return null;
519  }
520
521  /**
522   * Returns the foreground color for separators, from the installed theme.
523   * 
524   * @return The foreground color for separators.
525   */
526  public static ColorUIResource getSeparatorForeground()
527  {
528    if (theme != null)
529      return theme.getSeparatorForeground();
530    return null;
531  }
532
533  /**
534   * Returns the font used for sub text, from the installed theme.
535   * 
536   * @return The font used for sub text.
537   */
538  public static FontUIResource getSubTextFont()
539  {
540    if (theme != null)
541      return theme.getSubTextFont();
542    return null;
543  }
544
545  /**
546   * Returns the color used for system text, from the installed theme.
547   * 
548   * @return The color used for system text.
549   */
550  public static ColorUIResource getSystemTextColor()
551  {
552    if (theme != null)
553      return theme.getSystemTextColor();
554    return null;
555  }
556
557  /**
558   * Returns the font used for system text, from the installed theme.
559   * 
560   * @return The font used for system text.
561   */
562  public static FontUIResource getSystemTextFont()
563  {
564    if (theme != null)
565      return theme.getSystemTextFont();
566    return null;
567  }
568
569  /**
570   * Returns the color used to highlight text, from the installed theme.
571   * 
572   * @return The color used to highlight text.
573   */
574  public static ColorUIResource getTextHighlightColor()
575  {
576    if (theme != null)
577      return theme.getTextHighlightColor();
578    return null;
579  }
580
581  /**
582   * Returns the color used to display user text, from the installed theme.
583   * 
584   * @return The color used to display user text.
585   */
586  public static ColorUIResource getUserTextColor()
587  {
588    if (theme != null)
589      return theme.getUserTextColor();
590    return null;
591  }
592
593  /**
594   * Returns the font used for user text, obtained from the current theme.
595   * 
596   * @return The font used for user text.
597   */
598  public static FontUIResource getUserTextFont()
599  {
600    if (theme != null)
601      return theme.getUserTextFont();
602    return null;
603  }
604
605  /**
606   * Returns the color used for white, from the installed theme.
607   * 
608   * @return The color used for white.
609   */
610  public static ColorUIResource getWhite()
611  {
612    if (theme != null)
613      return theme.getWhite();
614    return null;
615  }
616
617  /**
618   * Returns the window background color, from the installed theme.
619   * 
620   * @return The window background color.
621   */
622  public static ColorUIResource getWindowBackground()
623  {
624    if (theme != null)
625      return theme.getWindowBackground();
626    return null;
627  }
628
629  /**
630   * Returns the window title background color, from the installed theme.
631   * 
632   * @return The window title background color.
633   */
634  public static ColorUIResource getWindowTitleBackground()
635  {
636    if (theme != null)
637      return theme.getWindowTitleBackground();
638    return null;
639  }
640
641  /**
642   * Returns the window title font from the current theme.
643   * 
644   * @return The window title font.
645   * 
646   * @see MetalTheme
647   */
648  public static FontUIResource getWindowTitleFont()
649  {
650    if (theme != null)
651      return theme.getWindowTitleFont();
652    return null;
653  }
654
655  /**
656   * Returns the window title foreground color, from the installed theme.
657   * 
658   * @return The window title foreground color.
659   */
660  public static ColorUIResource getWindowTitleForeground()
661  {
662    if (theme != null)
663      return theme.getWindowTitleForeground();
664    return null;
665  }
666
667  /**
668   * Returns the background color for an inactive window title, from the 
669   * installed theme.
670   * 
671   * @return The background color for an inactive window title.
672   */
673  public static ColorUIResource getWindowTitleInactiveBackground()
674  {
675    if (theme != null)
676      return theme.getWindowTitleInactiveBackground();
677    return null;
678  }
679
680  /**
681   * Returns the foreground color for an inactive window title, from the 
682   * installed theme.
683   * 
684   * @return The foreground color for an inactive window title.
685   */
686  public static ColorUIResource getWindowTitleInactiveForeground()
687  {
688    if (theme != null)
689      return theme.getWindowTitleInactiveForeground();
690    return null;
691  }
692
693  /**
694   * Sets the current theme for the look and feel.  Note that the theme must be 
695   * set <em>before</em> the look and feel is installed.  To change the theme 
696   * for an already running application that is using the 
697   * {@link MetalLookAndFeel}, first set the theme with this method, then 
698   * create a new instance of {@link MetalLookAndFeel} and install it in the 
699   * usual way (see {@link UIManager#setLookAndFeel(LookAndFeel)}).
700   * 
701   * @param theme  the theme (<code>null</code> not permitted).
702   * 
703   * @throws NullPointerException if <code>theme</code> is <code>null</code>.
704   * 
705   * @see #getCurrentTheme()
706   */
707  public static void setCurrentTheme(MetalTheme theme)
708  {
709    if (theme == null)
710      throw new NullPointerException("Null 'theme' not permitted.");
711    MetalLookAndFeel.theme = theme;
712  }
713
714  /**
715   * Sets the ComponentUI classes for all Swing components to the Metal
716   * implementations.
717   *
718   * In particular this sets the following keys:
719   *
720   * <table>
721   * <tr>
722   * <th>Key</th><th>Value</th>
723   * </tr><tr>
724   * <td>ButtonUI</td><td>{@link MetalButtonUI}</td>
725   * </tr><tr>
726   * <td>CheckBoxUI</td><td>{@link MetalCheckBoxUI}</td>
727   * </tr><tr>
728   * <td>ComboBoxUI</td><td>{@link MetalComboBoxUI}</td>
729   * </tr><tr>
730   * <td>DesktopIconUI</td><td>{@link MetalDesktopIconUI}</td>
731   * </tr><tr>
732   * <td>InternalFrameUI</td><td>{@link MetalInternalFrameUI}</td>
733   * </tr><tr>
734   * <td>LabelUI</td><td>{@link MetalLabelUI}</td>
735   * </tr><tr>
736   * <td>PopupMenuSeparatorUI</td><td>{@link MetalPopupMenuSeparatorUI}</td>
737   * </tr><tr>
738   * <td>ProgressBarUI</td><td>{@link MetalProgressBarUI}</td>
739   * </tr><tr>
740   * <td>RadioButtonUI</td><td>{@link MetalRadioButtonUI}</td>
741   * </tr><tr>
742   * <td>RootPaneUI</td><td>{@link MetalRootPaneUI}</td>
743   * </tr><tr>
744   * <td>ScrollBarUI</td><td>{@link MetalScrollBarUI}</td>
745   * </tr><tr>
746   * <td>ScrollPaneUI</td><td>{@link MetalScrollPaneUI}</td>
747   * </tr><tr>
748   * <td>SeparatorUI</td><td>{@link MetalSeparatorUI}</td>
749   * </tr><tr>
750   * <td>SliderUI</td><td>{@link MetalSliderUI}</td>
751   * </tr><tr>
752   * <td>SplitPaneUI</td><td>{@link MetalSplitPaneUI}</td>
753   * </tr><tr>
754   * <td>TabbedPaneUI</td><td>{@link MetalTabbedPaneUI}</td>
755   * </tr><tr>
756   * <td>TextFieldUI</td><td>{@link MetalTextFieldUI}</td>
757   * </tr><tr>
758   * <td>ToggleButtonUI</td><td>{@link MetalToggleButtonUI}</td>
759   * </tr><tr>
760   * <td>ToolBarUI</td><td>{@link MetalToolBarUI}</td>
761   * </tr><tr>
762   * <td>ToolTipUI</td><td>{@link MetalToolTipUI}</td>
763   * </tr><tr>
764   * <td>TreeUI</td><td>{@link MetalTreeUI}</td>
765   * </tr><tr>
766   * </table>
767   *
768   * @param defaults the UIDefaults where the class defaults are added
769   */
770  protected void initClassDefaults(UIDefaults defaults)
771  {
772    super.initClassDefaults(defaults);
773
774    // Variables
775    Object[] uiDefaults;
776    // Initialize Class Defaults
777    uiDefaults = new Object[] {
778      "ButtonUI", "javax.swing.plaf.metal.MetalButtonUI",
779      "CheckBoxUI", "javax.swing.plaf.metal.MetalCheckBoxUI",
780      "ComboBoxUI", "javax.swing.plaf.metal.MetalComboBoxUI",
781      "DesktopIconUI", "javax.swing.plaf.metal.MetalDesktopIconUI",
782      "FileChooserUI", "javax.swing.plaf.metal.MetalFileChooserUI",
783      "InternalFrameUI", "javax.swing.plaf.metal.MetalInternalFrameUI",
784      "LabelUI", "javax.swing.plaf.metal.MetalLabelUI",
785      "MenuBarUI", "javax.swing.plaf.metal.MetalMenuBarUI",
786      "PopupMenuSeparatorUI",
787      "javax.swing.plaf.metal.MetalPopupMenuSeparatorUI",
788      "ProgressBarUI", "javax.swing.plaf.metal.MetalProgressBarUI",
789      "RadioButtonUI", "javax.swing.plaf.metal.MetalRadioButtonUI",
790      "RootPaneUI", "javax.swing.plaf.metal.MetalRootPaneUI",
791      "ScrollBarUI", "javax.swing.plaf.metal.MetalScrollBarUI",
792      "ScrollPaneUI", "javax.swing.plaf.metal.MetalScrollPaneUI",
793      "SeparatorUI", "javax.swing.plaf.metal.MetalSeparatorUI",
794      "SliderUI", "javax.swing.plaf.metal.MetalSliderUI",
795      "SplitPaneUI", "javax.swing.plaf.metal.MetalSplitPaneUI",
796      "TabbedPaneUI", "javax.swing.plaf.metal.MetalTabbedPaneUI",
797      "TextFieldUI", "javax.swing.plaf.metal.MetalTextFieldUI",
798      "ToggleButtonUI", "javax.swing.plaf.metal.MetalToggleButtonUI",
799      "ToolBarUI", "javax.swing.plaf.metal.MetalToolBarUI",
800      "ToolTipUI", "javax.swing.plaf.metal.MetalToolTipUI",
801      "TreeUI", "javax.swing.plaf.metal.MetalTreeUI",
802    };
803    // Add Class Defaults to UI Defaults table
804    defaults.putDefaults(uiDefaults);
805  }
806
807  /**
808   * Initializes the component defaults for the Metal Look &amp; Feel.
809   *
810   * In particular this sets the following keys (the colors are given
811   * as RGB hex values):
812   *
813   * <table>
814   * <tr>
815   * <th>Key</th><th>Value</th>
816   * </tr><tr>
817   * <td>Button.background</td><td>0xcccccc</td>
818   * </tr><tr>
819   * <td>Button.border</td><td>{@link MetalBorders#getButtonBorder()}</td>
820   * </tr><tr>
821   * <td>Button.font</td><td>{@link #getControlTextFont}</td>
822   * </tr><tr>
823   * <td>Button.margin</td><td><code>new java.awt.Insets(2, 14, 2, 14)</code>
824   * </td>
825   * </tr><tr>
826   * <td>CheckBox.background</td><td>0xcccccc</td>
827   * </tr><tr>
828   * <td>CheckBoxMenuItem.background</td><td>0xcccccc</td>
829   * </tr><tr>
830   * <td>ToolBar.background</td><td>0xcccccc</td>
831   * </tr><tr>
832   * <td>Panel.background</td><td>0xcccccc</td>
833   * </tr><tr>
834   * <td>Slider.background</td><td>0xcccccc</td>
835   * </tr><tr>
836   * <td>OptionPane.background</td><td>0xcccccc</td>
837   * </tr><tr>
838   * <td>ProgressBar.background</td><td>0xcccccc</td>
839   * </tr><tr>
840   * <td>TabbedPane.background</td><td>0xcccccc</td>
841   * </tr><tr>
842   * <td>Label.background</td><td>0xcccccc</td>
843   * </tr><tr>
844   * <td>Label.font</td><td>{@link #getControlTextFont}</td>
845   * </tr><tr>
846   * <td>Menu.background</td><td>0xcccccc</td>
847   * </tr><tr>
848   * <td>MenuBar.background</td><td>0xcccccc</td>
849   * </tr><tr>
850   * <td>MenuItem.background</td><td>0xcccccc</td>
851   * </tr><tr>
852   * <td>ScrollBar.background</td><td>0xcccccc</td>
853   * </tr><tr>
854   * <td>PopupMenu.border</td>
855   * <td><code>new javax.swing.plaf.metal.MetalBorders.PopupMenuBorder()</td>
856   * </tr><tr>
857   * </table>
858   *
859   * @param defaults the UIDefaults instance to which the values are added
860   */
861  protected void initComponentDefaults(UIDefaults defaults)
862  {
863    super.initComponentDefaults(defaults);
864    Object[] myDefaults = new Object[] {
865      "Button.background", getControl(),
866      "Button.border", MetalBorders.getButtonBorder(),
867      "Button.darkShadow", getControlDarkShadow(),
868      "Button.disabledText", getInactiveControlTextColor(),
869      "Button.focus", getFocusColor(),
870      "Button.font", getControlTextFont(),
871      "Button.foreground", getControlTextColor(),
872      "Button.highlight", getControlHighlight(),
873      "Button.light", getControlHighlight(),
874      "Button.margin", new InsetsUIResource(2, 14, 2, 14),
875      "Button.select", getControlShadow(),
876      "Button.shadow", getControlShadow(),
877
878      "CheckBox.background", getControl(),
879      "CheckBox.border", MetalBorders.getButtonBorder(),
880      "CheckBox.disabledText", getInactiveControlTextColor(),
881      "CheckBox.focus", getFocusColor(),
882      "CheckBox.font", getControlTextFont(),
883      "CheckBox.foreground", getControlTextColor(),
884      "CheckBox.icon",
885      new UIDefaults.ProxyLazyValue("javax.swing.plaf.metal.MetalCheckBoxIcon"),
886      "CheckBox.checkIcon",
887      new UIDefaults.ProxyLazyValue("javax.swing.plaf.metal.MetalCheckBoxIcon"),
888      "Checkbox.select", getControlShadow(),
889
890      "CheckBoxMenuItem.acceleratorFont", new FontUIResource("Dialog", Font.PLAIN, 10),
891      "CheckBoxMenuItem.acceleratorForeground", getAcceleratorForeground(),
892      "CheckBoxMenuItem.acceleratorSelectionForeground", getAcceleratorSelectedForeground(),
893      "CheckBoxMenuItem.background", getMenuBackground(),
894      "CheckBoxMenuItem.borderPainted", Boolean.TRUE,
895      "CheckBoxMenuItem.commandSound", "sounds/MenuItemCommand.wav",
896      "CheckBoxMenuItem.checkIcon", MetalIconFactory.getCheckBoxMenuItemIcon(),
897      "CheckBoxMenuItem.disabledForeground", getMenuDisabledForeground(),
898      "CheckBoxMenuItem.font", getMenuTextFont(),
899      "CheckBoxMenuItem.foreground", getMenuForeground(),
900      "CheckBoxMenuItem.selectionBackground", getMenuSelectedBackground(),
901      "CheckBoxMenuItem.selectionForeground", getMenuSelectedForeground(),
902
903      "ColorChooser.background", getControl(),
904      "ColorChooser.foreground", getControlTextColor(),
905      "ColorChooser.rgbBlueMnemonic", new Integer(0),
906      "ColorChooser.rgbGreenMnemonic", new Integer(0),
907      "ColorChooser.rgbRedMnemonic", new Integer(0),
908      "ColorChooser.swatchesDefaultRecentColor", getControl(),
909
910      "ComboBox.background", getControl(),
911      "ComboBox.buttonBackground", getControl(),
912      "ComboBox.buttonDarkShadow", getControlDarkShadow(),
913      "ComboBox.buttonHighlight", getControlHighlight(),
914      "ComboBox.buttonShadow", getControlShadow(),
915      "ComboBox.disabledBackground", getControl(),
916      "ComboBox.disabledForeground", getInactiveSystemTextColor(),
917      "ComboBox.font", getControlTextFont(),
918      "ComboBox.foreground", getControlTextColor(),
919      "ComboBox.selectionBackground", getPrimaryControlShadow(),
920      "ComboBox.selectionForeground", getControlTextColor(),
921
922      "Desktop.background", getDesktopColor(),
923
924      "DesktopIcon.background", getControl(),
925      "DesktopIcon.foreground", getControlTextColor(),
926      "DesktopIcon.width", new Integer(160),
927      "DesktopIcon.border", MetalBorders.getDesktopIconBorder(),
928      "DesktopIcon.font", getControlTextFont(),
929
930      "EditorPane.background", getWindowBackground(),
931      "EditorPane.caretForeground", getUserTextColor(),
932      "EditorPane.font", getControlTextFont(),
933      "EditorPane.foreground",  getUserTextColor(),
934      "EditorPane.inactiveForeground",  getInactiveSystemTextColor(),
935      "EditorPane.selectionBackground", getTextHighlightColor(),
936      "EditorPane.selectionForeground", getHighlightedTextColor(),
937      
938      "FormattedTextField.background", getWindowBackground(),
939      "FormattedTextField.border",
940      new BorderUIResource(MetalBorders.getTextFieldBorder()),
941      "FormattedTextField.caretForeground", getUserTextColor(),
942      "FormattedTextField.font", new FontUIResource("Dialog", Font.PLAIN, 12),
943      "FormattedTextField.foreground",  getUserTextColor(),
944      "FormattedTextField.inactiveBackground",  getControl(),
945      "FormattedTextField.inactiveForeground",  getInactiveSystemTextColor(),
946      "FormattedTextField.selectionBackground", getTextHighlightColor(),
947      "FormattedTextField.selectionForeground", getHighlightedTextColor(),
948
949      "FileChooser.upFolderIcon", 
950          MetalIconFactory.getFileChooserUpFolderIcon(),
951      "FileChooser.listViewIcon", 
952          MetalIconFactory.getFileChooserListViewIcon(),
953      "FileChooser.newFolderIcon", 
954          MetalIconFactory.getFileChooserNewFolderIcon(),
955      "FileChooser.homeFolderIcon", 
956          MetalIconFactory.getFileChooserHomeFolderIcon(),
957      "FileChooser.detailsViewIcon", 
958          MetalIconFactory.getFileChooserDetailViewIcon(),
959      "FileChooser.fileNameLabelMnemonic", new Integer(78),
960      "FileChooser.filesOfTypeLabelMnemonic", new Integer(84),
961      "FileChooser.lookInLabelMnemonic", new Integer(73),
962      "FileView.computerIcon", MetalIconFactory.getTreeComputerIcon(),
963      "FileView.directoryIcon", MetalIconFactory.getTreeFolderIcon(),
964      "FileView.fileIcon", MetalIconFactory.getTreeLeafIcon(),
965      "FileView.floppyDriveIcon", MetalIconFactory.getTreeFloppyDriveIcon(),
966      "FileView.hardDriveIcon", MetalIconFactory.getTreeHardDriveIcon(),
967
968      "InternalFrame.activeTitleBackground", getWindowTitleBackground(),
969      "InternalFrame.activeTitleForeground", getWindowTitleForeground(),
970      "InternalFrame.border", new MetalBorders.InternalFrameBorder(),
971      "InternalFrame.borderColor", getControl(),
972      "InternalFrame.borderDarkShadow", getControlDarkShadow(),
973      "InternalFrame.borderHighlight", getControlHighlight(),
974      "InternalFrame.borderLight", getControlHighlight(),
975      "InternalFrame.borderShadow", getControlShadow(),
976      "InternalFrame.icon", MetalIconFactory.getInternalFrameDefaultMenuIcon(),
977      "InternalFrame.closeIcon", 
978        MetalIconFactory.getInternalFrameCloseIcon(16),
979      "InternalFrame.closeSound", "sounds/FrameClose.wav",
980      "InternalFrame.inactiveTitleBackground", getWindowTitleInactiveBackground(),
981      "InternalFrame.inactiveTitleForeground", getWindowTitleInactiveForeground(),
982      "InternalFrame.maximizeIcon", 
983        MetalIconFactory.getInternalFrameMaximizeIcon(16),
984      "InternalFrame.maximizeSound", "sounds/FrameMaximize.wav",
985      "InternalFrame.iconifyIcon", 
986        MetalIconFactory.getInternalFrameMinimizeIcon(16),
987      "InternalFrame.minimizeSound", "sounds/FrameMinimize.wav",
988      "InternalFrame.paletteBorder", new MetalBorders.PaletteBorder(),
989      "InternalFrame.paletteCloseIcon", new MetalIconFactory.PaletteCloseIcon(),
990      "InternalFrame.paletteTitleHeight", new Integer(11),
991      "InternalFrame.restoreDownSound", "sounds/FrameRestoreDown.wav",
992      "InternalFrame.restoreUpSound", "sounds/FrameRestoreUp.wav",
993
994      "Label.background", getControl(),
995      "Label.disabledForeground", getInactiveSystemTextColor(),
996      "Label.disabledShadow", getControlShadow(),
997      "Label.font", getControlTextFont(),
998      "Label.foreground", getSystemTextColor(),
999
1000      "List.font", getControlTextFont(),
1001      "List.background", getWindowBackground(),
1002      "List.foreground", getUserTextColor(),
1003      "List.selectionBackground", getTextHighlightColor(),
1004      "List.selectionForeground", getHighlightedTextColor(),
1005      "List.focusCellHighlightBorder", 
1006        new LineBorderUIResource(MetalLookAndFeel.getFocusColor()),
1007
1008      "Menu.acceleratorFont", new FontUIResource("Dialog", Font.PLAIN, 10),
1009      "Menu.acceleratorForeground", getAcceleratorForeground(),
1010      "Menu.acceleratorSelectionForeground", getAcceleratorSelectedForeground(),
1011      "Menu.arrowIcon", MetalIconFactory.getMenuArrowIcon(),
1012      "Menu.background", getMenuBackground(),
1013      "Menu.border", new MetalBorders.MenuItemBorder(),
1014      "Menu.borderPainted", Boolean.TRUE,
1015      "MenuItem.commandSound", "sounds/MenuItemCommand.wav",
1016      "Menu.disabledForeground", getMenuDisabledForeground(),
1017      "Menu.font", getMenuTextFont(),
1018      "Menu.foreground", getMenuForeground(),
1019      "Menu.selectionBackground", getMenuSelectedBackground(),
1020      "Menu.selectionForeground", getMenuSelectedForeground(),
1021      "Menu.submenuPopupOffsetX", new Integer(-4),
1022      "Menu.submenuPopupOffsetY", new Integer(-3),
1023
1024      "MenuBar.background", getMenuBackground(),
1025      "MenuBar.border", new MetalBorders.MenuBarBorder(),
1026      "MenuBar.font", getMenuTextFont(),
1027      "MenuBar.foreground", getMenuForeground(),
1028      "MenuBar.highlight", getControlHighlight(),
1029      "MenuBar.shadow", getControlShadow(),
1030
1031      "MenuItem.acceleratorDelimiter", "-",
1032      "MenuItem.acceleratorFont", new FontUIResource("Dialog", Font.PLAIN, 10),
1033      "MenuItem.acceleratorForeground", getAcceleratorForeground(),
1034      "MenuItem.acceleratorSelectionForeground", getAcceleratorSelectedForeground(),
1035      "MenuItem.arrowIcon", MetalIconFactory.getMenuItemArrowIcon(),
1036      "MenuItem.background", getMenuBackground(),
1037      "MenuItem.border", new MetalBorders.MenuItemBorder(),
1038      "MenuItem.borderPainted", Boolean.TRUE,
1039      "MenuItem.disabledForeground", getMenuDisabledForeground(),
1040      "MenuItem.font", getMenuTextFont(),
1041      "MenuItem.foreground", getMenuForeground(),
1042      "MenuItem.selectionBackground", getMenuSelectedBackground(),
1043      "MenuItem.selectionForeground", getMenuSelectedForeground(),
1044
1045      "OptionPane.background", getControl(),
1046      "OptionPane.errorSound", "sounds/OptionPaneError.wav",
1047      "OptionPane.informationSound", "sounds/OptionPaneInformation.wav",
1048      "OptionPane.questionSound", "sounds/OptionPaneQuestion.wav",
1049      "OptionPane.warningSound", "sounds/OptionPaneWarning.wav",
1050      "OptionPane.errorDialog.border.background", new ColorUIResource(153, 51, 51), 
1051      "OptionPane.errorDialog.titlePane.background", new ColorUIResource(255, 153, 153),
1052      "OptionPane.errorDialog.titlePane.foreground", new ColorUIResource(51, 0, 0),
1053      "OptionPane.errorDialog.titlePane.shadow", new ColorUIResource(204, 102, 102),
1054      "OptionPane.foreground", getControlTextColor(),
1055      "OptionPane.messageForeground", getControlTextColor(),
1056      "OptionPane.questionDialog.border.background", new ColorUIResource(51, 102, 51),
1057      "OptionPane.questionDialog.titlePane.background", new ColorUIResource(153, 204, 153),
1058      "OptionPane.questionDialog.titlePane.foreground", new ColorUIResource(0, 51, 0),
1059      "OptionPane.questionDialog.titlePane.shadow", new ColorUIResource(102, 153, 102),
1060      "OptionPane.warningDialog.border.background", new ColorUIResource(153, 102, 51),
1061      "OptionPane.warningDialog.titlePane.background", new ColorUIResource(255, 204, 153),
1062      "OptionPane.warningDialog.titlePane.foreground", new ColorUIResource(102, 51, 0),
1063      "OptionPane.warningDialog.titlePane.shadow", new ColorUIResource(204, 153, 102),
1064
1065      "Panel.background", getControl(),
1066      "Panel.foreground", getUserTextColor(),
1067
1068      "PasswordField.background", getWindowBackground(),
1069      "PasswordField.border",
1070      new BorderUIResource(MetalBorders.getTextFieldBorder()),
1071      "PasswordField.caretForeground", getUserTextColor(),
1072      "PasswordField.foreground", getUserTextColor(),
1073      "PasswordField.font", new FontUIResource("Dialog", Font.PLAIN, 12),
1074      "PasswordField.inactiveBackground", getControl(),
1075      "PasswordField.inactiveForeground", getInactiveSystemTextColor(),
1076      "PasswordField.selectionBackground", getTextHighlightColor(),
1077      "PasswordField.selectionForeground", getHighlightedTextColor(),
1078
1079      "PopupMenu.background", getMenuBackground(),
1080      "PopupMenu.border", new MetalBorders.PopupMenuBorder(),
1081      "PopupMenu.font", getMenuTextFont(),
1082      "PopupMenu.foreground", getMenuForeground(),
1083      "PopupMenu.popupSound", "sounds/PopupMenuPopup.wav",
1084
1085      "ProgressBar.background", getControl(),
1086      "ProgressBar.border", new BorderUIResource.LineBorderUIResource(getControlDarkShadow(), 1),
1087      "ProgressBar.font", getControlTextFont(),
1088      "ProgressBar.foreground", getPrimaryControlShadow(),
1089      "ProgressBar.selectionBackground", getPrimaryControlDarkShadow(),
1090      "ProgressBar.selectionForeground", getControl(),
1091
1092      "RadioButton.background", getControl(),
1093      "RadioButton.darkShadow", getControlDarkShadow(),
1094      "RadioButton.disabledText", getInactiveControlTextColor(),
1095      "RadioButton.icon",
1096      new UIDefaults.LazyValue()
1097      {
1098        public Object createValue(UIDefaults def)
1099          {
1100            return MetalIconFactory.getRadioButtonIcon();
1101          }
1102      },
1103      "RadioButton.focus", MetalLookAndFeel.getFocusColor(),
1104      "RadioButton.font", MetalLookAndFeel.getControlTextFont(),
1105      "RadioButton.foreground", getControlTextColor(),
1106      "RadioButton.highlight", getControlHighlight(),
1107      "RadioButton.light", getControlHighlight(),
1108      "RadioButton.select", getControlShadow(),
1109      "RadioButton.shadow", getControlShadow(),
1110
1111      "RadioButtonMenuItem.acceleratorFont", new Font("Dialog", Font.PLAIN, 10),
1112      "RadioButtonMenuItem.acceleratorForeground", getAcceleratorForeground(),
1113      "RadioButtonMenuItem.acceleratorSelectionForeground", getAcceleratorSelectedForeground(),
1114      "RadioButtonMenuItem.background", getMenuBackground(),
1115      "RadioButtonMenuItem.border", new MetalBorders.MenuItemBorder(),
1116      "RadioButtonMenuItem.borderPainted", Boolean.TRUE,
1117      "RadioButtonMenuItem.checkIcon", 
1118        MetalIconFactory.getRadioButtonMenuItemIcon(),
1119      "RadioButtonMenuItem.commandSound", "sounds/MenuItemCommand.wav",
1120      "RadioButtonMenuItem.disabledForeground", getMenuDisabledForeground(),
1121      "RadioButtonMenuItem.font", getMenuTextFont(),
1122      "RadioButtonMenuItem.foreground", getMenuForeground(),
1123      "RadioButtonMenuItem.margin", new InsetsUIResource(2, 2, 2, 2),
1124      "RadioButtonMenuItem.selectionBackground", 
1125        MetalLookAndFeel.getMenuSelectedBackground(),
1126      "RadioButtonMenuItem.selectionForeground", 
1127        MetalLookAndFeel.getMenuSelectedForeground(),
1128
1129      "ScrollBar.allowsAbsolutePositioning", Boolean.TRUE,
1130      "ScrollBar.background", getControl(),
1131      "ScrollBar.darkShadow", getControlDarkShadow(),
1132      "ScrollBar.foreground", getControl(),
1133      "ScrollBar.highlight", getControlHighlight(),
1134      "ScrollBar.shadow", getControlShadow(),
1135      "ScrollBar.thumb", getPrimaryControlShadow(),
1136      "ScrollBar.thumbDarkShadow", getControlDarkShadow(),
1137      "ScrollBar.thumbHighlight", getPrimaryControl(),
1138      "ScrollBar.thumbShadow", getPrimaryControlDarkShadow(),
1139      "ScrollBar.track", getControl(),
1140      "ScrollBar.trackHighlight", getControlDarkShadow(),
1141      "ScrollBar.width", new Integer(17),
1142
1143      "ScrollPane.background", getControl(),
1144      "ScrollPane.border", new MetalBorders.ScrollPaneBorder(),
1145      "ScrollPane.foreground", getControlTextColor(),
1146
1147      "Separator.background", getSeparatorBackground(),
1148      "Separator.foreground", getSeparatorForeground(),
1149      "Separator.highlight", getControlHighlight(),
1150      "Separator.shadow", getControlShadow(),
1151
1152      "Slider.background", getControl(),
1153      "Slider.focus", getFocusColor(),
1154      "Slider.focusInsets", new InsetsUIResource(0, 0, 0, 0),
1155      "Slider.foreground", getPrimaryControlShadow(),
1156      "Slider.highlight", getControlHighlight(),
1157      "Slider.horizontalThumbIcon", 
1158      MetalIconFactory.getHorizontalSliderThumbIcon(),
1159      "Slider.majorTickLength", new Integer(6),
1160      "Slider.shadow", getControlShadow(),
1161      "Slider.trackWidth", new Integer(7),
1162      "Slider.verticalThumbIcon", 
1163      MetalIconFactory.getVerticalSliderThumbIcon(),
1164
1165      "Spinner.arrowButtonInsets", new InsetsUIResource(0, 0, 0, 0),
1166      "Spinner.background", getControl(),
1167      "Spinner.border", MetalBorders.getTextFieldBorder(),
1168      "Spinner.font", getControlTextFont(),
1169      "Spinner.foreground", getControl(),
1170
1171      "SplitPane.background", getControl(),
1172      "SplitPane.darkShadow", getControlDarkShadow(),
1173      "SplitPane.dividerFocusColor", getPrimaryControl(),
1174      "SplitPane.dividerSize", new Integer(10),
1175      "SplitPane.highlight", getControlHighlight(),
1176      "SplitPane.shadow", getControlShadow(),
1177
1178      "SplitPaneDivider.draggingColor", Color.DARK_GRAY,
1179
1180      "TabbedPane.background", getControlShadow(),
1181      "TabbedPane.contentBorderInsets", new InsetsUIResource(2, 2, 3, 3),
1182      "TabbedPane.contentOpaque", Boolean.TRUE,
1183      "TabbedPane.darkShadow", getControlDarkShadow(),
1184      "TabbedPane.focus", getPrimaryControlDarkShadow(),
1185      "TabbedPane.font", getControlTextFont(),
1186      "TabbedPane.foreground", getControlTextColor(),
1187      "TabbedPane.highlight", getControlHighlight(),
1188      "TabbedPane.light", getControl(),
1189      "TabbedPane.selected", getControl(), // overridden in OceanTheme
1190      "TabbedPane.selectHighlight", getControlHighlight(),
1191      "TabbedPane.selectedTabPadInsets", new InsetsUIResource(2, 2, 2, 1),
1192      "TabbedPane.shadow", getControlShadow(),
1193      "TabbedPane.tabAreaBackground", getControl(), // overridden in OceanTheme
1194      "TabbedPane.tabAreaInsets", new InsetsUIResource(4, 2, 0, 6), // dito
1195      "TabbedPane.tabInsets", new InsetsUIResource(0, 9, 1, 9),
1196
1197      // new properties in OceanTheme:
1198      // TabbedPane.contentAreaColor
1199      // TabbedPane.unselectedBackground
1200      
1201      "Table.background", getWindowBackground(),
1202      "Table.focusCellBackground", getWindowBackground(),
1203      "Table.focusCellForeground", getControlTextColor(),
1204      "Table.foreground", getControlTextColor(),
1205      "Table.focusCellHighlightBorder",
1206      new BorderUIResource.LineBorderUIResource(getFocusColor()),
1207      "Table.focusCellBackground", getWindowBackground(),
1208      "Table.gridColor", getControlDarkShadow(),
1209      "Table.selectionBackground", new ColorUIResource(204, 204, 255),
1210      "Table.selectionForeground", new ColorUIResource(0, 0, 0),
1211
1212      "TableHeader.background", getControl(),
1213      "TableHeader.cellBorder", new MetalBorders.TableHeaderBorder(),
1214      "TableHeader.foreground", getControlTextColor(),
1215
1216      "TextArea.background", getWindowBackground(),
1217      "TextArea.caretForeground", getUserTextColor(),
1218      "TextArea.font", new FontUIResource("Dialog", Font.PLAIN, 12),
1219      "TextArea.foreground", getUserTextColor(),
1220      "TextArea.inactiveForeground", getInactiveSystemTextColor(),
1221      "TextArea.selectionBackground", getTextHighlightColor(),
1222      "TextArea.selectionForeground", getHighlightedTextColor(),
1223
1224      "TextField.background", getWindowBackground(),
1225      "TextField.border",
1226      new BorderUIResource(MetalBorders.getTextFieldBorder()),
1227      "TextField.caretForeground", getUserTextColor(),
1228      "TextField.darkShadow", getControlDarkShadow(),
1229      "TextField.font", new FontUIResource("Dialog", Font.PLAIN, 12),
1230      "TextField.foreground", getUserTextColor(),
1231      "TextField.highlight", getControlHighlight(),
1232      "TextField.inactiveBackground", getControl(),
1233      "TextField.inactiveForeground", getInactiveSystemTextColor(),
1234      "TextField.light", getControlHighlight(),
1235      "TextField.selectionBackground", getTextHighlightColor(),
1236      "TextField.selectionForeground", getHighlightedTextColor(),
1237      "TextField.shadow", getControlShadow(),
1238     
1239      "TextPane.background", getWindowBackground(),
1240      "TextPane.caretForeground", getUserTextColor(),
1241      "TextPane.font", new FontUIResource("Dialog", Font.PLAIN, 12),
1242      "TextPane.foreground", getUserTextColor(),
1243      "TextPane.inactiveForeground", getInactiveSystemTextColor(),
1244      "TextPane.selectionBackground", getTextHighlightColor(),
1245      "TextPane.selectionForeground", getHighlightedTextColor(),
1246
1247      "TitledBorder.border", new LineBorderUIResource(getPrimaryControl(), 1),
1248      "TitledBorder.font", getControlTextFont(),
1249      "TitledBorder.titleColor", getSystemTextColor(),
1250
1251      "ToggleButton.background", getControl(),
1252      "ToggleButton.border", MetalBorders.getToggleButtonBorder(),
1253      "ToggleButton.darkShadow", getControlDarkShadow(),
1254      "ToggleButton.disabledText", getInactiveControlTextColor(),
1255      "ToggleButton.focus", getFocusColor(),
1256      "ToggleButton.font", getControlTextFont(),
1257      "ToggleButton.foreground", getControlTextColor(),
1258      "ToggleButton.highlight", getControlHighlight(),
1259      "ToggleButton.light", getControlHighlight(),
1260      "ToggleButton.margin", new InsetsUIResource(2, 14, 2, 14),
1261      "ToggleButton.select", getControlShadow(),
1262      "ToggleButton.shadow", getControlShadow(),
1263
1264      "ToolBar.background", getMenuBackground(),
1265      "ToolBar.darkShadow", getControlDarkShadow(),
1266      "ToolBar.dockingBackground", getMenuBackground(),
1267      "ToolBar.dockingForeground", getPrimaryControlDarkShadow(),
1268      "ToolBar.floatingBackground", getMenuBackground(),
1269      "ToolBar.floatingForeground", getPrimaryControl(),
1270      "ToolBar.font", getMenuTextFont(),
1271      "ToolBar.foreground", getMenuForeground(),
1272      "ToolBar.highlight", getControlHighlight(),
1273      "ToolBar.light", getControlHighlight(),
1274      "ToolBar.shadow", getControlShadow(),
1275      "ToolBar.border", new MetalBorders.ToolBarBorder(),
1276      "ToolBar.rolloverBorder", MetalBorders.getToolbarButtonBorder(),
1277      "ToolBar.nonrolloverBorder", MetalBorders.getToolbarButtonBorder(),
1278
1279      "ToolTip.background", getPrimaryControl(),
1280      "ToolTip.backgroundInactive", getControl(),
1281      "ToolTip.border", new BorderUIResource.LineBorderUIResource(getPrimaryControlDarkShadow(), 1),
1282      "ToolTip.borderInactive", new BorderUIResource.LineBorderUIResource(getControlDarkShadow(), 1),
1283      "ToolTip.font", new FontUIResource("Dialog", Font.PLAIN, 12),
1284      "ToolTip.foreground", getPrimaryControlInfo(),
1285      "ToolTip.foregroundInactive", getControlDarkShadow(),
1286      "ToolTip.hideAccelerator", Boolean.FALSE,
1287
1288      "Tree.background", getWindowBackground(),
1289      "Tree.closedIcon", MetalIconFactory.getTreeFolderIcon(),
1290      "Tree.collapsedIcon", MetalIconFactory.getTreeControlIcon(true),
1291      "Tree.expandedIcon", MetalIconFactory.getTreeControlIcon(false),
1292      "Tree.font", new FontUIResource("Dialog", Font.PLAIN, 12),
1293      "Tree.foreground", getUserTextColor(),
1294      "Tree.hash", getPrimaryControl(),
1295      "Tree.leafIcon", MetalIconFactory.getTreeLeafIcon(),
1296      "Tree.leftChildIndent", new Integer(7),
1297      "Tree.line", getPrimaryControl(),
1298      "Tree.openIcon", MetalIconFactory.getTreeFolderIcon(),
1299      "Tree.rightChildIndent", new Integer(13),
1300      "Tree.rowHeight", new Integer(0),
1301      "Tree.scrollsOnExpand", Boolean.TRUE,
1302      "Tree.selectionBackground", getTextHighlightColor(),
1303      "Tree.selectionBorder", new BorderUIResource.LineBorderUIResource(new Color(102, 102, 153)),
1304      "Tree.selectionBorderColor", getFocusColor(),
1305      "Tree.selectionForeground", getHighlightedTextColor(),
1306      "Tree.textBackground", getWindowBackground(),
1307      "Tree.textForeground", getUserTextColor(),
1308
1309      "Viewport.background", getControl(),
1310      "Viewport.foreground", getUserTextColor()
1311    };
1312    defaults.putDefaults(myDefaults);
1313  }
1314
1315  /**
1316   * Initializes the system color defaults.
1317   *
1318   * In particular this sets the following keys:
1319   *
1320   * <table>
1321   * <tr>
1322   * <th>Key</th><th>Value</th><th>Description</th>
1323   * </tr><tr>
1324   * <td>control</td><td>0xcccccc</td><td>The default color for components</td>
1325   * </tr>
1326   * </table>
1327   */
1328  protected void initSystemColorDefaults(UIDefaults defaults)
1329  {
1330    super.initSystemColorDefaults(defaults);
1331    Object[] uiDefaults;
1332    uiDefaults = new Object[] {
1333      "control", new ColorUIResource(getControl()),
1334      "desktop", new ColorUIResource(getDesktopColor())
1335    };
1336    defaults.putDefaults(uiDefaults);
1337  }
1338
1339  /**
1340   * Returns the current theme for the Metal look and feel.  The default is
1341   * an instance of {@link OceanTheme}.
1342   *
1343   * @return The current theme (never <code>null</code>).
1344   * 
1345   * @see #setCurrentTheme(MetalTheme)
1346   */
1347  public static MetalTheme getCurrentTheme()
1348  {
1349    if (theme == null)
1350      {
1351        // swing.metalTheme property documented here:
1352        // http://java.sun.com/j2se/1.5.0/docs/guide/swing/1.5/index.html
1353        if ("steel".equals(SystemProperties.getProperty("swing.metalTheme")))
1354          theme = new DefaultMetalTheme();
1355        else
1356          theme = new OceanTheme();
1357      }
1358    return theme;
1359  }
1360
1361  /**
1362   * Returns <code>true</code> because the Metal look
1363   * and feel supports window decorations for toplevel
1364   * containers.
1365   *
1366   * @return <code>true</code>
1367   */
1368  public boolean getSupportsWindowDecorations()
1369  {
1370    return true;
1371  }
1372}