1 package org.wcb.common; 2 /*** 3 * Copyright (C) 1999 Walter Bogaardt 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 18 * 19 * Filename: $Id: UIDefaultsLoader.java,v 1.10 2004/06/09 18:53:30 wbogaardt Exp $ 20 * 21 * Abstract: User Interface default loader for UIManager 22 * 23 */ 24 import java.util.Properties; 25 import java.util.Enumeration; 26 import java.util.StringTokenizer; 27 import java.io.BufferedInputStream; 28 import java.io.FileInputStream; 29 import java.io.FileWriter; 30 import java.io.BufferedWriter; 31 import java.io.PrintWriter; 32 import java.io.IOException; 33 import java.io.FileOutputStream; 34 import java.awt.Color; 35 import java.awt.Font; 36 import javax.swing.*; 37 38 import org.wcb.autohome.interfaces.X10DeviceConstants; 39 import org.wcb.autohome.AutoHomeAdminSession; 40 41 public class UIDefaultsLoader implements X10DeviceConstants { 42 43 public static final String DEFAULTFILENAME = "jhome.prop"; 44 public static final String FILEHEADER = 45 "#This is the property file for bubblesoft UI views.\n"+ 46 "# To set values in this file uncomment the line you wish to set a value\n"+ 47 "# for (by deleting the # at the beginning) and then fill in a value after the =\n"+ 48 "# For color values, start the value with 'Color.' and follow with either the name\n"+ 49 "# of a color or at rgb value\n"+ 50 "# example: Label.background=Color.black \n" + 51 "# Label.background=Color.#ffffff \n" + 52 "# both of these are the same color. \n" + 53 "# The valid color names are: white, black, red, blue, yellow, green, pink, \n"+ 54 "# gray, orange, magenta, cyan"+ 55 "# For font customization values, start the value with 'Font.' and follow the name,\n"+ 56 "# style, size\n"+ 57 "# example: Font. Dialog,2,10\n"+ 58 "# The valid fonts are Dialog, DialogInput, SansSerif, Monospaced.\n"+ 59 "# Valid styles are 0 = plain, 1 = Bold, 2 = Italic, 3 = Bold+Italic\n"+ 60 "# Valid sizes are 9, 10, 12, 14, 18, 24"; 61 private String userHome; 62 protected Properties swingProperties = null; 63 protected static String saveFileName; 64 65 public UIDefaultsLoader() 66 { 67 this(DEFAULTFILENAME); 68 } 69 70 public UIDefaultsLoader(String fileName) 71 { 72 this(fileName, null); 73 } 74 75 public UIDefaultsLoader(String fileName, String directory) 76 { 77 String sFilename = DEFAULTFILENAME; 78 if (null == directory) 79 { 80 userHome = USER_HOME; 81 } 82 else 83 userHome = directory; 84 if(null == fileName) 85 { 86 sFilename = DEFAULTFILENAME; 87 } 88 else 89 { 90 sFilename = fileName; 91 } 92 swingProperties = load(userHome, sFilename); 93 } 94 95 /*** 96 * Load the specified properties file. If the file does not exist, a 97 * default file will be created. 98 */ 99 protected Properties load(String directory, String file) 100 { 101 Properties returnValue = null; 102 try 103 { 104 returnValue = loadProperties(directory, file); 105 } 106 catch (IOException e) 107 { 108 System.err.println("No jhome.prop file found. Now building default..."); 109 try 110 { 111 buildDefaultFile(directory,file); 112 returnValue = loadProperties(directory, file); 113 } 114 catch(IOException ex) 115 { 116 } 117 } 118 return returnValue; 119 } 120 121 /*** 122 * Load the properties file. 123 */ 124 protected Properties loadProperties(String directory, String file) 125 throws IOException 126 { 127 saveFileName = directory+SEPARATOR+file; 128 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(saveFileName)); 129 Properties returnValue = new Properties(); 130 returnValue.load(bis); 131 return returnValue; 132 } 133 134 /*** 135 * This sets the UI properties such as colors and font format 136 * from what was saved previously in jhome.prop file. 137 */ 138 private void setUIProps() 139 { 140 if (null == swingProperties) return; 141 Enumeration enumr = swingProperties.keys(); 142 Object nextElement; 143 Object value; 144 while (enumr.hasMoreElements()) 145 { 146 nextElement = enumr.nextElement(); 147 value = swingProperties.get(nextElement); 148 if (null != value) 149 { 150 if (isColor(value.toString())) 151 { 152 Color cValue = convertToColor(value.toString()); 153 if (null != cValue) 154 UIManager.put(nextElement, cValue); 155 } 156 if (isFont(value.toString())) 157 { 158 Font fValue = convertToFont(value.toString()); 159 if(null !=fValue) 160 UIManager.put(nextElement, fValue); 161 } 162 } 163 } 164 } 165 166 /*** 167 * sets the UIManger to the look and feel indicated by the 168 * cockpit properties file 169 */ 170 public void initiateLF() 171 { 172 String value = AutoHomeAdminSession.getInstance().getLookAndFeel(); 173 try 174 { 175 UIManager.setLookAndFeel(value); 176 if(value.equalsIgnoreCase(METAL) || value.equalsIgnoreCase(MAC) || value.equalsIgnoreCase(WINDOWS) || value.equalsIgnoreCase(MOTIF)) 177 { 178 this.setUIProps(); 179 } 180 } 181 catch (UnsupportedLookAndFeelException e) 182 { 183 } 184 catch(InstantiationException ie) 185 { 186 } 187 catch(IllegalAccessException iae) 188 { 189 } 190 catch(ClassNotFoundException cnfe) 191 { 192 } 193 catch(Exception ex) 194 { 195 } 196 } 197 198 public void setProperty(String sKey, String sValue) 199 { 200 swingProperties.setProperty(sKey, sValue); 201 } 202 203 public Properties getProperties(){ 204 if(swingProperties == null) 205 { 206 swingProperties = load(userHome,DEFAULTFILENAME); 207 } 208 return swingProperties; 209 } 210 211 public String getProperty(String val) 212 { 213 return swingProperties.getProperty(val); 214 } 215 216 private boolean isColor(String value) 217 { 218 boolean returnValue = false; 219 if (value.startsWith("Color")) 220 { 221 returnValue = true; 222 } 223 return returnValue; 224 } 225 226 private Color convertToColor(String value) 227 { 228 Color returnValue = null; 229 value = value.substring(value.indexOf(".")+1); 230 returnValue = GuiLib.getColor(value); 231 if (null == returnValue) 232 { 233 try 234 { 235 returnValue = Color.decode(value); 236 } 237 catch (Exception e) 238 { 239 e.printStackTrace(); 240 } 241 } 242 return returnValue; 243 } 244 245 private boolean isFont(String value) 246 { 247 boolean returnValue = false; 248 if(value.startsWith("Font")) 249 { 250 returnValue = true; 251 } 252 return returnValue; 253 } 254 255 private Font convertToFont(String value) 256 { 257 Font returnValue = null; 258 String family, sStyle, sSize; 259 int style, size; 260 StringTokenizer fontName=new StringTokenizer(value.substring(value.indexOf(".")+1),","); 261 family = fontName.nextToken(); 262 sStyle = fontName.nextToken(); 263 sSize = fontName.nextToken(); 264 try { 265 style = Integer.parseInt(sStyle); 266 size = Integer.parseInt(sSize); 267 returnValue=new Font(family, style, size); 268 } 269 catch(NumberFormatException nfe) 270 { 271 returnValue = new Font("Dialog", 1, 12); 272 } 273 return returnValue; 274 } 275 276 public void outputToScreen() 277 { 278 if (swingProperties != null) 279 try 280 { 281 swingProperties.store(System.out, "Saving properties"); 282 } 283 catch(IOException ioe) 284 { 285 System.err.println("Error tying to save file properties "+ioe); 286 } 287 } 288 289 /*** 290 * build a generic properties file with no values loaded 291 * and have that files properties set to null and commented out 292 */ 293 protected void buildDefaultFile(String directory, String file) throws IOException 294 { 295 UIDefaults uidef = UIManager.getDefaults(); 296 Enumeration keys = uidef.keys(); 297 saveFileName = directory+SEPARATOR+file; 298 PrintWriter out 299 = new PrintWriter(new BufferedWriter(new FileWriter(saveFileName))); 300 out.println(FILEHEADER); 301 while (keys.hasMoreElements()) 302 { 303 out.println("#"+keys.nextElement()+"="); 304 } 305 out.println(BROWSER + "="); 306 out.println(LAST_FILE + "="); 307 out.println(RMI_HOST + "=" + LOCALHOST); 308 out.flush(); 309 out.close(); 310 } 311 312 public void saveProperties() 313 { 314 try 315 { 316 FileOutputStream output = new FileOutputStream(saveFileName); 317 swingProperties.store(output, FILEHEADER); 318 output.close(); 319 } 320 catch(IOException ioe) 321 { 322 System.err.println("Error :"+ioe); 323 } 324 } 325 326 /*** 327 * Returns true if the specified property is empty. 328 */ 329 public boolean isEmpty(String propName) { 330 String propValue = getProperty(propName); 331 return (propValue == null || propValue.trim().length() < 1); 332 } 333 334 public void setProperties(Properties newProp) { 335 swingProperties = newProp; 336 } 337 338 public static void main(String[] args) 339 { 340 UIDefaultsLoader uiDef = new UIDefaultsLoader(); 341 uiDef.outputToScreen(); 342 uiDef.setUIProps(); 343 } 344 } 345 346 347 348 349 350 351 352 353 354