Skip to content

Commit d95a444

Browse files
ShahzaibIbrahimHeikoKlare
authored andcommitted
Updating control example by adding option to make Table/Tree editable
This commit is part of testing the custom controls for multi-monitor support.
1 parent 80086c9 commit d95a444

File tree

3 files changed

+132
-2
lines changed

3 files changed

+132
-2
lines changed

examples/org.eclipse.swt.examples/src/examples_control.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ Header_Visible = Header Visible
111111
Sort_Indicator = Sort Indicator
112112
Header_Images = Header Images
113113
Sub_Images = Sub Images
114+
Editable = Editable
114115
Lines_Visible = Lines Visible
115116
Moveable_Columns = Moveable Columns
116117
Resizable_Columns = Resizable Columns

examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/TableTab.java

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,19 @@
1717
import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
1818

1919
import org.eclipse.swt.SWT;
20+
import org.eclipse.swt.custom.TableEditor;
2021
import org.eclipse.swt.events.SelectionListener;
2122
import org.eclipse.swt.graphics.Color;
2223
import org.eclipse.swt.graphics.Font;
2324
import org.eclipse.swt.graphics.FontData;
2425
import org.eclipse.swt.graphics.Image;
2526
import org.eclipse.swt.graphics.Point;
2627
import org.eclipse.swt.graphics.RGB;
28+
import org.eclipse.swt.graphics.Rectangle;
2729
import org.eclipse.swt.layout.GridData;
2830
import org.eclipse.swt.layout.GridLayout;
2931
import org.eclipse.swt.widgets.Button;
32+
import org.eclipse.swt.widgets.Control;
3033
import org.eclipse.swt.widgets.Event;
3134
import org.eclipse.swt.widgets.Group;
3235
import org.eclipse.swt.widgets.Item;
@@ -35,6 +38,7 @@
3538
import org.eclipse.swt.widgets.Table;
3639
import org.eclipse.swt.widgets.TableColumn;
3740
import org.eclipse.swt.widgets.TableItem;
41+
import org.eclipse.swt.widgets.Text;
3842
import org.eclipse.swt.widgets.Widget;
3943

