Code cleanup.
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/FileOpener.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/FileOpener.java
new file mode 100644
index 0000000..c2653de
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/FileOpener.java
@@ -0,0 +1,56 @@
+/*
+ * 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.editor;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.ui.*;
+import org.eclipse.ui.ide.FileStoreEditorInput;
+import org.eclipse.ui.part.FileEditorInput;
+
+import com.google.eclipse.protobuf.ui.util.Resources;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+/**
+ * Utility methods related to open file from different type of locations.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@Singleton
+public class FileOpener {
+
+  @Inject private Resources resources;
+
+  public IEditorPart openProtoFileInWorkspace(URI uri) throws PartInitException {
+    IFile file = resources.file(uri);
+    IEditorInput editorInput = new FileEditorInput(file);
+    return openFile(editorInput);
+  }
+
+  public IEditorPart openProtoFileInFileSystem(URI uri) throws PartInitException {
+    IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(uri.toFileString()));
+    IEditorInput editorInput = new FileStoreEditorInput(fileStore);
+    return openFile(editorInput/*"org.eclipse.ui.DefaultTextEditor"*/);
+  }
+
+  public IEditorPart openProtoFileInPlugin(URI uri) throws PartInitException {
+    IEditorInput editorInput = new UriEditorInput(uri);
+    return openFile(editorInput);
+  }
+
+  private IEditorPart openFile(IEditorInput editorInput) throws PartInitException {
+    IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+    return page.openEditor(editorInput, "com.google.eclipse.protobuf.Protobuf");
+  }
+
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/ProtobufUriEditorOpener.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/ProtobufUriEditorOpener.java
index acdcd3a..c529cc8 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/ProtobufUriEditorOpener.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/ProtobufUriEditorOpener.java
@@ -17,7 +17,6 @@
 import org.eclipse.ui.PartInitException;
 import org.eclipse.xtext.ui.editor.LanguageSpecificURIEditorOpener;
 
