/*******************************************************************************
* Copyright (c) 2006, 2009 Wind River 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn (Wind River Systems) - Initial API and implementation
* Anton Leherbauer (Wind River Systems)
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.ui.refactoring;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.ContentStamp;
import org.eclipse.ltk.core.refactoring.TextFileChange;
import org.eclipse.text.edits.UndoEdit;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.internal.core.model.TranslationUnit;
import org.eclipse.cdt.internal.ui.refactoring.DocumentAdapter;
import org.eclipse.cdt.internal.ui.refactoring.UndoCTextFileChange;
/**
* A TextFileChange that uses a working copy in order to generate CModel events.
*
* @noextend This class is not intended to be subclassed by clients.
*/
public class CTextFileChange extends TextFileChange {
// "c2" is the extension which the CContentViewerCreator is registered
// with the extension point "org.eclipse.compare.contentMergeViewers"
private static final String TEXT_TYPE = "c2"; //$NON-NLS-1$
private ITranslationUnit fTranslationUnit;
private IWorkingCopy fWorkingCopy;
private int fAquireCount;
public CTextFileChange(String name, IFile file) {
super(name, file);
ICElement element = CoreModel.getDefault().create(file);
if (element instanceof ITranslationUnit) {
fTranslationUnit = (ITranslationUnit) element;
setTextType(TEXT_TYPE);
}
}
/**
* @since 5.1
*/
public CTextFileChange(String name, ITranslationUnit tu) {
super(name, getFile(tu));
fTranslationUnit = tu;
setTextType(TEXT_TYPE);
}
/*
* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.TextFileChange#acquireDocument(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
protected IDocument acquireDocument(IProgressMonitor pm) throws CoreException {
IDocument doc= super.acquireDocument(pm);
if (++fAquireCount == 1) {
if (fTranslationUnit instanceof TranslationUnit && fWorkingCopy == null) {
fWorkingCopy= ((TranslationUnit) fTranslationUnit).getWorkingCopy(null, DocumentAdapter.FACTORY);
if (!fTranslationUnit.isOpen()) {
fTranslationUnit.open(null);
}
}
}
return doc;
}
@Override
protected void commit(final IDocument document, final IProgressMonitor pm) throws CoreException {
if (fWorkingCopy == null) {
super.commit(document, pm);
}
else if (needsSaving()) {
fWorkingCopy.commit(false, pm);
}
}
/*
* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.TextFileChange#releaseDocument(org.eclipse.jface.text.IDocument, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
protected void releaseDocument(IDocument document, IProgressMonitor pm) throws CoreException {
super.releaseDocument(document, pm);
if (--fAquireCount == 0) {
if (fWorkingCopy != null) {
fWorkingCopy.destroy();
fWorkingCopy= null;
}
}
}
/*
* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.TextFileChange#createUndoChange(org.eclipse.text.edits.UndoEdit, org.eclipse.ltk.core.refactoring.ContentStamp)
*/
@Override
protected Change createUndoChange(UndoEdit edit, ContentStamp stampToRestore) {
return new UndoCTextFileChange(getName(), getFile(), edit, stampToRestore, getSaveMode());
}
private static IFile getFile(ITranslationUnit tu) {
return (IFile) tu.getResource();
}
}