All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jidesoft.plaf.LookAndFeelFactory Maven / Gradle / Ivy

/*
 * @(#)LookAndFeelFactory.java 5/28/2005
 *
 * Copyright 2002 - 2005 JIDE Software Inc. All rights reserved.
 */

package com.jidesoft.plaf;

import com.jidesoft.icons.IconsFactory;
import com.jidesoft.plaf.basic.BasicPainter;
import com.jidesoft.plaf.basic.Painter;
import com.jidesoft.plaf.eclipse.Eclipse3xMetalUtils;
import com.jidesoft.plaf.eclipse.Eclipse3xWindowsUtils;
import com.jidesoft.plaf.eclipse.EclipseMetalUtils;
import com.jidesoft.plaf.eclipse.EclipseWindowsUtils;
import com.jidesoft.plaf.office2003.Office2003Painter;
import com.jidesoft.plaf.office2003.Office2003WindowsUtils;
import com.jidesoft.plaf.office2007.Office2007WindowsUtils;
import com.jidesoft.plaf.vsnet.VsnetMetalUtils;
import com.jidesoft.plaf.vsnet.VsnetWindowsUtils;
import com.jidesoft.plaf.xerto.XertoMetalUtils;
import com.jidesoft.plaf.xerto.XertoPainter;
import com.jidesoft.plaf.xerto.XertoWindowsUtils;
import com.jidesoft.swing.JideSwingUtilities;
import com.jidesoft.swing.JideTabbedPane;
import com.jidesoft.utils.ProductNames;
import com.jidesoft.utils.SecurityUtils;
import com.jidesoft.utils.SystemInfo;
import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;

import javax.swing.*;
import javax.swing.plaf.BorderUIResource;
import javax.swing.plaf.metal.MetalLookAndFeel;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

