001/*
002 * $Id: AbstractComponentAddon.java 4047 2011-07-19 18:51:12Z kschaefe $
003 *
004 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
005 * Santa Clara, California 95054, U.S.A. All rights reserved.
006 *
007 * This library is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 * 
012 * This library is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
015 * Lesser General Public License for more details.
016 * 
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this library; if not, write to the Free Software
019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
020 */
021package org.jdesktop.swingx.plaf;
022
023import javax.swing.UIManager;
024
025import org.jdesktop.swingx.plaf.linux.LinuxLookAndFeelAddons;
026import org.jdesktop.swingx.plaf.macosx.MacOSXLookAndFeelAddons;
027import org.jdesktop.swingx.plaf.metal.MetalLookAndFeelAddons;
028import org.jdesktop.swingx.plaf.motif.MotifLookAndFeelAddons;
029import org.jdesktop.swingx.plaf.nimbus.NimbusLookAndFeelAddons;
030import org.jdesktop.swingx.plaf.windows.WindowsLookAndFeelAddons;
031
032/**
033 * Ease the work of creating an addon for a component.<br>
034 * 
035 * @author <a href="mailto:fred@L2FProd.com">Frederic Lavigne</a>
036 * @author Karl Schaefer
037 */
038@SuppressWarnings("nls")
039public abstract class AbstractComponentAddon implements ComponentAddon {
040
041    private String name;
042
043    protected AbstractComponentAddon(String name) {
044        this.name = name;
045    }
046
047    @Override
048    public final String getName() {
049        return name;
050    }
051
052    @Override
053    public void initialize(LookAndFeelAddons addon) {
054        addon.loadDefaults(getDefaults(addon));
055    }
056
057    @Override
058    public void uninitialize(LookAndFeelAddons addon) {
059        // commented after Issue 446. Maybe addon should keep track of its
060        // added defaults to correctly remove them on uninitialize
061        // addon.unloadDefaults(getDefaults(addon));
062    }
063
064    /**
065     * Adds default key/value pairs to the given list.
066     * 
067     * @param addon
068     * @param defaults
069     */
070    protected void addBasicDefaults(LookAndFeelAddons addon,
071            DefaultsList defaults) {
072    }
073
074    /**
075     * Default implementation calls
076     * {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)}
077     * 
078     * @param addon
079     * @param defaults
080     */
081    protected void addMacDefaults(LookAndFeelAddons addon, DefaultsList defaults) {
082        addBasicDefaults(addon, defaults);
083    }
084
085    /**
086     * Default implementation calls
087     * {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)}
088     * 
089     * @param addon
090     * @param defaults
091     */
092    protected void addMetalDefaults(LookAndFeelAddons addon,
093            DefaultsList defaults) {
094        addBasicDefaults(addon, defaults);
095    }
096
097    /**
098     * Default implementation calls
099     * {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)}
100     * 
101     * @param addon
102     * @param defaults
103     */
104    protected void addMotifDefaults(LookAndFeelAddons addon,
105            DefaultsList defaults) {
106        addBasicDefaults(addon, defaults);
107    }
108
109    /**
110     * Default implementation calls
111     * {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)}
112     * 
113     * @param addon
114     * @param defaults
115     */
116    protected void addWindowsDefaults(LookAndFeelAddons addon,
117            DefaultsList defaults) {
118        addBasicDefaults(addon, defaults);
119    }
120
121    /**
122     * Default implementation calls
123     * {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)}
124     * 
125     * @param addon
126     * @param defaults
127     */
128    protected void addLinuxDefaults(LookAndFeelAddons addon,
129            DefaultsList defaults) {
130        addBasicDefaults(addon, defaults);
131    }
132
133    /**
134     * Default implementation calls
135     * {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)}
136     * 
137     * @param addon
138     * @param defaults
139     */
140    protected void addNimbusDefaults(LookAndFeelAddons addon,
141            DefaultsList defaults) {
142        addBasicDefaults(addon, defaults);
143    }
144
145    /**
146     * Gets the defaults for the given addon.
147     * 
148     * Based on the addon, it calls
149     * {@link #addMacDefaults(LookAndFeelAddons, DefaultsList)} if isMac() or
150     * {@link #addMetalDefaults(LookAndFeelAddons, DefaultsList)} if isMetal()
151     * or {@link #addMotifDefaults(LookAndFeelAddons, DefaultsList)} if
152     * isMotif() or {@link #addWindowsDefaults(LookAndFeelAddons, DefaultsList)}
153     * if isWindows() or
154     * {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)} if none of the
155     * above was called.
156     * 
157     * @param addon
158     * @return an array of key/value pairs. For example:
159     * 
160     *         <pre>
161     * Object[] uiDefaults = { &quot;Font&quot;, new Font(&quot;Dialog&quot;, Font.BOLD, 12), &quot;Color&quot;,
162     *         Color.red, &quot;five&quot;, new Integer(5) };
163     * </pre>
164     */
165    private Object[] getDefaults(LookAndFeelAddons addon) {
166        DefaultsList defaults = new DefaultsList();
167        if (isWindows(addon)) {
168            addWindowsDefaults(addon, defaults);
169        } else if (isMetal(addon)) {
170            addMetalDefaults(addon, defaults);
171        } else if (isMac(addon)) {
172            addMacDefaults(addon, defaults);
173        } else if (isMotif(addon)) {
174            addMotifDefaults(addon, defaults);
175            // PENDING JW: the separation line here looks fishy
176            // what about Nimbus on Linux systems?
177        } else if (isLinux(addon)) {
178            addLinuxDefaults(addon, defaults);
179        } else if (isNimbus(addon)) {
180            addNimbusDefaults(addon, defaults);
181        } else {
182            // at least add basic defaults
183            addBasicDefaults(addon, defaults);
184        }
185        return defaults.toArray();
186    }
187
188    //
189    // Helper methods to make ComponentAddon developer life easier
190    //
191
192    /**
193     * @return true if the addon is the Windows addon or its subclasses
194     */
195    protected boolean isWindows(LookAndFeelAddons addon) {
196        return addon instanceof WindowsLookAndFeelAddons;
197    }
198
199    /**
200     * @return true if the addon is the Metal addon or its subclasses
201     */
202    protected boolean isMetal(LookAndFeelAddons addon) {
203        return addon instanceof MetalLookAndFeelAddons;
204    }
205
206    /**
207     * @return true if the addon is the Mac OS X addon or its subclasses
208     */
209    protected boolean isMac(LookAndFeelAddons addon) {
210        return addon instanceof MacOSXLookAndFeelAddons;
211    }
212
213    /**
214     * @return true if the addon is the Motif addon or its subclasses
215     */
216    protected boolean isMotif(LookAndFeelAddons addon) {
217        return addon instanceof MotifLookAndFeelAddons;
218    }
219
220    /**
221     * @return true if the current look and feel is Linux
222     */
223    protected boolean isLinux(LookAndFeelAddons addon) {
224        return addon instanceof LinuxLookAndFeelAddons;
225    }
226
227    /**
228     * @return true if the current look and feel is Nimbus
229     */
230    protected boolean isNimbus(LookAndFeelAddons addon) {
231        return addon instanceof NimbusLookAndFeelAddons;
232    }
233
234    /**
235     * @return true if the current look and feel is one of JGoodies Plastic l&fs
236     */
237    protected boolean isPlastic() {
238        return UIManager.getLookAndFeel().getClass().getName()
239                .contains("Plastic");
240    }
241
242    /**
243     * @return true if the current look and feel is Synth l&f
244     */
245    protected boolean isSynth() {
246        return UIManager.getLookAndFeel().getClass().getName().contains("ynth");
247    }
248
249}