package uk.ac.gda.lookuptable.editor; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.UnsupportedEncodingException; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.IPageChangedListener; import org.eclipse.jface.dialogs.PageChangedEvent; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.editors.text.TextEditor; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.part.MultiPageEditorPart; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * An example showing how to create a multi-page editor. This example has 3 pages: * <ul> * <li>page 0 contains a nested text editor. * <li>page 1 allows you to change the font used in page 2 * <li>page 2 shows the words in page 0 in sorted order * </ul> */ public class LookupTableMultiPageEditor extends MultiPageEditorPart implements IResourceChangeListener { private static final Logger logger = LoggerFactory.getLogger(LookupTableMultiPageEditor.class); /** The text editor used in page 0. */ private TextEditor editor; private LookupTableEditor lookupTeditor; /** * Creates a multi-page editor example. */ public LookupTableMultiPageEditor() { super(); ResourcesPlugin.getWorkspace().addResourceChangeListener(this); } /** * Creates page 0 of the multi-page editor, which contains a text editor. */ private void createTextView() { try { editor = new TextEditor(); int index = addPage(editor, getEditorInput()); setPageText(index, "Text View"); } catch (PartInitException e) { ErrorDialog.openError(getSite().getShell(), "Error creating nested text editor", null, e.getStatus()); } } @Override public String getPartName() { return editor.getTitle(); } public static class ColumnLabelProviderCustom extends ColumnLabelProvider { private final int index; public ColumnLabelProviderCustom(int index) { this.index = index; } public int getIndex() { return index; } } /** * Creates page 2 of the multi-page editor, which shows the sorted text. */ private void createTableView() { try { lookupTeditor = new LookupTableEditor(); int index = addPage(lookupTeditor, getEditorInput()); addPageChangedListener(new IPageChangedListener() { @Override public void pageChanged(PageChangedEvent event) { if (event.getSelectedPage().equals(lookupTeditor)) { String editorText = editor.getDocumentProvider().getDocument(editor.getEditorInput()).get(); try { InputStream is = new ByteArrayInputStream(editorText.getBytes("UTF-8")); lookupTeditor.refresh(is); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } }); setPageText(index, "Table View"); } catch (PartInitException e) { ErrorDialog.openError(getSite().getShell(), "Error creating nested text editor", null, e.getStatus()); } } /** * Creates the pages of the multi-page editor. */ @Override protected void createPages() { createTableView(); createTextView(); } /** * The <code>MultiPageEditorPart</code> implementation of this <code>IWorkbenchPart</code> method disposes all * nested editors. Subclasses may extend. */ @Override public void dispose() { ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); super.dispose(); } /** * Saves the multi-page editor's document. */ @Override public void doSave(IProgressMonitor monitor) { getEditor(getActivePage()).doSave(monitor); } /** * Saves the multi-page editor's document as another file. Also updates the text for page 0's tab, and updates this * multi-page editor's input to correspond to the nested editor's. */ @Override public void doSaveAs() { IEditorPart editor = getEditor(1); editor.doSaveAs(); setInput(editor.getEditorInput()); } /* * (non-Javadoc) Method declared on IEditorPart */ public void gotoMarker(IMarker marker) { setActivePage(0); IDE.gotoMarker(getEditor(1), marker); } /** * The <code>MultiPageEditorExample</code> implementation of this method checks that the input is an instance of * <code>IFileEditorInput</code>. */ @Override public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException { if (!(editorInput instanceof IFileEditorInput)) throw new PartInitException("Invalid Input: Must be IFileEditorInput"); super.init(site, editorInput); } /* * (non-Javadoc) Method declared on IEditorPart. */ @Override public boolean isSaveAsAllowed() { return true; } /** * Calculates the contents of page 2 when the it is activated. */ @Override protected void pageChange(int newPageIndex) { super.pageChange(newPageIndex); } /** * Closes all project files on project close. */ @Override public void resourceChanged(final IResourceChangeEvent event) { if (event.getType() == IResourceChangeEvent.PRE_CLOSE) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { IWorkbenchPage[] pages = getSite().getWorkbenchWindow().getPages(); for (int i = 0; i < pages.length; i++) { if (((FileEditorInput) editor.getEditorInput()).getFile().getProject() .equals(event.getResource())) { IEditorPart editorPart = pages[i].findEditor(editor.getEditorInput()); pages[i].closeEditor(editorPart, true); } } } }); } } }