From d222f9cf3b4f77b1ff7313c8368867c6201a752e Mon Sep 17 00:00:00 2001 From: David McKnight Date: Wed, 18 Apr 2012 22:16:23 +0000 Subject: [PATCH] [376535] RSE does not respect editor overrides --- .../resources/SystemEditableRemoteFile.java | 17 ++++++- .../actions/SystemRemoteFileOpenWithMenu.java | 39 +++++++++++++++- .../ui/view/SystemViewRemoteFileAdapter.java | 45 ++++++++++++++++++- 3 files changed, 95 insertions(+), 6 deletions(-) diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemEditableRemoteFile.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemEditableRemoteFile.java index 7f26396c1ca..e288ed17d14 100644 --- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemEditableRemoteFile.java +++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemEditableRemoteFile.java @@ -44,6 +44,7 @@ * David McKnight (IBM) - [334839] File Content Conflict is not handled properly * David McKnight (IBM) - [249031] Last used editor should be set to SystemEditableRemoteFile * David McKnight (IBM) - [359704] SystemEditableRemoteFile does not release reference to editor + * Rick Sawyer (IBM) - [376535] RSE does not respect editor overrides *******************************************************************************/ package org.eclipse.rse.files.ui.resources; @@ -132,6 +133,7 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP private IEditorPart editor; private IFile localFile; private IWorkbenchPage page; + private boolean _usingDefaultDescriptor = false; /** * Internal class for downloading file @@ -276,6 +278,10 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP IEditorDescriptor descriptor = null; try { descriptor = IDE.getEditorDescriptor(localResource); + + if (!localResource.exists()){ + _usingDefaultDescriptor = true; + } } catch (PartInitException e) { } @@ -1646,8 +1652,15 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP // set editor as preferred editor for this file String editorId = null; - if (_editorDescriptor != null) - editorId = _editorDescriptor.getId(); + if (_editorDescriptor != null){ + if (_usingDefaultDescriptor){ + _editorDescriptor = IDE.getEditorDescriptor(file); + editorId = _editorDescriptor.getId(); + } + else { + editorId = _editorDescriptor.getId(); + } + } IDE.setDefaultEditor(file, editorId); diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/actions/SystemRemoteFileOpenWithMenu.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/actions/SystemRemoteFileOpenWithMenu.java index 672f00c1d27..ad3af7cd2e2 100644 --- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/actions/SystemRemoteFileOpenWithMenu.java +++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/actions/SystemRemoteFileOpenWithMenu.java @@ -20,8 +20,10 @@ * David McKnight (IBM) - [284596] [regression] Open with-> problem when descriptor doesn't match previous * David McKnight (IBM) - [309755] SystemRemoteFileOpenWithMenu.getPreferredEditor(), the listed default editor is not always correct * David McKnight (IBM) - [312362] Editing Unix file after it changes on host edits old data + * Rick Sawyer (IBM) - [376535] RSE does not respect editor overrides *******************************************************************************/ package org.eclipse.rse.internal.files.ui.actions; +import java.lang.reflect.Method; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; @@ -32,6 +34,7 @@ import java.util.Hashtable; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ResourceAttributes; import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.content.IContentType; import org.eclipse.jface.action.ContributionItem; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IStructuredSelection; @@ -56,6 +59,7 @@ import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.ui.IEditorDescriptor; +import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorRegistry; import org.eclipse.ui.IWorkbench; @@ -408,7 +412,22 @@ protected IEditorDescriptor getPreferredEditor(IRemoteFile remoteFile) { IFile localFile = getLocalResource(remoteFile); if (localFile == null || !localFile.exists()){ - return registry.getDefaultEditor(remoteFile.getName()); + // bug #376535 - need to respect editor overrides + IEditorDescriptor desc = registry.getDefaultEditor(remoteFile.getName(), IDE.guessContentType(localFile)); + // Using reflection in case IDE is older version, without this method + //desc = IDE.overrideDefaultEditorAssociation(new FileEditorInput(localFile), IDE.guessContentType(localFile), desc); + Class clazz = IDE.class; + try { + Class parmtypes[] = {IEditorInput.class, IContentType.class, IEditorDescriptor.class}; + Method method = clazz.getMethod("overrideDefaultEditorAssociation", parmtypes); //$NON-NLS-1$ + if (method != null) { + Object args[] = {new FileEditorInput(localFile), IDE.guessContentType(localFile), desc}; + desc = (IEditorDescriptor) method.invoke(null, args); + } + } catch (Exception e) { + } + + return desc; } else { return IDE.getDefaultEditor(localFile); @@ -470,7 +489,23 @@ public void fill(Menu menu, int index) IEditorDescriptor defaultEditor = registry.findEditor("org.eclipse.ui.DefaultTextEditor"); // may be null //$NON-NLS-1$ IEditorDescriptor preferredEditor = getPreferredEditor(_remoteFile); // may be null - Object[] editors = registry.getEditors(getFileName()); + IFile localFile = getLocalResource(_remoteFile); + IEditorDescriptor[] editors = registry.getEditors(getFileName()); + if (localFile != null) { + // bug #376535 - need to respect editor overrides + // Using reflection in case IDE is older version, without this method + //editors = IDE.overrideEditorAssociations(new FileEditorInput(localFile), IDE.guessContentType(localFile), editors); + Class clazz = IDE.class; + try { + Class parmtypes[] = {IEditorInput.class, IContentType.class, IEditorDescriptor[].class}; + Method method = clazz.getMethod("overrideEditorAssociations", parmtypes); //$NON-NLS-1$ + if (method != null) { + Object args[] = {new FileEditorInput(localFile), IDE.guessContentType(localFile), editors}; + editors = (IEditorDescriptor[]) method.invoke(null, args); + } + } catch (Exception e) { + } + } Collections.sort(Arrays.asList(editors), comparer); boolean defaultFound = false; diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/view/SystemViewRemoteFileAdapter.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/view/SystemViewRemoteFileAdapter.java index 4d16c6a2bf2..d7831208795 100644 --- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/view/SystemViewRemoteFileAdapter.java +++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/view/SystemViewRemoteFileAdapter.java @@ -76,10 +76,12 @@ * David McKnight (IBM) - [249031] Last used editor should be set to SystemEditableRemoteFile * David McKnight (IBM) - [341244] folder selection input to unlocked Remote Systems Details view sometimes fails * David McKnight (IBM) - [363490] PHP files opening in system editor (Dreamweaver) + * Rick Sawyer (IBM) - [376535] RSE does not respect editor overrides *******************************************************************************/ package org.eclipse.rse.internal.files.ui.view; import java.io.File; +import java.lang.reflect.Method; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Date; @@ -100,6 +102,7 @@ import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.core.runtime.content.IContentType; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; @@ -204,13 +207,14 @@ import org.eclipse.rse.ui.view.ISystemViewElementAdapter; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorDescriptor; +import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorRegistry; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; +import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.progress.IElementCollector; import org.eclipse.ui.views.properties.IPropertyDescriptor; import org.eclipse.ui.views.properties.PropertyDescriptor; @@ -564,6 +568,31 @@ public class SystemViewRemoteFileAdapter IRemoteFile file = (IRemoteFile) element; if (file.isFile() || file.isArchive()) // hack to show zips without folder icons { + // bug #376535 - need to respect editor overrides + IFile localFile = getLocalResource(file); + if (localFile != null) { + IEditorDescriptor editorDesc = getEditorRegistry().getDefaultEditor(file.getName(), IDE.guessContentType(localFile)); + // Using reflection in case IDE is older version, without this method + //editorDesc = IDE.overrideDefaultEditorAssociation(new FileEditorInput(localFile), IDE.guessContentType(localFile), editorDesc); + Class clazz = IDE.class; + try { + Class parmtypes[] = {IEditorInput.class, IContentType.class, IEditorDescriptor.class}; + Method method = clazz.getMethod("overrideDefaultEditorAssociation", parmtypes); //$NON-NLS-1$ + if (method != null) { + Object args[] = {new FileEditorInput(localFile), IDE.guessContentType(localFile), editorDesc}; + editorDesc = (IEditorDescriptor) method.invoke(null, args); + } + } catch (Exception e) { + } + + if (editorDesc != null) { + ImageDescriptor image = editorDesc.getImageDescriptor(); + if (image != null) { + return image; + } + } + } + return getEditorRegistry().getImageDescriptor(file.getName()); } else @@ -591,6 +620,16 @@ public class SystemViewRemoteFileAdapter } } + /** + * Get the local cache of the remote file, or null if none. + * @param remoteFile the remote file. + * @return the local cached resource, or null if none. + */ + private IFile getLocalResource(IRemoteFile remoteFile) + { + return (IFile)UniversalFileTransferUtility.getTempFileFor(remoteFile); + } + /** * Return the label for this object. Uses getName() on the remote file object. */ @@ -3421,8 +3460,9 @@ public class SystemViewRemoteFileAdapter // open new editor for correct replica editable = getEditableRemoteObject(remoteFile); - } + } + /* Commenting out - no longer needed with fix to bug #376535 if (editable instanceof SystemEditableRemoteFile){ SystemEditableRemoteFile edit = (SystemEditableRemoteFile)editable; IEditorDescriptor oldDescriptor = edit.getEditorDescriptor(); @@ -3443,6 +3483,7 @@ public class SystemViewRemoteFileAdapter edit.setEditorDescriptor(curDescriptor); } } + */ try {