diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/BooleanPreference_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/BooleanPreference_Test.java
index 5f54bba..12483d6 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/BooleanPreference_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/BooleanPreference_Test.java
@@ -34,23 +34,23 @@
 
   @Test public void should_read_value_from_IPreferenceStore() {
     when(store.getBoolean(name)).thenReturn(true);
-    assertTrue(preference.value());
+    assertTrue(preference.getValue());
     verify(store).getBoolean(name);
   }
 
   @Test public void should_read_default_value_from_IPreferenceStore() {
     when(store.getDefaultBoolean(name)).thenReturn(true);
-    assertTrue(preference.defaultValue());
+    assertTrue(preference.getDefaultValue());
     verify(store).getDefaultBoolean(name);
   }
 
   @Test public void should_update_value_in_IPreferenceStore() {
-    preference.value(true);
+    preference.setValue(true);
     verify(store).setValue(name, true);
   }
 
   @Test public void should_update_default_value_in_IPreferenceStore() {
-    preference.defaultValue(true);
+    preference.setDefaultValue(true);
     verify(store).setDefault(name, true);
   }
 }
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/Buttons_add_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/Buttons_add_Test.java
index f29ca4f..0d3cd8a 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/Buttons_add_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/Buttons_add_Test.java
@@ -14,8 +14,10 @@
 import org.eclipse.swt.widgets.Button;
 import org.junit.*;
 
+import com.google.eclipse.protobuf.ui.preferences.pages.ButtonGroup;
+
 /**
- * Tests for <code>{@link Buttons#add(SelectionListener)}</code>.
+ * Tests for <code>{@link ButtonGroup#add(SelectionListener)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
@@ -30,7 +32,7 @@
   }
 
   @Test public void should_add_SelectionListener_to_all_buttons() {
-    Buttons.with(buttons).add(listener);
+    ButtonGroup.with(buttons).add(listener);
     for (Button b : buttons) {
       verify(b).addSelectionListener(listener);
     }
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToButtonSelection_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToButtonSelection_Test.java
index cffb1fb..dc3f226 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToButtonSelection_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToButtonSelection_Test.java
@@ -8,13 +8,14 @@
  */
 package com.google.eclipse.protobuf.ui.preferences.binding;
 
-import static com.google.eclipse.protobuf.ui.preferences.binding.BindingToButtonSelection.bindSelectionOf;
+import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToButtonSelection.bindSelectionOf;
 import static org.mockito.Mockito.*;
 
 import org.eclipse.swt.widgets.Button;
 import org.junit.*;
 
 import com.google.eclipse.protobuf.ui.preferences.BooleanPreference;
+import com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToButtonSelection;
 
 /**
  * Tests for <code>{@link BindingToButtonSelection}</code>.
@@ -35,16 +36,16 @@
   }
 
   @Test public void should_apply_preference_value_to_selection_in_Button() {
-    when(preference.value()).thenReturn(true);
+    when(preference.getValue()).thenReturn(true);
     binding.applyPreferenceValueToTarget();
-    verify(preference).value();
+    verify(preference).getValue();
     verify(button).setSelection(true);
   }
 
   @Test public void should_apply_preference_default_value_to_selection_in_Button() {
-    when(preference.defaultValue()).thenReturn(true);
+    when(preference.getDefaultValue()).thenReturn(true);
     binding.applyDefaultPreferenceValueToTarget();
-    verify(preference).defaultValue();
+    verify(preference).getDefaultValue();
     verify(button).setSelection(true);
   }
 
@@ -52,6 +53,6 @@
     when(button.getSelection()).thenReturn(true);
     binding.savePreferenceValue();
     verify(button).getSelection();
-    verify(preference).value(true);
+    verify(preference).setValue(true);
   }
 }
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToListItems_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToListItems_Test.java
index ba57ad9..8eef4ed 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToListItems_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToListItems_Test.java
@@ -8,7 +8,7 @@
  */
 package com.google.eclipse.protobuf.ui.preferences.binding;
 
-import static com.google.eclipse.protobuf.ui.preferences.binding.BindingToListItems.bindItemsOf;
+import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToListItems.bindItemsOf;
 import static java.util.Arrays.asList;
 import static org.mockito.Mockito.*;
 
@@ -16,6 +16,7 @@
 import org.junit.*;
 
 import com.google.eclipse.protobuf.ui.preferences.StringListPreference;
+import com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToListItems;
 
 /**
  * Tests for <code>{@link BindingToListItems}</code>.
@@ -36,18 +37,18 @@
   }
 
   @Test public void should_apply_preference_value_to_selection_in_Button() {
-    when(preference.value()).thenReturn(asList("One" , "Two"));
+    when(preference.getValue()).thenReturn(asList("One" , "Two"));
     binding.applyPreferenceValueToTarget();
-    verify(preference).value();
+    verify(preference).getValue();
     verify(list).removeAll();
     verify(list).add("One");
     verify(list).add("Two");
   }
 
   @Test public void should_apply_preference_default_value_to_selection_in_Button() {
-    when(preference.defaultValue()).thenReturn(asList("One" , "Two"));
+    when(preference.getDefaultValue()).thenReturn(asList("One" , "Two"));
     binding.applyDefaultPreferenceValueToTarget();
-    verify(preference).defaultValue();
+    verify(preference).getDefaultValue();
     verify(list).removeAll();
     verify(list).add("One");
     verify(list).add("Two");
@@ -57,6 +58,6 @@
     when(list.getItems()).thenReturn(new String[] { "One", "Two" });
     binding.savePreferenceValue();
     verify(list).getItems();
-    verify(preference).value(asList("One" , "Two"));
+    verify(preference).setValue(asList("One" , "Two"));
   }
 }
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToTextValue_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToTextValue_Test.java
index ce8367d..c7782e7 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToTextValue_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToTextValue_Test.java
@@ -8,13 +8,14 @@
  */
 package com.google.eclipse.protobuf.ui.preferences.binding;
 
-import static com.google.eclipse.protobuf.ui.preferences.binding.BindingToTextValue.bindTextOf;
+import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToTextValue.bindTextOf;
 import static org.mockito.Mockito.*;
 
 import org.eclipse.swt.widgets.Text;
 import org.junit.*;
 
 import com.google.eclipse.protobuf.ui.preferences.StringPreference;
+import com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToTextValue;
 
 /**
  * Tests for <code>{@link BindingToTextValue}</code>.
@@ -35,16 +36,16 @@
   }
 
   @Test public void should_apply_preference_value_to_selection_in_Button() {
-    when(preference.value()).thenReturn("Hello World");
+    when(preference.getValue()).thenReturn("Hello World");
     binding.applyPreferenceValueToTarget();
-    verify(preference).value();
+    verify(preference).getValue();
     verify(text).setText("Hello World");
   }
 
   @Test public void should_apply_preference_default_value_to_selection_in_Button() {
-    when(preference.defaultValue()).thenReturn("Hello World");
+    when(preference.getDefaultValue()).thenReturn("Hello World");
     binding.applyDefaultPreferenceValueToTarget();
-    verify(preference).defaultValue();
+    verify(preference).getDefaultValue();
     verify(text).setText("Hello World");
   }
 
@@ -52,6 +53,6 @@
     when(text.getText()).thenReturn("Hello World");
     binding.savePreferenceValue();
     verify(text).getText();
-    verify(preference).value("Hello World");
+    verify(preference).setValue("Hello World");
   }
 }
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/PreferenceBinder_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/PreferenceBinder_Test.java
index 7456a41..1765cd2 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/PreferenceBinder_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/binding/PreferenceBinder_Test.java
@@ -12,6 +12,8 @@
 
 import org.junit.*;
 
+import com.google.eclipse.protobuf.ui.preferences.pages.binding.*;
+
 /**
  * Tests for <code>{@link PreferenceBinder}</code>.
  *
diff --git a/com.google.eclipse.protobuf.ui/plugin.xml b/com.google.eclipse.protobuf.ui/plugin.xml
index c46e8aa..ffe8025 100644
--- a/com.google.eclipse.protobuf.ui/plugin.xml
+++ b/com.google.eclipse.protobuf.ui/plugin.xml
@@ -53,7 +53,7 @@
   </extension>
   <extension point="org.eclipse.ui.preferencePages">
     <page
-      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.pages.general.GeneralPreferencePage"
+      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.general.page.GeneralPreferencePage"
       id="com.google.eclipse.protobuf.Protobuf"
       name="%page.name">
       <keywordReference id="com.google.eclipse.protobuf.ui.keyword_Protobuf" />
@@ -67,29 +67,29 @@
     </page>
     <page
       category="com.google.eclipse.protobuf.Protobuf"
-      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.pages.compiler.CompilerPreferencePage"
-      id="com.google.eclipse.protobuf.ui.preferences.pages.compiler.CompilerPreferencePage"
+      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.compiler.page.CompilerPreferencePage"
+      id="com.google.eclipse.protobuf.ui.preferences.compiler.page.CompilerPreferencePage"
       name="%page.name.2">
       <keywordReference id="com.google.eclipse.protobuf.ui.keyword_Protobuf" />
     </page>
     <page
       category="com.google.eclipse.protobuf.Protobuf"
-      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.pages.editor.EditorPreferencePage"
-      id="com.google.eclipse.protobuf.ui.preferences.pages.editor"
+      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.editor.general.page.EditorPreferencePage"
+      id="com.google.eclipse.protobuf.ui.preferences.editor.general.page.EditorPreferencePage"
       name="%page.name.4">
       <keywordReference id="com.google.eclipse.protobuf.ui.keyword_Protobuf" />
     </page>
     <page
       category="com.google.eclipse.protobuf.ui.preferences.pages.editor"
-      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.pages.editor.save.SaveActionsPreferencePage"
-      id="com.google.eclipse.protobuf.ui.preferences.pages.editor.save.SaveActionsPreferencePage"
+      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.editor.save.page.SaveActionsPreferencePage"
+      id="com.google.eclipse.protobuf.ui.preferences.editor.save.page.SaveActionsPreferencePage"
       name="%page.name.5">
       <keywordReference id="com.google.eclipse.protobuf.ui.keyword_Protobuf" />
     </page>
     <page
       category="com.google.eclipse.protobuf.ui.preferences.pages.editor"
-      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag.NumericTagPreferencePage"
-      id="com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag.NumericTagPreferencePage"
+      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.editor.numerictag.page.NumericTagPreferencePage"
+      id="com.google.eclipse.protobuf.ui.preferences.editor.numerictag.page.NumericTagPreferencePage"
       name="%page.name.6">
       <keywordReference id="com.google.eclipse.protobuf.ui.keyword_Protobuf" />
     </page>
@@ -227,7 +227,7 @@
     </page>
     <page
       category="com.google.eclipse.protobuf.Protobuf"
-      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.pages.compiler.CompilerPreferencePage"
+      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.compiler.page.CompilerPreferencePage"
       id="com.google.eclipse.protobuf.ui.properties.compiler.PropertyPage"
       name="%page.name.2"
       selectionFilter="single">
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 1ad4743..7de4f38 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
@@ -37,10 +37,10 @@
 import com.google.eclipse.protobuf.ui.internal.ProtobufActivator;
 import com.google.eclipse.protobuf.ui.outline.*;
 import com.google.eclipse.protobuf.ui.preferences.PreferenceStoreAccess;
-import com.google.eclipse.protobuf.ui.preferences.pages.compiler.CompilerPreferenceStoreInitializer;
-import com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag.NumericTagPreferenceStoreInitializer;
-import com.google.eclipse.protobuf.ui.preferences.pages.editor.save.SaveActionsPreferenceStoreInitializer;
-import com.google.eclipse.protobuf.ui.preferences.pages.general.GeneralPreferenceStoreInitializer;
+import com.google.eclipse.protobuf.ui.preferences.compiler.core.CompilerPreferenceStoreInitializer;
+import com.google.eclipse.protobuf.ui.preferences.editor.numerictag.core.NumericTagPreferenceStoreInitializer;
+import com.google.eclipse.protobuf.ui.preferences.editor.save.core.SaveActionsPreferenceStoreInitializer;
+import com.google.eclipse.protobuf.ui.preferences.general.core.GeneralPreferenceStoreInitializer;
 import com.google.eclipse.protobuf.ui.preferences.pages.paths.PathsPreferenceStoreInitializer;
 import com.google.eclipse.protobuf.ui.quickfix.ProtobufQuickAssistProcessor;
 import com.google.eclipse.protobuf.ui.scoping.FileUriResolver;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/OutputDirectories.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/OutputDirectories.java
index 3968f54..5956e75 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/OutputDirectories.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/OutputDirectories.java
@@ -8,65 +8,36 @@
  */
 package com.google.eclipse.protobuf.ui.builder.protoc;
 
-import static com.google.eclipse.protobuf.ui.util.Paths.segmentsOf;
-import static java.io.File.separator;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
 
