From 214698ca9c7f1275ddc76b2f619681fbee0601ca Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Wed, 12 Dec 2007 14:20:49 +0000 Subject: [PATCH] Improve path to resource conversion when opening an editor (related to bug 211056) --- .../cdt/internal/ui/util/EditorUtility.java | 116 +++++++++--------- 1 file changed, 60 insertions(+), 56 deletions(-) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/util/EditorUtility.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/util/EditorUtility.java index 2e4c9dadfbd..caed2d46221 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/util/EditorUtility.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/util/EditorUtility.java @@ -79,31 +79,31 @@ public class EditorUtility { private EditorUtility () { } - /** + /** * Tests if a cu is currently shown in an editor * @return the IEditorPart if shown, null if element is not open in an editor - */ + */ public static IEditorPart isOpenInEditor(Object inputElement) { IEditorInput input = null; - + try { input = getEditorInput(inputElement); } catch (CModelException x) { //CUIPlugin.log(x.getStatus()); } - + if (input != null) { IWorkbenchPage p= CUIPlugin.getActivePage(); if (p != null) { return p.findEditor(input); } } - + return null; } /** - * Opens an editor for an element such as ICElement, + * Opens an editor for an element such as ICElement, * IFile, or IStorage. * The editor is activated by default. * @return the IEditorPart or null if wrong element type or opening failed @@ -117,23 +117,23 @@ public class EditorUtility { * @return the IEditorPart or null if wrong element type or opening failed */ public static IEditorPart openInEditor(Object inputElement, boolean activate) throws CModelException, PartInitException { - + if (inputElement instanceof IFile) { return openInEditor((IFile) inputElement, activate); } - + IEditorInput input = getEditorInput(inputElement); - + if (input != null) { return openInEditor(input, getEditorID(input, inputElement), activate); } - + return null; } - /** + /** * Selects a C Element in an editor - */ + */ public static void revealInEditor(IEditorPart part, ICElement element) { if (element == null) { return; @@ -158,25 +158,25 @@ public class EditorUtility { closedProject(file.getProject()); return null; } - + if (file != null) { try { if (!isLinked(file)) { File tempFile = file.getRawLocation().toFile(); - + if (tempFile != null){ String canonicalPath = null; try { canonicalPath = tempFile.getCanonicalPath(); } catch (IOException e1) {} - + if (canonicalPath != null){ IPath path = new Path(canonicalPath); file = CUIPlugin.getWorkspace().getRoot().getFileForLocation(path); } } } - + IEditorInput input = getEditorInput(file); if (input != null) { return openInEditor(input, getEditorID(input, file), activate); @@ -185,24 +185,24 @@ public class EditorUtility { } return null; } - + public static boolean isLinked(IFile file) { if (file.isLinked()) return true; - + IPath path = file.getLocation(); - + while (path.segmentCount() > 0) { path = path.removeLastSegments(1); IContainer[] containers = ResourcesPlugin.getWorkspace().getRoot().findContainersForLocation(path); - + for(int i=0; inull - * @throws PartInitException + * @throws PartInitException */ public static IEditorPart openInEditor(IPath location, ICElement element) throws PartInitException { IEditorInput input= getEditorInputForLocation(location, element); - return EditorUtility.openInEditor(input, getEditorID(input, element), true); + return EditorUtility.openInEditor(input, getEditorID(input, element), true); } /** @@ -297,7 +297,7 @@ public class EditorUtility { * assuming the location points to an existing file in the file system. * The ICElement is used to determine the associated project * in case the location can not be resolved to a workspace IFile. - * + * * @param location a valid file system location * @param context an element related to the target file, may be null * @return an editor input @@ -306,8 +306,8 @@ public class EditorUtility { IFile resource= getWorkspaceFileAtLocation(location, context); if (resource != null) { return new FileEditorInput(resource); - } - + } + if (context == null) { // try to synthesize a context for a location appearing on a project's // include paths @@ -329,7 +329,7 @@ public class EditorUtility { } catch (CModelException e) { } } - + if (context != null) { // try to get a translation unit from the location and associated element ICProject cproject= context.getCProject(); @@ -352,14 +352,15 @@ public class EditorUtility { * Utility method to resolve a file system location to a workspace resource. * If a context element is given and there are multiple matches in the workspace, * a resource with the same project of the context element are preferred. - * + * * @param location a valid file system location * @param context an element related to the target file, may be null * @return an IFile or null */ private static IFile getWorkspaceFileAtLocation(IPath location, ICElement context) { + // search non-linked resource IFile file= FileBuffers.getWorkspaceFileAtLocation(location); - if (file == null) { + if (file == null || !CoreModel.hasCNature(file.getProject())) { // try to find a linked resource IProject project= null; if (context != null) { @@ -369,24 +370,27 @@ public class EditorUtility { } } IFile bestMatch= null; + IFile secondBestMatch= null; IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot(); IFile[] files= root.findFilesForLocation(location); for (int i= 0; i < files.length; i++) { file= files[i]; if (file.isAccessible()) { - if (project != null && file.getProject() == project) { + if (project != null && file.getProject().equals(project)) { bestMatch= file; break; - } - if (bestMatch == null) { + } else if (CoreModel.hasCNature(file.getProject())) { bestMatch= file; if (project == null) { break; } + } else { + // match in non-CDT project + secondBestMatch= file; } } } - return bestMatch; + return bestMatch != null ? bestMatch : secondBestMatch; } return file; } @@ -403,7 +407,7 @@ public class EditorUtility { return getEditorInputCElement(part); } } - return null; + return null; } public static ICElement getEditorInputCElement(IEditorPart part) { @@ -413,13 +417,13 @@ public class EditorUtility { } return (ICElement) editorInput.getAdapter(ICElement.class); } - - /** + + /** * Gets the working copy of an compilation unit opened in an editor - * + * * @param cu the original compilation unit (or another working copy) * @return the working copy of the compilation unit, or null if not found - */ + */ public static ITranslationUnit getWorkingCopy(ITranslationUnit cu) { if (cu == null) return null; @@ -432,7 +436,7 @@ public class EditorUtility { /** * Determine the editor id from the given file name using * the workspace-wide content-type definitions. - * + * * @param name the file name * @return a valid editor id, never null */ @@ -454,7 +458,7 @@ public class EditorUtility { * mechanism is used to determine the correct editor id. * If that fails, the editor id is determined by file name and extension using * the workspace-wide content-type definitions. - * + * * @param input the editor input * @param inputObject the input object (used to create the editor input) or null * @return a valid editor id, never null @@ -517,13 +521,13 @@ public class EditorUtility { /** * Maps the localized modifier name to a code in the same * manner as #findModifier. - * + * * @return the SWT modifier bit, or 0 if no match was found */ public static int findLocalizedModifier(String token) { if (token == null) return 0; - + if (token.equalsIgnoreCase(Action.findModifierString(SWT.CTRL))) return SWT.CTRL; if (token.equalsIgnoreCase(Action.findModifierString(SWT.SHIFT))) @@ -539,7 +543,7 @@ public class EditorUtility { /** * Returns the modifier string for the given SWT modifier * modifier bits. - * + * * @param stateMask the SWT modifier bits * @return the modifier string * @since 2.1.1 @@ -554,14 +558,14 @@ public class EditorUtility { modifierString= appendModifierString(modifierString, SWT.SHIFT); if ((stateMask & SWT.COMMAND) == SWT.COMMAND) modifierString= appendModifierString(modifierString, SWT.COMMAND); - + return modifierString; } /** * Appends to modifier string of the given SWT modifier bit * to the given modifierString. - * + * * @param modifierString the modifier string * @param modifier an int with SWT modifier bit * @return the concatenated modifier string @@ -588,7 +592,7 @@ public class EditorUtility { } return store; } - + public static IStorage getStorage(ITranslationUnit tu) { IStorage store = null; try {