001    /*
002     * $Id: AbstractComponentAddon.java 3002 2008-07-31 01:20:24Z 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     */
021    package org.jdesktop.swingx.plaf;
022    
023    import javax.swing.UIManager;
024    
025    import org.jdesktop.swingx.plaf.linux.LinuxLookAndFeelAddons;
026    import org.jdesktop.swingx.plaf.macosx.MacOSXLookAndFeelAddons;
027    import org.jdesktop.swingx.plaf.metal.MetalLookAndFeelAddons;
028    import org.jdesktop.swingx.plaf.motif.MotifLookAndFeelAddons;
029    import org.jdesktop.swingx.plaf.nimbus.NimbusLookAndFeelAddons;
030    import 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    public abstract class AbstractComponentAddon implements ComponentAddon {
039    
040      private String name;
041    
042      protected AbstractComponentAddon(String name) {
043        this.name = name;
044      }
045    
046      public final String getName() {
047        return name;
048      }
049    
050      public void initialize(LookAndFeelAddons addon) {
051        addon.loadDefaults(getDefaults(addon));
052      }
053    
054      public void uninitialize(LookAndFeelAddons addon) {
055        // commented after Issue 446. Maybe addon should keep track of its
056        // added defaults to correctly remove them on uninitialize
057        // addon.unloadDefaults(getDefaults(addon));
058      }
059    
060      /**
061       * Adds default key/value pairs to the given list.
062       * 
063       * @param addon
064       * @param defaults
065       */
066      protected void addBasicDefaults(LookAndFeelAddons addon, DefaultsList defaults) {
067      }
068      
069      /**
070       * Default implementation calls {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)}
071       * 
072       * @param addon
073       * @param defaults
074       */
075      protected void addMacDefaults(LookAndFeelAddons addon, DefaultsList defaults) {
076        addBasicDefaults(addon, defaults);
077      }
078      
079      /**
080       * Default implementation calls {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)}
081       * 
082       * @param addon
083       * @param defaults
084       */
085      protected void addMetalDefaults(LookAndFeelAddons addon, DefaultsList defaults) {
086        addBasicDefaults(addon, defaults);
087      }
088      
089      /**
090       * Default implementation calls {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)}
091       * 
092       * @param addon
093       * @param defaults
094       */
095      protected void addMotifDefaults(LookAndFeelAddons addon, DefaultsList defaults) {
096        addBasicDefaults(addon, defaults);
097      }
098      
099      /**
100       * Default implementation calls {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)}
101       * 
102       * @param addon
103       * @param defaults
104       */
105      protected void addWindowsDefaults(LookAndFeelAddons addon, DefaultsList defaults) {
106        addBasicDefaults(addon, defaults);
107      }
108    
109      /**
110       * Default implementation calls {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)}
111       * 
112       * @param addon
113       * @param defaults
114       */
115       protected void addLinuxDefaults(LookAndFeelAddons addon, DefaultsList defaults) {
116         addBasicDefaults(addon, defaults);
117       }
118       
119      /**
120       * Default implementation calls {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)}
121       * 
122       * @param addon
123       * @param defaults
124       */
125       protected void addNimbusDefaults(LookAndFeelAddons addon, DefaultsList defaults) {
126         addBasicDefaults(addon, defaults);
127       }
128       
129      /**
130       * Gets the defaults for the given addon.
131       * 
132       * Based on the addon, it calls
133       * {@link #addMacDefaults(LookAndFeelAddons, DefaultsList)} if isMac()
134       * or
135       * {@link #addMetalDefaults(LookAndFeelAddons, DefaultsList)} if isMetal()
136       * or
137       * {@link #addMotifDefaults(LookAndFeelAddons, DefaultsList)} if isMotif()
138       * or
139       * {@link #addWindowsDefaults(LookAndFeelAddons, DefaultsList)} if isWindows()
140       * or
141       * {@link #addBasicDefaults(LookAndFeelAddons, DefaultsList)} if none of the above was called.
142       * @param addon
143       * @return an array of key/value pairs. For example:
144       * <pre>
145       * Object[] uiDefaults = {
146       *   "Font", new Font("Dialog", Font.BOLD, 12),
147       *   "Color", Color.red,
148       *   "five", new Integer(5)
149       * };
150       * </pre>
151       */
152      private Object[] getDefaults(LookAndFeelAddons addon) {
153        DefaultsList defaults = new DefaultsList();
154        if (isWindows(addon)) {
155          addWindowsDefaults(addon, defaults);
156        } else if (isMetal(addon)) {
157          addMetalDefaults(addon, defaults);
158        } else if (isMac(addon)) {
159          addMacDefaults(addon, defaults);
160        } else if (isMotif(addon)) {
161          addMotifDefaults(addon, defaults);
162        } else if (isLinux(addon)) {
163          addLinuxDefaults(addon, defaults);
164        } else if (isNimbus(addon)) {
165          addNimbusDefaults(addon, defaults);
166        } else {
167          // at least add basic defaults
168          addBasicDefaults(addon, defaults);
169        }
170        return defaults.toArray();
171      }
172      
173      //
174      // Helper methods to make ComponentAddon developer life easier
175      //
176    
177      /**
178       * @return true if the addon is the Windows addon or its subclasses
179       */
180      protected boolean isWindows(LookAndFeelAddons addon) {
181        return addon instanceof WindowsLookAndFeelAddons;
182      }
183    
184      /**
185       * @return true if the addon is the Metal addon or its subclasses
186       */
187      protected boolean isMetal(LookAndFeelAddons addon) {
188        return addon instanceof MetalLookAndFeelAddons;
189      }
190    
191      /**
192       * @return true if the addon is the Mac OS X addon or its subclasses
193       */
194      protected boolean isMac(LookAndFeelAddons addon) {
195        return addon instanceof MacOSXLookAndFeelAddons;
196      }
197    
198      /**
199       * @return true if the addon is the Motif addon or its subclasses
200       */
201      protected boolean isMotif(LookAndFeelAddons addon) {
202        return addon instanceof MotifLookAndFeelAddons;
203      }
204    
205      /**
206       * @return true if the current look and feel is Linux
207       */
208      protected boolean isLinux(LookAndFeelAddons addon) {
209          return addon instanceof LinuxLookAndFeelAddons;
210      }
211      
212      /**
213       * @return true if the current look and feel is Nimbus
214       */
215      protected boolean isNimbus(LookAndFeelAddons addon) {
216          return addon instanceof NimbusLookAndFeelAddons;
217      }
218      
219      /**
220       * @return true if the current look and feel is one of JGoodies Plastic l&fs
221       */
222      protected boolean isPlastic() {
223        return UIManager.getLookAndFeel().getClass().getName().contains("Plastic");
224      }
225    
226      /**
227       * @return true if the current look and feel is Synth l&f
228       */
229      protected boolean isSynth() {
230        return UIManager.getLookAndFeel().getClass().getName().contains("ynth");
231      }
232    
233    }