Fixed: [ Issue 64 ] Project preferences are being shared, and they shouldn't
https://code.google.com/p/protobuf-dt/issues/detail?id=64
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
index 380ffc4..349492d 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
@@ -18,7 +18,7 @@
import org.eclipse.xtext.ui.editor.*;
import org.eclipse.xtext.ui.editor.model.XtextDocumentProvider;
import org.eclipse.xtext.ui.editor.outline.actions.IOutlineContribution;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
+import org.eclipse.xtext.ui.editor.preferences.*;
import org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator;
import com.google.eclipse.protobuf.scoping.IFileUriResolver;
@@ -28,6 +28,7 @@
import com.google.eclipse.protobuf.ui.editor.model.ProtobufDocumentProvider;
import com.google.eclipse.protobuf.ui.editor.syntaxcoloring.ProtobufSemanticHighlightingCalculator;
import com.google.eclipse.protobuf.ui.outline.*;
+import com.google.eclipse.protobuf.ui.preferences.PreferenceStoreAccess;
import com.google.eclipse.protobuf.ui.preferences.compiler.CompilerPreferenceStoreInitializer;
import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferenceStoreInitializer;
import com.google.eclipse.protobuf.ui.scoping.FileUriResolver;
@@ -96,4 +97,8 @@
public void configureSemanticHighlightingCalculator(Binder binder) {
binder.bind(ISemanticHighlightingCalculator.class).to(ProtobufSemanticHighlightingCalculator.class);
}
+
+ public void configurePreferenceStoreAccess(Binder binder) {
+ binder.bind(IPreferenceStoreAccess.class).to(PreferenceStoreAccess.class);
+ }
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/PreferenceAndPropertyPage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/PreferenceAndPropertyPage.java
index a7c5518..523b149 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/PreferenceAndPropertyPage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/PreferenceAndPropertyPage.java
@@ -38,11 +38,7 @@
private IProject project;
private Map<String, Object> dataMap;
- private final IPreferenceStoreAccess preferenceStoreAccess;
-
- @Inject public PreferenceAndPropertyPage(IPreferenceStoreAccess preferenceStoreAccess) {
- this.preferenceStoreAccess = preferenceStoreAccess;
- }
+ @Inject private IPreferenceStoreAccess preferenceStoreAccess;
/**
* Creates the <code>{@link Composite}</code> to be used as the base container in implementations of
@@ -174,14 +170,26 @@
public void init(IWorkbench workbench) {}
@Override public final boolean performOk() {
- savePreferences();
+ savePreferences(getPreferenceStore());
return true;
}
/**
* Saves the current settings.
+ * @param store the preference store used by this page.
*/
- protected abstract void savePreferences();
+ protected abstract void savePreferences(IPreferenceStore store);
+
+ @Override protected final void performDefaults() {
+ performDefaults(getPreferenceStore());
+ super.performDefaults();
+ }
+
+ /**
+ * Performs special processing when this page's "Defaults" button has been pressed.
+ * @param store the preference store used by this page.
+ */
+ protected abstract void performDefaults(IPreferenceStore store);
/**
* Marks this page as "valid."
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/PreferenceStoreAccess.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/PreferenceStoreAccess.java
new file mode 100644
index 0000000..98b1424
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/PreferenceStoreAccess.java
@@ -0,0 +1,81 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+package com.google.eclipse.protobuf.ui.preferences;
+
+import com.google.eclipse.protobuf.ui.internal.ProtobufActivator;
+import com.google.inject.*;
+import com.google.inject.name.Named;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.preferences.*;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.preferences.ScopedPreferenceStore;
+import org.eclipse.ui.texteditor.ChainedPreferenceStore;
+import org.eclipse.xtext.Constants;
+import org.eclipse.xtext.ui.editor.preferences.*;
+
+/**
+ * Workaround for bug in Xtext where a project's preference store is never used.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@Singleton
+public class PreferenceStoreAccess implements IPreferenceStoreAccess {
+
+ private boolean initialized = false;
+
+ @Inject private IPreferenceStoreInitializer.CompositeImpl initializer;
+
+ private String qualifier;
+
+ public IPreferenceStore getContextPreferenceStore(Object context) {
+ lazyInitialize();
+ return new ChainedPreferenceStore(new IPreferenceStore[] { getWritablePreferenceStore(context),
+ ProtobufActivator.getInstance().getPreferenceStore(), EditorsUI.getPreferenceStore()});
+ }
+
+ public IPreferenceStore getPreferenceStore() {
+ lazyInitialize();
+ return new ChainedPreferenceStore(new IPreferenceStore[] { getWritablePreferenceStore(),
+ ProtobufActivator.getInstance().getPreferenceStore(), EditorsUI.getPreferenceStore()});
+ }
+
+ protected String getQualifier() {
+ return qualifier;
+ }
+
+ public IPreferenceStore getWritablePreferenceStore() {
+ lazyInitialize();
+ ScopedPreferenceStore result = new ScopedPreferenceStore(InstanceScope.INSTANCE, getQualifier());
+ result.setSearchContexts(new IScopeContext[] { InstanceScope.INSTANCE, ConfigurationScope.INSTANCE });
+ return result;
+ }
+
+ public IPreferenceStore getWritablePreferenceStore(Object context) {
+ lazyInitialize();
+ Object finalContext = context;
+ if (finalContext instanceof IFileEditorInput) {
+ finalContext = ((IFileEditorInput) context).getFile().getProject();
+ }
+ if (finalContext instanceof IProject) {
+ ProjectScope projectScope = new ProjectScope((IProject) finalContext);
+ ScopedPreferenceStore result = new ScopedPreferenceStore(projectScope, getQualifier());
+ result.setSearchContexts(new IScopeContext[] { projectScope, InstanceScope.INSTANCE, ConfigurationScope.INSTANCE });
+ return result;
+ }
+ return getWritablePreferenceStore();
+ }
+
+ protected void lazyInitialize() {
+ if (!initialized) {
+ initialized = true;
+ initializer.initialize(this);
+ }
+ }
+
+ @Inject public void setLanguageNameAsQualifier(@Named(Constants.LANGUAGE_NAME) String languageName) {
+ this.qualifier = languageName;
+ }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/RootPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/RootPreferencePage.java
index 559cfb6..af1538a 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/RootPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/RootPreferencePage.java
@@ -8,11 +8,9 @@
*/
package com.google.eclipse.protobuf.ui.preferences;
+import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-
-import com.google.inject.Inject;
/**
* @author alruiz@google.com (Alex Ruiz)
@@ -21,10 +19,6 @@
private static final String PREFERENCE_PAGE_ID = RootPreferencePage.class.getName();
- @Inject public RootPreferencePage(IPreferenceStoreAccess preferenceStoreAccess) {
- super(preferenceStoreAccess);
- }
-
/** {@inheritDoc} */
@Override protected Control createContents(Composite parent) {
// generated by WindowBuilder
@@ -43,5 +37,8 @@
}
/** {@inheritDoc} */
- @Override protected void savePreferences() {}
+ @Override protected void savePreferences(IPreferenceStore store) {}
+
+ /** {@inheritDoc} */
+ @Override protected void performDefaults(IPreferenceStore store) {}
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferencePage.java
index 6630528..0814dd4 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferencePage.java
@@ -14,21 +14,17 @@
import static java.util.Arrays.asList;
import static org.eclipse.xtext.util.Strings.isEmpty;
-import java.io.File;
+import com.google.eclipse.protobuf.ui.preferences.*;
+import com.google.inject.Inject;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.xtext.ui.PluginImageHelper;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-import com.google.eclipse.protobuf.ui.preferences.DataChangedListener;
-import com.google.eclipse.protobuf.ui.preferences.PreferenceAndPropertyPage;
-import com.google.inject.Inject;
+import java.io.File;
/**
* Preference page for protobuf compiler.
@@ -58,10 +54,6 @@
@Inject private PluginImageHelper imageHelper;
@Inject private CodeGenerationPreferencesProvider codeGenerationPreferencesProvider;
- @Inject public CompilerPreferencePage(IPreferenceStoreAccess preferenceStoreAccess) {
- super(preferenceStoreAccess);
- }
-
/** {@inheritDoc} */
@Override protected Control createContents(Composite parent) {
// generated by WindowBuilder
@@ -142,7 +134,7 @@
}
private void updateFromPreferenceStore() {
- IPreferenceStore store = doGetPreferenceStore();
+ IPreferenceStore store = getPreferenceStore();
boolean compileProtoFiles = store.getBoolean(COMPILE_PROTO_FILES);
btnCompileProtoFiles.setSelection(compileProtoFiles);
btnUseProtocInSystemPath.setSelection(store.getBoolean(USE_PROTOC_IN_SYSTEM_PATH));
@@ -226,8 +218,7 @@
}
/** {@inheritDoc} */
- @Override protected void performDefaults() {
- IPreferenceStore store = doGetPreferenceStore();
+ @Override protected void performDefaults(IPreferenceStore store) {
boolean compileProtoFiles = store.getDefaultBoolean(COMPILE_PROTO_FILES);
btnCompileProtoFiles.setSelection(compileProtoFiles);
btnUseProtocInSystemPath.setSelection(store.getDefaultBoolean(USE_PROTOC_IN_SYSTEM_PATH));
@@ -302,8 +293,7 @@
}
/** {@inheritDoc} */
- @Override protected void savePreferences() {
- IPreferenceStore store = getPreferenceStore();
+ @Override protected void savePreferences(IPreferenceStore store) {
if (isPropertyPage()) store.setValue(ENABLE_PROJECT_SETTINGS, areProjectSettingsActive());
store.setValue(COMPILE_PROTO_FILES, btnCompileProtoFiles.getSelection());
store.setValue(USE_PROTOC_IN_SYSTEM_PATH, btnUseProtocInSystemPath.getSelection());
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
index 48a35ce..bd15f7d 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
@@ -15,8 +15,8 @@
import static java.util.Collections.unmodifiableList;
import static org.eclipse.xtext.util.Strings.*;
-import java.util.*;
-import java.util.List;
+import com.google.eclipse.protobuf.ui.preferences.*;
+import com.google.inject.Inject;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
@@ -24,10 +24,9 @@
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.xtext.ui.PluginImageHelper;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-import com.google.eclipse.protobuf.ui.preferences.*;
-import com.google.inject.Inject;
+import java.util.*;
+import java.util.List;
/**
* Preference page for import paths.
@@ -46,10 +45,6 @@
@Inject private PluginImageHelper imageHelper;
- @Inject public PathsPreferencePage(IPreferenceStoreAccess preferenceStoreAccess) {
- super(preferenceStoreAccess);
- }
-
/** {@inheritDoc} */
@Override protected Control createContents(Composite parent) {
// generated by WindowBuilder
@@ -80,7 +75,7 @@
}
private void updateFromPreferenceStore() {
- IPreferenceStore store = doGetPreferenceStore();
+ IPreferenceStore store = getPreferenceStore();
btnOneFolderOnly.setSelection(store.getBoolean(FILES_IN_ONE_DIRECTORY_ONLY));
btnMultipleFolders.setSelection(store.getBoolean(FILES_IN_MULTIPLE_DIRECTORIES));
setDirectoryPaths(store.getString(DIRECTORY_PATHS));
@@ -115,8 +110,7 @@
enableProjectOptions(active);
}
- @Override protected void performDefaults() {
- IPreferenceStore store = doGetPreferenceStore();
+ @Override protected void performDefaults(IPreferenceStore store) {
btnOneFolderOnly.setSelection(store.getDefaultBoolean(FILES_IN_ONE_DIRECTORY_ONLY));
btnMultipleFolders.setSelection(store.getDefaultBoolean(FILES_IN_MULTIPLE_DIRECTORIES));
setDirectoryPaths(store.getDefaultString(DIRECTORY_PATHS));
@@ -141,8 +135,7 @@
}
/** {@inheritDoc} */
- @Override protected void savePreferences() {
- IPreferenceStore store = getPreferenceStore();
+ @Override protected void savePreferences(IPreferenceStore store) {
store.setValue(FILES_IN_ONE_DIRECTORY_ONLY, btnOneFolderOnly.getSelection());
store.setValue(FILES_IN_MULTIPLE_DIRECTORIES, btnMultipleFolders.getSelection());
store.setValue(DIRECTORY_PATHS, directoryNames());
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java
index 6c3dc6d..262203b 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java
@@ -19,7 +19,8 @@
import org.eclipse.jface.preference.IPreferenceStore;
/**
- * Paths preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
+ * Paths preferences, retrieved from an <code>{@link IPreferenceStore}</code>. To create a new instance invoke
+ * <code>{@link PathsPreferencesProvider#getPreferences(org.eclipse.core.resources.IProject)}</code>
*
* @author alruiz@google.com (Alex Ruiz)
*/