001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.internal;
011:
012: import java.util.ArrayList;
013: import java.util.Iterator;
014: import java.util.List;
015:
016: import org.eclipse.core.runtime.IConfigurationElement;
017: import org.eclipse.core.runtime.IExtension;
018: import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;
019: import org.eclipse.jface.action.IMenuManager;
020: import org.eclipse.jface.viewers.ISelection;
021: import org.eclipse.jface.viewers.ISelectionProvider;
022: import org.eclipse.jface.viewers.IStructuredSelection;
023: import org.eclipse.ui.IWorkbenchPart;
024:
025: /**
026: * This manager is used to populate a popup menu manager with actions
027: * for a given type.
028: */
029: public class ObjectActionContributorManager extends
030: ObjectContributorManager {
031: private static ObjectActionContributorManager sharedInstance;
032:
033: /**
034: * PopupMenuManager constructor.
035: */
036: public ObjectActionContributorManager() {
037: super ();
038: loadContributors();
039: }
040:
041: /**
042: * Contributes submenus and/or actions applicable to the selection in the
043: * provided viewer into the provided popup menu.
044: *
045: * @param part the part being contributed to
046: * @param popupMenu the menu being contributed to
047: * @param selProv the selection provider
048: * @return whether anything was contributed
049: */
050: public boolean contributeObjectActions(IWorkbenchPart part,
051: IMenuManager popupMenu, ISelectionProvider selProv) {
052: // Get a selection.
053: ISelection selection = selProv.getSelection();
054: if (selection == null) {
055: return false;
056: }
057:
058: // Convert the selection into an element vector.
059: // According to the dictionary, a selection is "one that
060: // is selected", or "a collection of selected things".
061: // In reflection of this, we deal with one or a collection.
062: List elements = null;
063: if (selection instanceof IStructuredSelection) {
064: elements = ((IStructuredSelection) selection).toList();
065: } else {
066: elements = new ArrayList(1);
067: elements.add(selection);
068: }
069:
070: List contributors = getContributors(elements);
071:
072: if (contributors.isEmpty()) {
073: return false;
074: }
075:
076: // First pass, add the menus and collect the overrides. Prune from the
077: // list any non-applicable contributions.
078: boolean actualContributions = false;
079: ArrayList overrides = new ArrayList(4);
080: for (Iterator it = contributors.iterator(); it.hasNext();) {
081: IObjectActionContributor contributor = (IObjectActionContributor) it
082: .next();
083: if (!isApplicableTo(elements, contributor)) {
084: it.remove();
085: continue;
086: }
087: if (contributor.contributeObjectMenus(popupMenu, selProv)) {
088: actualContributions = true;
089: }
090: contributor.contributeObjectActionIdOverrides(overrides);
091: }
092:
093: // Second pass, add the contributions that are applicable to
094: // the selection.
095: for (Iterator it = contributors.iterator(); it.hasNext();) {
096: IObjectActionContributor contributor = (IObjectActionContributor) it
097: .next();
098: if (contributor.contributeObjectActions(part, popupMenu,
099: selProv, overrides)) {
100: actualContributions = true;
101: }
102: }
103: return actualContributions;
104: }
105:
106: /**
107: * Returns the shared instance of this manager.
108: * @return the shared instance of this manager
109: */
110: public static ObjectActionContributorManager getManager() {
111: if (sharedInstance == null) {
112: sharedInstance = new ObjectActionContributorManager();
113: }
114: return sharedInstance;
115: }
116:
117: /**
118: * Loads the contributors from the workbench's registry.
119: */
120: private void loadContributors() {
121: ObjectActionContributorReader reader = new ObjectActionContributorReader();
122: reader.readPopupContributors(this );
123: }
124:
125: /* (non-Javadoc)
126: * @see org.eclipse.core.runtime.dynamicHelpers.IExtensionChangeHandler#addExtension(org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker, org.eclipse.core.runtime.IExtension)
127: */
128: public void addExtension(IExtensionTracker tracker,
129: IExtension addedExtension) {
130: IConfigurationElement[] addedElements = addedExtension
131: .getConfigurationElements();
132: for (int i = 0; i < addedElements.length; i++) {
133: ObjectActionContributorReader reader = new ObjectActionContributorReader();
134: reader.setManager(this);
135: reader.readElement(addedElements[i]);
136: }
137: }
138: }
|