/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.ui.common; import java.util.HashMap; import java.util.Map; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IPartListener2; import org.eclipse.ui.IPerspectiveDescriptor; import org.eclipse.ui.IPerspectiveListener3; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; /** * This class listens to the workbench and records the active editor for every deactivated perspective so the editor can be * re-activated when the perspective is re-opened. * * @since 8.0 */ public class EditorPerspectiveListener implements IPerspectiveListener3 { /** map of key=IPerspectiveDescriptor to value=IEditorInput */ private Map<IPerspectiveDescriptor, IEditorInput> activeEditorMap = new HashMap<IPerspectiveDescriptor, IEditorInput>(); IEditorReference currentEditor; /** * Create an EditorPerspectiveListener for the specified window * * @param window * @since 5.0.2 */ public EditorPerspectiveListener( IWorkbenchWindow window ) { // register a part listener to keep track of the current editor window.getPartService().addPartListener(new IPartListener2() { @Override public void partActivated( IWorkbenchPartReference ref ) { if (ref instanceof IEditorReference) { currentEditor = (IEditorReference)ref; } } @Override public void partBroughtToTop( IWorkbenchPartReference ref ) { if (ref instanceof IEditorReference) { currentEditor = (IEditorReference)ref; } } @Override public void partClosed( IWorkbenchPartReference ref ) { if (ref != null && ref.equals(currentEditor)) { currentEditor = null; } } @Override public void partDeactivated( IWorkbenchPartReference ref ) { } @Override public void partOpened( IWorkbenchPartReference ref ) { } @Override public void partHidden( IWorkbenchPartReference ref ) { } @Override public void partVisible( IWorkbenchPartReference ref ) { } @Override public void partInputChanged( IWorkbenchPartReference ref ) { } }); } /** * @see org.eclipse.ui.IPerspectiveListener3#perspectiveClosed(org.eclipse.ui.IWorkbenchPage, * org.eclipse.ui.IPerspectiveDescriptor) * @since 5.0.2 */ @Override public void perspectiveClosed( IWorkbenchPage page, IPerspectiveDescriptor perspective ) { activeEditorMap.remove(perspective); } /** * @see org.eclipse.ui.IPerspectiveListener3#perspectiveDeactivated(org.eclipse.ui.IWorkbenchPage, * org.eclipse.ui.IPerspectiveDescriptor) * @since 5.0.2 */ @Override public void perspectiveDeactivated( IWorkbenchPage page, IPerspectiveDescriptor perspective ) { try { if (currentEditor != null && currentEditor.getEditorInput() != null) { activeEditorMap.put(perspective, currentEditor.getEditorInput()); } } catch (PartInitException e) { // no need to log, if editor init fails, just proceed } currentEditor = null; } /** * @see org.eclipse.ui.IPerspectiveListener#perspectiveActivated(org.eclipse.ui.IWorkbenchPage, * org.eclipse.ui.IPerspectiveDescriptor) * @since 5.0.2 */ @Override public void perspectiveActivated( IWorkbenchPage page, IPerspectiveDescriptor perspective ) { if (activeEditorMap.keySet().contains(perspective)) { IEditorInput editorInput = activeEditorMap.get(perspective); if (editorInput != null) { IEditorReference[] editors = page.getEditorReferences(); for (int i = 0; i < editors.length; ++i) { try { if (editors[i].getEditorInput().equals(editorInput)) { page.openEditor(editorInput, editors[i].getId(), false); break; } } catch (PartInitException e) { // no need to log, we are just looking through the editors } } } } } /** * @see org.eclipse.ui.IPerspectiveListener3#perspectiveSavedAs(org.eclipse.ui.IWorkbenchPage, * org.eclipse.ui.IPerspectiveDescriptor, org.eclipse.ui.IPerspectiveDescriptor) * @since 5.0.2 */ @Override public void perspectiveSavedAs( IWorkbenchPage page, IPerspectiveDescriptor oldPerspective, IPerspectiveDescriptor newPerspective ) { IEditorInput editor = activeEditorMap.get(oldPerspective); if (editor != null) { activeEditorMap.put(newPerspective, editor); } } /** * @see org.eclipse.ui.IPerspectiveListener2#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, * org.eclipse.ui.IPerspectiveDescriptor, org.eclipse.ui.IWorkbenchPartReference, java.lang.String) * @since 5.0.2 */ @Override public void perspectiveChanged( IWorkbenchPage page, IPerspectiveDescriptor perspective, IWorkbenchPartReference partRef, String changeId ) { } /** * @see org.eclipse.ui.IPerspectiveListener#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, * org.eclipse.ui.IPerspectiveDescriptor, java.lang.String) * @since 5.0.2 */ @Override public void perspectiveChanged( IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId ) { } /** * @see org.eclipse.ui.IPerspectiveListener3#perspectiveOpened(org.eclipse.ui.IWorkbenchPage, * org.eclipse.ui.IPerspectiveDescriptor) * @since 5.0.2 */ @Override public void perspectiveOpened( IWorkbenchPage page, IPerspectiveDescriptor perspective ) { } }