UIManager.java
上传用户:haobig99
上传日期:2022-06-15
资源大小:369k
文件大小:26k
源码类别:

J2ME

开发平台:

Java

  1. /*
  2.  * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
  3.  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4.  *
  5.  * This code is free software; you can redistribute it and/or modify it
  6.  * under the terms of the GNU General Public License version 2 only, as
  7.  * published by the Free Software Foundation.  Sun designates this
  8.  * particular file as subject to the "Classpath" exception as provided
  9.  * by Sun in the LICENSE file that accompanied this code.
  10.  *
  11.  * This code is distributed in the hope that it will be useful, but WITHOUT
  12.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13.  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14.  * version 2 for more details (a copy is included in the LICENSE file that
  15.  * accompanied this code).
  16.  *
  17.  * You should have received a copy of the GNU General Public License version
  18.  * 2 along with this work; if not, write to the Free Software Foundation,
  19.  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20.  *
  21.  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  22.  * CA 95054 USA or visit www.sun.com if you need additional information or
  23.  * have any questions.
  24.  */
  25. package com.sun.lwuit.plaf;
  26. import com.sun.lwuit.*;
  27. import com.sun.lwuit.events.ActionEvent;
  28. import com.sun.lwuit.events.ActionListener;
  29. import com.sun.lwuit.util.EventDispatcher;
  30. import java.io.ByteArrayInputStream;
  31. import java.io.IOException;
  32. import java.util.Enumeration;
  33. import java.util.Hashtable;
  34. /**
  35.  * Central point singleton managing the look of the application, this class allows us to
  36.  * customize the styles (themes) as well as the look instance.
  37.  *
  38.  * @author Chen Fishbein
  39.  */
  40. public class UIManager {
  41.     private LookAndFeel current = new DefaultLookAndFeel();
  42.     
  43.     private Hashtable styles = new Hashtable();
  44.     private Hashtable selectedStyles = new Hashtable();
  45.     
  46.     private Hashtable themeProps;
  47.     
  48.     private static UIManager instance = new UIManager();
  49.     
  50.     private Style defaultStyle = new Style();
  51.     private Style defaultSelectedStyle = new Style();
  52.     /**
  53.      * This member is used by the resource editor
  54.      */
  55.     static boolean accessible = true;
  56.     
  57.     /**
  58.      * Useful for caching theme images so they are not loaded twice in case 
  59.      * an image reference is used it two places in the theme (e.g. same background
  60.      * to title and menu bar).
  61.      */
  62.     private Hashtable imageCache = new Hashtable();
  63.     
  64.     /**
  65.      * The resource bundle allows us to implicitly localize the UI on the fly, once its
  66.      * installed all internal application strings query the resource bundle and extract
  67.      * their values from this table if applicable.
  68.      */
  69.     private Hashtable resourceBundle;
  70.     
  71.     /**
  72.      * This EventDispatcher holds all listeners who would like to register to
  73.      * Theme refreshed event
  74.      */
  75.     private EventDispatcher themelisteners;
  76.     
  77.     private UIManager(){
  78.         resetThemeProps();
  79.     }
  80.     
  81.     /**
  82.      * Singleton instance method
  83.      * 
  84.      * @return Instance of the ui manager
  85.      */
  86.     public static UIManager getInstance(){
  87.         return instance;
  88.     }
  89.     
  90.     /**
  91.      * Returns the currently installed look and feel
  92.      * 
  93.      * @return the currently installed look and feel
  94.      */
  95.     public LookAndFeel getLookAndFeel(){
  96.         return current;
  97.     }
  98.     
  99.     /**
  100.      * Sets the currently installed look and feel
  101.      * 
  102.      * @param plaf the look and feel for the application
  103.      */    
  104.     public void setLookAndFeel(LookAndFeel plaf){
  105.         current.uninstall();
  106.         current = plaf;
  107.     }
  108.     
  109.     /**
  110.      * Allows a developer to programmatically install a style into the UI manager
  111.      * 
  112.      * @param id the component id matching the given style
  113.      * @param style the style object to install
  114.      */
  115.     public void setComponentStyle(String id, Style style) {
  116.         if(id == null || id.length() == 0){
  117.             //if no id return the default style
  118.             id = "";
  119.         } else {
  120.             id = id + ".";
  121.         }
  122.         
  123.         styles.put(id, style);
  124.     }
  125.     
  126.     /**
  127.      * Allows a developer to programmatically install a style into the UI manager
  128.      *
  129.      * @param id the component id matching the given style
  130.      * @param style the style object to install
  131.      */
  132.     public void setComponentSelectedStyle(String id, Style style) {
  133.         if(id == null || id.length() == 0){
  134.             //if no id return the default style
  135.             id = "";
  136.         } else {
  137.             id = id + ".";
  138.         }
  139.         selectedStyles.put(id, style);
  140.     }
  141.     /**
  142.      * Returns the style of the component with the given id or a <b>new instance</b> of the default
  143.      * style.
  144.      * This method will always return a new style instance to prevent modification of the global
  145.      * style object.
  146.      * 
  147.      * @param id the component id whose style we want
  148.      * @return the appropriate style (this method never returns null)
  149.      */
  150.     public Style getComponentStyle(String id){
  151.         return getComponentStyleImpl(id, false, "");
  152.     }
  153.     
  154.     /**
  155.      * Returns the selected style of the component with the given id or a <b>new instance</b> of the default
  156.      * style.
  157.      * This method will always return a new style instance to prevent modification of the global
  158.      * style object.
  159.      *
  160.      * @param id the component id whose selected style we want
  161.      * @return the appropriate style (this method never returns null)
  162.      */
  163.     public Style getComponentSelectedStyle(String id){
  164.         return getComponentStyleImpl(id, true, "sel#");
  165.     }
  166.     /**
  167.      * Returns a custom style for the component with the given id, this method always returns a
  168.      * new instance. Custom styles allow us to install application specific or component specific
  169.      * style attributes such as pressed, disabled, hover etc.
  170.      *
  171.      * @param id the component id whose custom style we want
  172.      * @param type the style type
  173.      * @return the appropriate style (this method never returns null)
  174.      */
  175.     public Style getComponentCustomStyle(String id, String type){
  176.         return getComponentStyleImpl(id, false, type + "#");
  177.     }
  178.     private Style getComponentStyleImpl(String id, boolean selected, String prefix){
  179.         Style style = null;
  180.         if(id == null || id.length() ==0){
  181.             //if no id return the default style
  182.             id = "";
  183.         }else{
  184.             id = id + ".";
  185.         }
  186.         if(selected) {
  187.             style = (Style)selectedStyles.get(id);
  188.             if(style == null){
  189.                 style = createStyle(id, prefix, true);
  190.                 selectedStyles.put(id, style);
  191.             }
  192.         } else {
  193.             if(prefix.length() == 0) {
  194.                 style = (Style)styles.get(id);
  195.                 if(style == null) {
  196.                     style = createStyle(id, prefix, false);
  197.                     styles.put(id, style);
  198.                 }
  199.             } else {
  200.                 return createStyle(id, prefix, false);
  201.             }
  202.         }
  203.         return new Style(style);
  204.     }
  205.     /**
  206.      * @return the name of the current theme for theme switching UI's
  207.      */
  208.     public String getThemeName(){
  209.         if(themeProps != null){
  210.             return (String)themeProps.get("name");
  211.         }
  212.         return null;
  213.     }
  214.     
  215.     /**
  216.      * Initializes the theme properties with the current "defaults"
  217.      */
  218.     private void resetThemeProps() {
  219.         themeProps = new Hashtable();
  220.         themeProps.put("Button.border", Border.getDefaultBorder());
  221.         themeProps.put("TouchCommand.border", Border.getDefaultBorder());
  222.         // default pressed border for button
  223.         themeProps.put("Button.press#border", Border.getDefaultBorder().createPressedVersion());
  224.         themeProps.put("Button.press#padding", "4,4,4,4");
  225.         themeProps.put("TouchCommand.press#border", Border.getDefaultBorder().createPressedVersion());
  226.         themeProps.put("TouchCommand.press#padding", "6,6,6,6");
  227.         themeProps.put("TextArea.border", Border.getDefaultBorder());
  228.         themeProps.put("TextField.border", Border.getDefaultBorder());
  229.         themeProps.put("ComboBox.border", Border.getDefaultBorder());
  230.         themeProps.put("ComboBoxPopup.border", Border.getDefaultBorder());
  231.         themeProps.put("Title.margin", "0,0,0,0");
  232.         themeProps.put("CommandList.margin", "0,0,0,0");
  233.         themeProps.put("CommandList.padding", "0,0,0,0");
  234.         themeProps.put("CommandList.transparency", "0");
  235.         themeProps.put("ComboBoxList.margin", "0,0,0,0");
  236.         themeProps.put("ComboBoxList.padding", "0,0,0,0");
  237.         themeProps.put("ComboBoxList.transparency", "0");
  238.         themeProps.put("TableCell.transparency", "0");
  239.         themeProps.put("TableHeader.transparency", "0");
  240.         themeProps.put("Menu.padding", "0,0,0,0");
  241.         themeProps.put("Command.margin", "0,0,0,0");
  242.         themeProps.put("ComboBoxItem.margin", "0,0,0,0");
  243.         themeProps.put("Container.transparency", "0");
  244.         themeProps.put("ContentPane.transparency", "0");
  245.         themeProps.put("List.transparency", "0");
  246.         themeProps.put("List.margin", "0,0,0,0");
  247.         themeProps.put("SoftButton.transparency", "255");
  248.         themeProps.put("SoftButton.margin", "0,0,0,0");
  249.         themeProps.put("SoftButton.padding", "2,2,2,2");
  250.         themeProps.put("Button.padding", "4,4,4,4");
  251.         themeProps.put("TouchCommand.padding", "6,6,6,6");
  252.         themeProps.put("TouchCommand.margin", "0,0,0,0");
  253.         themeProps.put("Container.margin", "0,0,0,0");
  254.         themeProps.put("Container.padding", "0,0,0,0");
  255.         themeProps.put("ContentPane.margin", "0,0,0,0");
  256.         themeProps.put("ContentPane.padding", "0,0,0,0");
  257.         themeProps.put("Title.transparency", "255");
  258.         themeProps.put("TabbedPane.margin", "0,0,0,0");
  259.         themeProps.put("TabbedPane.padding", "0,0,0,0");
  260.         themeProps.put("TabbedPane.transparency", "0");
  261.         themeProps.put("ScrollThumb.padding", "0,0,0,0");
  262.         themeProps.put("ScrollThumb.margin", "0,0,0,0");
  263.         themeProps.put("ScrollThumb.bgColor", "0");
  264.         themeProps.put("Scroll.margin", "0,0,0,0");
  265.         themeProps.put("Scroll.padding", "1,1,1,1");
  266.         themeProps.put("HorizontalScrollThumb.padding", "0,0,0,0");
  267.         themeProps.put("HorizontalScrollThumb.bgColor", "0");
  268.         themeProps.put("HorizontalScrollThumb.margin", "0,0,0,0");
  269.         themeProps.put("HorizontalScroll.margin", "0,0,0,0");
  270.         themeProps.put("HorizontalScroll.padding", "1,1,1,1");
  271.         themeProps.put("Form.padding", "0,0,0,0");
  272.         themeProps.put("Form.margin", "0,0,0,0");
  273.         themeProps.put("ListRenderer.transparency", "0");
  274.         themeProps.put("Command.transparency", "0");
  275.         themeProps.put("ComboBoxItem.transparency", "0");
  276.         themeProps.put("CalendarSelectedDay.border", Border.getDefaultBorder());
  277.         
  278.         themeProps.put("Command.sel#transparency", "0");
  279.         themeProps.put("ComboBoxItem.sel#transparency", "0");
  280.         themeProps.put("ListRenderer.sel#transparency", "100");
  281.         themeProps.put("Button.sel#border", Border.getDefaultBorder());
  282.         themeProps.put("TouchCommand.sel#border", Border.getDefaultBorder());
  283.         themeProps.put("TextArea.sel#border", Border.getDefaultBorder());
  284.         themeProps.put("TextField.sel#border", Border.getDefaultBorder());
  285.         themeProps.put("ComboBox.sel#border", Border.getDefaultBorder());
  286.         themeProps.put("ComboBoxPopup.sel#border", Border.getDefaultBorder());
  287.         themeProps.put("Title.sel#margin", "0,0,0,0");
  288.         themeProps.put("CommandList.sel#margin", "0,0,0,0");
  289.         themeProps.put("CommandList.sel#padding", "0,0,0,0");
  290.         themeProps.put("CommandList.sel#transparency", "0");
  291.         themeProps.put("Menu.sel#padding", "0,0,0,0");
  292.         themeProps.put("Command.sel#margin", "0,0,0,0");
  293.         themeProps.put("ComboBoxItem.sel#margin", "0,0,0,0");
  294.                 
  295.         themeProps.put("Container.sel#transparency", "0");
  296.         themeProps.put("ContentPane.sel#transparency", "0");
  297.         themeProps.put("List.sel#transparency", "0");
  298.         themeProps.put("SoftButton.sel#transparency", "255");
  299.         themeProps.put("List.sel#margin", "0,0,0,0");
  300.         themeProps.put("SoftButton.sel#margin", "0,0,0,0");
  301.         themeProps.put("SoftButton.sel#padding", "2,2,2,2");
  302.         themeProps.put("Button.sel#padding", "4,4,4,4");
  303.         themeProps.put("TouchCommand.sel#padding", "6,6,6,6");
  304.         themeProps.put("TouchCommand.sel#margin", "0,0,0,0");
  305.         themeProps.put("Container.sel#margin", "0,0,0,0");
  306.         themeProps.put("Container.sel#padding", "0,0,0,0");
  307.         themeProps.put("ContentPane.sel#margin", "0,0,0,0");
  308.         themeProps.put("ContentPane.sel#padding", "0,0,0,0");
  309.         themeProps.put("Title.sel#transparency", "255");
  310.         themeProps.put("TabbedPane.sel#margin", "0,0,0,0");
  311.         themeProps.put("TabbedPane.sel#padding", "0,0,0,0");
  312.         themeProps.put("Form.sel#padding", "0,0,0,0");
  313.         themeProps.put("Form.sel#margin", "0,0,0,0");
  314.         themeProps.put("sel#transparency", "255");
  315.         themeProps.put("TableCell.sel#transparency", "0");
  316.         themeProps.put("TableHeader.sel#transparency", "0");
  317.     }
  318.     
  319.     /**
  320.      * Allows manual theme loading from a hashtable of key/value pairs
  321.      * 
  322.      * @param themeProps the properties of the given theme
  323.      */
  324.     public void setThemeProps(Hashtable themeProps) {
  325.         if(accessible) {
  326.             setThemePropsImpl(themeProps);
  327.         }
  328.     }
  329.     
  330.     /**
  331.      * Adds the given theme properties on top of the existing properties without
  332.      * clearing the existing theme first
  333.      *
  334.      * @param themeProps the properties of the given theme
  335.      */
  336.     public void addThemeProps(Hashtable themeProps) {
  337.         if(accessible) {
  338.             buildTheme(themeProps);
  339.         }
  340.     }
  341.     void setThemePropsImpl(Hashtable themeProps) {
  342.         resetThemeProps();
  343.         styles.clear();
  344.         selectedStyles.clear();
  345.         imageCache.clear();
  346.         if(themelisteners != null){
  347.             themelisteners.fireActionEvent(new ActionEvent(themeProps));
  348.         }
  349.         buildTheme(themeProps);
  350.         current.refreshTheme();
  351.     }
  352.     private void buildTheme(Hashtable themeProps) {
  353.         Enumeration e = themeProps.keys();
  354.         while(e.hasMoreElements()) {
  355.             Object key = e.nextElement();
  356.             this.themeProps.put(key, themeProps.get(key));
  357.         }
  358.         
  359.         // necessary to clear up the style so we don't get resedue from the previous UI
  360.         defaultStyle = new Style();
  361.         
  362.         //create's the default style
  363.         defaultStyle = createStyle("", "", false);
  364.         defaultSelectedStyle = new Style(defaultStyle);
  365.         defaultSelectedStyle = createStyle("", "sel#", true);    
  366.     }
  367.     private Style createStyle(String id, String prefix, boolean selected) {
  368.         Style style;
  369.         String originalId = id;
  370.         if(selected) {
  371.             style = new Style(defaultSelectedStyle);
  372.         } else {
  373.             style = new Style(defaultStyle);
  374.         }
  375.         if (prefix != null && prefix.length() > 0) {
  376.             id += prefix;
  377.         }
  378.         if(themeProps != null){
  379.             String bgColor;
  380.             String fgColor;
  381.             Object border;
  382.             
  383.             bgColor = (String)themeProps.get(id + Style.BG_COLOR);
  384.             fgColor = (String)themeProps.get(id + Style.FG_COLOR);
  385.             border = themeProps.get(id + Style.BORDER);
  386.             Object bgImage = themeProps.get(id + Style.BG_IMAGE);
  387.             String transperency = (String)themeProps.get(id + Style.TRANSPARENCY);
  388.             String margin = (String)themeProps.get(id + Style.MARGIN);
  389.             String padding = (String)themeProps.get(id + Style.PADDING);
  390.             Object font = themeProps.get(id + Style.FONT);
  391.             
  392.             Byte backgroundType = (Byte)themeProps.get(id + Style.BACKGROUND_TYPE);
  393.             Byte backgroundAlignment = (Byte)themeProps.get(id + Style.BACKGROUND_ALIGNMENT);
  394.             Object[] backgroundGradient = (Object[])themeProps.get(id + Style.BACKGROUND_GRADIENT);
  395.             if(bgColor != null){
  396.                 style.setBgColor(Integer.valueOf(bgColor, 16).intValue());
  397.             }
  398.             if(fgColor != null){
  399.                 style.setFgColor(Integer.valueOf(fgColor, 16).intValue());
  400.             }
  401.             if(transperency != null){
  402.                 style.setBgTransparency(Integer.valueOf(transperency).intValue());
  403.             } else {
  404.                 if(selected) {
  405.                     transperency = (String)themeProps.get(originalId + Style.TRANSPARENCY);
  406.                     if(transperency != null){
  407.                         style.setBgTransparency(Integer.valueOf(transperency).intValue());
  408.                     }
  409.                 }
  410.             }
  411.             if(margin != null){
  412.                 int [] marginArr = toIntArray(margin.trim());
  413.                 style.setMargin(marginArr[0], marginArr[1], marginArr[2], marginArr[3]);
  414.             } 
  415.             if(padding != null){
  416.                 int [] paddingArr = toIntArray(padding.trim());
  417.                 style.setPadding(paddingArr[0], paddingArr[1], paddingArr[2], paddingArr[3]);
  418.             }
  419.             if(backgroundType != null) {
  420.                 style.setBackgroundType(backgroundType.byteValue());
  421.             }
  422.             if(backgroundAlignment != null) {
  423.                 style.setBackgroundAlignment(backgroundAlignment.byteValue());
  424.             }
  425.             if(backgroundGradient != null) {
  426.                 if(backgroundGradient.length < 5) {
  427.                     Object[] a = new Object[5];
  428.                     System.arraycopy(backgroundGradient, 0, a, 0, backgroundGradient.length);
  429.                     backgroundGradient = a;
  430.                     backgroundGradient[4] = new Float(1);
  431.                 }
  432.                 style.setBackgroundGradient(backgroundGradient);
  433.             }
  434.             if(bgImage != null){
  435.                 Image im = null;
  436.                 if(bgImage instanceof String){
  437.                     try {
  438.                         String bgImageStr = (String)bgImage;
  439.                         if(imageCache.contains(bgImageStr)) {
  440.                             im = (Image)imageCache.get(bgImageStr);
  441.                         } else { 
  442.                             if(bgImageStr.startsWith("/")) {
  443.                                 im = Image.createImage(bgImageStr);
  444.                             } else {
  445.                                 im = parseImage((String)bgImage);
  446.                             }
  447.                             imageCache.put(bgImageStr, im);
  448.                         }
  449.                         themeProps.put(id + Style.BG_IMAGE, im);
  450.                     } catch (IOException ex) {
  451.                         System.out.println("failed to parse image for id = "+id + Style.BG_IMAGE);
  452.                     }
  453.                 }else{
  454.                     im = (Image)bgImage;
  455.                 }
  456.                 // this code should not excute in the resource editor!
  457.                 if(id.indexOf("Form") > -1){
  458.                     if((im.getWidth() != Display.getInstance().getDisplayWidth() || 
  459.                        im.getHeight() != Display.getInstance().getDisplayHeight())
  460.                        && style.getBackgroundType() == Style.BACKGROUND_IMAGE_SCALED && accessible) {
  461.                        im.scale(Display.getInstance().getDisplayWidth(), 
  462.                                Display.getInstance().getDisplayHeight());
  463.                     }
  464.                 }
  465.                 style.setBgImage(im);
  466.             }
  467.             if(font != null){
  468.                 if(font instanceof String){
  469.                     style.setFont(parseFont((String)font));
  470.                 }else{
  471.                     style.setFont((com.sun.lwuit.Font)font);
  472.                 }
  473.             }
  474.             
  475.             style.setBorder((Border)border);
  476.             style.resetModifiedFlag();
  477.         } 
  478.         
  479.         return style;
  480.     }
  481.     
  482.     /**
  483.      * This method is used to parse the margin and the padding
  484.      * @param str
  485.      * @return
  486.      */
  487.     private int [] toIntArray(String str){
  488.         int [] retVal = new int[4];
  489.         str  = str + ",";
  490.         for(int i=0; i< retVal.length; i++){
  491.             retVal[i] = Integer.parseInt(str.substring(0, str.indexOf(",")));
  492.             str = str.substring(str.indexOf(",") + 1, str.length());
  493.         }
  494.         return retVal;
  495.     }
  496.     
  497.     
  498.     private static Image parseImage(String value) throws IOException {
  499.         int index = 0;
  500.         byte [] imageData = new byte[value.length()/2];
  501.         while(index < value.length()){
  502.             String byteStr = value.substring(index, index + 2);
  503.             imageData[index/2] = Integer.valueOf(byteStr, 16).byteValue();
  504.             index += 2;
  505.         }
  506.         ByteArrayInputStream in = new ByteArrayInputStream(imageData);
  507.         Image image = Image.createImage(in);
  508.         in.close();
  509.         return image;
  510.     }
  511.         
  512.     private static com.sun.lwuit.Font parseFont(String fontStr) {
  513.         if(fontStr.startsWith("System")){
  514.             int face = 0;
  515.             int style = 0;
  516.             int size = 0;
  517.             String faceStr, styleStr, sizeStr;
  518.             String sysFont = fontStr.substring(fontStr.indexOf("{") + 1, fontStr.indexOf("}"));
  519.             faceStr = sysFont.substring(0, sysFont.indexOf(";"));
  520.             sysFont = sysFont.substring(sysFont.indexOf(";") + 1, sysFont.length());
  521.             styleStr = sysFont.substring(0, sysFont.indexOf(";"));
  522.             sizeStr = sysFont.substring(sysFont.indexOf(";") + 1, sysFont.length());
  523.             
  524.             if(faceStr.indexOf("FACE_SYSTEM") > -1){
  525.                 face = Font.FACE_SYSTEM;
  526.             }else if(faceStr.indexOf("FACE_MONOSPACE") > -1){
  527.                 face = Font.FACE_MONOSPACE;
  528.             }else if(faceStr.indexOf("FACE_PROPORTIONAL") > -1){
  529.                 face = Font.FACE_PROPORTIONAL;
  530.             }
  531.             
  532.             if(styleStr.indexOf("STYLE_PLAIN") > -1){
  533.                 style = Font.STYLE_PLAIN;
  534.             }else{
  535.                 if(styleStr.indexOf("STYLE_BOLD") > -1){
  536.                     style = Font.STYLE_BOLD;
  537.                 }
  538.                 if(styleStr.indexOf("STYLE_ITALIC") > -1){
  539.                     style = style | Font.STYLE_ITALIC;
  540.                 }
  541.                 if(styleStr.indexOf("STYLE_UNDERLINED") > -1){
  542.                     style = style | Font.STYLE_UNDERLINED;
  543.                 }
  544.             }
  545.             
  546.             if(sizeStr.indexOf("SIZE_SMALL") > -1){
  547.                 size = Font.SIZE_SMALL;
  548.             }else if(sizeStr.indexOf("SIZE_MEDIUM") > -1){
  549.                 size = Font.SIZE_MEDIUM;
  550.             }else if(sizeStr.indexOf("SIZE_LARGE") > -1){
  551.                 size = Font.SIZE_LARGE;
  552.             }
  553.             
  554.             
  555.             return com.sun.lwuit.Font.createSystemFont(face, style, size);            
  556.         } else {
  557.             if(fontStr.toLowerCase().startsWith("bitmap")) {
  558.                 try {
  559.                     String bitmapFont = fontStr.substring(fontStr.indexOf("{") + 1, fontStr.indexOf("}"));
  560.                     String nameStr;
  561.                     nameStr = bitmapFont.substring(0, bitmapFont.length());
  562.                     
  563.                     if(nameStr.toLowerCase().startsWith("highcontrast")) {
  564.                         nameStr = nameStr.substring(nameStr.indexOf(";") + 1, nameStr.length());
  565.                         com.sun.lwuit.Font f = com.sun.lwuit.Font.getBitmapFont(nameStr);
  566.                         f.addContrast((byte)30);
  567.                         return f;
  568.                     }
  569.                     
  570.                     return com.sun.lwuit.Font.getBitmapFont(nameStr);
  571.                 } catch (Exception ex) {
  572.                     // illegal argument exception?
  573.                     ex.printStackTrace();
  574.                 }
  575.             }
  576.         }
  577.         // illegal argument?
  578.         return null;
  579.     }
  580.     
  581.     /**
  582.      * The resource bundle allows us to implicitly localize the UI on the fly, once its
  583.      * installed all internal application strings query the resource bundle and extract
  584.      * their values from this table if applicable.
  585.      * 
  586.      * @return the localization bundle
  587.      */
  588.     public Hashtable getResourceBundle() {
  589.         return resourceBundle;
  590.     }
  591.     /**
  592.      * The resource bundle allows us to implicitly localize the UI on the fly, once its
  593.      * installed all internal application strings query the resource bundle and extract
  594.      * their values from this table if applicable.
  595.      * 
  596.      * @param resourceBundle the localization bundle
  597.      */
  598.     public void setResourceBundle(Hashtable resourceBundle) {
  599.         this.resourceBundle = resourceBundle;
  600.     }
  601.     
  602.     /**
  603.      * Localizes the given string from the resource bundle if such a String exists in the
  604.      * resource bundle. If no key exists in the bundle then or a bundle is not installed
  605.      * the default value is returned.
  606.      * 
  607.      * @param key The key used to lookup in the resource bundle
  608.      * @param defaultValue the value returned if no such key exists
  609.      * @return either default value or the appropriate value
  610.      */
  611.     public String localize(String key, String defaultValue) {
  612.         if(resourceBundle != null) {
  613.             Object o = resourceBundle.get(key);
  614.             if(o != null) {
  615.                 return (String)o;
  616.             }
  617.         }
  618.         return defaultValue;
  619.     }
  620.     
  621.     /**
  622.      * Adds a Theme refresh listener.
  623.      * The listenres will get a callback when setThemeProps method is invoked.
  624.      * 
  625.      * @param l an ActionListener to be added
  626.      */
  627.     public void addThemeRefreshListener(ActionListener l) {
  628.         if (themelisteners == null) {
  629.             themelisteners = new EventDispatcher();
  630.         }
  631.         themelisteners.addListener(l);
  632.     }
  633.     
  634.     /**
  635.      * Removes a Theme refresh listener.
  636.      * 
  637.      * @param l an ActionListener to be removed
  638.      */
  639.     public void removeThemeRefreshListener(ActionListener l) {
  640.         if (themelisteners == null) {
  641.             return;
  642.         }
  643.         themelisteners.removeListener(l);
  644.     }
  645. }