/*
* Copyright 2010 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.eclipse.flow.common.editor.editpart.work;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.drools.core.process.core.Work;
import org.drools.core.process.core.WorkDefinition;
import org.drools.core.process.core.WorkEditor;
import org.drools.core.process.core.impl.WorkImpl;
import org.drools.eclipse.DroolsEclipsePlugin;
import org.drools.eclipse.flow.common.view.property.EditBeanDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
/**
* Custom Work editor for email work item.
*/
public class EmailCustomEditor extends EditBeanDialog<Work> implements WorkEditor {
private List<Recipient> recipients = new ArrayList<Recipient>();
private Text fromText;
private Text subjectText;
private Text bodyText;
public EmailCustomEditor(Shell parentShell) {
super(parentShell, "Custom Work Editor");
setBlockOnOpen(true);
}
protected Control createDialogArea(Composite parent) {
Work work = (Work) getValue();
String from = (String) work.getParameter("From");
String to = (String)work.getParameter("To");
String body = (String)work.getParameter("Body");
String subject = (String)work.getParameter("Subject");
if (to != null) {
for (String email: to.split(";")) {
if (!"".equals(email)) {
Recipient recipient = new Recipient();
recipient.setEmail(email);
recipients.add(recipient);
}
}
}
Composite composite = (Composite) super.createDialogArea(parent);
composite.setLayout(new FillLayout());
final TabFolder tabFolder = new TabFolder(composite, SWT.NONE);
createHeadersTab(tabFolder);
createBodyTab(tabFolder);
if (from != null) {
fromText.setText(from);
}
if (subject != null) {
subjectText.setText(subject);
}
if (body != null) {
bodyText.setText(body);
}
return composite;
}
public void createHeadersTab(TabFolder tabFolder) {
final TabItem headersTabItem = new TabItem(tabFolder, SWT.NONE);
headersTabItem.setText("Header");
final Composite container = new Composite(tabFolder, SWT.NONE);
final GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
gridLayout.horizontalSpacing = 2;
container.setLayout(gridLayout);
headersTabItem.setControl(container);
final Label recipientsLabel = new Label(container, SWT.NONE);
final GridData gd_recipientsLabel = new GridData();
recipientsLabel.setLayoutData(gd_recipientsLabel);
recipientsLabel.setText("Recipients");
new Label(container, SWT.NONE);
// create main table
final TableViewer tableViewer = new TableViewer(container, SWT.BORDER
| SWT.FULL_SELECTION);
// // Type column
// TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.NONE);
// column.setLabelProvider(new TypeLabelProvider());
// column.setEditingSupport(new TypeEditing(tableViewer));
// column.getColumn().setWidth(70);
// column.getColumn().setText("Type");
// column.getColumn().setMoveable(true);
//
// // Display Name column
// column = new TableViewerColumn(tableViewer, SWT.NONE);
// column.setLabelProvider(new DisplayNameLabelProvider());
// column.setEditingSupport(new DisplayNameEditing(tableViewer));
// column.getColumn().setWidth(200);
// column.getColumn().setText("Display Name");
// column.getColumn().setMoveable(true);
// Email column
TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.NONE);
column.setLabelProvider(new EmailLabelProvider());
column.setEditingSupport(new EmailEditing(tableViewer));
column.getColumn().setText("Email Address");
column.getColumn().setWidth(200);
column.getColumn().setMoveable(true);
final Table table = tableViewer.getTable();
final GridData gd_table = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1);
gd_table.heightHint = 128;
table.setLayoutData(gd_table);
table.setLinesVisible(true);
table.setHeaderVisible(true);
tableViewer.setContentProvider(new RecipientsContentProvider());
tableViewer.setInput(recipients);
// add/delete buttons
final Composite composite = new Composite(container, SWT.NONE);
composite.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
composite.setLayout(new RowLayout());
final Button addButton = new Button(composite, SWT.NONE);
addButton.setText("Add");
addButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
Recipient recipient = new Recipient();
recipients.add(recipient);
tableViewer.add(recipient);
tableViewer.refresh();
}
public void widgetSelected(SelectionEvent e) {
Recipient recipient = new Recipient();
recipients.add(recipient);
tableViewer.add(recipient);
tableViewer.refresh();
}
});
final Button deleteButton = new Button(composite, SWT.NONE);
deleteButton.setText("Remove");
deleteButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent event) {
TableItem[] items = table.getSelection();
if (items != null && items.length > 0) {
recipients.remove((Recipient) items[0].getData());
tableViewer.remove(items[0]);
tableViewer.refresh();
}
}
public void widgetDefaultSelected(SelectionEvent event) {
TableItem[] items = table.getSelection();
if (items != null && items.length > 0) {
recipients.remove((Recipient) items[0].getData());
tableViewer.remove(items[0]);
tableViewer.refresh();
}
}
});
// from label and text field
final Label fromLabel = new Label(container, SWT.NONE);
fromLabel.setLayoutData(new GridData());
fromLabel.setText("From");
fromText = new Text(container, SWT.BORDER);
fromText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
}
public void createBodyTab(TabFolder tabFolder) {
final TabItem headersTabItem = new TabItem(tabFolder, SWT.NONE);
headersTabItem.setText("Body");
final Composite container = new Composite(tabFolder, SWT.NONE);
final GridLayout gridLayout = new GridLayout();
gridLayout.horizontalSpacing = 2;
container.setLayout(gridLayout);
headersTabItem.setControl(container);
// subject label and text field
final Label subjectLabel = new Label(container, SWT.NONE);
subjectLabel.setLayoutData(new GridData());
subjectLabel.setText("Subject");
subjectText = new Text(container, SWT.BORDER);
subjectText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
final Label bodyLabel = new Label(container, SWT.NONE);
bodyLabel.setText("Body");
bodyText = new Text(container, SWT.MULTI | SWT.BORDER);
final GridData gd_bodyText = new GridData(SWT.FILL, SWT.CENTER, true, false);
gd_bodyText.heightHint = 175;
bodyText.setLayoutData(gd_bodyText);
}
protected Work updateValue(Work value) {
Work work = new WorkImpl();
work.setName(value.getName());
work.setParameter("From", fromText.getText());
String to = "";
for (int i = 0; i < recipients.size(); i++) {
to += recipients.get(i).getEmail();
if (i != recipients.size() - 1) {
to += ";";
}
}
work.setParameter("To", to);
work.setParameter("Subject", subjectText.getText());
work.setParameter("Body", bodyText.getText());
work.setParameterDefinitions(value.getParameterDefinitions());
return work;
}
public Work getWork() {
return getValue();
}
public void setWork(Work work) {
setValue(work);
}
public void setWorkDefinition(WorkDefinition workDefinition) {
if (!"Email".equals(workDefinition.getName())) {
DroolsEclipsePlugin.log(new IllegalArgumentException(
"The emailCustomEditor can only handle email work items."));
}
}
public boolean show() {
int result = open();
return result == OK;
}
private class TypeLabelProvider extends ColumnLabelProvider {
public String getText(Object element) {
return ((Recipient) element).getType();
}
}
private class TypeEditing extends EditingSupport {
private ComboBoxCellEditor cellEditor;
private String[] values = new String[] { "to", "cc", "bcc" };
public TypeEditing(TableViewer viewer) {
super(viewer);
cellEditor = new ComboBoxCellEditor(viewer.getTable(), values);
}
protected boolean canEdit(Object element) {
return true;
}
protected CellEditor getCellEditor(Object element) {
return cellEditor;
}
protected Object getValue(Object element) {
Recipient p = ((Recipient) element);
return new Integer(Arrays.binarySearch(this.values, p.getType()));
}
protected void setValue(Object element, Object value) {
int i = ((Integer) value).intValue();
if (i != -1) {
((Recipient) element).setType(this.values[i]);
}
getViewer().update(element, null);
}
}
private class DisplayNameLabelProvider extends ColumnLabelProvider {
public String getText(Object element) {
return ((Recipient) element).getDisplayName();
}
}
private class DisplayNameEditing extends EditingSupport {
private TextCellEditor cellEditor;
public DisplayNameEditing(TableViewer viewer) {
super(viewer);
cellEditor = new TextCellEditor(viewer.getTable());
}
protected boolean canEdit(Object element) {
return true;
}
protected CellEditor getCellEditor(Object element) {
return cellEditor;
}
protected Object getValue(Object element) {
return ((Recipient) element).getDisplayName();
}
protected void setValue(Object element, Object value) {
((Recipient) element).setDisplayName(value.toString());
getViewer().update(element, null);
}
}
private class EmailLabelProvider extends ColumnLabelProvider {
public String getText(Object element) {
return ((Recipient) element).getEmail();
}
}
private class EmailEditing extends EditingSupport {
private TextCellEditor cellEditor;
public EmailEditing(TableViewer viewer) {
super(viewer);
cellEditor = new TextCellEditor(viewer.getTable());
}
protected boolean canEdit(Object element) {
return true;
}
protected CellEditor getCellEditor(Object element) {
return cellEditor;
}
protected Object getValue(Object element) {
return ((Recipient) element).getEmail();
}
protected void setValue(Object element, Object value) {
((Recipient) element).setEmail(value.toString());
getViewer().update(element, null);
}
}
private class Recipient {
private String type = "to";
private String displayName = "";
private String email = "john.doe@mail.com";
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
private class RecipientsContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) {
return recipients.toArray();
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
}