package org.jbpm.gd.jpdl.properties;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
import org.jboss.tools.jbpm.util.AutoResizeTableLayout;
import org.jbpm.gd.common.model.GenericElement;
import org.jbpm.gd.jpdl.model.EsbElement;
public class EsbInputOutputConfigurationComposite implements SelectionListener, FocusListener, MouseListener {
public static EsbInputOutputConfigurationComposite create(TabbedPropertySheetWidgetFactory widgetFactory, Composite parent, int type) {
if (type != 0 && type != 1) throw new RuntimeException("The type should be 0 or 1");
EsbInputOutputConfigurationComposite result = new EsbInputOutputConfigurationComposite();
result.type = type;
result.widgetFactory = widgetFactory;
result.parent = parent;
result.create();
return result;
}
public static int INPUT_CONFIGURATION = 0;
public static int OUTPUT_CONFIGURATION = 1;
private TabbedPropertySheetWidgetFactory widgetFactory;
private Composite parent;
private int type;
private Table table;
private TableEditor editor;
private Text text;
private Button addButton;
private Button removeButton;
int selectedColumn = -1;
private EsbElement esbElement;
private EsbInputOutputConfigurationComposite() {}
public void setEsbElement(EsbElement esbElement) {
if (this.esbElement == esbElement) return;
unhookSelectionListener();
clearControls();
this.esbElement = esbElement;
if (esbElement != null) {
updateControls();
hookSelectionListener();
}
}
private void hookSelectionListener() {
addButton.addSelectionListener(this);
removeButton.addSelectionListener(this);
table.addSelectionListener(this);
table.addMouseListener(this);
}
private void unhookSelectionListener() {
addButton.removeSelectionListener(this);
removeButton.removeSelectionListener(this);
table.removeSelectionListener(this);
table.removeMouseListener(this);
}
private void clearControls() {
addButton.setEnabled(true);
removeButton.setEnabled(false);
table.removeAll();
}
private void updateControls() {
GenericElement[] elements = getMappings();
for (int i = 0; i < elements.length; i++) {
TableItem item = new TableItem(table, SWT.NONE);
item.setData(elements[i]);
item.setText(jbpmColumnIndex(), getAttribute("bpm", elements[i]));
item.setText(esbColumnIndex(), getAttribute("esb", elements[i]));
}
}
private String getAttribute(String name, GenericElement element) {
String result = (String)element.getGenericAttibutes().get(name);
return result == null ? "" : result;
}
private void create() {
table = widgetFactory.createTable(parent, SWT.FULL_SELECTION | SWT.V_SCROLL);
addButton = widgetFactory.createButton(parent, "Add", SWT.PUSH);
removeButton = widgetFactory.createButton(parent, "Remove", SWT.PUSH);
table.setLayoutData(createTableLayoutData());
addButton.setLayoutData(createAddButtonLayoutData());
removeButton.setLayoutData(createRemoveButtonLayoutData());
initTable();
createEditor();
}
private void createEditor() {
editor = new TableEditor(table);
text = new Text(table, SWT.NORMAL);
text.setVisible(false);
text.setText("");
editor.minimumWidth = text.getSize().x;
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
}
private void initTable() {
table.setHeaderVisible(true);
table.setLinesVisible(true);
// AutoResizeTableLayout handlerConfigBeanTableLayout = new AutoResizeTableLayout(table);
TableLayout handlerConfigBeanTableLayout = new TableLayout();
handlerConfigBeanTableLayout.addColumnData(new ColumnWeightData(50));
handlerConfigBeanTableLayout.addColumnData(new ColumnWeightData(50));
table.setLayout(handlerConfigBeanTableLayout);
TableColumn jbpmNameColumn = new TableColumn(table, SWT.NONE);
jbpmNameColumn.setText(columnHeaders()[0]);
TableColumn esbNameColumn = new TableColumn(table, SWT.NONE);
esbNameColumn.setText(columnHeaders()[1]);
}
private FormData createAddButtonLayoutData() {
FormData result = new FormData();
result.top = new FormAttachment(0, 0);
result.right = new FormAttachment(100, 0);
result.left = new FormAttachment(removeButton, 0);
result.left.alignment = SWT.LEFT;
return result;
}
private FormData createRemoveButtonLayoutData() {
FormData result = new FormData();
result.top = new FormAttachment(addButton, 0);
result.right = new FormAttachment(100, 0);
return result;
}
private FormData createTableLayoutData() {
FormData result = new FormData();
result.top = new FormAttachment(0, 0);
result.left = new FormAttachment(0, 0);
result.bottom = new FormAttachment(100, 0);
result.right = new FormAttachment(removeButton, 0);
return result;
}
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
if (e.widget == addButton) {
handleAddButtonSelected();
} else if (e.widget == removeButton) {
handleRemoveButtonSelected();
} else if (e.widget == table) {
handleTableRowSelected();
}
}
private void handleAddButtonSelected() {
GenericElement element = (GenericElement)esbElement.getFactory().createById("org.jbpm.gd.jpdl.genericElement");
element.setName("mapping");
addElement(element);
TableItem item = new TableItem(table, SWT.NONE);
item.setText(jbpmColumnIndex(), getNextName("bpm", jbpmColumnIndex()));
item.setText(esbColumnIndex(), getNextName("esb", esbColumnIndex()));
element.addGenericAttribute("bpm", item.getText(jbpmColumnIndex()));
element.addGenericAttribute("esb", item.getText(esbColumnIndex()));
item.setData(element);
table.setSelection(item);
}
private String getNextName(String kind, int pos) {
int runner = 1;
while (true) {
boolean goodCandidate = true;
String candidate = kind + "Name" + runner;
TableItem[] items = table.getItems();
for (int i = 0; i < items.length; i++) {
if (candidate.equals(items[i].getText(pos))) {
goodCandidate = false;
}
}
if (goodCandidate) return candidate;
runner++;
}
}
private void handleRemoveButtonSelected() {
int i = table.getSelectionIndex();
if (i == -1) return;
TableItem item = table.getItem(i);
removeElement((GenericElement)item.getData());
table.remove(i);
removeButton.setEnabled(table.getItemCount() == 0);
}
private void handleTableRowSelected() {
removeButton.setEnabled(table.getSelection() != null);
}
public void focusGained(FocusEvent e) {
}
public void focusLost(FocusEvent e) {
if (e.widget == text) {
applyValue();
endEdit();
}
}
private void applyValue() {
int i = table.getSelectionIndex();
if (i == -1) return;
TableItem item = table.getItem(i);
item.setText(selectedColumn, text.getText());
GenericElement element = (GenericElement)item.getData();
if (element == null) return;
element.addGenericAttribute("bpm", item.getText(jbpmColumnIndex()));
element.addGenericAttribute("esb", item.getText(esbColumnIndex()));
}
public void mouseDoubleClick(MouseEvent e) {
}
public void mouseDown(MouseEvent e) {
selectedColumn = getSelectedColumn(e.x, e.y);
if (selectedColumn == -1) return;
doEdit();
}
private void doEdit() {
if (text.isVisible()) endEdit();
if (table.getSelectionIndex() == -1 || selectedColumn == -1) return;
TableItem selection = table.getItem(table.getSelectionIndex());
String value = selection.getText(selectedColumn);
text.setText(value == null ? "" : value);
editor.setEditor(text, selection, selectedColumn);
text.setVisible(true);
text.selectAll();
text.setFocus();
text.addFocusListener(this);
}
private void endEdit() {
text.setVisible(false);
text.setText("");
text.removeFocusListener(this);
}
private int getSelectedColumn(int x, int y) {
int columnToEdit = -1;
int columns = table.getColumnCount();
TableItem tableItem = getSelectedTableItem();
if (tableItem == null) return -1;
for (int i = 0; i < columns; i++) {
Rectangle bounds = tableItem.getBounds(i);
if (bounds.contains(x, y)) {
columnToEdit = i;
break;
}
}
return columnToEdit;
}
private TableItem getSelectedTableItem() {
TableItem[] selection = table.getSelection();
if (selection.length > 0) {
return selection[0];
} else {
return null;
}
}
public void mouseUp(MouseEvent e) {
}
private interface InputOutputConfigurationStrategy {
int jbpmColumnIndex();
int esbColumnIndex();
String[] columnHeaders();
void addElement(GenericElement element);
void removeElement(GenericElement element);
GenericElement[] getMappings();
}
private InputOutputConfigurationStrategy[]configurationStrategies = new InputOutputConfigurationStrategy[] {
new InputOutputConfigurationStrategy() {
public void addElement(GenericElement element) {
esbElement.addJbpmToEsbMapping(element);
}
public String[] columnHeaders() {
return new String[] {"jBPM Name", "ESB Name"};
}
public int esbColumnIndex() {
return 1;
}
public int jbpmColumnIndex() {
return 0;
}
public void removeElement(GenericElement element) {
esbElement.removeJbpmToEsbMapping(element);
}
public GenericElement[] getMappings() {
return esbElement.getJbpmToEsbMappings();
}
},
new InputOutputConfigurationStrategy() {
public void addElement(GenericElement element) {
esbElement.addEsbToJbpmMapping(element);
}
public String[] columnHeaders() {
return new String[] {"ESB Name", "jBPM Name"};
}
public int esbColumnIndex() {
return 0;
}
public int jbpmColumnIndex() {
return 1;
}
public void removeElement(GenericElement element) {
esbElement.removeEsbToJbpmMapping(element);
}
public GenericElement[] getMappings() {
return esbElement.getEsbToJbpmMappings();
}
}
};
private int jbpmColumnIndex() {
return configurationStrategies[type].jbpmColumnIndex();
}
private int esbColumnIndex() {
return configurationStrategies[type].esbColumnIndex();
}
private String[] columnHeaders() {
return configurationStrategies[type].columnHeaders();
}
private void addElement(GenericElement element) {
configurationStrategies[type].addElement(element);
}
private void removeElement(GenericElement element) {
configurationStrategies[type].removeElement(element);
}
private GenericElement[] getMappings() {
return configurationStrategies[type].getMappings();
}
}