package org.eclipse.dltk.javascript.internal.ui.quickfix;
import org.eclipse.core.filebuffers.FileBuffers;
import org.eclipse.core.filebuffers.ITextFileBuffer;
import org.eclipse.core.filebuffers.ITextFileBufferManager;
import org.eclipse.core.filebuffers.LocationKind;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.dltk.ui.editor.IScriptAnnotation;
import org.eclipse.dltk.ui.text.IAnnotationResolution2;
import org.eclipse.jface.text.IDocument;
import org.eclipse.swt.graphics.Image;
import org.eclipse.text.edits.MultiTextEdit;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IMarkerResolution2;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
/**
* Base resolution class when file modification is needed
*
* @author jcompagner
*
*/
public abstract class TextFileEditResolution implements IMarkerResolution2,
IAnnotationResolution2 {
private IFile scriptFile;
private int problemStartIdx;
public TextFileEditResolution(IFile scriptFile, int problemStartIdx) {
this.scriptFile = scriptFile;
this.problemStartIdx = problemStartIdx;
}
public IFile getScriptFile() {
return scriptFile;
}
public int getProblemStartIdx() {
return problemStartIdx;
}
public Image getImage() {
return null;
}
public final void run() {
MultiTextEdit textEdit = getTextEdit(scriptFile, problemStartIdx);
if (!textEdit.hasChildren())
return;
ITextFileBufferManager textFileBufferManager = FileBuffers
.getTextFileBufferManager();
try {
textFileBufferManager.connect(scriptFile.getFullPath(),
LocationKind.IFILE, null);
} catch (CoreException e) {
e.printStackTrace();
return;
}
try {
ITextFileBuffer textFileBuffer = textFileBufferManager
.getTextFileBuffer(scriptFile.getFullPath(),
LocationKind.IFILE);
IDocument document = textFileBuffer.getDocument();
FileEditorInput editorInput = new FileEditorInput(scriptFile);
final IEditorPart openEditor = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow() == null ? null : PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.findEditor(editorInput);
boolean dirty = openEditor != null ? openEditor.isDirty()
: textFileBuffer.isDirty();
try {
textEdit.apply(document);
} catch (Exception e) {
e.printStackTrace();
}
if (!dirty) {
if (openEditor != null) {
openEditor.doSave(null);
} else {
try {
textFileBuffer.commit(null, true);
} catch (CoreException e) {
e.printStackTrace();
}
}
}
} finally {
try {
textFileBufferManager.disconnect(scriptFile.getFullPath(),
LocationKind.IFILE, null);
} catch (CoreException e) {
e.printStackTrace();
}
}
}
protected abstract MultiTextEdit getTextEdit(IFile file, int offset);
/*
* @see
* org.eclipse.ui.IMarkerResolution#run(org.eclipse.core.resources.IMarker)
*/
public final void run(final IMarker marker) {
run();
}
/*
* @see
* org.eclipse.dltk.ui.text.IAnnotationResolution#run(org.eclipse.dltk.ui
* .editor.IScriptAnnotation, org.eclipse.jface.text.IDocument)
*/
public final void run(IScriptAnnotation annotation, IDocument document) {
run();
}
}