SWT Jface Eclipse Java

//Send questions, comments, bug reports, etc. to the authors:
//Rob Warner (rwarner@interspatial.com)
//Robert Harris (rbrt_harris@yahoo.com)
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
/**
 * This class demonstrates TableEditor.
 */
public class TextTableEditor {
  // Number of rows and columns
  private static final int NUM = 5;
  // Colors for each row
  private Color[] colors = new Color[NUM];
  // Options for each dropdown
  private String[] options = { "Option 1", "Option 2", "Option 3"};
  /**
   * Runs the application
   */
  public void run() {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setText("Text Table Editor");
    createContents(shell);
    shell.pack();
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }
    // Dispose any created colors
    for (int i = 0; i < NUM; i++) {
      if (colors[i] != null) colors[i].dispose();
    }
    display.dispose();
  }
  /**
   * Creates the main window's contents
   * 
   * @param shell the main window
   */
  private void createContents(final Shell shell) {
    shell.setLayout(new FillLayout());
    // Create the table
    final Table table = new Table(shell, SWT.SINGLE | SWT.FULL_SELECTION
        | SWT.HIDE_SELECTION);
    table.setHeaderVisible(true);
    table.setLinesVisible(true);
    // Create five columns
    for (int i = 0; i < NUM; i++) {
      TableColumn column = new TableColumn(table, SWT.CENTER);
      column.setText("Column " + (i + 1));
      column.pack();
    }
    // Create five table editors for color
    TableEditor[] colorEditors = new TableEditor[NUM];
    // Create five buttons for changing color
    Button[] colorButtons = new Button[NUM];
    // Create five rows and the editors for those rows. The first column has the
    // color change buttons. The second column has dropdowns. The final three
    // have text fields.
    for (int i = 0; i < NUM; i++) {
      // Create the row
      final TableItem item = new TableItem(table, SWT.NONE);
      // Create the editor and button
      colorEditors[i] = new TableEditor(table);
      colorButtons[i] = new Button(table, SWT.PUSH);
      // Set attributes of the button
      colorButtons[i].setText("Color...");
      colorButtons[i].computeSize(SWT.DEFAULT, table.getItemHeight());
      // Set attributes of the editor
      colorEditors[i].grabHorizontal = true;
      colorEditors[i].minimumHeight = colorButtons[i].getSize().y;
      colorEditors[i].minimumWidth = colorButtons[i].getSize().x;
      // Set the editor for the first column in the row
      colorEditors[i].setEditor(colorButtons[i], item, 0);
      // Create a handler for the button
      final int index = i;
      colorButtons[i].addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent event) {
          ColorDialog dialog = new ColorDialog(shell);
          if (colors[index] != null) dialog.setRGB(colors[index].getRGB());
          RGB rgb = dialog.open();
          if (rgb != null) {
            if (colors[index] != null) colors[index].dispose();
            colors[index] = new Color(shell.getDisplay(), rgb);
            item.setForeground(colors[index]);
          }
        }
      });
    }
    // Create an editor object to use for text editing
    final TableEditor editor = new TableEditor(table);
    editor.horizontalAlignment = SWT.LEFT;
    editor.grabHorizontal = true;
    // Use a mouse listener, not a selection listener, since we're interested
    // in the selected column as well as row
    table.addMouseListener(new MouseAdapter() {
      public void mouseDown(MouseEvent event) {
        // Dispose any existing editor
        Control old = editor.getEditor();
        if (old != null) old.dispose();
        // Determine where the mouse was clicked
        Point pt = new Point(event.x, event.y);
        // Determine which row was selected
        final TableItem item = table.getItem(pt);
        if (item != null) {
          // Determine which column was selected
          int column = -1;
          for (int i = 0, n = table.getColumnCount(); i < n; i++) {
            Rectangle rect = item.getBounds(i);
            if (rect.contains(pt)) {
              // This is the selected column
              column = i;
              break;
            }
          }
          // Column 2 holds dropdowns
          if (column == 1) {
            // Create the dropdown and add data to it
            final CCombo combo = new CCombo(table, SWT.READ_ONLY);
            for (int i = 0, n = options.length; i < n; i++) {
              combo.add(options[i]);
            }
            // Select the previously selected item from the cell
            combo.select(combo.indexOf(item.getText(column)));
            // Compute the width for the editor
            // Also, compute the column width, so that the dropdown fits
            editor.minimumWidth = combo.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
            table.getColumn(column).setWidth(editor.minimumWidth);
            // Set the focus on the dropdown and set into the editor
            combo.setFocus();
            editor.setEditor(combo, item, column);
            // Add a listener to set the selected item back into the cell
            final int col = column;
            combo.addSelectionListener(new SelectionAdapter() {
              public void widgetSelected(SelectionEvent event) {
                item.setText(col, combo.getText());
                // They selected an item; end the editing session
                combo.dispose();
              }
            });
          } else if (column > 1) {
            // Create the Text object for our editor
            final Text text = new Text(table, SWT.NONE);
            text.setForeground(item.getForeground());
            // Transfer any text from the cell to the Text control,
            // set the color to match this row, select the text,
            // and set focus to the control
            text.setText(item.getText(column));
            text.setForeground(item.getForeground());
            text.selectAll();
            text.setFocus();
            // Recalculate the minimum width for the editor
            editor.minimumWidth = text.getBounds().width;
            // Set the control into the editor
            editor.setEditor(text, item, column);
            // Add a handler to transfer the text back to the cell
            // any time it's modified
            final int col = column;
            text.addModifyListener(new ModifyListener() {
              public void modifyText(ModifyEvent event) {
                // Set the text of the editor's control back into the cell
                item.setText(col, text.getText());
              }
            });
          }
        }
      }
    });
  }
  /**
   * The application entry point
   * 
   * @param args the command line arguments
   */
  public static void main(String[] args) {
    new TextTableEditor().run();
  }
}