1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-25 09:55:29 +02:00

Fix for Bug 171796 - Make external translation units editable

This commit is contained in:
Anton Leherbauer 2007-01-29 15:19:17 +00:00
parent f405ef7559
commit b2b9d11098
11 changed files with 179 additions and 223 deletions

View file

@ -257,10 +257,8 @@ public class CModelBuilder2 implements IContributedModelBuilder {
((ASTHolderTUInfo)elementInfo).fAST= ast;
}
checkCanceled();
if (ast == null) {
checkCanceled();
// fallback to old model builder
new CModelBuilder(fTranslationUnit, new HashMap()).parse(true);
return;
}
startTime= System.currentTimeMillis();
@ -556,7 +554,9 @@ public class CModelBuilder2 implements IContributedModelBuilder {
IASTDeclaration[] declarations= linkageDeclaration.getDeclarations();
for (int i= 0; i < declarations.length; i++) {
IASTDeclaration declaration= declarations[i];
createDeclaration(parent, declaration);
if (linkageDeclaration.getFileLocation() != null || isLocalToFile(declaration)) {
createDeclaration(parent, declaration);
}
}
}
@ -661,7 +661,9 @@ public class CModelBuilder2 implements IContributedModelBuilder {
IASTDeclaration[] nsDeclarations= declaration.getDeclarations();
for (int i= 0; i < nsDeclarations.length; i++) {
IASTDeclaration nsDeclaration= nsDeclarations[i];
createDeclaration(element, nsDeclaration);
if (declaration.getFileLocation() != null || isLocalToFile(nsDeclaration)) {
createDeclaration(element, nsDeclaration);
}
}
}
@ -852,7 +854,9 @@ public class CModelBuilder2 implements IContributedModelBuilder {
final IASTDeclaration[] memberDeclarations= compositeTypeSpecifier.getMembers();
for (int i= 0; i < memberDeclarations.length; i++) {
IASTDeclaration member= memberDeclarations[i];
createDeclaration(element, member);
if (compositeTypeSpecifier.getFileLocation() != null || isLocalToFile(member)) {
createDeclaration(element, member);
}
}
} finally {
popDefaultVisibility();
@ -1219,6 +1223,7 @@ public class CModelBuilder2 implements IContributedModelBuilder {
private void setIdentifierPosition(SourceManipulation element, IASTNode astName) {
final IASTFileLocation location= astName.getFileLocation();
if (location != null) {
assert fTranslationUnitFileName.equals(location.getFileName());
element.setIdPos(location.getNodeOffset(), location.getNodeLength());
} else {
final IASTNodeLocation[] locations= astName.getNodeLocations();

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2005 QNX Software Systems and others.
* Copyright (c) 2000, 2007 QNX Software Systems 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,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
@ -41,7 +42,13 @@ public class CreateWorkingCopyOperation extends CModelOperation {
protected void executeOperation() throws CModelException {
ITranslationUnit tu = getTranslationUnit();
WorkingCopy workingCopy = new WorkingCopy(tu.getParent(), (IFile)tu.getResource(), tu.getContentTypeId(), this.factory, this.problemRequestor);
WorkingCopy workingCopy;
if (tu.getResource() != null) {
workingCopy= new WorkingCopy(tu.getParent(), (IFile)tu.getResource(), tu.getContentTypeId(), this.factory, this.problemRequestor);
} else {
workingCopy= new WorkingCopy(tu.getParent(), tu.getLocation(), tu.getContentTypeId(), this.factory);
}
// open the working copy now to ensure contents are that of the current state of this element
// Alain: Actually no, delay the parsing 'till it is really needed. Doing the parsing here
// really slows down the opening of the CEditor.

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2005 QNX Software Systems and others.
* Copyright (c) 2000, 2007 QNX Software Systems 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,79 +7,24 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.IBuffer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
/**
* ExternalTranslationUnit
*/
public class ExternalTranslationUnit extends TranslationUnit {
IPath fPath;
/**
* @param parent
* @param path
*/
public ExternalTranslationUnit(ICElement parent, IPath path, String contentTypeID) {
super(parent, (IResource)null, path.toString(), contentTypeID);
fPath = path;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.model.Openable#openBuffer(org.eclipse.core.runtime.IProgressMonitor)
*/
protected IBuffer openBuffer(IProgressMonitor pm) throws CModelException {
// create buffer - translation units only use default buffer factory
BufferManager bufManager = getBufferManager();
IBuffer buffer = getBufferFactory().createBuffer(this);
if (buffer == null)
return null;
// set the buffer source
if (buffer.getCharacters() == null){
IPath path = this.getPath();
File file = path.toFile();
if (file != null && file.isFile()) {
try {
InputStream stream = new FileInputStream(file);
buffer.setContents(Util.getInputStreamAsCharArray(stream, (int)file.length(), null));
} catch (IOException e) {
buffer.setContents(new char[0]);
}
} else {
buffer.setContents(new char[0]);
}
}
// add buffer to buffer cache
bufManager.addBuffer(buffer);
// listen to buffer changes
buffer.addBufferChangedListener(this);
return buffer;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.model.ICElement#getPath()
*/
public IPath getPath() {
return fPath;
super(parent, path, contentTypeID);
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2006 QNX Software Systems and others.
* Copyright (c) 2000, 2007 QNX Software Systems 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
@ -9,10 +9,14 @@
* QNX Software Systems - Initial API and implementation
* Markus Schorn (Wind River Systems)
* IBM Corporation
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@ -81,13 +85,9 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
}
public TranslationUnit(ICElement parent, IPath path, String idType) {
super(parent, path, ICElement.C_UNIT);
setContentTypeID(idType);
}
public TranslationUnit(ICElement parent, IResource res, String name, String idType) {
super(parent, res, name, ICElement.C_UNIT);
super(parent, (IResource)null, path.toString(), ICElement.C_UNIT);
setContentTypeID(idType);
setLocation(path);
}
public ITranslationUnit getTranslationUnit() {
@ -280,7 +280,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
return (INamespace[]) aList.toArray(new INamespace[0]);
}
public void setLocation(IPath loc) {
protected void setLocation(IPath loc) {
location = loc;
}
@ -296,6 +296,10 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
return location;
}
public IPath getPath() {
return getLocation();
}
public IFile getFile() {
IResource res = getResource();
if (res instanceof IFile) {
@ -454,7 +458,13 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
}
public IWorkingCopy getWorkingCopy(IProgressMonitor monitor, IBufferFactory factory)throws CModelException{
WorkingCopy workingCopy = new WorkingCopy(getParent(), getFile(), getContentTypeId(), factory);
WorkingCopy workingCopy;
IFile file= getFile();
if (file != null) {
workingCopy= new WorkingCopy(getParent(), file, getContentTypeId(), factory);
} else {
workingCopy= new WorkingCopy(getParent(), getLocation(), getContentTypeId(), factory);
}
// open the working copy now to ensure contents are that of the current state of this element
workingCopy.open(monitor);
return workingCopy;
@ -549,9 +559,22 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
// set the buffer source
if (buffer.getCharacters() == null) {
IResource file = this.getResource();
if (file != null && file.getType() == IResource.FILE) {
buffer.setContents(Util.getResourceContentsAsCharArray((IFile)file));
IResource resource = this.getResource();
if (resource != null && resource.getType() == IResource.FILE) {
buffer.setContents(Util.getResourceContentsAsCharArray((IFile)resource));
} else {
IPath path = this.getLocation();
java.io.File file = path.toFile();
if (file != null && file.isFile()) {
try {
InputStream stream = new FileInputStream(file);
buffer.setContents(Util.getInputStreamAsCharArray(stream, (int)file.length(), null));
} catch (IOException e) {
buffer.setContents(new char[0]);
}
} else {
buffer.setContents(new char[0]);
}
}
}
@ -657,7 +680,10 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
IResource res = getResource();
if (res != null)
return res.exists();
return super.exists();
if (location != null) {
return location.toFile().exists();
}
return false;
}
public ILanguage getLanguage() throws CoreException {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2002, 2006 IBM Corporation and others.
* Copyright (c) 2002, 2007 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
@ -8,6 +8,7 @@
* Contributors:
* Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
@ -157,7 +158,11 @@ public class Util implements ICLogConstants {
*/
public static char[] getResourceContentsAsCharArray(IFile file)
throws CModelException {
return getResourceContentsAsCharArray(file, null);
try {
return getResourceContentsAsCharArray(file, file.getCharset());
} catch (CoreException exc) {
throw new CModelException(exc, ICModelStatusConstants.CORE_EXCEPTION);
}
}
public static char[] getResourceContentsAsCharArray(IFile file,

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2002, 2006 IBM Corporation and others.
* Copyright (c) 2002, 2007 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
@ -8,6 +8,7 @@
* Contributors:
* Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
@ -219,7 +220,11 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy {
* @see org.eclipse.cdt.core.model.IWorkingCopy#getOriginalElement()
*/
public ITranslationUnit getOriginalElement() {
return new TranslationUnit(getParent(), getFile(), getContentTypeId());
IFile file= getFile();
if (file != null) {
return new TranslationUnit(getParent(), getFile(), getContentTypeId());
}
return new ExternalTranslationUnit(getParent(), getLocation(), getContentTypeId());
}
/**
@ -288,8 +293,9 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy {
// this.problemRequestor.endReporting();
//}
}
/**
* @see org.eclipse.cdt.internal.core.model.CFile#openBuffer(IProgressMonitor)
/*
* @see org.eclipse.cdt.internal.core.model.TranslationUnit#openBuffer(org.eclipse.core.runtime.IProgressMonitor)
*/
protected IBuffer openBuffer(IProgressMonitor pm) throws CModelException {
@ -301,7 +307,7 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy {
return null;
// set the buffer source if needed
if (buffer.getCharacters() == null){
if (buffer.getContents() == null){
ITranslationUnit original= this.getOriginalElement();
IBuffer originalBuffer = null;
try {

View file

@ -11,11 +11,15 @@
package org.eclipse.cdt.ui.tests.text;
import java.io.File;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.TextSelection;
@ -24,11 +28,18 @@ import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.PartInitException;
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.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.ui.tests.BaseUITestCase;
import org.eclipse.cdt.internal.core.model.ExternalTranslationUnit;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.util.EditorUtility;
/**
* Basic CEditor tests.
@ -74,9 +85,19 @@ public class BasicCEditorTest extends BaseUITestCase {
assertNotNull(fDocument);
}
private void setUpEditor(File file) throws PartInitException, CModelException {
fEditor= (CEditor) EditorUtility.openInEditor(new ExternalTranslationUnit(fCProject, Path.fromOSString(file.toString()), CCorePlugin.CONTENT_TYPE_CXXSOURCE));
assertNotNull(fEditor);
fTextWidget= fEditor.getViewer().getTextWidget();
assertNotNull(fTextWidget);
fAccessor= new Accessor(fTextWidget, StyledText.class);
fDocument= fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
assertNotNull(fDocument);
}
public void testEditInNonCProject() throws Exception {
final String file= "/ceditor/src/main.cpp";
fNonCProject = EditorTestHelper.createNonCProject("ceditor", "resources/ceditor", false);
fNonCProject= EditorTestHelper.createNonCProject("ceditor", "resources/ceditor", false);
setUpEditor(file);
fSourceViewer= EditorTestHelper.getSourceViewer(fEditor);
assertTrue(EditorTestHelper.joinReconciler(fSourceViewer, 0, 10000, 100));
@ -96,6 +117,46 @@ public class BasicCEditorTest extends BaseUITestCase {
assertEquals("Save failed", newContent, content);
}
public void testEditExternalTranslationUnit() throws Exception {
final String file= "/ceditor/src/main.cpp";
fCProject= EditorTestHelper.createCProject("ceditor", "resources/ceditor", false);
IFile mainFile= ResourceTestHelper.findFile(file);
assertNotNull(mainFile);
File tmpFile= File.createTempFile("tmp", ".cpp");
tmpFile.deleteOnExit();
FileTool.copy(mainFile.getLocation().toFile(), tmpFile);
setUpEditor(tmpFile);
fSourceViewer= EditorTestHelper.getSourceViewer(fEditor);
assertTrue(EditorTestHelper.joinReconciler(fSourceViewer, 0, 10000, 100));
String content= fDocument.get();
setCaret(0);
String newtext= "/* "+getName()+" */";
type(newtext);
type('\n');
String newContent= fDocument.get();
assertEquals("Edit failed", newtext, newContent.substring(0, newtext.length()));
// save
fEditor.doSave(new NullProgressMonitor());
// close and reopen
EditorTestHelper.closeEditor(fEditor);
setUpEditor(tmpFile);
fSourceViewer= EditorTestHelper.getSourceViewer(fEditor);
assertTrue(EditorTestHelper.joinReconciler(fSourceViewer, 0, 10000, 100));
content= fDocument.get();
assertEquals("Save failed", newContent, content);
// check reconciler
ITranslationUnit tUnit= (ITranslationUnit)fEditor.getInputCElement();
ICElement[] children= tUnit.getChildren();
assertEquals(2, children.length);
setCaret(content.length());
type('\n');
type("void func() {}\n");
assertTrue(EditorTestHelper.joinReconciler(fSourceViewer, 0, 10000, 100));
children= tUnit.getChildren();
assertEquals(3, children.length);
tmpFile.delete();
}
/**
* Type characters into the styled text.
*

View file

@ -1,47 +0,0 @@
/*******************************************************************************
* Copyright (c) 2005 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* QNX Software System
*******************************************************************************/
package org.eclipse.cdt.internal.ui;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.IBuffer;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.core.model.WorkingCopy;
import org.eclipse.core.runtime.CoreException;
public class CFileElementWorkingCopy extends WorkingCopy {
ITranslationUnit unit;
/**
* Creates a working copy of this element
*/
public CFileElementWorkingCopy(ITranslationUnit unit) throws CoreException {
super(unit.getParent(), unit.getPath(), unit.getContentTypeId(), null);
this.unit = unit;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.model.IOpenable#getBuffer()
*/
public IBuffer getBuffer() throws CModelException {
return unit.getBuffer();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.model.IWorkingCopy#getOriginalElement()
*/
public ITranslationUnit getOriginalElement() {
return unit;
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2002, 2006 QNX Software Systems and others.
* Copyright (c) 2002, 2007 QNX Software Systems 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
@ -71,7 +71,6 @@ import org.eclipse.cdt.ui.text.ICPartitions;
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;
@ -240,7 +239,7 @@ public class CDocumentProvider extends TextFileDocumentProvider {
}
/*
* @see org.eclipse.cdt.internal.ui.javaeditor.IJavaAnnotation#getOverlay()
* @see org.eclipse.cdt.internal.ui.editor.IJavaAnnotation#getOverlay()
*/
public ICAnnotation getOverlay() {
return null;
@ -466,7 +465,7 @@ public class CDocumentProvider extends TextFileDocumentProvider {
}
/*
* @see org.eclipse.jdt.internal.ui.text.java.IProblemRequestorExtension#beginReportingSequence()
* @see org.eclipse.cdt.internal.ui.text.java.IProblemRequestorExtension#beginReportingSequence()
*/
public void beginReportingSequence() {
ProblemRequestorState state= (ProblemRequestorState) fProblemRequestorState.get();
@ -513,7 +512,7 @@ public class CDocumentProvider extends TextFileDocumentProvider {
}
/*
* @see org.eclipse.jdt.internal.ui.text.java.IProblemRequestorExtension#endReportingSequence()
* @see org.eclipse.cdt.internal.ui.text.java.IProblemRequestorExtension#endReportingSequence()
*/
public void endReportingSequence() {
ProblemRequestorState state= (ProblemRequestorState) fProblemRequestorState.get();
@ -773,10 +772,6 @@ public class CDocumentProvider extends TextFileDocumentProvider {
/** Annotation model listener added to all created CU annotation models */
private GlobalAnnotationModelListener fGlobalAnnotationModelListener;
/** The save policy used by this provider */
//private ISavePolicy fSavePolicy;
/**
*
*/
@ -860,14 +855,8 @@ public class CDocumentProvider extends TextFileDocumentProvider {
setUpSynchronization(tuInfo);
IProblemRequestor requestor= tuInfo.fModel instanceof IProblemRequestor ? (IProblemRequestor) tuInfo.fModel : null;
IWorkingCopy copy = null;
if (element instanceof IFileEditorInput) {
IBufferFactory factory = CUIPlugin.getDefault().getBufferFactory();
copy = original.getSharedWorkingCopy(getProgressMonitor(), factory, requestor);
} else if (element instanceof ITranslationUnitEditorInput) {
copy = new CFileElementWorkingCopy(original);
}
tuInfo.fCopy = copy;
IBufferFactory factory = CUIPlugin.getDefault().getBufferFactory();
tuInfo.fCopy = original.getSharedWorkingCopy(getProgressMonitor(), factory, requestor);
if (tuInfo.fModel == null && element instanceof IStorageEditorInput) {
IStorage storage= ((IStorageEditorInput)element).getStorage();
@ -892,38 +881,6 @@ public class CDocumentProvider extends TextFileDocumentProvider {
return tuInfo;
}
/*
* @see org.eclipse.ui.editors.text.TextFileDocumentProvider#isReadOnly(java.lang.Object)
*/
public boolean isReadOnly(Object element) {
// external translation unit must not be modified
// because of missing functionality in CFileElementWorkingCopy
FileInfo info= getFileInfo(element);
if (info instanceof TranslationUnitInfo) {
TranslationUnitInfo tuInfo= (TranslationUnitInfo)info;
if (tuInfo.fCopy instanceof CFileElementWorkingCopy) {
return true;
}
}
return super.isReadOnly(element);
}
/*
* @see org.eclipse.ui.editors.text.TextFileDocumentProvider#isModifiable(java.lang.Object)
*/
public boolean isModifiable(Object element) {
// external translation unit must not be modified
// because of missing functionality in CFileElementWorkingCopy
FileInfo info= getFileInfo(element);
if (info instanceof TranslationUnitInfo) {
TranslationUnitInfo tuInfo= (TranslationUnitInfo)info;
if (tuInfo.fCopy instanceof CFileElementWorkingCopy) {
return false;
}
}
return super.isModifiable(element);
}
/*
* @see org.eclipse.ui.editors.text.TextFileDocumentProvider#disposeFileInfo(java.lang.Object,
* org.eclipse.ui.editors.text.TextFileDocumentProvider.FileInfo)
@ -941,25 +898,16 @@ public class CDocumentProvider extends TextFileDocumentProvider {
protected void commitWorkingCopy(IProgressMonitor monitor, Object element, TranslationUnitInfo info, boolean overwrite)
throws CoreException {
synchronized (info.fCopy) {
info.fCopy.reconcile();
}
IDocument document= info.fTextFileBuffer.getDocument();
IResource resource= info.fCopy.getResource();
//Assert.isTrue(resource instanceof IFile);
if (resource instanceof IFile && !resource.exists()) {
// underlying resource has been deleted, just recreate file, ignore the rest
createFileFromDocument(monitor, (IFile) resource, document);
return;
}
//if (fSavePolicy != null)
// fSavePolicy.preSave(info.fCopy);
try {
//info.fCopy.commit(overwrite, monitor);
commitFileBuffer(monitor, info, overwrite);
} catch (CoreException x) {
// inform about the failure
@ -969,17 +917,7 @@ public class CDocumentProvider extends TextFileDocumentProvider {
// inform about the failure
fireElementStateChangeFailed(element);
throw x;
} finally {
}
// If here, the dirty state of the editor will change to "not dirty".
// Thus, the state changing flag will be reset.
// NOTE: this is done in commitFileBuffer() if we use info.fCopy.comit(...) reenable code
//if (info.fModel instanceof AbstractMarkerAnnotationModel) {
// AbstractMarkerAnnotationModel model= (AbstractMarkerAnnotationModel) info.fModel;
// model.updateMarkers(document);
//}
}
/*
@ -1038,7 +976,7 @@ public class CDocumentProvider extends TextFileDocumentProvider {
}
};
}
return null;
return super.createSaveOperation(element, document, overwrite);
}
/**
@ -1063,24 +1001,14 @@ public class CDocumentProvider extends TextFileDocumentProvider {
}
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ITranlationUnitDocumentProvider#addGlobalAnnotationModelListener(org.eclipse.jface.text.source.IAnnotationModelListener)
*/
public void addGlobalAnnotationModelListener(IAnnotationModelListener listener) {
fGlobalAnnotationModelListener.addListener(listener);
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ITranslationUnitDocumentProvider#removeGlobalAnnotationModelListener(org.eclipse.jface.text.source.IAnnotationModelListener)
*/
public void removeGlobalAnnotationModelListener(IAnnotationModelListener listener) {
fGlobalAnnotationModelListener.removeListener(listener);
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ICompilationUnitDocumentProvider#getWorkingCopy(java.lang.Object)
*/
public IWorkingCopy getWorkingCopy(Object element) {
FileInfo fileInfo = getFileInfo(element);
if (fileInfo instanceof TranslationUnitInfo) {
@ -1090,11 +1018,8 @@ public class CDocumentProvider extends TextFileDocumentProvider {
return null;
}
/*
* @see org.eclipse.jdt.internal.ui.javaeditor.ICompilationUnitDocumentProvider#shutdown()
*/
public void shutdown() {
//CUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(fPropertyListener);
// CUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(fPropertyListener);
Iterator e = getConnectedElementsIterator();
while (e.hasNext())
disconnect(e.next());

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2002, 2006 QNX Software Systems and others.
* Copyright (c) 2002, 2007 QNX Software Systems 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,17 +7,21 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.editor;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.cdt.core.model.IBuffer;
import org.eclipse.cdt.core.model.IOpenable;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.internal.core.model.IBufferFactory;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
/**
* CustomBufferFactory
@ -44,6 +48,12 @@ public class CustomBufferFactory implements IBufferFactory {
DocumentAdapter adapter= new DocumentAdapter(owner, fFile);
return adapter;
}
// external file
IPath location= original.getLocation();
if (location != null) {
return new DocumentAdapter(owner, location);
}
}
return DocumentAdapter.NULL;

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2002, 2006 IBM Corporation and others.
* Copyright (c) 2002, 2007 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,11 +7,11 @@
*
* Contributors:
* Rational Software - Initial API and implementation
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.editor;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
@ -40,6 +40,7 @@ import org.eclipse.jface.text.DefaultLineTracker;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.jface.text.ISynchronizable;
import org.eclipse.core.runtime.Assert;
import org.eclipse.swt.widgets.Display;
@ -181,17 +182,27 @@ public class DocumentAdapter implements IBuffer, IDocumentListener {
private List fBufferListeners= new ArrayList(3);
private IStatus fStatus;
private IPath fLocation;
public DocumentAdapter(IOpenable owner, IFile file) {
fOwner= owner;
fFile= file;
fLocation= file.getFullPath();
initialize();
}
public DocumentAdapter(IOpenable owner, IPath location) {
fOwner= owner;
fLocation= location;
initialize();
}
private void initialize() {
ITextFileBufferManager manager= FileBuffers.getTextFileBufferManager();
IPath location= fFile.getFullPath();
IPath location= fLocation;
try {
manager.connect(location, new NullProgressMonitor());
fTextFileBuffer= manager.getTextFileBuffer(location);
@ -199,6 +210,8 @@ public class DocumentAdapter implements IBuffer, IDocumentListener {
} catch (CoreException x) {
fStatus= x.getStatus();
fDocument= manager.createEmptyDocument(location);
if (fDocument instanceof ISynchronizable)
((ISynchronizable)fDocument).setLockObject(new Object());
}
fDocument.addPrenotifiedDocumentListener(this);
}