In progress: [ Issue 40 ] Add support for import resolution across multiple folders
https://code.google.com/p/protobuf-dt/issues/detail?id=40

Adding support for using both workspace and file system paths for resolution of imports.
diff --git a/com.google.eclipse.protobuf.ui/plugin.xml b/com.google.eclipse.protobuf.ui/plugin.xml
index dd25975..da63f1b 100644
--- a/com.google.eclipse.protobuf.ui/plugin.xml
+++ b/com.google.eclipse.protobuf.ui/plugin.xml
@@ -67,11 +67,6 @@
       id="com.google.eclipse.protobuf.ui.preferences.compiler.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.paths.PathsPreferencePage"
-      id="com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferencePage" name="%page.name.3">
-      <keywordReference id="com.google.eclipse.protobuf.ui.keyword_Protobuf" />
-    </page>
   </extension>
   <extension point="org.eclipse.ui.keywords">
     <keyword id="com.google.eclipse.protobuf.ui.keyword_Protobuf" label="%keyword.label" />
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceNames.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceNames.java
index 52208d1..89b6b9a 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceNames.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceNames.java
@@ -13,7 +13,6 @@
  */
 final class PathsPreferenceNames {
 
-  static final String ENABLE_PROJECT_SETTINGS = "paths.enableProjectSettings";
   static final String FILES_IN_ONE_DIRECTORY_ONLY = "paths.filesInOneDirectoryOnly";
   static final String FILES_IN_MULTIPLE_DIRECTORIES = "paths.filesInMultipleDirectories";
   static final String DIRECTORY_PATHS = "paths.directoryPaths";
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
index f0f19cb..8e46543 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
@@ -52,7 +52,8 @@
   /** {@inheritDoc} */
   @Override protected Control createContents(Composite parent) {
     // generated by WindowBuilder
-    Composite contents = contentsComposite(parent);
+    Composite contents = new Composite(parent, NONE);
+    contents.setLayout(new GridLayout(3, false));
 
     grpResolutionOfImported = new Group(contents, SWT.NONE);
     grpResolutionOfImported.setLayout(new GridLayout(1, false));
@@ -82,13 +83,7 @@
     btnOneFolderOnly.setSelection(store.getBoolean(FILES_IN_ONE_DIRECTORY_ONLY));
     btnMultipleFolders.setSelection(store.getBoolean(FILES_IN_MULTIPLE_DIRECTORIES));
     setDirectoryNames(store.getString(DIRECTORY_PATHS));
-    boolean shouldEnablePathsOptions = true;
-    if (isPropertyPage()) {
-      boolean useProjectSettings = store.getBoolean(ENABLE_PROJECT_SETTINGS);
-      activateProjectSettings(useProjectSettings);
-      shouldEnablePathsOptions = shouldEnablePathsOptions & useProjectSettings;
-    }
-    enableProjectOptions(shouldEnablePathsOptions);
+    enableProjectOptions(true);
   }
 
   private void addEventListeners() {
@@ -124,13 +119,7 @@
     btnOneFolderOnly.setSelection(store.getDefaultBoolean(FILES_IN_ONE_DIRECTORY_ONLY));
     btnMultipleFolders.setSelection(store.getDefaultBoolean(FILES_IN_MULTIPLE_DIRECTORIES));
     setDirectoryNames(store.getDefaultString(DIRECTORY_PATHS));
-    boolean shouldEnablePathsOptions = true;
-    if (isPropertyPage()) {
-      boolean useProjectSettings = store.getDefaultBoolean(ENABLE_PROJECT_SETTINGS);
-      activateProjectSettings(useProjectSettings);
-      shouldEnablePathsOptions = shouldEnablePathsOptions & useProjectSettings;
-    }
-    enableProjectOptions(shouldEnablePathsOptions);
+    enableProjectOptions(true);
     super.performDefaults();
   }
 
@@ -148,7 +137,6 @@
   /** {@inheritDoc} */
   @Override protected void savePreferences() {
     IPreferenceStore store = getPreferenceStore();
-    if (isPropertyPage()) store.setValue(ENABLE_PROJECT_SETTINGS, areProjectSettingsActive());
     store.setValue(FILES_IN_ONE_DIRECTORY_ONLY, btnOneFolderOnly.getSelection());
     store.setValue(FILES_IN_MULTIPLE_DIRECTORIES, btnMultipleFolders.getSelection());
     store.setValue(DIRECTORY_PATHS, directoryNames());
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceReader.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceReader.java
index d55c8df..dc49133 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceReader.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceReader.java
@@ -8,8 +8,6 @@
  */
 package com.google.eclipse.protobuf.ui.preferences.paths;
 
-import static com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferenceNames.ENABLE_PROJECT_SETTINGS;
-
 import org.eclipse.core.resources.IProject;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
@@ -27,8 +25,6 @@
   
   public PathsPreferences readFromPrefereceStore(IProject project) {
     IPreferenceStore store = storeAccess.getWritablePreferenceStore(project);
-    boolean useProject = store.getBoolean(ENABLE_PROJECT_SETTINGS);
-    if (!useProject) store = storeAccess.getWritablePreferenceStore();
     return new PathsPreferences(store);
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java
index ee257a2..831688c 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java
@@ -14,7 +14,8 @@
 import java.util.Map;
 
 import com.google.eclipse.protobuf.ui.preferences.paths.PathResolutionType;
-import com.google.inject.*;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -26,7 +27,7 @@
 
   @Inject FileResolverStrategies(Resources resources) {
     strategies.put(SINGLE_DIRECTORY, new SingleDirectoryFileResolver(resources));
-    strategies.put(MULTIPLE_DIRECTORIES, new MultipleDirectoriesFileResolver());
+    strategies.put(MULTIPLE_DIRECTORIES, new MultipleDirectoriesFileResolver(resources));
   }
 
   FileResolverStrategy strategyFor(PathResolutionType type) {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java
index 328fadb..15c6e5d 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java
@@ -8,7 +8,6 @@
  */
 package com.google.eclipse.protobuf.ui.scoping;
 
-import org.eclipse.core.resources.IProject;
 import org.eclipse.emf.common.util.URI;
 
 import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
@@ -21,5 +20,5 @@
   String PREFIX = "platform:/resource";
   String SEPARATOR = "/";
 
-  String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences, IProject project);
+  String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences);
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java
index 913e46f..403bab5 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java
@@ -55,7 +55,7 @@
   private String resolveUri(String importUri, URI resourceUri) {
     IProject project = resources.project(resourceUri);
     PathsPreferences preferences = preferenceReader.readFromPrefereceStore(project);
-    return resolver(preferences).resolveUri(importUri, resourceUri, preferences, project);
+    return resolver(preferences).resolveUri(importUri, resourceUri, preferences);
   }
 
   private FileResolverStrategy resolver(PathsPreferences preferences) {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
index 2a39595..abb6877 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
@@ -8,8 +8,6 @@
  */
 package com.google.eclipse.protobuf.ui.scoping;
 
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
 import org.eclipse.emf.common.util.URI;
 
 import com.google.eclipse.protobuf.ui.preferences.paths.DirectoryPath;
@@ -20,19 +18,25 @@
  */
 class MultipleDirectoriesFileResolver implements FileResolverStrategy {
 
+  private final Resources resources;
+
+  MultipleDirectoriesFileResolver(Resources resources) {
+    this.resources = resources;
+  }
+
   /** {@inheritDoc} */
-  public String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences, IProject project) {
+  public String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences) {
     for (DirectoryPath directoryPath : preferences.directoryPaths()) {
-      String resolved = resolveUri(importUri, directoryPath.value(), project);
+      if (!directoryPath.isWorkspacePath()) continue; // TODO file system is not supported yet.
+      String resolved = resolveUriInWorkspace(importUri, directoryPath.value());
       if (resolved != null) return resolved;
     }
     return null;
   }
 
-  private String resolveUri(String importUri, String directoryName, IProject project) {
-    String path = directoryName + SEPARATOR + importUri;
-    IResource findMember = project.findMember(path);
-    boolean exists = (findMember != null) ? findMember.exists() : false;
-    return (exists) ? PREFIX +  project.getFullPath() + SEPARATOR + path : null;
+  private String resolveUriInWorkspace(String importUri, String directoryName) {
+    String path = PREFIX + directoryName + SEPARATOR + importUri;
+    boolean exists = resources.fileExists(URI.createURI(path));
+    return (exists) ? path : null;
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java
index bcee62c..b220689 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java
@@ -13,7 +13,6 @@
 
 import java.util.*;
 
-import org.eclipse.core.resources.IProject;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.xtext.util.Pair;
 
@@ -30,7 +29,7 @@
     this.resources = resources;
   }
 
-  public String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences, IProject project) {
+  public String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences) {
     List<String> resourceUriSegments = removeFirstAndLast(declaringResourceUri.segmentsList());
     Pair<String, List<String>> importUriPair = pair(importUri, createURI(importUri).segmentsList());
     return resolveUri(importUriPair, resourceUriSegments);