/**
 * JIDE Software created many new components that need their own ComponentUI classes and additional UIDefaults in
 * UIDefaults table. LookAndFeelFactory can take the UIDefaults from any existing look and feel and add the extra
 * UIDefaults JIDE components need.
 * 

* Before using any JIDE components, please make you call one of the two LookAndFeelFactory.installJideExtension(...) * methods. Basically, you set L&F using UIManager first just like before, then call installJideExtension. See code * below for an example. *

 * UIManager.setLookAndFeel(WindowsLookAndFeel.class.getName()); // you need to catch the exceptions on this call.
 * LookAndFeelFactory.installJideExtension();
 * 
* LookAndFeelFactory.installJideExtension() method will check what kind of L&F you set and what operating system you * are on and decide which style of JIDE extension it will install. Here is the rule.
  • OS: Windows Vista or * Windows 7, L&F: Windows L&F => OFFICE2007_STYLE
  • OS: Windows XP with XP theme on, L&F: Windows L&F => * OFFICE2003_STYLE
  • OS: any Windows, L&F: Windows L&F => VSNET_STYLE
  • OS: Linux, L&F: any L&F based on Metal * L&F => VSNET_STYLE
  • OS: Mac OS X, L&F: Aqua L&F => AQUA_STYLE
  • OS: any OS, L&F: Quaqua L&F => AQUA_STYLE
  • * Otherwise => VSNET_STYLE
There is also another installJideExtension which takes an int style parameter. You can * pass in {@link #EXTENSION_STYLE_VSNET}, {@link #EXTENSION_STYLE_ECLIPSE}, {@link #EXTENSION_STYLE_ECLIPSE3X}, {@link * #EXTENSION_STYLE_OFFICE2003}, {@link #EXTENSION_STYLE_OFFICE2007}, or {@link #EXTENSION_STYLE_XERTO}, {@link * #EXTENSION_STYLE_OFFICE2003_WITHOUT_MENU}, {@link #EXTENSION_STYLE_OFFICE2007_WITHOUT_MENU}, {@link * #EXTENSION_STYLE_ECLIPSE_WITHOUT_MENU}, {@link #EXTENSION_STYLE_ECLIPSE3X_WITHOUT_MENU}. In the other word, you will * make the choice of style instead of letting LookAndFeelFactory to decide one for you. Please note, there is no * constant defined for AQUA_STYLE. The only way to use it is when you are using Aqua L&F or Quaqua L&F and you call * installJideExtension() method, the one without parameter. *

* Another way is to call {@link LookAndFeelFactory#installDefaultLookAndFeelAndExtension()} which will set the default * L&Fs based on the OS and install JIDE extension. *

* LookAndFeelFactory supports a number of known L&Fs. Some are L&Fs in the JDK such as Metal, Windows, Aqua (on Apple * JDK only), GTK. We also support some 3rd party L&Fs such as Plastic XP or Plastic 3D, Tonic, A03, Synthetica etc. *

* If you are using a 3rd party L&F we are not officially supporting, you might need to customize it. Here are two * classes you can use - {@link LookAndFeelFactory.UIDefaultsInitializer} and {@link * LookAndFeelFactory.UIDefaultsCustomizer}. *

* Let's start with UIDefaultsCustomizer. No matter what unknown L&F you are trying to use, LookAndFeelFactory's * installJideExtension() will try to install the UIDefaults that JIDE components required. Hopefully JIDE will run on * your L&F without any exception. But most likely, it won't look very good. That's why you need {@link * UIDefaultsCustomizer} to customize the UIDefaults. *

* Most likely, you will not need to use {@link UIDefaultsInitializer}. The only exception is Synth L&F and any L&Fs * based on it. The reason is we calculate all colors we will use in JIDE components from existing well-known * UIDefaults. For example, we will use UIManagerLookup.getColor("activeCaption") to calculate a color that we can use * in dockable frame's title pane. We will use UIManagerLookup.getColor("control") to calculate a color that we can use * as background of JIDE component. Most L&Fs will fill those UIDefaults. However in Synth L&F, those UIDefaults may or * may not have a valid value. You will end up with NPE later in the code when you call installJideExtension. In this * case, you can add those extra UIDefaults in UIDefaultsInitializer. We will call it before installJideExtension is * called so that those UIDefaults are there ready for us to use. This is how added support to GTK L&F and Synthetica * L&F. *

* After you create your own UIDefaultsCustomizer or Initializer, you can call {@link * #addUIDefaultsCustomizer(com.jidesoft.plaf.LookAndFeelFactory.UIDefaultsCustomizer)} or {@link * #addUIDefaultsInitializer(com.jidesoft.plaf.LookAndFeelFactory.UIDefaultsInitializer)} which will make the customizer * or the initializer triggered all the times. If you only want it to be used for a certain L&F, you should use {@link * #registerDefaultCustomizer(String, String)} or {@link #registerDefaultInitializer(String, String)}. *

* By default, we also use UIDefaultsCustomizer and UIDefaultsInitializer internally to provide support for non-standard * L&Fs. However we look into the classes under "com.jidesoft.plaf" package for default customizers and initializers. * For example, for PlasticXPLookAndFeel, the corresponding customizer is "oom.jidesoft.plaf.plasticxp.PlasticXPCustomizer". * We basically take the L&F name "PlasticXP", append it after "com.jidesoft.plaf" using lower case to get package name, * take the L&F name, append with "Customizer" to get the class name. We will look at PlasticXPLookAndFeel's super class * which is PlasticLookAndFeel. The customizer corresponding to PlasticLookAndFeel is * "com.jidesoft.plaf.plastic.PlasticCustomizer". This searching process continues till we find all super classes of a * L&F. Then we start from its top-most super class and call the customizers one by one, if it is there. The * src-plaf.jar or src-plaf-jdk7.jar contain some of these customizers. You could use this naming pattern to create the * customizers so that you don't need to register them explicitly. *

* {@link #installJideExtension()} method will only add the additional UIDefaults to current ClassLoader. If you have * several class loaders in your system, you probably should tell the UIManager to use the class loader that called * installJideExtension. Otherwise, you might some unexpected errors. Here is how to specify the class * loaders. *

 * UIManager.put("ClassLoader", currentClass.getClassLoader()); // currentClass is the class where the code is.
 * LookAndFeelFactory.installDefaultLookAndFeelAndExtension(); // or installJideExtension()
 * 
*/ public class LookAndFeelFactory implements ProductNames { /** * Class name of Windows L&F provided in Sun JDK. */ public static final String WINDOWS_CLASSIC_LNF = "com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel"; /** * Class name of Windows L&F provided in Sun JDK. */ public static final String WINDOWS_LNF = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; /** * Class name of Metal L&F provided in Sun JDK. */ public static final String METAL_LNF = "javax.swing.plaf.metal.MetalLookAndFeel"; /** * Class name of Synth L&F provided in Sun JDK. */ public static final String SYNTH_LNF = "javax.swing.plaf.synth.SynthLookAndFeel"; /** * Class name of Aqua L&F provided in Apple Mac OS X JDK. */ public static final String AQUA_LNF = "apple.laf.AquaLookAndFeel"; /** * Class name of Aqua L&F provided in Apple Mac OS X JDK. This is the new package since Java Update 6. */ public static final String AQUA_LNF_6 = "com.apple.laf.AquaLookAndFeel"; /** * Class name of Quaqua L&F. */ public static final String QUAQUA_LNF = "ch.randelshofer.quaqua.QuaquaLookAndFeel"; /** * Class name of Alloy L&F. */ public static final String ALLOY_LNF = "com.incors.plaf.alloy.AlloyLookAndFeel"; /** * Class name of Synthetica L&F. */ public static final String SYNTHETICA_LNF = "de.javasoft.plaf.synthetica.SyntheticaLookAndFeel"; public static final String SYNTHETICA_LNF_PREFIX = "de.javasoft.plaf.synthetica.Synthetica"; /** * Class name of Plastic3D L&F. */ public static final String PLASTIC3D_LNF = "com.jgoodies.looks.plastic.Plastic3DLookAndFeel"; /** * Class name of Plastic3D L&F after JGoodies Look 1.3 release. * * @deprecated replaced by PLASTIC3D_LNF */ @Deprecated public static final String PLASTIC3D_LNF_1_3 = "com.jgoodies.looks.plastic.Plastic3DLookAndFeel"; /** * Class name of PlasticXP L&F. */ public static final String PLASTICXP_LNF = "com.jgoodies.looks.plastic.PlasticXPLookAndFeel"; /** * Class name of Tonic L&F. */ public static final String TONIC_LNF = "com.digitprop.tonic.TonicLookAndFeel"; /** * Class name of A03 L&F. */ public static final String A03_LNF = "a03.swing.plaf.A03LookAndFeel"; /** * Class name of Pgs L&F. */ public static final String PGS_LNF = "com.pagosoft.plaf.PgsLookAndFeel"; /** * Class name of GTK L&F provided by Sun JDK. */ public static final String GTK_LNF = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"; /** * Class name of Motif L&F provided by Sun JDK. */ public static final String MOTIF_LNF = "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; /** * Class name of Bizlaf L&F provided by Centigrade. */ public static final String BIZ_LNF = "de.centigrade.bizlaf.BizLookAndFeel"; /** * The name of Nimbus L&F. We didn't create a constant for Nimbus is because the package name will be changed in * JDK7 release */ public static final String NIMBUS_LNF_NAME = "NimbusLookAndFeel"; /** * The same as {@link #EXTENSION_STYLE_VSNET_WITHOUT_MENU} * * @see #EXTENSION_STYLE_VSNET_WITHOUT_MENU */ public static final int VSNET_STYLE_WITHOUT_MENU = 0; /** * The same as {@link #EXTENSION_STYLE_VSNET} * * @see #EXTENSION_STYLE_VSNET */ public static final int VSNET_STYLE = 1; /** * The same as {@link #EXTENSION_STYLE_ECLIPSE} * * @see #EXTENSION_STYLE_ECLIPSE */ public static final int ECLIPSE_STYLE = 2; /** * The same as {@link #EXTENSION_STYLE_OFFICE2003} * * @see #EXTENSION_STYLE_OFFICE2003 */ public static final int OFFICE2003_STYLE = 3; /** * The same as {@link #EXTENSION_STYLE_XERTO} * * @see #EXTENSION_STYLE_XERTO */ public static final int XERTO_STYLE = 4; /** * The same as {@link #EXTENSION_STYLE_XERTO_WITHOUT_MENU} * * @see #EXTENSION_STYLE_XERTO_WITHOUT_MENU */ public static final int XERTO_STYLE_WITHOUT_MENU = 6; /** * The same as {@link #EXTENSION_STYLE_ECLIPSE} * * @see #EXTENSION_STYLE_ECLIPSE */ public static final int ECLIPSE3X_STYLE = 5; /** * The same as {@link #EXTENSION_STYLE_OFFICE2007} * * @see #EXTENSION_STYLE_OFFICE2007 */ public static final int OFFICE2007_STYLE = 7; /** * A style that you can use with {@link #installJideExtension(int)} method. This style is the same as VSNET_STYLE * except it doesn't have menu related UIDefaults. You can only use this style if you didn't use any component from * JIDE Action Framework. *

* * @see #EXTENSION_STYLE_VSNET */ public static final int EXTENSION_STYLE_VSNET_WITHOUT_MENU = 0; /** * A style that you can use with {@link #installJideExtension(int)} method. This style mimics the visual style of * Microsoft Visual Studio .NET for the toolbars, menus and dockable windows. *

* Vsnet style is a very simple style with no gradient. Although it works on almost all L&Fs in any operating * systems, it looks the best on Windows 2000 or 98, or on Windows XP when XP theme is not on. If XP theme is on, we * suggest you use Office2003 style or Xerto style. Since the style is so simple, it works with a lot of the 3rd * party L&F such as Tonic, Pgs, Alloy etc without causing too much noise. That's why this is also the default style * for any L&Fs we don't recognize when you call {@link #installJideExtension()}, the one with out style parameter. * If you would like another style to be used as the default style, you can call {@link #setDefaultStyle(int)} * method. *

* Here is the code to set to Windows L&F with Vsnet style extension. *

     * UIManager.setLookAndFeel(WindowsLookAndFeel.class.getName()); // you need to catch the
     * exceptions on this call.
     * LookAndFeelFactory.installJideExtension(LookAndFeelFactory.EXTENSION_STYLE_VSNET);
     * 
* There is a special system property "shading theme" you can use. If you turn it on using the code below, you will * see a gradient on dockable frame's title pane and rounded corner and gradient on the tabs of JideTabbedPane. So * if the L&F you are using uses gradient, you can set this property to true to match with your L&F. For example, if * you use Plastic3D L&F, turning this property on will look better. *
     * System.setProperty("shadingtheme", "true");
     * 
*/ public static final int EXTENSION_STYLE_VSNET = 1; /** * A style that you can use with {@link #installJideExtension(int)} method. This style mimics the visual style of * Eclipse 2.x for the toolbars, menus and dockable windows. *

* Eclipse style works for almost all L&Fs and on any operating systems, although it looks the best on Windows. For * any other operating systems we suggest you to use EXTENSION_STYLE_XERTO or EXTENSION_STYLE_VSNET. *

* Here is the code to set to any L&F with Eclipse style extension. *

     * UIManager.setLookAndFeel(AnyLookAndFeel.class.getName()); // you need to catch the
     * exceptions
     * on this call.
     * LookAndFeelFactory.installJideExtension(LookAndFeelFactory.EXTENSION_STYLE_ECLIPSE);
     * 
*/ public static final int EXTENSION_STYLE_ECLIPSE = 2; /** * A style that you can use with {@link #installJideExtension(int)} method. This style mimics the visual style of * Microsoft Office2003 for the toolbars, menus and dockable windows. *

* Office2003 style looks great on Windows XP when Windows or Windows XP L&F from Sun JDK is used. It replicated the * exact same style as Microsoft Office 2003, to give your end user a familiar visual style. *

* Here is the code to set to Windows L&F with Office2003 style extension. *

     * UIManager.setLookAndFeel(WindowsLookAndFeel.class.getName()); // you need to catch the
     * exceptions on this call.
     * LookAndFeelFactory.installJideExtension(LookAndFeelFactory.EXTENSION_STYLE_OFFICE2003);
     * 
* It works either on any other Windows such asWindows 2000, Windows 98 etc. If you are on Windows XP, Office2003 * style will change theme based on the theme setting in Windows Display Property. But if you are not on XP, * Office2003 style will use the default gray theme only. You can force to change it using {@link * Office2003Painter#setColorName(String)} method, but it won't look good as other non-JIDE components won't have * the matching theme. *

* Office2003 style doesn't work on any operating systems other than Windows mainly because the design of Office2003 * style is so centric to Windows that it doesn't look good on other operating systems. */ public static final int EXTENSION_STYLE_OFFICE2003 = 3; /** * A style that you can use with {@link #installJideExtension(int)} method. This style is created by Xerto * (http://www.xerto.com) which is used in their Imagery product. *

* Xerto style looks great on Windows XP when Windows XP L&F from Sun JDK is used. *

* Here is the code to set to Windows L&F with Xerto style extension. *

     * UIManager.setLookAndFeel(WindowsLookAndFeel.class.getName()); // you need to catch the
     * exceptions on this call.
     * LookAndFeelFactory.installJideExtension(LookAndFeelFactory.EXTENSION_STYLE_XERTO);
     * 
* Although it looks the best on Windows, Xerto style also supports Linux or Solaris if you use any L&Fs based on * Metal L&F or Synth L&F. For example, we recommend you to use Xerto style as default if you use SyntheticaL&F, a * L&F based on Synth. To use it, you basically replace WindowsLookAndFeel to the L&F you want to use in * setLookAndFeel line above. */ public static final int EXTENSION_STYLE_XERTO = 4; /** * A style that you can use with {@link #installJideExtension(int)} method. This style mimics the visual style of * Eclipse 3.x for the toolbars, menus and dockable windows. *

* Eclipse 3x style works for almost all L&Fs and on any operating systems, although it looks the best on Windows. * For any other OS's we suggest you to use EXTENSION_STYLE_XERTO or EXTENSION_STYLE_VSNET. *

     * UIManager.setLookAndFeel(AnyLookAndFeel.class.getName()); // you need to catch the
     * exceptions
     * on this call.
     * LookAndFeelFactory.installJideExtension(LookAndFeelFactory.EXTENSION_STYLE_ECLIPSE3X);
     * 
*/ public static final int EXTENSION_STYLE_ECLIPSE3X = 5; /** * A style that you can use with {@link #installJideExtension(int)} method. This style is the same as XERTO_STYLE * except it doesn't have menu related UIDefaults. You can only use this style if you didn't use any component from * JIDE Action Framework. Please note, we only use menu extension for Xerto style when the underlying L&F is Windows * L&F. If you are using L&F such as Metal or other 3rd party L&F based on Metal, XERTO_STYLE_WITHOUT_MENU will be * used even you use XERTO_STYLE when calling to installJideExtension(). *

* * @see #EXTENSION_STYLE_XERTO */ public static final int EXTENSION_STYLE_XERTO_WITHOUT_MENU = 6; /** * A style that you can use with {@link #installJideExtension(int)} method. This style mimics the visual style of * Microsoft Office2007 for the toolbars, menus and dockable windows. *

* Office2007 style looks great on Windows Vista when Windows L&F from Sun JDK is used. It replicated the exact same * style as Microsoft Office 2007, to give your end user a familiar visual style. *

* Here is the code to set to Windows L&F with Office2007 style extension. *

     * UIManager.setLookAndFeel(WindowsLookAndFeel.class.getName()); // you need to catch the
     * exceptions on this call.
     * LookAndFeelFactory.installJideExtension(LookAndFeelFactory.EXTENSION_STYLE_OFFICE2007);
     * 
*

* Office2007 style doesn't work on any operating systems other than Windows mainly because the design of Office2003 * style is so centric to Windows that it doesn't look good on other operating systems. *

* Because we use some painting code that is only available in JDK6, Office 2007 style only runs if you are using * JDK6 and above. */ public static final int EXTENSION_STYLE_OFFICE2007 = 7; /** * A style that you can use with {@link #installJideExtension(int)} method. This style is the same as * EXTENSION_STYLE_OFFICE2003 except it doesn't have menu related UIDefaults. You can only use this style if you * didn't use any component from JIDE Action Framework. *

* * @see #EXTENSION_STYLE_OFFICE2003 */ @Deprecated public static final int EXTENSION_STYLE_OFFICE2003_WITHOUT_MENU = 8; /** * A style that you can use with {@link #installJideExtension(int)} method. This style is the same as * EXTENSION_STYLE_OFFICE2007 except it doesn't have menu related UIDefaults. You can only use this style if you * didn't use any component from JIDE Action Framework. *

* * @see #EXTENSION_STYLE_OFFICE2007 */ @Deprecated public static final int EXTENSION_STYLE_OFFICE2007_WITHOUT_MENU = 9; /** * A style that you can use with {@link #installJideExtension(int)} method. This style is the same as * EXTENSION_STYLE_ECLIPSE except it doesn't have menu related UIDefaults. You can only use this style if you didn't * use any component from JIDE Action Framework. *

* * @see #EXTENSION_STYLE_ECLIPSE3X */ public static final int EXTENSION_STYLE_ECLIPSE_WITHOUT_MENU = 10; /** * A style that you can use with {@link #installJideExtension(int)} method. This style is the same as * EXTENSION_STYLE_ECLIPSE3X except it doesn't have menu related UIDefaults. You can only use this style if you * didn't use any component from JIDE Action Framework. *

* * @see #EXTENSION_STYLE_ECLIPSE3X */ public static final int EXTENSION_STYLE_ECLIPSE3X_WITHOUT_MENU = 11; private static int _style = -1; private static int _defaultStyle = -1; private static LookAndFeel _lookAndFeel; private static PropertyChangeListener _listener; /** * If installJideExtension is called, it will put an entry on UIDefaults table. * UIManagerLookup.getBoolean(JIDE_EXTENSION_INSTALLLED) will return true. You can also use {@link * #isJideExtensionInstalled()} to check the value instead of using UIManagerLookup.getBoolean(JIDE_EXTENSION_INSTALLLED). */ public static final String JIDE_EXTENSION_INSTALLED = "jidesoft.extensionInstalled"; /** * If installJideExtension is called, a JIDE style will be installed on UIDefaults table. If so, * UIManagerLookup.getInt(JIDE_STYLE_INSTALLED) will return you the style that is installed. For example, if the * value is 1, it means VSNET_STYLE is installed because 1 is the value of VSNET_STYLE. */ public static final String JIDE_STYLE_INSTALLED = "jidesoft.extensionStyle"; /** * An interface to make the customization of UIDefaults easier. This customizer will be called after * installJideExtension() is called. So if you want to further customize UIDefault, you can use this customizer to * do it. */ public static interface UIDefaultsCustomizer { void customize(UIDefaults defaults); } /** * An interface to make the initialization of UIDefaults easier. This initializer will be called before * installJideExtension() is called. So if you want to initialize UIDefault before installJideExtension is called, * you can use this initializer to do it. */ public static interface UIDefaultsInitializer { void initialize(UIDefaults defaults); } private static List _uiDefaultsCustomizers = new Vector(); private static List _uiDefaultsInitializers = new Vector(); private static Map _installedLookAndFeels = new HashMap(); private static boolean _loadLookAndFeelClass = true; public static final String LAF_INSTALLED = "installed"; public static final String LAF_NOT_INSTALLED = "not installed"; protected LookAndFeelFactory() { } /** * Gets the default style. If you never set default style before, it will return OFFICE2003_STYLE if you are on * Windows XP, L&F is instance of Windows L&F and XP theme is on. Otherwise, it will return VSNET_STYLE. If you set * default style before, it will return whatever style you set. * * @return the default style. */ public static int getDefaultStyle() { if (_defaultStyle == -1) { String defaultStyle = SecurityUtils.getProperty("jide.defaultStyle", "-1"); try { _defaultStyle = Integer.parseInt(defaultStyle); } catch (NumberFormatException e) { // ignore } if (_defaultStyle == -1) { int suggestedStyle; try { if (SystemInfo.isWindowsVistaAbove() && UIManager.getLookAndFeel() instanceof WindowsLookAndFeel && SystemInfo.isJdk6Above()) { suggestedStyle = EXTENSION_STYLE_OFFICE2007; } else if (XPUtils.isXPStyleOn() && UIManager.getLookAndFeel() instanceof WindowsLookAndFeel) { suggestedStyle = EXTENSION_STYLE_OFFICE2003; } else { suggestedStyle = ((LookAndFeelFactory.getProductsUsed() & PRODUCT_ACTION) == 0) ? EXTENSION_STYLE_VSNET_WITHOUT_MENU : EXTENSION_STYLE_VSNET; } } catch (UnsupportedOperationException e) { suggestedStyle = ((LookAndFeelFactory.getProductsUsed() & PRODUCT_ACTION) == 0) ? EXTENSION_STYLE_VSNET_WITHOUT_MENU : EXTENSION_STYLE_VSNET; } return suggestedStyle; } } return _defaultStyle; } /** * Sets the default style. If you call this method to set a default style, {@link #installJideExtension()} will use * it as the default style. * * @param defaultStyle the default style. */ public static void setDefaultStyle(int defaultStyle) { _defaultStyle = defaultStyle; } /** * Adds additional UIDefaults JIDE needed to UIDefault table. You must call this method every time switching look * and feel. And call updateComponentTreeUI() in corresponding DockingManager or DockableBarManager after this * call. *


     *  try {
     *      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
     *  }
     *  catch (ClassNotFoundException e) {
     *     e.printStackTrace();
     *  }
     *  catch (InstantiationException e) {
     *     e.printStackTrace();
     *  }
     *  catch (IllegalAccessException e) {
     *      e.printStackTrace();
     *  }
     *  catch (UnsupportedLookAndFeelException e) {
     *      e.printStackTrace();
     *  }
     * 

* // to additional UIDefault for JIDE components * LookAndFeelFactory.installJideExtension(); // use default style VSNET_STYLE. You can change * to a different style * using setDefaultStyle(int style) and then call this method. Or simply call * installJideExtension(style). *

* // call updateComponentTreeUI * frame.getDockableBarManager().updateComponentTreeUI(); * frame.getDockingManager().updateComponentTreeUI(); *

*/ public static void installJideExtension() { installJideExtension(_style == -1 ? getDefaultStyle() : _style); } /** * Add additional UIDefaults JIDE needed to UIDefaults table. You must call this method every time switching look * and feel. And call updateComponentTreeUI() in corresponding DockingManager or DockableBarManager after this * call. *

     *  try {
     *      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
     *  }
     *  catch (ClassNotFoundException e) {
     *     e.printStackTrace();
     *  }
     *  catch (InstantiationException e) {
     *     e.printStackTrace();
     *  }
     *  catch (IllegalAccessException e) {
     *      e.printStackTrace();
     *  }
     *  catch (UnsupportedLookAndFeelException e) {
     *      e.printStackTrace();
     *  }
     * 

* // to add additional UIDefault for JIDE components * LookAndFeelFactory.installJideExtension(LookAndFeelFactory.OFFICE2003_STYLE); *

* // call updateComponentTreeUI * frame.getDockableBarManager().updateComponentTreeUI(); * frame.getDockingManager().updateComponentTreeUI(); *

* * @param style the style of the extension. */ public static void installJideExtension(int style) { installJideExtension(UIManager.getLookAndFeelDefaults(), UIManager.getLookAndFeel(), style); } /** * Checks if JIDE extension is installed. Please note, UIManager.setLookAndFeel() method will overwrite the whole * UIDefaults table. So even you called {@link #installJideExtension()} method before, UIManager.setLookAndFeel() * method make isJideExtensionInstalled returning false. * * @return true if installed. */ public static boolean isJideExtensionInstalled() { return UIDefaultsLookup.getBoolean(JIDE_EXTENSION_INSTALLED); } /** * Installs the UIDefault needed by JIDE component to the uiDefaults table passed in. * * @param uiDefaults the UIDefault tables where JIDE UIDefaults will be installed. * @param lnf the LookAndFeel. This may have an effect on which set of JIDE UIDefaults we will install. * @param style the style of the JIDE UIDefaults. */ public static void installJideExtension(UIDefaults uiDefaults, LookAndFeel lnf, int style) { if (isJideExtensionInstalled() && _style == style && _lookAndFeel == lnf) { return; } workAroundSwingIssues(); if (_listener == null) { _listener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ("lookAndFeel".equals(evt.getPropertyName())) { _style = -1; } } }; } UIManager.removePropertyChangeListener(_listener); UIManager.addPropertyChangeListener(_listener); _style = style; uiDefaults.put(JIDE_STYLE_INSTALLED, _style); _lookAndFeel = lnf; UIDefaultsInitializer[] initializers = getUIDefaultsInitializers(); for (UIDefaultsInitializer initializer : initializers) { if (initializer != null) { initializer.initialize(uiDefaults); } } // For Alloy /* if (lnf.getClass().getName().equals(ALLOY_LNF) && isAlloyLnfInstalled()) { Object progressBarUI = uiDefaults.get("ProgressBarUI"); VsnetMetalUtils.initClassDefaults(uiDefaults); VsnetMetalUtils.initComponentDefaults(uiDefaults); uiDefaults.put("ProgressBarUI", progressBarUI); uiDefaults.put("DockableFrameUI", "com.jidesoft.plaf.vsnet.VsnetDockableFrameUI"); uiDefaults.put("DockableFrameTitlePane.hideIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 0, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.unfloatIcon", IconsFactory.getIcon(null, titleButtonImage, 0, titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.floatIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 2 * titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.autohideIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 3 * titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.stopAutohideIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 4 * titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.hideAutohideIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 5 * titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.maximizeIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 6 * titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.restoreIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 7 * titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.buttonGap", new Integer(4)); // gap between buttons } else */ initialize(lnf.getClass().getName(), uiDefaults); if ((lnf.getClass().getName().equals(ALLOY_LNF) && isAlloyLnfInstalled()) || (lnf.getClass().getName().equals(PLASTIC3D_LNF) && isPlastic3DLnfInstalled()) || (lnf.getClass().getName().equals(PLASTICXP_LNF) && isPlasticXPLnfInstalled()) || (lnf.getClass().getName().equals(PGS_LNF) && isPgsLnfInstalled()) || (lnf.getClass().getName().equals(TONIC_LNF) && isTonicLnfInstalled())) { switch (style) { case EXTENSION_STYLE_OFFICE2007: case EXTENSION_STYLE_OFFICE2007_WITHOUT_MENU: VsnetWindowsUtils.initComponentDefaults(uiDefaults); Office2003WindowsUtils.initComponentDefaults(uiDefaults); Office2007WindowsUtils.initComponentDefaults(uiDefaults); Office2007WindowsUtils.initClassDefaults(uiDefaults, false); break; case EXTENSION_STYLE_OFFICE2003: case EXTENSION_STYLE_OFFICE2003_WITHOUT_MENU: VsnetWindowsUtils.initComponentDefaults(uiDefaults); Office2003WindowsUtils.initComponentDefaults(uiDefaults); Office2003WindowsUtils.initClassDefaults(uiDefaults, false); break; case EXTENSION_STYLE_VSNET: case EXTENSION_STYLE_VSNET_WITHOUT_MENU: VsnetMetalUtils.initComponentDefaults(uiDefaults); VsnetMetalUtils.initClassDefaults(uiDefaults); Painter gripperPainter = new Painter() { public void paint(JComponent c, Graphics g, Rectangle rect, int orientation, int state) { Office2003Painter.getInstance().paintGripper(c, g, rect, orientation, state); } }; // set all grippers to Office2003 style gripper uiDefaults.put("Gripper.painter", gripperPainter); uiDefaults.put("JideTabbedPane.gripperPainter", gripperPainter); uiDefaults.put("JideTabbedPane.defaultTabShape", JideTabbedPane.SHAPE_OFFICE2003); uiDefaults.put("JideTabbedPane.selectedTabTextForeground", UIDefaultsLookup.getColor("controlText")); uiDefaults.put("JideTabbedPane.unselectedTabTextForeground", UIDefaultsLookup.getColor("controlText")); uiDefaults.put("JideTabbedPane.foreground", UIDefaultsLookup.getColor("controlText")); uiDefaults.put("JideTabbedPane.light", UIDefaultsLookup.getColor("control")); uiDefaults.put("JideSplitPaneDivider.gripperPainter", gripperPainter); int products = LookAndFeelFactory.getProductsUsed(); if ((products & PRODUCT_DOCK) != 0) { ImageIcon titleButtonImage = IconsFactory.getImageIcon(VsnetWindowsUtils.class, "icons/title_buttons_windows.gif"); // 10 x 10 x 8 final int titleButtonSize = 10; uiDefaults.put("DockableFrameUI", "com.jidesoft.plaf.vsnet.VsnetDockableFrameUI"); uiDefaults.put("DockableFrameTitlePane.hideIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 0, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.unfloatIcon", IconsFactory.getIcon(null, titleButtonImage, 0, titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.floatIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 2 * titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.autohideIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 3 * titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.stopAutohideIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 4 * titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.hideAutohideIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 5 * titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.maximizeIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 6 * titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.restoreIcon", IconsFactory.getIcon(null, titleButtonImage, 0, 7 * titleButtonSize, titleButtonSize, titleButtonSize)); uiDefaults.put("DockableFrameTitlePane.buttonGap", 4); // gap between buttons uiDefaults.put("DockableFrame.titleBorder", new BorderUIResource(BorderFactory.createEmptyBorder(1, 0, 2, 0))); uiDefaults.put("DockableFrame.border", new BorderUIResource(BorderFactory.createEmptyBorder(2, 0, 0, 0))); uiDefaults.put("DockableFrameTitlePane.gripperPainter", gripperPainter); } break; case EXTENSION_STYLE_ECLIPSE: case EXTENSION_STYLE_ECLIPSE_WITHOUT_MENU: EclipseMetalUtils.initComponentDefaults(uiDefaults); EclipseMetalUtils.initClassDefaults(uiDefaults); break; case EXTENSION_STYLE_ECLIPSE3X: case EXTENSION_STYLE_ECLIPSE3X_WITHOUT_MENU: Eclipse3xMetalUtils.initComponentDefaults(uiDefaults); Eclipse3xMetalUtils.initClassDefaults(uiDefaults); break; case EXTENSION_STYLE_XERTO: case EXTENSION_STYLE_XERTO_WITHOUT_MENU: XertoMetalUtils.initComponentDefaults(uiDefaults); XertoMetalUtils.initClassDefaults(uiDefaults); break; } if (style == EXTENSION_STYLE_XERTO || style == EXTENSION_STYLE_XERTO_WITHOUT_MENU) { UIDefaultsLookup.put(uiDefaults, "Theme.painter", XertoPainter.getInstance()); } else { UIDefaultsLookup.put(uiDefaults, "Theme.painter", BasicPainter.getInstance()); } } else if (lnf.getClass().getName().equals(MetalLookAndFeel.class.getName())) { switch (style) { case EXTENSION_STYLE_OFFICE2007: case EXTENSION_STYLE_OFFICE2003: case EXTENSION_STYLE_VSNET: VsnetMetalUtils.initComponentDefaults(uiDefaults); VsnetMetalUtils.initClassDefaultsWithMenu(uiDefaults); break; case EXTENSION_STYLE_ECLIPSE: EclipseMetalUtils.initComponentDefaults(uiDefaults); EclipseMetalUtils.initClassDefaults(uiDefaults); break; case EXTENSION_STYLE_ECLIPSE3X: Eclipse3xMetalUtils.initComponentDefaults(uiDefaults); Eclipse3xMetalUtils.initClassDefaults(uiDefaults); break; case EXTENSION_STYLE_VSNET_WITHOUT_MENU: case EXTENSION_STYLE_OFFICE2003_WITHOUT_MENU: case EXTENSION_STYLE_OFFICE2007_WITHOUT_MENU: VsnetMetalUtils.initComponentDefaults(uiDefaults); VsnetMetalUtils.initClassDefaults(uiDefaults); break; case EXTENSION_STYLE_XERTO: case EXTENSION_STYLE_XERTO_WITHOUT_MENU: XertoMetalUtils.initComponentDefaults(uiDefaults); XertoMetalUtils.initClassDefaults(uiDefaults); break; default: } } else if (lnf instanceof MetalLookAndFeel) { switch (style) { case EXTENSION_STYLE_OFFICE2007: case EXTENSION_STYLE_OFFICE2003: case EXTENSION_STYLE_VSNET: case EXTENSION_STYLE_OFFICE2007_WITHOUT_MENU: case EXTENSION_STYLE_OFFICE2003_WITHOUT_MENU: case EXTENSION_STYLE_VSNET_WITHOUT_MENU: VsnetMetalUtils.initComponentDefaults(uiDefaults); VsnetMetalUtils.initClassDefaults(uiDefaults); break; case EXTENSION_STYLE_ECLIPSE: case EXTENSION_STYLE_ECLIPSE_WITHOUT_MENU: EclipseMetalUtils.initClassDefaults(uiDefaults); EclipseMetalUtils.initComponentDefaults(uiDefaults); break; case EXTENSION_STYLE_ECLIPSE3X: case EXTENSION_STYLE_ECLIPSE3X_WITHOUT_MENU: Eclipse3xMetalUtils.initClassDefaults(uiDefaults); Eclipse3xMetalUtils.initComponentDefaults(uiDefaults); break; case EXTENSION_STYLE_XERTO: case EXTENSION_STYLE_XERTO_WITHOUT_MENU: XertoMetalUtils.initComponentDefaults(uiDefaults); XertoMetalUtils.initClassDefaults(uiDefaults); break; } } else if (lnf instanceof WindowsLookAndFeel) { switch (style) { case EXTENSION_STYLE_OFFICE2007: VsnetWindowsUtils.initComponentDefaultsWithMenu(uiDefaults); VsnetWindowsUtils.initClassDefaultsWithMenu(uiDefaults); Office2003WindowsUtils.initComponentDefaults(uiDefaults); Office2007WindowsUtils.initComponentDefaults(uiDefaults); Office2007WindowsUtils.initClassDefaults(uiDefaults); break; case EXTENSION_STYLE_OFFICE2007_WITHOUT_MENU: VsnetWindowsUtils.initComponentDefaults(uiDefaults); VsnetWindowsUtils.initClassDefaults(uiDefaults); Office2003WindowsUtils.initComponentDefaults(uiDefaults); Office2007WindowsUtils.initComponentDefaults(uiDefaults); Office2007WindowsUtils.initClassDefaults(uiDefaults); break; case EXTENSION_STYLE_OFFICE2003: VsnetWindowsUtils.initComponentDefaultsWithMenu(uiDefaults); VsnetWindowsUtils.initClassDefaultsWithMenu(uiDefaults); Office2003WindowsUtils.initClassDefaults(uiDefaults); Office2003WindowsUtils.initComponentDefaults(uiDefaults); break; case EXTENSION_STYLE_OFFICE2003_WITHOUT_MENU: VsnetWindowsUtils.initComponentDefaults(uiDefaults); VsnetWindowsUtils.initClassDefaults(uiDefaults); Office2003WindowsUtils.initClassDefaults(uiDefaults); Office2003WindowsUtils.initComponentDefaults(uiDefaults); break; case EXTENSION_STYLE_ECLIPSE: EclipseWindowsUtils.initClassDefaultsWithMenu(uiDefaults); EclipseWindowsUtils.initComponentDefaultsWithMenu(uiDefaults); break; case EXTENSION_STYLE_ECLIPSE_WITHOUT_MENU: EclipseWindowsUtils.initClassDefaults(uiDefaults); EclipseWindowsUtils.initComponentDefaults(uiDefaults); break; case EXTENSION_STYLE_ECLIPSE3X: Eclipse3xWindowsUtils.initClassDefaultsWithMenu(uiDefaults); Eclipse3xWindowsUtils.initComponentDefaultsWithMenu(uiDefaults); break; case EXTENSION_STYLE_ECLIPSE3X_WITHOUT_MENU: Eclipse3xWindowsUtils.initClassDefaults(uiDefaults); Eclipse3xWindowsUtils.initComponentDefaults(uiDefaults); break; case EXTENSION_STYLE_VSNET: VsnetWindowsUtils.initComponentDefaultsWithMenu(uiDefaults); VsnetWindowsUtils.initClassDefaultsWithMenu(uiDefaults); break; case EXTENSION_STYLE_VSNET_WITHOUT_MENU: VsnetWindowsUtils.initComponentDefaults(uiDefaults); VsnetWindowsUtils.initClassDefaults(uiDefaults); break; case EXTENSION_STYLE_XERTO: XertoWindowsUtils.initComponentDefaultsWithMenu(uiDefaults); XertoWindowsUtils.initClassDefaultsWithMenu(uiDefaults); break; case EXTENSION_STYLE_XERTO_WITHOUT_MENU: XertoWindowsUtils.initComponentDefaults(uiDefaults); XertoWindowsUtils.initClassDefaults(uiDefaults); break; } } // For Mac only else if (isAquaLnfInstalled() && ((isLnfInUse(AQUA_LNF_6) || isLnfInUse(AQUA_LNF))) || (isQuaquaLnfInstalled() && isLnfInUse(QUAQUA_LNF))) { // use reflection since we don't deliver source code of AquaJideUtils as most users don't compile it on Mac OS X try { Class aquaJideUtils = getUIManagerClassLoader().loadClass("com.jidesoft.plaf.aqua.AquaJideUtils"); aquaJideUtils.getMethod("initComponentDefaults", UIDefaults.class).invoke(null, uiDefaults); aquaJideUtils.getMethod("initClassDefaults", UIDefaults.class).invoke(null, uiDefaults); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (IllegalArgumentException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { JideSwingUtilities.throwInvocationTargetException(e); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } catch (SecurityException e) { throw new RuntimeException(e); } } else { switch (style) { case EXTENSION_STYLE_OFFICE2007: if (SystemInfo.isWindows()) { VsnetWindowsUtils.initComponentDefaultsWithMenu(uiDefaults); Office2003WindowsUtils.initComponentDefaults(uiDefaults); Office2007WindowsUtils.initComponentDefaults(uiDefaults); Office2007WindowsUtils.initClassDefaults(uiDefaults); } else { VsnetMetalUtils.initComponentDefaults(uiDefaults); VsnetMetalUtils.initClassDefaults(uiDefaults); } break; case EXTENSION_STYLE_OFFICE2007_WITHOUT_MENU: if (SystemInfo.isWindows()) { VsnetWindowsUtils.initComponentDefaults(uiDefaults); Office2003WindowsUtils.initComponentDefaults(uiDefaults); Office2007WindowsUtils.initComponentDefaults(uiDefaults); Office2007WindowsUtils.initClassDefaults(uiDefaults); } else { VsnetMetalUtils.initComponentDefaults(uiDefaults); VsnetMetalUtils.initClassDefaults(uiDefaults); } break; case EXTENSION_STYLE_OFFICE2003: if (SystemInfo.isWindows()) { VsnetWindowsUtils.initComponentDefaultsWithMenu(uiDefaults); Office2003WindowsUtils.initComponentDefaults(uiDefaults); Office2003WindowsUtils.initClassDefaults(uiDefaults); } else { VsnetMetalUtils.initComponentDefaults(uiDefaults); VsnetMetalUtils.initClassDefaults(uiDefaults); } break; case EXTENSION_STYLE_OFFICE2003_WITHOUT_MENU: if (SystemInfo.isWindows()) { VsnetWindowsUtils.initComponentDefaults(uiDefaults); Office2003WindowsUtils.initComponentDefaults(uiDefaults); Office2003WindowsUtils.initClassDefaults(uiDefaults); } else { VsnetMetalUtils.initComponentDefaults(uiDefaults); VsnetMetalUtils.initClassDefaults(uiDefaults); } break; case EXTENSION_STYLE_ECLIPSE: if (SystemInfo.isWindows()) { EclipseWindowsUtils.initClassDefaultsWithMenu(uiDefaults); EclipseWindowsUtils.initComponentDefaultsWithMenu(uiDefaults); } else { EclipseMetalUtils.initClassDefaults(uiDefaults); EclipseMetalUtils.initComponentDefaults(uiDefaults); } break; case EXTENSION_STYLE_ECLIPSE_WITHOUT_MENU: if (SystemInfo.isWindows()) { EclipseWindowsUtils.initClassDefaults(uiDefaults); EclipseWindowsUtils.initComponentDefaults(uiDefaults); } else { EclipseMetalUtils.initClassDefaults(uiDefaults); EclipseMetalUtils.initComponentDefaults(uiDefaults); } break; case EXTENSION_STYLE_ECLIPSE3X: if (SystemInfo.isWindows()) { Eclipse3xWindowsUtils.initClassDefaultsWithMenu(uiDefaults); Eclipse3xWindowsUtils.initComponentDefaultsWithMenu(uiDefaults); } else { Eclipse3xMetalUtils.initClassDefaults(uiDefaults); Eclipse3xMetalUtils.initComponentDefaults(uiDefaults); } break; case EXTENSION_STYLE_ECLIPSE3X_WITHOUT_MENU: if (SystemInfo.isWindows()) { Eclipse3xWindowsUtils.initClassDefaults(uiDefaults); Eclipse3xWindowsUtils.initComponentDefaults(uiDefaults); } else { Eclipse3xMetalUtils.initClassDefaults(uiDefaults); Eclipse3xMetalUtils.initComponentDefaults(uiDefaults); } break; case EXTENSION_STYLE_VSNET: if (SystemInfo.isWindows()) { VsnetWindowsUtils.initClassDefaultsWithMenu(uiDefaults); VsnetWindowsUtils.initComponentDefaultsWithMenu(uiDefaults); } else { VsnetMetalUtils.initComponentDefaults(uiDefaults); VsnetMetalUtils.initClassDefaults(uiDefaults); } break; case EXTENSION_STYLE_VSNET_WITHOUT_MENU: if (SystemInfo.isWindows()) { VsnetWindowsUtils.initClassDefaults(uiDefaults); VsnetWindowsUtils.initComponentDefaults(uiDefaults); } else { VsnetMetalUtils.initComponentDefaults(uiDefaults); VsnetMetalUtils.initClassDefaults(uiDefaults); } break; case EXTENSION_STYLE_XERTO: if (SystemInfo.isWindows()) { XertoWindowsUtils.initClassDefaultsWithMenu(uiDefaults); XertoWindowsUtils.initComponentDefaultsWithMenu(uiDefaults); } else { XertoMetalUtils.initComponentDefaults(uiDefaults); XertoMetalUtils.initClassDefaults(uiDefaults); } break; case EXTENSION_STYLE_XERTO_WITHOUT_MENU: if (SystemInfo.isWindows()) { XertoWindowsUtils.initClassDefaults(uiDefaults); XertoWindowsUtils.initComponentDefaults(uiDefaults); } else { XertoMetalUtils.initComponentDefaults(uiDefaults); XertoMetalUtils.initClassDefaults(uiDefaults); } break; } } uiDefaults.put(JIDE_EXTENSION_INSTALLED, Boolean.TRUE); customize(lnf.getClass().getName(), uiDefaults); UIDefaultsCustomizer[] customizers = getUIDefaultsCustomizers(); for (UIDefaultsCustomizer customizer : customizers) { if (customizer != null) { customizer.customize(uiDefaults); } } } private static void workAroundSwingIssues() { Object o = UIManager.get("PopupMenu.selectedWindowInputMapBindings.RightToLeft"); if (o instanceof Object[]) { Object[] mapArray = (Object[]) o; for (Object item : mapArray) { if ("DOWN".equals(item)) { return; // maybe Swing fixed the bug later, no need to work around any more. } } Object[] newMapArray = new Object[mapArray.length + 14]; System.arraycopy(mapArray, 0, newMapArray, 0, mapArray.length); int i = mapArray.length; newMapArray[i++] = "DOWN"; newMapArray[i++] = "selectNext"; newMapArray[i++] = "UP"; newMapArray[i++] = "selectPrevious"; newMapArray[i++] = "KP_DOWN"; newMapArray[i++] = "selectNext"; newMapArray[i++] = "KP_UP"; newMapArray[i++] = "selectPrevious"; newMapArray[i++] = "ENTER"; newMapArray[i++] = "return"; newMapArray[i++] = "SPACE"; newMapArray[i++] = "return"; newMapArray[i++] = "ESCAPE"; newMapArray[i] = "cancel"; UIManager.put("PopupMenu.selectedWindowInputMapBindings.RightToLeft", newMapArray); } } private static Map _defaultInitializers; private static Map _defaultCustomizers; /** * Registers a UIDefaultsInitializer with a L&F. Note that you can only register one initializer for a L&F. * * @param lnfClassName full class name of the L&F * @param initializerClassName full class name of the UIDefaultInitializer */ public static void registerDefaultInitializer(String lnfClassName, String initializerClassName) { if (_defaultInitializers == null) { _defaultInitializers = new HashMap(); } _defaultInitializers.put(lnfClassName, initializerClassName); } /** * Unregisters a UIDefaultsInitializer for L&F. * * @param lnfClassName full class name of the L&F */ public static void unregisterDefaultInitializer(String lnfClassName) { if (_defaultInitializers != null) { _defaultInitializers.remove(lnfClassName); } } /** * Clears all registered initializers. */ public static void clearDefaultInitializers() { if (_defaultInitializers != null) { _defaultInitializers.clear(); } } /** * Registers a UIDefaultsCustomizer with a L&F. Note that you can only register one customizer for a L&F. * * @param lnfClassName full class name of the L&F * @param customizerClassName full class name of the UIDefaultsCustomizer */ public static void registerDefaultCustomizer(String lnfClassName, String customizerClassName) { if (_defaultCustomizers == null) { _defaultCustomizers = new HashMap(); } _defaultCustomizers.put(lnfClassName, customizerClassName); } /** * Unregisters a UIDefaultCustomizer for L&F. * * @param lnfClassName full class name of the L&F */ public static void unregisterDefaultCustomizer(String lnfClassName) { if (_defaultCustomizers != null) { _defaultCustomizers.remove(lnfClassName); } } /** * Clears all registered customizers. */ public static void clearDefaultCustomizers() { if (_defaultCustomizers != null) { _defaultCustomizers.clear(); } } private static void initialize(String lnfClassName, UIDefaults uiDefaults) { Vector lookup = new Vector(); Vector classLookup = new Vector(); classLookup.insertElementAt(lnfClassName, 0); String lnf = guessLookAndFeelName(lnfClassName); if (lnf != null && lnf.trim().length() > 0) lookup.insertElementAt(lnf, 0); try { Class clazz = Class.forName(lnfClassName); while (clazz != null) { Class superclass = clazz.getSuperclass(); if (superclass != null && LookAndFeel.class.isAssignableFrom(superclass)) { lnfClassName = superclass.getName(); } else { break; } classLookup.insertElementAt(lnfClassName, 0); lnf = guessLookAndFeelName(lnfClassName); if (lnf != null && lnf.trim().length() > 0) lookup.insertElementAt(lnf, 0); clazz = superclass; } } catch (ClassNotFoundException e) { // ignore } for (String s : classLookup) { String initializer = findDefaultInitializer(s); if (initializer != null) { invokeInitialize(uiDefaults, initializer); } } for (String s : lookup) { String initializer = getDefaultInitializer(s); if (initializer != null) { invokeInitialize(uiDefaults, initializer); } } } private static void invokeInitialize(UIDefaults uiDefaults, String initializer) { try { Class clazz = Class.forName(initializer); Object o = clazz.newInstance(); Method method = o.getClass().getMethod("initialize", UIDefaults.class); method.invoke(o, uiDefaults); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { // ignore } } private static String getDefaultInitializer(String lnf) { return "com.jidesoft.plaf." + lnf.toLowerCase() + "." + lnf + "Initializer"; } private static String findDefaultInitializer(String lnfClassName) { if (_defaultInitializers != null) { String s = _defaultInitializers.get(lnfClassName); if (s != null) { return s; } } return null; } private static void customize(String lnfClassName, UIDefaults uiDefaults) { Vector lookup = new Vector(); Vector classLookup = new Vector(); classLookup.insertElementAt(lnfClassName, 0); String lnf = guessLookAndFeelName(lnfClassName); if (lnf != null && lnf.trim().length() > 0) lookup.insertElementAt(lnf, 0); try { Class clazz = Class.forName(lnfClassName); while (clazz != null) { Class superclass = clazz.getSuperclass(); if (superclass != null && LookAndFeel.class.isAssignableFrom(superclass)) { lnfClassName = superclass.getName(); } else { break; } classLookup.insertElementAt(lnfClassName, 0); lnf = guessLookAndFeelName(lnfClassName); if (lnf != null && lnf.trim().length() > 0) lookup.insertElementAt(lnf, 0); clazz = superclass; } } catch (ClassNotFoundException e) { // ignore } for (String s : classLookup) { String customizer = findDefaultCustomizer(s); if (customizer != null) { invokeCustomize(uiDefaults, customizer); } } for (String s : lookup) { String customizer = getDefaultCustomizer(s); if (customizer != null) { invokeCustomize(uiDefaults, customizer); } } } private static void invokeCustomize(UIDefaults uiDefaults, String customizer) { try { Class clazz = Class.forName(customizer); Object o = clazz.newInstance(); Method method = o.getClass().getMethod("customize", UIDefaults.class); method.invoke(o, uiDefaults); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { // ignore } } private static String getDefaultCustomizer(String lnf) { return "com.jidesoft.plaf." + lnf.toLowerCase() + "." + lnf + "Customizer"; } private static String findDefaultCustomizer(String lnfClassName) { if (_defaultCustomizers != null) { String s = _defaultCustomizers.get(lnfClassName); if (s != null) { return s; } } return null; } private static String guessLookAndFeelName(String lnfClassName) { int start = lnfClassName.lastIndexOf(".") + 1; if (lnfClassName.endsWith("LookAndFeel")) { return lnfClassName.substring(start, lnfClassName.length() - "LookAndFeel".length()); } return null; } /** * Returns whether or not the L&F is in classpath. This method will check for pre-installed L&Fs using {@link * #setLnfInstalled(String, boolean)}. If the L&F is not pre-installed, we will try to use class loader to load the * class to determine if the L&F is installed. If you don't want us to load the class, you can call {@link * #setLoadLookAndFeelClass(boolean)} false. If so, we will solely depend on the setLnfInstalled method to determine * if the L&F is installed. * * @param lnfName the L&F name. * * @return true if the L&F is in classpath, false otherwise */ public static boolean isLnfInstalled(String lnfName) { String installed = _installedLookAndFeels.get(lnfName); if (installed != null) { return LAF_INSTALLED.equals(installed); } return isLoadLookAndFeelClass() && loadLnfClass(lnfName) != null; } public static ClassLoader getUIManagerClassLoader() { Object cl = UIManager.get("ClassLoader"); if (cl instanceof ClassLoader) { return (ClassLoader) cl; } ClassLoader classLoader = LookAndFeelFactory.class.getClassLoader(); if (classLoader == null) { classLoader = ClassLoader.getSystemClassLoader(); } return classLoader; } /** * Checks if the L&F is the L&F or a subclass of the L&F. * * @param lnf the full class name of the L&F (including the package). * * @return true or false. */ public static boolean isLnfInUse(String lnf) { return !(_installedLookAndFeels.containsKey(lnf) && (_installedLookAndFeels.get(lnf) == null || _installedLookAndFeels.get(lnf).equals(LAF_NOT_INSTALLED))) && isAssignableFrom(lnf, UIManager.getLookAndFeel().getClass()); } /** * Tells the LookAndFeelFactory whether a L&F is installed. We will try to instantiate the class when {@link * #isLnfInstalled(String)} is called to determine if the class is in the class path. However you can call this * method to tell if the L&F is available without us instantiating the class. * * @param lnfName the L&F name. * @param installed true or false. */ public static void setLnfInstalled(String lnfName, boolean installed) { _installedLookAndFeels.put(lnfName, installed ? LAF_INSTALLED : LAF_NOT_INSTALLED); } private static Class loadLnfClass(String lnfName) { try { Class clazz = getUIManagerClassLoader().loadClass(lnfName); Map map = new HashMap(_installedLookAndFeels); map.put(lnfName, LAF_INSTALLED); _installedLookAndFeels = map; return clazz; } catch (ClassNotFoundException e) { Map map = new HashMap(_installedLookAndFeels); map.put(lnfName, LAF_NOT_INSTALLED); _installedLookAndFeels = map; return null; } } private static boolean isAssignableFrom(String lnfName, Class cls) { if (lnfName.equals(cls.getName())) { return true; } Class cl = loadLnfClass(lnfName); return cl != null && cl.isAssignableFrom(cls); } /** * Returns whether or not the Aqua L&F is in classpath. * * @return true if aqua L&F is in classpath, false otherwise */ public static boolean isAquaLnfInstalled() { return isLnfInstalled(AQUA_LNF_6) || isLnfInstalled(AQUA_LNF); } /** * Returns whether or not the Quaqua L&F is in classpath. * * @return true if Quaqua L&F is in classpath, false otherwise */ public static boolean isQuaquaLnfInstalled() { return isLnfInstalled(QUAQUA_LNF); } /** * Returns whether alloy L&F is in classpath * * @return true alloy L&F is in classpath, false otherwise */ public static boolean isAlloyLnfInstalled() { return isLnfInstalled(ALLOY_LNF); } /** * Returns whether Bizlaf L&F is in classpath * * @return true Bizlaf L&F is in classpath, false otherwise */ public static boolean isBizlafLnfInstalled() { return isLnfInstalled(BIZ_LNF); } /** * Returns whether GTK L&F is in classpath * * @return true GTK L&F is in classpath, false otherwise */ public static boolean isGTKLnfInstalled() { return isLnfInstalled(GTK_LNF); } /** * Returns whether Plastic3D L&F is in classpath * * @return true Plastic3D L&F is in classpath, false otherwise */ public static boolean isPlastic3DLnfInstalled() { return isLnfInstalled(PLASTIC3D_LNF); } /** * Returns whether Plastic3D L&F is in classpath * * @return true Plastic3D L&F is in classpath, false otherwise * * @deprecated replace by {@link #isPlastic3DLnfInstalled()} */ @Deprecated public static boolean isPlastic3D13LnfInstalled() { return isLnfInstalled(PLASTIC3D_LNF); } /** * Returns whether PlasticXP L&F is in classpath * * @return true Plastic3D L&F is in classpath, false otherwise */ public static boolean isPlasticXPLnfInstalled() { return isLnfInstalled(PLASTICXP_LNF); } /** * Returns whether Tonic L&F is in classpath * * @return true Tonic L&F is in classpath, false otherwise */ public static boolean isTonicLnfInstalled() { return isLnfInstalled(TONIC_LNF); } /** * Returns whether A03 L&F is in classpath * * @return true A03 L&F is in classpath, false otherwise */ public static boolean isA03LnfInstalled() { return isLnfInstalled(A03_LNF); } /** * Returns whether or not the Pgs L&F is in classpath. * * @return true if pgs L&F is in classpath, false otherwise */ public static boolean isPgsLnfInstalled() { return isLnfInstalled(PGS_LNF); } /** * Returns whether or not the Synthetica L&F is in classpath. * * @return true if Synthetica L&F is in classpath, false otherwise */ public static boolean isSyntheticaLnfInstalled() { return isLnfInstalled(SYNTHETICA_LNF); } /** * Returns whether or not the Nimbus L&F is in classpath. * * @return true if Nimbus L&F is in classpath, false otherwise */ public static boolean isNimbusLnfInstalled() { UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels(); for (UIManager.LookAndFeelInfo info : infos) { if (info.getClassName().indexOf(NIMBUS_LNF_NAME) != -1) { return true; } } return false; } /** * Install the default L&F. In this method, we will look at system property "swing.defaultlaf" first. If the value * is set and it's not an instance of Synth L&F, we will use it. Otherwise, we will use Metal L&F is OS is Linux or * UNIX and use UIManager.getSystemLookAndFeelClassName() for other OS. In addition, we will add JIDE extension to * it. */ public static void installDefaultLookAndFeelAndExtension() { installDefaultLookAndFeel(); // to add additional UIDefault for JIDE components LookAndFeelFactory.installJideExtension(); } /** * Install the default L&F. In this method, we will look at system property "swing.defaultlaf" first. If the value * is set and it's not an instance of Synth L&F, we will use it. Otherwise, we will use Metal L&F is OS is Linux or * UNIX and use UIManager.getSystemLookAndFeelClassName() for other OS. */ public static void installDefaultLookAndFeel() { try { String lnfName = SecurityUtils.getProperty("swing.defaultlaf", null); if (lnfName == null) { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } else { UIManager.setLookAndFeel(lnfName); } } catch (Exception e) { e.printStackTrace(); } } /** * Gets current L&F. * * @return the current L&F. */ public static LookAndFeel getLookAndFeel() { return _lookAndFeel; } /** * Gets current style. * * @return the current style. */ public static int getStyle() { return _style; } /** * Gets all UIDefaults customizers. * * @return an array of UIDefaults customizers. */ public static UIDefaultsCustomizer[] getUIDefaultsCustomizers() { return _uiDefaultsCustomizers.toArray(new UIDefaultsCustomizer[_uiDefaultsCustomizers.size()]); } /** * Adds your own UIDefaults customizer. You need to add it before installJideExtension() is called but the actual * customize() code will be called after installJideExtension() is called. *
     * For example, we use "JideButton.font" as the UIDefault for the JideButton font. If you want
     * to use another font, you can do
     * LookAndFeelFactory.addUIDefaultsCustomizer(new LookAndFeelFactory.UIDefaultsCustomizer() {
     *     public void customize(UIDefaults defaults) {
     *         defaults.put("JideButton.font", whateverFont);
     *     }
     * });
     * LookAndFeelFactory.installJideExtension();
     * 
* * @param uiDefaultsCustomizer the UIDefaultsCustomizer */ public static void addUIDefaultsCustomizer(UIDefaultsCustomizer uiDefaultsCustomizer) { if (!_uiDefaultsCustomizers.contains(uiDefaultsCustomizer)) { _uiDefaultsCustomizers.add(uiDefaultsCustomizer); } } /** * Removes an existing UIDefaults customizer you added before. * * @param uiDefaultsCustomizer the UIDefaultsCustomizer */ public static void removeUIDefaultsCustomizer(UIDefaultsCustomizer uiDefaultsCustomizer) { _uiDefaultsCustomizers.remove(uiDefaultsCustomizer); } /** * Gets all UIDefaults initializers. * * @return an array of UIDefaults initializers. */ public static UIDefaultsInitializer[] getUIDefaultsInitializers() { return _uiDefaultsInitializers.toArray(new UIDefaultsInitializer[_uiDefaultsInitializers.size()]); } /** * Adds your own UIDefaults initializer. This initializer will be called before installJideExtension() is called. *

* Here is how you use it. For example, we use the color of UIDefault "activeCaption" to get the active title color * which we will use for active title bar color in JIDE components. If the L&F you are using doesn't set this * UIDefault, we might throw NPE later in the code. To avoid this, you call *

     * LookAndFeelFactory.addUIDefaultsInitializer(new LookAndFeelFactory.UIDefaultsInitializer() {
     *     public void initialize(UIDefaults defaults) {
     *         defaults.put("activeCaption", whateverColor);
     *     }
     * });
     * UIManager.setLookAndFeel(...); // set whatever L&F
     * LookAndFeelFactory.installJideExtension(); // install the UIDefaults needed by the JIDE
     * components
     * 
* * @param uiDefaultsInitializer the UIDefaultsInitializer. */ public static void addUIDefaultsInitializer(UIDefaultsInitializer uiDefaultsInitializer) { if (!_uiDefaultsInitializers.contains(uiDefaultsInitializer)) { _uiDefaultsInitializers.add(uiDefaultsInitializer); } } /** * Removes an existing UIDefaults initializer you added before. * * @param uiDefaultsInitializer the UIDefaultsInitializer */ public static void removeUIDefaultsInitializer(UIDefaultsInitializer uiDefaultsInitializer) { _uiDefaultsInitializers.remove(uiDefaultsInitializer); } @SuppressWarnings({"UseOfSystemOutOrSystemErr"}) public static void verifyDefaults(UIDefaults table, Object[] keyValueList) { for (int i = 0, max = keyValueList.length; i < max; i += 2) { Object value = keyValueList[i + 1]; if (value == null) { System.out.println("The value for " + keyValueList[i] + " is null"); } else { Object oldValue = table.get(keyValueList[i]); if (oldValue != null) { System.out.println("The value for " + keyValueList[i] + " exists which is " + oldValue); } } } } /** * Puts a list of UIDefault to the UIDefaults table. The keyValueList is an array with a key and value in pair. If * the value is null, this method will remove the key from the table. If the table already has a value for the key, * the new value will be ignored. This is the difference from {@link #putDefaults(javax.swing.UIDefaults, Object[])} * method. You should use this method in {@link UIDefaultsInitializer} so that it fills in the UIDefault value only * when it is missing. * * @param table the ui defaults table * @param keyValueArray the key value array. It is in the format of a key followed by a value. */ public static void putDefaults(UIDefaults table, Object[] keyValueArray) { for (int i = 0, max = keyValueArray.length; i < max; i += 2) { Object value = keyValueArray[i + 1]; if (value == null) { table.remove(keyValueArray[i]); } else { if (table.get(keyValueArray[i]) == null) { table.put(keyValueArray[i], value); } } } } /** * Puts a list of UIDefault to the UIDefaults table. The keyValueList is an array with a key and value in pair. If * the value is null, this method will remove the key from the table. Otherwise, it will put the new value in even * if the table already has a value for the key. This is the difference from {@link * #putDefaults(javax.swing.UIDefaults, Object[])} method. You should use this method in {@link * UIDefaultsCustomizer} because you always want to override the existing value using the new value. * * @param table the ui defaults table * @param keyValueArray the key value array. It is in the format of a key followed by a value. */ public static void overwriteDefaults(UIDefaults table, Object[] keyValueArray) { for (int i = 0, max = keyValueArray.length; i < max; i += 2) { Object value = keyValueArray[i + 1]; if (value == null) { table.remove(keyValueArray[i]); } else { table.put(keyValueArray[i], value); } } } private static int _productsUsed = -1; public static int getProductsUsed() { if (_productsUsed == -1) { _productsUsed = 0; try { Class.forName("com.jidesoft.docking.Product"); _productsUsed |= PRODUCT_DOCK; } catch (Throwable e) { // } try { Class.forName("com.jidesoft.action.Product"); _productsUsed |= PRODUCT_ACTION; } catch (Throwable e) { // } try { Class.forName("com.jidesoft.document.Product"); _productsUsed |= PRODUCT_COMPONENTS; } catch (Throwable e) { // } try { Class.forName("com.jidesoft.grid.Product"); _productsUsed |= PRODUCT_GRIDS; } catch (Throwable e) { // } try { Class.forName("com.jidesoft.wizard.Product"); _productsUsed |= PRODUCT_DIALOGS; } catch (Throwable e) { // } try { Class.forName("com.jidesoft.pivot.Product"); _productsUsed |= PRODUCT_PIVOT; } catch (Throwable e) { // } try { Class.forName("com.jidesoft.shortcut.Product"); _productsUsed |= PRODUCT_SHORTCUT; } catch (Throwable e) { // } try { Class.forName("com.jidesoft.editor.Product"); _productsUsed |= PRODUCT_CODE_EDITOR; } catch (Throwable e) { // } try { Class.forName("com.jidesoft.rss.Product"); _productsUsed |= PRODUCT_FEEDREADER; } catch (Throwable e) { // } try { Class.forName("com.jidesoft.treemap.Product"); _productsUsed |= PRODUCT_TREEMAP; } catch (Throwable e) { // } try { Class.forName("com.jidesoft.chart.Product"); _productsUsed |= PRODUCT_CHARTS; } catch (Throwable e) { // } try { Class.forName("com.jidesoft.diff.Product"); _productsUsed |= PRODUCT_DIFF; } catch (Throwable e) { // } } return _productsUsed; } /** * Sets the products you will use. This is needed so that LookAndFeelFactory knows what UIDefault to initialize. For * example, if you use only JIDE Docking Framework and JIDE Grids, you should call * setProductUsed(ProductNames.PRODUCT_DOCK | ProductNames.PRODUCT_GRIDS) so that we don't initialize * UIDefaults needed by any other products. If you use this class as part of JIDE Common Layer open source project, * you should call setProductUsed(ProductNames.PRODUCT_COMMON). If you want to use all JIDE products, * you should call setProductUsed(ProductNames.PRODUCT_ALL) * * @param productsUsed a bit-wise OR of product values defined in {@link com.jidesoft.utils.ProductNames}. */ public static void setProductsUsed(int productsUsed) { _productsUsed = productsUsed; } /** * Checks if the current L&F uses decorated frames. * * @return true if the current L&F uses decorated frames. Otherwise false. */ public static boolean isCurrentLnfDecorated() { return !isLnfInstalled(SYNTHETICA_LNF) || !isLnfInUse(SYNTHETICA_LNF); } /** * Gets the flag indicating if JIDE will try to load the LnF class when {@link #isLnfInstalled(String)} is invoked. * * @return true if JIDE will try to load the LnF class. Otherwise false * * @see #setLoadLookAndFeelClass(boolean) * @since 3.2.0 */ public static boolean isLoadLookAndFeelClass() { return _loadLookAndFeelClass; } /** * Sets the flag indicating if JIDE will try to load the L&F class when {@link #isLnfInstalled(String)} is invoked. *

* By default, this flag is true. However, it may cause unexpected class loading, which may be a performance issue * for web start applications. If this is a concern to your application, please try to set this flag to false and * invoke {@link #setLnfInstalled(String, boolean)} to make {@link #isLnfInstalled(String)} returns correct value as * you wish. * * @param loadLookAndFeelClass the flag * * @since 3.2.0 */ public static void setLoadLookAndFeelClass(boolean loadLookAndFeelClass) { _loadLookAndFeelClass = loadLookAndFeelClass; } public static void main(String[] args) { // LookAndFeelFactory.setLnfInstalled(AQUA_LNF, false); // System.out.println(LookAndFeelFactory.isLnfInstalled(AQUA_LNF)); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy