/*******************************************************************************
* Copyright (c) 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
* Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.ui.actions;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;
import org.eclipse.jface.action.*;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.NewExampleAction;
import org.eclipse.ui.actions.NewProjectAction;
import org.eclipse.ui.activities.WorkbenchActivityHelper;
import org.eclipse.ui.internal.WorkbenchPage;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.actions.NewWizardShortcutAction;
import org.eclipse.ui.internal.registry.WizardsRegistryReader;
import org.eclipse.ui.wizards.IWizardDescriptor;
public class PHPNewWizardMenu extends ContributionItem {
private IAction showDlgAction;
private IAction newProjectAction;
private IAction newExampleAction;
private Map actions = new HashMap(21);
private boolean enabled = true;
private IWorkbenchWindow window;
private boolean dirty = true;
private IMenuListener menuListener = new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
manager.markDirty();
dirty = true;
}
};
/**
* Create a new wizard shortcut menu.
* <p>
* If the menu will appear on a semi-permanent basis, for instance within a
* toolbar or menubar, the value passed for <code>register</code> should be
* true. If set, the menu will listen to perspective activation and update
* itself to suit. In this case clients are expected to call
* <code>deregister</code> when the menu is no longer needed. This will
* unhook any perspective listeners.
* </p>
*
* @param innerMgr
* the location for the shortcut menu contents
* @param window
* the window containing the menu
* @param register
* if <code>true</code> the menu listens to perspective changes
* in the window
*/
public PHPNewWizardMenu(IMenuManager innerMgr, IWorkbenchWindow window,
boolean register) {
this(window);
fillMenu(innerMgr);
// Must be done after constructor to ensure field initialization.
}
public PHPNewWizardMenu(IWorkbenchWindow window) {
super();
this.window = window;
showDlgAction = ActionFactory.NEW.create(window);
newProjectAction = new NewProjectAction(window);
newExampleAction = new NewExampleAction(window);
}
/*
* (non-Javadoc) Fills the menu with New Wizards.
*/
private void fillMenu(IContributionManager innerMgr) {
// Remove all.
innerMgr.removeAll();
if (this.enabled) {
// Add new project ..
innerMgr.add(newProjectAction);
// Get visible actions.
String[] actions = null;
IWorkbenchPage page = window.getActivePage();
if (page != null)
actions = ((WorkbenchPage) page).getNewWizardShortcuts();
if (actions != null) {
if (actions.length > 0)
innerMgr.add(new Separator());
for (int i = 0; i < actions.length; i++) {
String id = actions[i];
IAction action = getAction(id);
if (action != null) {
if (WorkbenchActivityHelper.filterItem(action))
continue;
innerMgr.add(action);
}
}
}
if (hasExamples()) {
// Add examples ..
innerMgr.add(new Separator());
innerMgr.add(newExampleAction);
}
// Add other ..
innerMgr.add(new Separator());
innerMgr.add(showDlgAction);
}
}
/*
* (non-Javadoc) Returns the action for the given wizard id, or null if not
* found.
*/
private IAction getAction(String id) {
// Keep a cache, rather than creating a new action each time,
// so that image caching in ActionContributionItem works.
IAction action = (IAction) actions.get(id);
if (action == null) {
IWizardDescriptor wizardDesc = WorkbenchPlugin.getDefault()
.getNewWizardRegistry().findWizard(id);
if (wizardDesc != null) {
action = new NewWizardShortcutAction(window, wizardDesc);
actions.put(id, action);
IConfigurationElement element = (IConfigurationElement) wizardDesc
.getAdapter(IConfigurationElement.class);
if (element != null)
window.getExtensionTracker().registerObject(
element.getDeclaringExtension(), action,
IExtensionTracker.REF_WEAK);
}
}
return action;
}
/*
* (non-Javadoc) Method declared on IContributionItem.
*/
public boolean isEnabled() {
return enabled;
}
/*
* (non-Javadoc) Method declared on IContributionItem.
*/
public boolean isDynamic() {
return true;
}
/*
* (non-Javadoc) Method declared on IContributionItem.
*/
public boolean isDirty() {
return dirty;
}
/**
* Sets the enabled state of the receiver.
*
* @param enabledValue
* if <code>true</code> the menu is enabled; else it is disabled
*/
public void setEnabled(boolean enabledValue) {
this.enabled = enabledValue;
}
/**
* Removes all listeners from the containing workbench window.
* <p>
* This method should only be called if the shortcut menu is created with
* <code>register = true</code>.
* </p>
*
* @deprecated
*/
public void deregisterListeners() {
}
/*
* (non-Javadoc) Method declared on IContributionItem.
*/
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();
for (int i = 0; i < items.length; i++) {
items[i].fill(menu, index++);
}
dirty = false;
}
protected boolean registryHasCategory(String categoryId) {
return WorkbenchPlugin.getDefault().getNewWizardRegistry()
.findCategory(categoryId) != null;
}
private boolean hasExamples() {
return registryHasCategory(WizardsRegistryReader.FULL_EXAMPLES_WIZARD_CATEGORY);
}
}