/** * Copyright (C) 2012 Eric Van Dewoestine * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.eclim.plugin.core.preference; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import org.eclim.util.StringUtils; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.runtime.preferences.DefaultScope; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.core.runtime.preferences.InstanceScope; /** * OptionHandler which works uses IEclipsePreferences as the back end. * * @author Eric Van Dewoestine */ public class PreferencesOptionHandler implements OptionHandler { private String natureId; private boolean supportsProjectScope; private HashMap<String,HashSet<String>> supportedPreferences = new HashMap<String,HashSet<String>>(); /** * Constructs a new handler for the supplied nature id with support for * project scoped preferences. * * @param natureId The nature id. */ public PreferencesOptionHandler(String natureId) { this(natureId, true); } /** * Constructs a new handler for the supplied nature id with support for * project scoped preferences if supportsProjectScope is true, otherwise only * globally scoped preferences will be supported. * * @param natureId The nature id. * @param supportsProjectScope True to support project scoped preferences, * false otherwise. */ public PreferencesOptionHandler(String natureId, boolean supportsProjectScope) { this.natureId = natureId; this.supportsProjectScope = supportsProjectScope; } /** * Add an array of supported preferences for the supplied qualifier. * * @param qualifier The preferences node qualifier. * @param names Array of preference names to add. */ public void addSupportedPreferences(String qualifier, String[] names) { HashSet<String> set = supportedPreferences.get(qualifier); if (set == null){ set = new HashSet<String>(names.length); supportedPreferences.put(qualifier, set); } for (String name : names){ set.add(name); } } /** * Gets an array of preference qualifiers supported by this handle. * * @return Array of preference qualifiers. */ public String[] getQualifiers() { return supportedPreferences.keySet().toArray(new String[0]); } @Override public String getNature() { return natureId; } @Override public Map<String,String> getValues() throws Exception { return getValues(InstanceScope.INSTANCE); } @Override public Map<String,String> getValues(IProject project) throws Exception { return getValues(supportsProjectScope ? new ProjectScope(project) : InstanceScope.INSTANCE); } private Map<String,String> getValues(IScopeContext scope) throws Exception { Map<String, String> values = new HashMap<String,String>(); for (String qualifier : supportedPreferences.keySet()){ IEclipsePreferences prefs = scope.getNode(qualifier); IEclipsePreferences defaults = DefaultScope.INSTANCE.getNode(qualifier); for (String key : supportedPreferences.get(qualifier)){ values.put(qualifier + '.' + key, prefs.get(key, defaults.get(key, StringUtils.EMPTY))); } } return values; } @Override public void setOption(String name, String value) throws Exception { setOption(InstanceScope.INSTANCE, name, value); } @Override public void setOption(IProject project, String name, String value) throws Exception { setOption(supportsProjectScope ? new ProjectScope(project) : InstanceScope.INSTANCE, name, value); } private void setOption(IScopeContext scope, String name, String value) throws Exception { for (String qualifier : supportedPreferences.keySet()){ String relName = name.replaceFirst(qualifier + '.', ""); if (supportedPreferences.get(qualifier).contains(relName)){ IEclipsePreferences prefs = scope.getNode(qualifier); prefs.put(relName, value); prefs.flush(); return; } } } }