/**
* Copyright (c) 2013-2016 Angelo ZERR.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
*/
package tern.eclipse.ide.core.preferences;
import java.util.HashMap;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
public class PreferencesSupport {
private HashMap projectToScope;
private String nodeQualifier;
private Preferences preferenceStore;
/**
* Constructs a new PreferencesSupport.
*
* @param nodeQualifier
* A string qualifier for the node (for example:
* PHPCorePlugin.ID)
* @param preferenceStore
* The relevant preferences store.
*/
public PreferencesSupport(String nodeQualifier, Preferences preferenceStore) {
this.nodeQualifier = nodeQualifier;
this.preferenceStore = preferenceStore;
projectToScope = new HashMap();
}
/**
* Returns the project-specific value, or null if there is no node for the
* project scope.
*
* @param key
* The preferences key
* @param def
* The default value to return.
* @param project
* The IProject
* @return The project-specific value for the given key.
*/
public String getProjectSpecificPreferencesValue(String key, String def,
IProject project) {
assert project != null;
IEclipsePreferences node = getEclipsePreferences(project);
if (node != null) {
return node.get(key, def);
}
return null;
}
/**
* Return the {@link IEclipsePreferences} from the given project.
*
* @param project
* @return the {@link IEclipsePreferences} from the given project.
*/
public IEclipsePreferences getEclipsePreferences(IProject project) {
ProjectScope scope = (ProjectScope) projectToScope.get(project);
if (scope == null) {
scope = new ProjectScope(project);
projectToScope.put(project, scope);
}
IEclipsePreferences node = scope.getNode(nodeQualifier);
return node;
}
/**
* Returns the value for the key by first searching for it as a
* project-specific and if it is undefined as such, search it as a workspace
* property.
*
* @param key
* The preferences key.
* @param def
* The default value to return.
* @param project
* The IProject (may be null).
* @return Returns the value for the key.
* @see #getProjectSpecificPreferencesValue(String, String, IProject)
* @see #getWorkspacePreferencesValue(String)
* @see #getWorkspacePreferencesValue(String, IPreferenceStore)
*/
public String getPreferencesValue(String key, String def, IProject project) {
if (project == null) {
return getWorkspacePreferencesValue(key);
}
String projectSpecificPreferencesValue = getProjectSpecificPreferencesValue(
key, def, project);
if (projectSpecificPreferencesValue == null) {
return getWorkspacePreferencesValue(key);
}
return projectSpecificPreferencesValue;
}
/**
* Returns the value for the key, as found in the preferences store.
*
* @param key
* @return
*/
public String getWorkspacePreferencesValue(String key) {
return preferenceStore == null ? null : preferenceStore.getString(key);
}
/**
* Returns the value for the key, as found in the given preferences store.
*
* @param key
* @param preferenceStore
* @return The String value
*/
public static String getWorkspacePreferencesValue(String key,
Preferences preferenceStore) {
return preferenceStore.getString(key);
}
/**
* Returns the project-specific value, or null if there is no node for the
* project scope.
*
* @param key
* The preferences key
* @param value
* The preference value.
* @param project
* The IProject
* @return boolean When the value was set.
*/
public boolean setProjectSpecificPreferencesValue(String key, String value,
IProject project) {
assert project != null;
if (!project.exists()) {
return false;
}
IEclipsePreferences node = getEclipsePreferences(project);
if (node != null) {
node.put(key, value);
try {
node.flush();
} catch (Exception e) {
// Logger.logException(e);
}
return true;
}
return false;
}
}