/******************************************************************************* * Copyright (c) 2000, 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 * Dan Rubel (dan_rubel@instantiations.com) - accessor to get context menu ids *******************************************************************************/ package org.eclipse.ui.internal; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.SubActionBars; /** * <code>PartSite</code> is the general implementation for an * <code>IWorkbenchPartSite</code>. A site maintains the context for a part, * including the part, its pane, active contributions, selection provider, etc. * Together, these components make up the complete behavior for a part as if it * was implemented by one person. * * The <code>PartSite</code> lifecycle is as follows .. * * <ol> * <li>a site is constructed</li> * <li>a part is constructed and stored in the part</li> * <li>the site calls part.init()</li> * <li>a pane is constructed and stored in the site</li> * <li>the action bars for a part are constructed and stored in the site</li> * <li>the pane is added to a presentation</li> * <li>the SWT widgets for the pane and part are created</li> * <li>the site is activated, causing the actions to become visible</li> * </ol> */ public abstract class PartSite implements IWorkbenchPartSite { // // /** // * This is a helper method for the register context menu functionality. It // * is provided so that different implementations of the // * <code>IWorkbenchPartSite</code> interface don't have to worry about how // * context menus should work. // * // * @param menuId // * the menu id // * @param menuManager // * the menu manager // * @param selectionProvider // * the selection provider // * @param includeEditorInput // * whether editor inputs should be included in the structured // * selection when calculating contributions // * @param part // * the part for this site // * @param menuExtenders // * the collection of menu extenders for this site // * @see IWorkbenchPartSite#registerContextMenu(MenuManager, // * ISelectionProvider) // */ // public static final void registerContextMenu(final String menuId, // final MenuManager menuManager, // final ISelectionProvider selectionProvider, // final boolean includeEditorInput, final IWorkbenchPart part, // final Collection menuExtenders) { // /* // * Check to see if the same menu manager and selection provider have // * already been used. If they have, then we can just add another menu // * identifier to the existing PopupMenuExtender. // */ // final Iterator extenderItr = menuExtenders.iterator(); // boolean foundMatch = false; // while (extenderItr.hasNext()) { // final PopupMenuExtender existingExtender = (PopupMenuExtender) // extenderItr // .next(); // if (existingExtender.matches(menuManager, selectionProvider, part)) { // existingExtender.addMenuId(menuId); // foundMatch = true; // break; // } // } // // if (!foundMatch) { // menuExtenders.add(new PopupMenuExtender(menuId, menuManager, // selectionProvider, part, includeEditorInput)); // } // } // // private IWorkbenchPartReference partReference; // // private IWorkbenchPart part; // // private IWorkbenchPage page; // // private String extensionID; // // private String pluginID; // // private String extensionName; // // private ISelectionProvider selectionProvider; // private SubActionBars actionBars; // // private KeyBindingService keyBindingService; // // protected ArrayList menuExtenders; // // private WorkbenchSiteProgressService progressService; // // protected final ServiceLocator serviceLocator; // // /** // * Build the part site. // * // * @param ref // * the part reference // * @param part // * the part // * @param page // * the page it belongs to // */ // public PartSite(IWorkbenchPartReference ref, IWorkbenchPart part, // IWorkbenchPage page) { // this.partReference = ref; // this.part = part; // this.page = page; // extensionID = "org.eclipse.ui.UnknownID"; //$NON-NLS-1$ // extensionName = "Unknown Name"; //$NON-NLS-1$ // // // Initialize the service locator. // final WorkbenchWindow workbenchWindow = (WorkbenchWindow) page // .getWorkbenchWindow(); // IServiceLocatorCreator slc = (IServiceLocatorCreator) workbenchWindow // .getService(IServiceLocatorCreator.class); // this.serviceLocator = (ServiceLocator) slc.createServiceLocator( // workbenchWindow, null, new IDisposable() { // public void dispose() { // final Control control = getPane().getControl(); // if (control != null && !control.isDisposed()) { // getPane().doHide(); // } // } // }); // // initializeDefaultServices(); // } // // /** // * Initialize the local services. // */ // private void initializeDefaultServices() { // serviceLocator.registerService(IWorkbenchLocationService.class, // new WorkbenchLocationService(IServiceScopes.PARTSITE_SCOPE, // getWorkbenchWindow().getWorkbench(), // getWorkbenchWindow(), this, null, null, 2)); // // added back for legacy reasons // serviceLocator.registerService(IWorkbenchPartSite.class, this); // } // // /** // * Dispose the contributions. // */ // public void dispose() { // if (menuExtenders != null) { // HashSet managers = new HashSet(menuExtenders.size()); // for (int i = 0; i < menuExtenders.size(); i++) { // PopupMenuExtender ext = (PopupMenuExtender) menuExtenders // .get(i); // managers.add(ext.getManager()); // ext.dispose(); // } // if (managers.size() > 0) { // for (Iterator iterator = managers.iterator(); iterator // .hasNext();) { // MenuManager mgr = (MenuManager) iterator.next(); // mgr.dispose(); // } // } // menuExtenders = null; // } // // if (keyBindingService != null) { // keyBindingService.dispose(); // keyBindingService = null; // } // // if (progressService != null) { // progressService.dispose(); // progressService = null; // } // // if (serviceLocator != null) { // serviceLocator.dispose(); // } // part = null; // } // /** * Returns the action bars for the part. If this part is a view then it has * exclusive use of the action bars. If this part is an editor then the * action bars are shared among this editor and other editors of the same * type. */ public IActionBars getActionBars() { return actionBars; } // // /** // * Returns the part registry extension ID. // * // * @return the registry extension ID // */ // public String getId() { // return extensionID; // } // // /** // * Returns the page containing this workbench site's part. // * // * @return the page containing this part // */ // public IWorkbenchPage getPage() { // return page; // } // /** * Gets the part pane. */ // public PartPane getPane() { // return ((WorkbenchPartReference) partReference).getPane(); // } // // /** // * Returns the part. // */ // public IWorkbenchPart getPart() { // return part; // } // // /** // * Returns the part reference. // */ // public IWorkbenchPartReference getPartReference() { // return partReference; // } // // /** // * Returns the part registry plugin ID. It cannot be <code>null</code>. // * // * @return the registry plugin ID // */ // public String getPluginId() { // return pluginID; // } // // /** // * Returns the registered name for this part. // */ // public String getRegisteredName() { // return extensionName; // } // // /** // * Returns the selection provider for a part. // */ // public ISelectionProvider getSelectionProvider() { // return selectionProvider; // } // // /** // * Returns the shell containing this part. // * // * @return the shell containing this part // */ // public Shell getShell() { // PartPane pane = getPane(); // // // Compatibility: This method should not be used outside the UI // // thread... but since this condition // // was not always in the JavaDoc, we still try to return our best guess // // about the shell if it is // // called from the wrong thread. // Display currentDisplay = Display.getCurrent(); // if (currentDisplay == null // || currentDisplay != getWorkbenchWindow().getWorkbench() // .getDisplay()) { // // Uncomment this to locate places that try to access the shell from // // a background thread // // WorkbenchPlugin.log(new Exception("Error: // // IWorkbenchSite.getShell() was called outside the UI thread. Fix // // this code.")); //$NON-NLS-1$ // // return getWorkbenchWindow().getShell(); // } // // if (pane == null) { // return getWorkbenchWindow().getShell(); // } // // Shell s = pane.getShell(); // // if (s == null) { // return getWorkbenchWindow().getShell(); // } // // return s; // } // // /** // * Returns the workbench window containing this part. // * // * @return the workbench window containing this part // */ // public IWorkbenchWindow getWorkbenchWindow() { // return page.getWorkbenchWindow(); // } // // /** // * Register a popup menu for extension. // */ // public void registerContextMenu(String menuID, MenuManager menuMgr, // ISelectionProvider selProvider) { // if (menuExtenders == null) { // menuExtenders = new ArrayList(1); // } // // registerContextMenu(menuID, menuMgr, selProvider, true, getPart(), // menuExtenders); // } // // /** // * Register a popup menu with the default id for extension. // */ // public void registerContextMenu(MenuManager menuMgr, // ISelectionProvider selProvider) { // registerContextMenu(getId(), menuMgr, selProvider); // } // // // getContextMenuIds() added by Dan Rubel (dan_rubel@instantiations.com) // /** // * Get the registered popup menu identifiers // */ // public String[] getContextMenuIds() { // if (menuExtenders == null) { // return new String[0]; // } // ArrayList menuIds = new ArrayList(menuExtenders.size()); // for (Iterator iter = menuExtenders.iterator(); iter.hasNext();) { // final PopupMenuExtender extender = (PopupMenuExtender) iter.next(); // menuIds.addAll(extender.getMenuIds()); // } // return (String[]) menuIds.toArray(new String[menuIds.size()]); // } // // /** // * Sets the action bars for the part. // */ // public void setActionBars(SubActionBars bars) { // actionBars = bars; // } // // /** // * Sets the configuration element for a part. // */ // public void setConfigurationElement(IConfigurationElement configElement) // { // // // Get extension ID. // extensionID = configElement.getAttribute("id"); //$NON-NLS-1$ // // // Get plugin ID. // pluginID = configElement.getNamespace(); // // // Get extension name. // String name = configElement.getAttribute("name"); //$NON-NLS-1$ // if (name != null) { // extensionName = name; // } // } // // protected void setPluginId(String pluginId) { // this.pluginID = pluginId; // } // // /** // * Sets the part registry extension ID. // * // * @param id // * the registry extension ID // */ // protected void setId(String id) { // extensionID = id; // } // // /** // * Sets the part. // */ // public void setPart(IWorkbenchPart newPart) { // part = newPart; // } // // /** // * Sets the registered name for this part. // * // * @param name // * the registered name // */ // protected void setRegisteredName(String name) { // extensionName = name; // } // // /** // * Set the selection provider for a part. // */ // public void setSelectionProvider(ISelectionProvider provider) { // selectionProvider = provider; // } // // /* // * @see IWorkbenchPartSite#getKeyBindingService() // */ // public IKeyBindingService getKeyBindingService() { // if (keyBindingService == null) { // keyBindingService = new KeyBindingService(this); // } // // return keyBindingService; // } // // protected String getInitialScopeId() { // return null; // } // // /** // * Get an adapter for this type. // * // * @param adapter // * @return // */ // public final Object getAdapter(Class adapter) { // // if (IWorkbenchSiteProgressService.class == adapter) { // return getSiteProgressService(); // } // // if (IWorkbenchPartTestable.class == adapter) { // return new WorkbenchPartTestable(this); // } // // return Platform.getAdapterManager().getAdapter(this, adapter); // } // // public void activateActionBars(boolean forceVisibility) { // if (serviceLocator != null) { // serviceLocator.activate(); // } // // if (actionBars != null) { // actionBars.activate(forceVisibility); // } // } // // public void deactivateActionBars(boolean forceHide) { // if (actionBars != null) { // actionBars.deactivate(forceHide); // } // if (serviceLocator != null) { // serviceLocator.deactivate(); // } // } // // /** // * Get a progress service for the receiver. // * // * @return WorkbenchSiteProgressService // */ // WorkbenchSiteProgressService getSiteProgressService() { // if (progressService == null) { // progressService = new WorkbenchSiteProgressService(this); // } // return progressService; // } // // public final Object getService(final Class key) { // return serviceLocator.getService(key); // } // // public final boolean hasService(final Class key) { // return serviceLocator.hasService(key); // } // // /** // * Prints out the identifier, the plug-in identifier and the registered // * name. This is for debugging purposes only. // * // * @since 3.2 // */ // public String toString() { // final StringBuffer buffer = new StringBuffer(); // buffer.append("PartSite(id="); //$NON-NLS-1$ // buffer.append(getId()); // buffer.append(",pluginId="); //$NON-NLS-1$ // buffer.append(getPluginId()); // buffer.append(",registeredName="); //$NON-NLS-1$ // buffer.append(getRegisteredName()); // buffer.append(",hashCode="); //$NON-NLS-1$ // buffer.append(hashCode()); // buffer.append(')'); // return buffer.toString(); // } }