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 }