/****************************************************************************** * Product: Adempiere ERP & CRM Smart Business Solution * * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * * by the Free Software Foundation. This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * * For the text or an alternative of this public license, you may reach us * * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * * or via info@compiere.org or http://www.compiere.org/license.html * *****************************************************************************/ package org.adempiere.plaf; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Insets; import java.awt.Toolkit; import java.awt.Window; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.ResourceBundle; import java.util.logging.Logger; import javax.swing.ImageIcon; import javax.swing.JOptionPane; import javax.swing.LookAndFeel; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.plaf.metal.MetalLookAndFeel; import javax.swing.plaf.metal.MetalTheme; import org.compiere.plaf.CompiereLookAndFeel; import org.compiere.plaf.CompiereThemeBlueMetal; import org.compiere.plaf.CompiereThemeIce; import org.compiere.swing.CButton; import org.compiere.swing.ColorBlind; import org.compiere.swing.ExtendedTheme; import org.compiere.util.Ini; import org.compiere.util.ValueNamePair; import org.persian.plaf.PersianLookAndFeel; import org.persian.plaf.PersianThemeHandler; import com.jgoodies.looks.plastic.PlasticTheme; import de.muntjak.tinylookandfeel.TinyDefaultTheme; import de.muntjak.tinylookandfeel.TinyLookAndFeel; /** * Variable Pluggable Look And Feel. * Provides an easy access to the required currently active PLAF information * * @author Jorg Janke * @version $Id: AdempierePLAF.java,v 1.3 2006/07/30 00:52:23 jjanke Exp $ * * @author Low Heng Sin * @version 2006-11-27 */ public final class AdempierePLAF { /** Logger */ private static Logger log = Logger.getLogger(AdempierePLAF.class.getName()); /****** Background *******************************************************/ /** * Return Normal field background color "text". * Windows = white * @return Color */ public static Color getFieldBackground_Normal() { // window => white return ColorBlind.getDichromatColor(UIManager.getColor("text")); } // getFieldBackground_Normal /** * Return Error field background * @return Color */ public static Color getFieldBackground_Error() { Color c = UIManager.getColor(ExtendedTheme.ERROR_BG_KEY); if (c == null) c = ExtendedTheme.DEFAULT_ERROR_BG; return ColorBlind.getDichromatColor(c); } // getFieldBackground_Error /** * Return Mandatory field background color * @return Color */ public static Color getFieldBackground_Mandatory() { Color c = UIManager.getColor(ExtendedTheme.MANDATORY_BG_KEY); if (c == null) c = ExtendedTheme.DEFAULT_MANDATORY_BG; return ColorBlind.getDichromatColor(c); } // getFieldBackground_Mandatory /** * Return Inactive field background color * @return Color */ public static Color getFieldBackground_Inactive() { Color c = UIManager.getColor(ExtendedTheme.INACTIVE_BG_KEY); if ( c != null ) return ColorBlind.getDichromatColor(c); else return getFieldBackground_Normal(); } // getFieldBackground_Inactive /** * Return Selected field background color * @return Color */ public static Color getFieldBackground_Selected() { Color c = UIManager.getColor(ExtendedTheme.SELECTED_BG_KEY); if (c == null) c = ExtendedTheme.DEFAULT_SELECTED_BG; return ColorBlind.getDichromatColor(c); } // getFieldBackground_Selected /** * Return ReadOnly field background color * @return Color */ public static Color getFieldBackground_ReadOnly() { Color c = UIManager.getColor(ExtendedTheme.READONLY_BG_KEY); if (c == null) c = ExtendedTheme.DEFAULT_READONLY_BG; return ColorBlind.getDichromatColor(c); } // getFieldBackground_ReadOnly /** * Return form background color "control". * Windows = lightGray * @return Color */ public static Color getFormBackground() { return ColorBlind.getDichromatColor(UIManager.getColor("control")); } // getFormBackground /** * Info Background Color "info" * Windows = info (light yellow) * @return Color */ public static Color getInfoBackground() { Color c = UIManager.getColor(ExtendedTheme.INFO_BG_KEY); if (c == null) c = UIManager.getColor("info"); return ColorBlind.getDichromatColor(c); } // getInfoBackground /****** Text *************************************************************/ /** * Normal field text foreground color "textText" * Windows = black * @return Color */ public static Color getTextColor_Normal() { return ColorBlind.getDichromatColor(UIManager.getColor("textText")); } // getText_Normal /** * OK Text Foreground Color (Theme) * @return Color */ public static Color getTextColor_OK() { return getTextColor_Normal(); } // getText_OK /** * Issue Text Foreground Color (Theme) * @return Color */ public static Color getTextColor_Issue() { Color c = UIManager.getColor(ExtendedTheme.ERROR_FG_KEY); if (c == null) c = ExtendedTheme.DEFAULT_ERROR_FG; return ColorBlind.getDichromatColor(c); } // getText_Issue /** * Label Text foreground Color "controlText" * Windows = black * @return Color */ public static Color getTextColor_Label() { return ColorBlind.getDichromatColor(UIManager.getColor("controlText")); } // getTextColor_Label /** * Get Primary1 * @return primary 1 */ public static Color getPrimary1() { return ColorBlind.getDichromatColor(MetalLookAndFeel.getCurrentTheme().getPrimaryControlDarkShadow()); } /** * Get Primary2 * @return primary 2 */ public static Color getPrimary2() { return ColorBlind.getDichromatColor(MetalLookAndFeel.getCurrentTheme().getPrimaryControlShadow()); } /** * Get Primary3 * @return primary 3 */ public static Color getPrimary3() { return ColorBlind.getDichromatColor(MetalLookAndFeel.getCurrentTheme().getPrimaryControl()); } /** * Get Secondary 1 * @return secondary 1 */ public static Color getSecondary1() { return ColorBlind.getDichromatColor(MetalLookAndFeel.getCurrentTheme().getControlDarkShadow()); } /** * Get Secondary 2 * @return secondary 2 */ public static Color getSecondary2() { return ColorBlind.getDichromatColor(MetalLookAndFeel.getCurrentTheme().getControlShadow()); } /** * Get Secondary 3 * @return secondary 3 */ public static Color getSecondary3() { return ColorBlind.getDichromatColor(MetalLookAndFeel.getCurrentTheme().getControl()); } /****** Fonts ************************************************************/ /** * Get Header Font (window title font) * @return font */ public static Font getFont_Header() { return MetalLookAndFeel.getWindowTitleFont(); } // getFont_Header /** * Get Field Font * @return font */ public static Font getFont_Field() { return UIManager.getFont("TextField.font"); } // getFont_Field /** * Get Label Font * @return font */ public static Font getFont_Label() { return UIManager.getFont("Label.font"); } // setFont_Label /** * Get Small (report) Font * @return font */ public static Font getFont_Small() { return MetalLookAndFeel.getSubTextFont(); } // setFont_Small /****** Available L&F ****************************************************/ /** Available Looks */ private static ValueNamePair[] s_looks = null; /** Default PLAF */ private static ValueNamePair s_defaultPLAF = null; /** Available Themes */ private static ValueNamePair[] s_metalThemes = null; private static ValueNamePair[] s_plasticThemes = null; private static ValueNamePair[] s_persianThemes = null; //default theme private static ValueNamePair s_vp_compiereTheme = null; private static ValueNamePair s_vp_metalTheme = null; //e-evolution vpj-cd 19102006 private static ValueNamePair s_vp_adempiereTheme = null; //e-evolution vpj-cd 1910200sky private static ValueNamePair s_vp_persianTheme = null; /** * Static Initializer. * - Fill available PLAFs and Themes */ static { ArrayList<ValueNamePair> plafList = new ArrayList<ValueNamePair>(); //e-evolution vpj-cd 19102006 ValueNamePair vp = null; ArrayList<ValueNamePair> metalThemes = new ArrayList<ValueNamePair>(); ArrayList<ValueNamePair> plasticThemes = new ArrayList<ValueNamePair>(); //omidp ValueNamePair TinyLafvp = null; ArrayList<ValueNamePair> persianThemes = new ArrayList<ValueNamePair>(); try { Class.forName("com.jgoodies.looks.plastic.Plastic3DLookAndFeel"); vp = new ValueNamePair("org.adempiere.plaf.AdempiereLookAndFeel", org.adempiere.plaf.AdempiereLookAndFeel.NAME); plafList.add(vp); s_vp_adempiereTheme = new ValueNamePair("org.adempiere.plaf.AdempiereTheme", AdempiereThemeInnova.NAME); plasticThemes.add (s_vp_adempiereTheme); //omidp Class.forName("de.muntjak.tinylookandfeel.TinyLookAndFeel"); TinyLafvp = new ValueNamePair("org.persian.plaf.PersianLookAndFeel",org.persian.plaf.PersianLookAndFeel.NAME); plafList.add(TinyLafvp); s_vp_persianTheme = new ValueNamePair("org.persian.plaf.PersianTheme",PersianThemeHandler.NAME); persianThemes.add(s_vp_persianTheme); List<?> installedThemes = AdempiereLookAndFeel.getInstalledThemes(); for(Object t : installedThemes) { MetalTheme theme = (MetalTheme)t; vp = new ValueNamePair(theme.getClass().getName(), theme.getName()); plasticThemes.add(vp); } } catch (Exception e) { log.severe("Plastic look and feel not found"); } //e-evolution vpj-cd 19102006 vp = new ValueNamePair("org.compiere.plaf.CompiereLookAndFeel", CompiereLookAndFeel.NAME); plafList.add (vp); //Metal s_vp_compiereTheme = new ValueNamePair("org.compiere.plaf.CompiereThemeBlueMetal", CompiereThemeBlueMetal.NAME); metalThemes.add (s_vp_compiereTheme); metalThemes.add (new ValueNamePair("org.compiere.plaf.CompiereThemeIce", CompiereThemeIce.NAME)); s_vp_metalTheme = new ValueNamePair("javax.swing.plaf.metal.OceanTheme", "Ocean"); metalThemes.add (s_vp_metalTheme); metalThemes.add (new ValueNamePair("javax.swing.plaf.metal.DefaultMetalTheme", "Steel")); metalThemes.add (new ValueNamePair("org.compiere.plaf.AquaTheme", "Aqua")); metalThemes.add (new ValueNamePair("org.compiere.plaf.CharcoalTheme", "Charcoal")); metalThemes.add (new ValueNamePair("org.compiere.plaf.ContrastTheme", "Contrast")); metalThemes.add (new ValueNamePair("org.compiere.plaf.EmeraldTheme", "Emerald")); metalThemes.add (new ValueNamePair("org.compiere.plaf.RubyTheme", "Ruby")); // Install discovered PLAFs for (int i = 0; i < plafList.size(); i++) { vp = plafList.get(i); UIManager.installLookAndFeel(vp.getName(), vp.getValue()); } // Fill Available PLAFs plafList = new ArrayList<ValueNamePair>(); UIManager.LookAndFeelInfo[] lfInfo = UIManager.getInstalledLookAndFeels(); for (int i = 0; i < lfInfo.length; i++) { vp = new ValueNamePair (lfInfo[i].getClassName(), lfInfo[i].getName()); plafList.add(vp); if (lfInfo[i].getName().equals(org.adempiere.plaf.AdempiereLookAndFeel.NAME)) { s_defaultPLAF = vp; log.finest(vp.getName() + " (default)"); } else log.finest(vp.getName()); } s_looks = new ValueNamePair[plafList.size()]; plafList.toArray(s_looks); // Fill Available Themes s_metalThemes = new ValueNamePair[metalThemes.size()]; metalThemes.toArray(s_metalThemes); //omidp s_persianThemes = new ValueNamePair[persianThemes.size()]; persianThemes.toArray(s_persianThemes); s_plasticThemes = new ValueNamePair[plasticThemes.size()]; plasticThemes.toArray(s_plasticThemes); // // printPLAFDefaults(); } // static Initializer /** * Get available Look And Feels * @return Array of ValueNamePair with name and class of Look and Feel */ public static ValueNamePair[] getPLAFs() { return s_looks; } // getPLAFs /** * Get the list of available Metal or Plastic Themes. * @return Array of Strings with Names of Metal Themes */ public static ValueNamePair[] getThemes () { LookAndFeel l = UIManager.getLookAndFeel(); if ( l instanceof AdempiereLookAndFeel) return s_plasticThemes; else if(l instanceof TinyLookAndFeel) return s_persianThemes;//omidp else if ( l instanceof MetalLookAndFeel) return s_metalThemes; return new ValueNamePair[0]; } // getThemes /************************************************************************** * Set PLAF based on Ini Properties */ public static void setPLAF () { String look = Ini.getProperty(Ini.P_UI_LOOK); String lookTheme = Ini.getProperty(Ini.P_UI_THEME); // Search for PLAF ValueNamePair plaf = null; for (int i = 0; i < s_looks.length; i++) { if (s_looks[i].getName().equals(look)) { plaf = s_looks[i]; break; } } // Search for Theme ValueNamePair theme = null; for (int i = 0; i < s_metalThemes.length; i++) { if (s_metalThemes[i].getName().equals(lookTheme)) { theme = s_metalThemes[i]; break; } } if (theme == null) { for (int i = 0; i < s_plasticThemes.length; i++) { if (s_plasticThemes[i].getName().equals(lookTheme)) { theme = s_plasticThemes[i]; break; } } } // Set PLAF setPLAF (plaf == null ? s_defaultPLAF : plaf, theme, true); } // setPLAF /** * Set PLAF and update Ini * * @param plaf ValueNamePair of the PLAF to be set * @param theme Optional Theme name * @param upateIni Update setting to INI */ public static void setPLAF (ValueNamePair plaf, ValueNamePair theme, boolean updateIni) { if (plaf == null) return; log.config(plaf + (theme == null ? "" : (" - " + theme))); // Look & Feel Class<?> lafClass = null; try { lafClass = Class.forName(plaf.getValue()); } catch (Exception e) { log.severe(e.getMessage()); return; } if ( updateIni ) { Ini.setProperty(Ini.P_UI_LOOK, plaf.getName()); // Optional Theme Ini.setProperty(Ini.P_UI_THEME, ""); } // Default Theme boolean metal = MetalLookAndFeel.class.isAssignableFrom(lafClass); boolean adempiere = AdempiereLookAndFeel.class.isAssignableFrom(lafClass); boolean compiere = CompiereLookAndFeel.class.isAssignableFrom(lafClass); //omidp boolean tiny = PersianLookAndFeel.class.isAssignableFrom(lafClass); if (theme == null && metal) { if (compiere) theme = s_vp_compiereTheme; else if(tiny) theme = s_vp_persianTheme;//omidp else if (adempiere) theme = s_vp_adempiereTheme; else theme = s_vp_metalTheme; } if (theme != null && metal && theme.getValue().length() > 0) { try { Class<?> c = Class.forName(theme.getValue()); MetalTheme t = (MetalTheme)c.newInstance(); if (compiere) CompiereLookAndFeel.setCurrentTheme(t); else if(tiny && t instanceof TinyDefaultTheme) PersianLookAndFeel.setCurrentTheme((TinyDefaultTheme)t); else if (adempiere && t instanceof PlasticTheme) AdempiereLookAndFeel.setCurrentTheme((PlasticTheme)t); else MetalLookAndFeel.setCurrentTheme(t); // if (updateIni) Ini.setProperty(Ini.P_UI_THEME, theme.getName()); } catch (Exception e) { log.severe("Theme - " + e.getMessage()); } } try { UIManager.setLookAndFeel((LookAndFeel)lafClass.newInstance()); } catch (Exception e) { log.severe(e.getMessage()); } log.config(plaf + " - " + theme); // printPLAFDefaults(); } // setPLAF /** * Update UI of this and parent Windows * @param win window */ public static void updateUI (Window win) { if (win == null) return; Window c = win; do { SwingUtilities.updateComponentTreeUI(c); c.invalidate(); c.pack(); c.validate(); c.repaint(); c = c.getOwner(); } while (c != null); } // updateUI /** * Reset PLAF Settings */ public static void reset () { // Clean Theme Properties AdempierePLAF.setPLAF (); } // reset /** * Print current UIDefaults */ public static void printPLAFDefaults () { System.out.println(UIManager.getLookAndFeel()); Object[] keys = UIManager.getLookAndFeelDefaults().keySet().toArray(); Arrays.sort(keys); char lastStart = ' '; for (int i = 0; i < keys.length; i++) { StringBuffer sb = new StringBuffer(); sb.append(keys[i]).append(" = ").append(UIManager.get(keys[i])); if (keys[i].toString().charAt(0) != lastStart) { System.out.println(); lastStart = keys[i].toString().charAt(0); } System.out.println(sb); } } // printPLAFDefaults /** * Is AdempiereL&F the active L&F * @return true if L&F is Adempiere */ public static boolean isActive() { return UIManager.getLookAndFeel() instanceof AdempiereLookAndFeel; } // isActive /*************************************************************************/ static ResourceBundle s_res = ResourceBundle.getBundle("org.compiere.plaf.PlafRes"); /** * Create OK Button * @return OK button */ public static CButton getOKButton() { CButton b = new CButton(); b.setIcon(new ImageIcon(AdempierePLAF.class.getResource("icons/Ok24.gif"))); b.setMargin(new Insets(0,10,0,10)); b.setToolTipText (s_res.getString("OK")); return b; } // getOKButton /** * Create Cancel Button * @return Cancel button */ public static CButton getCancelButton() { CButton b = new CButton(); b.setIcon(new ImageIcon(AdempierePLAF.class.getResource("icons/Cancel24.gif"))); b.setMargin(new Insets(0,10,0,10)); b.setToolTipText (s_res.getString("Cancel")); return b; } // getCancelButton /** * Center Window on Screen and show it * @param window window */ public static void showCenterScreen (Window window) { window.pack(); Dimension sSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension wSize = window.getSize(); window.setLocation(((sSize.width-wSize.width)/2), ((sSize.height-wSize.height)/2)); window.toFront(); window.setVisible(true); } // showCenterScreen /** * Invoke the correct method to set current metal based theme. * Supported look and feel are Metal, Plastic and Compiere. * @param laf Metal based look and feel * @param theme Metal based theme */ public static void setCurrentMetalTheme(MetalLookAndFeel laf, MetalTheme theme) { if (laf instanceof CompiereLookAndFeel) CompiereLookAndFeel.setCurrentTheme(theme); else if (laf instanceof AdempiereLookAndFeel && theme instanceof PlasticTheme) AdempiereLookAndFeel.setCurrentTheme((PlasticTheme)theme); else MetalLookAndFeel.setCurrentTheme(theme); } /************************************************************************** * Start Class With Adempiere Look * @param args first parameter is class to start, if none start PLAF Editor */ public static void main (String[] args) { String jVersion = System.getProperty("java.version"); if (!(jVersion.startsWith("1.5"))) { JOptionPane.showMessageDialog (null, "Require Java Version 1.5 or up - Not " + jVersion, "AdempierePLAF - Version Conflict", JOptionPane.ERROR_MESSAGE); System.exit(1); } // set the defined PLAF Ini.loadProperties (true); setPLAF (); // if (args.length == 0) { return; } String className = args[0]; // find class Class<?> startClass = null; try { startClass = Class.forName(className); } catch (Exception e) { log.severe("Did not find: " + className); e.printStackTrace(); System.exit(1); } // try static main method try { Method[] methods = startClass.getMethods(); for (int i = 0; i < methods.length; i++) { if (Modifier.isStatic(methods[i].getModifiers()) && methods[i].getName().equals("main")) { String[] startArgs = new String[args.length-1]; for (int ii = 1; ii < args.length; ii++) startArgs[ii-i] = args[ii]; methods[i].invoke(null, new Object[] {startArgs}); } return; } } catch (Exception ee) { log.severe("Problems invoking main"); ee.printStackTrace(); } // start the class try { startClass.newInstance(); } catch (Exception e) { log.severe("Cannot start: " + className); e.printStackTrace(); System.exit(1); } } // main } // AdempierePLAF