| /* |
| ***************************************************************************** |
| * Copyright (C) 2000-2004, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ***************************************************************************** |
| */ |
| package com.ibm.rbm; |
| |
| import java.util.*; |
| import java.io.*; |
| |
| /** |
| * This class defines the methods used by RBManager to access, set, and store |
| * individual user preferences for the application. All of the public methods defined |
| * in this class are static, and so the class need not be instantiated. |
| * |
| * @author Jared Jackson |
| * @see com.ibm.rbm.RBManager |
| */ |
| public class Preferences { |
| // Default values |
| private static final int NUM_RECENT_FILES = 4; |
| private static final String EMPTY_STRING = ""; |
| private static Properties prop; |
| |
| /** |
| * Retrieve a preference by its key name |
| * @param name The name of the key associated with one preference |
| * @return The value of the preference sought |
| */ |
| |
| public static String getPreference(String name) { |
| if (prop == null) init(); |
| Object o = prop.get(name); |
| if (o == null || !(o instanceof String)) return EMPTY_STRING; |
| return (String)o; |
| } |
| |
| /** |
| * Sets a preference by key name and value. If the key name all ready exists, that |
| * preference is overwritten without warning. |
| * @param name The name of the key associated with the preference |
| * @param value The value of the preference to be set and later retrieved. If this value is null, the property of this name is erased. |
| */ |
| |
| public static void setPreference(String name, String value) { |
| if (prop == null) init(); |
| if (value == null) { |
| // In this case, we will remove the property |
| prop.remove(name); |
| } |
| prop.put(name, value); |
| } |
| |
| /** |
| * Writes the results of the buffered preferences to file. There is no option for |
| * where this file is saved on the file system. |
| */ |
| |
| public static void savePreferences() throws IOException { |
| if (prop == null) init(); |
| FileOutputStream fos = new FileOutputStream("preferences.properties"); |
| prop.store(fos, "RBManager Preferences"); |
| fos.flush(); |
| fos.close(); |
| } |
| |
| /** |
| * Given the name of a resource bundle and the file path location of the base |
| * document for that resource bundle, this method will insert that file into |
| * a list of recent files. Currently the past 4 resource bundles visited will |
| * be displayed. This method also sorts the prefences so that the most recently |
| * added will be the first returned, even if that file had all ready existed |
| * in the preferences when it was added. |
| * @param name The name of this file as it will be displayed to the user |
| * @param location The file path to this file (should be absolute). |
| */ |
| |
| public static void addRecentFilePreference(String name, String location) { |
| Vector existingNames = new Vector(); |
| Vector existingLocations = new Vector(); |
| for (int i=0; i < NUM_RECENT_FILES; i++) { |
| String oldName = getPreference("recentfileid" + String.valueOf(i)); |
| String oldLocation = getPreference("recentfileloc" + String.valueOf(i)); |
| if (oldName.equals(EMPTY_STRING) || oldLocation.equals(EMPTY_STRING)) break; |
| existingNames.addElement(oldName); |
| existingLocations.addElement(oldLocation); |
| } |
| // Check to see if the file is all ready in there |
| int swap_start = 0; |
| int old_size = existingLocations.size(); |
| for (int i=0; i <= old_size; i++) { |
| if (i == existingLocations.size()) { |
| // No match was found, pull all the elements down one |
| swap_start = i; |
| if (swap_start >= NUM_RECENT_FILES) swap_start = NUM_RECENT_FILES-1; |
| else { |
| // Extend the length of the vectors |
| existingNames.addElement(EMPTY_STRING); |
| existingLocations.addElement(EMPTY_STRING); |
| } |
| } else { |
| String oldLocation = (String)existingLocations.elementAt(i); |
| if (oldLocation.equals(location)) { |
| // We found a match, pull this one to the front |
| swap_start = i; |
| break; |
| } |
| } |
| } |
| |
| // Move the files down the line as appropriate |
| for (int i=swap_start; i > 0; i--) { |
| existingLocations.setElementAt(existingLocations.elementAt(i-1),i); |
| existingNames.setElementAt(existingNames.elementAt(i-1),i); |
| } |
| existingLocations.setElementAt(location, 0); |
| existingNames.setElementAt(name, 0); |
| |
| // Set the properties |
| for (int i=0; i < existingLocations.size(); i++) { |
| setPreference("recentfileid" + String.valueOf(i), (String)existingNames.elementAt(i)); |
| setPreference("recentfileloc" + String.valueOf(i), (String)existingLocations.elementAt(i)); |
| } |
| for (int i=existingLocations.size(); i < NUM_RECENT_FILES; i++) { |
| setPreference("recentfileid" + String.valueOf(i), EMPTY_STRING); |
| setPreference("recentfileloc" + String.valueOf(i), EMPTY_STRING); |
| } |
| try { |
| savePreferences(); |
| } catch (IOException ioe) {} // Ignore, its not critical |
| } |
| |
| /** |
| * Returns a list of the names and locations of the various recently used files. |
| * @return A Vector of Strings which is twice in length the number of files known about. The vector contains name 1 then location 1, then name 2 ... |
| */ |
| |
| public static Vector getRecentFilesPreferences() { |
| if (prop == null) init(); |
| Vector existing = new Vector(); |
| for (int i=0; i < NUM_RECENT_FILES; i++) { |
| String name = getPreference("recentfileid" + String.valueOf(i)); |
| String location = getPreference("recentfileloc" + String.valueOf(i)); |
| if (name.equals(EMPTY_STRING) || location.equals(EMPTY_STRING)) break; |
| existing.addElement(name); |
| existing.addElement(location); |
| } |
| return existing; |
| } |
| |
| private static void init() { |
| Properties defaults = new Properties(); |
| // This values are needed and are specified by default |
| // If they exist in the file, they will be overwritten |
| defaults.put("username", Resources.getTranslation("unknown_user")); |
| defaults.put("locale", "en"); |
| defaults.put("lookandfeel", ""); |
| |
| prop = new Properties(defaults); |
| try { |
| FileInputStream fis = new FileInputStream("preferences.properties"); |
| prop.load(fis); |
| } catch (IOException ioe) { |
| System.err.println("Error reading properties"); |
| ioe.printStackTrace(System.err); |
| } |
| try { |
| savePreferences(); |
| } catch (IOException ioe) { |
| System.err.println("Error saving preferences " + ioe.getMessage()); |
| } |
| } |
| |
| /* |
| public static void main(String args[]) { |
| // Test |
| init(); |
| } |
| */ |
| } |