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.MailNode;
import org.jbpm.gd.jpdl.model.Subject;
public class MailNodeConfigurationComposite implements SelectionListener, FocusListener {
public static MailNodeConfigurationComposite create(TabbedPropertySheetWidgetFactory widgetFactory, Composite parent) {
MailNodeConfigurationComposite result = new MailNodeConfigurationComposite();
result.widgetFactory = widgetFactory;
result.parent = parent;
result.create();
return result;
}
private TabbedPropertySheetWidgetFactory widgetFactory;
private Composite parent;
private Label templateLabel;
private Text templateText;
private Button toButton;
private Text toText;
private Button actorsButton;
private Text actorsText;
private Label subjectLabel;
private Text subjectText;
private Label bodyLabel;
private Text bodyText;
private MailNode mailNode;
private MailNodeConfigurationComposite() {}
public void setMailNode(MailNode mailNode) {
if (this.mailNode == mailNode) return;
unhookListeners();
this.mailNode = mailNode;
if (mailNode == null) {
clearControls();
} else {
updateControls();
hookListeners();
}
}
private void hookListeners() {
templateText.addSelectionListener(this);
templateText.addFocusListener(this);
toButton.addSelectionListener(this);
toText.addSelectionListener(this);
toText.addFocusListener(this);
actorsButton.addSelectionListener(this);
actorsText.addSelectionListener(this);
actorsText.addFocusListener(this);
subjectText.addSelectionListener(this);
subjectText.addFocusListener(this);
bodyText.addSelectionListener(this);
bodyText.addFocusListener(this);
}
private void unhookListeners() {
templateText.removeSelectionListener(this);
templateText.removeFocusListener(this);
toButton.removeSelectionListener(this);
toText.removeSelectionListener(this);
toText.removeFocusListener(this);
actorsButton.removeSelectionListener(this);
actorsText.removeSelectionListener(this);
actorsText.removeFocusListener(this);
subjectText.removeSelectionListener(this);
subjectText.removeFocusListener(this);
bodyText.removeSelectionListener(this);
bodyText.removeFocusListener(this);
}
private void clearControls() {
templateText.setText("");
toButton.setSelection(true);
toText.setText("");
toText.setEnabled(true);
actorsButton.setSelection(false);
actorsText.setText("");
actorsText.setEnabled(false);
subjectText.setText("");
bodyText.setText("");
}
private void updateControls() {
templateText.setText(mailNode.getTemplate() == null ? "" : mailNode.getTemplate());
if (mailNode.getActors() != null) {
toButton.setSelection(false);
actorsButton.setSelection(true);
toText.setText("");
toText.setEnabled(false);
actorsText.setText(mailNode.getActors());
actorsText.setEnabled(true);
} else {
toButton.setSelection(true);
actorsButton.setSelection(false);
actorsText.setText("");
actorsText.setEnabled(false);
toText.setText(mailNode.getTo() == null ? "" : mailNode.getTo());
toText.setEnabled(true);
}
subjectText.setText(getSubjectText());
bodyText.setText(getBodyText());
}
private String getSubjectText() {
String result = "";
Subject subject = mailNode.getSubject();
if (subject != null) {
result = subject.getSubject() == null ? "" : subject.getSubject();
}
return result;
}
private String getBodyText() {
String result = "";
if (mailNode.getText() != null) {
result = mailNode.getText().getText() == null ? "" : mailNode.getText().getText();
}
return result;
}
private void create() {
templateLabel = widgetFactory.createLabel(parent, "Template");
templateText = widgetFactory.createText(parent, "");
toButton = widgetFactory.createButton(parent, "To", SWT.RADIO);
toButton.setSelection(true);
toText = widgetFactory.createText(parent, "");
actorsButton = widgetFactory.createButton(parent, "Actors", SWT.RADIO);
actorsText = widgetFactory.createText(parent, "");
actorsText.setEnabled(false);
subjectLabel = widgetFactory.createLabel(parent, "Subject");
subjectText = widgetFactory.createText(parent, "");
bodyLabel = widgetFactory.createLabel(parent, "Body");
bodyText = widgetFactory.createText(parent, "", SWT.MULTI | SWT.V_SCROLL);
templateLabel.setLayoutData(createTemplateLabelLayoutData());
templateText.setLayoutData(createTemplateTextLayoutData());
toButton.setLayoutData(createToButtonLayoutData());
toText.setLayoutData(createToTextLayoutData());
actorsButton.setLayoutData(createActorsButtonLayoutData());
actorsText.setLayoutData(createActorsTextLayoutData());
subjectLabel.setLayoutData(createSubjectLabelLayoutData());
subjectText.setLayoutData(createSubjectTextLayoutData());
bodyLabel.setLayoutData(createBodyLabelLayoutData());
bodyText.setLayoutData(createBodyTextLayoutData());
}
private FormData createToButtonLayoutData() {
FormData data = new FormData();
data.left = new FormAttachment(0, 0);
data.top = new FormAttachment(templateText, 0);
return data;
}
private FormData createToTextLayoutData() {
FormData data = new FormData();
data.left = new FormAttachment(templateText, 0);
data.left.alignment = SWT.LEFT;
data.top = new FormAttachment(templateText, 0);
data.right = new FormAttachment(50, 0);
return data;
}
private FormData createActorsButtonLayoutData() {
FormData data = new FormData();
data.left = new FormAttachment(toText, 0);
data.top = new FormAttachment(templateText, 0);
return data;
}
private FormData createActorsTextLayoutData() {
FormData data = new FormData();
data.left = new FormAttachment(actorsButton, 0);
data.top = new FormAttachment(templateText, 0);
data.right = new FormAttachment(100, 0);
return data;
}
private FormData createSubjectLabelLayoutData() {
FormData data = new FormData();
data.left = new FormAttachment(0, 0);
data.top = new FormAttachment(toText, 0);
return data;
}
private FormData createSubjectTextLayoutData() {
FormData data = new FormData();
data.left = new FormAttachment(templateText, 0);
data.left.alignment = SWT.LEFT;
data.top = new FormAttachment(toText, 0);
data.right = new FormAttachment(100, 0);
return data;
}
private FormData createBodyLabelLayoutData() {
FormData data = new FormData();
data.left = new FormAttachment(0, 0);
data.top = new FormAttachment(subjectText, 0);
return data;
}
private FormData createBodyTextLayoutData() {
FormData data = new FormData();
data.left = new FormAttachment(templateText, 0);
data.left.alignment = SWT.LEFT;
data.top = new FormAttachment(subjectText, 0);
data.right = new FormAttachment(100, 0);
data.bottom = new FormAttachment(100, 0);
data.height = 100;
return data;
}
private FormData createTemplateTextLayoutData() {
FormData data = new FormData();
data.left = new FormAttachment(templateLabel, 0);
data.top = new FormAttachment(0, 0);
data.right = new FormAttachment(100, 0);
return data;
}
private FormData createTemplateLabelLayoutData() {
FormData data = new FormData();
data.left = new FormAttachment(0, 0);
data.top = new FormAttachment(0, 0);
return data;
}
public void widgetDefaultSelected(SelectionEvent e) {
if (e.widget == templateText) {
mailNode.setTemplate(getTemplateText());
} else if (e.widget == toText) {
mailNode.setTo(toText.getText());
} else if (e.widget == actorsText) {
mailNode.setActors(actorsText.getText());
} else if (e.widget == subjectText) {
handleSubjectTextChange();
} else if (e.widget == bodyText) {
handleBodyTextChange();
}
}
private void handleSubjectTextChange() {
Subject subject = mailNode.getSubject();
if (subject == null) {
subject = (Subject)mailNode.getFactory().createById("org.jbpm.gd.jpdl.subject");
mailNode.setSubject(subject);
}
subject.setSubject(subjectText.getText());
}
private void handleBodyTextChange() {
org.jbpm.gd.jpdl.model.Text text = mailNode.getText();
if (text == null) {
text = (org.jbpm.gd.jpdl.model.Text)mailNode.getFactory().createById("org.jbpm.gd.jpdl.text");
mailNode.setText(text);
}
text.setText(bodyText.getText());
}
public void widgetSelected(SelectionEvent e) {
if (e.widget == toButton) {
handleToButtonSelection();
}
}
private void handleToButtonSelection() {
if (toButton.getSelection()) {
mailNode.setTo(toText.getText());
mailNode.setActors(null);
actorsText.setEnabled(false);
toText.setEnabled(true);
} else {
mailNode.setActors(actorsText.getText());
mailNode.setTo(null);
toText.setEnabled(false);
actorsText.setEnabled(true);
}
}
public void focusGained(FocusEvent e) {
}
public void focusLost(FocusEvent e) {
if (e.widget == templateText) {
mailNode.setTemplate(getTemplateText());
} else if (e.widget == toText) {
mailNode.setTo(toText.getText());
} else if (e.widget == actorsText) {
mailNode.setActors(actorsText.getText());
} else if (e.widget == subjectText) {
handleSubjectTextChange();
} else if (e.widget == bodyText) {
handleBodyTextChange();
}
}
private String getTemplateText() {
return "".equals(templateText.getText()) ? null : templateText.getText();
}
}