/******************************************************************************* * Copyright (c) 2001, 2009 IBM Corporation and others. * 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 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.wst.xsd.ui.internal.adt.editor; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.EventObject; import java.util.Iterator; import java.util.List; 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.draw2d.ColorConstants; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.DefaultEditDomain; import org.eclipse.gef.EditPartFactory; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.MouseWheelHandler; import org.eclipse.gef.MouseWheelZoomHandler; import org.eclipse.gef.commands.CommandStack; import org.eclipse.gef.commands.CommandStackListener; import org.eclipse.gef.editparts.LayerManager; import org.eclipse.gef.editparts.ZoomManager; import org.eclipse.gef.ui.actions.ActionRegistry; import org.eclipse.gef.ui.actions.UpdateAction; import org.eclipse.gef.ui.actions.ZoomInAction; import org.eclipse.gef.ui.actions.ZoomOutAction; import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer; import org.eclipse.gef.ui.parts.SelectionSynchronizer; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.text.IDocument; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IPartService; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.IWindowListener; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.widgets.ImageHyperlink; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.ide.IGotoMarker; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.part.MultiPageEditorPart; import org.eclipse.ui.part.MultiPageEditorSite; import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor; import org.eclipse.wst.sse.ui.StructuredTextEditor; import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML; import org.eclipse.wst.xsd.ui.internal.adt.design.DesignViewerGraphicConstants; import org.eclipse.wst.xsd.ui.internal.adt.design.FlatCCombo; import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.RootEditPart; import org.eclipse.wst.xsd.ui.internal.editor.XSDEditorPlugin; public abstract class CommonMultiPageEditor extends MultiPageEditorPart implements IResourceChangeListener, CommandStackListener, ITabbedPropertySheetPageContributor, IPropertyListener, IEditorModeListener { public static int SOURCE_PAGE_INDEX = 1, DESIGN_PAGE_INDEX = 0; protected IContentOutlinePage fOutlinePage; protected DefaultEditDomain editDomain; protected SelectionSynchronizer synchronizer; protected ActionRegistry actionRegistry; protected StructuredTextEditor structuredTextEditor; protected CommonSelectionManager selectionProvider; protected ScrollingGraphicalViewer graphicalViewer; protected EditorModeManager editorModeManager; protected FlatCCombo modeCombo; private EditorModeAndCustomizedName[] editorModeAndCustomizedNames; protected Composite toolbar; protected ModeComboListener modeComboListener; protected int maxLength = 0; protected CommonActivationListener fActivationListener; public CommonMultiPageEditor() { super(); editDomain = new DefaultEditDomain(this) { public void mouseDown(MouseEvent mouseEvent, EditPartViewer viewer) { boolean eatTheEvent = false; LayerManager manager = (LayerManager)viewer.getEditPartRegistry().get(LayerManager.ID); IFigure layer = manager.getLayer(DesignViewerGraphicConstants.SCALED_HANDLE_LAYER); if (layer != null) { Point p = new Point(mouseEvent.x, mouseEvent.y); layer.translateToRelative(p); IFigure figure = layer.findFigureAt(p); if (figure != null && figure != layer) { // we eat this selection event! eatTheEvent = true; } } if (!eatTheEvent) { super.mouseDown(mouseEvent, viewer); } } }; } /* (non-Javadoc) * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor#getContributorId() */ public abstract String getContributorId(); /** * */ protected abstract void createActions(); /* (non-Javadoc) * @see org.eclipse.ui.part.MultiPageEditorPart#createPages() */ protected void createPages() { } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor) */ public void doSave(IProgressMonitor monitor) { // getEditor(1).doSave(monitor); structuredTextEditor.doSave(monitor); getCommandStack().markSaveLocation(); } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#doSaveAs() */ public void doSaveAs() { IEditorPart editor = getEditor(1); // editor.doSaveAs(); structuredTextEditor.doSaveAs(); setInput(structuredTextEditor.getEditorInput()); setPartName(editor.getTitle()); getCommandStack().markSaveLocation(); } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed() */ public boolean isSaveAsAllowed() { return true; } /* (non-Javadoc) * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) * * Closes all project files on project close. */ 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++) { if (((FileEditorInput) structuredTextEditor.getEditorInput()).getFile().getProject().equals(event.getResource())) { IEditorPart editorPart = pages[i].findEditor(structuredTextEditor.getEditorInput()); pages[i].closeEditor(editorPart, true); } } } }); } } /* (non-Javadoc) * @see org.eclipse.gef.commands.CommandStackListener#commandStackChanged(java.util.EventObject) */ public void commandStackChanged(EventObject event) { firePropertyChange(PROP_DIRTY); } /** * Indicates that a property has changed. * * @param source * the object whose property has changed * @param propId * the id of the property which has changed; property ids are * generally defined as constants on the source class */ public void propertyChanged(Object source, int propId) { switch (propId) { // had to implement input changed "listener" so that // strucutedText could tell it containing editor that // the input has change, when a 'resource moved' event is // found. case IEditorPart.PROP_INPUT : case IEditorPart.PROP_DIRTY : { if (source == structuredTextEditor) { if (structuredTextEditor.getEditorInput() != getEditorInput()) { setInput(structuredTextEditor.getEditorInput()); // title should always change when input changes. // create runnable for following post call Runnable runnable = new Runnable() { public void run() { _firePropertyChange(IWorkbenchPart.PROP_TITLE); } }; // Update is just to post things on the display queue // (thread). We have to do this to get the dirty // property to get updated after other things on the // queue are executed. postOnDisplayQue(runnable); } } break; } case IWorkbenchPart.PROP_TITLE : { // update the input if the title is changed if (source == structuredTextEditor) { if (structuredTextEditor.getEditorInput() != getEditorInput()) { setInput(structuredTextEditor.getEditorInput()); } } break; } default : { // propagate changes. Is this needed? Answer: Yes. if (source == structuredTextEditor) { firePropertyChange(propId); } break; } } } // Should override to set the input to the design viewer for a new document change // ie. when doing a saveAs protected void setInputToGraphicalViewer(IDocument newInput) { } protected void setInput(IEditorInput input) { super.setInput(input); if (graphicalViewer != null) { setInputToGraphicalViewer(getDocument()); } } protected IDocument getDocument() { IDocument document = null; if (structuredTextEditor != null) { document = structuredTextEditor.getDocumentProvider().getDocument(structuredTextEditor.getEditorInput()); } return document; } /** * @return */ protected SelectionSynchronizer getSelectionSynchronizer() { if (synchronizer == null) synchronizer = new SelectionSynchronizer(); return synchronizer; } public CommonSelectionManager getSelectionManager() { if (selectionProvider == null) { selectionProvider = new CommonSelectionManager(this); } return selectionProvider; } /* * This method is just to make firePropertyChanged accessbible from some * (anonomous) inner classes. */ protected void _firePropertyChange(int property) { super.firePropertyChange(property); } /** * Posts the update code "behind" the running operation. */ protected void postOnDisplayQue(Runnable runnable) { IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchWindow[] windows = workbench.getWorkbenchWindows(); if (windows != null && windows.length > 0) { Display display = windows[0].getShell().getDisplay(); display.asyncExec(runnable); } else runnable.run(); } /** * The <code>MultiPageEditorPart</code> implementation of this * <code>IWorkbenchPart</code> method disposes all nested editors. * Subclasses may extend. */ public void dispose() { getCommandStack().removeCommandStackListener(this); ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); actionRegistry.dispose(); if (structuredTextEditor != null) { structuredTextEditor.removePropertyListener(this); } structuredTextEditor = null; editDomain = null; fOutlinePage = null; synchronizer = null; actionRegistry = null; selectionProvider = null; graphicalViewer = null; if (modeCombo != null && !modeCombo.isDisposed()) { modeCombo.removeSelectionListener(modeComboListener); modeComboListener = null; } if (fActivationListener != null) { fActivationListener.dispose(); fActivationListener = null; } super.dispose(); } protected CommandStack getCommandStack() { return editDomain.getCommandStack(); } /* * (non-Javadoc) Method declared on IEditorPart */ public void gotoMarker(IMarker marker) { setActivePage(SOURCE_PAGE_INDEX); IDE.gotoMarker(structuredTextEditor, marker); } /** * The <code>MultiPageEditorExample</code> implementation of this method * checks that the input is an instance of <code>IFileEditorInput</code>. */ public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException { super.init(site, editorInput); getCommandStack().addCommandStackListener(this); initializeActionRegistry(); String title = null; if (getEditorInput() != null) { title = getEditorInput().getName(); } setPartName(title); fActivationListener = new CommonActivationListener(site.getWorkbenchWindow().getPartService()); } protected void initializeActionRegistry() { createActions(); } protected ActionRegistry getActionRegistry() { if (actionRegistry == null) actionRegistry = new ActionRegistry(); return actionRegistry; } public Object getAdapter(Class type) { if (type == CommandStack.class) return getCommandStack(); if (type == ActionRegistry.class) return getActionRegistry(); if (type == EditorModeManager.class) return getEditorModeManager(); if (type == IGotoMarker.class) { return new IGotoMarker() { public void gotoMarker(IMarker marker) { CommonMultiPageEditor.this.gotoMarker(marker); } }; } if (type == ITextEditor.class) return getTextEditor(); return super.getAdapter(type); } protected DefaultEditDomain getEditDomain() { return editDomain; } /** * From GEF GraphicalEditor A convenience method for updating a set of actions * defined by the given List of action IDs. The actions are found by looking * up the ID in the {@link #getActionRegistry() action registry}. If the * corresponding action is an {@link UpdateAction}, it will have its * <code>update()</code> method called. * * @param actionIds * the list of IDs to update */ protected void updateActions(List actionIds) { ActionRegistry registry = getActionRegistry(); Iterator iter = actionIds.iterator(); while (iter.hasNext()) { IAction action = registry.getAction(iter.next()); if (action instanceof UpdateAction) ((UpdateAction) action).update(); } } public StructuredTextEditor getTextEditor() { return structuredTextEditor; } protected Composite createGraphPageComposite() { Composite parent = new Composite(getContainer(), SWT.NONE); parent.setLayout(new FillLayout()); return parent; } protected void createGraphPage() { Composite parent = createGraphPageComposite(); graphicalViewer = getGraphicalViewer(); graphicalViewer.createControl(parent); getEditDomain().addViewer(graphicalViewer); configureGraphicalViewer(); hookGraphicalViewer(); int index = addPage(parent); setPageText(index, Messages._UI_LABEL_DESIGN); } /** * @see org.eclipse.ui.part.MultiPageEditorPart#createSite(org.eclipse.ui.IEditorPart) */ protected IEditorSite createSite(IEditorPart editor) { IEditorSite site = null; if (editor == structuredTextEditor) { site = new MultiPageEditorSite(this, editor) { public String getId() { // sets this id so nested editor is considered xml source // page return ContentTypeIdForXML.ContentTypeID_XML + ".source"; //$NON-NLS-1$; } }; } else { site = super.createSite(editor); } return site; } protected void createSourcePage() { structuredTextEditor = new StructuredTextEditor(); try { int index = addPage(structuredTextEditor, getEditorInput()); setPageText(index, Messages._UI_LABEL_SOURCE); structuredTextEditor.update(); structuredTextEditor.setEditorPart(this); structuredTextEditor.addPropertyListener(this); firePropertyChange(PROP_TITLE); } catch (PartInitException e) { ErrorDialog.openError(getSite().getShell(), "Error creating nested text editor", null, e.getStatus()); //$NON-NLS-1$ } } protected void configureGraphicalViewer() { graphicalViewer.getControl().setBackground(ColorConstants.listBackground); // Set the root edit part // ScalableFreeformRootEditPart root = new ScalableFreeformRootEditPart(); RootEditPart root = new RootEditPart(); ZoomManager zoomManager = root.getZoomManager(); List zoomLevelContributions = new ArrayList(3); zoomLevelContributions.add(ZoomManager.FIT_ALL); zoomLevelContributions.add(ZoomManager.FIT_WIDTH); zoomLevelContributions.add(ZoomManager.FIT_HEIGHT); zoomManager.setZoomLevelContributions(zoomLevelContributions); double[] zoomLevels = {.10, .25, .5, .75, 1.0, 1.25, 1.5, 2.0, 2.5, 3, 4, 5}; zoomManager.setZoomLevels(zoomLevels); IAction zoomIn = new ZoomInAction(zoomManager); IAction zoomOut = new ZoomOutAction(zoomManager); getActionRegistry().registerAction(zoomIn); getActionRegistry().registerAction(zoomOut); getSite().getKeyBindingService().registerAction(zoomIn); getSite().getKeyBindingService().registerAction(zoomOut); //ConnectionLayer connectionLayer = (ConnectionLayer) root.getLayer(LayerConstants.CONNECTION_LAYER); //connectionLayer.setConnectionRouter(new BendpointConnectionRouter()); //connectionLayer.setConnectionRouter(new ShortestPathConnectionRouter(connectionLayer)); // connectionLayer.setVisible(false); // Zoom zoomManager.setZoom(1.0); // Scroll-wheel Zoom graphicalViewer.setProperty(MouseWheelHandler.KeyGenerator.getKey(SWT.CTRL), MouseWheelZoomHandler.SINGLETON); graphicalViewer.setRootEditPart(root); graphicalViewer.setEditPartFactory(getEditPartFactory()); } protected void hookGraphicalViewer() { getSelectionSynchronizer().addViewer(graphicalViewer); } protected abstract ScrollingGraphicalViewer getGraphicalViewer(); protected abstract EditPartFactory getEditPartFactory(); protected abstract void initializeGraphicalViewer(); protected EditorModeManager getEditorModeManager() { if (editorModeManager == null) { editorModeManager = createEditorModeManager(); editorModeManager.addListener(this); editorModeManager.init(); } return editorModeManager; } protected abstract EditorModeManager createEditorModeManager(); private String getEditModeName(EditorMode editorMode, ProductCustomizationProvider productCustomizationProvider) { String result = editorMode.getDisplayName(); if (productCustomizationProvider != null) { String customizedName = productCustomizationProvider.getEditorModeDisplayName(editorMode.getId()); if (customizedName != null) { result = customizedName; } } return result; } class EditorModeAndCustomizedName { EditorMode mode; String name; } protected void createViewModeToolbar(Composite parent) { EditorModeManager manager = (EditorModeManager)getAdapter(EditorModeManager.class); final ProductCustomizationProvider productCustomizationProvider = (ProductCustomizationProvider)getAdapter(ProductCustomizationProvider.class); EditorMode [] modeList = manager.getModes(); int modeListLength = modeList.length; boolean showToolBar = modeListLength > 1; if (showToolBar) { toolbar = new Composite(parent, SWT.FLAT | SWT.DRAW_TRANSPARENT); toolbar.setBackground(ColorConstants.listBackground); toolbar.addPaintListener(new PaintListener() { public void paintControl(PaintEvent e) { Rectangle clientArea = toolbar.getClientArea(); e.gc.setForeground(ColorConstants.lightGray); e.gc.drawRectangle(clientArea.x, clientArea.y, clientArea.width - 1, clientArea.height - 1); } }); GridLayout gridLayout = new GridLayout(3, false); toolbar.setLayout(gridLayout); Label label = new Label(toolbar, SWT.FLAT | SWT.HORIZONTAL); label.setBackground(ColorConstants.listBackground); label.setText(Messages._UI_LABEL_VIEW); label.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER)); modeCombo = new FlatCCombo(toolbar, SWT.FLAT); modeCombo.setEditable(false); modeCombo.setText(getEditModeName(manager.getCurrentMode(), productCustomizationProvider)); GC gc = new GC(modeCombo); int textWidth = 0; maxLength = 0; // populate combo with modes editorModeAndCustomizedNames = new EditorModeAndCustomizedName[modeListLength]; for (int i = 0; i < modeListLength; i++) { EditorModeAndCustomizedName entry = new EditorModeAndCustomizedName(); editorModeAndCustomizedNames[i] = entry; entry.name = getEditModeName(modeList[i], productCustomizationProvider); entry.mode = modeList[i]; } Arrays.sort(editorModeAndCustomizedNames, new Comparator() { public int compare(Object arg0, Object arg1) { EditorModeAndCustomizedName a = (EditorModeAndCustomizedName)arg0; EditorModeAndCustomizedName b = (EditorModeAndCustomizedName)arg1; return Collator.getInstance().compare(a.name, b.name); } }); for (int i = 0; i < editorModeAndCustomizedNames.length; i++ ) { EditorModeAndCustomizedName entry = editorModeAndCustomizedNames[i]; modeCombo.add(entry.name); maxLength = Math.max (gc.stringExtent(entry.name).x, maxLength); int approxWidthOfStrings = Math.max (gc.stringExtent(entry.name).x, textWidth); if (approxWidthOfStrings > maxLength) maxLength = approxWidthOfStrings; } maxLength += gc.stringExtent(Messages._UI_LABEL_VIEW).x; gc.dispose(); modeComboListener = new ModeComboListener(); modeCombo.addSelectionListener(modeComboListener); modeCombo.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_END)); modeCombo.setBackground(toolbar.getBackground()); ImageHyperlink hyperlink = new ImageHyperlink(toolbar, SWT.FLAT); hyperlink.setBackground(ColorConstants.white); // https://bugs.eclipse.org/bugs/show_bug.cgi?id=154457 Image image = XSDEditorPlugin.getDefault().getIconImage("etool16/help_contents"); hyperlink.setImage(image); hyperlink.setToolTipText(Messages._UI_HOVER_VIEW_MODE_DESCRIPTION); hyperlink.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER)); hyperlink.addMouseListener(new MouseAdapter() { public void mouseDown(MouseEvent e) { if (productCustomizationProvider != null) { productCustomizationProvider.handleAction("showEditorModeHelp"); } } }); } } protected class ModeComboListener implements SelectionListener { public ModeComboListener() { } public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { if (e.widget == modeCombo) { EditorModeManager manager = (EditorModeManager)getAdapter(EditorModeManager.class); EditorMode [] modeList = manager.getModes(); if (modeList.length >= 1) { EditorModeAndCustomizedName entry = editorModeAndCustomizedNames[modeCombo.getSelectionIndex()]; if (manager.getCurrentMode() != entry.mode) { manager.setCurrentMode(entry.mode); storeCurrentModePreference(entry.mode.getId()); ProductCustomizationProvider productCustomizationProvider = (ProductCustomizationProvider) getAdapter(ProductCustomizationProvider.class); if (productCustomizationProvider != null) { productCustomizationProvider.handleAction("editorModeChanged"); } } } } } } protected void storeCurrentModePreference(String id) { // Don't do anything as default. Allow extenders to implement. } protected class CommonActivationListener implements IPartListener, IWindowListener { /** Cache of the active workbench part. */ private IWorkbenchPart fActivePart; /** Indicates whether activation handling is currently be done. */ private boolean fIsHandlingActivation = false; /** * The part service. * * @since 3.1 */ private IPartService fPartService; /** * Creates this activation listener. * * @param partService * the part service on which to add the part listener * @since 3.1 */ public CommonActivationListener(IPartService partService) { fPartService = partService; fPartService.addPartListener(this); PlatformUI.getWorkbench().addWindowListener(this); } /** * Disposes this activation listener. * * @since 3.1 */ public void dispose() { fPartService.removePartListener(this); PlatformUI.getWorkbench().removeWindowListener(this); fPartService = null; } /* * @see IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart) */ public void partActivated(IWorkbenchPart part) { fActivePart = part; handleActivation(); } /* * @see IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart) */ public void partBroughtToTop(IWorkbenchPart part) { // do nothing } /* * @see IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart) */ public void partClosed(IWorkbenchPart part) { // do nothing } /* * @see IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart) */ public void partDeactivated(IWorkbenchPart part) { fActivePart = null; } /* * @see IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart) */ public void partOpened(IWorkbenchPart part) { if (CommonMultiPageEditor.this.equals(part)) { doPostEditorOpenTasks(); } } /** * Handles the activation triggering a element state check in the editor. */ void handleActivation() { if (fIsHandlingActivation || (getTextEditor() == null)) { return; } if (fActivePart == CommonMultiPageEditor.this) { fIsHandlingActivation = true; try { getTextEditor().safelySanityCheckState(getEditorInput()); } finally { fIsHandlingActivation = false; } } } /* * @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow) * @since 3.1 */ public void windowActivated(IWorkbenchWindow window) { if (window == getEditorSite().getWorkbenchWindow()) { /* * Workaround for problem described in * http://dev.eclipse.org/bugs/show_bug.cgi?id=11731 Will be removed * when SWT has solved the problem. */ window.getShell().getDisplay().asyncExec(new Runnable() { public void run() { handleActivation(); } }); } } /* * @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow) * @since 3.1 */ public void windowDeactivated(IWorkbenchWindow window) { // do nothing } /* * @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow) * @since 3.1 */ public void windowClosed(IWorkbenchWindow window) { // do nothing } /* * @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow) * @since 3.1 */ public void windowOpened(IWorkbenchWindow window) { // do nothing } } public boolean isSourcePageActive() { return getActivePage() == SOURCE_PAGE_INDEX; } /** * Invoked during IPartListener#partOpened. Derived classes can override * to provide specialized behaviour. */ protected void doPostEditorOpenTasks() { // Nothing to do in the base class. } }