package org.rascalmpl.eclipse.actions;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.NullProgressMonitor;
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.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.rascalmpl.eclipse.plugins.LoadRascalPluginsFromProjects;
import org.rascalmpl.eclipse.terms.TermLanguageRegistry;
import io.usethesource.impulse.editor.UniversalEditor;
public class ReloadLanguage implements IWorkbenchWindowActionDelegate {
private IWorkbenchWindow activeWindow;
@Override
public void run(IAction action) {
if (activeWindow != null) {
IWorkbenchPage activePage = activeWindow.getActivePage();
if (activePage != null) {
IEditorPart activeEditor = activePage.getActiveEditor();
if (activeEditor != null && activeEditor instanceof UniversalEditor) {
UniversalEditor ued = (UniversalEditor) activeEditor;
IFileEditorInput input = (IFileEditorInput)ued.getEditorInput() ;
IFile file = input.getFile();
IProject activeProject = file.getProject();
LoadRascalPluginsFromProjects.registerTermLanguagePlugin(activeProject);
for (IEditorReference editorRef: activePage.getEditorReferences()) {
// mark all editor containing term language dirty
IEditorPart editor = editorRef.getEditor(false);
if (editor != null && editor instanceof UniversalEditor) {
UniversalEditor uniEditor = (UniversalEditor)editor;
if (TermLanguageRegistry.getInstance().getParser(uniEditor.getLanguage()) != null) {
IDocumentProvider documentProvider = uniEditor.getDocumentProvider();
IFileEditorInput edInput = (IFileEditorInput)uniEditor.getEditorInput() ;
IDocument doc = documentProvider.getDocument(edInput);
if (doc.getLength() > 0) {
boolean wasDirty = uniEditor.isDirty();
try {
// TODO: make sure it's not in the undo
doc.replace(0, 1, doc.get(0, 1));
} catch (BadLocationException e) {
// for now, ignore
}
if (!wasDirty) {
uniEditor.doSave(new NullProgressMonitor());
}
}
}
}
}
}
}
}
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
}
@Override
public void dispose() {
}
@Override
public void init(IWorkbenchWindow window) {
activeWindow = window;
}
}