/******************************************************************************* * Copyright (c) 2006, 2009 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 * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.text.BadLocationException; 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.UndoTextFileChange; import org.eclipse.text.edits.MalformedTreeException; import org.eclipse.text.edits.TextEdit; import org.eclipse.text.edits.UndoEdit; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.IBuffer; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.IWorkingCopy; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.core.model.TranslationUnit; /** * UndoCTextFileChange that uses a working copy in order to generate CModel events. * @author janees */ public class UndoCTextFileChange extends UndoTextFileChange { UndoEdit mUndoEdit = null; public UndoCTextFileChange(String name, IFile file, UndoEdit undo, ContentStamp stamp, int saveMode) { super(name, file, undo, stamp, saveMode); mUndoEdit = undo; } /* * (non-Javadoc) * @see org.eclipse.ltk.core.refactoring.UndoTextFileChange#perform(org.eclipse.core.runtime.IProgressMonitor) */ @Override public Change perform(IProgressMonitor pm) throws CoreException { if (pm == null){ pm= new NullProgressMonitor(); } Object obj = getModifiedElement(); if(!(obj instanceof IFile)){ throw new IllegalArgumentException(); } final IFile file = (IFile) obj; ICElement element = CoreModel.getDefault().create(file); if (!(element instanceof TranslationUnit)) { return super.perform(pm); } final TranslationUnit tu = (TranslationUnit) element; IWorkingCopy wc= tu.getWorkingCopy(pm, DocumentAdapter.FACTORY); final IBuffer buffer= wc.getBuffer(); assert buffer instanceof DocumentAdapter; if (buffer instanceof DocumentAdapter) { IDocument document= ((DocumentAdapter) buffer).getDocument(); try { UndoEdit redo= mUndoEdit.apply(document, TextEdit.CREATE_UNDO); wc.commit(false, pm); return new UndoCTextFileChange(getName(), file, redo, null, getSaveMode()); } catch (MalformedTreeException e) { CUIPlugin.log(e); } catch (BadLocationException e) { CUIPlugin.log(e); } finally { wc.destroy(); } } return null; } }