-import com.google.eclipse.protobuf.ui.util.Resources;
 import com.google.inject.Inject;
 
 /**
@@ -27,12 +26,12 @@
 
   private static Logger logger = Logger.getLogger(ProtobufUriEditorOpener.class);
 
-  @Inject private Resources resources;
+  @Inject private FileOpener fileOpener;
 
   /** {@inheritDoc} */
   @Override public IEditorPart open(URI uri, EReference crossReference, int indexInList, boolean select) {
     try {
-      IEditorPart editor = editorFor(uri);
+      IEditorPart editor = editorFor(uri.trimFragment());
       if (editor != null) {
         selectAndReveal(editor, uri, crossReference, indexInList, select);
         return getXtextEditor(editor);
@@ -45,9 +44,9 @@
 
   private IEditorPart editorFor(URI uri) throws PartInitException {
     if (uri.isFile())
-      return resources.openProtoFileInFileSystem(uri.trimFragment());
+      return fileOpener.openProtoFileInFileSystem(uri);
     if (uri.isPlatformPlugin())
-      return resources.openProtoFileInPlugin(uri);
+      return fileOpener.openProtoFileInPlugin(uri);
     return null;
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ImportHyperlink.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ImportHyperlink.java
index 9aef26d..89459ad 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ImportHyperlink.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ImportHyperlink.java
@@ -14,7 +14,7 @@
 import org.eclipse.jface.text.hyperlink.IHyperlink;
 import org.eclipse.ui.PartInitException;
 
-import com.google.eclipse.protobuf.ui.util.Resources;
+import com.google.eclipse.protobuf.ui.editor.FileOpener;
 
 /**
  * A hyperlink for imported .proto files.
@@ -27,25 +27,25 @@
 
   private final URI importUri;
   private final IRegion region;
-  private final Resources resources;
+  private final FileOpener fileOpener;
 
-  ImportHyperlink(URI importUri, IRegion region, Resources resources) {
+  ImportHyperlink(URI importUri, IRegion region, FileOpener fileOpener) {
     this.importUri = importUri;
     this.region = region;
-    this.resources = resources;
+    this.fileOpener = fileOpener;
   }
 
   public void open() {
     try {
       if (importUri.isPlatformResource()) {
-        resources.openProtoFileInWorkspace(importUri);
+        fileOpener.openProtoFileInWorkspace(importUri);
         return;
       }
       if (importUri.isPlatformPlugin()) {
-        resources.openProtoFileInPlugin(importUri);
+        fileOpener.openProtoFileInPlugin(importUri);
         return;
       }
-      if (importUri.isFile()) resources.openProtoFileInFileSystem(importUri);
+      if (importUri.isFile()) fileOpener.openProtoFileInFileSystem(importUri);
     } catch (PartInitException e) {
       logger.error("Unable to open " + importUri.toString(), e);
     }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ProtobufHyperlinkDetector.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ProtobufHyperlinkDetector.java
index 8cfd4e1..aa7f948 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ProtobufHyperlinkDetector.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ProtobufHyperlinkDetector.java
@@ -22,7 +22,7 @@
 import org.eclipse.xtext.util.concurrent.IUnitOfWork;
 
 import com.google.eclipse.protobuf.protobuf.Import;
-import com.google.eclipse.protobuf.ui.util.Resources;
+import com.google.eclipse.protobuf.ui.editor.FileOpener;
 import com.google.inject.Inject;
 
 /**
@@ -38,7 +38,7 @@
   private static final char QUOTE = '\"';
 
   @Inject private EObjectAtOffsetHelper eObjectAtOffsetHelper;
-  @Inject private Resources resources;
+  @Inject private FileOpener fileOpener;
 
   @Override public IHyperlink[] detectHyperlinks(ITextViewer textViewer, final IRegion region,
       final boolean canShowMultipleHyperlinks) {
@@ -65,7 +65,7 @@
           return NO_HYPERLINKS;
         }
         String importUri = anImport.getImportURI();
-        IHyperlink hyperlink = new ImportHyperlink(createURI(importUri), importUriRegion, resources);
+        IHyperlink hyperlink = new ImportHyperlink(createURI(importUri), importUriRegion, fileOpener);
         return new IHyperlink[] { hyperlink };
       }
     });
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Resources.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Resources.java
index 966017a..c350afb 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Resources.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Resources.java
@@ -8,19 +8,14 @@
  */
 package com.google.eclipse.protobuf.ui.util;
 
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.ui.*;
-import org.eclipse.ui.ide.FileStoreEditorInput;
-import org.eclipse.ui.part.FileEditorInput;
 import org.eclipse.ui.views.navigator.ResourceNavigator;
 
-import com.google.eclipse.protobuf.ui.editor.UriEditorInput;
 import com.google.inject.Singleton;
 
 /**
@@ -68,41 +63,6 @@
   }
 
   /**
-   * Opens the .proto file identified by the given URI that exists in the workspace.
-   * @param uri the URI of the file to open.
-   * @return an open and active editor, or {@code null} if an external editor was opened.
-   * @throws PartInitException if the editor cannot be opened or initialized.
-   */
-  public IEditorPart openProtoFileInWorkspace(URI uri) throws PartInitException {
-    IFile file = file(uri);
-    IEditorInput editorInput = new FileEditorInput(file);
-    return openFile(editorInput);
-  }
-
-  /**
-   * Opens the .proto file identified by the given URI that does not exist in the workspace, therefore is
-   * opened from the file system.
-   * @param uri the URI of the file to open.
-   * @return an open and active editor, or {@code null} if an external editor was opened.
-   * @throws PartInitException if the editor cannot be created or initialized.
-   */
-  public IEditorPart openProtoFileInFileSystem(URI uri) throws PartInitException {
-    IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(uri.toFileString()));
-    IEditorInput editorInput = new FileStoreEditorInput(fileStore);
-    return openFile(editorInput/*"org.eclipse.ui.DefaultTextEditor"*/);
-  }
-
-  public IEditorPart openProtoFileInPlugin(URI uri) throws PartInitException {
-    IEditorInput editorInput = new UriEditorInput(uri);
-    return openFile(editorInput);
-  }
-
-  private IEditorPart openFile(IEditorInput editorInput) throws PartInitException {
-    IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-    return page.openEditor(editorInput, "com.google.eclipse.protobuf.Protobuf");
-  }
-
-  /**
    * Returns a handle to a workspace file identified by the given URI.
    * @param uri the given URI.
    * @return a handle to a workspace file identified by the given URI or {@code null} if the URI does not belong to a