/*******************************************************************************
* Copyright (c) 2010 Martin Schnabel <mb0@mb0.org>.
* 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
******************************************************************************/
package org.axdt.common.preferences;
import java.util.Arrays;
import java.util.List;
import org.axdt.common.preferences.fields.BooleanField;
import org.axdt.common.preferences.fields.ComboField;
import org.axdt.common.preferences.fields.FileField;
import org.axdt.common.preferences.fields.HelpField;
import org.axdt.common.preferences.fields.IntegerField;
import org.axdt.common.preferences.fields.ResourceField;
import org.axdt.common.preferences.fields.StringField;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
import org.eclipse.core.runtime.preferences.ConfigurationScope;
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;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.texteditor.ChainedPreferenceStore;
import com.google.common.collect.Lists;
public abstract class AbstractPreferences extends AbstractPreferenceInitializer implements
IAxdtPreferences {
private List<PrefPage> pages;
private List<PrefGroup> groups;
private List<FieldSpec<?>> specs;
private PrefPage lastPage;
private PrefGroup lastGroup = null;
private ScopedPreferenceStore store;
private ScopedPreferenceStore configStore;
private IPreferenceStore readOnlyStore;
public AbstractPreferences(String desc) {
super();
lastPage = new PrefPage(this, PAGE_DEFAULT, desc);
pages = Lists.newArrayList(lastPage);
groups = Lists.newArrayList();
specs = Lists.newArrayList();
initializeFieldSpecs();
zipLastPage();
}
@Override
public void initializeDefaultPreferences() {
IEclipsePreferences def = DefaultScope.INSTANCE.getNode(getQualifier());
for (FieldSpec<?> spec : getAllFieldSpecs())
spec.setDefault(def);
}
protected void zipLastPage() {
endGroup();
lastPage.setSpecs(specs);
lastPage.setGroups(groups);
specs.clear();
groups.clear();
}
protected PrefGroup addGroup(String title, boolean keepLayout, int flags) {
int index = endGroup();
lastGroup = new PrefGroup(title, keepLayout, flags, index);
groups.add(lastGroup);
return lastGroup;
}
protected PrefGroup addGroup(String title, boolean keepLayout) {
return addGroup(title, keepLayout, 0);
}
protected int endGroup() {
int index = specs.size();
if (lastGroup != null) {
lastGroup.setEnd(index);
lastGroup = null;
}
return index;
}
protected PrefPage addPage(String key, String desc) {
zipLastPage();
lastPage = new PrefPage(this, key, desc);
pages.add(lastPage);
return lastPage;
}
protected FieldSpec<?> add(FieldSpec<?> spec) {
specs.add(spec);
return spec;
}
protected FieldSpec<?> add(String key, String desc, String defValue, boolean absolute,
String[] extensions) {
return add(new FileField(key, desc, defValue, absolute, extensions));
}
protected FieldSpec<?> add(String key, String desc, String defValue, String[] extensions) {
return add(new ResourceField(key, desc, defValue, extensions));
}
protected FieldSpec<?> add(String key, String desc, String[][] choices) {
return add(new ComboField(key, desc, choices));
}
protected FieldSpec<?> add(String key, String desc, String defValue) {
return add(new StringField(key, desc, defValue));
}
protected FieldSpec<?> add(String key, String desc, Integer defValue) {
return add(new IntegerField(key, desc, defValue));
}
protected FieldSpec<?> add(String key, String desc, Boolean defValue) {
return add(new BooleanField(key, desc, defValue));
}
protected FieldSpec<?> addHelp(String helpText) {
return add(new HelpField(helpText));
}
public PrefPage getPage(String pageKey) {
for (PrefPage p : pages) {
if (p.getKey().equals(pageKey))
return p;
}
return null;
}
public List<FieldSpec<?>> getAllFieldSpecs() {
List<FieldSpec<?>> result = Lists.newArrayList();
for (PrefPage p : pages) {
result.addAll(Arrays.asList(p.getFieldSpecs()));
}
return result;
}
public IPreferenceStore getStore() {
// cache and return the instance scope store
if (store == null) {
IScopeContext[] search = new IScopeContext[] { InstanceScope.INSTANCE,
ConfigurationScope.INSTANCE };
store = new ScopedPreferenceStore(search[0], search, getQualifier());
}
return store;
}
public IPreferenceStore getConfigStore() {
// cache and return a configuration scope store
if (configStore == null)
configStore = new ScopedPreferenceStore(ConfigurationScope.INSTANCE, getQualifier());
return configStore;
}
public IPreferenceStore getProjectStore(IResource res) {
if (res == null || res.getProject() == null || !res.getProject().exists()) {
// cache and return a read only instance scope store
if (readOnlyStore == null)
readOnlyStore = new ChainedPreferenceStore(new IPreferenceStore[] { getStore() });
return readOnlyStore;
}
// return a fresh project scope store
IScopeContext[] search = new IScopeContext[] { new ProjectScope(res.getProject()),
InstanceScope.INSTANCE, ConfigurationScope.INSTANCE };
ScopedPreferenceStore store = new ScopedPreferenceStore(search[0], search, getQualifier());
return store;
}
public boolean getBoolean(IResource resource, String name) {
return getProjectStore(resource).getBoolean(name);
}
public int getInt(IResource resource, String name) {
return getProjectStore(resource).getInt(name);
}
public double getDouble(IResource resource, String name) {
return getProjectStore(resource).getDouble(name);
}
public String getString(IResource resource, String name) {
return getProjectStore(resource).getString(name);
}
public boolean getBoolean(ILaunchConfiguration config, String name) throws CoreException {
return config.getAttribute(name, getStore().getBoolean(name));
}
public String getString(ILaunchConfiguration config, String name) throws CoreException {
return config.getAttribute(name, getStore().getString(name));
}
public String getConfigId() {
return getQualifier();
}
}