package tufts.vue;
import javax.swing.JDialog;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.reflect.*;
import java.beans.*;
import java.util.prefs.*;
/*
#define makeBool(x) private boolean do##x; \
public boolean is##x() { return do##x; } \
public void set##x(boolean t) { this.do##x = t; }
makeBool(RunSlowly);
*/
public class VuePreferences
{
// map preferences
private boolean doRolloverZoom;
private boolean doShowIcons;
private boolean doFixedLinkWidth;
final static String PropertyKey = "vuePreferenceProperty";
static class Property
implements ActionListener
{
String mKey;
Object mDefault;
String mUnits;
Property(String key, Object pDefault, String units) {
mKey = key;
mDefault = pDefault;
mUnits = units;
}
Property(String key, Object pDefault) {
this(key, pDefault, "");
}
public JComponent makeEditor() {
JComponent editor = null;
if (mDefault instanceof Boolean) {
JCheckBox checkBox = new JCheckBox(mKey);
checkBox.addActionListener(this);
editor = checkBox;
} else {
editor = new JPanel();
editor.setBackground(Color.lightGray);
editor.add(new JLabel(mKey));
JTextField text;
if (mDefault instanceof Number)
text = new JTextField(4);
else {
text = new JTextField();
text.setText((String)mDefault);
}
text.addActionListener(this);
editor.add(text);
if (mUnits.length() > 0)
editor.add(new JLabel(mUnits));
}
editor.putClientProperty(PropertyKey, this);
return editor;
}
public String toString() {
return "Property[" + mKey + "]";
}
public void actionPerformed(ActionEvent e) {
Property p = null;
if (e.getSource() instanceof JComponent)
p = (Property) ((JComponent)e.getSource()).getClientProperty(PropertyKey);
if (p != null)
System.out.println(p);
}
}
// need to add default values and descriptions.
// can get type from default value!
static Property[] MapProperties = new Property[] {
new Property("RolloverZoom", Boolean.FALSE),
new Property("RolloverZoomDelay", new Integer(200), "milliseconds"),
new Property("ShowIcons", Boolean.TRUE),
new Property("FixedWidthLinks", Boolean.FALSE),
new Property("GroupsForceBorder", Boolean.FALSE),
new Property("SizeOfChildNodes", new Float(.75f)),
new Property("SizeOfChildImages", new Float(.25f)),
};
static Property[] VueProperties = new Property[] {
new Property("DisplayResourceBrowser", Boolean.TRUE),
new Property("RightViewerTracksSelection", Boolean.TRUE),
new Property("DisplayScrollbars", Boolean.TRUE),
};
static Property[] PresentationProperties = new Property[] {
new Property("Fade Page Transitions", Boolean.TRUE),
};
public boolean isRolloverZoom() {
return doRolloverZoom;
}
public void setRolloverZoom(boolean t) {
doRolloverZoom = t;
}
public boolean doShowIcons() {
return doShowIcons;
}
static class EditPane extends JPanel {
EditPane(Preferences prefs) {
setOpaque(false);
try {
String[] keys = prefs.keys();
for (int i = 0; i < keys.length; i++) {
Property p = new Property(keys[i], prefs.get(keys[i], ""));
JComponent editor = p.makeEditor();
//editor.setOpaque(false);
add(editor);
}
} catch (Exception e) {
e.printStackTrace();
}
}
EditPane(Property[] properties) {
//setBackground(SystemColor.window);
setOpaque(false); // needed for mac default white-line BG color: textures don't align!
//setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
for (int i = 0; i < properties.length; i++) {
Property p = properties[i];
JComponent editor = p.makeEditor();
editor.setOpaque(false);
add(editor);
}
}
}
static class PreferencePane extends JTabbedPane {
public PreferencePane() {
addTab("General", new EditPane(VueProperties));
addTab("Map", new EditPane(MapProperties));
addTab("Fedora Prefs", new EditPane(Preferences.userRoot().node("tufts/oki/dr/fedora")));
}
}
public static void main(String[] args) {
//VUE.initUI();
tufts.Util.displayComponent(new PreferencePane(), 300,400);
try {
PropertyDescriptor p = new PropertyDescriptor("rolloverZoom", VuePreferences.class);
System.out.println(p);
System.out.println(p.getPropertyType());
System.out.println(p.getPropertyEditorClass());
Method setter = p.getWriteMethod();
VuePreferences prefs = new VuePreferences();
System.out.println(setter);
System.out.println(prefs.isRolloverZoom());
setter.invoke(prefs, new Object[] { Boolean.TRUE });
System.out.println(prefs.isRolloverZoom());
} catch (Exception e) {
e.printStackTrace();
}
/*
PreferenceDialog p = new PreferenceDialog();
tufts.Util.centerOnScreen(p);
p.pack();
p.show();
*/
}
}