package org.jbpm.gd.jpdl.util;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.widgets.Button;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.jbpm.gd.jpdl.model.Variable;
public class VariableTableItemWrapper implements DisposeListener, SelectionListener, FocusListener {
private TableItem tableItem;
private Variable variable;
private Button readButton, writeButton, requiredButton;
private Text nameText, mappedNameText;
public VariableTableItemWrapper(Table table, Variable variable) {
this.variable = variable;
initializeTableItem(table);
initializeNameText(table);
initializeReadButton(table);
initializeWriteButton(table);
initializeRequiredButton(table);
initializeMappedNameText(table);
}
private void initializeNameText(Table table) {
nameText = createText(table, 1);
nameText.addSelectionListener(this);
nameText.addFocusListener(this);
nameText.setText(getName());
}
private void initializeMappedNameText(Table table) {
mappedNameText = createText(table, 2);
mappedNameText.addSelectionListener(this);
mappedNameText.addFocusListener(this);
mappedNameText.setText(getMappedName());
}
private void initializeReadButton(Table table) {
readButton = createButton(table, 3);
readButton.addSelectionListener(this);
readButton.setSelection(variable.isReadable());
}
private void initializeWriteButton(Table table) {
writeButton = createButton(table, 4);
writeButton.addSelectionListener(this);
writeButton.setSelection(variable.isWritable());
}
private void initializeRequiredButton(Table table) {
requiredButton = createButton(table, 5);
requiredButton.addSelectionListener(this);
requiredButton.setSelection(variable.isRequired());
}
private Button createButton(Table table, int index) {
TableEditor checkboxEditor = new TableEditor(table);
Button result = new Button(table, SWT.CHECK);
result.pack();
checkboxEditor.minimumWidth = result.getSize ().x;
checkboxEditor.horizontalAlignment = SWT.CENTER;
checkboxEditor.setEditor(result, tableItem, index);
return result;
}
private Text createText(Table table, int index) {
TableEditor textEditor = new TableEditor(table);
Text result = new Text(table, SWT.NORMAL);
result.pack();
textEditor.minimumWidth = result.getSize ().x;
textEditor.horizontalAlignment = SWT.LEFT;
textEditor.grabHorizontal = true;
textEditor.setEditor(result, tableItem, index);
result.setVisible(false);
return result;
}
private void initializeTableItem(Table table) {
tableItem = new TableItem(table, SWT.NONE);
tableItem.addDisposeListener(this);
tableItem.setData(this);
tableItem.setText(1, getName());
tableItem.setText(2, getMappedName());
}
public void widgetDisposed(DisposeEvent e) {
tableItem.removeDisposeListener(this);
nameText.removeSelectionListener(this);
nameText.removeFocusListener(this);
mappedNameText.removeSelectionListener(this);
mappedNameText.removeFocusListener(this);
readButton.removeSelectionListener(this);
writeButton.removeSelectionListener(this);
requiredButton.removeSelectionListener(this);
nameText.dispose();
mappedNameText.dispose();
readButton.dispose();
writeButton.dispose();
requiredButton.dispose();
}
private String calculateAccessString() {
StringBuffer stringBuffer = new StringBuffer();
if (readButton.getSelection()) {
stringBuffer.append("read,");
}
if (writeButton.getSelection()) {
stringBuffer.append("write,");
}
if (requiredButton.getSelection()) {
stringBuffer.append("required ");
}
return stringBuffer.substring(0, stringBuffer.length() - 1).toString();
}
public void editCell(int column) {
if (column == 1) {
editName();
} else if (column == 2) {
editMappedName();
}
}
private void editMappedName() {
nameText.setVisible(false);
mappedNameText.setVisible(true);
mappedNameText.setText(getMappedName());
mappedNameText.selectAll();
mappedNameText.setFocus();
}
private void editName() {
nameText.setVisible(true);
nameText.setText(getName());
nameText.setFocus();
nameText.selectAll();
}
public void cancelEditing() {
applyName();
applyMappedName();
}
private void applyMappedName() {
mappedNameText.setVisible(false);
variable.setMappedName(mappedNameText.getText());
tableItem.setText(2, getMappedName());
}
private String getMappedName() {
return variable.getMappedName() == null ? "" : variable.getMappedName();
}
private void applyName() {
nameText.setVisible(false);
variable.setName(nameText.getText());
tableItem.setText(1, getName());
}
private String getName() {
return variable.getName() == null ? "" : variable.getName();
}
public TableItem getTableItem() {
return tableItem;
}
public Variable getVariable() {
return variable;
}
public void widgetSelected(SelectionEvent e) {
if (e.widget == readButton || e.widget == writeButton || e.widget == requiredButton) {
variable.setAccess(calculateAccessString());
}
}
public void widgetDefaultSelected(SelectionEvent e) {
if (e.widget == nameText) {
variable.setName(nameText.getText());
applyName();
} else if (e.widget == mappedNameText) {
variable.setMappedName(mappedNameText.getText());
applyMappedName();
}
}
public void focusGained(FocusEvent e) {
}
public void focusLost(FocusEvent e) {
cancelEditing();
}
}