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.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
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.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.jboss.tools.jbpm.util.AutoResizeTableLayout;
import org.jbpm.gd.common.model.SemanticElement;
import org.jbpm.gd.common.model.SemanticElementFactory;
import org.jbpm.gd.jpdl.model.Variable;
import org.jbpm.gd.jpdl.model.VariableContainer;
import org.jbpm.gd.jpdl.util.VariableTableCellClickedResolver;
import org.jbpm.gd.jpdl.util.VariableTableItemWrapper;
public class VariableContainerConfigurationComposite implements SelectionListener {
public static VariableContainerConfigurationComposite create(FormToolkit widgetFactory, Composite parent, boolean nameOnly, String[] columnTitles) {
VariableContainerConfigurationComposite result = new VariableContainerConfigurationComposite();
result.widgetFactory = widgetFactory;
result.parent = parent;
result.nameOnlyVisible = nameOnly;
result.columnTitles = columnTitles;
result.create();
return result;
}
public static VariableContainerConfigurationComposite create(FormToolkit widgetFactory, Composite parent) {
return create(widgetFactory, parent, false, new String[] {"Name", "Mapped Name", "Read", "Write", "Required"});
}
private FormToolkit widgetFactory;
private Composite parent;
private Label messageLabel;
private Table variablesTable;
private Button addButton;
private Button removeButton;
private VariableContainer variableContainer;
private VariableTableCellClickedResolver resolver;
private String variableDefaultName = "variable";
private boolean nameOnlyVisible = false;
private String[] columnTitles = null;
private VariableContainerConfigurationComposite() {}
public void setVariableContainer(VariableContainer variableContainer) {
if (this.variableContainer == variableContainer) return;
unhookListeners();
this.variableContainer = variableContainer;
clearControls();
if (variableContainer != null) {
updateControls();
hookListeners();
}
}
private void hookListeners() {
addButton.addSelectionListener(this);
removeButton.addSelectionListener(this);
variablesTable.addSelectionListener(this);
variablesTable.addMouseListener(resolver);
}
private void unhookListeners() {
addButton.removeSelectionListener(this);
removeButton.removeSelectionListener(this);
variablesTable.removeSelectionListener(this);
variablesTable.removeMouseListener(resolver);
}
private void clearControls() {
variablesTable.removeAll();
addButton.setEnabled(false);
removeButton.setEnabled(false);
}
private void updateControls() {
addButton.setEnabled(true);
refreshTable();
}
private void create() {
messageLabel = widgetFactory.createLabel(parent, "Define the used variables :");
variablesTable = widgetFactory.createTable(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION);
addButton = widgetFactory.createButton(parent, "Add", SWT.PUSH);
removeButton = widgetFactory.createButton(parent, "Remove", SWT.PUSH);
resolver = new VariableTableCellClickedResolver(variablesTable);
removeButton.setEnabled(false);
messageLabel.setLayoutData(createMessageLabelLayoutData());
variablesTable.setLayoutData(createVariablesTableLayoutData());
addButton.setLayoutData(createAddButtonLayoutData());
removeButton.setLayoutData(createRemoveButtonLayoutData());
initializeVariablesTable();
}
private void initializeVariablesTable() {
variablesTable.setHeaderVisible(true);
variablesTable.setLinesVisible(true);
variablesTable.setLayout(new AutoResizeTableLayout(variablesTable));
initializeTableColumns();
}
private void initializeTableColumns() {
TableLayout layout = (TableLayout)variablesTable.getLayout();
TableColumn dummyColumn = new TableColumn(variablesTable, SWT.CENTER);
dummyColumn.setText("");
ColumnWeightData dummyColumnData = new ColumnWeightData(0, 0);
layout.addColumnData(dummyColumnData);
TableColumn nameColumn = new TableColumn(variablesTable, SWT.LEFT);
nameColumn.setText(columnTitles[0]);
ColumnWeightData nameColumnData = new ColumnWeightData(20, 100);
layout.addColumnData(nameColumnData);
TableColumn mappedNameColumn = new TableColumn(variablesTable, SWT.LEFT);
mappedNameColumn.setText(columnTitles[1]);
ColumnWeightData mappedNameColumnData = new ColumnWeightData(20, 100);
layout.addColumnData(mappedNameColumnData);
if (nameOnlyVisible) return;
TableColumn readColumn = new TableColumn(variablesTable, SWT.CENTER);
readColumn.setText(columnTitles[2]);
ColumnWeightData readColumnData = new ColumnWeightData(10, 60);
layout.addColumnData(readColumnData);
TableColumn writeColumn = new TableColumn(variablesTable, SWT.CENTER);
writeColumn.setText(columnTitles[3]);
ColumnWeightData writeColumnData = new ColumnWeightData(10, 60);
layout.addColumnData(writeColumnData);
TableColumn requiredColumn = new TableColumn(variablesTable, SWT.CENTER);
requiredColumn.setText(columnTitles[4]);
ColumnWeightData requiredColumnData = new ColumnWeightData(15, 75);
layout.addColumnData(requiredColumnData);
}
private FormData createMessageLabelLayoutData() {
FormData result = new FormData();
result.top = new FormAttachment(0, 5);
result.left = new FormAttachment(0, 5);
result.right = new FormAttachment(100, -5);
return result;
}
private FormData createVariablesTableLayoutData() {
FormData result = new FormData();
result.top = new FormAttachment(messageLabel, 5);
result.left = new FormAttachment(0, 5);
result.bottom = new FormAttachment(100, -5);
result.right = new FormAttachment(removeButton, -5);
return result;
}
private FormData createAddButtonLayoutData() {
FormData result = new FormData();
result.top = new FormAttachment(variablesTable, 0);
result.top.alignment = SWT.TOP;
result.left = new FormAttachment(removeButton, 0);
result.left.alignment = SWT.LEFT;
result.right = new FormAttachment(100, -5);
return result;
}
private FormData createRemoveButtonLayoutData() {
FormData result = new FormData();
result.top = new FormAttachment(addButton, 5);
result.right = new FormAttachment(100, -5);
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 == variablesTable) {
handleVariablesTableSelected(e);
}
}
private Variable createVariable(SemanticElementFactory delegateFactory) {
if (delegateFactory == null) {
return new Variable();
} else {
return (Variable)delegateFactory.createById("org.jbpm.gd.jpdl.variable");
}
}
private void handleAddButtonSelected() {
SemanticElementFactory factory = null;
if (variableContainer instanceof SemanticElement) {
factory = ((SemanticElement)variableContainer).getFactory();
}
Variable variable = createVariable(factory);
variable.setName(getNextAvailableVariableName());
variable.setAccess("read,write");
variableContainer.addVariable(variable);
VariableTableItemWrapper wrapper = new VariableTableItemWrapper(variablesTable, variable);
variablesTable.setSelection(wrapper.getTableItem());
wrapper.editCell(1);
removeButton.setEnabled(variablesTable.getSelectionIndex() != -1);
}
private String getNextAvailableVariableName() {
String result = variableDefaultName;
int runner = 1;
while (true) {
if (!hasTableVariableWithName(result + runner)) {
return result + runner;
}
runner++;
}
}
private boolean hasTableVariableWithName(String name) {
boolean result = false;
int max = variablesTable.getItemCount();
for (int i = 0; i < max; i++) {
VariableTableItemWrapper wrapper = (VariableTableItemWrapper)variablesTable.getItem(i).getData();
if (name.equals(wrapper.getVariable().getName())) {
result = true;
}
}
return result;
}
private void handleRemoveButtonSelected() {
TableItem item = variablesTable.getItem(variablesTable.getSelectionIndex());
VariableTableItemWrapper wrapper = (VariableTableItemWrapper)item.getData();
variableContainer.removeVariable(wrapper.getVariable());
refreshTable();
removeButton.setEnabled(variablesTable.getSelectionIndex() != -1);
}
private void refreshTable() {
variablesTable.removeAll();
Variable[] variables = variableContainer.getVariables();
for (int i = 0; i < variables.length; i++) {
new VariableTableItemWrapper(variablesTable, variables[i]);
}
}
private void handleVariablesTableSelected(SelectionEvent e) {
removeButton.setEnabled(variablesTable.getSelectionIndex() != -1);
}
public VariableContainer getVariableContainer() {
return variableContainer;
}
void setBackground(Color color) {
messageLabel.setBackground(color);
}
void setMessage(String message) {
messageLabel.setText(message);
}
void setVariableDefaultName(String name) {
this.variableDefaultName = name;
}
}