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.IContributionItem;
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.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.SwimlaneCreateCommand;
import org.jbpm.gd.jpdl.command.SwimlaneDeleteCommand;
import org.jbpm.gd.jpdl.model.ProcessDefinition;
public class SwimlaneContainerSectionActionBarContributor {
private SwimlaneContainerSection swimlaneSection;
private ActionContributionItem addSwimlaneToolbarContributionItem;
private ActionContributionItem removeSwimlaneToolbarContributionItem;
private ActionContributionItem addSwimlaneMenuContributionItem;
private ActionContributionItem removeSwimlaneMenuContributionItem;
private Separator toolbarSeparator;
private Separator menuSeparator;
private Menu root;
public SwimlaneContainerSectionActionBarContributor(SwimlaneContainerSection swimlaneSection) {
setSwimlaneSection(swimlaneSection);
createAddSwimlaneContributions();
createSeparatorContributions();
createRemoveSwimlaneContributions();
}
private void createSeparatorContributions() {
toolbarSeparator = new Separator();
menuSeparator = new Separator();
}
private void setSwimlaneSection(SwimlaneContainerSection swimlaneSection) {
this.swimlaneSection = swimlaneSection;
}
public void activateContributions() {
addAddSwimlaneAction();
addSeparators();
addRemoveSwimlaneAction();
getActionBars().updateActionBars();
}
private void addSeparators() {
getActionBars().getToolBarManager().add(toolbarSeparator);
getActionBars().getMenuManager().add(menuSeparator);
}
public void deactivateContributions() {
removeAddSwimlaneAction();
removeSeparators();
removeRemoveSwimlaneAction();
getActionBars().updateActionBars();
}
private void removeSeparators() {
getActionBars().getToolBarManager().remove(toolbarSeparator);
getActionBars().getMenuManager().remove(menuSeparator);
}
public void setRemoveSwimlaneEnabled(boolean enabled) {
removeSwimlaneMenuContributionItem.getAction().setEnabled(enabled);
removeSwimlaneToolbarContributionItem.getAction().setEnabled(enabled);
}
private void addAddSwimlaneAction() {
getActionBars().getToolBarManager().add(addSwimlaneToolbarContributionItem);
getActionBars().getMenuManager().add(addSwimlaneMenuContributionItem);
}
private void createAddSwimlaneContributions() {
addSwimlaneToolbarContributionItem = new ActionContributionItem(createAddSwimlaneAction());
addSwimlaneMenuContributionItem = new ActionContributionItem(createAddSwimlaneAction());
}
private IAction createAddSwimlaneAction() {
IAction action = new Action() {
public void run() {
addNewSwimlane();
}
};
action.setImageDescriptor(
ImageDescriptor.createFromURL(Plugin.getDefault()
.getBundle().getEntry("/icons/full/obj16/new_swimlane_enabled.gif")));
action.setDisabledImageDescriptor(
ImageDescriptor.createFromURL(Plugin.getDefault()
.getBundle().getEntry("/icons/full/obj16/new_swimlane_disabled.gif")));
action.setToolTipText("Add a swimlane");
action.setText("New Swimlane");
return action;
}
IContributionItem item;
private void addRemoveSwimlaneAction() {
getActionBars().getToolBarManager().add(removeSwimlaneToolbarContributionItem);
getActionBars().getMenuManager().add(removeSwimlaneMenuContributionItem);
}
private void createRemoveSwimlaneContributions() {
createRemoveSwimlaneAction();
removeSwimlaneToolbarContributionItem = new ActionContributionItem(createRemoveSwimlaneAction());
removeSwimlaneMenuContributionItem = new ActionContributionItem(createRemoveSwimlaneAction());
}
private IAction createRemoveSwimlaneAction() {
IAction action = new Action() {
public void run() {
removeSelectedSwimlane();
}
};
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 swimlane");
action.setText("Delete");
action.setEnabled(false);
return action;
}
private void addNewSwimlane() {
ProcessDefinition processDefinition = swimlaneSection.getProcessDefinition();
SwimlaneCreateCommand command = new SwimlaneCreateCommand(processDefinition.getFactory());
command.setProcessDefinition(processDefinition);
getCommandStack().execute(command);
}
private void removeSelectedSwimlane() {
SwimlaneDeleteCommand command = new SwimlaneDeleteCommand();
command.setProcessDefinition(swimlaneSection.getProcessDefinition());
command.setSwimlane(swimlaneSection.getSelectedSwimlane());
getCommandStack().execute(command);
}
private CommandStack getCommandStack() {
return swimlaneSection.getCommandStack();
}
private void removeAddSwimlaneAction() {
getActionBars().getToolBarManager().remove(addSwimlaneToolbarContributionItem);
getActionBars().getMenuManager().remove(addSwimlaneMenuContributionItem);
}
private void removeRemoveSwimlaneAction() {
getActionBars().getToolBarManager().remove(removeSwimlaneToolbarContributionItem);
getActionBars().getMenuManager().remove(removeSwimlaneMenuContributionItem);
}
private IActionBars getActionBars() {
return swimlaneSection.getTabbedPropertySheetPage().getSite().getActionBars();
}
public void createPopupMenu(Composite composite) {
root = new Menu(composite);
composite.setMenu(root);
root.addMenuListener(new MenuAdapter() {
public void menuShown(MenuEvent e) {
disposePopupMenu();
createPopupMenu();
}
});
}
private void disposePopupMenu() {
MenuItem[] menuItems = root.getItems();
for (int i = 0; i < menuItems.length; i++) {
menuItems[i].dispose();
}
}
private void createPopupMenu() {
createAddSwimlaneMenuItem();
new MenuItem(root, SWT.SEPARATOR);
createRemoveSwimlaneMenuItem();
}
private String getDeleteImagePath() {
String imagePath;
if (swimlaneSection.getSelectedSwimlane() != null) {
imagePath = "/icons/full/obj16/delete_enabled.gif";
} else {
imagePath = "/icons/full/obj16/delete_disabled.gif";
}
return imagePath;
}
private void createAddSwimlaneMenuItem() {
MenuItem addSwimlaneItem = new MenuItem(root, SWT.PUSH);
addSwimlaneItem.setText("New Swimlane");
ImageDescriptor descriptor = ImageDescriptor.createFromURL(Plugin.getDefault()
.getBundle().getEntry("/icons/full/obj16/new_swimlane_enabled.gif"));
addSwimlaneItem.setImage(SharedImages.INSTANCE.getImage(descriptor));
addSwimlaneItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
addNewSwimlane();
}
});
}
private void createRemoveSwimlaneMenuItem() {
MenuItem removeSwimlaneItem = new MenuItem(root, SWT.PUSH);
removeSwimlaneItem.setText("Delete");
ImageDescriptor descriptor = ImageDescriptor.createFromURL(Plugin.getDefault()
.getBundle().getEntry(getDeleteImagePath()));
removeSwimlaneItem.setImage(SharedImages.INSTANCE.getImage(descriptor));
removeSwimlaneItem.setEnabled(swimlaneSection.getSelectedSwimlane() != null);
removeSwimlaneItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
removeSelectedSwimlane();
}
});
}
}