RESOLVED - bug 378533: Support opening of files in archives view 
https://bugs.eclipse.org/bugs/show_bug.cgi?id=378533
diff --git a/org.eclipse.virgo.ide.runtime.core/src/org/eclipse/virgo/ide/runtime/internal/ui/projects/ProjectFileReference.java b/org.eclipse.virgo.ide.runtime.core/src/org/eclipse/virgo/ide/runtime/internal/ui/projects/ProjectFileReference.java
index 702f640..b539c31 100644
--- a/org.eclipse.virgo.ide.runtime.core/src/org/eclipse/virgo/ide/runtime/internal/ui/projects/ProjectFileReference.java
+++ b/org.eclipse.virgo.ide.runtime.core/src/org/eclipse/virgo/ide/runtime/internal/ui/projects/ProjectFileReference.java
@@ -16,6 +16,7 @@
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.virgo.ide.runtime.core.artefacts.ILocalArtefact;
 import org.eclipse.virgo.ide.runtime.core.artefacts.LocalArtefactSet;
@@ -23,7 +24,7 @@
 /**
  * @author Miles Parker
  */
-public class ProjectFileReference implements IServerProjectArtefact {
+public class ProjectFileReference implements IServerProjectArtefact, IAdaptable {
 
 	ProjectFileContainer container;
 
@@ -72,4 +73,14 @@
 	public IFile getWorkspaceFile() {
 		return workspaceFile;
 	}
+
+	/**
+	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+	 */
+	public Object getAdapter(Class adapter) {
+		if (adapter == IFile.class) {
+			return workspaceFile;
+		}
+		return null;
+	}
 }
diff --git a/org.eclipse.virgo.ide.runtime.ui/plugin.xml b/org.eclipse.virgo.ide.runtime.ui/plugin.xml
index 1f3b1f4..f304179 100644
--- a/org.eclipse.virgo.ide.runtime.ui/plugin.xml
+++ b/org.eclipse.virgo.ide.runtime.ui/plugin.xml
@@ -285,6 +285,9 @@
          <contentExtension
                pattern="org.eclipse.virgo.ide.runtime.ui.filterBundles">
          </contentExtension>
+         <actionExtension
+               pattern="org.eclipse.virgo.ide.runtime.ui.actions">
+         </actionExtension>
       </includes>
    </viewerContentBinding>
    <viewer
@@ -301,6 +304,14 @@
                pattern="org.eclipse.virgo.ide.runtime.ui.repositoryPage"/>
       </includes>
    </viewerContentBinding>
+   <viewerActionBinding
+         viewerId="org.eclipse.virgo.ide.runtime.ui.ArtefactsDetailView">
+      <includes>
+         <actionExtension
+               pattern="org.eclipse.virgo.ide.runtime.ui.actions">
+         </actionExtension>
+      </includes>
+   </viewerActionBinding>
 </extension>
 
 <extension
@@ -474,6 +485,17 @@
          id="org.eclipse.virgo.ide.runtime.ui.filterBundles"
          name="Bundles">
    </commonFilter>
+   <actionProvider
+         class="org.eclipse.virgo.ide.runtime.internal.ui.providers.RuntimeActionProvider"
+         id="org.eclipse.virgo.ide.runtime.ui.actions">
+      <enablement>
+         <or>
+            <instanceof
+                  value="org.eclipse.virgo.ide.runtime.internal.ui.projects.ProjectFileReference">
+            </instanceof>
+         </or>
+      </enablement>
+   </actionProvider>
 </extension>
 <extension
       point="org.eclipse.core.contenttype.contentTypes">
diff --git a/org.eclipse.virgo.ide.runtime.ui/src/org/eclipse/virgo/ide/runtime/internal/ui/actions/OpenServerProjectFileAction.java b/org.eclipse.virgo.ide.runtime.ui/src/org/eclipse/virgo/ide/runtime/internal/ui/actions/OpenServerProjectFileAction.java
index 48347a6..403e372 100644
--- a/org.eclipse.virgo.ide.runtime.ui/src/org/eclipse/virgo/ide/runtime/internal/ui/actions/OpenServerProjectFileAction.java
+++ b/org.eclipse.virgo.ide.runtime.ui/src/org/eclipse/virgo/ide/runtime/internal/ui/actions/OpenServerProjectFileAction.java
@@ -11,18 +11,21 @@
  *******************************************************************************/
 package org.eclipse.virgo.ide.runtime.internal.ui.actions;
 
+import java.util.Iterator;
+
 import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.util.OpenStrategy;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.ui.IEditorDescriptor;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.OpenSystemEditorAction;
-import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.actions.SelectionListenerAction;
 import org.eclipse.ui.internal.ide.DialogUtil;
 import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
 import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
 import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.virgo.ide.runtime.internal.ui.projects.ProjectFileReference;
 
 /**
  * Standard action for opening an editor on the currently selected file resource(s).
@@ -37,7 +40,7 @@
  * @author Miles Parker
  * @noextend This class is not intended to be subclassed by clients.
  */
-public class OpenServerProjectFileAction extends OpenSystemEditorAction {
+public class OpenServerProjectFileAction extends SelectionListenerAction {
 
 	/**
 	 * The id of this action.
@@ -71,7 +74,7 @@
 	 *            the editor descriptor, or <code>null</code> if unspecified
 	 */
 	public OpenServerProjectFileAction(IWorkbenchPage page, IEditorDescriptor descriptor) {
-		super(page);
+		super("Open Linked File");
 		this.workbenchPage2 = page;
 		setText(descriptor == null ? IDEWorkbenchMessages.OpenFileAction_text : descriptor.getLabel());
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IIDEHelpContextIds.OPEN_FILE_ACTION);
@@ -81,40 +84,38 @@
 	}
 
 	/**
-	 * Ensures that the contents of the given file resource are local.
-	 * 
-	 * @param file
-	 *            the file resource
-	 * @return <code>true</code> if the file is local, and <code>false</code> if it could not be made local for some
-	 *         reason
+	 * @see org.eclipse.ui.actions.OpenSystemEditorAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
 	 */
-	boolean ensureFileLocal(final IFile file) {
-		//Currently fails due to Core PR.  Don't do it for now
-		//1G5I6PV: ITPCORE:WINNT - IResource.setLocal() attempts to modify immutable tree
-		//file.setLocal(true, IResource.DEPTH_ZERO);
-		return true;
+	@Override
+	public boolean updateSelection(IStructuredSelection selection) {
+		return selection instanceof StructuredSelection
+				&& ((StructuredSelection) selection).getFirstElement() instanceof ProjectFileReference;
 	}
 
 	/**
-	 * Opens an editor on the given file resource.
-	 * 
-	 * @param file
-	 *            the file resource
+	 * @see org.eclipse.ui.actions.OpenSystemEditorAction#run()
 	 */
-	void openFile(IFile file) {
-		try {
-			boolean activate = OpenStrategy.activateOnOpen();
-			if (editorDescriptor == null) {
-				IDE.openEditor(workbenchPage2, file, activate);
-			} else {
-				if (ensureFileLocal(file)) {
-					workbenchPage2.openEditor(new FileEditorInput(file), editorDescriptor.getId(), activate);
-				}
+	@Override
+	public void run() {
+		Iterator iterator = getStructuredSelection().iterator();
+		while (iterator.hasNext()) {
+			Object next = iterator.next();
+			if (next instanceof ProjectFileReference) {
+				openFile(((ProjectFileReference) next).getWorkspaceFile());
 			}
-		} catch (PartInitException e) {
-			DialogUtil.openError(workbenchPage2.getWorkbenchWindow().getShell(),
-					IDEWorkbenchMessages.OpenFileAction_openFileShellTitle, e.getMessage(), e);
 		}
 	}
 
+	public void openFile(IFile file) {
+		try {
+			IEditorDescriptor defaultEditor = workbenchPage2.getWorkbenchWindow()
+					.getWorkbench()
+					.getEditorRegistry()
+					.getDefaultEditor(file.getName());
+			workbenchPage2.openEditor(new FileEditorInput(file), defaultEditor.getId());
+		} catch (PartInitException e) {
+			DialogUtil.openError(workbenchPage2.getWorkbenchWindow().getShell(),
+					IDEWorkbenchMessages.OpenSystemEditorAction_dialogTitle, e.getMessage(), e);
+		}
+	}
 }
diff --git a/org.eclipse.virgo.ide.runtime.ui/src/org/eclipse/virgo/ide/runtime/ui/views/ArtefactCommonView.java b/org.eclipse.virgo.ide.runtime.ui/src/org/eclipse/virgo/ide/runtime/ui/views/ArtefactCommonView.java
index 45e5df4..33e9deb 100644
--- a/org.eclipse.virgo.ide.runtime.ui/src/org/eclipse/virgo/ide/runtime/ui/views/ArtefactCommonView.java
+++ b/org.eclipse.virgo.ide.runtime.ui/src/org/eclipse/virgo/ide/runtime/ui/views/ArtefactCommonView.java
@@ -19,6 +19,8 @@
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.IToolBarManager;
 import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.StructuredSelection;
@@ -41,6 +43,7 @@
 import org.eclipse.virgo.ide.runtime.core.artefacts.ArtefactSet;
 import org.eclipse.virgo.ide.runtime.core.artefacts.IArtefact;
 import org.eclipse.virgo.ide.runtime.internal.ui.ServerUiPlugin;
+import org.eclipse.virgo.ide.runtime.internal.ui.actions.OpenServerProjectFileAction;
 import org.eclipse.virgo.ide.runtime.internal.ui.editor.VirgoEditorAdapterFactory;
 import org.eclipse.virgo.ide.runtime.internal.ui.filters.FilterAction;
 import org.eclipse.virgo.ide.runtime.internal.ui.projects.IServerProjectArtefact;
@@ -160,6 +163,23 @@
 			manager.appendToGroup(FILTER_ACTION_GROUP, action);
 		}
 
+		getCommonViewer().addDoubleClickListener(new IDoubleClickListener() {
+
+			public void doubleClick(DoubleClickEvent event) {
+				if (event.getSelection() instanceof StructuredSelection) {
+					final StructuredSelection sel = (StructuredSelection) event.getSelection();
+					OpenServerProjectFileAction fileAction = new OpenServerProjectFileAction(getSite().getPage()) {
+						@Override
+						public org.eclipse.jface.viewers.IStructuredSelection getStructuredSelection() {
+							return sel;
+						}
+					};
+					if (fileAction.updateSelection(sel)) {
+						fileAction.run();
+					}
+				}
+			}
+		});
 		updateActivations();
 	}