/*******************************************************************************
* Copyright (c) 2007, 2008 Edgar Espina.
* 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
*
*******************************************************************************/
package org.deved.antlride.internal.ui.editor;
import java.util.ArrayList;
import java.util.List;
import org.deved.antlride.common.ui.AntlrImages;
import org.deved.antlride.core.build.AntlrSourceParserRepository;
import org.deved.antlride.core.model.IGrammar;
import org.deved.antlride.core.resources.AntlrResourceListener;
import org.deved.antlride.core.resources.AntlrResourceTracker;
import org.deved.antlride.ui.AntlrUI;
import org.deved.antlride.ui.editor.AntlrEditorPageContribution;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.MultiPageEditorPart;
import org.eclipse.ui.services.IDisposable;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;
public class AntlrMultiPageEditor extends MultiPageEditorPart implements
AntlrResourceListener, ITextEditor {
private AntlrEditor editor;
private AntlrInterpreterPage interpreterPage;
private List<Viewer> viewers = new ArrayList<Viewer>();
public AntlrMultiPageEditor() {
AntlrResourceTracker.addResourceChangeListener(this);
}
@Override
protected void createPages() {
createEditorPage();
createInterpreterPage();
AntlrEditorPageContribution[] pages = AntlrUI.getDefault()
.getPageContributions();
IPreferenceStore store = editor.getScriptPreferenceStore();
for (AntlrEditorPageContribution page : pages) {
if (store.getBoolean(page.getId())) {
Viewer viewer = page.createPage(getContainer());
int index = addPage(viewer.getControl());
viewers.add(viewer);
setPageText(index, page.getText());
setPageImage(index, AntlrImages.getImage(page.getImage()));
}
}
}
@SuppressWarnings("unchecked")
@Override
public Object getAdapter(Class adapter) {
if (adapter == AntlrEditor.class) {
return editor;
} else if (adapter == ITextEditor.class) {
return editor;
}
return super.getAdapter(adapter);
}
private void createEditorPage() {
try {
editor = new AntlrEditor();
viewers.add(null);
getSite().getSelectionProvider().addSelectionChangedListener(
new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
try {
if (!event.getSelection().isEmpty()) {
if (getActivePage() > 0) {
setActivePage(0);
}
}
} catch (Exception ex) {
// do nothing
}
}
});
int index = addPage(editor, getEditorInput());
this.setPageText(index, "Grammar");
this.setPageImage(index, AntlrImages.getImage(AntlrImages.G));
setPartName(editor.getTitle());
} catch (PartInitException e) {
ErrorDialog.openError(getSite().getShell(),
"Error creating nested text editor", null, e.getStatus());
}
}
@Override
protected void pageChange(int newPageIndex) {
super.pageChange(newPageIndex);
Viewer viewer = viewers.get(newPageIndex);
if (viewer != null) {
ISourceModule sourceModule = (ISourceModule) editor
.getInputModelElement();
IGrammar grammar = AntlrSourceParserRepository
.getGrammar(sourceModule);
viewer.setInput(grammar);
}
}
@Override
public void setActivePage(int pageIndex) {
super.setActivePage(pageIndex);
// editor.setFocus();
}
/**
* Creates page 1 of the multi-page editor, which allows you to change the
* font used in page 2.
*/
void createInterpreterPage() {
interpreterPage = new AntlrInterpreterPage(this, getContainer());
viewers.add(interpreterPage);
int index = addPage(interpreterPage.getControl());
setPageText(index, "Interpreter");
setPageImage(index, AntlrImages.getImage(AntlrImages.PARSE_TREE));
}
@Override
public void doSave(IProgressMonitor monitor) {
getEditor(0).doSave(monitor);
}
@Override
public void doSaveAs() {
IEditorPart editor = getEditor(0);
editor.doSaveAs();
setPageText(0, "Grammar");
setInput(editor.getEditorInput());
setPartName(editor.getTitle());
}
@Override
public boolean isSaveAsAllowed() {
return true;
}
@Override
public void dispose() {
for (int i = 1; i < viewers.size(); i++) {
IDisposable disposable = (IDisposable) viewers.get(i);
disposable.dispose();
}
AntlrResourceTracker.removeResourceChangeListener(this);
super.dispose();
}
public void resourceChanged(final IResourceChangeEvent event) {
// if (event.getType() == IResourceChangeEvent.PRE_CLOSE) {
// Display.getDefault().asyncExec(new Runnable() {
// public void run() {
// IWorkbenchPage[] pages = getSite().getWorkbenchWindow()
// .getPages();
// for (int i = 0; i < pages.length; i++) {
// IFile file = ((FileEditorInput) editor.getEditorInput())
// .getFile();
// if (file.getProject().equals(event.getResource())) {
// IEditorPart editorPart = pages[i].findEditor(editor
// .getEditorInput());
// pages[i].closeEditor(editorPart, true);
// }
// }
// }
// });
// }
}
public void added(IResource resource) {
}
public void changed(IResource resource) {
}
public void removed(final IResource resource) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
IWorkbenchPage[] pages = getSite().getWorkbenchWindow()
.getPages();
for (int i = 0; i < pages.length; i++) {
IFile file = ((FileEditorInput) editor.getEditorInput())
.getFile();
if (resource.equals(file)) {
IEditorPart editorPart = pages[i].findEditor(editor
.getEditorInput());
pages[i].closeEditor(editorPart, true);
}
}
}
});
}
public void close(boolean save) {
editor.close(save);
}
public void doRevertToSaved() {
editor.doRevertToSaved();
}
public IAction getAction(String actionId) {
return editor.getAction(actionId);
}
public IDocumentProvider getDocumentProvider() {
return editor.getDocumentProvider();
}
public IRegion getHighlightRange() {
return editor.getHighlightRange();
}
public ISelectionProvider getSelectionProvider() {
return editor.getSelectionProvider();
}
public boolean isEditable() {
return editor.isEditable();
}
public void removeActionActivationCode(String actionId) {
editor.removeActionActivationCode(actionId);
}
public void resetHighlightRange() {
editor.resetHighlightRange();
}
public void selectAndReveal(int offset, int length) {
editor.selectAndReveal(offset, length);
}
public void setAction(String actionID, IAction action) {
editor.setAction(actionID, action);
}
public void setActionActivationCode(String actionId,
char activationCharacter, int activationKeyCode,
int activationStateMask) {
editor.setActionActivationCode(actionId, activationCharacter,
activationKeyCode, activationStateMask);
}
public void setHighlightRange(int offset, int length, boolean moveCursor) {
editor.setHighlightRange(offset, length, moveCursor);
}
public void showHighlightRangeOnly(boolean showHighlightRangeOnly) {
editor.showHighlightRangeOnly(showHighlightRangeOnly);
}
public boolean showsHighlightRangeOnly() {
return editor.showsHighlightRangeOnly();
}
}