blob: 3d94b8abb2cdf3b9bd2915c3f57f85b07caf1055 [file] [log] [blame]
/*
*****************************************************************************
* 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();
}
*/
}