-import java.util.*;
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-
-import com.google.eclipse.protobuf.ui.preferences.pages.compiler.*;
+import com.google.eclipse.protobuf.ui.preferences.compiler.core.CompilerPreferences;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
 class OutputDirectories {
 
-  private static final NullProgressMonitor NO_MONITOR = new NullProgressMonitor();
+  private final OutputDirectory java;
+  private final OutputDirectory cpp;
+  private final OutputDirectory python;
 
-  private final Map<SupportedLanguage, IFolder> outputDirectories = new HashMap<SupportedLanguage, IFolder>();
-
-  static OutputDirectories findOrCreateOutputDirectories(IProject project, CodeGenerationSettings preferences)
-      throws CoreException {
-    Map<SupportedLanguage, IFolder> outputDirectories = new HashMap<SupportedLanguage, IFolder>();
-    for (CodeGenerationSetting preference : preferences.allSettings()) {
-      if (!preference.isEnabled()) {
-        continue;
-      }
-      outputDirectories.put(preference.language(), findOrCreateOutputDirectory(project, preference));
-    }
-    return new OutputDirectories(outputDirectories);
+  OutputDirectories(IProject project, CompilerPreferences preferences) throws CoreException {
+    java = new OutputDirectory(project, preferences.javaCodeGenerationEnabled(), preferences.javaOutputDirectory());
+    cpp = new OutputDirectory(project, preferences.cppCodeGenerationEnabled(), preferences.cppOutputDirectory());
+    python = new OutputDirectory(project, preferences.pythonCodeGenerationEnabled(),
+        preferences.pythonOutputDirectory());
   }
 
-  private static IFolder findOrCreateOutputDirectory(IProject project, CodeGenerationSetting preference)
-      throws CoreException {
-    return findOrCreateOutputDirectory(project, preference.outputDirectory());
+  OutputDirectory java() {
+    return java;
   }
 
-  private static IFolder findOrCreateOutputDirectory(IProject project, String outputFolderName) throws CoreException {
-    IFolder outputFolder = null;
-    StringBuilder path = new StringBuilder();
-    for (String segment : segmentsOf(outputFolderName)) {
-      path.append(segment);
-      outputFolder = project.getFolder(path.toString());
-      if (!outputFolder.exists()) {
-        outputFolder.create(true, true, NO_MONITOR);
-      }
-      path.append(separator);
-    }
-    return outputFolder;
+  OutputDirectory cpp() {
+    return cpp;
   }
 
-  private OutputDirectories(Map<SupportedLanguage, IFolder> outputDirectories) {
-    this.outputDirectories.putAll(outputDirectories);
-  }
-
-  Collection<IFolder> values() {
-    return outputDirectories.values();
-  }
-
-  IFolder outputDirectoryFor(SupportedLanguage language) {
-    return outputDirectories.get(language);
+  OutputDirectory python() {
+    return python;
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/OutputDirectory.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/OutputDirectory.java
new file mode 100644
index 0000000..67cbaf6
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/OutputDirectory.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.builder.protoc;
+
+import static com.google.eclipse.protobuf.ui.util.Paths.segmentsOf;
+import static java.io.File.separator;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+
+import com.google.eclipse.protobuf.ui.preferences.*;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class OutputDirectory {
+  private static final NullProgressMonitor NO_MONITOR = new NullProgressMonitor();
+
+  private final boolean enabled;
+  private final IFolder location;
+
+  OutputDirectory(IProject project, BooleanPreference codeGenerationEnabled, StringPreference outputDirectory)
+      throws CoreException {
+    enabled = codeGenerationEnabled.getValue();
+    location = findOrCreateLocation(project, outputDirectory.getValue());
+  }
+
+  private IFolder findOrCreateLocation(IProject project, String directoryName) throws CoreException {
+    IFolder directory = null;
+    if (enabled) {
+      StringBuilder path = new StringBuilder();
+      for (String segment : segmentsOf(directoryName)) {
+        path.append(segment);
+        directory = project.getFolder(path.toString());
+        if (!directory.exists()) {
+          directory.create(true, true, NO_MONITOR);
+        }
+        path.append(separator);
+      }
+    }
+    return directory;
+  }
+
+  boolean isEnabled() {
+    return enabled;
+  }
+
+  IFolder getLocation() {
+    return location;
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtobufBuildParticipant.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtobufBuildParticipant.java
index 91f6d67..0c8e355 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtobufBuildParticipant.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtobufBuildParticipant.java
@@ -8,10 +8,10 @@
  */
 package com.google.eclipse.protobuf.ui.builder.protoc;
 
-import static com.google.eclipse.protobuf.ui.builder.protoc.OutputDirectories.findOrCreateOutputDirectories;
 import static com.google.eclipse.protobuf.ui.exception.CoreExceptions.error;
-import static com.google.eclipse.protobuf.ui.preferences.pages.compiler.PostCompilationRefreshTarget.PROJECT;
+import static com.google.eclipse.protobuf.ui.preferences.compiler.core.CompilerPreferences.compilerPreferences;
 import static com.google.eclipse.protobuf.ui.preferences.pages.paths.PathResolutionType.MULTIPLE_DIRECTORIES;
+import static com.google.eclipse.protobuf.util.Closeables.closeQuietly;
 import static java.util.Collections.*;
 import static org.eclipse.core.resources.IResource.DEPTH_INFINITE;
 
@@ -24,8 +24,9 @@
 import org.eclipse.xtext.builder.IXtextBuilderParticipant;
 import org.eclipse.xtext.resource.*;
 import org.eclipse.xtext.resource.IResourceDescription.Delta;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
-import com.google.eclipse.protobuf.ui.preferences.pages.compiler.*;
+import com.google.eclipse.protobuf.ui.preferences.compiler.core.CompilerPreferences;
 import com.google.eclipse.protobuf.ui.preferences.pages.paths.*;
 import com.google.inject.Inject;
 
@@ -36,7 +37,7 @@
  */
 public class ProtobufBuildParticipant implements IXtextBuilderParticipant {
 
-  @Inject private CompilerPreferencesFactory compilerPreferencesFactory;
+  @Inject private IPreferenceStoreAccess storeAccess;
   @Inject private PathsPreferencesFactory pathsPreferencesFactory;
   @Inject private ProtocCommandFactory commandFactory;
   @Inject private ProtocOutputParser outputParser;
@@ -44,15 +45,15 @@
 
   @Override public void build(IBuildContext context, IProgressMonitor monitor) throws CoreException {
     IProject project = context.getBuiltProject();
-    CompilerPreferences preferences = compilerPreferencesFactory.preferences(project);
-    if (!preferences.shouldCompileProtoFiles()) {
+    CompilerPreferences preferences = compilerPreferences(storeAccess, project);
+    if (!preferences.compileProtoFiles().getValue()) {
       return;
     }
     List<Delta> deltas = context.getDeltas();
     if (deltas.isEmpty()) {
       return;
     }
-    OutputDirectories outputDirectories = findOrCreateOutputDirectories(project, preferences.codeGenerationSettings());
+    OutputDirectories outputDirectories = new OutputDirectories(project, preferences);
     String descriptorPath = descriptorPath(preferences);
     List<String> importRoots = importRoots(project);
     for (Delta d : deltas) {
@@ -63,15 +64,16 @@
       if (importRoots.isEmpty()) {
         importRoots = singleImportRoot(source);
       }
-      generateSingleProto(source, preferences.protocPath(), importRoots, descriptorPath, outputDirectories);
+      generateSingleProto(source, protocPath(preferences), importRoots, descriptorPath, outputDirectories);
     }
-    if (preferences.shouldRefreshResources()) {
-      refresh(project, outputDirectories, preferences.refreshTarget(), monitor);
+    if (preferences.refreshResources().getValue()) {
+      boolean refreshProject = preferences.refreshProject().getValue();
+      refresh(project, outputDirectories, refreshProject, monitor);
     }
   }
 
   private String descriptorPath(CompilerPreferences preferences) {
-    return protoDescriptorPathFinder.findRootOf(preferences.descriptorPath());
+    return protoDescriptorPathFinder.findRootOf(preferences.descriptorPath().getValue());
   }
 
   private List<String> importRoots(IProject project) {
@@ -90,16 +92,16 @@
     return emptyList();
   }
 
-  private static IFile protoFile(IResourceDescription r, IProject project) {
-    String path = filePathIfIsProtoFile(r);
+  private IFile protoFile(IResourceDescription resource, IProject project) {
+    String path = filePathIfIsProtoFile(resource);
     return (path == null) ? null : project.getWorkspace().getRoot().getFile(new Path(path));
   }
 
-  private static String filePathIfIsProtoFile(IResourceDescription r) {
-    if (r == null) {
+  private String filePathIfIsProtoFile(IResourceDescription resource) {
+    if (resource == null) {
       return null;
     }
-    URI uri = r.getURI();
+    URI uri = resource.getURI();
     if (!uri.fileExtension().equals("proto"))
     {
       return null;
@@ -126,6 +128,13 @@
     return singletonList(current.toString());
   }
 
+  String protocPath(CompilerPreferences preferences) {
+    if (preferences.useProtocInSystemPath().getValue()) {
+      return "protoc";
+    }
+    return preferences.protocPath().getValue();
+  }
+
   private void generateSingleProto(IFile source, String protocPath, List<String> importRoots, String descriptorPath,
       OutputDirectories outputDirectories) throws CoreException {
     String command = commandFactory.protocCommand(source, protocPath, importRoots, descriptorPath, outputDirectories);
@@ -151,31 +160,25 @@
         System.out.println("[protoc] " + line);
       }
     } finally {
-      close(reader);
+      closeQuietly(reader);
     }
   }
 
-  private static void close(Reader reader) {
-    if (reader == null) {
+  private void refresh(IProject project, OutputDirectories outputDirectories, boolean refreshProject,
+      IProgressMonitor monitor) throws CoreException {
+    if (refreshProject) {
+      project.refreshLocal(DEPTH_INFINITE, monitor);
       return;
     }
-    try {
-      reader.close();
-    } catch (IOException ignored) {}
+    refresh(outputDirectories.java(), monitor);
+    refresh(outputDirectories.cpp(), monitor);
+    refresh(outputDirectories.python(), monitor);
   }
 
-  private static void refresh(IProject project, OutputDirectories outputDirectories,
-      PostCompilationRefreshTarget refreshTarget, IProgressMonitor monitor) throws CoreException {
-    if (refreshTarget.equals(PROJECT)) {
-      refresh(project, monitor);
-      return;
+  private void refresh(OutputDirectory directory, IProgressMonitor monitor) throws CoreException {
+    if (directory.isEnabled()) {
+      IFolder location = directory.getLocation();
+      location.refreshLocal(DEPTH_INFINITE, monitor);
     }
-    for (IFolder outputDirectory : outputDirectories.values()) {
-      refresh(outputDirectory, monitor);
-    }
-  }
-
-  private static void refresh(IResource target, IProgressMonitor monitor) throws CoreException {
-    target.refreshLocal(DEPTH_INFINITE, monitor);
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtocCommandFactory.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtocCommandFactory.java
index 34211c1..6ec52d2 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtocCommandFactory.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtocCommandFactory.java
@@ -9,27 +9,17 @@
 package com.google.eclipse.protobuf.ui.builder.protoc;
 
 import static com.google.eclipse.protobuf.util.CommonWords.space;
+import static org.eclipse.xtext.util.Strings.isEmpty;
 
-import java.util.*;
+import java.util.List;
 
 import org.eclipse.core.resources.*;
-import org.eclipse.xtext.util.Strings;
-
-import com.google.eclipse.protobuf.ui.preferences.pages.compiler.SupportedLanguage;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
 class ProtocCommandFactory {
 
-  private static final Map<SupportedLanguage, String> LANG_OUT_FLAG = new HashMap<SupportedLanguage, String>();
-
-  static {
-    for (SupportedLanguage lang : SupportedLanguage.values()) {
-      LANG_OUT_FLAG.put(lang, "--" + lang.code() + "_out=");
-    }
-  }
-
   String protocCommand(IFile protoFile, String protocPath, List<String> importRoots, String descriptorPath,
       OutputDirectories outputDirectories) {
     StringBuilder command = new StringBuilder();
@@ -37,21 +27,22 @@
     for (String importRoot : importRoots) {
       command.append("-I=").append(importRoot).append(space());
     }
-    if (!Strings.isEmpty(descriptorPath)) {
+    if (!isEmpty(descriptorPath)) {
       command.append("--proto_path=").append(descriptorPath).append(space());
     }
-    for (SupportedLanguage language : SupportedLanguage.values()) {
-      IFolder outputDirectory = outputDirectories.outputDirectoryFor(language);
-      if (outputDirectory == null) {
-        continue;
-      }
-      command.append(langOutFlag(language)).append(outputDirectory.getLocation().toOSString()).append(space());
-    }
+    addOutputDirectory(outputDirectories.java(), "java", command);
+    addOutputDirectory(outputDirectories.cpp(), "cpp", command);
+    addOutputDirectory(outputDirectories.python(), "python", command);
     command.append(protoFile.getLocation().toOSString());
     return command.toString();
   }
 
-  private String langOutFlag(SupportedLanguage targetLanguage) {
-    return LANG_OUT_FLAG.get(targetLanguage);
+  private void addOutputDirectory(OutputDirectory outputDirectory, String code, StringBuilder command) {
+    if (!outputDirectory.isEnabled()) {
+      return;
+    }
+    command.append("--").append(code).append("_out=");
+    IFolder directory = outputDirectory.getLocation();
+    command.append(directory.getLocation().toOSString()).append(space());
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/SmartSemicolonHandler.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/SmartSemicolonHandler.java
index 3857a40..2c81292 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/SmartSemicolonHandler.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/SmartSemicolonHandler.java
@@ -24,13 +24,14 @@
 import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
 import org.eclipse.xtext.ui.editor.contentassist.antlr.ParserBasedContentAssistContextFactory;
 import org.eclipse.xtext.ui.editor.model.IXtextDocument;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 import org.eclipse.xtext.util.Pair;
 import org.eclipse.xtext.util.concurrent.IUnitOfWork;
 
 import com.google.eclipse.protobuf.grammar.CommonKeyword;
 import com.google.eclipse.protobuf.model.util.*;
 import com.google.eclipse.protobuf.protobuf.*;
-import com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag.*;
+import com.google.eclipse.protobuf.ui.preferences.editor.numerictag.core.NumericTagPreferences;
 import com.google.eclipse.protobuf.ui.util.Literals;
 import com.google.inject.Inject;
 
@@ -51,8 +52,8 @@
   @Inject private IndexedElements indexedElements;
   @Inject private Literals literals;
   @Inject private INodes nodes;
-  @Inject private NumericTagPreferencesFactory preferencesFactory;
   @Inject private ParserBasedContentAssistContextFactory contextFactory;
+  @Inject private IPreferenceStoreAccess storeAccess;
 
   private static final String SEMICOLON = CommonKeyword.SEMICOLON.toString();
 
@@ -162,8 +163,8 @@
     if (parent == null) {
       return;
     }
-    NumericTagPreferences preferences = preferencesFactory.preferences();
-    for (String pattern : preferences.patterns()) {
+    NumericTagPreferences preferences = new NumericTagPreferences(storeAccess);
+    for (String pattern : preferences.patterns().getValue()) {
       Pair<INode, Matcher> match = commentNodesFinder.matchingCommentNode(parent, pattern);
       if (match == null) {
         return;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java
index 5af5872..75a1bd1 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java
@@ -10,7 +10,6 @@
 package com.google.eclipse.protobuf.ui.editor.model;
 
 import static com.google.eclipse.protobuf.ui.exception.CoreExceptions.error;
-import static com.google.eclipse.protobuf.ui.preferences.pages.editor.save.SaveActionsPreferences.RemoveTrailingSpace.*;
 import static com.google.eclipse.protobuf.util.Encodings.UTF_8;
 import static org.eclipse.core.filebuffers.FileBuffers.getTextFileBufferManager;
 import static org.eclipse.core.filebuffers.LocationKind.*;
@@ -24,9 +23,9 @@
 import org.eclipse.text.undo.IDocumentUndoManager;
 import org.eclipse.ui.*;
 import org.eclipse.xtext.ui.editor.model.*;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
-import com.google.eclipse.protobuf.ui.preferences.pages.editor.save.*;
-import com.google.eclipse.protobuf.ui.preferences.pages.editor.save.SaveActionsPreferences.RemoveTrailingSpace;
+import com.google.eclipse.protobuf.ui.preferences.editor.save.core.SaveActionsPreferences;
 import com.google.eclipse.protobuf.ui.util.editor.Editors;
 import com.google.inject.Inject;
 
@@ -39,7 +38,7 @@
 
   @Inject private Editors editors;
   @Inject private DocumentContentsFactoryRegistry documentContentsFactories;
-  @Inject private SaveActionsPreferencesFactory preferencesFactory;
+  @Inject private IPreferenceStoreAccess storeAccess;
   @Inject private SaveActions saveActions;
 
   @Override protected ElementInfo createElementInfo(Object element) throws CoreException {
@@ -107,13 +106,13 @@
     }
   }
 
-  private IRegion[] changedRegions(IProgressMonitor monitor, IFileEditorInput editorInput, IDocument document) throws CoreException {
-    SaveActionsPreferences preferences = preferencesFactory.preferences();
-    RemoveTrailingSpace removeTrailingSpace = preferences.removeTrailingSpace();
-    if (removeTrailingSpace.equals(NONE)) {
+  private IRegion[] changedRegions(IProgressMonitor monitor, IFileEditorInput editorInput, IDocument document)
+      throws CoreException {
+    SaveActionsPreferences preferences = new SaveActionsPreferences(storeAccess);
+    if (!preferences.removeTrailingWhitespace().getValue()) {
       return NO_CHANGE;
     }
-    if (removeTrailingSpace.equals(IN_EDITED_LINES)) {
+    if (preferences.inEditedLines().getValue()) {
       return editors.calculateChangedLineRegions(textFileBuffer(monitor, editorInput), document, monitor);
     }
     return new IRegion[] { new Region(0, document.getLength()) };
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/BooleanPreference.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/BooleanPreference.java
index 099ea37..fe44f94 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/BooleanPreference.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/BooleanPreference.java
@@ -27,22 +27,22 @@
   }
 
   /** {@inheritDoc} */
-  @Override public Boolean value() {
-    return store.getBoolean(name);
+  @Override public Boolean getValue() {
+    return getPreferenceStore().getBoolean(getName());
   }
 
   /** {@inheritDoc} */
-  @Override public Boolean defaultValue() {
-    return store.getDefaultBoolean(name);
+  @Override public Boolean getDefaultValue() {
+    return getPreferenceStore().getDefaultBoolean(getName());
   }
 
   /** {@inheritDoc} */
-  @Override public void value(Boolean value) {
-    store.setValue(name, value);
+  @Override public void setValue(Boolean value) {
+    getPreferenceStore().setValue(getName(), value);
   }
 
   /** {@inheritDoc} */
-  @Override public void defaultValue(Boolean value) {
-    store.setDefault(name, value);
+  @Override public void setDefaultValue(Boolean value) {
+    getPreferenceStore().setDefault(getName(), value);
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/Buttons.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/Buttons.java
deleted file mode 100644
index dd80b83..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/Buttons.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences;
-
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Button;
-
-/**
- * Utility methods related to <code>{@link Button}</code>s.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public final class Buttons {
-
-  public static Buttons with(Button...buttons) {
-    return new Buttons(buttons);
-  }
-
-  private final Button[] buttons;
-
-  private Buttons(Button[] buttons) {
-    this.buttons = buttons;
-  }
-
-  public void add(SelectionListener l) {
-    for (Button b : buttons) {
-      b.addSelectionListener(l);
-    }
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/Preference.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/Preference.java
index 2a8cbed..18b52f2 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/Preference.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/Preference.java
@@ -18,8 +18,8 @@
  */
 public abstract class Preference<T> {
 
-  protected final String name;
-  protected final IPreferenceStore store;
+  private final String name;
+  private IPreferenceStore store;
 
   /**
    * Creates a new </code>{@link Preference}</code>.
@@ -28,14 +28,14 @@
    */
   public Preference(String name, IPreferenceStore store) {
     this.name = name;
-    this.store = store;
+    setPreferenceStore(store);
   }
 
   /**
    * Returns the name of this preference.
    * @return the name of this preference.
    */
-  public final String name() {
+  public String getName() {
     return name;
   }
 
@@ -43,23 +43,39 @@
    * Returns the value of this preference.
    * @return the value of this preference.
    */
-  public abstract T value();
+  public abstract T getValue();
 
   /**
    * Returns the default value of this preference.
    * @return the default value of this preference.
    */
-  public abstract T defaultValue();
+  public abstract T getDefaultValue();
 
   /**
-   * Saves the value of this preference to the given store.
-   * @param value the value to save.
+   * Sets the value of this preference to the given store.
+   * @param value the value to set.
    */
-  public abstract void value(T value);
+  public abstract void setValue(T value);
 
   /**
-   * Saves the default value of this preference to the given store.
-   * @param value the default value to save.
+   * Sets the default value of this preference to the given store.
+   * @param value the default value to set.
    */
-  public abstract void defaultValue(T value);
+  public abstract void setDefaultValue(T value);
+
+  /**
+   * Returns the table mapping named preferences to values.
+   * @return the table mapping named preferences to values.
+   */
+  public IPreferenceStore getPreferenceStore() {
+    return store;
+  }
+
+  /**
+   * Sets the table mapping named preferences to values.
+   * @param store the new table.
+   */
+  public void setPreferenceStore(IPreferenceStore store) {
+    this.store = store;
+  }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/StringListPreference.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/StringListPreference.java
index b2a3df4..c409b9f 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/StringListPreference.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/StringListPreference.java
@@ -35,30 +35,32 @@
   }
 
   /** {@inheritDoc} */
-  @Override public List<String> value() {
-    return doSplit(store.getString(name));
+  @Override public List<String> getValue() {
+    String value = getPreferenceStore().getString(getName());
+    return splitIntoList(value);
   }
 
   /** {@inheritDoc} */
-  @Override public List<String> defaultValue() {
-    return doSplit(store.getDefaultString(name));
+  @Override public List<String> getDefaultValue() {
+    String defaultValue = getPreferenceStore().getDefaultString(getName());
+    return splitIntoList(defaultValue);
   }
 
-  private List<String> doSplit(String value) {
+  private List<String> splitIntoList(String value) {
     return split(value, delimiter);
   }
 
   /** {@inheritDoc} */
-  @Override public void value(List<String> value) {
-    store.setValue(name, doConcat(value));
+  @Override public void setValue(List<String> value) {
+    getPreferenceStore().setValue(getName(), concatenate(value));
   }
 
   /** {@inheritDoc} */
-  @Override public void defaultValue(List<String> value) {
-    store.setDefault(name, doConcat(value));
+  @Override public void setDefaultValue(List<String> value) {
+    getPreferenceStore().setDefault(getName(), concatenate(value));
   }
 
-  private String doConcat(List<String> value) {
+  private String concatenate(List<String> value) {
     return concat(delimiter, value);
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/StringPreference.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/StringPreference.java
index d62d429..741feb5 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/StringPreference.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/StringPreference.java
@@ -27,22 +27,22 @@
   }
 
   /** {@inheritDoc} */
-  @Override public String value() {
-    return store.getString(name);
+  @Override public String getValue() {
+    return getPreferenceStore().getString(getName());
   }
 
   /** {@inheritDoc} */
-  @Override public String defaultValue() {
-    return store.getDefaultString(name);
+  @Override public String getDefaultValue() {
+    return getPreferenceStore().getDefaultString(getName());
   }
 
   /** {@inheritDoc} */
-  @Override public void value(String value) {
-    store.setValue(name, value);
+  @Override public void setValue(String value) {
+    getPreferenceStore().setValue(getName(), value);
   }
 
   /** {@inheritDoc} */
-  @Override public void defaultValue(String value) {
-    store.setDefault(name, value);
+  @Override public void setDefaultValue(String value) {
+    getPreferenceStore().setDefault(getName(), value);
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/core/CompilerPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/core/CompilerPreferenceStoreInitializer.java
new file mode 100644
index 0000000..a56fc2d
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/core/CompilerPreferenceStoreInitializer.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.preferences.compiler.core;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.*;
+
+/**
+ * Initializes default values for the "Compiler" preferences.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class CompilerPreferenceStoreInitializer implements IPreferenceStoreInitializer {
+
+  private static final String DEFAULT_OUTPUT_DIRECTORY = "src-gen";
+
+  /** {@inheritDoc} */
+  @Override public void initialize(IPreferenceStoreAccess access) {
+    IPreferenceStore store = access.getWritablePreferenceStore();
+    CompilerPreferences preferences = new CompilerPreferences(store);
+    preferences.enableProjectSettings().setDefaultValue(false);
+    preferences.useProtocInSystemPath().setDefaultValue(true);
+    preferences.javaCodeGenerationEnabled().setDefaultValue(false);
+    preferences.cppCodeGenerationEnabled().setDefaultValue(false);
+    preferences.pythonCodeGenerationEnabled().setDefaultValue(false);
+    preferences.javaOutputDirectory().setDefaultValue(DEFAULT_OUTPUT_DIRECTORY);
+    preferences.cppOutputDirectory().setDefaultValue(DEFAULT_OUTPUT_DIRECTORY);
+    preferences.pythonOutputDirectory().setDefaultValue(DEFAULT_OUTPUT_DIRECTORY);
+    preferences.refreshResources().setDefaultValue(true);
+    preferences.refreshOutputDirectory().setDefaultValue(true);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/core/CompilerPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/core/CompilerPreferences.java
new file mode 100644
index 0000000..bf80188
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/core/CompilerPreferences.java
@@ -0,0 +1,210 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.ui.preferences.compiler.core;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+
+import com.google.eclipse.protobuf.ui.preferences.*;
+
+/**
+ * "Compiler" preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class CompilerPreferences {
+
+  public static final String ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME = "compiler.enableProjectSettings";
+
+  /**
+   * Creates a new <code>{@link CompilerPreferences}</code>.
+   * @param storeAccess simplified access to Eclipse's preferences.
+   * @param project the current project.
+   * @return the created {@code CompilerPreferences}.
+   */
+  public static CompilerPreferences compilerPreferences(IPreferenceStoreAccess storeAccess, IProject project) {
+    IPreferenceStore store = storeAccess.getWritablePreferenceStore(project);
+    boolean enableProjectSettings = store.getBoolean(ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME);
+    if (!enableProjectSettings) {
+      store = storeAccess.getWritablePreferenceStore();
+    }
+    return new CompilerPreferences(store);
+  }
+
+  private final BooleanPreference enableProjectSettings;
+  private final BooleanPreference compileProtoFiles;
+  private final BooleanPreference useProtocInSystemPath;
+  private final BooleanPreference useProtocInCustomPath;
+  private final StringPreference protocPath;
+  private final StringPreference descriptorPath;
+  private final BooleanPreference javaCodeGenerationEnabled;
+  private final BooleanPreference cppCodeGenerationEnabled;
+  private final BooleanPreference pythonCodeGenerationEnabled;
+  private final StringPreference javaOutputDirectory;
+  private final StringPreference cppOutputDirectory;
+  private final StringPreference pythonOutputDirectory;
+  private final BooleanPreference refreshResources;
+  private final BooleanPreference refreshProject;
+  private final BooleanPreference refreshOutputDirectory;
+
+  /**
+   * Creates a new <code>{@link CompilerPreferences}</code>.
+   * @param store a table mapping named preferences to values.
+   */
+  public CompilerPreferences(IPreferenceStore store) {
+    enableProjectSettings = new BooleanPreference(ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME, store);
+    compileProtoFiles = new BooleanPreference("compiler.compileProtoFiles", store);
+    useProtocInSystemPath = new BooleanPreference("compiler.useProtocInSystemPath", store);
+    useProtocInCustomPath = new BooleanPreference("compiler.useProtocInCustomPath", store);
+    protocPath = new StringPreference("compiler.protocFilePath", store);
+    descriptorPath = new StringPreference("compiler.descriptorFilePath", store);
+    javaCodeGenerationEnabled = new BooleanPreference("compiler.javaCodeGenerationEnabled", store);
+    cppCodeGenerationEnabled = new BooleanPreference("compiler.cppCodeGenerationEnabled", store);
+    pythonCodeGenerationEnabled = new BooleanPreference("compiler.pythonCodeGenerationEnabled", store);
+    javaOutputDirectory = new StringPreference("compiler.javaOutputDirectory", store);
+    cppOutputDirectory = new StringPreference("compiler.cppOutputDirectory", store);
+    pythonOutputDirectory = new StringPreference("compiler.pythonOutputDirectory", store);
+    refreshResources = new BooleanPreference("compiler.refreshResources", store);
+    refreshProject = new BooleanPreference("compiler.refreshProject", store);
+    refreshOutputDirectory = new BooleanPreference("compiler.refreshOutputDirectory", store);
+  }
+
+  /**
+   * Returns the setting that specifies whether project project should be used instead of workspace preferences.
+   * @return the setting that specifies whether project project should be used instead of workspace preferences.
+   */
+  public BooleanPreference enableProjectSettings() {
+    return enableProjectSettings;
+  }
+
+  /**
+   * Returns the setting that specifies whether protoc should be called after saving a file.
+   * @return the setting that specifies whether protoc should be called after saving a file.
+   */
+  public BooleanPreference compileProtoFiles() {
+    return compileProtoFiles;
+  }
+
+  /**
+   * Returns the setting that specifies whether the editor should call the version of protoc in the system path.
+   * @return the setting that specifies whether the editor should call the version of protoc in the system path.
+   */
+  public BooleanPreference useProtocInSystemPath() {
+    return useProtocInSystemPath;
+  }
+
+  /**
+   * Returns the setting that specifies whether the editor should call a version of protoc stored in a user-specified
+   * path in the file system.
+   * @return the setting that specifies whether the editor should call a version of protoc stored in a user-specified
+   * path in the file system.
+   */
+  public BooleanPreference useProtocInCustomPath() {
+    return useProtocInCustomPath;
+  }
+
+  /**
+   * Returns the setting that specifies the user-specified path of protoc.
+   * @return the setting that specifies the user-specified path of protoc.
+   */
+  public StringPreference protocPath() {
+    return protocPath;
+  }
+
+  /**
+   * Returns the setting that specifies the path of the file descriptor.proto. The path is needed by protoc only if the
+   * file to compile imports descriptor.proto.
+   * @return the setting that specifies the path of the file descriptor.proto.
+   */
+  public StringPreference descriptorPath() {
+    return descriptorPath;
+  }
+
+  /**
+   * Returns the setting that specifies whether protoc should generate Java code.
+   * @return the setting that specifies whether protoc should generate Java code.
+   */
+  public BooleanPreference javaCodeGenerationEnabled() {
+    return javaCodeGenerationEnabled;
+  }
+
+  /**
+   * Returns the setting that specifies whether protoc should generate C++ code.
+   * @return the setting that specifies whether protoc should generate C++ code.
+   */
+  public BooleanPreference cppCodeGenerationEnabled() {
+    return cppCodeGenerationEnabled;
+  }
+
+  /**
+   * Returns the setting that specifies whether protoc should generate Python code.
+   * @return the setting that specifies whether protoc should generate Python code.
+   */
+  public BooleanPreference pythonCodeGenerationEnabled() {
+    return pythonCodeGenerationEnabled;
+  }
+
+  /**
+   * Returns the setting that specifies the directory where to store the generated Java code. This setting is available
+   * only if the value of <code>{@link #javaCodeGenerationEnabled()}</code> is {@code true}.
+   * @return the setting that specifies the directory where to store the generated Java code.
+   */
+  public StringPreference javaOutputDirectory() {
+    return javaOutputDirectory;
+  }
+
+  /**
+   * Returns the setting that specifies the directory where to store the generated C++ code. This setting is available
+   * only if the value of <code>{@link #cppCodeGenerationEnabled()}</code> is {@code true}.
+   * @return the setting that specifies the directory where to store the generated C++ code.
+   */
+  public StringPreference cppOutputDirectory() {
+    return cppOutputDirectory;
+  }
+
+  /**
+   * Returns the setting that specifies the directory where to store the generated Python code. This setting is
+   * available only if the value of <code>{@link #pythonCodeGenerationEnabled()}</code> is {@code true}.
+   * @return the setting that specifies the directory where to store the generated Python code.
+   */
+  public StringPreference pythonOutputDirectory() {
+    return pythonOutputDirectory;
+  }
+
+  /**
+   * Returns the setting that specifies whether resources should be refreshed after changing the "Compiler" preference
+   * settings.
+   * @return the setting that specifies whether resources should be refreshed after changing the "Compiler" preference
+   * settings.
+   */
+  public BooleanPreference refreshResources() {
+    return refreshResources;
+  }
+
+  /**
+   * Returns the setting that specifies whether the current project should be refreshed after changing the "Compiler"
+   * preference settings. This setting is enable only if the value of <code>{@link #refreshResources()}</code> is
+   * {@code true}.
+   * @return the setting that specifies whether the current project should be refreshed after changing
+   */
+  public BooleanPreference refreshProject() {
+    return refreshProject;
+  }
+
+  /**
+   * Returns the setting that specifies whether the directory containing generated code should be refreshed after
+   * changing the "Compiler" preference settings. This setting is enable only if the value of
+   * <code>{@link #refreshResources()}</code> is {@code true}.
+   * @return the setting that specifies whether the current project should be refreshed after changing
+   */
+  public BooleanPreference refreshOutputDirectory() {
+    return refreshOutputDirectory;
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/page/CompilerPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/page/CompilerPreferencePage.java
new file mode 100644
index 0000000..c543462
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/page/CompilerPreferencePage.java
@@ -0,0 +1,401 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.preferences.compiler.page;
+
+import static com.google.eclipse.protobuf.ui.preferences.compiler.core.CompilerPreferences.ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME;
+import static com.google.eclipse.protobuf.ui.preferences.compiler.page.Messages.*;
+import static com.google.eclipse.protobuf.ui.preferences.pages.ButtonGroup.with;
+import static com.google.eclipse.protobuf.ui.preferences.pages.LabelWidgets.setEnabled;
+import static com.google.eclipse.protobuf.ui.preferences.pages.TextWidgets.*;
+import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToButtonSelection.bindSelectionOf;
+import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToTextValue.bindTextOf;
+import static org.eclipse.xtext.util.Strings.isEmpty;
+
+import java.io.File;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.widgets.*;
+
+import com.google.eclipse.protobuf.ui.preferences.compiler.core.CompilerPreferences;
+import com.google.eclipse.protobuf.ui.preferences.pages.PreferenceAndPropertyPage;
+import com.google.eclipse.protobuf.ui.preferences.pages.binding.PreferenceBinder;
+
+/**
+ * Preference page for protobuf compiler.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class CompilerPreferencePage extends PreferenceAndPropertyPage {
+  private static final String PREFERENCE_PAGE_ID = CompilerPreferencePage.class.getName();
+
+  private Button btnCompileProtoFiles;
+  private TabFolder tabFolder;
+  private TabItem tbtmMain;
+  private TabItem tbtmRefresh;
+  private TabItem tbtmOptions;
+  private Group grpCompilerLocation;
+  private Button btnUseProtocInSystemPath;
+  private Button btnUseProtocInCustomPath;
+  private Text txtProtocFilePath;
+  private Button btnProtocPathBrowse;
+  private Group grpDescriptorLocation;
+  private Text txtDescriptorFilePath;
+  private Button btnDescriptorPathBrowse;
+  private Button btnGenerateJava;
+  private Label lblJavaOutputDirectory;
+  private Text txtJavaOutputDirectory;
+  private Button btnGenerateCpp;
+  private Label lblCppOutputDirectory;
+  private Text txtCppOutputDirectory;
+  private Button btnGeneratePython;
+  private Label lblPythonOutputDirectory;
+  private Text txtPythonOutputDirectory;
+  private Group grpRefresh;
+  private Button btnRefreshResources;
+  private Button btnRefreshProject;
+  private Button btnRefreshOutputDirectory;
+
+  @Override protected void doCreateContents(Composite parent) {
+    btnCompileProtoFiles = new Button(parent, SWT.CHECK);
+    btnCompileProtoFiles.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+    btnCompileProtoFiles.setText(compileOnSave);
+
+    tabFolder = new TabFolder(parent, SWT.NONE);
+    tabFolder.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+
+    tbtmMain = new TabItem(tabFolder, SWT.NONE);
+    tbtmMain.setText(tabMain);
+
+    Composite cmpMain = new Composite(tabFolder, SWT.NONE);
+    tbtmMain.setControl(cmpMain);
+    cmpMain.setLayout(new GridLayout(1, false));
+
+    grpCompilerLocation = new Group(cmpMain, SWT.NONE);
+    grpCompilerLocation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+    grpCompilerLocation.setLayout(new GridLayout(2, false));
+    grpCompilerLocation.setText(protocLocation);
+
+    btnUseProtocInSystemPath = new Button(grpCompilerLocation, SWT.RADIO);
+    btnUseProtocInSystemPath.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+    btnUseProtocInSystemPath.setText(protocInSystemPath);
+
+    btnUseProtocInCustomPath = new Button(grpCompilerLocation, SWT.RADIO);
+    btnUseProtocInCustomPath.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+    btnUseProtocInCustomPath.setText(protocInCustomPath);
+
+    txtProtocFilePath = new Text(grpCompilerLocation, SWT.BORDER);
+    txtProtocFilePath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+    setEditable(txtProtocFilePath, false);
+
+    btnProtocPathBrowse = new Button(grpCompilerLocation, SWT.NONE);
+    btnProtocPathBrowse.setText(browseCustomPath);
+
+    grpDescriptorLocation = new Group(cmpMain, SWT.NONE);
+    grpDescriptorLocation.setText(descriptorLocation);
+    grpDescriptorLocation.setLayout(new GridLayout(2, false));
+    grpDescriptorLocation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+
+    txtDescriptorFilePath = new Text(grpDescriptorLocation, SWT.BORDER);
+    txtDescriptorFilePath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+    setEditable(txtDescriptorFilePath, false);
+
+    btnDescriptorPathBrowse = new Button(grpDescriptorLocation, SWT.NONE);
+    btnDescriptorPathBrowse.setText(browseCustomPath);
+
+    tbtmOptions = new TabItem(tabFolder, SWT.NONE);
+    tbtmOptions.setText("&Options");
+
+    Composite cmpOptions = new Composite(tabFolder, SWT.NONE);
+    tbtmOptions.setControl(cmpOptions);
+    cmpOptions.setLayout(new GridLayout(2, false));
+
+    btnGenerateJava = new Button(cmpOptions, SWT.CHECK);
+    btnGenerateJava.setEnabled(false);
+    btnGenerateJava.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 3, 1));
+    btnGenerateJava.setText("Generate Java");
+
+    lblJavaOutputDirectory = new Label(cmpOptions, SWT.NONE);
+    lblJavaOutputDirectory.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
+    lblJavaOutputDirectory.setText("Java Output Directory:");
+
+    txtJavaOutputDirectory = new Text(cmpOptions, SWT.BORDER);
+    txtJavaOutputDirectory.setEnabled(false);
+    txtJavaOutputDirectory.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+
+    btnGenerateCpp = new Button(cmpOptions, SWT.CHECK);
+    btnGenerateCpp.setEnabled(false);
+    btnGenerateCpp.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+    btnGenerateCpp.setText("Generate C++");
+
+    lblCppOutputDirectory = new Label(cmpOptions, SWT.NONE);
+    lblCppOutputDirectory.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
+    lblCppOutputDirectory.setText("C++ Output Directory:");
+
+    txtCppOutputDirectory = new Text(cmpOptions, SWT.BORDER);
+    txtCppOutputDirectory.setEnabled(false);
+    txtCppOutputDirectory.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
+
+    btnGeneratePython = new Button(cmpOptions, SWT.CHECK);
+    btnGeneratePython.setEnabled(false);
+    btnGeneratePython.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+    btnGeneratePython.setText("Generate Python");
+
+    lblPythonOutputDirectory = new Label(cmpOptions, SWT.NONE);
+    lblPythonOutputDirectory.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
+    lblPythonOutputDirectory.setText("Python Output Directory:");
+
+    txtPythonOutputDirectory = new Text(cmpOptions, SWT.BORDER);
+    txtPythonOutputDirectory.setEnabled(false);
+    txtPythonOutputDirectory.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
+
+    tbtmRefresh = new TabItem(tabFolder, SWT.NONE);
+    tbtmRefresh.setText(tabRefresh);
+
+    Composite cmpRefresh = new Composite(tabFolder, SWT.NONE);
+    tbtmRefresh.setControl(cmpRefresh);
+    cmpRefresh.setLayout(new GridLayout(1, false));
+
+    btnRefreshResources = new Button(cmpRefresh, SWT.CHECK);
+    btnRefreshResources.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+    btnRefreshResources.setText(refreshResources);
+
+    grpRefresh = new Group(cmpRefresh, SWT.NONE);
+    grpRefresh.setLayout(new GridLayout(1, false));
+    grpRefresh.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+
+    btnRefreshProject = new Button(grpRefresh, SWT.RADIO);
+    btnRefreshProject.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+    btnRefreshProject.setText(refreshProject);
+
+    btnRefreshOutputDirectory = new Button(grpRefresh, SWT.RADIO);
+    btnRefreshOutputDirectory.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+    btnRefreshOutputDirectory.setText(refreshOutputProject);
+    new Label(parent, SWT.NONE);
+
+    addEventListeners();
+  }
+
+  private void addEventListeners() {
+    btnCompileProtoFiles.addSelectionListener(new SelectionAdapter() {
+      @Override public void widgetSelected(SelectionEvent e) {
+        boolean selected = btnCompileProtoFiles.getSelection();
+        enableCompilerSettings(selected);
+        checkState();
+      }
+    });
+    with(btnUseProtocInCustomPath, btnUseProtocInSystemPath).add(new SelectionAdapter() {
+      @Override public void widgetSelected(SelectionEvent e) {
+        boolean selected = btnUseProtocInCustomPath.getSelection();
+        enableCompilerCustomPathSettings(selected);
+        checkState();
+      }
+    });
+    btnProtocPathBrowse.addSelectionListener(new SelectionAdapter() {
+      @Override public void widgetSelected(SelectionEvent e) {
+        FileDialog dialog = new FileDialog(getShell(), SWT.OPEN | SWT.SHEET);
+        String file = dialog.open();
+        if (file != null) {
+          txtProtocFilePath.setText(file);
+        }
+        checkState();
+      }
+    });
+    btnDescriptorPathBrowse.addSelectionListener(new SelectionAdapter() {
+      @Override public void widgetSelected(SelectionEvent e) {
+        FileDialog dialog = new FileDialog(getShell(), SWT.OPEN | SWT.SHEET);
+        dialog.setFilterExtensions(new String[] { "*.proto" });
+        String file = dialog.open();
+        if (file != null) {
+          txtDescriptorFilePath.setText(file);
+        }
+        checkState();
+      }
+    });
+    btnGenerateJava.addSelectionListener(new SelectionAdapter() {
+      @Override public void widgetSelected(SelectionEvent e) {
+        enableJavaOutputDirectory(btnGenerateJava.getSelection());
+        checkState();
+      }
+    });
+    btnGenerateCpp.addSelectionListener(new SelectionAdapter() {
+      @Override public void widgetSelected(SelectionEvent e) {
+        enableCppOutputDirectory(btnGenerateCpp.getSelection());
+        checkState();
+      }
+    });
+    btnGeneratePython.addSelectionListener(new SelectionAdapter() {
+      @Override public void widgetSelected(SelectionEvent e) {
+        enablePythonOutputDirectory(btnGeneratePython.getSelection());
+        checkState();
+      }
+    });
+    btnRefreshResources.addSelectionListener(new SelectionAdapter() {
+      @Override public void widgetSelected(SelectionEvent e) {
+        refreshResourcesSettingsEnabled(btnRefreshResources.getSelection());
+      }
+    });
+  }
+
+  @Override protected String enableProjectSettingsPreferenceName() {
+    return ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME;
+  }
+
+  @Override protected void setupBinding(PreferenceBinder preferenceBinder) {
+    CompilerPreferences preferences = new CompilerPreferences(getPreferenceStore());
+    preferenceBinder.addAll(
+        bindSelectionOf(btnCompileProtoFiles).to(preferences.compileProtoFiles()),
+        bindSelectionOf(btnUseProtocInSystemPath).to(preferences.useProtocInSystemPath()),
+        bindSelectionOf(btnUseProtocInCustomPath).to(preferences.useProtocInCustomPath()),
+        bindTextOf(txtProtocFilePath).to(preferences.protocPath()),
+        bindTextOf(txtDescriptorFilePath).to(preferences.descriptorPath()),
+        bindSelectionOf(btnGenerateJava).to(preferences.javaCodeGenerationEnabled()),
+        bindTextOf(txtJavaOutputDirectory).to(preferences.javaOutputDirectory()),
+        bindSelectionOf(btnGenerateCpp).to(preferences.cppCodeGenerationEnabled()),
+        bindTextOf(txtCppOutputDirectory).to(preferences.cppOutputDirectory()),
+        bindSelectionOf(btnGeneratePython).to(preferences.pythonCodeGenerationEnabled()),
+        bindTextOf(txtPythonOutputDirectory).to(preferences.pythonOutputDirectory()),
+        bindSelectionOf(btnRefreshResources).to(preferences.refreshResources()),
+        bindSelectionOf(btnRefreshProject).to(preferences.refreshProject()),
+        bindSelectionOf(btnRefreshOutputDirectory).to(preferences.refreshOutputDirectory())
+      );
+  }
+
+  @Override protected void updateContents() {
+    boolean compileProtoFiles = btnCompileProtoFiles.getSelection();
+    boolean shouldEnableCompilerOptions = compileProtoFiles;
+    if (isPropertyPage()) {
+      boolean useProjectSettings = areProjectSettingsActive();
+      activateProjectSettings(useProjectSettings);
+      enableProjectSpecificSettings(useProjectSettings);
+      shouldEnableCompilerOptions = shouldEnableCompilerOptions && useProjectSettings;
+    }
+    enableCompilerSettings(shouldEnableCompilerOptions);
+  }
+
+  @Override protected void onProjectSettingsActivation(boolean active) {
+    enableProjectSpecificSettings(active);
+    enableCompilerSettings(isEnabledAndSelected(btnCompileProtoFiles));
+    checkState();
+  }
+
+  private void enableProjectSpecificSettings(boolean enabled) {
+    btnCompileProtoFiles.setEnabled(enabled);
+  }
+
+  private void enableCompilerSettings(boolean enabled) {
+    enableCompilerPathSettings(enabled);
+    enableDescriptorPathSettings(enabled);
+    enableOptionsSettings(enabled);
+    enableRefreshSettings(enabled);
+  }
+
+  private void enableCompilerPathSettings(boolean enabled) {
+    grpCompilerLocation.setEnabled(enabled);
+    btnUseProtocInSystemPath.setEnabled(enabled);
+    btnUseProtocInCustomPath.setEnabled(enabled);
+    enableCompilerCustomPathSettings(customPathOptionSelectedAndEnabled());
+  }
+
+  private void enableCompilerCustomPathSettings(boolean enabled) {
+    txtProtocFilePath.setEnabled(enabled);
+    btnProtocPathBrowse.setEnabled(enabled);
+  }
+
+  private void enableDescriptorPathSettings(boolean enabled) {
+    grpDescriptorLocation.setEnabled(enabled);
+    txtDescriptorFilePath.setEnabled(enabled);
+    btnDescriptorPathBrowse.setEnabled(enabled);
+  }
+
+  private boolean customPathOptionSelectedAndEnabled() {
+    return isEnabledAndSelected(btnUseProtocInCustomPath);
+  }
+
+  private void enableOptionsSettings(boolean enabled) {
+    btnGenerateJava.setEnabled(enabled);
+    enableJavaOutputDirectory(isEnabledAndSelected(btnGenerateJava));
+    btnGenerateCpp.setEnabled(enabled);
+    enableCppOutputDirectory(isEnabledAndSelected(btnGenerateCpp));
+    btnGeneratePython.setEnabled(enabled);
+    enablePythonOutputDirectory(isEnabledAndSelected(btnGeneratePython));
+  }
+
+  private void enableJavaOutputDirectory(boolean enabled) {
+    setEnabled(txtJavaOutputDirectory, enabled);
+    setEnabled(lblJavaOutputDirectory, enabled);
+  }
+
+  private void enableCppOutputDirectory(boolean enabled) {
+    setEnabled(txtCppOutputDirectory, enabled);
+    setEnabled(lblCppOutputDirectory, enabled);
+  }
+
+  private void enablePythonOutputDirectory(boolean enabled) {
+    setEnabled(txtPythonOutputDirectory, enabled);
+    setEnabled(lblPythonOutputDirectory, enabled);
+  }
+
+  private void enableRefreshSettings(boolean enabled) {
+    btnRefreshResources.setEnabled(enabled);
+    refreshResourcesSettingsEnabled(isEnabledAndSelected(btnRefreshResources));
+  }
+
+  private boolean isEnabledAndSelected(Button button) {
+    return button.isEnabled() && button.getSelection();
+  }
+
+  private void refreshResourcesSettingsEnabled(boolean enabled) {
+    grpRefresh.setEnabled(enabled);
+    btnRefreshProject.setEnabled(enabled);
+    btnRefreshOutputDirectory.setEnabled(enabled);
+  }
+
+  private void checkState() {
+    if (!atLeastOneTargetLanguageIsSelected()) {
+      pageIsNowInvalid(errorNoLanguageSelected);
+      return;
+    }
+    if (customPathOptionSelectedAndEnabled()) {
+      String protocPath = txtProtocFilePath.getText();
+      if (isEmpty(protocPath)) {
+        pageIsNowInvalid(errorNoSelection);
+        return;
+      }
+      File protoc = new File(protocPath);
+      if (!protoc.isFile()) {
+        pageIsNowInvalid(errorInvalidProtoc);
+        return;
+      }
+    }
+    String descriptorPath = txtDescriptorFilePath.getText();
+    if (!isEmpty(descriptorPath) && !isFileWithName(descriptorPath, "descriptor.proto")) {
+      pageIsNowInvalid(errorInvalidDescriptor);
+      return;
+    }
+    pageIsNowValid();
+  }
+
+  private boolean atLeastOneTargetLanguageIsSelected() {
+    return btnGenerateJava.getSelection() || btnGenerateCpp.getSelection() || btnGeneratePython.getSelection();
+  }
+
+  private boolean isFileWithName(String filePath, String expectedFileName) {
+    File file = new File(filePath);
+    if (!file.isFile()) {
+      return false;
+    }
+    String fileName = file.getName();
+    return expectedFileName.equals(fileName);
+  }
+  @Override protected String preferencePageId() {
+    return PREFERENCE_PAGE_ID;
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/Messages.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/page/Messages.java
similarity index 82%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/Messages.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/page/Messages.java
index 0126998..74a1f7b 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/Messages.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/page/Messages.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.compiler;
+package com.google.eclipse.protobuf.ui.preferences.compiler.page;
 
 import org.eclipse.osgi.util.NLS;
 
@@ -21,18 +21,12 @@
   public static String descriptorLocation;
   public static String editSelected;
   public static String editCodeGenerationOptionTitle;
-  public static String enabled;
   public static String errorEnterDirectoryName;
   public static String errorInvalidProtoc;
   public static String errorInvalidDescriptor;
-  public static String errorNoLanguageEnabled;
+  public static String errorNoLanguageSelected;
   public static String errorNoOutputFolderName;
   public static String errorNoSelection;
-  public static String generateCpp;
-  public static String generateCode;
-  public static String generateJava;
-  public static String generatePython;
-  public static String language;
   public static String outputDirectory;
   public static String outputDirectoryPrompt;
   public static String outputFolderChildOfProjectFolder;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/Messages.properties b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/page/Messages.properties
similarity index 85%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/Messages.properties
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/page/Messages.properties
index c2b1083..c0e01ce 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/Messages.properties
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/page/Messages.properties
@@ -4,18 +4,12 @@
 descriptorLocation=\"descriptor.proto\" location
 editSelected=Edit selected...
 editCodeGenerationOptionTitle=Preferences for 
-enabled=Enabled
 errorEnterDirectoryName=Enter the name of the output directory
 errorInvalidProtoc=The selected file is not protoc
 errorInvalidDescriptor=The selected file is not descriptor.proto
-errorNoLanguageEnabled=Enable at least one language
+errorNoLanguageSelected=Select at least one language (Java, C++ or Python)
 errorNoSelection=Select the path of protoc
 errorNoOutputFolderName=Enter the name of the output folder
-generateCode=Generated Code
-generateCpp=&C++
-generateJava=&Java
-generatePython=&Python
-language=Language
 outputDirectory=Output Directory
 outputDirectoryPrompt=Output directory name:
 outputFolderChildOfProjectFolder=*direct child of project folder
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/EditorPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/general/page/EditorPreferencePage.java
similarity index 83%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/EditorPreferencePage.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/general/page/EditorPreferencePage.java
index 3a40db5..a88554d 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/EditorPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/general/page/EditorPreferencePage.java
@@ -7,9 +7,9 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.editor;
+package com.google.eclipse.protobuf.ui.preferences.editor.general.page;
 
-import static com.google.eclipse.protobuf.ui.preferences.pages.editor.Messages.header;
+import static com.google.eclipse.protobuf.ui.preferences.editor.general.page.Messages.header;
 import static org.eclipse.ui.dialogs.PreferencesUtil.createPreferenceDialogOn;
 
 import org.eclipse.jface.preference.PreferencePage;
@@ -36,8 +36,8 @@
     link.setText(header);
     link.addListener(SWT.Selection, new Listener() {
       @Override public void handleEvent(Event event) {
-        String u = event.text;
-        createPreferenceDialogOn(getShell(), u, null, null);
+        String text = event.text;
+        createPreferenceDialogOn(getShell(), text, null, null);
       }
     });
     return contents;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/Messages.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/general/page/Messages.java
similarity index 89%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/Messages.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/general/page/Messages.java
index 128473a..95e091a 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/Messages.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/general/page/Messages.java
@@ -7,7 +7,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.editor;
+package com.google.eclipse.protobuf.ui.preferences.editor.general.page;
 
 import org.eclipse.osgi.util.NLS;
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/Messages.properties b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/general/page/Messages.properties
similarity index 100%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/Messages.properties
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/general/page/Messages.properties
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/core/NumericTagPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/core/NumericTagPreferenceStoreInitializer.java
new file mode 100644
index 0000000..0f19478
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/core/NumericTagPreferenceStoreInitializer.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.preferences.editor.numerictag.core;
+
+import static java.util.Collections.singletonList;
+
+import org.eclipse.xtext.ui.editor.preferences.*;
+
+/**
+ * Initializes default values for <code>{@link NumericTagPreferences}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class NumericTagPreferenceStoreInitializer implements IPreferenceStoreInitializer {
+
+  /** {@inheritDoc} */
+  @Override public void initialize(IPreferenceStoreAccess storeAccess) {
+    NumericTagPreferences preferences = new NumericTagPreferences(storeAccess);
+    preferences.patterns().setDefaultValue(singletonList("Next[\\s]+Id:[\\s]+[\\d]+"));
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/core/NumericTagPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/core/NumericTagPreferences.java
new file mode 100644
index 0000000..997d08e
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/core/NumericTagPreferences.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.preferences.editor.numerictag.core;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+
+import com.google.eclipse.protobuf.ui.preferences.StringListPreference;
+
+/**
+ * "Numeric tag" preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class NumericTagPreferences {
+
+  private final StringListPreference patterns;
+
+  /**
+   * Creates a new <code>{@link NumericTagPreferences}</code>.
+   * @param storeAccess simplified access to Eclipse's preferences.
+   */
+  public NumericTagPreferences(IPreferenceStoreAccess storeAccess) {
+    this(storeAccess.getWritablePreferenceStore());
+  }
+
+  /**
+   * Creates a new <code>{@link NumericTagPreferences}</code>.
+   * @param store a table mapping named preferences to values.
+   */
+  public NumericTagPreferences(IPreferenceStore store) {
+    patterns = new StringListPreference("numericTag.patterns", "\\t", store);
+  }
+
+  /**
+   * Returns the setting that specifies the regular expression patterns to use to identify comments that track the next
+   * field index.
+   * @return the setting that specifies the regular expression patterns to use to identify comments that track the next
+   * field index.
+   */
+  public StringListPreference patterns() {
+    return patterns;
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/AddOrEditPatternDialog.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/page/AddOrEditPatternDialog.java
similarity index 91%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/AddOrEditPatternDialog.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/page/AddOrEditPatternDialog.java
index 643ba56..205652e 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/AddOrEditPatternDialog.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/page/AddOrEditPatternDialog.java
@@ -6,10 +6,10 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag;
+package com.google.eclipse.protobuf.ui.preferences.editor.numerictag.page;
 
-import static com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag.Messages.*;
-import static com.google.eclipse.protobuf.ui.swt.Colors.widgetBackground;
+import static com.google.eclipse.protobuf.ui.preferences.editor.numerictag.page.Messages.*;
+import static com.google.eclipse.protobuf.ui.preferences.pages.SystemColors.widgetBackgroundColor;
 import static java.util.regex.Pattern.CASE_INSENSITIVE;
 import static org.eclipse.jface.dialogs.IDialogConstants.OK_ID;
 import static org.eclipse.swt.layout.GridData.*;
@@ -22,7 +22,7 @@
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.*;
 
-import com.google.eclipse.protobuf.ui.preferences.InputDialog;
+import com.google.eclipse.protobuf.ui.preferences.pages.InputDialog;
 
 /**
  * Dialog where users can enter a new pattern or edit an existing one.
@@ -69,7 +69,7 @@
 
     txtPatternError = new Text(cmpDialogArea, SWT.READ_ONLY | SWT.WRAP);
     txtPatternError.setLayoutData(new GridData(GRAB_HORIZONTAL | HORIZONTAL_ALIGN_FILL));
-    txtPatternError.setBackground(widgetBackground());
+    txtPatternError.setBackground(widgetBackgroundColor());
 
     Label lblSeparator = new Label(cmpDialogArea, SWT.SEPARATOR | SWT.HORIZONTAL);
     lblSeparator.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
@@ -85,7 +85,7 @@
     GridData gd_txtTestError = new GridData(GRAB_HORIZONTAL | HORIZONTAL_ALIGN_FILL);
     gd_txtTestError.verticalAlignment = SWT.FILL;
     txtTestError.setLayoutData(gd_txtTestError);
-    txtTestError.setBackground(widgetBackground());
+    txtTestError.setBackground(widgetBackgroundColor());
 
     addEventListeners();
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/Messages.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/page/Messages.java
similarity index 91%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/Messages.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/page/Messages.java
index 5b2b307..5ed74dc 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/Messages.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/page/Messages.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag;
+package com.google.eclipse.protobuf.ui.preferences.editor.numerictag.page;
 
 import org.eclipse.osgi.util.NLS;
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/Messages.properties b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/page/Messages.properties
similarity index 100%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/Messages.properties
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/page/Messages.properties
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/NumericTagPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/page/NumericTagPreferencePage.java
similarity index 84%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/NumericTagPreferencePage.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/page/NumericTagPreferencePage.java
index 2a7e150..cef0657 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/NumericTagPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/page/NumericTagPreferencePage.java
@@ -6,23 +6,23 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag;
+package com.google.eclipse.protobuf.ui.preferences.editor.numerictag.page;
 
-import static com.google.eclipse.protobuf.ui.preferences.binding.BindingToListItems.bindItemsOf;
-import static com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag.AddOrEditPatternDialog.*;
-import static com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag.Messages.*;
+import static com.google.eclipse.protobuf.ui.preferences.editor.numerictag.page.AddOrEditPatternDialog.*;
+import static com.google.eclipse.protobuf.ui.preferences.editor.numerictag.page.Messages.*;
+import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToListItems.bindItemsOf;
 import static org.eclipse.jface.window.Window.OK;
 
-import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.viewers.ListViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.*;
 import org.eclipse.swt.layout.*;
 import org.eclipse.swt.widgets.*;
 
-import com.google.eclipse.protobuf.ui.preferences.*;
-import com.google.eclipse.protobuf.ui.preferences.binding.PreferenceBinder;
+import com.google.eclipse.protobuf.ui.preferences.StringListPreference;
+import com.google.eclipse.protobuf.ui.preferences.editor.numerictag.core.NumericTagPreferences;
 import com.google.eclipse.protobuf.ui.preferences.pages.PreferenceAndPropertyPage;
+import com.google.eclipse.protobuf.ui.preferences.pages.binding.PreferenceBinder;
 
 /**
  * Preference page where users can specify the patterns to use to match comments where "the next id" is being tracked.
@@ -115,12 +115,12 @@
     btnRemove.setEnabled(hasSelection);
   }
 
-  @Override protected BooleanPreference enableProjectSettingsPreference(IPreferenceStore store) {
+  @Override protected String enableProjectSettingsPreferenceName() {
     return null;
   }
 
   @Override protected void setupBinding(PreferenceBinder preferenceBinder) {
-    RawPreferences preferences = new RawPreferences(getPreferenceStore());
+    NumericTagPreferences preferences = new NumericTagPreferences(getPreferenceStore());
     StringListPreference patterns = preferences.patterns();
     preferenceBinder.add(bindItemsOf(lstPaths).to(patterns));
   }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/core/SaveActionsPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/core/SaveActionsPreferenceStoreInitializer.java
new file mode 100644
index 0000000..a9b9538
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/core/SaveActionsPreferenceStoreInitializer.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.preferences.editor.save.core;
+
+import org.eclipse.xtext.ui.editor.preferences.*;
+
+/**
+ * Initializes default values for <code>{@link SaveActionsPreferences}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class SaveActionsPreferenceStoreInitializer implements IPreferenceStoreInitializer {
+
+  /** {@inheritDoc} */
+  @Override public void initialize(IPreferenceStoreAccess storeAccess) {
+    SaveActionsPreferences preferences = new SaveActionsPreferences(storeAccess);
+    preferences.removeTrailingWhitespace().setDefaultValue(true);
+    preferences.inAllLines().setDefaultValue(false);
+    preferences.inEditedLines().setDefaultValue(true);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/core/SaveActionsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/core/SaveActionsPreferences.java
new file mode 100644
index 0000000..2c5206a
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/core/SaveActionsPreferences.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.preferences.editor.save.core;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+
+import com.google.eclipse.protobuf.ui.preferences.BooleanPreference;
+
+/**
+ * "Save actions" preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class SaveActionsPreferences {
+
+  private final BooleanPreference removeTrailingWhitespace;
+  private final BooleanPreference inAllLines;
+  private final BooleanPreference inEditedLines;
+
+  /**
+   * Creates a new <code>{@link SaveActionsPreferences}</code>.
+   * @param storeAccess simplified access to Eclipse's preferences.
+   */
+  public SaveActionsPreferences(IPreferenceStoreAccess storeAccess) {
+    this(storeAccess.getWritablePreferenceStore());
+  }
+
+  /**
+   * Creates a new <code>{@link SaveActionsPreferences}</code>.
+   * @param store a table mapping named preferences to values.
+   */
+  public SaveActionsPreferences(IPreferenceStore store) {
+    removeTrailingWhitespace = new BooleanPreference("saveActions.removeTrailingWhitespace", store);
+    inAllLines = new BooleanPreference("saveActions.inAllLines", store);
+    inEditedLines = new BooleanPreference("saveActions.inEditedLines", store);
+  }
+
+  /**
+   * Returns the setting that specifies whether trailing whitespace should be removed.
+   * @return the setting that specifies whether trailing whitespace should be removed.
+   */
+  public BooleanPreference removeTrailingWhitespace() {
+    return removeTrailingWhitespace;
+  }
+
+  /**
+   * Returns the setting that specifies whether trailing whitespace should be removed from all the lines of a file.
+   * @return the setting that specifies whether trailing whitespace should be removed from all the lines of a file.
+   */
+  public BooleanPreference inAllLines() {
+    return inAllLines;
+  }
+
+  /**
+   * Returns the setting that specifies whether trailing whitespace should be removed from edited lines only.
+   * @return the setting that specifies whether trailing whitespace should be removed from edited lines only.
+   */
+  public BooleanPreference inEditedLines() {
+    return inEditedLines;
+  }
+}
\ No newline at end of file
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/Messages.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/page/Messages.java
similarity index 89%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/Messages.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/page/Messages.java
index bb07e69..a3c84aa 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/Messages.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/page/Messages.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.editor.save;
+package com.google.eclipse.protobuf.ui.preferences.editor.save.page;
 
 import org.eclipse.osgi.util.NLS;
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/Messages.properties b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/page/Messages.properties
similarity index 100%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/Messages.properties
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/page/Messages.properties
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/page/SaveActionsPreferencePage.java
similarity index 84%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferencePage.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/page/SaveActionsPreferencePage.java
index ef3bc24..fd94950 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/page/SaveActionsPreferencePage.java
@@ -7,10 +7,10 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.editor.save;
+package com.google.eclipse.protobuf.ui.preferences.editor.save.page;
 
-import static com.google.eclipse.protobuf.ui.preferences.binding.BindingToButtonSelection.bindSelectionOf;
-import static com.google.eclipse.protobuf.ui.preferences.pages.editor.save.Messages.removeTrailingWhitespace;
+import static com.google.eclipse.protobuf.ui.preferences.editor.save.page.Messages.removeTrailingWhitespace;
+import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToButtonSelection.bindSelectionOf;
 
 import org.eclipse.jface.preference.*;
 import org.eclipse.swt.SWT;
@@ -20,7 +20,8 @@
 import org.eclipse.ui.*;
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
-import com.google.eclipse.protobuf.ui.preferences.binding.PreferenceBinder;
+import com.google.eclipse.protobuf.ui.preferences.editor.save.core.SaveActionsPreferences;
+import com.google.eclipse.protobuf.ui.preferences.pages.binding.PreferenceBinder;
 import com.google.inject.Inject;
 
 /**
@@ -35,9 +36,7 @@
   private final PreferenceBinder preferenceBinder = new PreferenceBinder();
 
   private Button btnRemoveTrailingwhitespace;
-
   private Button btnInEditedLines;
-
   private Button btnInAllLines;
 
   /** {@inheritDoc} */
@@ -68,7 +67,7 @@
   }
 
   private void setUpBinding() {
-    RawPreferences preferences = new RawPreferences(getPreferenceStore());
+    SaveActionsPreferences preferences = new SaveActionsPreferences(getPreferenceStore());
     preferenceBinder.addAll(
         bindSelectionOf(btnRemoveTrailingwhitespace).to(preferences.removeTrailingWhitespace()),
         bindSelectionOf(btnInAllLines).to(preferences.inAllLines()),
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/core/GeneralPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/core/GeneralPreferenceStoreInitializer.java
new file mode 100644
index 0000000..51e26e0
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/core/GeneralPreferenceStoreInitializer.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.preferences.general.core;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.*;
+
+/**
+ * Initializes default values for the "Paths" preferences.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class GeneralPreferenceStoreInitializer implements IPreferenceStoreInitializer {
+
+  /** {@inheritDoc} */
+  @Override public void initialize(IPreferenceStoreAccess storeAccess) {
+    IPreferenceStore store = storeAccess.getWritablePreferenceStore();
+    GeneralPreferences preferences = new GeneralPreferences(store);
+    preferences.enableProjectSettings().setDefaultValue(false);
+    preferences.validateFilesOnActivation().setDefaultValue(true);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/core/GeneralPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/core/GeneralPreferences.java
new file mode 100644
index 0000000..bb08303
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/core/GeneralPreferences.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.preferences.general.core;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+
+import com.google.eclipse.protobuf.ui.preferences.BooleanPreference;
+
+/**
+ * General preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class GeneralPreferences {
+
+  public static final String ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME = "general.enableProjectSettings";
+
+  /**
+   * Creates a new <code>{@link GeneralPreferences}</code>.
+   * @param storeAccess simplified access to Eclipse's preferences.
+   * @param project the current project.
+   * @return the created {@code GeneralPreferences}.
+   */
+  public static GeneralPreferences generalPreferences(IPreferenceStoreAccess storeAccess, IProject project) {
+    IPreferenceStore store = storeAccess.getWritablePreferenceStore(project);
+    boolean enableProjectSettings = store.getBoolean(ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME);
+    if (!enableProjectSettings) {
+      store = storeAccess.getWritablePreferenceStore();
+    }
+    return new GeneralPreferences(store);
+  }
+
+  private final BooleanPreference enableProjectSettings;
+  private final BooleanPreference validateFilesOnActivation;
+
+  /**
+   * Creates a new <code>{@link GeneralPreferences}</code>.
+   * @param store a table mapping named preferences to values.
+   */
+  public GeneralPreferences(IPreferenceStore store) {
+    enableProjectSettings = new BooleanPreference(ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME, store);
+    validateFilesOnActivation = new BooleanPreference("general.validateFilesOnActivation", store);
+  }
+
+  /**
+   * Returns the setting that specifies whether project project should be used instead of workspace preferences.
+   * @return the setting that specifies whether project project should be used instead of workspace preferences.
+   */
+  public BooleanPreference enableProjectSettings() {
+    return enableProjectSettings;
+  }
+
+  /**
+   * Returns the setting that specifies whether files should be validated when activated.
+   * @return the setting that specifies whether files should be validated when activated.
+   */
+  public BooleanPreference validateFilesOnActivation() {
+    return validateFilesOnActivation;
+  }
+}
\ No newline at end of file
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/page/GeneralPreferencePage.java
similarity index 66%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferencePage.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/page/GeneralPreferencePage.java
index a6ceeae..0e9aecd 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/page/GeneralPreferencePage.java
@@ -6,20 +6,19 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.general;
+package com.google.eclipse.protobuf.ui.preferences.general.page;
 
-import static com.google.eclipse.protobuf.ui.preferences.binding.BindingToButtonSelection.bindSelectionOf;
-import static com.google.eclipse.protobuf.ui.preferences.pages.general.EnableProjectSettingsPreference.enableProjectSettings;
-import static com.google.eclipse.protobuf.ui.preferences.pages.general.Messages.*;
+import static com.google.eclipse.protobuf.ui.preferences.general.core.GeneralPreferences.ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME;
+import static com.google.eclipse.protobuf.ui.preferences.general.page.Messages.*;
+import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToButtonSelection.bindSelectionOf;
 
-import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.*;
 import org.eclipse.swt.widgets.*;
 
-import com.google.eclipse.protobuf.ui.preferences.BooleanPreference;
-import com.google.eclipse.protobuf.ui.preferences.binding.PreferenceBinder;
+import com.google.eclipse.protobuf.ui.preferences.general.core.GeneralPreferences;
 import com.google.eclipse.protobuf.ui.preferences.pages.PreferenceAndPropertyPage;
+import com.google.eclipse.protobuf.ui.preferences.pages.binding.PreferenceBinder;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -42,12 +41,12 @@
     new Label(parent, SWT.NONE);
   }
 
-  @Override protected BooleanPreference enableProjectSettingsPreference(IPreferenceStore store) {
-    return enableProjectSettings(store);
+  @Override protected String enableProjectSettingsPreferenceName() {
+    return ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME;
   }
 
   @Override protected void setupBinding(PreferenceBinder preferenceBinder) {
-    RawPreferences preferences = new RawPreferences(getPreferenceStore());
+    GeneralPreferences preferences = new GeneralPreferences(getPreferenceStore());
     preferenceBinder.addAll(
         bindSelectionOf(btnValidateOnActivation).to(preferences.validateFilesOnActivation())
       );
@@ -65,9 +64,9 @@
     enableProjectSpecificOptions(active);
   }
 
-  private void enableProjectSpecificOptions(boolean isEnabled) {
-    grpValidation.setEnabled(isEnabled);
-    btnValidateOnActivation.setEnabled(isEnabled);
+  private void enableProjectSpecificOptions(boolean enabled) {
+    grpValidation.setEnabled(enabled);
+    btnValidateOnActivation.setEnabled(enabled);
   }
 
   @Override protected String preferencePageId() {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/Messages.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/page/Messages.java
similarity index 90%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/Messages.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/page/Messages.java
index cfba0ba..74d9b38 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/Messages.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/page/Messages.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.general;
+package com.google.eclipse.protobuf.ui.preferences.general.page;
 
 import org.eclipse.osgi.util.NLS;
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/Messages.properties b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/page/Messages.properties
similarity index 100%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/Messages.properties
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/page/Messages.properties
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/ButtonGroup.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/ButtonGroup.java
new file mode 100644
index 0000000..bfe5f0b
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/ButtonGroup.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.preferences.pages;
+
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Button;
+
+/**
+ * Group of <code>{@link Button}</code>s.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ButtonGroup {
+
+  /**
+   * Creates a new <code>{@link ButtonGroup}</code>.
+   * @param buttons the buttons to group.
+   * @return the created group of buttons.
+   */
+  public static ButtonGroup with(Button...buttons) {
+    return new ButtonGroup(buttons);
+  }
+
+  private final Button[] buttons;
+
+  private ButtonGroup(Button[] buttons) {
+    this.buttons = buttons;
+  }
+
+  /**
+   * Adds the given <code>{@link SelectionListener}</code> to all the buttons in this group.
+   * @param listener the {@code SelectionListener} to add.
+   */
+  public void add(SelectionListener listener) {
+    for (Button b : buttons) {
+      b.addSelectionListener(listener);
+    }
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/DataChangedListener.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/DataChangedListener.java
similarity index 88%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/DataChangedListener.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/DataChangedListener.java
index 9412a0c..d10af2c 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/DataChangedListener.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/DataChangedListener.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences;
+package com.google.eclipse.protobuf.ui.preferences.pages;
 
 /**
  * Listener notified when data in a preference page changes.
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/InputDialog.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/InputDialog.java
similarity index 94%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/InputDialog.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/InputDialog.java
index d7306cd..6313139 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/InputDialog.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/InputDialog.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences;
+package com.google.eclipse.protobuf.ui.preferences.pages;
 
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.swt.SWT;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/LabelWidgets.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/LabelWidgets.java
new file mode 100644
index 0000000..fa07622
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/LabelWidgets.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.preferences.pages;
+
+import static com.google.eclipse.protobuf.ui.preferences.pages.SystemColors.getSystemColor;
+
+import org.eclipse.swt.*;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * Utility methods related to <code>{@link Label}</code> widgets.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public final class LabelWidgets {
+
+  /**
+   * Enables the given label widget if the given "enabled" state is {@code true}, and disables it otherwise. This method
+   * also sets the foreground of the widget to the system color with id <code>{@link SWT#COLOR_WIDGET_FOREGROUND}</code>
+   * if the given "enabled" state is {@code true}, otherwise it sets the foreground of the widget to the system color
+   * with id <code>{@link SWT#COLOR_TITLE_INACTIVE_FOREGROUND}</code>.
+   * @param label the given label widget.
+   * @param editable the new "enabled" state.
+   * @throws SWTException if the given label widget has been disposed or if this method is not called from the thread
+   * that created the label widget.
+   */
+  public static void setEnabled(Label label, boolean enabled) {
+    label.setEnabled(enabled);
+    updateForegroundColor(label);
+  }
+
+  private static void updateForegroundColor(Label label) {
+    int colorId = label.isEnabled() ? SWT.COLOR_WIDGET_FOREGROUND : SWT.COLOR_TITLE_INACTIVE_FOREGROUND;
+    label.setForeground(getSystemColor(colorId));
+  }
+
+  private LabelWidgets() {}
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/PreferenceAndPropertyPage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/PreferenceAndPropertyPage.java
index c8cbf10..9705c99 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/PreferenceAndPropertyPage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/PreferenceAndPropertyPage.java
@@ -8,9 +8,10 @@
  */
 package com.google.eclipse.protobuf.ui.preferences.pages;
 
-import static com.google.eclipse.protobuf.ui.preferences.binding.BindingToButtonSelection.bindSelectionOf;
 import static com.google.eclipse.protobuf.ui.preferences.pages.Messages.*;
+import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToButtonSelection.bindSelectionOf;
 import static org.eclipse.ui.dialogs.PreferencesUtil.createPreferenceDialogOn;
+import static org.eclipse.xtext.util.Strings.isEmpty;
 
 import java.util.Map;
 
@@ -25,7 +26,7 @@
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
 import com.google.eclipse.protobuf.ui.preferences.BooleanPreference;
-import com.google.eclipse.protobuf.ui.preferences.binding.PreferenceBinder;
+import com.google.eclipse.protobuf.ui.preferences.pages.binding.PreferenceBinder;
 import com.google.inject.Inject;
 
 /**
@@ -33,7 +34,8 @@
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public abstract class PreferenceAndPropertyPage extends PreferencePage implements IWorkbenchPreferencePage, IWorkbenchPropertyPage {
+public abstract class PreferenceAndPropertyPage extends PreferencePage implements IWorkbenchPreferencePage,
+    IWorkbenchPropertyPage {
 
   private Button btnEnableProjectSettings;
 
@@ -123,21 +125,21 @@
   protected abstract void doCreateContents(Composite parent);
 
   private void setupBindingOfBtnEnabledProjectSettings() {
-    BooleanPreference preference = enableProjectSettingsPreference(getPreferenceStore());
-    if (preference == null) {
+    String preferenceName = enableProjectSettingsPreferenceName();
+    if (isEmpty(preferenceName)) {
       return;
     }
+    BooleanPreference preference = new BooleanPreference(preferenceName, getPreferenceStore());
     preferenceBinder.add(bindSelectionOf(btnEnableProjectSettings).to(preference));
   }
 
   /**
-   * Returns the preference that indicates whether this page is a "Project Properties" or a "Workspace Preferences"
-   * page.
-   * @param store the store where the preference value is stored.
-   * @return the preference that indicates whether this page is a "Project Properties" or a "Workspace Preferences"
-   * page.
+   * Returns the name of the preference that specifies whether this page is a "Project Properties" or a "Workspace
+   * Preferences" page.
+   * @return the name of the preference that specifies whether this page is a "Project Properties" or a "Workspace
+   * Preferences" page.
    */
-  protected abstract BooleanPreference enableProjectSettingsPreference(IPreferenceStore store);
+  protected abstract String enableProjectSettingsPreferenceName();
 
   /**
    * Sets up data binding.
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/SystemColors.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/SystemColors.java
new file mode 100644
index 0000000..58fce42
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/SystemColors.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.preferences.pages;
+
+import org.eclipse.swt.*;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Utility methods related to system colors.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public final class SystemColors {
+
+  /**
+   * Returns the system color with id <code>{@link SWT#COLOR_WIDGET_BACKGROUND}</code>.
+   * @return the system color with id {@code COLOR_WIDGET_BACKGROUND}.
+   */
+  public static Color widgetBackgroundColor() {
+    return getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
+  }
+
+  /**
+   * Returns the matching standard color for the given constant, which should one of the color constants specified in
+   * <code>{@link SWT}</code>. Any value other than one of the SWT color constants which is passed in will result in the
+   * color black. This color should not be free'd because it was allocated by the system, not the application.
+   * @param colorId the color constant.
+   * @return the matching color.
+   * @throws SWTException if this method is not called from the thread that created the receiver or if the receiver has
+   * been disposed.
+   */
+  public static Color getSystemColor(int colorId) {
+    return Display.getCurrent().getSystemColor(colorId);
+  }
+
+  private SystemColors() {
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/TextWidgets.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/TextWidgets.java
new file mode 100644
index 0000000..0cde79d
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/TextWidgets.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.preferences.pages;
+
+import static com.google.eclipse.protobuf.ui.preferences.pages.SystemColors.getSystemColor;
+
+import org.eclipse.swt.*;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Utility methods related to <code>{@link Text}</code> widgets.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public final class TextWidgets {
+
+  /**
+   * Sets the "editable" state of the given text widget. This method also sets the background of the widget to
+   * the system color with id <code>{@link SWT#COLOR_LIST_BACKGROUND}</code> if the given "editable" state is
+   * {@code true}, otherwise it sets the background of the widget to the system color with id
+   * <code>{@link SWT#COLOR_WIDGET_BACKGROUND}</code>.
+   * @param text the given text widget.
+   * @param editable the new "editable" state.
+   * @throws SWTException if the given text widget has been disposed or if this method is not called from the thread
+   * that created the text widget.
+   */
+  public static void setEditable(Text text, boolean editable) {
+    text.setEditable(editable);
+    updateBackgroundColor(text);
+  }
+
+  /**
+   * Enables the given text widget if the given "enabled" state is {@code true}, and disables it otherwise. This method
+   * also sets the background of the widget to the system color with id <code>{@link SWT#COLOR_LIST_BACKGROUND}</code>
+   * if the given "enabled" state is {@code true}, otherwise it sets the background of the widget to the system color
+   * with id <code>{@link SWT#COLOR_WIDGET_BACKGROUND}</code>.
+   * @param text the given text widget.
+   * @param editable the new "enabled" state.
+   * @throws SWTException if the given text widget has been disposed or if this method is not called from the thread
+   * that created the text widget.
+   */
+  public static void setEnabled(Text text, boolean enabled) {
+    text.setEnabled(enabled);
+    updateBackgroundColor(text);
+  }
+
+  private static void updateBackgroundColor(Text text) {
+    int colorId = (text.isEnabled() && text.getEditable()) ? SWT.COLOR_LIST_BACKGROUND : SWT.COLOR_WIDGET_BACKGROUND;
+    text.setBackground(getSystemColor(colorId));
+  }
+
+  private TextWidgets() {}
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/Binding.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/Binding.java
similarity index 92%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/Binding.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/Binding.java
index feffdfb..d9c662c 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/Binding.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/Binding.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.binding;
+package com.google.eclipse.protobuf.ui.preferences.pages.binding;
 
 import org.eclipse.jface.preference.IPreferenceStore;
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToButtonSelection.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/BindingToButtonSelection.java
similarity index 91%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToButtonSelection.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/BindingToButtonSelection.java
index f415648..39153e6 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToButtonSelection.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/BindingToButtonSelection.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.binding;
+package com.google.eclipse.protobuf.ui.preferences.pages.binding;
 
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.swt.widgets.Button;
@@ -40,12 +40,12 @@
 
   /** {@inheritDoc} */
   @Override public void applyPreferenceValueToTarget() {
-    apply(preference.value());
+    apply(preference.getValue());
   }
 
   /** {@inheritDoc} */
   @Override public void applyDefaultPreferenceValueToTarget() {
-    apply(preference.defaultValue());
+    apply(preference.getDefaultValue());
   }
 
   private void apply(boolean value) {
@@ -54,7 +54,7 @@
 
   /** {@inheritDoc} */
   @Override public void savePreferenceValue() {
-    preference.value(button.getSelection());
+    preference.setValue(button.getSelection());
   }
 
   public static class BindingBuilder {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToListItems.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/BindingToListItems.java
similarity index 91%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToListItems.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/BindingToListItems.java
index 9deab97..6289f2d 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToListItems.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/BindingToListItems.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.binding;
+package com.google.eclipse.protobuf.ui.preferences.pages.binding;
 
 import static java.util.Arrays.asList;
 
@@ -44,12 +44,12 @@
 
   /** {@inheritDoc} */
   @Override public void applyPreferenceValueToTarget() {
-    apply(preference.value());
+    apply(preference.getValue());
   }
 
   /** {@inheritDoc} */
   @Override public void applyDefaultPreferenceValueToTarget() {
-    apply(preference.defaultValue());
+    apply(preference.getDefaultValue());
   }
 
   private void apply(Collection<String> value) {
@@ -61,7 +61,7 @@
 
   /** {@inheritDoc} */
   @Override public void savePreferenceValue() {
-    preference.value(asList(list.getItems()));
+    preference.setValue(asList(list.getItems()));
   }
 
   public static class BindingBuilder {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToTextValue.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/BindingToTextValue.java
similarity index 91%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToTextValue.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/BindingToTextValue.java
index 170b0a1..64143d9 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/BindingToTextValue.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/BindingToTextValue.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.binding;
+package com.google.eclipse.protobuf.ui.preferences.pages.binding;
 
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.swt.widgets.Text;
@@ -40,12 +40,12 @@
 
   /** {@inheritDoc} */
   @Override public void applyPreferenceValueToTarget() {
-    apply(preference.value());
+    apply(preference.getValue());
   }
 
   /** {@inheritDoc} */
   @Override public void applyDefaultPreferenceValueToTarget() {
-    apply(preference.defaultValue());
+    apply(preference.getDefaultValue());
   }
 
   private void apply(String value) {
@@ -54,7 +54,7 @@
 
   /** {@inheritDoc} */
   @Override public void savePreferenceValue() {
-    preference.value(text.getText());
+    preference.setValue(text.getText());
   }
 
   public static class BindingBuilder {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/PreferenceBinder.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/PreferenceBinder.java
similarity index 95%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/PreferenceBinder.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/PreferenceBinder.java
index 523eb85..2b7d548 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/binding/PreferenceBinder.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/PreferenceBinder.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.binding;
+package com.google.eclipse.protobuf.ui.preferences.pages.binding;
 
 import java.util.*;
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/BindingToCodeGeneration.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/BindingToCodeGeneration.java
deleted file mode 100644
index 65fe246..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/BindingToCodeGeneration.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.compiler;
-
-import com.google.eclipse.protobuf.ui.preferences.*;
-import com.google.eclipse.protobuf.ui.preferences.binding.Binding;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-class BindingToCodeGeneration implements Binding {
-
-  private final CodeGenerationSetting codeGeneration;
-  private final BooleanPreference enabled;
-  private final StringPreference outputDirectory;
-
-  static BindingBuilder bindCodeGeneration(CodeGenerationSetting codeGeneration) {
-    return new BindingBuilder(codeGeneration);
-  }
-
-  private BindingToCodeGeneration(CodeGenerationSetting codeGeneration, BooleanPreference enabled, StringPreference outputDirectory) {
-    this.codeGeneration = codeGeneration;
-    this.enabled = enabled;
-    this.outputDirectory = outputDirectory;
-  }
-
-  /** {@inheritDoc} */
-  @Override public void applyPreferenceValueToTarget() {
-    codeGeneration.enabled(enabled.value());
-    codeGeneration.outputDirectory(outputDirectory.value());
-  }
-
-  /** {@inheritDoc} */
-  @Override public void applyDefaultPreferenceValueToTarget() {
-    codeGeneration.enabled(enabled.defaultValue());
-    codeGeneration.outputDirectory(outputDirectory.defaultValue());
-  }
-
-  /** {@inheritDoc} */
-  @Override public void savePreferenceValue() {
-    enabled.value(codeGeneration.isEnabled());
-    outputDirectory.value(codeGeneration.outputDirectory());
-  }
-
-  static class BindingBuilder {
-    private final CodeGenerationSetting codeGeneration;
-
-    BindingBuilder(CodeGenerationSetting codeGeneration) {
-      this.codeGeneration = codeGeneration;
-    }
-
-    BindingToCodeGeneration to(BooleanPreference enabled, StringPreference outputDirectory) {
-      return new BindingToCodeGeneration(codeGeneration, enabled, outputDirectory);
-    }
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CodeGenerationEditor.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CodeGenerationEditor.java
deleted file mode 100644
index 086924f..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CodeGenerationEditor.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.compiler;
-
-import static com.google.eclipse.protobuf.ui.preferences.pages.compiler.Messages.*;
-import static org.eclipse.jface.window.Window.OK;
-
-import java.util.*;
-import java.util.List;
-
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.xtext.ui.PluginImageHelper;
-
-import com.google.eclipse.protobuf.ui.preferences.DataChangedListener;
-
-/**
- * Editor where users can specify which are the target languages for protoc and the location of the output folders for
- * each language.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class CodeGenerationEditor extends Composite {
-
-  private final Table tblCodeGenerationOptions;
-  private final TableViewer tblVwrCodeGenerationOptions;
-  private final Button btnEdit;
-
-  private final List<CodeGenerationSetting> settings = new ArrayList<CodeGenerationSetting>();
-
-  private DataChangedListener dataChangedListener;
-
-  public CodeGenerationEditor(Composite parent, final PluginImageHelper imageHelper) {
-    super(parent, SWT.NONE);
-    setLayout(new GridLayout(1, false));
-
-    tblVwrCodeGenerationOptions = new TableViewer(this, SWT.BORDER | SWT.FULL_SELECTION);
-
-    tblCodeGenerationOptions = tblVwrCodeGenerationOptions.getTable();
-    tblCodeGenerationOptions.setHeaderVisible(true);
-    tblCodeGenerationOptions.setLinesVisible(true);
-    tblCodeGenerationOptions.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-
-    TableViewerColumn tblclmnVwrEnabled = new TableViewerColumn(tblVwrCodeGenerationOptions, SWT.NONE);
-    TableColumn tblclmnEnabled = tblclmnVwrEnabled.getColumn();
-    tblclmnEnabled.setResizable(false);
-    tblclmnEnabled.setWidth(27);
-    tblclmnVwrEnabled.setLabelProvider(new ColumnLabelProvider() {
-      @Override public String getText(Object element) {
-        return "";
-      }
-
-      @Override public Image getImage(Object element) {
-        boolean optionEnabled = ((CodeGenerationSetting)element).isEnabled();
-        return imageHelper.getImage(optionEnabled ? "checked.gif" : "unchecked.gif");
-      }
-    });
-
-    TableViewerColumn tblclmnVwrLanguage = new TableViewerColumn(tblVwrCodeGenerationOptions, SWT.NONE);
-    TableColumn tblclmnLanguage = tblclmnVwrLanguage.getColumn();
-    tblclmnLanguage.setResizable(false);
-    tblclmnLanguage.setWidth(100);
-    tblclmnLanguage.setText(language);
-    tblclmnVwrLanguage.setLabelProvider(new ColumnLabelProvider() {
-      @Override public String getText(Object element) {
-        return ((CodeGenerationSetting)element).language().name();
-      }
-    });
-
-    TableViewerColumn tblclmnVwrOutputDirectory = new TableViewerColumn(tblVwrCodeGenerationOptions, SWT.NONE);
-    TableColumn tblclmnOutputDirectory = tblclmnVwrOutputDirectory.getColumn();
-    tblclmnOutputDirectory.setResizable(false);
-    tblclmnOutputDirectory.setWidth(100);
-    tblclmnOutputDirectory.setText(outputDirectory);
-    tblclmnVwrOutputDirectory.setLabelProvider(new ColumnLabelProvider() {
-      @Override public String getText(Object element) {
-        return ((CodeGenerationSetting)element).outputDirectory();
-      }
-    });
-
-    btnEdit = new Button(this, SWT.NONE);
-    btnEdit.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-    btnEdit.setText(editSelected);
-
-    tblVwrCodeGenerationOptions.setContentProvider(ArrayContentProvider.getInstance());
-
-    addEventListeners();
-    updateTable();
-  }
-
-  private void addEventListeners() {
-    tblCodeGenerationOptions.addSelectionListener(new SelectionAdapter() {
-      @Override public void widgetSelected(SelectionEvent e) {
-        btnEdit.setEnabled(tblCodeGenerationOptions.getSelectionIndex() > -1);
-      }
-    });
-    btnEdit.addSelectionListener(new SelectionAdapter() {
-      @Override public void widgetSelected(SelectionEvent e) {
-        int selectionIndex = tblCodeGenerationOptions.getSelectionIndex();
-        CodeGenerationSetting option = settings.get(selectionIndex);
-        EditCodeGenerationDialog dialog = new EditCodeGenerationDialog(getShell(), option);
-        if (dialog.open() == OK) {
-          tblVwrCodeGenerationOptions.refresh();
-          if (dataChangedListener != null) {
-            dataChangedListener.dataChanged();
-          }
-        }
-      }
-    });
-  }
-
-  public void codeGenerationSettings(CodeGenerationSettings newSettings) {
-    settings.clear();
-    settings.addAll(newSettings.allSettings());
-    updateTable();
-  }
-
-  private void updateTable() {
-    tblVwrCodeGenerationOptions.setInput(settings);
-    if (!settings.isEmpty()) {
-      tblCodeGenerationOptions.setSelection(0);
-    }
-  }
-
-  /** {@inheritDoc} */
-  @Override public void setEnabled(boolean enabled) {
-    tblCodeGenerationOptions.setEnabled(enabled);
-    btnEdit.setEnabled(enabled);
-    super.setEnabled(enabled);
-  }
-
-  public void setDataChangedListener(DataChangedListener listener) {
-    dataChangedListener = listener;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CodeGenerationSetting.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CodeGenerationSetting.java
deleted file mode 100644
index f945352..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CodeGenerationSetting.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.compiler;
-
-/**
- * Indicates whether code generation for a specific language is enabled and where the generated code should be placed.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class CodeGenerationSetting {
-
-  private final SupportedLanguage language;
-
-  private String outputDirectory;
-  private boolean enabled;
-
-  CodeGenerationSetting(SupportedLanguage language) {
-    this.language = language;
-  }
-
-  /**
-   * Returns the supported language.
-   * @return the supported language.
-   */
-  public SupportedLanguage language() {
-    return language;
-  }
-
-  /**
-   * Returns the name of the output directory.
-   * @return the name of the output directory.
-   */
-  public String outputDirectory() {
-    return outputDirectory;
-  }
-
-  /**
-   * Indicates whether the language in this preference is enabled or not.
-   * @return {@code true} if the language is enabled; {@code false} otherwise.
-   */
-  public boolean isEnabled() {
-    return enabled;
-  }
-
-  /**
-   * Updates the name of the output directory.
-   * @param newVal the new name.
-   */
-  public void outputDirectory(String newVal) {
-    outputDirectory = newVal;
-  }
-
-  /**
-   * Enables or disables the language in this preference.
-   * @param newVal indicates whether the language is enabled or not.
-   */
-  public void enabled(boolean newVal) {
-    enabled = newVal;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CodeGenerationSettings.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CodeGenerationSettings.java
deleted file mode 100644
index 30415e5..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CodeGenerationSettings.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.compiler;
-
-import static com.google.eclipse.protobuf.ui.preferences.pages.compiler.SupportedLanguage.*;
-import static java.util.Arrays.asList;
-import static java.util.Collections.unmodifiableList;
-
-import java.util.List;
-
-/**
- * All the supported <code>{@link CodeGenerationSetting}</code>s.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class CodeGenerationSettings {
-
-  private final CodeGenerationSetting java;
-  private final CodeGenerationSetting cpp;
-  private final CodeGenerationSetting python;
-
-  private final List<CodeGenerationSetting> allSettings;
-
-  CodeGenerationSettings() {
-    java = new CodeGenerationSetting(JAVA);
-    cpp = new CodeGenerationSetting(CPP);
-    python = new CodeGenerationSetting(PYTHON);
-    allSettings = unmodifiableList(asList(java, cpp, python));
-  }
-
-  /**
-   * Returns the settings for code generation using Java.
-   * @return the settings for code generation using Java.
-   */
-  public CodeGenerationSetting java() {
-    return java;
-  }
-
-  /**
-   * Returns the settings for code generation using C++.
-   * @return the settings for code generation using C++.
-   */
-  public CodeGenerationSetting cpp() {
-    return cpp;
-  }
-
-  /**
-   * Returns the settings for code generation using Python.
-   * @return the settings for code generation using Python.
-   */
-  public CodeGenerationSetting python() {
-    return python;
-  }
-
-  /**
-   * Returns all the settings for code generation using all supported languages.
-   * @return all the settings for code generation using all supported languages.
-   */
-  public List<CodeGenerationSetting> allSettings() {
-    return allSettings;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CompilerPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CompilerPreferencePage.java
deleted file mode 100644
index 88ea122..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CompilerPreferencePage.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.compiler;
-
-import static com.google.eclipse.protobuf.ui.preferences.Buttons.with;
-import static com.google.eclipse.protobuf.ui.preferences.binding.BindingToButtonSelection.bindSelectionOf;
-import static com.google.eclipse.protobuf.ui.preferences.binding.BindingToTextValue.bindTextOf;
-import static com.google.eclipse.protobuf.ui.preferences.pages.compiler.BindingToCodeGeneration.bindCodeGeneration;
-import static com.google.eclipse.protobuf.ui.preferences.pages.compiler.EnableProjectSettingsPreference.enableProjectSettings;
-import static com.google.eclipse.protobuf.ui.preferences.pages.compiler.Messages.*;
-import static com.google.eclipse.protobuf.ui.swt.Colors.widgetBackground;
-import static org.eclipse.xtext.util.Strings.isEmpty;
-
-import java.io.File;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.xtext.ui.PluginImageHelper;
-
-import com.google.eclipse.protobuf.ui.preferences.*;
-import com.google.eclipse.protobuf.ui.preferences.binding.PreferenceBinder;
-import com.google.eclipse.protobuf.ui.preferences.pages.PreferenceAndPropertyPage;
-import com.google.inject.Inject;
-
-/**
- * Preference page for protobuf compiler.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class CompilerPreferencePage extends PreferenceAndPropertyPage {
-
-  private static final String PREFERENCE_PAGE_ID = CompilerPreferencePage.class.getName();
-
-  private Button btnCompileProtoFiles;
-  private TabFolder tabFolder;
-  private TabItem tbtmMain;
-  private TabItem tbtmRefresh;
-  private Group grpCompilerLocation;
-  private Button btnUseProtocInSystemPath;
-  private Button btnUseProtocInCustomPath;
-  private Text txtProtocFilePath;
-  private Button btnProtocPathBrowse;
-  private Group grpCodeGeneration;
-  private CodeGenerationEditor codeGenerationEditor;
-  private Button btnRefreshResources;
-  private Group grpRefresh;
-  private Button btnRefreshProject;
-  private Button btnRefreshOutputDirectory;
-  private Group grpDescriptorLocation;
-  private Text txtDescriptorFilePath;
-  private Button btnDescriptorPathBrowse;
-
-  @Inject private PluginImageHelper imageHelper;
-
-  private final CodeGenerationSettings codeGenerationSettings = new CodeGenerationSettings();
-
-  @Override protected void doCreateContents(Composite parent) {
-    btnCompileProtoFiles = new Button(parent, SWT.CHECK);
-    btnCompileProtoFiles.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
-    btnCompileProtoFiles.setText(compileOnSave);
-
-    tabFolder = new TabFolder(parent, SWT.NONE);
-    tabFolder.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-
-    tbtmMain = new TabItem(tabFolder, SWT.NONE);
-    tbtmMain.setText(tabMain);
-
-    Composite cmpMain = new Composite(tabFolder, SWT.NONE);
-    tbtmMain.setControl(cmpMain);
-    cmpMain.setLayout(new GridLayout(1, false));
-
-    grpCompilerLocation = new Group(cmpMain, SWT.NONE);
-    grpCompilerLocation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-    grpCompilerLocation.setLayout(new GridLayout(2, false));
-    grpCompilerLocation.setText(protocLocation);
-
-    btnUseProtocInSystemPath = new Button(grpCompilerLocation, SWT.RADIO);
-    btnUseProtocInSystemPath.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
-    btnUseProtocInSystemPath.setText(protocInSystemPath);
-
-    btnUseProtocInCustomPath = new Button(grpCompilerLocation, SWT.RADIO);
-    btnUseProtocInCustomPath.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
-    btnUseProtocInCustomPath.setText(protocInCustomPath);
-
-    txtProtocFilePath = new Text(grpCompilerLocation, SWT.BORDER);
-    txtProtocFilePath.setBackground(widgetBackground());
-    txtProtocFilePath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-    txtProtocFilePath.setEditable(false);
-
-    btnProtocPathBrowse = new Button(grpCompilerLocation, SWT.NONE);
-    btnProtocPathBrowse.setText(browseCustomPath);
-
-    grpDescriptorLocation = new Group(cmpMain, SWT.NONE);
-    grpDescriptorLocation.setText(descriptorLocation);
-    grpDescriptorLocation.setLayout(new GridLayout(2, false));
-    grpDescriptorLocation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
-    txtDescriptorFilePath = new Text(grpDescriptorLocation, SWT.BORDER);
-    txtDescriptorFilePath.setBackground(widgetBackground());
-    txtDescriptorFilePath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-    txtDescriptorFilePath.setEditable(false);
-
-    btnDescriptorPathBrowse = new Button(grpDescriptorLocation, SWT.NONE);
-    btnDescriptorPathBrowse.setText(browseCustomPath);
-
-    grpCodeGeneration = new Group(cmpMain, SWT.NONE);
-    grpCodeGeneration.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-    grpCodeGeneration.setText(codeGeneration);
-    grpCodeGeneration.setLayout(new GridLayout(1, false));
-
-    codeGenerationEditor = new CodeGenerationEditor(grpCodeGeneration, imageHelper);
-    codeGenerationEditor.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
-
-    tbtmRefresh = new TabItem(tabFolder, SWT.NONE);
-    tbtmRefresh.setText(tabRefresh);
-
-    Composite cmpRefresh = new Composite(tabFolder, SWT.NONE);
-    tbtmRefresh.setControl(cmpRefresh);
-    cmpRefresh.setLayout(new GridLayout(1, false));
-
-    btnRefreshResources = new Button(cmpRefresh, SWT.CHECK);
-    btnRefreshResources.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-    btnRefreshResources.setText(refreshResources);
-
-    grpRefresh = new Group(cmpRefresh, SWT.NONE);
-    grpRefresh.setLayout(new GridLayout(1, false));
-    grpRefresh.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
-    btnRefreshProject = new Button(grpRefresh, SWT.RADIO);
-    btnRefreshProject.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-    btnRefreshProject.setText(refreshProject);
-
-    btnRefreshOutputDirectory = new Button(grpRefresh, SWT.RADIO);
-    btnRefreshOutputDirectory.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-    btnRefreshOutputDirectory.setText(refreshOutputProject);
-    new Label(parent, SWT.NONE);
-
-    addEventListeners();
-  }
-
-  private void addEventListeners() {
-    btnCompileProtoFiles.addSelectionListener(new SelectionAdapter() {
-      @Override public void widgetSelected(SelectionEvent e) {
-        boolean selected = btnCompileProtoFiles.getSelection();
-        enableCompilerOptions(selected);
-        checkState();
-      }
-    });
-    with(btnUseProtocInCustomPath, btnUseProtocInSystemPath).add(new SelectionAdapter() {
-      @Override public void widgetSelected(SelectionEvent e) {
-        boolean selected = btnUseProtocInCustomPath.getSelection();
-        enableCompilerCustomPathOptions(selected);
-        checkState();
-      }
-    });
-    btnProtocPathBrowse.addSelectionListener(new SelectionAdapter() {
-      @Override public void widgetSelected(SelectionEvent e) {
-        FileDialog dialog = new FileDialog(getShell(), SWT.OPEN | SWT.SHEET);
-        String file = dialog.open();
-        if (file != null) {
-          txtProtocFilePath.setText(file);
-        }
-        checkState();
-      }
-    });
-    btnDescriptorPathBrowse.addSelectionListener(new SelectionAdapter() {
-      @Override public void widgetSelected(SelectionEvent e) {
-        FileDialog dialog = new FileDialog(getShell(), SWT.OPEN | SWT.SHEET);
-        dialog.setFilterExtensions(new String[] { "*.proto" });
-        String file = dialog.open();
-        if (file != null) {
-          txtDescriptorFilePath.setText(file);
-        }
-        checkState();
-      }
-    });
-    btnRefreshResources.addSelectionListener(new SelectionAdapter() {
-      @Override public void widgetSelected(SelectionEvent e) {
-        refreshResourcesOptionsEnabled(btnRefreshResources.getSelection());
-      }
-    });
-    codeGenerationEditor.setDataChangedListener(new DataChangedListener() {
-      @Override public void dataChanged() {
-        checkState();
-      }
-    });
-  }
-
-  private void checkState() {
-    boolean atLeastOneLanguageEnabled = false;
-    for (CodeGenerationSetting option : codeGenerationSettings.allSettings()) {
-      if (option.isEnabled()) {
-        atLeastOneLanguageEnabled = true;
-        break;
-      }
-    }
-    if (!atLeastOneLanguageEnabled) {
-      pageIsNowInvalid(errorNoLanguageEnabled);
-      return;
-    }
-    if (customPathOptionSelectedAndEnabled()) {
-      String protocPath = txtProtocFilePath.getText();
-      if (isEmpty(protocPath)) {
-        pageIsNowInvalid(errorNoSelection);
-        return;
-      }
-      File protoc = new File(protocPath);
-      if (!protoc.isFile()) {
-        pageIsNowInvalid(errorInvalidProtoc);
-        return;
-      }
-    }
-    String descriptorPath = txtDescriptorFilePath.getText();
-    if (!isEmpty(descriptorPath) && !isFileWithName(descriptorPath, "descriptor.proto")) {
-      pageIsNowInvalid(errorInvalidDescriptor);
-      return;
-    }
-    pageIsNowValid();
-  }
-
-  private boolean isFileWithName(String filePath, String expectedFileName) {
-    File file = new File(filePath);
-    if (!file.isFile()) {
-      return false;
-    }
-    String fileName = file.getName();
-    return expectedFileName.equals(fileName);
-  }
-
-  @Override protected BooleanPreference enableProjectSettingsPreference(IPreferenceStore store) {
-    return enableProjectSettings(store);
-  }
-
-  @Override protected void setupBinding(PreferenceBinder preferenceBinder) {
-    RawPreferences preferences = new RawPreferences(getPreferenceStore());
-    preferenceBinder.addAll(
-        bindSelectionOf(btnCompileProtoFiles).to(preferences.compileProtoFiles()),
-        bindSelectionOf(btnUseProtocInSystemPath).to(preferences.useProtocInSystemPath()),
-        bindSelectionOf(btnUseProtocInCustomPath).to(preferences.useProtocInCustomPath()),
-        bindTextOf(txtProtocFilePath).to(preferences.protocPath()),
-        bindTextOf(txtDescriptorFilePath).to(preferences.descriptorPath()),
-        bindSelectionOf(btnRefreshResources).to(preferences.refreshResources()),
-        bindSelectionOf(btnRefreshProject).to(preferences.refreshProject()),
-        bindSelectionOf(btnRefreshOutputDirectory).to(preferences.refreshOutputDirectory()),
-        bindCodeGeneration(codeGenerationSettings.java())
-          .to(preferences.javaCodeGenerationEnabled(), preferences.javaOutputDirectory()),
-        bindCodeGeneration(codeGenerationSettings.cpp())
-          .to(preferences.cppCodeGenerationEnabled(), preferences.cppOutputDirectory()),
-        bindCodeGeneration(codeGenerationSettings.python())
-          .to(preferences.pythonCodeGenerationEnabled(), preferences.pythonOutputDirectory())
-      );
-  }
-
-  @Override protected void updateContents() {
-    boolean compileProtoFiles = btnCompileProtoFiles.getSelection();
-    boolean shouldEnableCompilerOptions = compileProtoFiles;
-    if (isPropertyPage()) {
-      boolean useProjectSettings = areProjectSettingsActive();
-      activateProjectSettings(useProjectSettings);
-      enableProjectSpecificOptions(useProjectSettings);
-      shouldEnableCompilerOptions = shouldEnableCompilerOptions && useProjectSettings;
-    }
-    enableCompilerOptions(shouldEnableCompilerOptions);
-    codeGenerationEditor.codeGenerationSettings(codeGenerationSettings);
-  }
-
-  @Override protected void onProjectSettingsActivation(boolean active) {
-    enableProjectSpecificOptions(active);
-    enableCompilerOptions(isEnabledAndSelected(btnCompileProtoFiles));
-  }
-
-  private void enableProjectSpecificOptions(boolean isEnabled) {
-    btnCompileProtoFiles.setEnabled(isEnabled);
-  }
-
-  private void enableCompilerOptions(boolean isEnabled) {
-    tabFolder.setEnabled(isEnabled);
-    enableCompilerPathOptions(isEnabled);
-    enableDescriptorPathOptions(isEnabled);
-    enableOutputOptions(isEnabled);
-    enableRefreshOptions(isEnabled);
-  }
-
-  private void enableCompilerPathOptions(boolean isEnabled) {
-    grpCompilerLocation.setEnabled(isEnabled);
-    btnUseProtocInSystemPath.setEnabled(isEnabled);
-    btnUseProtocInCustomPath.setEnabled(isEnabled);
-    enableCompilerCustomPathOptions(customPathOptionSelectedAndEnabled());
-  }
-
-  private void enableCompilerCustomPathOptions(boolean isEnabled) {
-    txtProtocFilePath.setEnabled(isEnabled);
-    btnProtocPathBrowse.setEnabled(isEnabled);
-  }
-
-  private void enableDescriptorPathOptions(boolean isEnabled) {
-    grpDescriptorLocation.setEnabled(isEnabled);
-    txtDescriptorFilePath.setEnabled(isEnabled);
-    btnDescriptorPathBrowse.setEnabled(isEnabled);
-  }
-
-  private boolean customPathOptionSelectedAndEnabled() {
-    return isEnabledAndSelected(btnUseProtocInCustomPath);
-  }
-
-  private boolean isEnabledAndSelected(Button b) {
-    return b.isEnabled() && b.getSelection();
-  }
-
-  private void enableOutputOptions(boolean isEnabled) {
-    grpCodeGeneration.setEnabled(isEnabled);
-    codeGenerationEditor.setEnabled(isEnabled);
-  }
-
-  private void enableRefreshOptions(boolean isEnabled) {
-    btnRefreshResources.setEnabled(isEnabled);
-    refreshResourcesOptionsEnabled(isEnabledAndSelected(btnRefreshResources));
-  }
-
-  private void refreshResourcesOptionsEnabled(boolean isEnabled) {
-    grpRefresh.setEnabled(isEnabled);
-    btnRefreshProject.setEnabled(isEnabled);
-    btnRefreshOutputDirectory.setEnabled(isEnabled);
-  }
-
-  @Override protected String preferencePageId() {
-    return PREFERENCE_PAGE_ID;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CompilerPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CompilerPreferenceStoreInitializer.java
deleted file mode 100644
index f54e452..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CompilerPreferenceStoreInitializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.compiler;
-
-import static com.google.eclipse.protobuf.ui.preferences.pages.compiler.EnableProjectSettingsPreference.enableProjectSettings;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.xtext.ui.editor.preferences.*;
-
-/**
- * Initializes default values for the "Compiler" preferences.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class CompilerPreferenceStoreInitializer implements IPreferenceStoreInitializer {
-
-  private static final String DEFAULT_OUTPUT_DIRECTORY = "src-gen";
-
-  /** {@inheritDoc} */
-  @Override public void initialize(IPreferenceStoreAccess access) {
-    IPreferenceStore store = access.getWritablePreferenceStore();
-    enableProjectSettings(store).defaultValue(false);
-    RawPreferences preferences = new RawPreferences(store);
-    preferences.useProtocInSystemPath().defaultValue(true);
-    preferences.javaCodeGenerationEnabled().defaultValue(false);
-    preferences.cppCodeGenerationEnabled().defaultValue(false);
-    preferences.pythonCodeGenerationEnabled().defaultValue(false);
-    preferences.javaOutputDirectory().defaultValue(DEFAULT_OUTPUT_DIRECTORY);
-    preferences.cppOutputDirectory().defaultValue(DEFAULT_OUTPUT_DIRECTORY);
-    preferences.pythonOutputDirectory().defaultValue(DEFAULT_OUTPUT_DIRECTORY);
-    preferences.refreshResources().defaultValue(true);
-    preferences.refreshOutputDirectory().defaultValue(true);
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CompilerPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CompilerPreferences.java
deleted file mode 100644
index ed01b7a..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CompilerPreferences.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.compiler;
-
-import static com.google.eclipse.protobuf.ui.preferences.pages.compiler.PostCompilationRefreshTarget.*;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Compiler preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class CompilerPreferences {
-
-  private final boolean compileProtoFiles;
-  private final String protocPath;
-  private final String descriptorPath;
-  private final CodeGenerationSettings codeGenerationSettings;
-  private final boolean refreshResources;
-  private final PostCompilationRefreshTarget refreshTarget;
-
-  CompilerPreferences(RawPreferences preferences) {
-    compileProtoFiles = preferences.compileProtoFiles().value();
-    boolean useProtocInSystemPath = preferences.useProtocInSystemPath().value();
-    protocPath = (useProtocInSystemPath) ? "protoc" : preferences.protocPath().value();
-    descriptorPath = preferences.descriptorPath().value();
-    codeGenerationSettings = new CodeGenerationSettings();
-    codeGenerationSettings.java().enabled(preferences.javaCodeGenerationEnabled().value());
-    codeGenerationSettings.java().outputDirectory(preferences.javaOutputDirectory().value());
-    codeGenerationSettings.cpp().enabled(preferences.cppCodeGenerationEnabled().value());
-    codeGenerationSettings.cpp().outputDirectory(preferences.cppOutputDirectory().value());
-    codeGenerationSettings.python().enabled(preferences.pythonCodeGenerationEnabled().value());
-    codeGenerationSettings.python().outputDirectory(preferences.pythonOutputDirectory().value());
-    refreshResources = preferences.refreshResources().value();
-    boolean refreshProject = preferences.refreshProject().value();
-    refreshTarget = refreshProject ? PROJECT : OUTPUT_DIRECTORIES;
-  }
-
-  public boolean shouldCompileProtoFiles() {
-    return compileProtoFiles;
-  }
-
-  public String protocPath() {
-    return protocPath;
-  }
-
-  public String descriptorPath() {
-    return descriptorPath;
-  }
-
-  public CodeGenerationSettings codeGenerationSettings() {
-    return codeGenerationSettings;
-  }
-
-  public boolean shouldRefreshResources() {
-    return refreshResources;
-  }
-
-  public PostCompilationRefreshTarget refreshTarget() {
-    return refreshTarget;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CompilerPreferencesFactory.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CompilerPreferencesFactory.java
deleted file mode 100644
index dbb8d67..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/CompilerPreferencesFactory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.compiler;
-
-import static com.google.eclipse.protobuf.ui.preferences.pages.compiler.EnableProjectSettingsPreference.enableProjectSettings;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-
-import com.google.inject.Inject;
-
-/**
- * Factory of <code>{@link CompilerPreferences}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class CompilerPreferencesFactory {
-
-  @Inject private IPreferenceStoreAccess storeAccess;
-
-  public CompilerPreferences preferences(IProject project) {
-    IPreferenceStore store = storeAccess.getWritablePreferenceStore(project);
-    boolean useProjectPreferences = enableProjectSettings(store).value();
-    if (!useProjectPreferences) {
-      store = storeAccess.getWritablePreferenceStore();
-    }
-    return new CompilerPreferences(new RawPreferences(store));
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/EditCodeGenerationDialog.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/EditCodeGenerationDialog.java
deleted file mode 100644
index 4dee583..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/EditCodeGenerationDialog.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.compiler;
-
-import static com.google.eclipse.protobuf.ui.preferences.pages.compiler.Messages.*;
-import static com.google.eclipse.protobuf.ui.swt.Colors.widgetBackground;
-import static com.google.eclipse.protobuf.ui.util.Paths.segmentsOf;
-import static org.eclipse.core.resources.IResource.FOLDER;
-import static org.eclipse.jface.dialogs.IDialogConstants.OK_ID;
-import static org.eclipse.swt.layout.GridData.*;
-import static org.eclipse.xtext.util.Strings.isEmpty;
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.*;
-
-import com.google.eclipse.protobuf.ui.preferences.InputDialog;
-
-/**
- * Dialog where users can edit a single code generation option.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class EditCodeGenerationDialog extends InputDialog {
-
-  private final CodeGenerationSetting option;
-
-  private Text txtOutputDirectory;
-  private Button btnEnabled;
-  private Text txtError;
-
-  /**
-   * Creates a new </code>{@link EditCodeGenerationDialog}</code>.
-   * @param parent a shell which will be the parent of the new instance.
-   * @param option the code generation option to edit.
-   */
-  public EditCodeGenerationDialog(Shell parent, CodeGenerationSetting option) {
-    super(parent, editCodeGenerationOptionTitle + option.language().name());
-    this.option = option;
-  }
-
-  /** {@inheritDoc} */
-  @Override protected Control createDialogArea(Composite parent) {
-    Composite cmpDialogArea = (Composite) super.createDialogArea(parent);
-
-    btnEnabled = new Button(cmpDialogArea, SWT.CHECK);
-    btnEnabled.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
-    btnEnabled.setText(enabled);
-    btnEnabled.setSelection(option.isEnabled());
-
-    Label lblOutputDirectoryName = new Label(cmpDialogArea, SWT.NONE);
-    lblOutputDirectoryName.setText(outputDirectoryPrompt);
-
-    txtOutputDirectory = new Text(cmpDialogArea, SWT.BORDER);
-    txtOutputDirectory.setEnabled(option.isEnabled());
-
-    GridData gd_txtOutputDirectory = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1);
-    gd_txtOutputDirectory.widthHint = 200;
-    txtOutputDirectory.setLayoutData(gd_txtOutputDirectory);
-    txtOutputDirectory.setText(option.outputDirectory());
-
-    txtError = new Text(cmpDialogArea, SWT.READ_ONLY | SWT.WRAP);
-    GridData gridData = new GridData(GRAB_HORIZONTAL | HORIZONTAL_ALIGN_FILL);
-    gridData.horizontalSpan = 2;
-    txtError.setLayoutData(gridData);
-    txtError.setBackground(widgetBackground());
-
-    addEventListeners();
-
-    applyDialogFont(cmpDialogArea);
-    return cmpDialogArea;
-  }
-
-  private void addEventListeners() {
-    btnEnabled.addSelectionListener(new SelectionAdapter() {
-      @Override public void widgetSelected(SelectionEvent e) {
-        txtOutputDirectory.setEnabled(btnEnabled.getSelection());
-        checkState();
-      }
-    });
-    txtOutputDirectory.addModifyListener(new ModifyListener() {
-      @Override public void modifyText(ModifyEvent e) {
-        checkState();
-      }
-    });
-  }
-
-  private void checkState() {
-    if (btnEnabled.getSelection()) {
-      if (!outputDirectoryEntered()) {
-        pageIsNowInvalid(errorEnterDirectoryName);
-        return;
-      }
-      String errorMessage = validateDirectoryName(enteredOuptutDirectory());
-      if (errorMessage != null) {
-        pageIsNowInvalid(errorMessage);
-        return;
-      }
-    }
-    pageIsNowValid();
-  }
-
-  private String validateDirectoryName(String directoryName) {
-    IWorkspace workspace = ResourcesPlugin.getWorkspace();
-    for (String segment : segmentsOf(directoryName)) {
-      IStatus isValid = workspace.validateName(segment, FOLDER);
-      if (isValid.getCode() == OK) {
-        continue;
-      }
-      return isValid.getMessage();
-    }
-    return null;
-  }
-
-  private void pageIsNowInvalid(String errorMessage) {
-    txtError.setText(errorMessage);
-    getButton(OK_ID).setEnabled(false);
-  }
-
-  private void pageIsNowValid() {
-    txtError.setText("");
-    getButton(OK_ID).setEnabled(true);
-  }
-
-  /** {@inheritDoc} */
-  @Override protected void okPressed() {
-    option.enabled(btnEnabled.getSelection());
-    option.outputDirectory(enteredOuptutDirectory());
-    super.okPressed();
-  }
-
-  private boolean outputDirectoryEntered() {
-    return !isEmpty(enteredOuptutDirectory());
-  }
-
-  private String enteredOuptutDirectory() {
-    return txtOutputDirectory.getText().trim();
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/EnableProjectSettingsPreference.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/EnableProjectSettingsPreference.java
deleted file mode 100644
index a21d9a8..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/EnableProjectSettingsPreference.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.compiler;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import com.google.eclipse.protobuf.ui.preferences.BooleanPreference;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-class EnableProjectSettingsPreference {
-
-  static BooleanPreference enableProjectSettings(IPreferenceStore store) {
-    return new BooleanPreference("compiler.enableProjectSettings", store);
-  }
-
-  private EnableProjectSettingsPreference() {}
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/PostCompilationRefreshTarget.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/PostCompilationRefreshTarget.java
deleted file mode 100644
index 2fb2cbf..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/PostCompilationRefreshTarget.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.compiler;
-
-/**
- * The type of resource to refresh after calling protoc.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public enum PostCompilationRefreshTarget {
-
-  PROJECT, OUTPUT_DIRECTORIES;
-
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/RawPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/RawPreferences.java
deleted file mode 100644
index 81945d0..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/RawPreferences.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
- * License v1.0 which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package com.google.eclipse.protobuf.ui.preferences.pages.compiler;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import com.google.eclipse.protobuf.ui.preferences.*;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-class RawPreferences {
-
-  private final BooleanPreference compileProtoFiles;
-  private final BooleanPreference useProtocInSystemPath;
-  private final BooleanPreference useProtocInCustomPath;
-  private final StringPreference protocPath;
-  private final StringPreference descriptorPath;
-  private final BooleanPreference javaCodeGenerationEnabled;
-  private final BooleanPreference cppCodeGenerationEnabled;
-  private final BooleanPreference pythonCodeGenerationEnabled;
-  private final StringPreference javaOutputDirectory;
-  private final StringPreference cppOutputDirectory;
-  private final StringPreference pythonOutputDirectory;
-  private final BooleanPreference refreshResources;
-  private final BooleanPreference refreshProject;
-  private final BooleanPreference refreshOutputDirectory;
-
-  RawPreferences(IPreferenceStore store) {
-    compileProtoFiles = new BooleanPreference("compiler.compileProtoFiles", store);
-    useProtocInSystemPath = new BooleanPreference("compiler.useProtocInSystemPath", store);
-    useProtocInCustomPath = new BooleanPreference("compiler.useProtocInCustomPath", store);
-    protocPath = new StringPreference("compiler.protocFilePath", store);
-    descriptorPath = new StringPreference("compiler.descriptorFilePath", store);
-    javaCodeGenerationEnabled = new BooleanPreference("compiler.javaCodeGenerationEnabled", store);
-    cppCodeGenerationEnabled = new BooleanPreference("compiler.cppCodeGenerationEnabled", store);
-    pythonCodeGenerationEnabled = new BooleanPreference("compiler.pythonCodeGenerationEnabled", store);
-    javaOutputDirectory = new StringPreference("compiler.javaOutputDirectory", store);
-    cppOutputDirectory = new StringPreference("compiler.cppOutputDirectory", store);
-    pythonOutputDirectory = new StringPreference("compiler.pythonOutputDirectory", store);
-    refreshResources = new BooleanPreference("compiler.refreshResources", store);
-    refreshProject = new BooleanPreference("compiler.refreshProject", store);
-    refreshOutputDirectory = new BooleanPreference("compiler.refreshOutputDirectory", store);
-  }
-
-  BooleanPreference compileProtoFiles() {
-    return compileProtoFiles;
-  }
-
-  BooleanPreference useProtocInSystemPath() {
-    return useProtocInSystemPath;
-  }
-
-  BooleanPreference useProtocInCustomPath() {
-    return useProtocInCustomPath;
-  }
-
-  StringPreference protocPath() {
-    return protocPath;
-  }
-
-  StringPreference descriptorPath() {
-    return descriptorPath;
-  }
-
-  BooleanPreference javaCodeGenerationEnabled() {
-    return javaCodeGenerationEnabled;
-  }
-
-  BooleanPreference cppCodeGenerationEnabled() {
-    return cppCodeGenerationEnabled;
-  }
-
-  BooleanPreference pythonCodeGenerationEnabled() {
-    return pythonCodeGenerationEnabled;
-  }
-
-  StringPreference javaOutputDirectory() {
-    return javaOutputDirectory;
-  }
-
-  StringPreference cppOutputDirectory() {
-    return cppOutputDirectory;
-  }
-
-  StringPreference pythonOutputDirectory() {
-    return pythonOutputDirectory;
-  }
-
-  BooleanPreference refreshResources() {
-    return refreshResources;
-  }
-
-  BooleanPreference refreshProject() {
-    return refreshProject;
-  }
-
-  BooleanPreference refreshOutputDirectory() {
-    return refreshOutputDirectory;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/SupportedLanguage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/SupportedLanguage.java
deleted file mode 100644
index 365f94b..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/compiler/SupportedLanguage.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.compiler;
-
-
-/**
- * Languages supported by protoc.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class SupportedLanguage {
-
-  public static final SupportedLanguage JAVA = new SupportedLanguage("Java", "java");
-  public static final SupportedLanguage CPP = new SupportedLanguage("C++", "cpp");
-  public static final SupportedLanguage PYTHON = new SupportedLanguage("Python", "python");
-
-  private final String name;
-  private final String code;
-
-  private SupportedLanguage(String name, String code) {
-    this.name = name;
-    this.code = code;
-  }
-
-  /**
-   * Returns this language's name.
-   * @return this language's name.
-   */
-  public String name() {
-    return name;
-  }
-
-  /**
-   * Returns this language's code.
-   * @return this language's code.
-   */
-  public String code() {
-    return code;
-  }
-
-  /**
-   * Returns all the supported languages.
-   * @return all the supported languages.
-   */
-  public static SupportedLanguage[] values() {
-    return new SupportedLanguage[] { JAVA, CPP, PYTHON };
-  }
-}
\ No newline at end of file
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/NumericTagPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/NumericTagPreferenceStoreInitializer.java
deleted file mode 100644
index add22e0..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/NumericTagPreferenceStoreInitializer.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag;
-
-import static java.util.Collections.singletonList;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.xtext.ui.editor.preferences.*;
-
-/**
- * Initializes default values for the "Paths" preferences.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class NumericTagPreferenceStoreInitializer implements IPreferenceStoreInitializer {
-
-  /** {@inheritDoc} */
-  @Override public void initialize(IPreferenceStoreAccess access) {
-    IPreferenceStore store = access.getWritablePreferenceStore();
-    RawPreferences preferences = new RawPreferences(store);
-    preferences.patterns().defaultValue(singletonList("Next[\\s]+Id:[\\s]+[\\d]+"));
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/NumericTagPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/NumericTagPreferences.java
deleted file mode 100644
index 2113421..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/NumericTagPreferences.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag;
-
-import java.util.List;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * "Numeric tag" preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class NumericTagPreferences {
-
-  private final List<String> patterns;
-
-  NumericTagPreferences(RawPreferences preferences) {
-    patterns = preferences.patterns().value();
-  }
-
-  public List<String> patterns() {
-    return patterns;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/NumericTagPreferencesFactory.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/NumericTagPreferencesFactory.java
deleted file mode 100644
index f7163a9..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/NumericTagPreferencesFactory.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-
-import com.google.inject.Inject;
-
-/**
- * Factory of <code>{@link NumericTagPreferences}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class NumericTagPreferencesFactory {
-
-  @Inject private IPreferenceStoreAccess storeAccess;
-
-  public NumericTagPreferences preferences() {
-    IPreferenceStore store = storeAccess.getWritablePreferenceStore();
-    return new NumericTagPreferences(new RawPreferences(store));
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/RawPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/RawPreferences.java
deleted file mode 100644
index f414aab..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/numerictag/RawPreferences.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * All rights reserved. This program and the accompanying materials are made
- * available under the terms of the Eclipse License v1.0 which accompanies this
- * distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package com.google.eclipse.protobuf.ui.preferences.pages.editor.numerictag;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import com.google.eclipse.protobuf.ui.preferences.StringListPreference;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-class RawPreferences {
-
-  private final StringListPreference patterns;
-
-  RawPreferences(IPreferenceStore store) {
-    patterns = new StringListPreference("numericTag.patterns", "\\t", store);
-  }
-
-  StringListPreference patterns() {
-    return patterns;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/RawPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/RawPreferences.java
deleted file mode 100644
index ad731dc..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/RawPreferences.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * All rights reserved. This program and the accompanying materials are made
- * available under the terms of the Eclipse License v1.0 which accompanies this
- * distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package com.google.eclipse.protobuf.ui.preferences.pages.editor.save;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import com.google.eclipse.protobuf.ui.preferences.BooleanPreference;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-class RawPreferences {
-
-  private final BooleanPreference removeTrailingWhitespace;
-  private final BooleanPreference inAllLines;
-  private final BooleanPreference inEditedLines;
-
-  RawPreferences(IPreferenceStore store) {
-    removeTrailingWhitespace = new BooleanPreference("saveActions.removeTrailingWhitespace", store);
-    inAllLines = new BooleanPreference("saveActions.inAllLines", store);
-    inEditedLines = new BooleanPreference("saveActions.inEditedLines", store);
-  }
-
-  BooleanPreference removeTrailingWhitespace() {
-    return removeTrailingWhitespace;
-  }
-
-  BooleanPreference inAllLines() {
-    return inAllLines;
-  }
-
-  BooleanPreference inEditedLines() {
-    return inEditedLines;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferenceStoreInitializer.java
deleted file mode 100644
index 62f71c3..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferenceStoreInitializer.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.editor.save;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.xtext.ui.editor.preferences.*;
-
-/**
- * Initializes default values for the "Paths" preferences.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class SaveActionsPreferenceStoreInitializer implements IPreferenceStoreInitializer {
-
-  /** {@inheritDoc} */
-  @Override public void initialize(IPreferenceStoreAccess access) {
-    IPreferenceStore store = access.getWritablePreferenceStore();
-    RawPreferences preferences = new RawPreferences(store);
-    preferences.removeTrailingWhitespace().defaultValue(true);
-    preferences.inAllLines().defaultValue(false);
-    preferences.inEditedLines().defaultValue(true);
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferences.java
deleted file mode 100644
index e82434b..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferences.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.editor.save;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * "Save actions" preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class SaveActionsPreferences {
-
-  private final RemoveTrailingSpace removeTrailingSpace;
-
-  SaveActionsPreferences(RawPreferences preferences) {
-    removeTrailingSpace = RemoveTrailingSpace.valueFrom(preferences);
-  }
-
-  public RemoveTrailingSpace removeTrailingSpace() {
-    return removeTrailingSpace;
-  }
-
-  public static enum RemoveTrailingSpace {
-    NONE, IN_EDITED_LINES, IN_ALL_LINES;
-
-    static RemoveTrailingSpace valueFrom(RawPreferences preferences) {
-      if (!preferences.removeTrailingWhitespace().value()) {
-        return NONE;
-      }
-      return preferences.inEditedLines().value() ? IN_EDITED_LINES : IN_ALL_LINES;
-    }
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferencesFactory.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferencesFactory.java
deleted file mode 100644
index 768c7c9..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferencesFactory.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.editor.save;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-
-import com.google.inject.Inject;
-
-/**
- * Factory of <code>{@link SaveActionsPreferences}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class SaveActionsPreferencesFactory {
-
-  @Inject private IPreferenceStoreAccess storeAccess;
-
-  public SaveActionsPreferences preferences() {
-    IPreferenceStore store = storeAccess.getWritablePreferenceStore();
-    return new SaveActionsPreferences(new RawPreferences(store));
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/EnableProjectSettingsPreference.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/EnableProjectSettingsPreference.java
deleted file mode 100644
index 729f3b4..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/EnableProjectSettingsPreference.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.general;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import com.google.eclipse.protobuf.ui.preferences.BooleanPreference;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-class EnableProjectSettingsPreference {
-
-  static BooleanPreference enableProjectSettings(IPreferenceStore store) {
-    return new BooleanPreference("general.enableProjectSettings", store);
-  }
-
-  private EnableProjectSettingsPreference() {}
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferenceStoreInitializer.java
deleted file mode 100644
index 887192e..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferenceStoreInitializer.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.general;
-
-import static com.google.eclipse.protobuf.ui.preferences.pages.general.EnableProjectSettingsPreference.enableProjectSettings;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.xtext.ui.editor.preferences.*;
-
-/**
- * Initializes default values for the "Paths" preferences.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class GeneralPreferenceStoreInitializer implements IPreferenceStoreInitializer {
-
-  /** {@inheritDoc} */
-  @Override public void initialize(IPreferenceStoreAccess access) {
-    IPreferenceStore store = access.getWritablePreferenceStore();
-    enableProjectSettings(store).defaultValue(false);
-    RawPreferences preferences = new RawPreferences(store);
-    preferences.validateFilesOnActivation().defaultValue(true);
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferences.java
deleted file mode 100644
index fa96a0c..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferences.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.general;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * General preferences, retrieved from an <code>{@link IPreferenceStore}</code>. To create a new instance invoke
- * <code>{@link GeneralPreferencesFactory#preferences(IProject)}</code>
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class GeneralPreferences {
-
-  private final boolean validateFilesOnActivation;
-
-  GeneralPreferences(RawPreferences preferences) {
-    validateFilesOnActivation = preferences.validateFilesOnActivation().value();
-  }
-
-  public boolean validateFilesOnActivation() {
-    return validateFilesOnActivation;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferencesFactory.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferencesFactory.java
deleted file mode 100644
index 51a1f73..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferencesFactory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.general;
-
-import static com.google.eclipse.protobuf.ui.preferences.pages.general.EnableProjectSettingsPreference.enableProjectSettings;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-
-import com.google.inject.Inject;
-
-/**
- * Factory of <code>{@link GeneralPreferences}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class GeneralPreferencesFactory {
-
-  @Inject private IPreferenceStoreAccess storeAccess;
-
-  public GeneralPreferences preferences(IProject project) {
-    IPreferenceStore store = storeAccess.getWritablePreferenceStore(project);
-    boolean useProjectPreferences = enableProjectSettings(store).value();
-    if (!useProjectPreferences) {
-      store = storeAccess.getWritablePreferenceStore();
-    }
-    return new GeneralPreferences(new RawPreferences(store));
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/RawPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/RawPreferences.java
deleted file mode 100644
index 1297dfc..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/RawPreferences.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.preferences.pages.general;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import com.google.eclipse.protobuf.ui.preferences.BooleanPreference;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-class RawPreferences {
-
-  private final BooleanPreference validateFilesOnActivation;
-
-  RawPreferences(IPreferenceStore store) {
-    validateFilesOnActivation = new BooleanPreference("validation.validateFilesOnActivation", store);
-  }
-
-  BooleanPreference validateFilesOnActivation() {
-    return validateFilesOnActivation;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/AddDirectoryDialog.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/AddDirectoryDialog.java
index 1749c5c..b60de32 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/AddDirectoryDialog.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/AddDirectoryDialog.java
@@ -8,10 +8,10 @@
  */
 package com.google.eclipse.protobuf.ui.preferences.pages.paths;
 
+import static com.google.eclipse.protobuf.ui.preferences.pages.TextWidgets.setEditable;
 import static com.google.eclipse.protobuf.ui.preferences.pages.paths.DirectorySelectionDialogs.*;
 import static com.google.eclipse.protobuf.ui.preferences.pages.paths.Messages.*;
 import static com.google.eclipse.protobuf.ui.preferences.pages.paths.ProjectVariable.useProjectVariable;
-import static com.google.eclipse.protobuf.ui.swt.Colors.widgetBackground;
 import static org.eclipse.jface.dialogs.IDialogConstants.OK_ID;
 import static org.eclipse.xtext.util.Strings.isEmpty;
 
@@ -22,7 +22,7 @@
 import org.eclipse.swt.layout.*;
 import org.eclipse.swt.widgets.*;
 
-import com.google.eclipse.protobuf.ui.preferences.InputDialog;
+import com.google.eclipse.protobuf.ui.preferences.pages.InputDialog;
 
 /**
  * Dialog where users can select a path (in the workspace or file system) to be included in resolution of imports.
@@ -62,9 +62,8 @@
     label.setText(directory);
 
     txtPath = new Text(cmpDialogArea, SWT.BORDER);
-    txtPath.setBackground(widgetBackground());
     txtPath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-    txtPath.setEditable(false);
+    setEditable(txtPath, false);
 
     Composite cmpCheckBox = new Composite(cmpDialogArea, SWT.NONE);
     cmpCheckBox.setEnabled(false);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPathsEditor.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPathsEditor.java
index 46c8c94..f263259 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPathsEditor.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPathsEditor.java
@@ -24,7 +24,7 @@
 import org.eclipse.swt.widgets.*;
 import org.eclipse.xtext.ui.PluginImageHelper;
 
-import com.google.eclipse.protobuf.ui.preferences.DataChangedListener;
+import com.google.eclipse.protobuf.ui.preferences.pages.DataChangedListener;
 
 /**
  * Editor where users can add/remove the directories to be used for URI resolution.
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferencePage.java
index 4d95894..37d9954 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferencePage.java
@@ -9,8 +9,8 @@
 package com.google.eclipse.protobuf.ui.preferences.pages.paths;
 
 import static com.google.eclipse.protobuf.ui.ProtobufUiModule.PLUGIN_ID;
-import static com.google.eclipse.protobuf.ui.preferences.Buttons.with;
-import static com.google.eclipse.protobuf.ui.preferences.binding.BindingToButtonSelection.bindSelectionOf;
+import static com.google.eclipse.protobuf.ui.preferences.pages.ButtonGroup.with;
+import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToButtonSelection.bindSelectionOf;
 import static com.google.eclipse.protobuf.ui.preferences.pages.paths.Messages.*;
 import static java.util.Collections.unmodifiableList;
 import static org.eclipse.core.resources.IncrementalProjectBuilder.FULL_BUILD;
@@ -24,7 +24,6 @@
 import org.apache.log4j.Logger;
 import org.eclipse.core.runtime.*;
 import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.*;
 import org.eclipse.swt.layout.*;
@@ -32,8 +31,8 @@
 import org.eclipse.xtext.ui.PluginImageHelper;
 
 import com.google.eclipse.protobuf.ui.preferences.*;
-import com.google.eclipse.protobuf.ui.preferences.binding.*;
-import com.google.eclipse.protobuf.ui.preferences.pages.PreferenceAndPropertyPage;
+import com.google.eclipse.protobuf.ui.preferences.pages.*;
+import com.google.eclipse.protobuf.ui.preferences.pages.binding.*;
 import com.google.eclipse.protobuf.ui.validation.ValidationTrigger;
 import com.google.inject.Inject;
 
@@ -110,7 +109,9 @@
     pageIsNowValid();
   }
 
-  @Override protected BooleanPreference enableProjectSettingsPreference(IPreferenceStore store) {
+
+
+  @Override protected String enableProjectSettingsPreferenceName() {
     return null; // this page is always a "Project Properties" page
   }
 
@@ -121,15 +122,15 @@
     final StringPreference directoryPaths = preferences.directoryPaths();
     preferenceBinder.add(new Binding() {
       @Override public void applyPreferenceValueToTarget() {
-        setDirectoryPaths(directoryPaths.value());
+        setDirectoryPaths(directoryPaths.getValue());
       }
 
       @Override public void applyDefaultPreferenceValueToTarget() {
-        setDirectoryPaths(directoryPaths.defaultValue());
+        setDirectoryPaths(directoryPaths.getDefaultValue());
       }
 
       @Override public void savePreferenceValue() {
-        directoryPaths.value(directoryNames());
+        directoryPaths.setValue(directoryNames());
       }
     });
   }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferenceStoreInitializer.java
index 5957532..3ffa066 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferenceStoreInitializer.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferenceStoreInitializer.java
@@ -22,8 +22,8 @@
   @Override public void initialize(IPreferenceStoreAccess access) {
     IPreferenceStore store = access.getWritablePreferenceStore();
     RawPreferences preferences = new RawPreferences(store);
-    preferences.filesInOneDirectoryOnly().defaultValue(true);
-    preferences.filesInMultipleDirectories().defaultValue(false);
-    preferences.directoryPaths().defaultValue("");
+    preferences.filesInOneDirectoryOnly().setDefaultValue(true);
+    preferences.filesInMultipleDirectories().setDefaultValue(false);
+    preferences.directoryPaths().setDefaultValue("");
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferences.java
index f50530b..bb2b556 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferences.java
@@ -29,7 +29,7 @@
   private static final String CSV_PATTERN = "[\\s]*,[\\s]*";
 
   PathsPreferences(RawPreferences preferences, IProject project) {
-    boolean filesInOneDirectoryOnly = preferences.filesInOneDirectoryOnly().value();
+    boolean filesInOneDirectoryOnly = preferences.filesInOneDirectoryOnly().getValue();
     pathResolutionType = filesInOneDirectoryOnly ? SINGLE_DIRECTORY : MULTIPLE_DIRECTORIES;
     importRoots = importRoots(preferences, project);
   }
@@ -39,7 +39,7 @@
       return emptyList();
     }
     List<DirectoryPath> roots = new ArrayList<DirectoryPath>();
-    for (String root : preferences.directoryPaths().value().split(CSV_PATTERN)) {
+    for (String root : preferences.directoryPaths().getValue().split(CSV_PATTERN)) {
       roots.add(DirectoryPath.parse(root, project));
     }
     return unmodifiableList(roots);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/parser/Proto2OnlyCheckPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/parser/Proto2OnlyCheckPreferenceStoreInitializer.java
index 2ba96d3..d0ba538 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/parser/Proto2OnlyCheckPreferenceStoreInitializer.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/parser/Proto2OnlyCheckPreferenceStoreInitializer.java
@@ -22,6 +22,6 @@
   @Override public void initialize(IPreferenceStoreAccess access) {
     IPreferenceStore store = access.getWritablePreferenceStore();
     RawPreferences preferences = new RawPreferences(store);
-    preferences.enableProto2OnlyChecks().defaultValue(false);
+    preferences.enableProto2OnlyChecks().setDefaultValue(false);
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/PathsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/PathsPreferences.java
new file mode 100644
index 0000000..1e4fa56
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/PathsPreferences.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * 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 com.google.eclipse.protobuf.ui.preferences.paths.core;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+
+import com.google.eclipse.protobuf.ui.preferences.*;
+import com.google.eclipse.protobuf.ui.preferences.editor.save.core.SaveActionsPreferences;
+
+/**
+ * "Paths" preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class PathsPreferences {
+
+  private final BooleanPreference filesInOneDirectoryOnly;
+  private final BooleanPreference filesInMultipleDirectories;
+  private final StringPreference directoryPaths;
+
+  /**
+   * Creates a new <code>{@link SaveActionsPreferences}</code>.
+   * @param store a table mapping named preferences to values.
+   */
+  public PathsPreferences(IPreferenceStore store) {
+    filesInOneDirectoryOnly = new BooleanPreference("paths.filesInOneDirectoryOnly", store);
+    filesInMultipleDirectories = new BooleanPreference("paths.filesInMultipleDirectories", store);
+    directoryPaths = new StringPreference("paths.directoryPaths", store);
+  }
+
+  /**
+   * Returns the setting that specifies whether all the .proto files are stored in one directory.
+   * @return the setting that specifies whether all the .proto files are stored in one directory.
+   */
+  public BooleanPreference filesInOneDirectoryOnly() {
+    return filesInOneDirectoryOnly;
+  }
+
+  /**
+   * Returns the setting that specifies whether all the .proto files are stored in multiple directories.
+   * @return the setting that specifies whether all the .proto files are stored in multiple directories.
+   */
+  public BooleanPreference filesInMultipleDirectories() {
+    return filesInMultipleDirectories;
+  }
+
+  /**
+   * Returns the setting that specifies a CSV {@code String} containing the paths of the directories that store .proto
+   * files.
+   * @return the setting that specifies a CSV {@code String} containing the paths of the directories that store .proto
+   * files.
+   */
+  public StringPreference directoryPaths() {
+    return directoryPaths;
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/swt/Colors.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/swt/Colors.java
deleted file mode 100644
index 48caa23..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/swt/Colors.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * 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 com.google.eclipse.protobuf.ui.swt;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Utility methods related to colors.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public final class Colors {
-
-  public static Color widgetBackground() {
-    return getColor(SWT.COLOR_WIDGET_BACKGROUND);
-  }
-
-  public static Color getColor(int systemColorID) {
-    return Display.getCurrent().getSystemColor(systemColorID);
-  }
-
-  private Colors() {}
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateOnActivation.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateOnActivation.java
index 6b5a4b8..1acbff0 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateOnActivation.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateOnActivation.java
@@ -10,12 +10,14 @@
 package com.google.eclipse.protobuf.ui.validation;
 
 import static com.google.eclipse.protobuf.ui.Internals.injector;
+import static com.google.eclipse.protobuf.ui.preferences.general.core.GeneralPreferences.generalPreferences;
 import static com.google.eclipse.protobuf.ui.validation.Validation.validate;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.ui.*;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
-import com.google.eclipse.protobuf.ui.preferences.pages.general.*;
+import com.google.eclipse.protobuf.ui.preferences.general.core.GeneralPreferences;
 import com.google.eclipse.protobuf.ui.util.Resources;
 
 /**
@@ -49,12 +51,9 @@
   }
 
   private boolean shouldValidateEditor(IProject project) {
-    GeneralPreferencesFactory factory = injector().getInstance(GeneralPreferencesFactory.class);
-    if (factory == null) {
-      return false;
-    }
-    GeneralPreferences preferences = factory.preferences(project);
-    return preferences.validateFilesOnActivation();
+    IPreferenceStoreAccess storeAccess = injector().getInstance(IPreferenceStoreAccess.class);
+    GeneralPreferences preferences = generalPreferences(storeAccess, project);
+    return preferences.validateFilesOnActivation().getValue();
   }
 
   /**
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Options.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Options.java
index 407970c..e167625 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Options.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Options.java
@@ -19,8 +19,9 @@
 import com.google.inject.*;
 
 /**
- * @author alruiz@google.com (Alex Ruiz)
+ * Utility methods related to <code>{@link Option}</code>s.
  *
+ * @author alruiz@google.com (Alex Ruiz)
  */
 @Singleton public class Options {
 
