#73474 Permit use of Preferences API in NetBeans as a replacement for SystemOption
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/apisupport.beanbrowser/src/org/netbeans/modules/apisupport/beanbrowser/PreferencesNode.java Wed Oct 11 13:06:26 2006 +0000
1.3 @@ -0,0 +1,245 @@
1.4 +/*
1.5 + * The contents of this file are subject to the terms of the Common Development
1.6 + * and Distribution License (the License). You may not use this file except in
1.7 + * compliance with the License.
1.8 + *
1.9 + * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
1.10 + * or http://www.netbeans.org/cddl.txt.
1.11 + *
1.12 + * When distributing Covered Code, include this CDDL Header Notice in each file
1.13 + * and include the License file at http://www.netbeans.org/cddl.txt.
1.14 + * If applicable, add the following below the CDDL Header, with the fields
1.15 + * enclosed by brackets [] replaced by your own identifying information:
1.16 + * "Portions Copyrighted [year] [name of copyright owner]"
1.17 + *
1.18 + * The Original Software is NetBeans. The Initial Developer of the Original
1.19 + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
1.20 + * Microsystems, Inc. All Rights Reserved.
1.21 + */
1.22 +
1.23 +package org.netbeans.modules.apisupport.beanbrowser;
1.24 +
1.25 +import java.awt.event.ActionEvent;
1.26 +import java.lang.reflect.InvocationTargetException;
1.27 +import java.util.ArrayList;
1.28 +import java.util.Date;
1.29 +import java.util.List;
1.30 +import java.util.logging.Level;
1.31 +import java.util.logging.Logger;
1.32 +import java.util.prefs.BackingStoreException;
1.33 +import java.util.prefs.NodeChangeEvent;
1.34 +import java.util.prefs.NodeChangeListener;
1.35 +import java.util.prefs.PreferenceChangeEvent;
1.36 +import java.util.prefs.PreferenceChangeListener;
1.37 +import java.util.prefs.Preferences;
1.38 +import org.openide.nodes.AbstractNode;
1.39 +import org.openide.nodes.Children;
1.40 +import org.openide.nodes.Node;
1.41 +import org.openide.nodes.Node.Property;
1.42 +import org.openide.nodes.PropertySupport;
1.43 +import org.openide.nodes.Sheet;
1.44 +import org.openide.util.HelpCtx;
1.45 +import org.openide.util.NbPreferences;
1.46 +import org.openide.util.actions.SystemAction;
1.47 +
1.48 +/**
1.49 + *
1.50 + * @author Radek Matous
1.51 + */
1.52 +public class PreferencesNode extends AbstractNode {
1.53 + private static final int NB_USER = 0;
1.54 + private static final int DEFAULT_USER = 1;
1.55 + private static final int DEFAULT_SYSTEM = 2;
1.56 +
1.57 + public PreferencesNode() {
1.58 + super(new RootChildren());
1.59 + setDisplayName("Preferences");
1.60 + }
1.61 +
1.62 + private static class RootChildren extends Children.Array {
1.63 + RootChildren() {
1.64 + super();
1.65 + }
1.66 +
1.67 + protected void addNotify() {
1.68 + add(new Node[] {
1.69 + new PreferencesNodeImpl(PreferencesNode.NB_USER),
1.70 + new PreferencesNodeImpl(PreferencesNode.DEFAULT_USER),
1.71 + new PreferencesNodeImpl(PreferencesNode.DEFAULT_SYSTEM)
1.72 + });
1.73 + }
1.74 + }
1.75 +
1.76 + private static class PreferencesNodeImpl extends AbstractNode {
1.77 + /** Creates a new instance of PreferencesNode */
1.78 + public PreferencesNodeImpl(int type) {
1.79 + this(type, "/");
1.80 + switch(type) {
1.81 + case PreferencesNode.NB_USER:
1.82 + setDisplayName("NetBeans Preferences");
1.83 + break;
1.84 + case PreferencesNode.DEFAULT_USER:
1.85 + setDisplayName("User Preferences");
1.86 + break;
1.87 + case PreferencesNode.DEFAULT_SYSTEM:
1.88 + setDisplayName("System Preferences");
1.89 + break;
1.90 + default:
1.91 + assert false;
1.92 + }
1.93 + }
1.94 +
1.95 + private PreferencesNodeImpl(int type, String absolutePath) {
1.96 + super(new PreferencesChildren(type, absolutePath));
1.97 + setDisplayName(getPreferences().name());
1.98 + }
1.99 +
1.100 + protected Sheet createSheet() {
1.101 + Sheet sh = super.createSheet();
1.102 + populatePropertiesSet(sh);
1.103 + return sh;
1.104 + }
1.105 +
1.106 + private Preferences getPreferences() {
1.107 + return ((PreferencesChildren)getChildren()).getPreferences();
1.108 + }
1.109 +
1.110 + private void populatePropertiesSet(final Sheet sheet) {
1.111 + Sheet.Set set = getPropertySet(sheet);
1.112 + final String[] keys;
1.113 + try {
1.114 + keys = getPreferences().keys();
1.115 + for (int i = 0; i < keys.length; i++) {
1.116 + set.put(new PreferencesProperty(keys[i]));
1.117 + }
1.118 + } catch (BackingStoreException ex) {
1.119 + Logger.getLogger("org.netbeans.modules.apisupport.beanbrowser.PreferencesNode").//NOI18N
1.120 + log(Level.WARNING, null, ex);
1.121 + }
1.122 + }
1.123 +
1.124 + private Sheet.Set getPropertySet(final Sheet sheet) {
1.125 + Sheet.Set set = sheet.get(Sheet.PROPERTIES);
1.126 + if (set == null) {
1.127 + final Sheet.Set set2 = Sheet.createPropertiesSet();
1.128 + set = set2;
1.129 + sheet.put(set);
1.130 + PreferenceChangeListener pL = new PreferenceChangeListener() {
1.131 + public void preferenceChange(PreferenceChangeEvent evt) {
1.132 + if (!evt.getNode().equals(getPreferences())) {
1.133 + return;
1.134 + }
1.135 + Property p = set2.get(evt.getKey());
1.136 + Object newValue = evt.getNewValue();
1.137 + if (p == null) {
1.138 + set2.put(new PreferencesProperty(evt.getKey()));
1.139 + } else if (newValue == null) {
1.140 + set2.remove(evt.getKey());
1.141 + } else {
1.142 + try {
1.143 + if (p.getValue().equals(evt.getNewValue())) return;
1.144 + p.setValue(evt.getNewValue());
1.145 + } catch (IllegalArgumentException ex) {
1.146 + Logger.getLogger("org.netbeans.modules.apisupport.beanbrowser.PreferencesNode").//NOI18N
1.147 + log(Level.WARNING, null, ex);
1.148 + } catch (InvocationTargetException ex) {
1.149 + Logger.getLogger("org.netbeans.modules.apisupport.beanbrowser.PreferencesNode").//NOI18N
1.150 + log(Level.WARNING, null, ex);
1.151 + } catch (IllegalAccessException ex) {
1.152 + Logger.getLogger("org.netbeans.modules.apisupport.beanbrowser.PreferencesNode").//NOI18N
1.153 + log(Level.WARNING, null, ex); }
1.154 + }
1.155 + }
1.156 + };
1.157 + getPreferences().addPreferenceChangeListener(pL);
1.158 + }
1.159 + return set;
1.160 + }
1.161 +
1.162 + private class PreferencesProperty extends PropertySupport.ReadWrite {
1.163 + PreferencesProperty(String key) {
1.164 + super(key, String.class, key, key);
1.165 + }
1.166 +
1.167 + public Object getValue() throws IllegalAccessException, InvocationTargetException {
1.168 + return getPreferences().get(getName(), "");//NOI18N;
1.169 + }
1.170 +
1.171 + public void setValue(Object val) throws IllegalAccessException, IllegalArgumentException,
1.172 + InvocationTargetException {
1.173 + Object oldValue = getValue();
1.174 + if (oldValue.equals(val)) return;
1.175 + getPreferences().put(getName(), val.toString());//NOI18N
1.176 + firePropertyChange(getName(), oldValue,val);
1.177 + }
1.178 + }
1.179 +
1.180 + private static class PreferencesChildren extends Children.Keys {
1.181 + private final String absolutePath;
1.182 + private int type;
1.183 + PreferencesChildren(int type, final String absolutePath) {
1.184 + super();
1.185 + this.type = type;
1.186 + this.absolutePath = absolutePath;
1.187 + }
1.188 +
1.189 + protected void addNotify() {
1.190 + refreshKeys();
1.191 + NodeChangeListener nL = new NodeChangeListener() {
1.192 + public void childAdded(NodeChangeEvent evt) {
1.193 + if (!evt.getParent().equals(getPreferences())) {
1.194 + return;
1.195 + }
1.196 + refreshKeys();
1.197 + }
1.198 + public void childRemoved(NodeChangeEvent evt) {
1.199 + childAdded(evt);
1.200 + }
1.201 + };
1.202 + getPreferences().addNodeChangeListener(nL);
1.203 + }
1.204 +
1.205 + private void refreshKeys() {
1.206 + Preferences parent = getPreferences();
1.207 + try {
1.208 + String[] names = parent.childrenNames();
1.209 + List children = new ArrayList();
1.210 + for (int i = 0; i < names.length; i++) {
1.211 + children.add(parent.node(names[i]).absolutePath());
1.212 + }
1.213 + setKeys(children);
1.214 + } catch (BackingStoreException ex) {
1.215 + setKeys(new String[0]);
1.216 + }
1.217 + }
1.218 +
1.219 +
1.220 + protected Node[] createNodes(Object key) {
1.221 + assert key != null;
1.222 + if (key instanceof String) {
1.223 + return new Node[] {new PreferencesNodeImpl(type,(String)key)};
1.224 + } else {
1.225 + throw new IllegalStateException(key.getClass().getName());
1.226 + }
1.227 + }
1.228 +
1.229 + protected Preferences getPreferences() {
1.230 + Preferences root = null;
1.231 + switch(type) {
1.232 + case PreferencesNode.NB_USER:
1.233 + root = NbPreferences.root();
1.234 + break;
1.235 + case PreferencesNode.DEFAULT_USER:
1.236 + root = Preferences.userRoot();
1.237 + break;
1.238 + case PreferencesNode.DEFAULT_SYSTEM:
1.239 + root = Preferences.systemRoot();
1.240 + break;
1.241 + default:
1.242 + assert false;
1.243 + }
1.244 + return root.node(absolutePath);
1.245 + }
1.246 + }
1.247 + }
1.248 +}
2.1 --- a/apisupport.beanbrowser/src/org/netbeans/modules/apisupport/beanbrowser/layer.xml Sat Oct 07 12:43:26 2006 +0000
2.2 +++ b/apisupport.beanbrowser/src/org/netbeans/modules/apisupport/beanbrowser/layer.xml Wed Oct 11 13:06:26 2006 +0000
2.3 @@ -9,6 +9,7 @@
2.4 <folder name="UI">
2.5 <folder name="Runtime">
2.6 <file name="org-netbeans-modules-apisupport-beanbrowser-MainNode.instance"/>
2.7 + <file name="org-netbeans-modules-apisupport-beanbrowser-PreferencesNode.instance"/>
2.8 </folder>
2.9 </folder>
2.10 </filesystem>