Revision: 5889
http://squirrel-sql.svn.sourceforge.net/squirrel-sql/?rev=5889&view=rev
Author: manningr
Date: 2010-09-18 19:23:27 +0000 (Sat, 18 Sep 2010)
Log Message:
-----------
Substance look and feel controller now uses the LAFPlugin classloader to find substance classes, rather than relying on the substance classes being in the main classpath of SQuirreL.
Modified Paths:
--------------
trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/LAFRegister.java
trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLafData.java
trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLookAndFeelController.java
Added Paths:
-----------
trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLafPlaceholder.java
Removed Paths:
-------------
trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLookAndFeel.java
Modified: trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/LAFRegister.java
===================================================================
--- trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/LAFRegister.java 2010-09-18 18:36:54 UTC (rev 5888)
+++ trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/LAFRegister.java 2010-09-18 19:23:27 UTC (rev 5889)
@@ -410,8 +410,8 @@
}
try
{
- _lafControllers.put(SubstanceLookAndFeelController.SUBSTANCE_CLASS_NAME,
- new SubstanceLookAndFeelController(plugin));
+ _lafControllers.put(SubstanceLookAndFeelController.SUBSTANCE_LAF_DEFAULT_CLASS_NAME,
+ new SubstanceLookAndFeelController(plugin, this));
}
catch (Throwable ex)
{
Modified: trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLafData.java
===================================================================
--- trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLafData.java 2010-09-18 18:36:54 UTC (rev 5888)
+++ trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLafData.java 2010-09-18 19:23:27 UTC (rev 5889)
@@ -26,87 +26,70 @@
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
-import org.jvnet.substance.api.SubstanceSkin;
-import org.jvnet.substance.skin.AutumnSkin;
-import org.jvnet.substance.skin.BusinessBlackSteelSkin;
-import org.jvnet.substance.skin.BusinessBlueSteelSkin;
-import org.jvnet.substance.skin.BusinessSkin;
-import org.jvnet.substance.skin.ChallengerDeepSkin;
-import org.jvnet.substance.skin.CremeCoffeeSkin;
-import org.jvnet.substance.skin.CremeSkin;
-import org.jvnet.substance.skin.DustCoffeeSkin;
-import org.jvnet.substance.skin.DustSkin;
-import org.jvnet.substance.skin.EmeraldDuskSkin;
-import org.jvnet.substance.skin.MagmaSkin;
-import org.jvnet.substance.skin.MistAquaSkin;
-import org.jvnet.substance.skin.MistSilverSkin;
-import org.jvnet.substance.skin.ModerateSkin;
-import org.jvnet.substance.skin.NebulaBrickWallSkin;
-import org.jvnet.substance.skin.NebulaSkin;
-import org.jvnet.substance.skin.OfficeBlue2007Skin;
-import org.jvnet.substance.skin.OfficeSilver2007Skin;
-import org.jvnet.substance.skin.RavenGraphiteGlassSkin;
-import org.jvnet.substance.skin.RavenGraphiteSkin;
-import org.jvnet.substance.skin.RavenSkin;
-import org.jvnet.substance.skin.SaharaSkin;
-import org.jvnet.substance.skin.TwilightSkin;
-
public class SubstanceLafData
{
/** Logger for this class. */
private static ILogger s_log = LoggerController.createLogger(SubstanceLafData.class);
- private HashMap<String, SubstanceSkin> lafMap = new HashMap<String, SubstanceSkin>();
+ private HashMap<String, Class<?>> lafMap = new HashMap<String, Class<?>>();
- public SubstanceLafData()
+ private ClassLoader cl = null;
+
+ public SubstanceLafData(ClassLoader cl)
{
+ this.cl = cl;
initLafMap();
}
private void initLafMap()
{
- lafMap.put(AutumnSkin.NAME, new AutumnSkin());
- lafMap.put(BusinessBlackSteelSkin.NAME, new BusinessBlackSteelSkin());
- lafMap.put(BusinessBlueSteelSkin.NAME, new BusinessBlueSteelSkin());
- lafMap.put(BusinessSkin.NAME, new BusinessSkin());
- lafMap.put(ChallengerDeepSkin.NAME, new ChallengerDeepSkin());
- lafMap.put(CremeCoffeeSkin.NAME, new CremeCoffeeSkin());
- lafMap.put(CremeSkin.NAME, new CremeSkin());
- lafMap.put(DustCoffeeSkin.NAME, new DustCoffeeSkin());
- lafMap.put(DustSkin.NAME, new DustSkin());
- lafMap.put(EmeraldDuskSkin.NAME, new EmeraldDuskSkin());
- lafMap.put(MagmaSkin.NAME, new MagmaSkin());
- lafMap.put(MistAquaSkin.NAME, new MistAquaSkin());
- lafMap.put(MistSilverSkin.NAME, new MistSilverSkin());
- lafMap.put(ModerateSkin.NAME, new ModerateSkin());
- lafMap.put(NebulaBrickWallSkin.NAME, new NebulaBrickWallSkin());
- lafMap.put(NebulaSkin.NAME, new NebulaSkin());
- lafMap.put(OfficeBlue2007Skin.NAME, new OfficeBlue2007Skin());
- lafMap.put(OfficeSilver2007Skin.NAME, new OfficeSilver2007Skin());
- lafMap.put(RavenGraphiteGlassSkin.NAME, new RavenGraphiteGlassSkin());
- lafMap.put(RavenGraphiteSkin.NAME, new RavenGraphiteSkin());
- lafMap.put(RavenSkin.NAME, new RavenSkin());
- lafMap.put(SaharaSkin.NAME, new SaharaSkin());
- lafMap.put(TwilightSkin.NAME, new TwilightSkin());
+ putClass("Autumn", "org.jvnet.substance.skin.AutumnSkin");
+ putClass("BusinessBlackSteel", "org.jvnet.substance.skin.BusinessBlackSteelSkin");
+ putClass("BusinessBlueSteelSkin", "org.jvnet.substance.skin.BusinessBlueSteelSkin");
+ putClass("BusinessSkin", "org.jvnet.substance.skin.BusinessSkin");
+ putClass("ChallengerDeepSkin", "org.jvnet.substance.skin.ChallengerDeepSkin");
+ putClass("CremeCoffeeSkin", "org.jvnet.substance.skin.CremeCoffeeSkin");
+ putClass("CremeSkin", "org.jvnet.substance.skin.CremeSkin");
+ putClass("DustCoffeeSkin", "org.jvnet.substance.skin.DustCoffeeSkin");
+ putClass("DustSkin", "org.jvnet.substance.skin.DustSkin");
+ putClass("EmeraldDuskSkin", "org.jvnet.substance.skin.EmeraldDuskSkin");
+ putClass("MagmaSkin", "org.jvnet.substance.skin.MagmaSkin");
+ putClass("MistAquaSkin", "org.jvnet.substance.skin.MistAquaSkin");
+ putClass("MistSilverSkin", "org.jvnet.substance.skin.MistSilverSkin");
+ putClass("ModerateSkin", "org.jvnet.substance.skin.ModerateSkin");
+ putClass("NebulaBrickWallSkin", "org.jvnet.substance.skin.NebulaBrickWallSkin");
+ putClass("NebulaSkin", "org.jvnet.substance.skin.NebulaSkin");
+ putClass("OfficeBlue2007Skin", "org.jvnet.substance.skin.OfficeBlue2007Skin");
+ putClass("OfficeSilver2007Skin", "org.jvnet.substance.skin.OfficeSilver2007Skin");
+ putClass("RavenGraphiteGlassSkin", "org.jvnet.substance.skin.RavenGraphiteGlassSkin");
+ putClass("RavenGraphiteSkin", "org.jvnet.substance.skin.RavenGraphiteSkin");
+ putClass("RavenSkin", "org.jvnet.substance.skin.RavenSkin");
+ putClass("SaharaSkin", "org.jvnet.substance.skin.SaharaSkin");
+ putClass("TwilightSkin", "org.jvnet.substance.skin.TwilightSkin");
}
- public SubstanceSkin getSkinForName(String skinName)
- {
- SubstanceSkin skin = (SubstanceSkin) lafMap.get(skinName);
- if (skin == null) {
- if (s_log.isInfoEnabled()) {
- s_log.info("Unable to locate Skin class for skinName ("+skinName+"). Using Autumn instead.");
- }
- skin = new AutumnSkin();
- }
- return skin;
+ public Class<?> getSkinClassForName(String skinName) {
+ return lafMap.get(skinName);
}
-
+
public Set<String> getSubstanceSkins()
{
Set<String> result = new TreeSet<String>(lafMap.keySet());
return result;
}
+ private void putClass(String skinName, String className) {
+
+ try
+ {
+ Class<?> skinClass = Class.forName(className, true, cl);
+ lafMap.put(skinName, skinClass);
+ }
+ catch (ClassNotFoundException e)
+ {
+ s_log.error("Unable to load LAF class ("+className+"):"+e.getMessage(), e);
+ }
+
+ }
}
Added: trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLafPlaceholder.java
===================================================================
--- trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLafPlaceholder.java (rev 0)
+++ trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLafPlaceholder.java 2010-09-18 19:23:27 UTC (rev 5889)
@@ -0,0 +1,77 @@
+package net.sourceforge.squirrel_sql.plugins.laf;
+
+/*
+ * Copyright (C) 2010 Rob Manning
+ * man...@us...
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+import javax.swing.plaf.basic.BasicLookAndFeel;
+
+/**
+ * This is simply a placeholder class that allows SQuirreL to populate the LAF chooser with the name
+ * "Substance". This is done because the Substance LAF doesn't have one skinnable LAF class that identifies
+ * itself as "Substance", but rather defines a LAF class per "skin", each LAF class identifying itself by it's
+ * skin name. Since there are many of these, they would clutter up the LAF chooser if we listed them in
+ * LAFPluginResources.properties. So, rather than display a particular Substance LAF class to the user, this
+ * LAF sub-class has a generic name of "Substance". Even though technically, the "Autumn" LAF is the only
+ * one used, it is fine, because "Autumn" will be the first skin displayed in the skin chooser, when the
+ * Substance LAF is chosen. Any change to the skin chooser will result in the Autumn LAF's setSkin method
+ * being called, transforming it into the LAF representing the chosen skin.
+ */
+public class SubstanceLafPlaceholder extends BasicLookAndFeel
+{
+
+ /**
+ * serialVersionUID
+ */
+ private static final long serialVersionUID = 1L;
+
+ protected SubstanceLafPlaceholder()
+ {
+ }
+
+ @Override
+ public String getDescription()
+ {
+ return "Substance";
+ }
+
+ @Override
+ public String getID()
+ {
+ return "Substance";
+ }
+
+ @Override
+ public String getName()
+ {
+ return "Substance";
+ }
+
+ @Override
+ public boolean isNativeLookAndFeel()
+ {
+ return true;
+ }
+
+ @Override
+ public boolean isSupportedLookAndFeel()
+ {
+ return true;
+ }
+
+}
Deleted: trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLookAndFeel.java
===================================================================
--- trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLookAndFeel.java 2010-09-18 18:36:54 UTC (rev 5888)
+++ trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLookAndFeel.java 2010-09-18 19:23:27 UTC (rev 5889)
@@ -1,47 +0,0 @@
-package net.sourceforge.squirrel_sql.plugins.laf;
-
-/*
- * Copyright (C) 2010 Rob Manning
- * man...@us...
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-import org.jvnet.substance.skin.AutumnSkin;
-
-/**
- * This is simply a placeholder class that allows SQuirreL to populate the LAF chooser with the name
- * "Substance". This is done because the Substance LAF doesn't have one skinnable LAF class, but rather
- * defines a LAF class per "skin". There are many of these and they would clutter up the LAF chooser. So,
- * rather than display a particular Substance LAF class to the user, this LAF sub-class has a generic name of
- * "Substance". Even though technically, this is the "Autumn" skin, it is fine, because "Autumn" will be the
- * first skin displayed in the skin chooser, when the Substance LAF is chosen. And change to the skin chooser
- * will result in this LAF's setSkin method being called.
- */
-public class SubstanceLookAndFeel extends org.jvnet.substance.SubstanceLookAndFeel
-{
-
- /**
- * serialVersionUID
- */
- private static final long serialVersionUID = 1L;
-
- protected SubstanceLookAndFeel()
- {
- super(new AutumnSkin());
- super.name = "Substance";
- }
-
-}
Modified: trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLookAndFeelController.java
===================================================================
--- trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLookAndFeelController.java 2010-09-18 18:36:54 UTC (rev 5888)
+++ trunk/sql12/plugins/laf/src/main/java/net/sourceforge/squirrel_sql/plugins/laf/SubstanceLookAndFeelController.java 2010-09-18 19:23:27 UTC (rev 5889)
@@ -23,6 +23,8 @@
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Set;
@@ -43,9 +45,6 @@
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
import net.sourceforge.squirrel_sql.fw.xml.XMLObjectCache;
-import org.jvnet.substance.SubstanceLookAndFeel;
-import org.jvnet.substance.api.SubstanceSkin;
-
/**
* Behaviour for the Skin Look and Feel.
*
@@ -53,31 +52,40 @@
*/
public class SubstanceLookAndFeelController extends DefaultLookAndFeelController
{
+ /** Class name of the Substance LAF class to use by default. This can be re-skinned at any time. */
+ private static final String SUBSTANCE_LOOK_AND_FEEL_CLASS =
+ "org.jvnet.substance.skin.SubstanceAutumnLookAndFeel";
+
private static final StringManager s_stringMgr =
StringManagerFactory.getStringManager(SubstanceLookAndFeelController.class);
/** Logger for this class. */
private static final ILogger s_log = LoggerController.createLogger(SubstanceLookAndFeelController.class);
- /** Class name of the Skin class. */
- public static final String SUBSTANCE_CLASS_NAME =
- "net.sourceforge.squirrel_sql.plugins.laf.SubstanceLookAndFeel";
+ /** Placeholder LAF that identifies itself as "Substance". No other LAF does this. */
+ public static final String SUBSTANCE_LAF_DEFAULT_CLASS_NAME =
+ "net.sourceforge.squirrel_sql.plugins.laf.SubstanceLafPlaceholder";
/** Preferences for this LAF. */
private SubstancePreferences _prefs;
- private SubstanceLafData _lafData = new SubstanceLafData();
+ private SubstanceLafData _lafData = null;
+ private ClassLoader _cl = null;
+
/**
* Ctor specifying the Look and Feel plugin.
*
* @param plugin
* The plugin that this controller is a part of.
*/
- SubstanceLookAndFeelController(LAFPlugin plugin) throws IOException
+ SubstanceLookAndFeelController(LAFPlugin plugin, LAFRegister register) throws IOException
{
super();
+ _cl = register.getLookAndFeelClassLoader();
+ _lafData = new SubstanceLafData(_cl);
+
XMLObjectCache cache = plugin.getSettingsCache();
Iterator<?> it = cache.getAllForClass(SubstancePreferences.class);
if (it.hasNext())
@@ -104,9 +112,6 @@
*/
public void aboutToBeInstalled(LAFRegister lafRegister, LookAndFeel laf)
{
- final String skinName = _prefs.getSkinName();
- SubstanceSkin skin = _lafData.getSkinForName(skinName);
- SubstanceLookAndFeel.setSkin(skin);
}
/**
@@ -115,8 +120,47 @@
public void hasBeenInstalled(LAFRegister lafRegister, LookAndFeel laf)
{
final String skinName = _prefs.getSkinName();
- SubstanceSkin skin = _lafData.getSkinForName(skinName);
- SubstanceLookAndFeel.setSkin(skin);
+ Class<?> skinClass = _lafData.getSkinClassForName(skinName);
+ Object skinObject;
+ try
+ {
+ skinObject = skinClass.newInstance();
+ Class<?> substancelafclass = Class.forName(SUBSTANCE_LOOK_AND_FEEL_CLASS, true, _cl);
+ Method[] methods = substancelafclass.getMethods();
+ Method setSkinStaticMethod = null;
+ for (Method method : methods) {
+ if (method.getName().equals("setSkin")) {
+ Class<?>[] paramTypes = method.getParameterTypes();
+ String firstParamName = paramTypes[0].getCanonicalName();
+ if (firstParamName.equals("org.jvnet.substance.api.SubstanceSkin")) {
+ setSkinStaticMethod = method;
+ break;
+ }
+ }
+ }
+ setSkinStaticMethod.invoke(null, skinObject);
+ }
+ catch (InstantiationException e)
+ {
+ // skinClass.newInstance();
+ s_log.error("Unable to instantiate skinClass ("+skinName+"):"+e.getMessage(), e);
+ }
+ catch (IllegalAccessException e)
+ {
+ // skinClass.newInstance();
+ s_log.error("Unable to instantiate skinClass ("+skinName+"):"+e.getMessage(), e);
+ }
+ catch (InvocationTargetException e)
+ {
+ // setSkinStaticMethod.invoke(null, skinObject);
+ s_log.error("Unable to invoke SubstanceLookAndFeel.setSkin for skin ("+skinName+"):"+e.getMessage(), e);
+
+ }
+ catch (ClassNotFoundException e)
+ {
+ // Class.forName(SUBSTANCE_LOOK_AND_FEEL_CLASS, true, _cl);
+ s_log.error("Unable to find class ("+SUBSTANCE_LOOK_AND_FEEL_CLASS+"):"+e.getMessage(), e);
+ }
}
/**
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|