001/* DefaultMetalTheme.java --
002   Copyright (C) 2004, 2005 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.Font;
044
045import javax.swing.UIManager;
046import javax.swing.plaf.ColorUIResource;
047import javax.swing.plaf.FontUIResource;
048
049/**
050 * The default theme for the {@link MetalLookAndFeel}.
051 * 
052 * @see MetalLookAndFeel#setCurrentTheme(MetalTheme)
053 */
054public class DefaultMetalTheme extends MetalTheme
055{
056  private static final ColorUIResource PRIMARY1 =
057    new ColorUIResource(102, 102, 153);
058  private static final ColorUIResource PRIMARY2 =
059    new ColorUIResource(153, 153, 204);
060  private static final ColorUIResource PRIMARY3 = 
061    new ColorUIResource(204, 204, 255);
062  private static final ColorUIResource SECONDARY1 = 
063    new ColorUIResource(102, 102, 102);
064  private static final ColorUIResource SECONDARY2 = 
065    new ColorUIResource(153, 153, 153);
066  private static final ColorUIResource SECONDARY3 = 
067    new ColorUIResource(204, 204, 204);
068  
069  private static final FontUIResource SUB_TEXT_FONT =
070    new FontUIResource("Dialog", Font.PLAIN, 10);
071  private static final FontUIResource SYSTEM_TEXT_FONT =
072    new FontUIResource("Dialog", Font.PLAIN, 12);
073  private static final FontUIResource USER_TEXT_FONT =
074    new FontUIResource("Dialog", Font.PLAIN, 12);
075  private static final FontUIResource WINDOW_TITLE_FONT =
076    new FontUIResource("Dialog", Font.BOLD, 12);
077  
078  /**
079   * The control text font for swing.boldMetal=false.
080   */
081  private static final FontUIResource PLAIN_CONTROL_TEXT_FONT =
082    new FontUIResource("Dialog", Font.PLAIN, 12);
083
084  /**
085   * The standard control text font.
086   */
087  private static final FontUIResource BOLD_CONTROL_TEXT_FONT =
088    new FontUIResource("Dialog", Font.BOLD, 12);
089
090  /**
091   * The menu text font for swing.boldMetal=false.
092   */
093  private static final FontUIResource PLAIN_MENU_TEXT_FONT =
094    new FontUIResource("Dialog", Font.PLAIN, 12);
095
096  /**
097   * The menu control text font.
098   */
099  private static final FontUIResource BOLD_MENU_TEXT_FONT =
100    new FontUIResource("Dialog", Font.BOLD, 12);
101
102  /**
103   * Indicates the control text font.
104   */
105  static final int CONTROL_TEXT_FONT = 1;
106
107  /**
108   * Indicates the menu text font.
109   */
110  static final int MENU_TEXT_FONT = 2;
111  
112  /**
113   * Creates a new instance of this theme.
114   */
115  public DefaultMetalTheme()
116  {
117    // Do nothing here.
118  }
119
120  /**
121   * Returns the name of the theme.
122   * 
123   * @return <code>"Steel"</code>.
124   */
125  public String getName()
126  {
127    return "Steel";
128  }
129
130  /**
131   * Returns the first primary color for this theme.
132   * 
133   * @return The first primary color.
134   */
135  protected ColorUIResource getPrimary1()
136  {
137    return PRIMARY1;
138  }
139
140  /**
141   * Returns the second primary color for this theme.
142   * 
143   * @return The second primary color.
144   */
145  protected ColorUIResource getPrimary2()
146  {
147    return PRIMARY2;
148  }
149
150  /**
151   * Returns the third primary color for this theme.
152   * 
153   * @return The third primary color.
154   */
155  protected ColorUIResource getPrimary3()
156  {
157    return PRIMARY3;
158  }
159
160  /**
161   * Returns the first secondary color for this theme.
162   * 
163   * @return The first secondary color.
164   */
165  protected ColorUIResource getSecondary1()
166  {
167    return SECONDARY1;
168  }
169
170  /**
171   * Returns the second secondary color for this theme.
172   * 
173   * @return The second secondary color.
174   */
175  protected ColorUIResource getSecondary2()
176  {
177    return SECONDARY2;
178  }
179
180  /**
181   * Returns the third secondary color for this theme.
182   * 
183   * @return The third secondary color.
184   */
185  protected ColorUIResource getSecondary3()
186  {
187    return SECONDARY3;
188  }
189
190  /**
191   * Returns the font used for text on controls.  In this case, the font is
192   * <code>FontUIResource("Dialog", Font.BOLD, 12)</code>, unless the
193   * <code>swing.boldMetal</code> UI default is set to {@link Boolean#FALSE} 
194   * in which case it is <code>FontUIResource("Dialog", Font.PLAIN, 12)</code>.
195   * 
196   * @return The font.
197   */
198  public FontUIResource getControlTextFont()
199  {
200    return getFont(CONTROL_TEXT_FONT);
201  }
202  
203  /**
204   * Returns the font used for text in menus.  In this case, the font is
205   * <code>FontUIResource("Dialog", Font.BOLD, 12)</code>, unless the
206   * <code>swing.boldMetal</code> UI default is set to {@link Boolean#FALSE} 
207   * in which case it is <code>FontUIResource("Dialog", Font.PLAIN, 12)</code>.
208   * 
209   * @return The font used for text in menus.
210   */
211  public FontUIResource getMenuTextFont()
212  {
213    return getFont(MENU_TEXT_FONT);
214  }
215  
216  /**
217   * Returns the font used for sub text.  In this case, the font is
218   * <code>FontUIResource("Dialog", Font.PLAIN, 10)</code>.
219   * 
220   * @return The font used for sub text.
221   */
222  public FontUIResource getSubTextFont()
223  {
224    return SUB_TEXT_FONT;
225  }
226  
227  /**
228   * Returns the font used for system text.  In this case, the font is
229   * <code>FontUIResource("Dialog", Font.PLAIN, 12)</code>.
230   * 
231   * @return The font used for system text.
232   */
233  public FontUIResource getSystemTextFont()
234  {
235    return SYSTEM_TEXT_FONT;
236  }
237  
238  /**
239   * Returns the font used for user text.  In this case, the font is
240   * <code>FontUIResource("Dialog", Font.PLAIN, 12)</code>.
241   * 
242   * @return The font used for user text. 
243   */
244  public FontUIResource getUserTextFont()
245  {
246    return USER_TEXT_FONT;
247  }
248  
249  /**
250   * Returns the font used for window titles.  In this case, the font is 
251   * <code>FontUIResource("Dialog", Font.BOLD, 12)</code>.
252   * 
253   * @return The font used for window titles.
254   */
255  public FontUIResource getWindowTitleFont()
256  {
257    return WINDOW_TITLE_FONT;
258  }
259
260  /**
261   * Returns the appropriate font. The font type to return is identified
262   * by the specified id.
263   *
264   * @param id the font type to return
265   *
266   * @return the correct font
267   */
268  private FontUIResource getFont(int id)
269  {
270    FontUIResource font = null;
271    switch (id)
272      {
273      case CONTROL_TEXT_FONT:
274        if (isBoldMetal())
275          font = BOLD_CONTROL_TEXT_FONT;
276        else
277          font = PLAIN_CONTROL_TEXT_FONT;
278        break;
279      case MENU_TEXT_FONT:
280        if (isBoldMetal())
281          font = BOLD_MENU_TEXT_FONT;
282        else
283          font = PLAIN_MENU_TEXT_FONT;
284      break;
285      // TODO: Add other font types and their mapping here.
286      }
287    return font;
288  }
289
290  /**
291   * Determines if the theme should be bold or not. The theme is bold by
292   * default, this can be turned off by setting the system property
293   * swing.boldMetal to true, or by putting the property with the same name
294   * into the current UIManager's defaults.
295   *
296   * @return <code>true</code>, when the theme is bold, <code>false</code>
297   *         otherwise
298   */
299  private boolean isBoldMetal()
300  {
301    Object boldMetal = UIManager.get("swing.boldMetal");
302    return (boldMetal == null || ! Boolean.FALSE.equals(boldMetal))
303        && ! ("false".equals(SystemProperties.getProperty("swing.boldMetal")));
304  }
305}