package org.jbpm.gd.jpdl.properties; import org.eclipse.gef.commands.CommandStack; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuCreator; import org.eclipse.jface.action.Separator; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MenuAdapter; import org.eclipse.swt.events.MenuEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.ui.IActionBars; import org.jbpm.gd.common.util.SharedImages; import org.jbpm.gd.jpdl.Plugin; import org.jbpm.gd.jpdl.command.ActionElementCreateCommand; import org.jbpm.gd.jpdl.command.ActionElementDeleteCommand; import org.jbpm.gd.jpdl.command.ExceptionHandlerCreateCommand; import org.jbpm.gd.jpdl.command.ExceptionHandlerDeleteCommand; import org.jbpm.gd.jpdl.model.ActionElementContainer; import org.jbpm.gd.jpdl.model.ExceptionHandlerContainer; public class ExceptionHandlerContainerSectionActionBarContributor implements IMenuCreator { private static final String ACTION_ID = "org.jbpm.gd.jpdl.action"; private static final String SCRIPT_ID = "org.jbpm.gd.jpdl.script"; private String elementToCreate = ACTION_ID; private ExceptionHandlerContainerSection exceptionHandlerContainerSection; private ActionContributionItem addExceptionHandlerToolbarContributionItem; private ActionContributionItem addActionElementToolbarContributionItem; private ActionContributionItem removeToolbarContributionItem; private ActionContributionItem addExceptionHandlerMenuContributionItem; private ActionContributionItem addActionMenuContributionItem; private ActionContributionItem addScriptMenuContributionItem; private ActionContributionItem removeMenuContributionItem; private Separator toolbarSeparator; private Separator firstMenuSeparator; private Separator secondMenuSeparator; private Menu addActionElementMenu; private Menu popupMenu; public ExceptionHandlerContainerSectionActionBarContributor(ExceptionHandlerContainerSection section) { this.exceptionHandlerContainerSection = section; addExceptionHandlerToolbarContributionItem = new ActionContributionItem(createAddExceptionHandlerAction()); addActionElementToolbarContributionItem = new ActionContributionItem(createAddActionElementAction()); removeToolbarContributionItem = new ActionContributionItem(createRemoveAction()); addExceptionHandlerMenuContributionItem = new ActionContributionItem(createAddExceptionHandlerAction()); addActionMenuContributionItem = new ActionContributionItem(createAddActionAction()); addScriptMenuContributionItem = new ActionContributionItem(createAddScriptAction()); removeMenuContributionItem = new ActionContributionItem(createRemoveAction()); toolbarSeparator = new Separator(); firstMenuSeparator = new Separator(); secondMenuSeparator = new Separator(); } private IAction createAddExceptionHandlerAction() { IAction action = new Action() { public void run() { addNewExceptionHandler(); } }; setExceptionHandlerInfo(action); return action; } private IAction createAddActionAction() { IAction action = new Action() { public void run() { addNewActionElement(ACTION_ID); } }; setActionInfo(action); return action; } private IAction createAddScriptAction() { IAction action = new Action() { public void run() { addNewActionElement(SCRIPT_ID); } }; setScriptInfo(action); return action; } private IAction createAddActionElementAction() { IAction action = new Action() { public void run() { addNewActionElement(elementToCreate); } }; action.setMenuCreator(this); action.setEnabled(false); setActionInfo(action); return action; } private void setExceptionHandlerInfo(IAction action) { action.setImageDescriptor( ImageDescriptor.createFromURL(Plugin.getDefault() .getBundle().getEntry("/icons/full/obj16/new_exception_enabled.gif"))); action.setDisabledImageDescriptor( ImageDescriptor.createFromURL(Plugin.getDefault() .getBundle().getEntry("/icons/full/obj16/new_exception_disabled.gif"))); action.setToolTipText("Add an exception handler"); action.setText("New Exception Handler"); } private void setActionInfo(IAction action) { action.setImageDescriptor( ImageDescriptor.createFromURL(Plugin.getDefault() .getBundle().getEntry("/icons/full/obj16/new_action_enabled.gif"))); action.setDisabledImageDescriptor( ImageDescriptor.createFromURL(Plugin.getDefault() .getBundle().getEntry("/icons/full/obj16/new_action_disabled.gif"))); action.setToolTipText("Add an action"); action.setText("New Action"); } private void setScriptInfo(IAction action) { action.setImageDescriptor( ImageDescriptor.createFromURL(Plugin.getDefault() .getBundle().getEntry("/icons/full/obj16/new_script_enabled.gif"))); action.setDisabledImageDescriptor( ImageDescriptor.createFromURL(Plugin.getDefault() .getBundle().getEntry("/icons/full/obj16/new_script_disabled.gif"))); action.setToolTipText("Add a script action"); action.setText("New Script"); } private IAction createRemoveAction() { IAction action = new Action() { public void run() { removeSelectedObject(); } }; setRemoveInfo(action); action.setEnabled(false); return action; } private void setRemoveInfo(IAction action) { action.setImageDescriptor( ImageDescriptor.createFromURL(Plugin.getDefault() .getBundle().getEntry("/icons/full/obj16/delete_enabled.gif"))); action.setDisabledImageDescriptor( ImageDescriptor.createFromURL(Plugin.getDefault() .getBundle().getEntry("/icons/full/obj16/delete_disabled.gif"))); action.setToolTipText("Remove the selected object"); action.setText("Delete"); } private void createActionElementMenu(Control parent) { boolean enabled = exceptionHandlerContainerSection.getSelectedExceptionHandler() != null; addActionElementMenu = new Menu(parent); addActionElementMenu.setEnabled(enabled); createAddActionElementMenuItems(addActionElementMenu, enabled); } private void createAddActionElementMenuItems(Menu menu, boolean enabled) { createAddActionMenuItem(menu, enabled); createAddScriptMenuItem(menu, enabled); } private void createAddActionMenuItem(Menu menu, boolean enabled) { MenuItem addActionMenuItem = new MenuItem(menu, SWT.PUSH); addActionMenuItem.setText("New Action"); ImageDescriptor enabledDescriptor = ImageDescriptor.createFromURL(Plugin.getDefault() .getBundle().getEntry("/icons/full/obj16/new_action_enabled.gif")); addActionMenuItem.setImage(SharedImages.INSTANCE.getImage(enabledDescriptor)); addActionMenuItem.setEnabled(enabled); if (enabled) { addActionMenuItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { addNewActionElement(ACTION_ID); if (((MenuItem)e.widget).getParent() != popupMenu) { elementToCreate = ACTION_ID; setActionInfo(addActionElementToolbarContributionItem.getAction()); } } }); } } private void createAddScriptMenuItem(Menu menu, boolean enabled) { MenuItem addScriptMenuItem = new MenuItem(menu, SWT.PUSH); addScriptMenuItem.setText("New Script"); ImageDescriptor enabledDescriptor = ImageDescriptor.createFromURL(Plugin.getDefault() .getBundle().getEntry("/icons/full/obj16/new_script_enabled.gif")); addScriptMenuItem.setImage(SharedImages.INSTANCE.getImage(enabledDescriptor)); addScriptMenuItem.setEnabled(enabled); if (enabled) { addScriptMenuItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { addNewActionElement(SCRIPT_ID); if (((MenuItem)e.widget).getParent() != popupMenu) { elementToCreate = SCRIPT_ID; setScriptInfo(addActionElementToolbarContributionItem.getAction()); } } }); } } private void addNewActionElement(String elementToCreate) { ActionElementContainer target = exceptionHandlerContainerSection.getSelectedExceptionHandler(); ActionElementCreateCommand command = new ActionElementCreateCommand(target.getFactory()); command.setActionElementContainer(target); command.setActionId(elementToCreate); getCommandStack().execute(command); } private void addNewExceptionHandler() { ExceptionHandlerContainer target = exceptionHandlerContainerSection.getExceptionHandlerContainer(); ExceptionHandlerCreateCommand command = new ExceptionHandlerCreateCommand(target.getFactory()); command.setExceptionHandlerContainer(target); getCommandStack().execute(command); } private void removeSelectedObject() { if (exceptionHandlerContainerSection.getSelectedActionElement() != null) { ActionElementDeleteCommand command = new ActionElementDeleteCommand(); command.setActionElement(exceptionHandlerContainerSection.getSelectedActionElement()); command.setActionElementContainer(exceptionHandlerContainerSection.getSelectedExceptionHandler()); getCommandStack().execute(command); } else { ExceptionHandlerDeleteCommand command = new ExceptionHandlerDeleteCommand(); command.setExceptionHandlerContainer(exceptionHandlerContainerSection.getExceptionHandlerContainer()); command.setExceptionHandler(exceptionHandlerContainerSection.getSelectedExceptionHandler()); getCommandStack().execute(command); } } private CommandStack getCommandStack() { return exceptionHandlerContainerSection.getCommandStack(); } private IActionBars getActionBars() { return exceptionHandlerContainerSection.getTabbedPropertySheetPage().getSite().getActionBars(); } public void setRemoveEnabled(boolean enabled) { removeToolbarContributionItem.getAction().setEnabled(enabled); removeMenuContributionItem.getAction().setEnabled(enabled); } public void setAddActionElementEnabled(boolean enabled) { addActionElementToolbarContributionItem.getAction().setEnabled(enabled); addActionMenuContributionItem.getAction().setEnabled(enabled); addScriptMenuContributionItem.getAction().setEnabled(enabled); } public void activateContributions() { getActionBars().getToolBarManager().add(addExceptionHandlerToolbarContributionItem); getActionBars().getToolBarManager().add(addActionElementToolbarContributionItem); getActionBars().getToolBarManager().add(toolbarSeparator); getActionBars().getToolBarManager().add(removeToolbarContributionItem); getActionBars().getMenuManager().add(addExceptionHandlerMenuContributionItem); getActionBars().getMenuManager().add(firstMenuSeparator); getActionBars().getMenuManager().add(addActionMenuContributionItem); getActionBars().getMenuManager().add(addScriptMenuContributionItem); getActionBars().getMenuManager().add(secondMenuSeparator); getActionBars().getMenuManager().add(removeMenuContributionItem); getActionBars().updateActionBars(); } public void deactivateContributions() { getActionBars().getToolBarManager().remove(addExceptionHandlerToolbarContributionItem); getActionBars().getToolBarManager().remove(addActionElementToolbarContributionItem); getActionBars().getToolBarManager().remove(toolbarSeparator); getActionBars().getToolBarManager().remove(removeToolbarContributionItem); getActionBars().getMenuManager().remove(addExceptionHandlerMenuContributionItem); getActionBars().getMenuManager().remove(firstMenuSeparator); getActionBars().getMenuManager().remove(addActionMenuContributionItem); getActionBars().getMenuManager().remove(addScriptMenuContributionItem); getActionBars().getMenuManager().remove(secondMenuSeparator); getActionBars().getMenuManager().remove(removeMenuContributionItem); getActionBars().updateActionBars(); } public void createPopupMenu(Composite composite) { popupMenu = new Menu(composite); composite.setMenu(popupMenu); popupMenu.addMenuListener(new MenuAdapter() { public void menuShown(MenuEvent e) { disposePopupMenu(); createPopupMenu(); } }); } private void disposePopupMenu() { MenuItem[] menuItems = popupMenu.getItems(); for (int i = 0; i < menuItems.length; i++) { menuItems[i].dispose(); } } private void createPopupMenu() { createAddExceptionHandlerMenuItem(); new MenuItem(popupMenu, SWT.SEPARATOR); boolean enabled = exceptionHandlerContainerSection.getSelectedExceptionHandler() != null; createAddActionElementMenuItems(popupMenu, enabled); new MenuItem(popupMenu, SWT.SEPARATOR); createRemoveMenuItem(); } private void createAddExceptionHandlerMenuItem() { MenuItem addEventItem = new MenuItem(popupMenu, SWT.PUSH); addEventItem.setText("New Exception Handler"); ImageDescriptor descriptor = ImageDescriptor.createFromURL(Plugin.getDefault() .getBundle().getEntry("/icons/full/obj16/new_exception_enabled.gif")); addEventItem.setImage(SharedImages.INSTANCE.getImage(descriptor)); addEventItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { addNewExceptionHandler(); } }); } private String getDeleteImagePath() { String imagePath; if (hasSelection()) { imagePath = "/icons/full/obj16/delete_enabled.gif"; } else { imagePath = "/icons/full/obj16/delete_disabled.gif"; } return imagePath; } private void createRemoveMenuItem() { MenuItem removeItem = new MenuItem(popupMenu, SWT.PUSH); removeItem.setText("Delete"); ImageDescriptor descriptor = ImageDescriptor.createFromURL(Plugin.getDefault() .getBundle().getEntry(getDeleteImagePath())); removeItem.setImage(SharedImages.INSTANCE.getImage(descriptor)); removeItem.setEnabled(hasSelection()); removeItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { removeSelectedObject(); } }); } private boolean hasSelection() { return exceptionHandlerContainerSection.getSelectedActionElement() != null || exceptionHandlerContainerSection.getSelectedExceptionHandler() != null; } public void dispose() { if (addActionElementMenu != null) { MenuItem[] items = addActionElementMenu.getItems(); for (int i = 0; i < items.length; i++) { items[i].dispose(); } } } public Menu getMenu(Control parent) { if (addActionElementMenu == null) { createActionElementMenu(parent); } return addActionElementMenu; } public Menu getMenu(Menu parent) { return null; } }