/******************************************************************************* * Copyright (c) 2007, 2010 Association for Decentralized Information Management * in Industry THTH ry. * 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: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.browsing.ui.swt; /******************************************************************************* * Copyright (c) 2000, 2008 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 *******************************************************************************/ import java.util.ArrayList; import org.eclipse.core.runtime.Assert; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ILabelDecorator; import org.eclipse.jface.viewers.IPostSelectionProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorActionBarContributor; import org.eclipse.ui.IKeyBindingService; import org.eclipse.ui.INestableKeyBindingService; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.internal.PartSite; import org.eclipse.ui.internal.PopupMenuExtender; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.internal.services.INestable; import org.eclipse.ui.internal.services.IServiceLocatorCreator; import org.eclipse.ui.internal.services.ServiceLocator; import org.eclipse.ui.part.MultiPageEditorSite; import org.eclipse.ui.services.IDisposable; import org.eclipse.ui.services.IServiceLocator; /** * Site for a nested editor within a multi-page editor. Selection is handled by * forwarding the event to the multi-page editor's selection listeners; most * other methods are forwarded to the multi-page editor's site. *

* The base implementation of MultiPageEditor.createSite creates * an instance of this class. This class may be instantiated or subclassed. *

* * TODO: copy e4 changes from MultiPageEditorSite to this class as seen fit */ @SuppressWarnings({"restriction","deprecation","rawtypes"}) public class TabbedPropertyPageViewSite implements IViewSite, INestable { /** * The nested editor. */ private final IViewPart editor; /** * The list of popup menu extenders; null if none registered. */ private ArrayList menuExtenders; /** * The multi-page editor. */ private final TabbedPropertyPage multiPageEditor; /** * The post selection changed listener. */ private ISelectionChangedListener postSelectionChangedListener = null; /** * The selection change listener, initialized lazily; null if * not yet created. */ private ISelectionChangedListener selectionChangedListener = null; /** * The selection provider; null if none. * * @see MultiPageEditorSite#setSelectionProvider(ISelectionProvider) */ private ISelectionProvider selectionProvider = null; /** * The cached copy of the key binding service specific to this multi-page * editor site. This value is null if it is not yet * initialized. */ private IKeyBindingService service = null; /** * The local service locator for this multi-page editor site. This value is * never null. */ private final ServiceLocator serviceLocator; private IEclipseContext e4Context; /** * Creates a site for the given editor nested within the given multi-page * editor. * * @param multiPageEditor * the multi-page editor * @param editor * the nested editor */ public TabbedPropertyPageViewSite(TabbedPropertyPage multiPageEditor, IViewPart editor) { Assert.isNotNull(multiPageEditor); Assert.isNotNull(editor); this.multiPageEditor = multiPageEditor; this.editor = editor; final IServiceLocator parentServiceLocator = multiPageEditor.getSite(); IServiceLocatorCreator slc = (IServiceLocatorCreator) parentServiceLocator .getService(IServiceLocatorCreator.class); this.serviceLocator = (ServiceLocator) slc.createServiceLocator( parentServiceLocator, null, new IDisposable() { @Override public void dispose() { // final Control control = ((PartSite)getMultiPageEditor().getSite()).getPane().getControl(); // if (control != null && !control.isDisposed()) { // ((PartSite)getMultiPageEditor().getSite()).getPane().doHide(); // } } }); e4Context = ((PartSite)editor.getViewSite()).getContext().createChild("TabbedPropertyPageViewSite"); serviceLocator.setContext(e4Context); initializeDefaultServices(); } /** * Initialize the slave services for this site. */ private void initializeDefaultServices() { // serviceLocator.registerService(IMultiPageEditorSiteHolder.class, // new ITabbedPropertyPageSiteHolder() { // public TabbedPropertyPageViewSite getSite() { // return TabbedPropertyPageViewSite.this; // } // }); // Not possible to initialize this service for a view site: // serviceLocator.registerService(IWorkbenchLocationService.class, // new WorkbenchLocationService(IServiceScopes.MPESITE_SCOPE, // getWorkbenchWindow().getWorkbench(), // getWorkbenchWindow(), getMultiPageEditor().getSite(), // this, null, 3)); } /** * Notifies the multi page editor service that the component within which it * exists has become active. * * @since 3.2 */ public final void activate() { e4Context.activate(); serviceLocator.activate(); } /** * Notifies the multi page editor service that the component within which it * exists has been deactived. * * @since 3.2 */ public final void deactivate() { serviceLocator.deactivate(); e4Context.deactivate(); } /** * Dispose the contributions. */ public void dispose() { if (menuExtenders != null) { for (int i = 0; i < menuExtenders.size(); i++) { ((PopupMenuExtender) menuExtenders.get(i)).dispose(); } menuExtenders = null; } // Remove myself from the list of nested key binding services. if (service != null) { IKeyBindingService parentService = getMultiPageEditor().getSite() .getKeyBindingService(); if (parentService instanceof INestableKeyBindingService) { INestableKeyBindingService nestableParent = (INestableKeyBindingService) parentService; nestableParent.removeKeyBindingService(this); } service = null; } if (serviceLocator != null) { serviceLocator.dispose(); } e4Context.dispose(); } /** * The MultiPageEditorSite implementation of this * IEditorSite method returns null, since * nested editors do not have their own action bar contributor. * * @return null */ public IEditorActionBarContributor getActionBarContributor() { return null; } /** * The MultiPageEditorSite implementation of this * IEditorSite method forwards to the multi-page editor to * return the action bars. * * @return The action bars from the parent multi-page editor. */ public IActionBars getActionBars() { return ((IViewSite)multiPageEditor.getSite()).getActionBars(); } /* * (non-Javadoc) * * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) */ public Object getAdapter(Class adapter) { return null; } /** * The MultiPageEditorSite implementation of this * IWorkbenchPartSite method forwards to the multi-page * editor to return the decorator manager. * * @return The decorator from the workbench window. * @deprecated use IWorkbench.getDecoratorManager() */ @Deprecated public ILabelDecorator getDecoratorManager() { return getWorkbenchWindow().getWorkbench().getDecoratorManager() .getLabelDecorator(); } // /** // * Returns the nested editor. // * // * @return the nested editor // */ // public IEditorPart getEditor() { // return editor; // } /** * The MultiPageEditorSite implementation of this * IWorkbenchPartSite method returns an empty string since * the nested editor is not created from the registry. * * @return An empty string. */ public String getId() { return ""; //$NON-NLS-1$ } /* * (non-Javadoc) Method declared on IEditorSite. */ public IKeyBindingService getKeyBindingService() { if (service == null) { service = getMultiPageEditor().getSite() .getKeyBindingService(); if (service instanceof INestableKeyBindingService) { INestableKeyBindingService nestableService = (INestableKeyBindingService) service; service = nestableService.getKeyBindingService(this); } else { /* * This is an internal reference, and should not be copied by * client code. If you are thinking of copying this, DON'T DO * IT. */ WorkbenchPlugin .log("MultiPageEditorSite.getKeyBindingService() Parent key binding service was not an instance of INestableKeyBindingService. It was an instance of " + service.getClass().getName() + " instead."); //$NON-NLS-1$ //$NON-NLS-2$ } } return service; } /** * Returns the multi-page editor. * * @return the multi-page editor */ public TabbedPropertyPage getMultiPageEditor() { return multiPageEditor; } /** * The MultiPageEditorSite implementation of this * IWorkbenchPartSite method forwards to the multi-page * editor to return the workbench page. * * @return The workbench page in which this editor site resides. */ public IWorkbenchPage getPage() { return getMultiPageEditor().getSite().getPage(); } /* * (non-Javadoc) * * @see org.eclipse.ui.IWorkbenchPartSite#getPart() */ public IWorkbenchPart getPart() { return editor; } /** * The MultiPageEditorSite implementation of this * IWorkbenchPartSite method returns an empty string since * the nested editor is not created from the registry. * * @return An empty string. */ public String getPluginId() { return ""; //$NON-NLS-1$ } /** * Returns the post selection change listener which listens to the nested * editor's selection changes. * * @return the post selection change listener. */ private ISelectionChangedListener getPostSelectionChangedListener() { if (postSelectionChangedListener == null) { postSelectionChangedListener = new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { TabbedPropertyPageViewSite.this.handlePostSelectionChanged(event); } }; } return postSelectionChangedListener; } /** * The MultiPageEditorSite implementation of this * IWorkbenchPartSite method returns an empty string since * the nested editor is not created from the registry. * * @return An empty string. */ public String getRegisteredName() { return ""; //$NON-NLS-1$ } /** * Returns the selection changed listener which listens to the nested * editor's selection changes, and calls handleSelectionChanged. * * @return the selection changed listener */ private ISelectionChangedListener getSelectionChangedListener() { if (selectionChangedListener == null) { selectionChangedListener = new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { TabbedPropertyPageViewSite.this.handleSelectionChanged(event); } }; } return selectionChangedListener; } /** * The MultiPageEditorSite implementation of this * IWorkbenchPartSite method returns the selection provider * set by setSelectionProvider. * * @return The current selection provider. */ public ISelectionProvider getSelectionProvider() { return selectionProvider; } public final Object getService(final Class key) { return serviceLocator.getService(key); } /** * The MultiPageEditorSite implementation of this * IWorkbenchPartSite method forwards to the multi-page * editor to return the shell. * * @return The shell in which this editor site resides. */ public Shell getShell() { return getMultiPageEditor().getSite().getShell(); } /** * The MultiPageEditorSite implementation of this * IWorkbenchPartSite method forwards to the multi-page * editor to return the workbench window. * * @return The workbench window in which this editor site resides. */ public IWorkbenchWindow getWorkbenchWindow() { return getMultiPageEditor().getSite().getWorkbenchWindow(); } /** * Handles a post selection changed even from the nexted editor. *

* Subclasses may extend or reimplement this method * * @param event the event * * @since 3.2 */ protected void handlePostSelectionChanged(SelectionChangedEvent event) { ISelectionProvider parentProvider = getMultiPageEditor().getSite() .getSelectionProvider(); if (parentProvider instanceof TabbedPageSelectionProvider) { SelectionChangedEvent newEvent = new SelectionChangedEvent( parentProvider, event.getSelection()); TabbedPageSelectionProvider prov = (TabbedPageSelectionProvider) parentProvider; prov.firePostSelectionChanged(newEvent); } } /** * Handles a selection changed event from the nested editor. The default * implementation gets the selection provider from the multi-page editor's * site, and calls fireSelectionChanged on it (only if it is * an instance of MultiPageSelectionProvider), passing a new * event object. *

* Subclasses may extend or reimplement this method. *

* * @param event * the event */ protected void handleSelectionChanged(SelectionChangedEvent event) { ISelectionProvider parentProvider = getMultiPageEditor().getSite() .getSelectionProvider(); if (parentProvider instanceof TabbedPageSelectionProvider) { SelectionChangedEvent newEvent = new SelectionChangedEvent( parentProvider, event.getSelection()); TabbedPageSelectionProvider prov = (TabbedPageSelectionProvider) parentProvider; prov.fireSelectionChanged(newEvent); } } public final boolean hasService(final Class key) { return serviceLocator.hasService(key); } /** * The MultiPageEditorSite implementation of this * IWorkbenchPartSite method forwards to the multi-page * editor for registration. * * @param menuManager * The menu manager * @param selProvider * The selection provider. */ public void registerContextMenu(MenuManager menuManager, ISelectionProvider selProvider) { getMultiPageEditor().getSite().registerContextMenu(menuManager, selProvider); } public final void registerContextMenu(final MenuManager menuManager, final ISelectionProvider selectionProvider, final boolean includeEditorInput) { registerContextMenu(getId(), menuManager, selectionProvider, includeEditorInput); } /** * The MultiPageEditorSite implementation of this * IWorkbenchPartSite method forwards to the multi-page * editor for registration. * * @param menuID * The identifier for the menu. * @param menuMgr * The menu manager * @param selProvider * The selection provider. */ public void registerContextMenu(String menuID, MenuManager menuMgr, ISelectionProvider selProvider) { if (menuExtenders == null) { menuExtenders = new ArrayList(1); } PartSite.registerContextMenu(menuID, menuMgr, selProvider, true, editor, e4Context, menuExtenders); } public final void registerContextMenu(final String menuId, final MenuManager menuManager, final ISelectionProvider selectionProvider, final boolean includeEditorInput) { if (menuExtenders == null) { menuExtenders = new ArrayList(1); } PartSite.registerContextMenu(menuId, menuManager, selectionProvider, includeEditorInput, editor, e4Context, menuExtenders); } /** * The MultiPageEditorSite implementation of this * IWorkbenchPartSite method remembers the selection * provider, and also hooks a listener on it, which calls * handleSelectionChanged when a selection changed event * occurs. * * @param provider * The selection provider. * @see MultiPageEditorSite#handleSelectionChanged(SelectionChangedEvent) */ public void setSelectionProvider(ISelectionProvider provider) { ISelectionProvider oldSelectionProvider = selectionProvider; selectionProvider = provider; if (oldSelectionProvider != null) { oldSelectionProvider .removeSelectionChangedListener(getSelectionChangedListener()); if (oldSelectionProvider instanceof IPostSelectionProvider) { ((IPostSelectionProvider) oldSelectionProvider) .removePostSelectionChangedListener(getPostSelectionChangedListener()); } } if (selectionProvider != null) { selectionProvider .addSelectionChangedListener(getSelectionChangedListener()); if (selectionProvider instanceof IPostSelectionProvider) { ((IPostSelectionProvider) selectionProvider) .addPostSelectionChangedListener(getPostSelectionChangedListener()); } } } @Override public String getSecondaryId() { return ((IViewSite)multiPageEditor.getSite()).getSecondaryId(); } }