1 /*
2  * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package javax.swing.plaf.metal;
27 
28 import javax.swing.plaf.*;
29 import javax.swing.*;
30 
31 /**
32  * {@code MetalTheme} provides the color palette and fonts used by
33  * the Java Look and Feel.
34  * <p>
35  * {@code MetalTheme} is abstract, see {@code DefaultMetalTheme} and
36  * {@code OceanTheme} for concrete implementations.
37  * <p>
38  * {@code MetalLookAndFeel} maintains the current theme that the
39  * the {@code ComponentUI} implementations for metal use. Refer to
40  * {@link MetalLookAndFeel#setCurrentTheme
41  * MetalLookAndFeel.setCurrentTheme(MetalTheme)} for details on changing
42  * the current theme.
43  * <p>
44  * {@code MetalTheme} provides a number of public methods for getting
45  * colors. These methods are implemented in terms of a
46  * handful of protected abstract methods. A subclass need only override
47  * the protected abstract methods ({@code getPrimary1},
48  * {@code getPrimary2}, {@code getPrimary3}, {@code getSecondary1},
49  * {@code getSecondary2}, and {@code getSecondary3}); although a subclass
50  * may override the other public methods for more control over the set of
51  * colors that are used.
52  * <p>
53  * Concrete implementations of {@code MetalTheme} must return {@code non-null}
54  * values from all methods. While the behavior of returning {@code null} is
55  * not specified, returning {@code null} will result in incorrect behavior.
56  * <p>
57  * It is strongly recommended that subclasses return completely opaque colors.
58  * To do otherwise may result in rendering problems, such as visual garbage.
59  *
60  * @see DefaultMetalTheme
61  * @see OceanTheme
62  * @see MetalLookAndFeel#setCurrentTheme
63  *
64  * @author Steve Wilson
65  */
66 public abstract class MetalTheme {
67 
68     // Contants identifying the various Fonts that are Theme can support
69     static final int CONTROL_TEXT_FONT = 0;
70     static final int SYSTEM_TEXT_FONT = 1;
71     static final int USER_TEXT_FONT = 2;
72     static final int MENU_TEXT_FONT = 3;
73     static final int WINDOW_TITLE_FONT = 4;
74     static final int SUB_TEXT_FONT = 5;
75 
76     static ColorUIResource white = new ColorUIResource( 255, 255, 255 );
77     private static ColorUIResource black = new ColorUIResource( 0, 0, 0 );
78 
79     /**
80      * Returns the name of this theme.
81      *
82      * @return the name of this theme
83      */
getName()84     public abstract String getName();
85 
86     /**
87      * Returns the primary 1 color.
88      *
89      * @return the primary 1 color
90      */
getPrimary1()91     protected abstract ColorUIResource getPrimary1();  // these are blue in Metal Default Theme
92 
93     /**
94      * Returns the primary 2 color.
95      *
96      * @return the primary 2 color
97      */
getPrimary2()98     protected abstract ColorUIResource getPrimary2();
99 
100     /**
101      * Returns the primary 3 color.
102      *
103      * @return the primary 3 color
104      */
getPrimary3()105     protected abstract ColorUIResource getPrimary3();
106 
107     /**
108      * Returns the secondary 1 color.
109      *
110      * @return the secondary 1 color
111      */
getSecondary1()112     protected abstract ColorUIResource getSecondary1();  // these are gray in Metal Default Theme
113 
114     /**
115      * Returns the secondary 2 color.
116      *
117      * @return the secondary 2 color
118      */
getSecondary2()119     protected abstract ColorUIResource getSecondary2();
120 
121     /**
122      * Returns the secondary 3 color.
123      *
124      * @return the secondary 3 color
125      */
getSecondary3()126     protected abstract ColorUIResource getSecondary3();
127 
128     /**
129      * Returns the control text font.
130      *
131      * @return the control text font
132      */
getControlTextFont()133     public abstract FontUIResource getControlTextFont();
134 
135     /**
136      * Returns the system text font.
137      *
138      * @return the system text font
139      */
getSystemTextFont()140     public abstract FontUIResource getSystemTextFont();
141 
142     /**
143      * Returns the user text font.
144      *
145      * @return the user text font
146      */
getUserTextFont()147     public abstract FontUIResource getUserTextFont();
148 
149     /**
150      * Returns the menu text font.
151      *
152      * @return the menu text font
153      */
getMenuTextFont()154     public abstract FontUIResource getMenuTextFont();
155 
156     /**
157      * Returns the window title font.
158      *
159      * @return the window title font
160      */
getWindowTitleFont()161     public abstract FontUIResource getWindowTitleFont();
162 
163     /**
164      * Returns the sub-text font.
165      *
166      * @return the sub-text font
167      */
getSubTextFont()168     public abstract FontUIResource getSubTextFont();
169 
170     /**
171      * Returns the white color. This returns opaque white
172      * ({@code 0xFFFFFFFF}).
173      *
174      * @return the white color
175      */
getWhite()176     protected ColorUIResource getWhite() { return white; }
177 
178     /**
179      * Returns the black color. This returns opaque black
180      * ({@code 0xFF000000}).
181      *
182      * @return the black color
183      */
getBlack()184     protected ColorUIResource getBlack() { return black; }
185 
186     /**
187      * Returns the focus color. This returns the value of
188      * {@code getPrimary2()}.
189      *
190      * @return the focus color
191      */
getFocusColor()192     public ColorUIResource getFocusColor() { return getPrimary2(); }
193 
194     /**
195      * Returns the desktop color. This returns the value of
196      * {@code getPrimary2()}.
197      *
198      * @return the desktop color
199      */
getDesktopColor()200     public  ColorUIResource getDesktopColor() { return getPrimary2(); }
201 
202     /**
203      * Returns the control color. This returns the value of
204      * {@code getSecondary3()}.
205      *
206      * @return the control color
207      */
getControl()208     public ColorUIResource getControl() { return getSecondary3(); }
209 
210     /**
211      * Returns the control shadow color. This returns
212      * the value of {@code getSecondary2()}.
213      *
214      * @return the control shadow color
215      */
getControlShadow()216     public ColorUIResource getControlShadow() { return getSecondary2(); }
217 
218     /**
219      * Returns the control dark shadow color. This returns
220      * the value of {@code getSecondary1()}.
221      *
222      * @return the control dark shadow color
223      */
getControlDarkShadow()224     public ColorUIResource getControlDarkShadow() { return getSecondary1(); }
225 
226     /**
227      * Returns the control info color. This returns
228      * the value of {@code getBlack()}.
229      *
230      * @return the control info color
231      */
getControlInfo()232     public ColorUIResource getControlInfo() { return getBlack(); }
233 
234     /**
235      * Returns the control highlight color. This returns
236      * the value of {@code getWhite()}.
237      *
238      * @return the control highlight color
239      */
getControlHighlight()240     public ColorUIResource getControlHighlight() { return getWhite(); }
241 
242     /**
243      * Returns the control disabled color. This returns
244      * the value of {@code getSecondary2()}.
245      *
246      * @return the control disabled color
247      */
getControlDisabled()248     public ColorUIResource getControlDisabled() { return getSecondary2(); }
249 
250     /**
251      * Returns the primary control color. This returns
252      * the value of {@code getPrimary3()}.
253      *
254      * @return the primary control color
255      */
getPrimaryControl()256     public ColorUIResource getPrimaryControl() { return getPrimary3(); }
257 
258     /**
259      * Returns the primary control shadow color. This returns
260      * the value of {@code getPrimary2()}.
261      *
262      * @return the primary control shadow color
263      */
getPrimaryControlShadow()264     public ColorUIResource getPrimaryControlShadow() { return getPrimary2(); }
265     /**
266      * Returns the primary control dark shadow color. This
267      * returns the value of {@code getPrimary1()}.
268      *
269      * @return the primary control dark shadow color
270      */
getPrimaryControlDarkShadow()271     public ColorUIResource getPrimaryControlDarkShadow() { return getPrimary1(); }
272 
273     /**
274      * Returns the primary control info color. This
275      * returns the value of {@code getBlack()}.
276      *
277      * @return the primary control info color
278      */
getPrimaryControlInfo()279     public ColorUIResource getPrimaryControlInfo() { return getBlack(); }
280 
281     /**
282      * Returns the primary control highlight color. This
283      * returns the value of {@code getWhite()}.
284      *
285      * @return the primary control highlight color
286      */
getPrimaryControlHighlight()287     public ColorUIResource getPrimaryControlHighlight() { return getWhite(); }
288 
289     /**
290      * Returns the system text color. This returns the value of
291      * {@code getBlack()}.
292      *
293      * @return the system text color
294      */
getSystemTextColor()295     public ColorUIResource getSystemTextColor() { return getBlack(); }
296 
297     /**
298      * Returns the control text color. This returns the value of
299      * {@code getControlInfo()}.
300      *
301      * @return the control text color
302      */
getControlTextColor()303     public ColorUIResource getControlTextColor() { return getControlInfo(); }
304 
305     /**
306      * Returns the inactive control text color. This returns the value of
307      * {@code getControlDisabled()}.
308      *
309      * @return the inactive control text color
310      */
getInactiveControlTextColor()311     public ColorUIResource getInactiveControlTextColor() { return getControlDisabled(); }
312 
313     /**
314      * Returns the inactive system text color. This returns the value of
315      * {@code getSecondary2()}.
316      *
317      * @return the inactive system text color
318      */
getInactiveSystemTextColor()319     public ColorUIResource getInactiveSystemTextColor() { return getSecondary2(); }
320 
321     /**
322      * Returns the user text color. This returns the value of
323      * {@code getBlack()}.
324      *
325      * @return the user text color
326      */
getUserTextColor()327     public ColorUIResource getUserTextColor() { return getBlack(); }
328 
329     /**
330      * Returns the text highlight color. This returns the value of
331      * {@code getPrimary3()}.
332      *
333      * @return the text highlight color
334      */
getTextHighlightColor()335     public ColorUIResource getTextHighlightColor() { return getPrimary3(); }
336 
337     /**
338      * Returns the highlighted text color. This returns the value of
339      * {@code getControlTextColor()}.
340      *
341      * @return the highlighted text color
342      */
getHighlightedTextColor()343     public ColorUIResource getHighlightedTextColor() { return getControlTextColor(); }
344 
345     /**
346      * Returns the window background color. This returns the value of
347      * {@code getWhite()}.
348      *
349      * @return the window background color
350      */
getWindowBackground()351     public ColorUIResource getWindowBackground() { return getWhite(); }
352 
353     /**
354      * Returns the window title background color. This returns the value of
355      * {@code getPrimary3()}.
356      *
357      * @return the window title background color
358      */
getWindowTitleBackground()359     public ColorUIResource getWindowTitleBackground() { return getPrimary3(); }
360 
361     /**
362      * Returns the window title foreground color. This returns the value of
363      * {@code getBlack()}.
364      *
365      * @return the window title foreground color
366      */
getWindowTitleForeground()367     public ColorUIResource getWindowTitleForeground() { return getBlack(); }
368 
369     /**
370      * Returns the window title inactive background color. This
371      * returns the value of {@code getSecondary3()}.
372      *
373      * @return the window title inactive background color
374      */
getWindowTitleInactiveBackground()375     public ColorUIResource getWindowTitleInactiveBackground() { return getSecondary3(); }
376 
377     /**
378      * Returns the window title inactive foreground color. This
379      * returns the value of {@code getBlack()}.
380      *
381      * @return the window title inactive foreground color
382      */
getWindowTitleInactiveForeground()383     public ColorUIResource getWindowTitleInactiveForeground() { return getBlack(); }
384 
385     /**
386      * Returns the menu background color. This
387      * returns the value of {@code getSecondary3()}.
388      *
389      * @return the menu background color
390      */
getMenuBackground()391     public ColorUIResource getMenuBackground() { return getSecondary3(); }
392 
393     /**
394      * Returns the menu foreground color. This
395      * returns the value of {@code getBlack()}.
396      *
397      * @return the menu foreground color
398      */
getMenuForeground()399     public ColorUIResource getMenuForeground() { return  getBlack(); }
400 
401     /**
402      * Returns the menu selected background color. This
403      * returns the value of {@code getPrimary2()}.
404      *
405      * @return the menu selected background color
406      */
getMenuSelectedBackground()407     public ColorUIResource getMenuSelectedBackground() { return getPrimary2(); }
408 
409     /**
410      * Returns the menu selected foreground color. This
411      * returns the value of {@code getBlack()}.
412      *
413      * @return the menu selected foreground color
414      */
getMenuSelectedForeground()415     public ColorUIResource getMenuSelectedForeground() { return getBlack(); }
416 
417     /**
418      * Returns the menu disabled foreground color. This
419      * returns the value of {@code getSecondary2()}.
420      *
421      * @return the menu disabled foreground color
422      */
getMenuDisabledForeground()423     public ColorUIResource getMenuDisabledForeground() { return getSecondary2(); }
424 
425     /**
426      * Returns the separator background color. This
427      * returns the value of {@code getWhite()}.
428      *
429      * @return the separator background color
430      */
getSeparatorBackground()431     public ColorUIResource getSeparatorBackground() { return getWhite(); }
432 
433     /**
434      * Returns the separator foreground color. This
435      * returns the value of {@code getPrimary1()}.
436      *
437      * @return the separator foreground color
438      */
getSeparatorForeground()439     public ColorUIResource getSeparatorForeground() { return getPrimary1(); }
440 
441     /**
442      * Returns the accelerator foreground color. This
443      * returns the value of {@code getPrimary1()}.
444      *
445      * @return the accelerator foreground color
446      */
getAcceleratorForeground()447     public ColorUIResource getAcceleratorForeground() { return getPrimary1(); }
448 
449     /**
450      * Returns the accelerator selected foreground color. This
451      * returns the value of {@code getBlack()}.
452      *
453      * @return the accelerator selected foreground color
454      */
getAcceleratorSelectedForeground()455     public ColorUIResource getAcceleratorSelectedForeground() { return getBlack(); }
456 
457     /**
458      * Adds values specific to this theme to the defaults table. This method
459      * is invoked when the look and feel defaults are obtained from
460      * {@code MetalLookAndFeel}.
461      * <p>
462      * This implementation does nothing; it is provided for subclasses
463      * that wish to customize the defaults table.
464      *
465      * @param table the {@code UIDefaults} to add the values to
466      *
467      * @see MetalLookAndFeel#getDefaults
468      */
addCustomEntriesToTable(UIDefaults table)469     public void addCustomEntriesToTable(UIDefaults table) {}
470 
471     /**
472      * This is invoked when a MetalLookAndFeel is installed and about to
473      * start using this theme. When we can add API this should be nuked
474      * in favor of DefaultMetalTheme overriding addCustomEntriesToTable.
475      */
install()476     void install() {
477     }
478 
479     /**
480      * Returns true if this is a theme provided by the core platform.
481      */
isSystemTheme()482     boolean isSystemTheme() {
483         return false;
484     }
485 }
486