Java tutorial
//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(); } }