package org.xmind.ui.internal.actions;
import java.util.ArrayList;
import java.util.List;
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.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
import org.eclipse.ui.menus.IWorkbenchContribution;
import org.eclipse.ui.services.IServiceLocator;
import org.xmind.ui.internal.IActionBuilder;
import org.xmind.ui.internal.ImageActionExtensionManager;
public class InsertImageMenu extends ContributionItem implements
IWorkbenchContribution {
private IWorkbenchWindow window;
protected boolean dirty = true;
private IMenuListener menuListener = new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
manager.markDirty();
dirty = true;
}
};
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 (window == null)
return;
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) {
List<IActionBuilder> imageActionBuilders = ImageActionExtensionManager
.getInstance().getActionBuilders();
List<IWorkbenchAction> imageActionExtensions = new ArrayList<IWorkbenchAction>(
imageActionBuilders.size());
IWorkbenchPage page = window.getActivePage();
if (page != null) {
for (IActionBuilder builder : imageActionBuilders) {
IWorkbenchAction imageActionExtension = builder
.createAction(page);
imageActionExtensions.add(imageActionExtension);
}
for (IWorkbenchAction action : imageActionExtensions) {
manager.add(action);
}
}
}
public void initialize(IServiceLocator serviceLocator) {
this.window = (IWorkbenchWindow) serviceLocator
.getService(IWorkbenchWindow.class);
}
}