package org.jbpm.gd.jpdl.properties; import org.eclipse.swt.SWT; 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.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory; import org.jbpm.gd.jpdl.model.Reminder; import org.jbpm.gd.jpdl.model.Task; public class TaskReminderConfigurationComposite implements FocusListener, SelectionListener { public static TaskReminderConfigurationComposite create(TabbedPropertySheetWidgetFactory widgetFactory, Composite parent) { TaskReminderConfigurationComposite result = new TaskReminderConfigurationComposite(); result.widgetFactory = widgetFactory; result.parent = parent; result.create(); return result; } private TabbedPropertySheetWidgetFactory widgetFactory; private Composite parent; private Button reminderButton; private Composite reminderComposite; private Label duedateLabel; private Text duedateText; private Label repeatLabel; private Text repeatText; private Task task; public void setTask(Task task) { if (this.task == task) return; unhookListeners(); clearControls(); this.task = task; if (task != null) { updateControls(); hookListeners(); } } private void hookListeners() { reminderButton.addSelectionListener(this); duedateText.addFocusListener(this); repeatText.addFocusListener(this); } private void unhookListeners() { reminderButton.removeSelectionListener(this); duedateText.removeFocusListener(this); repeatText.removeFocusListener(this); } private void clearControls() { reminderButton.setSelection(false); duedateText.setText(""); repeatText.setText(""); reminderComposite.setVisible(false); } private void updateControls() { reminderButton.setSelection(task.getReminder() != null); duedateText.setText(getDueDateText()); repeatText.setText(getRepeatText()); reminderComposite.setVisible(reminderButton.getSelection()); } private String getDueDateText() { String result = ""; if (task.getReminder() != null && task.getReminder().getDueDate() != null) { result = task.getReminder().getDueDate(); } return result; } private String getRepeatText() { String result =""; if (task.getReminder() != null && task.getReminder().getRepeat() != null) { result = task.getReminder().getRepeat(); } return result; } private void create() { reminderButton = widgetFactory.createButton(parent, "Configure Reminder", SWT.CHECK); reminderComposite = widgetFactory.createFlatFormComposite(parent); duedateLabel = widgetFactory.createLabel(reminderComposite, "Due Date"); duedateText = widgetFactory.createText(reminderComposite, ""); repeatLabel = widgetFactory.createLabel(reminderComposite, "Repeat"); repeatText = widgetFactory.createText(reminderComposite, ""); reminderButton.setLayoutData(createReminderButtonLayoutData()); reminderComposite.setLayoutData(createReminderCompositeLayoutData()); duedateLabel.setLayoutData(createDuedateLabelLayoutData()); duedateText.setLayoutData(createDuedateTextLayoutData()); repeatLabel.setLayoutData(createRepeatLabelLayoutData()); repeatText.setLayoutData(createRepeatTextLayoutData()); } private FormData createReminderButtonLayoutData() { FormData data = new FormData(); data.left = new FormAttachment(0, 0); data.top = new FormAttachment(0, 2); return data; } private FormData createReminderCompositeLayoutData() { FormData data = new FormData(); data.left = new FormAttachment(0, -3); data.top = new FormAttachment(reminderButton, -3); data.right = new FormAttachment(100, 3); return data; } private FormData createDuedateLabelLayoutData() { FormData data = new FormData(); data.left = new FormAttachment(0, 0); data.top = new FormAttachment(0, 2); return data; } private FormData createDuedateTextLayoutData() { FormData data = new FormData(); data.left = new FormAttachment(duedateLabel, 0); data.right = new FormAttachment(100, 0); data.top = new FormAttachment(0, 0); return data; } private FormData createRepeatLabelLayoutData() { FormData data = new FormData(); data.left = new FormAttachment(0, 0); data.top = new FormAttachment(duedateText, 2); return data; } private FormData createRepeatTextLayoutData() { FormData data = new FormData(); data.left = new FormAttachment(duedateLabel, 0); data.right = new FormAttachment(100, 0); data.top = new FormAttachment(duedateText, 0); return data; } public void focusGained(FocusEvent e) { } public void focusLost(FocusEvent e) { if (e.widget == duedateText) { task.getReminder().setDueDate(duedateText.getText()); } else if (e.widget == repeatText) { task.getReminder().setRepeat("".equals(repeatText.getText()) ? null : repeatText.getText()); } } public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { if (e.widget == reminderButton) { if (reminderButton.getSelection()) { Reminder reminder = task.getReminder(); if (reminder == null) { reminder = (Reminder)task.getFactory().createById("org.jbpm.gd.jpdl.reminder"); task.setReminder(reminder); } reminder.setDueDate(duedateText.getText()); reminder.setRepeat("".equals(repeatText.getText()) ? null : repeatText.getText()); } else { task.setReminder(null); } reminderComposite.setVisible(reminderButton.getSelection()); } } }