1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

Improve handling external file

- streamline openInEditor methods
- add support for breakpoints
- markers supported for all editor input types
- make external translation units non-modifiable
This commit is contained in:
Anton Leherbauer 2006-11-24 14:07:16 +00:00
parent d309f414c0
commit a6693eba42
10 changed files with 294 additions and 320 deletions

View file

@ -10,16 +10,6 @@
*******************************************************************************/
package org.eclipse.cdt.internal.ui.browser.opentype;
import org.eclipse.cdt.core.browser.AllTypesCache;
import org.eclipse.cdt.core.browser.ITypeInfo;
import org.eclipse.cdt.core.browser.ITypeReference;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.cdt.internal.ui.util.EditorUtility;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
@ -33,6 +23,15 @@ import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.cdt.core.browser.AllTypesCache;
import org.eclipse.cdt.core.browser.ITypeInfo;
import org.eclipse.cdt.core.browser.ITypeReference;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.util.EditorUtility;
public class OpenTypeAction implements IWorkbenchWindowActionDelegate {
public OpenTypeAction() {
@ -96,11 +95,7 @@ public class OpenTypeAction implements IWorkbenchWindowActionDelegate {
editorPart = EditorUtility.openInEditor(unit);
if (editorPart == null) {
// open as external file
IPath path = location.getLocation();
if (path != null) {
IStorage storage = new FileStorage(path);
editorPart = EditorUtility.openInEditor(storage);
}
editorPart = EditorUtility.openInEditor(location.getLocation(), null);
}
// highlight the type in the editor

View file

@ -38,8 +38,6 @@ import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Caret;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
@ -360,10 +358,7 @@ public class TextEditorDropAdapter extends DropTargetAdapter implements
null));
}
if (file.canRead()) {
IEditorInput editorInput= EditorUtility.getEditorInputForLocation(path);
IEditorDescriptor desc= IDE.getEditorDescriptor(file.getName());
String editorId= desc.getId();
IDE.openEditor(getPage(), editorInput, editorId);
EditorUtility.openInEditor(path, null);
} else {
throw new CoreException(new Status(IStatus.ERROR, CUIPlugin
.getPluginId(), 0, CUIMessages.getFormattedString(

View file

@ -73,6 +73,7 @@ import org.eclipse.cdt.internal.core.model.IBufferFactory;
import org.eclipse.cdt.internal.ui.CFileElementWorkingCopy;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.text.IProblemRequestorExtension;
import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
/**
* CDocumentProvider2
@ -863,6 +864,7 @@ public class CDocumentProvider extends TextFileDocumentProvider {
if (fileBufferAnnotationModel != null) {
((AnnotationModel)tuInfo.fModel).addAnnotationModel("secondaryModel", fileBufferAnnotationModel); //$NON-NLS-1$
}
tuInfo.fCachedReadOnlyState= true;
}
if (tuInfo.fModel instanceof TranslationUnitAnnotationModel) {
TranslationUnitAnnotationModel model= (TranslationUnitAnnotationModel) tuInfo.fModel;
@ -877,6 +879,30 @@ public class CDocumentProvider extends TextFileDocumentProvider {
return tuInfo;
}
/*
* @see org.eclipse.ui.editors.text.TextFileDocumentProvider#isReadOnly(java.lang.Object)
*/
public boolean isReadOnly(Object element) {
// external editor input must not be modified
// because of missing functionality in CFileElementWorkingCopy
if (element instanceof ExternalEditorInput) {
return true;
}
return super.isReadOnly(element);
}
/*
* @see org.eclipse.ui.editors.text.TextFileDocumentProvider#isModifiable(java.lang.Object)
*/
public boolean isModifiable(Object element) {
// external editor input must not be modified
// because of missing functionality in CFileElementWorkingCopy
if (element instanceof ExternalEditorInput) {
return false;
}
return super.isModifiable(element);
}
/*
* @see org.eclipse.ui.editors.text.TextFileDocumentProvider#disposeFileInfo(java.lang.Object,
* org.eclipse.ui.editors.text.TextFileDocumentProvider.FileInfo)
@ -1053,20 +1079,6 @@ public class CDocumentProvider extends TextFileDocumentProvider {
disconnect(e.next());
}
/**
* Returns the underlying resource for the given element.
*
* @param element the element
* @return the underlying resource of the given element
*/
public IResource getUnderlyingResource(Object element) {
if (element instanceof IFileEditorInput) {
IFileEditorInput input= (IFileEditorInput) element;
return input.getFile();
}
return null;
}
public ILineTracker createLineTracker(Object element) {
return new DefaultLineTracker();
}

View file

@ -1,5 +1,5 @@
/**********************************************************************
* Copyright (c) 2002, 2005 IBM Corporation and others.
* Copyright (c) 2002, 2006 IBM Corporation and others.
* 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
@ -7,16 +7,15 @@
*
* Contributors:
* IBM Rational Software - Initial Contribution
* Norbert Ploett (Siemens AG)
* Anton Leherbauer (Wind River Systems)
**********************************************************************/
package org.eclipse.cdt.internal.ui.editor;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
@ -24,35 +23,54 @@ import org.eclipse.ui.texteditor.ResourceMarkerAnnotationModel;
import org.eclipse.cdt.core.model.ICModelMarker;
public class ExternalSearchAnnotationModel extends
ResourceMarkerAnnotationModel implements IResourceChangeListener {
public class ExternalSearchAnnotationModel extends ResourceMarkerAnnotationModel {
protected IWorkspace fWorkspace;
protected IStorage fStorage;
protected boolean fChangesApplied;
private final IStorage fStorage;
private final int fDepth;
private final String fLocationAttribute;
/**
* @param resource
* @param markerResource
* @param storage
*/
public ExternalSearchAnnotationModel(IResource resource, IStorage storage) {
super(resource);
this.fWorkspace = resource.getWorkspace();
this.fStorage = storage;
public ExternalSearchAnnotationModel(IResource markerResource, IStorage storage) {
this(markerResource, storage, IResource.DEPTH_ZERO, ICModelMarker.C_MODEL_MARKER_EXTERNAL_LOCATION);
}
/**
* @param markerResource
* @param storage
* @param depth
*/
ExternalSearchAnnotationModel(IResource markerResource, IStorage storage, int depth) {
this(markerResource, storage, depth, ICModelMarker.C_MODEL_MARKER_EXTERNAL_LOCATION);
}
/**
* @param markerResource
* @param storage
* @param depth
* @param locationAttribute
*/
ExternalSearchAnnotationModel(IResource markerResource,
IStorage storage, int depth, String locationAttribute) {
super(markerResource);
fStorage= storage;
fDepth= depth;
fLocationAttribute= locationAttribute;
}
protected IMarker[] retrieveMarkers() throws CoreException {
IMarker[] markers = null;
if (getResource() != null) {
markers = getResource().findMarkers(IMarker.MARKER, true,
IResource.DEPTH_ZERO);
markers = getResource().findMarkers(IMarker.MARKER, true, fDepth);
}
return markers;
}
protected boolean isAcceptable(IMarker marker) {
boolean acceptable = false;
String externalFileName = marker.getAttribute(
ICModelMarker.C_MODEL_MARKER_EXTERNAL_LOCATION, null);
String externalFileName = marker.getAttribute(fLocationAttribute, null);
if (externalFileName != null) { // Only accept markers with external
// paths set
IPath externalPath = new Path(externalFileName);
@ -66,13 +84,4 @@ public class ExternalSearchAnnotationModel extends
return acceptable;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
*/
public void resourceChanged(IResourceChangeEvent event) {
}
}

View file

@ -7,93 +7,98 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
* Norbert Ploett (Siemens AG)
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.editor;
import org.eclipse.cdt.internal.ui.text.CTextTools;
import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.text.source.AnnotationModel;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.ui.editors.text.FileDocumentProvider;
import org.eclipse.ui.IPathEditorInput;
import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.editors.text.ILocationProvider;
public class ExternalSearchDocumentProvider extends FileDocumentProvider {
import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
public class ExternalSearchDocumentProvider extends CStorageDocumentProvider {
/** Location attribute for breakpoints. See <code>ICBreakpoint.SOURCE_HANDLE</code> */
private static final String DEBUG_SOURCE_HANDLE = "org.eclipse.cdt.debug.core.sourceHandle"; //$NON-NLS-1$
public ExternalSearchDocumentProvider(){
super();
}
/*
* @see AbstractDocumentProvider#createElementInfo(Object)
* @see org.eclipse.ui.editors.text.StorageDocumentProvider#createAnnotationModel(java.lang.Object)
*/
protected ElementInfo createElementInfo(Object element) throws CoreException {
protected IAnnotationModel createAnnotationModel(Object element) throws CoreException {
if (element instanceof ExternalEditorInput) {
ExternalEditorInput externalInput = (ExternalEditorInput) element;
IDocument d = createDocument(externalInput);
IAnnotationModel m= createExternalSearchAnnotationModel(externalInput);
FileInfo info= new FileInfo(d, m, null);
return info;
return createExternalSearchAnnotationModel((ExternalEditorInput)element);
}
return super.createElementInfo(element);
if (element instanceof IStorageEditorInput) {
IStorage storage= ((IStorageEditorInput)element).getStorage();
if (storage.getFullPath() != null) {
return createExternalSearchAnnotationModel(storage, null);
}
}
if (element instanceof IPathEditorInput) {
IPath path= ((IPathEditorInput)element).getPath();
IStorage storage= new FileStorage(path);
return createExternalSearchAnnotationModel(storage, null);
}
if (element instanceof IAdaptable) {
IAdaptable adaptable= (IAdaptable) element;
ILocationProvider provider= (ILocationProvider) adaptable.getAdapter(ILocationProvider.class);
if (provider != null) {
IPath path= provider.getPath(element);
IStorage storage= new FileStorage(path);
return createExternalSearchAnnotationModel(storage, null);
}
}
return super.createAnnotationModel(element);
}
/**
* Create an annotation model for the given {@link ExternalEditorInput}.
*
* @param externalInput
* @return a new annotation model for the editor input
* @return a new annotation model for the external editor input
*/
private IAnnotationModel createExternalSearchAnnotationModel(ExternalEditorInput externalInput) {
IStorage storage = externalInput.getStorage();
IResource resourceToUseForMarker = null;
IFile resourceFile = CUIPlugin.getWorkspace().getRoot().getFileForLocation(storage.getFullPath());
if (resourceFile == null){
resourceToUseForMarker = externalInput.getMarkerResource();
if (null==resourceToUseForMarker) {
IProject[] proj = CUIPlugin.getWorkspace().getRoot()
.getProjects();
for (int i = 0; i < proj.length; i++) {
if (proj[i].isOpen()) {
resourceToUseForMarker = proj[i];
break;
}
}
}
}
else {
resourceToUseForMarker = resourceFile.getProject();
IResource markerResource = externalInput.getMarkerResource();
return createExternalSearchAnnotationModel(storage, markerResource);
}
if (resourceToUseForMarker != null){
ExternalSearchAnnotationModel model = new ExternalSearchAnnotationModel(resourceToUseForMarker, storage);
/**
* Create an annotation model for the given file and associated resource marker.
*
* @param storage the file in the form of a <code>IStorage</code>
* @param markerResource the resource to retrieve markers from, may be <code>null</code>
* @return a new annotation model for the file
*/
private IAnnotationModel createExternalSearchAnnotationModel(IStorage storage, IResource markerResource) {
AnnotationModel model= null;
if (markerResource != null){
model = new ExternalSearchAnnotationModel(markerResource, storage);
} else {
// no marker resource available - search workspace root and all project resources (depth one)
markerResource= CUIPlugin.getWorkspace().getRoot();
model = new ExternalSearchAnnotationModel(markerResource, storage, IResource.DEPTH_ONE);
}
// attach annotation model for C breakpoints
model.addAnnotationModel("debugMarkerModel", new ExternalSearchAnnotationModel(markerResource, storage, IResource.DEPTH_ZERO, DEBUG_SOURCE_HANDLE)); //$NON-NLS-1$
return model;
}
return null;
}
/*
* @see AbstractDocumentProvider#createDocument(Object)
*/
protected IDocument createDocument(Object element) throws CoreException {
IDocument document= super.createDocument(element);
if (document != null){
CTextTools textTools = CUIPlugin.getDefault().getTextTools();
textTools.setupCDocument(document);
}
return document;
}
}

View file

@ -17,20 +17,7 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.cdt.internal.ui.util.EditorUtility;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceProxy;
@ -52,6 +39,17 @@ import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.PlatformUI;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.cdt.internal.ui.util.EditorUtility;
public class OpenIncludeAction extends Action {
@ -117,25 +115,7 @@ public class OpenIncludeAction extends Action {
}
if (fileToOpen != null) {
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(fileToOpen);
if (file != null) {
EditorUtility.openInEditor(file);
} else {
ICProject cproject = include.getCProject();
ITranslationUnit unit = CoreModel.getDefault().createTranslationUnitFrom(cproject, fileToOpen);
if (unit != null) {
EditorUtility.openInEditor(unit);
} else {
// try linked files
IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(fileToOpen);
for(int i=0; i<files.length; i++) {
if (files[i].isAccessible()) {
EditorUtility.openInEditor(files[i]);
break;
}
}
}
}
EditorUtility.openInEditor(fileToOpen, include);
}
} catch (CModelException e) {
CUIPlugin.getDefault().log(e.getStatus());

View file

@ -12,9 +12,6 @@
package org.eclipse.cdt.internal.ui.search.actions;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
@ -25,15 +22,11 @@ import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.search.ui.NewSearchUI;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;
@ -41,13 +34,11 @@ import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.parser.Keywords;
import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.editor.ExternalSearchEditor;
import org.eclipse.cdt.internal.ui.search.CSearchMessages;
import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
import org.eclipse.cdt.internal.ui.util.EditorUtility;
/**
* @author aniefer
@ -468,27 +459,13 @@ public class SelectionParseAction extends Action {
open(path, currentOffset, currentLength);
}
protected void open(IPath path, int currentOffset, int currentLength) throws PartInitException {
IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(path);
if (files.length > 0) {
IEditorPart editor = IDE.openEditor(CUIPlugin.getActivePage(), files[0]);
try {
IMarker marker = files[0].createMarker(NewSearchUI.SEARCH_MARKER);
marker.setAttribute(IMarker.CHAR_START, currentOffset);
marker.setAttribute(IMarker.CHAR_END, currentOffset + currentLength);
IDE.gotoMarker(editor, marker);
marker.delete();
} catch (CoreException e) {
CUIPlugin.getDefault().log(e);
}
} else {
// external file
IEditorInput input = new ExternalEditorInput(new FileStorage(path));
IEditorPart editor = CUIPlugin.getActivePage().openEditor(input, ExternalSearchEditor.EDITOR_ID);
protected void open(IPath path, int currentOffset, int currentLength) throws CoreException {
IEditorPart editor = EditorUtility.openInEditor(path, fEditor.getInputCElement());
if (editor instanceof ITextEditor) {
ITextEditor textEditor = (ITextEditor)editor;
textEditor.selectAndReveal(currentOffset, currentLength);
}
} else {
// TODO: report error
}
}

View file

@ -8,29 +8,16 @@
* Contributors:
* QNX Software Systems - Initial API and implementation
* Markus Schorn (Wind River Systems)
* Norbert Ploett (Siemens AG)
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.util;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.IBinary;
import org.eclipse.cdt.core.model.IBuffer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.editor.CEditorMessages;
import org.eclipse.cdt.internal.ui.editor.ITranslationUnitEditorInput;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.filebuffers.FileBuffers;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
@ -41,6 +28,8 @@ import org.eclipse.core.resources.IStorage;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.action.Action;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.MessageBox;
@ -52,15 +41,31 @@ import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.IBinary;
import org.eclipse.cdt.core.model.IBuffer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.editor.CEditorMessages;
import org.eclipse.cdt.internal.ui.editor.ITranslationUnitEditorInput;
public class EditorUtility {
/**
* The ID of the default text editor
*/
public static final String DEFAULT_TEXT_EDITOR_ID = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
public static final String DEFAULT_TEXT_EDITOR_ID = EditorsUI.DEFAULT_TEXT_EDITOR_ID;
private EditorUtility () {
}
@ -88,9 +93,9 @@ public class EditorUtility {
return null;
}
/**
* Opens a Java editor for an element such as <code>IJavaElement</code>, <code>IFile</code>, or <code>IStorage</code>.
* Opens an editor for an element such as <code>ICElement</code>,
* <code>IFile</code>, or <code>IStorage</code>.
* The editor is activated by default.
* @return the IEditorPart or null if wrong element type or opening failed
*/
@ -99,7 +104,7 @@ public class EditorUtility {
}
/**
* Opens a Java editor for an element (IJavaElement, IFile, IStorage...)
* Opens an editor for an element (ICElement, IFile, IStorage...)
* @return the IEditorPart or null if wrong element type or opening failed
*/
public static IEditorPart openInEditor(Object inputElement, boolean activate) throws CModelException, PartInitException {
@ -109,10 +114,6 @@ public class EditorUtility {
}
IEditorInput input = getEditorInput(inputElement);
//if (input instanceof IFileEditorInput) {
// IFileEditorInput fileInput= (IFileEditorInput) input;
// return openInEditor(fileInput.getFile(), activate);
//}
if (input != null) {
return openInEditor(input, getEditorID(input, inputElement), activate);
@ -184,8 +185,8 @@ public class EditorUtility {
}
/**
* Open error dialog about closed project.
* @param project
*
*/
private static void closedProject(IProject project) {
MessageBox errorMsg = new MessageBox(CUIPlugin.getActiveWorkbenchShell(), SWT.ICON_ERROR | SWT.OK);
@ -201,23 +202,12 @@ public class EditorUtility {
IWorkbenchPage p= CUIPlugin.getActivePage();
if (p != null) {
IEditorPart editorPart= p.openEditor(input, editorID, activate);
initializeHighlightRange(editorPart);
return editorPart;
}
}
return null;
}
private static void initializeHighlightRange(IEditorPart editorPart) {
if (editorPart instanceof ITextEditor) {
//TogglePresentationAction toggleAction= new TogglePresentationAction();
// Initialize editor
//toggleAction.setEditor((ITextEditor)editorPart);
// Reset action
//toggleAction.setEditor(null);
}
}
private static IEditorInput getEditorInput(ICElement element) throws CModelException {
while (element != null) {
if (element instanceof IWorkingCopy && ((IWorkingCopy) element).isWorkingCopy())
@ -253,11 +243,9 @@ public class EditorUtility {
if (input instanceof ICElement) {
return getEditorInput((ICElement) input);
}
if (input instanceof IFile) {
return new FileEditorInput((IFile) input);
}
if (input instanceof IStorage) {
return new ExternalEditorInput((IStorage)input);
}
@ -272,15 +260,64 @@ public class EditorUtility {
*
* @param location a valid file system location
* @return an editor input
* @deprecated Use {@link #getEditorInputForLocation(IPath, ICElement)} instead
*/
public static IEditorInput getEditorInputForLocation(IPath location) {
return getEditorInputForLocation(location, null);
}
/**
* Utility method to open an editor for the given file system location
* using {@link #getEditorInputForLocation(IPath, ICElement)} to create
* the editor input.
*
* @param location a file system location
* @param element an element related to the target file, may be <code>null</code>
* @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);
}
/**
* Utility method to get an editor input for the given file system location.
* If the location denotes a workspace file, a <code>FileEditorInput</code>
* is returned, otherwise, the input is an <code>IStorageEditorInput</code>
* assuming the location points to an existing file in the file system.
* The <code>ICElement</code> is used to determine the associated project
* in case the location can not be resolved to a workspace <code>IFile</code>.
*
* @param location a valid file system location
* @param element an element related to the target file, may be <code>null</code>
* @return an editor input
*/
public static IEditorInput getEditorInputForLocation(IPath location, ICElement element) {
IFile resource= FileBuffers.getWorkspaceFileAtLocation(location);
if (resource != null) {
return new FileEditorInput(resource);
} else {
return new ExternalEditorInput(new FileStorage(location));
} else if (element != null) {
// try to get a translation unit from the location and associated element
ICProject cproject= element.getCProject();
if (cproject != null) {
ITranslationUnit unit = CoreModel.getDefault().createTranslationUnitFrom(cproject, location);
if (unit != null) {
return new ExternalEditorInput(unit, new FileStorage(location));
}
}
// no translation unit - still try to get a sensible marker resource
// from the associated element
if (element instanceof IWorkingCopy && ((IWorkingCopy) element).isWorkingCopy()) {
element= ((IWorkingCopy) element).getOriginalElement();
}
IResource markerResource= null;
if (element != null) {
markerResource= element.getUnderlyingResource();
}
return new ExternalEditorInput(new FileStorage(location), markerResource);
}
return new ExternalEditorInput(new FileStorage(location));
}
/**
@ -316,30 +353,13 @@ public class EditorUtility {
return cu.findSharedWorkingCopy(CUIPlugin.getDefault().getBufferFactory());
}
// /**
// * Returns the translation unit for the given c element.
// * @param element the c element whose compilation unit is searched for
// * @return the compilation unit of the given java element
// */
// private static ITranslationUnit getTranslationUnit(ICElement element) {
//
// if (element == null)
// return null;
//
// int type= element.getElementType();
// if (ICElement.C_UNIT == type) {
// return (ITranslationUnit) element;
// }
// if (ICElement.C_BINARY == type) {
// return null;
// }
// if (element instanceof ISourceReference) {
// return ((ISourceReference) element).getTranslationUnit();
// }
// return getTranslationUnit(element.getParent());
// }
/**
* 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 <code>null</code>
*/
public static String getEditorID(String name) {
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
if (registry != null) {
@ -347,27 +367,27 @@ public class EditorUtility {
if (descriptor != null) {
return descriptor.getId();
}
return registry.findEditor(DEFAULT_TEXT_EDITOR_ID).getId();
}
return null;
return DEFAULT_TEXT_EDITOR_ID;
}
/**
* Determine the editor id from the given editor input and optional input object.
* When a translation unit can be obtained, the project-specific content-type
* 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 <code>null</code>
* @return a valid editor id, never <code>null</code>
*/
public static String getEditorID(IEditorInput input, Object inputObject) {
String ID = getEditorID(input.getName());
if (!"org.eclipse.ui.DefaultTextEditor".equals(ID)) { //$NON-NLS-1$
return ID;
}
// TODO:FIXME:HACK etc ...
// Unfortunately unless specifying all of possible headers in the plugin.xml
// and it is not possible(for example filenames: iostream, cstdlib, etc ...
// We try this hack here. This is to be remove when the Eclipse Platform
// implement there contentious IContentType
ITranslationUnit tunit = null;
if (input instanceof IFileEditorInput) {
if (inputObject instanceof ITranslationUnit) {
tunit= (ITranslationUnit)inputObject;
} else if (input instanceof IFileEditorInput) {
IFileEditorInput editorInput = (IFileEditorInput)input;
IFile file = editorInput.getFile();
ICElement celement = CoreModel.getDefault().create(file);
@ -379,20 +399,31 @@ public class EditorUtility {
tunit = editorInput.getTranslationUnit();
}
// Choose an a file base on the extension.
if (tunit != null) {
// Choose an editor based on the content type
String contentTypeId= tunit.getContentTypeId();
if (contentTypeId != null) {
IContentType contentType= Platform.getContentTypeManager().getContentType(contentTypeId);
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
IEditorDescriptor desc= registry.getDefaultEditor(input.getName(), contentType);
if (desc != null) {
return desc.getId();
}
}
// Choose an editor based on the language (obsolete?)
if (tunit.isCLanguage()) {
return "org.eclipse.cdt.ui.editor.CEditor"; //$NON-NLS-1$
//return getEditorID("No_ExIsTeNt_FiLe.c");//$NON-NLS-1$
return CUIPlugin.EDITOR_ID;
} else if (tunit.isCXXLanguage()) {
return "org.eclipse.cdt.ui.editor.CEditor"; //$NON-NLS-1$
//return getEditorID("No_ExIsTeNt_FiLe.cpp");//$NON-NLS-1$
return CUIPlugin.EDITOR_ID;
} else if (tunit.isASMLanguage()) {
return "org.eclipse.cdt.ui.editor.asm.AsmEditor"; //$NON-NLS-1$
}
}
return ID;
// Choose an editor based on filename/extension
String editorId = getEditorID(input.getName());
return editorId;
}
/**

View file

@ -134,6 +134,7 @@ public class ExternalEditorInput implements ITranslationUnitEditorInput {
public ExternalEditorInput(ITranslationUnit unit, IStorage exFile) {
this(exFile, exFile.getFullPath());
this.unit = unit;
markerResource= unit.getCProject().getProject();
}
public ExternalEditorInput(IStorage exFile) {

View file

@ -1,12 +1,13 @@
/*******************************************************************************
* Copyright (c) 2006 Siemens AG.
* Copyright (c) 2006 Siemens AG and others.
* All rights reserved. This content 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
*
* Contributors:
* Norbert Ploett - Initial implementation
* Norbert Ploett (Siemens AG)
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.util;
@ -17,31 +18,22 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.actions.ActionDelegate;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.ide.IDE;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICModelMarker;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.core.model.CModelManager;
import org.eclipse.cdt.internal.ui.editor.ExternalSearchEditor;
public class OpenExternalProblemAction extends ActionDelegate implements IObjectActionDelegate
{
public class OpenExternalProblemAction extends ActionDelegate implements IObjectActionDelegate {
IStructuredSelection selection ;
@ -61,36 +53,14 @@ public class OpenExternalProblemAction extends ActionDelegate implements IObject
if (attributeObject instanceof String) {
String externalLocation = (String) attributeObject;
IPath externalPath = new Path(externalLocation);
IEditorPart editor = null ;
// Try to open a C editor with the project and the path
ICProject cproject = getCProject(marker);
if (null!=cproject) {
ITranslationUnit tu = CoreModel.getDefault()
.createTranslationUnitFrom(cproject,
externalPath);
if (null!=tu) {
editor = EditorUtility.openInEditor(tu);
}
} else {
// Open in plain external editor
IEditorInput input = new ExternalEditorInput(new FileStorage(externalPath), marker.getResource());
editor = CUIPlugin.getActivePage().openEditor(input, ExternalSearchEditor.EDITOR_ID);
}
if (editor instanceof ITextEditor) {
int lineNumber = marker.getAttribute(IMarker.LINE_NUMBER, 0);
int currentOffset = 0 ;
int currentLength = 0;
ITextEditor textEditor = (ITextEditor) editor;
IEditorInput ediinput = textEditor.getEditorInput();
IDocument document = textEditor.getDocumentProvider().getDocument(ediinput);
try {
currentOffset = document.getLineOffset(lineNumber-1);
} catch (BadLocationException e) {
}
textEditor.selectAndReveal(currentOffset, currentLength);
IEditorPart editor = EditorUtility.openInEditor(externalPath, getCProject(marker));
if (editor != null) {
IDE.gotoMarker(editor, marker);
}
}
} catch (CoreException e) {
CUIPlugin.getDefault().log(e.getStatus());
}
}
}
@ -124,5 +94,4 @@ public class OpenExternalProblemAction extends ActionDelegate implements IObject
}
}
}