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 = { "Font", new Font("Dialog", Font.BOLD, 12), "Color", 162 * Color.red, "five", 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}