/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.ui.internal.actions; import org.eclipse.jface.action.ContributionItem; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.internal.ShowViewAction; import org.eclipse.ui.views.IViewDescriptor; import org.eclipse.ui.views.IViewRegistry; public class MindMapViewsMenu extends ContributionItem { private static class ShowViewAction2 extends ShowViewAction { protected ShowViewAction2(IWorkbenchWindow window, IViewDescriptor desc, boolean makeFast) { super(window, desc, makeFast); } } private IWorkbenchWindow window; protected boolean dirty = true; private IMenuListener menuListener = new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { manager.markDirty(); dirty = true; } }; public MindMapViewsMenu(IWorkbenchWindow window) { this.window = window; } public boolean isDirty() { return dirty; } /** * Overridden to always return true and force dynamic menu building. */ public boolean isDynamic() { return true; } public void fill(Menu menu, int index) { if (getParent() instanceof MenuManager) { ((MenuManager) getParent()).addMenuListener(menuListener); } if (!dirty) { return; } MenuManager manager = new MenuManager(); fillMenu(manager); IContributionItem items[] = manager.getItems(); if (items.length > 0) { for (int i = 0; i < items.length; i++) { items[i].fill(menu, index++); } } dirty = false; } private void fillMenu(MenuManager manager) { IViewRegistry viewRegistry = window.getWorkbench().getViewRegistry(); IViewDescriptor[] views = viewRegistry.getViews(); for (IViewDescriptor view : views) { String viewId = view.getId(); if (viewId.startsWith("org.xmind.ui.")) { //$NON-NLS-1$ addShowViewAction(manager, viewId, view); } } } private void addShowViewAction(MenuManager manager, String viewId, IViewDescriptor view) { manager.add(new ShowViewAction2(window, view, false)); } }