All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.jface.action.SubContributionManager Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (c) 2000, 2015 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jface.action;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * A SubContributionManager is used to define a set of contribution
 * items within a parent manager.  Once defined, the visibility of the entire set can
 * be changed as a unit.
 */
public abstract class SubContributionManager implements IContributionManager {
	/**
	 * The parent contribution manager.
	 */
	private IContributionManager parentMgr;

	/**
	 * Maps each item in the manager to a wrapper.  The wrapper is used to
	 * control the visibility of each item.
	 */
	private Map mapItemToWrapper = new HashMap<>();

	/**
	 * The visibility of the manager,
	 */
	private boolean visible = false;

	/**
	 * Constructs a new SubContributionManager
	 *
	 * @param mgr the parent contribution manager.  All contributions made to the
	 *      SubContributionManager are forwarded and appear in the
	 *      parent manager.
	 */
	public SubContributionManager(IContributionManager mgr) {
		super();
		parentMgr = mgr;
	}

	@Override
	public void add(IAction action) {
		add(new ActionContributionItem(action));
	}

	@Override
	public void add(IContributionItem item) {
		SubContributionItem wrap = wrap(item);
		wrap.setVisible(visible);
		parentMgr.add(wrap);
		itemAdded(item, wrap);
	}

	@Override
	public void appendToGroup(String groupName, IAction action) {
		appendToGroup(groupName, new ActionContributionItem(action));
	}

	@Override
	public void appendToGroup(String groupName, IContributionItem item) {
		SubContributionItem wrap = wrap(item);
		wrap.setVisible(visible);
		parentMgr.appendToGroup(groupName, wrap);
		itemAdded(item, wrap);
	}

	/**
	 * Disposes this sub contribution manager, removing all its items
	 * and cleaning up any other resources allocated by it.
	 * This must leave no trace of this sub contribution manager
	 * in the parent manager.  Subclasses may extend.
	 *
	 * @since 3.0
	 */
	public void disposeManager() {
		Iterator it = mapItemToWrapper.values().iterator();
		// Dispose items in addition to removing them.
		// See bugs 64024 and 73715 for details.
		// Do not use getItems() here as subclasses can override that in bad ways.
		while (it.hasNext()) {
			IContributionItem item = it.next();
			item.dispose();
		}
		removeAll();
	}

	@Override
	public IContributionItem find(String id) {
		IContributionItem item = parentMgr.find(id);
		return unwrap(item);
	}

	@Override
	public IContributionItem[] getItems() {
		IContributionItem[] result = new IContributionItem[mapItemToWrapper
				.size()];
		mapItemToWrapper.keySet().toArray(result);
		return result;
	}

	/**
	 * Returns the parent manager.
	 *
	 * @return the parent manager
	 */
	public IContributionManager getParent() {
		return parentMgr;
	}

	@Override
	public IContributionManagerOverrides getOverrides() {
		return parentMgr.getOverrides();
	}

	@Override
	public void insertAfter(String id, IAction action) {
		insertAfter(id, new ActionContributionItem(action));
	}

	@Override
	public void insertAfter(String id, IContributionItem item) {
		SubContributionItem wrap = wrap(item);
		wrap.setVisible(visible);
		parentMgr.insertAfter(id, wrap);
		itemAdded(item, wrap);
	}

	@Override
	public void insertBefore(String id, IAction action) {
		insertBefore(id, new ActionContributionItem(action));
	}

	@Override
	public void insertBefore(String id, IContributionItem item) {
		SubContributionItem wrap = wrap(item);
		wrap.setVisible(visible);
		parentMgr.insertBefore(id, wrap);
		itemAdded(item, wrap);
	}

	@Override
	public boolean isDirty() {
		return parentMgr.isDirty();
	}

	@Override
	public boolean isEmpty() {
		return parentMgr.isEmpty();
	}

	/**
	 * Returns whether the contribution list is visible.
	 * If the visibility is true then each item within the manager
	 * appears within the parent manager.  Otherwise, the items are not visible.
	 *
	 * @return true if the manager is visible
	 */
	public boolean isVisible() {
		return visible;
	}

	/**
	 * Notifies that an item has been added.
	 * 

* Subclasses are not expected to override this method. *

* * @param item the item contributed by the client * @param wrap the item contributed to the parent manager as a proxy for the item * contributed by the client */ protected void itemAdded(IContributionItem item, SubContributionItem wrap) { item.setParent(this); mapItemToWrapper.put(item, wrap); } /** * Notifies that an item has been removed. *

* Subclasses are not expected to override this method. *

* * @param item the item contributed by the client */ protected void itemRemoved(IContributionItem item) { mapItemToWrapper.remove(item); item.setParent(null); } /** * @return fetch all enumeration of wrappers for the item * @deprecated Use getItems(String value) instead. */ @Deprecated public Enumeration items() { final Iterator i = mapItemToWrapper.values().iterator(); return new Enumeration<>() { @Override public boolean hasMoreElements() { return i.hasNext(); } @Override public SubContributionItem nextElement() { return i.next(); } }; } @Override public void markDirty() { parentMgr.markDirty(); } @Override public void prependToGroup(String groupName, IAction action) { prependToGroup(groupName, new ActionContributionItem(action)); } @Override public void prependToGroup(String groupName, IContributionItem item) { SubContributionItem wrap = wrap(item); wrap.setVisible(visible); parentMgr.prependToGroup(groupName, wrap); itemAdded(item, wrap); } @Override public IContributionItem remove(String id) { IContributionItem result = parentMgr.remove(id); // result is the wrapped item if (result != null) { IContributionItem item = unwrap(result); itemRemoved(item); } return result; } @Override public IContributionItem remove(IContributionItem item) { SubContributionItem wrap = mapItemToWrapper .get(item); if (wrap == null) { return null; } IContributionItem result = parentMgr.remove(wrap); if (result == null) { return null; } itemRemoved(item); return item; } @Override public void removeAll() { Object[] array = mapItemToWrapper.keySet().toArray(); for (Object element : array) { IContributionItem item = (IContributionItem) element; remove(item); } mapItemToWrapper.clear(); } /** * Sets the visibility of the manager. If the visibility is true * then each item within the manager appears within the parent manager. * Otherwise, the items are not visible. * * @param visible the new visibility */ public void setVisible(boolean visible) { this.visible = visible; if (mapItemToWrapper.size() > 0) { Iterator it = mapItemToWrapper.values().iterator(); while (it.hasNext()) { IContributionItem item = it.next(); item.setVisible(visible); } parentMgr.markDirty(); } } /** * Wraps a contribution item in a sub contribution item, and returns the new wrapper. * @param item the contribution item to be wrapped * @return the wrapped item */ protected SubContributionItem wrap(IContributionItem item) { return new SubContributionItem(item); } /** * Unwraps a nested contribution item. If the contribution item is an * instance of SubContributionItem, then its inner item is * returned. Otherwise, the item itself is returned. * * @param item * The item to unwrap; may be null. * @return The inner item of item, if item is * a SubContributionItem;item * otherwise. */ protected IContributionItem unwrap(IContributionItem item) { if (item instanceof SubContributionItem) { return ((SubContributionItem) item).getInnerItem(); } return item; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy