]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/TabbedPropertyPageViewSite.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.browsing.ui.swt / src / org / simantics / browsing / ui / swt / TabbedPropertyPageViewSite.java
index 4b09b40e3d0b74d5a5724599d68c6a9e24bfad65..a5a3fcd472f750fca4fb337fd22b5ebe4ca40558 100644 (file)
-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *     VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.browsing.ui.swt;\r
-\r
-/*******************************************************************************\r
- * Copyright (c) 2000, 2008 IBM Corporation and others.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *     IBM Corporation - initial API and implementation\r
- *******************************************************************************/\r
-\r
-import java.util.ArrayList;\r
-\r
-import org.eclipse.core.runtime.Assert;\r
-import org.eclipse.e4.core.contexts.IEclipseContext;\r
-import org.eclipse.jface.action.MenuManager;\r
-import org.eclipse.jface.viewers.ILabelDecorator;\r
-import org.eclipse.jface.viewers.IPostSelectionProvider;\r
-import org.eclipse.jface.viewers.ISelectionChangedListener;\r
-import org.eclipse.jface.viewers.ISelectionProvider;\r
-import org.eclipse.jface.viewers.SelectionChangedEvent;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.ui.IActionBars;\r
-import org.eclipse.ui.IEditorActionBarContributor;\r
-import org.eclipse.ui.IKeyBindingService;\r
-import org.eclipse.ui.INestableKeyBindingService;\r
-import org.eclipse.ui.IViewPart;\r
-import org.eclipse.ui.IViewSite;\r
-import org.eclipse.ui.IWorkbenchPage;\r
-import org.eclipse.ui.IWorkbenchPart;\r
-import org.eclipse.ui.IWorkbenchWindow;\r
-import org.eclipse.ui.internal.PartSite;\r
-import org.eclipse.ui.internal.PopupMenuExtender;\r
-import org.eclipse.ui.internal.WorkbenchPlugin;\r
-import org.eclipse.ui.internal.services.INestable;\r
-import org.eclipse.ui.internal.services.IServiceLocatorCreator;\r
-import org.eclipse.ui.internal.services.ServiceLocator;\r
-import org.eclipse.ui.part.MultiPageEditorSite;\r
-import org.eclipse.ui.services.IDisposable;\r
-import org.eclipse.ui.services.IServiceLocator;\r
-\r
-/**\r
- * Site for a nested editor within a multi-page editor. Selection is handled by\r
- * forwarding the event to the multi-page editor's selection listeners; most\r
- * other methods are forwarded to the multi-page editor's site.\r
- * <p>\r
- * The base implementation of <code>MultiPageEditor.createSite</code> creates\r
- * an instance of this class. This class may be instantiated or subclassed.\r
- * </p>\r
- * \r
- * TODO: copy e4 changes from MultiPageEditorSite to this class as seen fit\r
- */\r
-@SuppressWarnings({"restriction","deprecation","rawtypes"})\r
-public class TabbedPropertyPageViewSite implements IViewSite, INestable {\r
-\r
-    /**\r
-     * The nested editor.\r
-     */\r
-    private final IViewPart editor;\r
-\r
-    /**\r
-     * The list of popup menu extenders; <code>null</code> if none registered.\r
-     */\r
-    private ArrayList menuExtenders;\r
-\r
-    /**\r
-     * The multi-page editor.\r
-     */\r
-    private final TabbedPropertyPage multiPageEditor;\r
-\r
-    /**\r
-     * The post selection changed listener.\r
-     */\r
-    private ISelectionChangedListener postSelectionChangedListener = null;\r
-\r
-    /**\r
-     * The selection change listener, initialized lazily; <code>null</code> if\r
-     * not yet created.\r
-     */\r
-    private ISelectionChangedListener selectionChangedListener = null;\r
-\r
-    /**\r
-     * The selection provider; <code>null</code> if none.\r
-     * \r
-     * @see MultiPageEditorSite#setSelectionProvider(ISelectionProvider)\r
-     */\r
-    private ISelectionProvider selectionProvider = null;\r
-\r
-    /**\r
-     * The cached copy of the key binding service specific to this multi-page\r
-     * editor site. This value is <code>null</code> if it is not yet\r
-     * initialized.\r
-     */\r
-    private IKeyBindingService service = null;\r
-\r
-    /**\r
-     * The local service locator for this multi-page editor site. This value is\r
-     * never <code>null</code>.\r
-     */\r
-    private final ServiceLocator serviceLocator;\r
-\r
-       private IEclipseContext e4Context;\r
-\r
-    /**\r
-     * Creates a site for the given editor nested within the given multi-page\r
-     * editor.\r
-     * \r
-     * @param multiPageEditor\r
-     *            the multi-page editor\r
-     * @param editor\r
-     *            the nested editor\r
-     */\r
-    public TabbedPropertyPageViewSite(TabbedPropertyPage multiPageEditor,\r
-            IViewPart editor) {\r
-        Assert.isNotNull(multiPageEditor);\r
-        Assert.isNotNull(editor);\r
-        this.multiPageEditor = multiPageEditor;\r
-        this.editor = editor;\r
-\r
-        final IServiceLocator parentServiceLocator = multiPageEditor.getSite();\r
-        IServiceLocatorCreator slc = (IServiceLocatorCreator) parentServiceLocator\r
-        .getService(IServiceLocatorCreator.class);\r
-        this.serviceLocator = (ServiceLocator) slc.createServiceLocator(\r
-                parentServiceLocator, null, new IDisposable() {\r
-                    @Override\r
-                    public void dispose() {\r
-//                        final Control control = ((PartSite)getMultiPageEditor().getSite()).getPane().getControl();\r
-//                        if (control != null && !control.isDisposed()) {\r
-//                            ((PartSite)getMultiPageEditor().getSite()).getPane().doHide();\r
-//                        }\r
-                    }\r
-                });\r
-        e4Context = ((PartSite)editor.getViewSite()).getContext().createChild("TabbedPropertyPageViewSite");\r
-        serviceLocator.setContext(e4Context);\r
-        initializeDefaultServices();\r
-    }\r
-\r
-    /**\r
-     * Initialize the slave services for this site.\r
-     */\r
-    private void initializeDefaultServices() {\r
-//        serviceLocator.registerService(IMultiPageEditorSiteHolder.class,\r
-//                new ITabbedPropertyPageSiteHolder() {\r
-//                    public TabbedPropertyPageViewSite getSite() {\r
-//                        return TabbedPropertyPageViewSite.this;\r
-//                    }\r
-//                });\r
-        // Not possible to initialize this service for a view site:\r
-//             serviceLocator.registerService(IWorkbenchLocationService.class,\r
-//                             new WorkbenchLocationService(IServiceScopes.MPESITE_SCOPE,\r
-//                                             getWorkbenchWindow().getWorkbench(),\r
-//                                             getWorkbenchWindow(), getMultiPageEditor().getSite(),\r
-//                                             this, null, 3));\r
-    }\r
-\r
-    /**\r
-     * Notifies the multi page editor service that the component within which it\r
-     * exists has become active.\r
-     * \r
-     * @since 3.2\r
-     */\r
-    public final void activate() {\r
-       e4Context.activate();\r
-        serviceLocator.activate();\r
-    }\r
-\r
-    /**\r
-     * Notifies the multi page editor service that the component within which it\r
-     * exists has been deactived.\r
-     * \r
-     * @since 3.2\r
-     */\r
-    public final void deactivate() {\r
-        serviceLocator.deactivate();\r
-        e4Context.deactivate();\r
-    }\r
-\r
-    /**\r
-     * Dispose the contributions.\r
-     */\r
-    public void dispose() {\r
-        if (menuExtenders != null) {\r
-            for (int i = 0; i < menuExtenders.size(); i++) {\r
-                ((PopupMenuExtender) menuExtenders.get(i)).dispose();\r
-            }\r
-            menuExtenders = null;\r
-        }\r
-\r
-        // Remove myself from the list of nested key binding services.\r
-        if (service != null) {\r
-            IKeyBindingService parentService = getMultiPageEditor().getSite()\r
-            .getKeyBindingService();\r
-            if (parentService instanceof INestableKeyBindingService) {\r
-                INestableKeyBindingService nestableParent = (INestableKeyBindingService) parentService;\r
-                nestableParent.removeKeyBindingService(this);\r
-            }\r
-            service = null;\r
-        }\r
-\r
-        if (serviceLocator != null) {\r
-            serviceLocator.dispose();\r
-        }\r
-        e4Context.dispose();\r
-    }\r
-\r
-    /**\r
-     * The <code>MultiPageEditorSite</code> implementation of this\r
-     * <code>IEditorSite</code> method returns <code>null</code>, since\r
-     * nested editors do not have their own action bar contributor.\r
-     * \r
-     * @return <code>null</code>\r
-     */\r
-    public IEditorActionBarContributor getActionBarContributor() {\r
-        return null;\r
-    }\r
-\r
-    /**\r
-     * The <code>MultiPageEditorSite</code> implementation of this\r
-     * <code>IEditorSite</code> method forwards to the multi-page editor to\r
-     * return the action bars.\r
-     * \r
-     * @return The action bars from the parent multi-page editor.\r
-     */\r
-    public IActionBars getActionBars() {\r
-        return ((IViewSite)multiPageEditor.getSite()).getActionBars();\r
-    }\r
-\r
-    /*\r
-     * (non-Javadoc)\r
-     * \r
-     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)\r
-     */\r
-    public Object getAdapter(Class adapter) {\r
-        return null;\r
-    }\r
-\r
-    /**\r
-     * The <code>MultiPageEditorSite</code> implementation of this\r
-     * <code>IWorkbenchPartSite</code> method forwards to the multi-page\r
-     * editor to return the decorator manager.\r
-     * \r
-     * @return The decorator from the workbench window.\r
-     * @deprecated use IWorkbench.getDecoratorManager()\r
-     */\r
-    @Deprecated\r
-    public ILabelDecorator getDecoratorManager() {\r
-        return getWorkbenchWindow().getWorkbench().getDecoratorManager()\r
-        .getLabelDecorator();\r
-    }\r
-\r
-//    /**\r
-//     * Returns the nested editor.\r
-//     *\r
-//     * @return the nested editor\r
-//     */\r
-//    public IEditorPart getEditor() {\r
-//        return editor;\r
-//    }\r
-\r
-    /**\r
-     * The <code>MultiPageEditorSite</code> implementation of this\r
-     * <code>IWorkbenchPartSite</code> method returns an empty string since\r
-     * the nested editor is not created from the registry.\r
-     * \r
-     * @return An empty string.\r
-     */\r
-    public String getId() {\r
-        return ""; //$NON-NLS-1$\r
-    }\r
-\r
-    /*\r
-     * (non-Javadoc) Method declared on IEditorSite.\r
-     */\r
-    public IKeyBindingService getKeyBindingService() {\r
-        if (service == null) {\r
-            service = getMultiPageEditor().getSite()\r
-            .getKeyBindingService();\r
-            if (service instanceof INestableKeyBindingService) {\r
-                INestableKeyBindingService nestableService = (INestableKeyBindingService) service;\r
-                service = nestableService.getKeyBindingService(this);\r
-\r
-            } else {\r
-                /*\r
-                 * This is an internal reference, and should not be copied by\r
-                 * client code. If you are thinking of copying this, DON'T DO\r
-                 * IT.\r
-                 */\r
-                WorkbenchPlugin\r
-                .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$\r
-            }\r
-        }\r
-        return service;\r
-    }\r
-\r
-    /**\r
-     * Returns the multi-page editor.\r
-     * \r
-     * @return the multi-page editor\r
-     */\r
-    public TabbedPropertyPage getMultiPageEditor() {\r
-        return multiPageEditor;\r
-    }\r
-\r
-    /**\r
-     * The <code>MultiPageEditorSite</code> implementation of this\r
-     * <code>IWorkbenchPartSite</code> method forwards to the multi-page\r
-     * editor to return the workbench page.\r
-     * \r
-     * @return The workbench page in which this editor site resides.\r
-     */\r
-    public IWorkbenchPage getPage() {\r
-        return getMultiPageEditor().getSite().getPage();\r
-    }\r
-\r
-    /*\r
-     * (non-Javadoc)\r
-     * \r
-     * @see org.eclipse.ui.IWorkbenchPartSite#getPart()\r
-     */\r
-    public IWorkbenchPart getPart() {\r
-        return editor;\r
-    }\r
-\r
-    /**\r
-     * The <code>MultiPageEditorSite</code> implementation of this\r
-     * <code>IWorkbenchPartSite</code> method returns an empty string since\r
-     * the nested editor is not created from the registry.\r
-     * \r
-     * @return An empty string.\r
-     */\r
-    public String getPluginId() {\r
-        return ""; //$NON-NLS-1$\r
-    }\r
-\r
-    /**\r
-     * Returns the post selection change listener which listens to the nested\r
-     * editor's selection changes.\r
-     * \r
-     * @return the post selection change listener.\r
-     */\r
-    private ISelectionChangedListener getPostSelectionChangedListener() {\r
-        if (postSelectionChangedListener == null) {\r
-            postSelectionChangedListener = new ISelectionChangedListener() {\r
-                public void selectionChanged(SelectionChangedEvent event) {\r
-                    TabbedPropertyPageViewSite.this.handlePostSelectionChanged(event);\r
-                }\r
-            };\r
-        }\r
-        return postSelectionChangedListener;\r
-    }\r
-\r
-    /**\r
-     * The <code>MultiPageEditorSite</code> implementation of this\r
-     * <code>IWorkbenchPartSite</code> method returns an empty string since\r
-     * the nested editor is not created from the registry.\r
-     * \r
-     * @return An empty string.\r
-     */\r
-    public String getRegisteredName() {\r
-        return ""; //$NON-NLS-1$\r
-    }\r
-\r
-    /**\r
-     * Returns the selection changed listener which listens to the nested\r
-     * editor's selection changes, and calls <code>handleSelectionChanged</code>.\r
-     * \r
-     * @return the selection changed listener\r
-     */\r
-    private ISelectionChangedListener getSelectionChangedListener() {\r
-        if (selectionChangedListener == null) {\r
-            selectionChangedListener = new ISelectionChangedListener() {\r
-                public void selectionChanged(SelectionChangedEvent event) {\r
-                    TabbedPropertyPageViewSite.this.handleSelectionChanged(event);\r
-                }\r
-            };\r
-        }\r
-        return selectionChangedListener;\r
-    }\r
-\r
-    /**\r
-     * The <code>MultiPageEditorSite</code> implementation of this\r
-     * <code>IWorkbenchPartSite</code> method returns the selection provider\r
-     * set by <code>setSelectionProvider</code>.\r
-     * \r
-     * @return The current selection provider.\r
-     */\r
-    public ISelectionProvider getSelectionProvider() {\r
-        return selectionProvider;\r
-    }\r
-\r
-    public final Object getService(final Class key) {\r
-        return serviceLocator.getService(key);\r
-    }\r
-\r
-    /**\r
-     * The <code>MultiPageEditorSite</code> implementation of this\r
-     * <code>IWorkbenchPartSite</code> method forwards to the multi-page\r
-     * editor to return the shell.\r
-     * \r
-     * @return The shell in which this editor site resides.\r
-     */\r
-    public Shell getShell() {\r
-        return getMultiPageEditor().getSite().getShell();\r
-    }\r
-\r
-    /**\r
-     * The <code>MultiPageEditorSite</code> implementation of this\r
-     * <code>IWorkbenchPartSite</code> method forwards to the multi-page\r
-     * editor to return the workbench window.\r
-     * \r
-     * @return The workbench window in which this editor site resides.\r
-     */\r
-    public IWorkbenchWindow getWorkbenchWindow() {\r
-        return getMultiPageEditor().getSite().getWorkbenchWindow();\r
-    }\r
-\r
-    /**\r
-     * Handles a post selection changed even from the nexted editor.\r
-     * <p>\r
-     * Subclasses may extend or reimplement this method\r
-     * \r
-     * @param event  the event\r
-     * \r
-     * @since 3.2\r
-     */\r
-    protected void handlePostSelectionChanged(SelectionChangedEvent event) {\r
-        ISelectionProvider parentProvider = getMultiPageEditor().getSite()\r
-        .getSelectionProvider();\r
-        if (parentProvider instanceof TabbedPageSelectionProvider) {\r
-            SelectionChangedEvent newEvent = new SelectionChangedEvent(\r
-                    parentProvider, event.getSelection());\r
-            TabbedPageSelectionProvider prov = (TabbedPageSelectionProvider) parentProvider;\r
-            prov.firePostSelectionChanged(newEvent);\r
-        }\r
-    }\r
-\r
-    /**\r
-     * Handles a selection changed event from the nested editor. The default\r
-     * implementation gets the selection provider from the multi-page editor's\r
-     * site, and calls <code>fireSelectionChanged</code> on it (only if it is\r
-     * an instance of <code>MultiPageSelectionProvider</code>), passing a new\r
-     * event object.\r
-     * <p>\r
-     * Subclasses may extend or reimplement this method.\r
-     * </p>\r
-     * \r
-     * @param event\r
-     *            the event\r
-     */\r
-    protected void handleSelectionChanged(SelectionChangedEvent event) {\r
-        ISelectionProvider parentProvider = getMultiPageEditor().getSite()\r
-        .getSelectionProvider();\r
-        if (parentProvider instanceof TabbedPageSelectionProvider) {\r
-            SelectionChangedEvent newEvent = new SelectionChangedEvent(\r
-                    parentProvider, event.getSelection());\r
-            TabbedPageSelectionProvider prov = (TabbedPageSelectionProvider) parentProvider;\r
-            prov.fireSelectionChanged(newEvent);\r
-        }\r
-    }\r
-\r
-    public final boolean hasService(final Class key) {\r
-        return serviceLocator.hasService(key);\r
-    }\r
-\r
-    /**\r
-     * The <code>MultiPageEditorSite</code> implementation of this\r
-     * <code>IWorkbenchPartSite</code> method forwards to the multi-page\r
-     * editor for registration.\r
-     * \r
-     * @param menuManager\r
-     *            The menu manager\r
-     * @param selProvider\r
-     *            The selection provider.\r
-     */\r
-    public void registerContextMenu(MenuManager menuManager,\r
-            ISelectionProvider selProvider) {\r
-        getMultiPageEditor().getSite().registerContextMenu(menuManager,\r
-                selProvider);\r
-    }\r
-\r
-    public final void registerContextMenu(final MenuManager menuManager,\r
-            final ISelectionProvider selectionProvider,\r
-            final boolean includeEditorInput) {\r
-        registerContextMenu(getId(), menuManager, selectionProvider,\r
-                includeEditorInput);\r
-    }\r
-\r
-    /**\r
-     * The <code>MultiPageEditorSite</code> implementation of this\r
-     * <code>IWorkbenchPartSite</code> method forwards to the multi-page\r
-     * editor for registration.\r
-     * \r
-     * @param menuID\r
-     *            The identifier for the menu.\r
-     * @param menuMgr\r
-     *            The menu manager\r
-     * @param selProvider\r
-     *            The selection provider.\r
-     */\r
-    public void registerContextMenu(String menuID, MenuManager menuMgr,\r
-            ISelectionProvider selProvider) {\r
-        if (menuExtenders == null) {\r
-            menuExtenders = new ArrayList(1);\r
-        }\r
-        PartSite.registerContextMenu(menuID, menuMgr, selProvider, true,\r
-                editor, e4Context, menuExtenders);\r
-    }\r
-\r
-    public final void registerContextMenu(final String menuId,\r
-            final MenuManager menuManager,\r
-            final ISelectionProvider selectionProvider,\r
-            final boolean includeEditorInput) {\r
-        if (menuExtenders == null) {\r
-            menuExtenders = new ArrayList(1);\r
-        }\r
-        PartSite.registerContextMenu(menuId, menuManager, selectionProvider,\r
-                includeEditorInput, editor, e4Context, menuExtenders);\r
-    }\r
-\r
-    /**\r
-     * The <code>MultiPageEditorSite</code> implementation of this\r
-     * <code>IWorkbenchPartSite</code> method remembers the selection\r
-     * provider, and also hooks a listener on it, which calls\r
-     * <code>handleSelectionChanged</code> when a selection changed event\r
-     * occurs.\r
-     * \r
-     * @param provider\r
-     *            The selection provider.\r
-     * @see MultiPageEditorSite#handleSelectionChanged(SelectionChangedEvent)\r
-     */\r
-    public void setSelectionProvider(ISelectionProvider provider) {\r
-        ISelectionProvider oldSelectionProvider = selectionProvider;\r
-        selectionProvider = provider;\r
-        if (oldSelectionProvider != null) {\r
-            oldSelectionProvider\r
-            .removeSelectionChangedListener(getSelectionChangedListener());\r
-            if (oldSelectionProvider instanceof IPostSelectionProvider) {\r
-                ((IPostSelectionProvider) oldSelectionProvider)\r
-                .removePostSelectionChangedListener(getPostSelectionChangedListener());\r
-            }\r
-        }\r
-        if (selectionProvider != null) {\r
-            selectionProvider\r
-            .addSelectionChangedListener(getSelectionChangedListener());\r
-            if (selectionProvider instanceof IPostSelectionProvider) {\r
-                ((IPostSelectionProvider) selectionProvider)\r
-                .addPostSelectionChangedListener(getPostSelectionChangedListener());\r
-            }\r
-        }\r
-    }\r
-\r
-    @Override\r
-    public String getSecondaryId() {\r
-        return ((IViewSite)multiPageEditor.getSite()).getSecondaryId();\r
-    }\r
-\r
-}\r
+/*******************************************************************************
+ * 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.
+ * <p>
+ * The base implementation of <code>MultiPageEditor.createSite</code> creates
+ * an instance of this class. This class may be instantiated or subclassed.
+ * </p>
+ * 
+ * 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; <code>null</code> 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; <code>null</code> if
+     * not yet created.
+     */
+    private ISelectionChangedListener selectionChangedListener = null;
+
+    /**
+     * The selection provider; <code>null</code> 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 <code>null</code> if it is not yet
+     * initialized.
+     */
+    private IKeyBindingService service = null;
+
+    /**
+     * The local service locator for this multi-page editor site. This value is
+     * never <code>null</code>.
+     */
+    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 <code>MultiPageEditorSite</code> implementation of this
+     * <code>IEditorSite</code> method returns <code>null</code>, since
+     * nested editors do not have their own action bar contributor.
+     * 
+     * @return <code>null</code>
+     */
+    public IEditorActionBarContributor getActionBarContributor() {
+        return null;
+    }
+
+    /**
+     * The <code>MultiPageEditorSite</code> implementation of this
+     * <code>IEditorSite</code> 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 <code>MultiPageEditorSite</code> implementation of this
+     * <code>IWorkbenchPartSite</code> 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 <code>MultiPageEditorSite</code> implementation of this
+     * <code>IWorkbenchPartSite</code> 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 <code>MultiPageEditorSite</code> implementation of this
+     * <code>IWorkbenchPartSite</code> 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 <code>MultiPageEditorSite</code> implementation of this
+     * <code>IWorkbenchPartSite</code> 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 <code>MultiPageEditorSite</code> implementation of this
+     * <code>IWorkbenchPartSite</code> 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 <code>handleSelectionChanged</code>.
+     * 
+     * @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 <code>MultiPageEditorSite</code> implementation of this
+     * <code>IWorkbenchPartSite</code> method returns the selection provider
+     * set by <code>setSelectionProvider</code>.
+     * 
+     * @return The current selection provider.
+     */
+    public ISelectionProvider getSelectionProvider() {
+        return selectionProvider;
+    }
+
+    public final Object getService(final Class key) {
+        return serviceLocator.getService(key);
+    }
+
+    /**
+     * The <code>MultiPageEditorSite</code> implementation of this
+     * <code>IWorkbenchPartSite</code> 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 <code>MultiPageEditorSite</code> implementation of this
+     * <code>IWorkbenchPartSite</code> 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.
+     * <p>
+     * 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 <code>fireSelectionChanged</code> on it (only if it is
+     * an instance of <code>MultiPageSelectionProvider</code>), passing a new
+     * event object.
+     * <p>
+     * Subclasses may extend or reimplement this method.
+     * </p>
+     * 
+     * @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 <code>MultiPageEditorSite</code> implementation of this
+     * <code>IWorkbenchPartSite</code> 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 <code>MultiPageEditorSite</code> implementation of this
+     * <code>IWorkbenchPartSite</code> 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 <code>MultiPageEditorSite</code> implementation of this
+     * <code>IWorkbenchPartSite</code> method remembers the selection
+     * provider, and also hooks a listener on it, which calls
+     * <code>handleSelectionChanged</code> 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();
+    }
+
+}