4044
class TableTab extends ScrollableTab {
@@ -49,7 +53,8 @@ class TableTab extends ScrollableTab {
4953
Button noScrollButton, checkButton, fullSelectionButton, hideSelectionButton;
5054

5155
/* Other widgets added to the "Other" group */
52-
Button multipleColumns, moveableColumns, resizableColumns, headerVisibleButton, sortIndicatorButton, headerImagesButton, linesVisibleButton, subImagesButton;
56+
Button multipleColumns, moveableColumns, resizableColumns, headerVisibleButton, sortIndicatorButton,
57+
headerImagesButton, linesVisibleButton, subImagesButton, editableButton;
5358

5459
/* Controls and resources added to the "Colors and Fonts" group */
5560
static final int ITEM_FOREGROUND_COLOR = 3;
@@ -248,6 +253,8 @@ void createOtherGroup () {
248253
headerImagesButton.setText (ControlExample.getResourceString("Header_Images"));
249254
subImagesButton = new Button (otherGroup, SWT.CHECK);
250255
subImagesButton.setText (ControlExample.getResourceString("Sub_Images"));
256+
editableButton = new Button(otherGroup, SWT.CHECK);
257+
editableButton.setText(ControlExample.getResourceString("Editable"));
251258

252259
/* Add the listeners */
253260
linesVisibleButton.addSelectionListener (widgetSelectedAdapter(event -> setWidgetLinesVisible ()));
@@ -258,6 +265,72 @@ void createOtherGroup () {
258265
resizableColumns.addSelectionListener (widgetSelectedAdapter(event -> setColumnsResizable ()));
259266
headerImagesButton.addSelectionListener (widgetSelectedAdapter(event -> recreateExampleWidgets ()));
260267
subImagesButton.addSelectionListener (widgetSelectedAdapter(event -> recreateExampleWidgets ()));
268+
editableButton.addSelectionListener(widgetSelectedAdapter(event -> makeTableContentEditable()));
269+
}
270+
271+
void makeTableContentEditable() {
272+
// Create a Text editor
273+
final TableEditor editor = new TableEditor(table1);
274+
editor.horizontalAlignment = SWT.LEFT;
275+
editor.grabHorizontal = true;
276+
// Listener to activate editor
277+
table1.addListener(SWT.MouseDoubleClick, event -> {
278+
if (!editableButton.getSelection()) {
279+
return;
280+
}
281+
Control oldEditor = editor.getEditor();
282+
if (oldEditor != null) {
283+
oldEditor.dispose();
284+
}
285+
286+
Point point = new Point(event.x, event.y);
287+
final TableItem item = table1.getItem(point);
288+
if (item == null) {
289+
return;
290+
}
291+
292+
final int column = findColumnContainingPoint(item, point);
293+
294+
if (column == -1) {
295+
return;
296+
}
297+
298+
final Text newEditor = new Text(table1, SWT.NONE);
299+
newEditor.setText(item.getText(column));
300+
newEditor.addModifyListener(e -> {
301+
Text text = (Text) editor.getEditor();
302+
item.setText(column, text.getText());
303+
});
304+
newEditor.selectAll();
305+
newEditor.setFocus();
306+
307+
// Add a focus out listener to commit changes on focus lost
308+
newEditor.addListener(SWT.FocusOut, e -> {
309+
item.setText(newEditor.getText());
310+
newEditor.dispose(); // Dispose the text field after editing
311+
});
312+
313+
// Add a key listener to commit changes on Enter key pressed
314+
newEditor.addListener(SWT.KeyDown, e -> {
315+
if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) {
316+
item.setText(newEditor.getText());
317+
newEditor.dispose(); // Dispose the text field after editing
318+
}
319+
});
320+
321+
editor.setEditor(newEditor, item, column);
322+
});
323+
324+
}
325+
326+
private static int findColumnContainingPoint(TableItem item, Point point) {
327+
for (int i = 0; i < item.getParent().getColumnCount(); i++) {
328+
Rectangle rect = item.getBounds(i);
329+
if (rect.contains(point)) {
330+
return i;
331+
}
332+
}
333+
return -1;
261334
}
262335

263336
/**

examples/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/TreeTab.java

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
1818

1919
import org.eclipse.swt.SWT;
20+
import org.eclipse.swt.custom.TreeEditor;
2021
import org.eclipse.swt.events.SelectionListener;
2122
import org.eclipse.swt.graphics.Color;
2223
import org.eclipse.swt.graphics.Font;
@@ -33,6 +34,7 @@
3334
import org.eclipse.swt.widgets.Menu;
3435
import org.eclipse.swt.widgets.MenuItem;
3536
import org.eclipse.swt.widgets.TableItem;
37+
import org.eclipse.swt.widgets.Text;
3638
import org.eclipse.swt.widgets.Tree;
3739
import org.eclipse.swt.widgets.TreeColumn;
3840
import org.eclipse.swt.widgets.TreeItem;
@@ -51,7 +53,7 @@ class TreeTab extends ScrollableTab {
5153
Button noScrollButton, checkButton, fullSelectionButton;
5254

5355
/* Other widgets added to the "Other" group */
54-
Button multipleColumns, moveableColumns, resizableColumns, headerVisibleButton, sortIndicatorButton, headerImagesButton, subImagesButton, linesVisibleButton;
56+
Button multipleColumns, moveableColumns, resizableColumns, headerVisibleButton, sortIndicatorButton, headerImagesButton, subImagesButton, linesVisibleButton, editableButton;
5557

5658
/* Controls and resources added to the "Colors and Fonts" group */
5759
static final int ITEM_FOREGROUND_COLOR = 3;
@@ -248,6 +250,8 @@ void createOtherGroup () {
248250
headerImagesButton.setText (ControlExample.getResourceString("Header_Images"));
249251
subImagesButton = new Button (otherGroup, SWT.CHECK);
250252
subImagesButton.setText (ControlExample.getResourceString("Sub_Images"));
253+
editableButton = new Button(otherGroup, SWT.CHECK);
254+
editableButton.setText(ControlExample.getResourceString("Editable"));
251255

252256
/* Add the listeners */
253257
linesVisibleButton.addSelectionListener (widgetSelectedAdapter(event -> setWidgetLinesVisible ()));
@@ -258,6 +262,58 @@ void createOtherGroup () {
258262
resizableColumns.addSelectionListener (widgetSelectedAdapter(event -> setColumnsResizable ()));
259263
headerImagesButton.addSelectionListener (widgetSelectedAdapter(event -> recreateExampleWidgets ()));
260264
subImagesButton.addSelectionListener (widgetSelectedAdapter(event -> recreateExampleWidgets ()));
265+
editableButton.addSelectionListener(widgetSelectedAdapter(event -> makeTreeContentEditable()));
266+
}
267+
268+
void makeTreeContentEditable() {
269+
makeTreeEditable(tree1);
270+
makeTreeEditable(tree2);
271+
}
272+
273+
private void makeTreeEditable(Tree tree) {
274+
final TreeEditor editor = new TreeEditor(tree);
275+
editor.horizontalAlignment = SWT.LEFT;
276+
editor.grabHorizontal = true;
277+
278+
tree.addListener(SWT.MouseDoubleClick, event -> {
279+
treeDoubleClickListener(tree, editor, event);
280+
});
281+
}
282+
283+
private void treeDoubleClickListener(Tree tree, final TreeEditor editor, Event event) {
284+
if (!editableButton.getSelection()) {
285+
return;
286+
}
287+
Point point = new Point(event.x, event.y);
288+
TreeItem item = tree.getItem(point);
289+
if (item == null) {
290+
return;
291+
}
292+
// Get the item text
293+
final String oldText = item.getText();
294+
295+
// Create a text field to edit the item text
296+
final Text text = new Text(tree, SWT.NONE);
297+
text.setText(oldText);
298+
text.selectAll();
299+
text.setFocus();
300+
301+
// Add a focus out listener to commit changes on focus lost
302+
text.addListener(SWT.FocusOut, e -> {
303+
item.setText(text.getText());
304+
text.dispose(); // Dispose the text field after editing
305+
});
306+
307+
// Add a key listener to commit changes on Enter key pressed
308+
text.addListener(SWT.KeyDown, e -> {
309+
if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) {
310+
item.setText(text.getText());
311+
text.dispose(); // Dispose the text field after editing
312+
}
313+
});
314+
315+
// Edit the text field on double click
316+
editor.setEditor(text, item);
261317
}
262318

263319
/**

0 commit comments

Comments
 (0)