package org.jbpm.gd.jpdl.properties; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory; import org.jbpm.gd.jpdl.model.Task; import org.jbpm.gd.jpdl.util.BooleanTypeHelper; public class TaskDetailsConfigurationComposite implements SelectionListener, FocusListener { public static TaskDetailsConfigurationComposite create(TabbedPropertySheetWidgetFactory widgetFactory, Composite parent) { TaskDetailsConfigurationComposite result = new TaskDetailsConfigurationComposite(); result.widgetFactory = widgetFactory; result.parent = parent; result.create(); return result; } private TabbedPropertySheetWidgetFactory widgetFactory; private Composite parent; private Task task; private Label duedateLabel; private Text duedateText; private Label priorityLabel; private CCombo priorityCombo; private Button blockingButton; private Button signallingButton; private Button notifyButton; private Button formButton; private TaskDetailsConfigurationComposite() {} public void setTask(Task task) { if (this.task == task) return; unhookListeners(); this.task = task; clearControls(); if (task != null) { updateControls(); hookListeners(); } } private void hookListeners() { duedateText.addFocusListener(this); priorityCombo.addFocusListener(this); priorityCombo.addSelectionListener(this); blockingButton.addSelectionListener(this); signallingButton.addSelectionListener(this); notifyButton.addSelectionListener(this); formButton.addSelectionListener(this); } private void unhookListeners() { duedateText.removeFocusListener(this); priorityCombo.removeFocusListener(this); priorityCombo.removeSelectionListener(this); blockingButton.removeSelectionListener(this); signallingButton.removeSelectionListener(this); notifyButton.removeSelectionListener(this); formButton.removeSelectionListener(this); } private void clearControls() { duedateText.setText(""); priorityCombo.setText(""); blockingButton.setSelection(false); signallingButton.setSelection(false); notifyButton.setSelection(false); } private void updateControls() { duedateText.setText(task.getDueDate() != null ? task.getDueDate() : ""); priorityCombo.setText(task.getPriority()); blockingButton.setSelection(BooleanTypeHelper.booleanValue(task.getBlocking())); signallingButton.setSelection(BooleanTypeHelper.booleanValue(task.getSignalling())); notifyButton.setSelection(BooleanTypeHelper.booleanValue(task.getNotify())); } private void create() { duedateLabel = widgetFactory.createLabel(parent, "Due Date"); duedateText = widgetFactory.createText(parent, ""); priorityLabel = widgetFactory.createLabel(parent, "Priority"); priorityCombo = widgetFactory.createCCombo(parent); priorityCombo.setItems(getPriorityItems()); priorityCombo.setEditable(true); blockingButton = widgetFactory.createButton(parent, "Blocking", SWT.CHECK); signallingButton = widgetFactory.createButton(parent, "Signalling", SWT.CHECK); notifyButton = widgetFactory.createButton(parent, "Notify", SWT.CHECK); formButton = widgetFactory.createButton(parent, "Generate Form...", SWT.PUSH); duedateLabel.setLayoutData(createDuedateLabelLayoutData()); duedateText.setLayoutData(createDuedateTextLayoutData()); priorityLabel.setLayoutData(createPriorityLabelLayoutData()); priorityCombo.setLayoutData(createPriorityComboLayoutData()); blockingButton.setLayoutData(createBlockingButtonLayoutData()); signallingButton.setLayoutData(createSignallingButtonLayoutData()); notifyButton.setLayoutData(createNotifyButtonLayoutData()); formButton.setLayoutData(createFormButtonLayoutData()); } private String[] getPriorityItems() { return new String[] {"highest", "high", "normal", "low", "lowest"}; } private FormData createDuedateLabelLayoutData() { FormData data = new FormData(); data.top = new FormAttachment(0, 2); data.left = new FormAttachment(0, 0); return data; } private FormData createDuedateTextLayoutData() { FormData data = new FormData(); data.top = new FormAttachment(0, 0); data.left = new FormAttachment(duedateLabel, 0); data.right = new FormAttachment(100, 0); return data; } private FormData createPriorityLabelLayoutData() { FormData data = new FormData(); data.top = new FormAttachment(duedateText, 2); data.left = new FormAttachment(0, 0); return data; } private FormData createPriorityComboLayoutData() { FormData data = new FormData(); data.top = new FormAttachment(duedateText, 0); data.left = new FormAttachment(duedateLabel, 0); data.right = new FormAttachment(blockingButton); return data; } private FormData createBlockingButtonLayoutData() { FormData data = new FormData(); data.top = new FormAttachment(duedateText, 2); data.right = new FormAttachment(signallingButton, 0); return data; } private FormData createSignallingButtonLayoutData() { FormData data = new FormData(); data.top = new FormAttachment(duedateText, 2); data.right = new FormAttachment(notifyButton, 0); return data; } private FormData createNotifyButtonLayoutData() { FormData data = new FormData(); data.top = new FormAttachment(duedateText, 2); data.right = new FormAttachment(100, 0); return data; } private FormData createFormButtonLayoutData() { FormData data = new FormData(); data.left = new FormAttachment(0, 0); data.top = new FormAttachment(priorityCombo, 0); return data; } public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { if (e.widget == formButton) { handleFormButtonSelected(); } else if (e.widget == priorityCombo) { handlePriorityComboEdited(); } else if (e.widget == blockingButton) { handleBlockingButtonSelected(); } else if (e.widget == signallingButton) { handleSignallingButtonSelected(); } else if (e.widget == notifyButton) { handleNotifyButtonSelected(); } } public void focusGained(FocusEvent e) { } public void focusLost(FocusEvent e) { handleEdited(e.widget); } private void handleFormButtonSelected() { String name = task.getName(); if (name == null || "".equals(name)) { new MessageDialog( null, "Unnamed Task", null, "The task for which you want to generate a form has no name. " + "Please return to the 'Name' field on the 'General' properties " + "tab for this task and enter a name before trying to generate " + "the form again.", MessageDialog.INFORMATION, new String[] {"OK"}, 0).open(); } else { new TaskFormGenerationDialog(parent.getShell(), name).open(); } } private void handleBlockingButtonSelected() { if (blockingButton.getSelection()) { task.setBlocking("true"); } else { task.setBlocking("false"); } } private void handleSignallingButtonSelected() { if (signallingButton.getSelection()) { task.setSignalling("true"); } else { task.setSignalling("false"); } } private void handleNotifyButtonSelected() { if (notifyButton.getSelection()) { task.setNotify("true"); } else { task.setNotify("false"); } } private void handleEdited(Widget widget) { if (widget == duedateText) { task.setDueDate("".equals(duedateText.getText()) ? null : duedateText.getText()); } else if (widget == priorityCombo) { handlePriorityComboEdited(); } } private void handlePriorityComboEdited() { task.setPriority(priorityCombo.getText()); } }