BugĀ 529122 - New rules for Selection, Check and Doubleclick on Table

Also adds a new rule for Check on Tree.

Change-Id: I19926842a6f51abbfa558ff9e2a077d403f70281
Signed-off-by: Aparna Argade <aprsac@yahoo.com>
diff --git a/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/test/RecordTableItemDoubleclickTest.java b/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/test/RecordTableItemDoubleclickTest.java
new file mode 100644
index 0000000..7bef76c
--- /dev/null
+++ b/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/test/RecordTableItemDoubleclickTest.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2018 Cadence Design Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Aparna Argade - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.generator.test;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RecordTableItemDoubleclickTest extends AbstractGeneratorTest {
+
+	@Override
+	protected void contributeToDialog(Composite container) {
+		Table table = new Table(container, SWT.MULTI | SWT.CHECK);
+		for (int i = 1; i <= 4; i++) {
+			TableItem item = new TableItem(table, SWT.NONE);
+			if (i != 4)
+				item.setText(0, "item" + Integer.toString(i)); //$NON-NLS-1$
+			else
+				item.setText(0, "item" + Integer.toString(i - 1)); //$NON-NLS-1$
+		}
+	}
+
+	@Test
+	public void testTableDoubleClick() {
+		this.bot.table().getTableItem("item1").doubleClick(); //$NON-NLS-1$
+		flushEvents();
+		Assert.assertEquals("bot.table().select(\"item1\");\nbot.table().getTableItem(\"item1\").doubleClick();", //$NON-NLS-1$
+				recorderShellBot().text().getText().trim());
+	}
+
+	@Test
+	public void testTableDoubleClickSameItem() {
+		this.bot.table().getTableItem("item3").doubleClick(); //$NON-NLS-1$
+		flushEvents();
+		Assert.assertEquals("bot.table().select(2);\nbot.table().getTableItem(2).doubleClick();", //$NON-NLS-1$
+				recorderShellBot().text().getText().trim());
+	}
+
+	@Test
+	public void testTableDoubleClickSameItem2() {
+		this.bot.table().getTableItem(3).doubleClick(); //$NON-NLS-1$
+		flushEvents();
+		Assert.assertEquals("bot.table().select(3);\nbot.table().getTableItem(3).doubleClick();", //$NON-NLS-1$
+				recorderShellBot().text().getText().trim());
+	}
+
+}
diff --git a/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/test/RecordTableItemSelectionCheckTest.java b/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/test/RecordTableItemSelectionCheckTest.java
new file mode 100644
index 0000000..1e707ee
--- /dev/null
+++ b/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/test/RecordTableItemSelectionCheckTest.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2018 Cadence Design Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Aparna Argade - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.generator.test;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RecordTableItemSelectionCheckTest extends AbstractGeneratorTest {
+
+	@Override
+	protected void contributeToDialog(Composite container) {
+		Table table = new Table(container, SWT.MULTI | SWT.CHECK);
+		for (int i = 1; i <= 4; i++) {
+			TableItem item = new TableItem(table, SWT.NONE);
+			if (i != 4)
+				item.setText(0, "item" + Integer.toString(i)); //$NON-NLS-1$
+			else
+				item.setText(0, "item" + Integer.toString(i - 1)); //$NON-NLS-1$
+		}
+	}
+
+	@Test
+	public void testSingleTableSelection() {
+		this.bot.table().select("item2"); //$NON-NLS-1$
+		flushEvents();
+		Assert.assertEquals("bot.table().select(\"item2\");", //$NON-NLS-1$
+				recorderShellBot().text().getText().trim());
+	}
+
+	@Test
+	public void testMultipleTableSelectionDifferentItems() {
+		this.bot.table().select("item1", "item2"); //$NON-NLS-1$ //$NON-NLS-2$
+		flushEvents();
+		Assert.assertEquals("bot.table().select(\"item1\");\nbot.table().select(\"item1\", \"item2\");", //$NON-NLS-1$
+				recorderShellBot().text().getText().trim());
+	}
+
+	@Test
+	public void testMultipleTableSelectionSameItem() {
+		this.bot.table().select(2, 3);
+		flushEvents();
+		Assert.assertEquals("bot.table().select(2);\nbot.table().select(2, 3);", //$NON-NLS-1$
+				recorderShellBot().text().getText().trim());
+	}
+
+	@Test
+	public void testMultipleTableSelectionSameItem2() {
+		this.bot.table().select("item1", "item3"); //$NON-NLS-1$ //$NON-NLS-2$
+		flushEvents();
+		Assert.assertEquals("bot.table().select(\"item1\");\nbot.table().select(0, 2);", //$NON-NLS-1$
+				recorderShellBot().text().getText().trim());
+	}
+
+	@Test
+	public void testTableCheck() {
+		this.bot.table().getTableItem("item2").toggleCheck(); //$NON-NLS-1$
+		flushEvents();
+		Assert.assertEquals("bot.table().getTableItem(\"item2\").toggleCheck();", //$NON-NLS-1$
+				recorderShellBot().text().getText().trim());
+	}
+
+	@Test
+	public void testTableCheckSameItem() {
+		this.bot.table().getTableItem(3).toggleCheck(); //$NON-NLS-1$
+		flushEvents();
+		Assert.assertEquals(
+				"bot.table().getTableItem(3).toggleCheck();", //$NON-NLS-1$
+				recorderShellBot().text().getText().trim());
+	}
+
+	@Test
+	public void testTableCheckSameItem2() {
+		this.bot.table().getTableItem("item3").toggleCheck(); //$NON-NLS-1$
+		flushEvents();
+		Assert.assertEquals(
+				"bot.table().getTableItem(2).toggleCheck();", //$NON-NLS-1$
+				recorderShellBot().text().getText().trim());
+	}
+
+}
diff --git a/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/test/RecordTreeItemCheckTest.java b/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/test/RecordTreeItemCheckTest.java
new file mode 100644
index 0000000..4f6b312
--- /dev/null
+++ b/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/test/RecordTreeItemCheckTest.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Cadence Design Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Aparna Argade - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.generator.test;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RecordTreeItemCheckTest extends AbstractGeneratorTest {
+
+	@Override
+	protected void contributeToDialog(Composite container) {
+		Tree tree = new Tree(container, SWT.MULTI | SWT.CHECK);
+		TreeItem item = new TreeItem(tree, SWT.NONE);
+		item.setText(0, "item0"); //$NON-NLS-1$
+		TreeItem itemchild = new TreeItem(item, SWT.NONE);
+		itemchild.setText(0, "subitem0"); //$NON-NLS-1$
+	}
+
+	@Test
+	public void testTreeCheck() {
+		this.bot.tree().getTreeItem("item0").toggleCheck(); //$NON-NLS-1$
+		flushEvents();
+		Assert.assertEquals("bot.tree().getTreeItem(\"item0\").toggleCheck();", //$NON-NLS-1$
+				recorderShellBot().text().getText().trim());
+	}
+
+}
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/SWTBotGeneratorRules.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/SWTBotGeneratorRules.java
index 410b898..4361763 100644
--- a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/SWTBotGeneratorRules.java
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/SWTBotGeneratorRules.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2014 Red Hat Inc..
+ * Copyright (c) 2014 Red Hat Inc. and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -32,10 +32,13 @@
 import org.eclipse.swtbot.generator.framework.rules.complex.ToolBarMenuComplexRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.CComboSelectionRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.CTabItemActivateRule;
+import org.eclipse.swtbot.generator.framework.rules.simple.CheckTableItemRule;
+import org.eclipse.swtbot.generator.framework.rules.simple.CheckTreeItemRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.CheckboxClickedRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.ComboSelectionRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.ComboTextModifyRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.ContextMenuRule;
+import org.eclipse.swtbot.generator.framework.rules.simple.DoubleClickTableItemRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.DoubleClickTreeItemRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.ExpandTreeItemRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.ModifyStyledTextRule;
@@ -44,6 +47,7 @@
 import org.eclipse.swtbot.generator.framework.rules.simple.PushButtonClickedRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.RadioButtonClickedRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.SelectListItemRule;
+import org.eclipse.swtbot.generator.framework.rules.simple.SelectTableItemRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.SelectTreeItemRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.ShellMenuClickedRule;
 import org.eclipse.swtbot.generator.framework.rules.simple.TabItemActivateRule;
@@ -53,7 +57,7 @@
 public class SWTBotGeneratorRules implements Generator {
 
 	private static final String RULES_EXTENSION_POINT = "org.eclipse.swtbot.generator.rules.additions"; //$NON-NLS-1$
-	
+
 	@Override
 	public List<GenerationSimpleRule> createSimpleRules() {
 		List<GenerationSimpleRule> res = new ArrayList<GenerationSimpleRule>();
@@ -76,9 +80,12 @@
 		res.add(new SelectListItemRule());
 		res.add(new CTabItemActivateRule());
 		res.add(new TabItemActivateRule());
-
 		res.add(new PressShortCutRule());
-		
+		res.add(new SelectTableItemRule());
+		res.add(new CheckTableItemRule());
+		res.add(new CheckTreeItemRule());
+		res.add(new DoubleClickTableItemRule());
+
 		IExtensionRegistry registry = RegistryFactory.getRegistry();
 		if (registry != null) {
 			for (IConfigurationElement element : registry.getConfigurationElementsFor(RULES_EXTENSION_POINT)) {
@@ -88,11 +95,11 @@
 						res.add(rule);
 					} catch (CoreException ex) {
 						SWTBotGeneratorPlugin.getDefault().getLog().log(
-							new Status(
-									IStatus.ERROR,
-									element.getContributor().getName(),
-									ex.getMessage(),
-									ex));
+								new Status(
+										IStatus.ERROR,
+										element.getContributor().getName(),
+										ex.getMessage(),
+										ex));
 					}
 				}
 			}
@@ -114,7 +121,7 @@
 		cres.add(new ModifyTextComplexRule());
 		cres.add(new ModifyStyledTextComplexRule());
 		cres.add(new ModifyComboComplexRule());
-		
+
 		IExtensionRegistry registry = RegistryFactory.getRegistry();
 		if (registry != null) {
 			for (IConfigurationElement element : registry.getConfigurationElementsFor(RULES_EXTENSION_POINT)) {
@@ -124,11 +131,11 @@
 						cres.add(rule);
 					} catch (CoreException ex) {
 						SWTBotGeneratorPlugin.getDefault().getLog().log(
-							new Status(
-									IStatus.ERROR,
-									element.getContributor().getName(),
-									ex.getMessage(),
-									ex));
+								new Status(
+										IStatus.ERROR,
+										element.getContributor().getName(),
+										ex.getMessage(),
+										ex));
 					}
 				}
 			}
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/AbstractTableGenerationRule.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/AbstractTableGenerationRule.java
new file mode 100644
index 0000000..3898677
--- /dev/null
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/AbstractTableGenerationRule.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2018 Cadence Design Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Aparna Argade - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.generator.framework.rules.simple;
+
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swtbot.generator.framework.GenerationSimpleRule;
+import org.eclipse.swtbot.generator.framework.WidgetUtils;
+
+public abstract class AbstractTableGenerationRule extends GenerationSimpleRule {
+
+	private int index;
+	private Table table;
+	private TableItem currentItem;
+	boolean useIndex = false;
+
+	/**
+	 * Subclasses should call super.appliesTo first, and then
+	 * verify their conditions
+	 * @param event
+	 * @return
+	 */
+	@Override
+	public boolean appliesTo(Event event) {
+		return event.widget instanceof Table && event.item instanceof TableItem;
+	}
+
+	@Override
+	public void initializeForEvent(Event event) {
+		this.table = (Table)event.widget;
+		index = WidgetUtils.getIndex(table);
+		this.currentItem = (TableItem) event.item;
+		int nbOccurrences = 0;
+		for (TableItem item : this.table.getItems()) {
+			if (item.getText().equals(((TableItem) event.item).getText())) {
+				nbOccurrences++;
+				if (nbOccurrences > 1) {
+					this.useIndex = true;
+					break;
+				}
+			}
+		}
+	}
+
+	public String getWidgetAccessor() {
+		StringBuilder res = new StringBuilder();
+		res.append("bot.table(");
+		if (index != 0) {
+			res.append(index);
+		}
+		res.append(")");
+		res.append(".getTableItem(");
+		if (this.useIndex) {
+			res.append(table.indexOf(currentItem));
+		} else {
+			res.append("\"" + currentItem.getText() + "\"");
+		}
+		res.append(")");
+		return res.toString();
+	}
+
+	@Override
+	public Table getWidget() {
+		return this.table;
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/CheckTableItemRule.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/CheckTableItemRule.java
new file mode 100644
index 0000000..f2194d8
--- /dev/null
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/CheckTableItemRule.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Cadence Design Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Aparna Argade - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.generator.framework.rules.simple;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Event;
+
+public class CheckTableItemRule extends AbstractTableGenerationRule {
+
+	@Override
+	public boolean appliesTo(Event e) {
+		return super.appliesTo(e) && e.type == SWT.Selection && e.detail == SWT.CHECK;
+	}
+
+	@Override
+	public List<String> getActions() {
+		List<String> actions = new ArrayList<String>();
+		StringBuilder code = new StringBuilder();
+		code.append(getWidgetAccessor());
+		code.append(".toggleCheck()");
+		actions.add(code.toString());
+		return actions;
+
+	}
+
+	@Override
+	public List<String> getImports() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/CheckTreeItemRule.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/CheckTreeItemRule.java
new file mode 100644
index 0000000..94a56f2
--- /dev/null
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/CheckTreeItemRule.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Cadence Design Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Aparna Argade - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.generator.framework.rules.simple;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Event;
+
+public class CheckTreeItemRule extends AbstractTreeGenerationRule {
+	@Override
+	public boolean appliesTo(Event e) {
+		return super.appliesTo(e) && e.type == SWT.Selection && e.detail == SWT.CHECK;
+	}
+
+	@Override
+	public List<String> getActions() {
+		List<String> actions = new ArrayList<String>();
+		StringBuilder code = new StringBuilder();
+		code.append(getWidgetAccessor());
+		code.append(".toggleCheck()");
+		actions.add(code.toString());
+		return actions;
+
+	}
+
+	@Override
+	public List<String> getImports() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/DoubleClickTableItemRule.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/DoubleClickTableItemRule.java
new file mode 100644
index 0000000..9f8874b
--- /dev/null
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/DoubleClickTableItemRule.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2018 Cadence Design Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Aparna Argade - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.generator.framework.rules.simple;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swtbot.generator.framework.GenerationSimpleRule;
+import org.eclipse.swtbot.generator.framework.WidgetUtils;
+
+public class DoubleClickTableItemRule extends GenerationSimpleRule {
+
+	private int index;
+	private Table table;
+	private TableItem currentItem;
+	boolean useIndex = false;
+
+	/**
+	 * MouseDoubleClick event does not set event.item, so only event.widget should
+	 * be checked. Also, single selection is necessary before MouseDoubleClick.
+	 */
+	@Override
+	public boolean appliesTo(Event event) {
+		return event.widget instanceof Table && event.type == SWT.MouseDoubleClick
+				&& ((Table) event.widget).getSelectionCount() == 1;
+	}
+
+	@Override
+	public void initializeForEvent(Event event) {
+		this.table = (Table) event.widget;
+		this.currentItem = (TableItem) event.item;
+		this.index = WidgetUtils.getIndex(this.table);
+		currentItem = table.getSelection()[0];
+		int nbOccurrences = 0;
+		TableItem[] tableitems = this.table.getItems();
+		for (TableItem item : tableitems) {
+			if (item.getText().equals(currentItem.getText())) {
+				nbOccurrences++;
+				if (nbOccurrences > 1) {
+					this.useIndex = true;
+					break;
+				}
+			}
+		}
+	}
+
+	public String getWidgetAccessor() {
+		StringBuilder res = new StringBuilder();
+		res.append("bot.table(");
+		if (index != 0) {
+			res.append(index);
+		}
+		res.append(")");
+		res.append(".getTableItem(");
+		if (this.useIndex) {
+			res.append(table.indexOf(currentItem));
+		} else {
+			res.append("\"" + currentItem.getText() + "\"");
+		}
+		res.append(")");
+		return res.toString();
+	}
+
+	@Override
+	public Table getWidget() {
+		return this.table;
+	}
+
+	@Override
+	public List<String> getActions() {
+		List<String> actions = new ArrayList<String>();
+		StringBuilder code = new StringBuilder();
+		code.append(getWidgetAccessor());
+		code.append(".doubleClick()");
+		actions.add(code.toString());
+		return actions;
+
+	}
+
+	@Override
+	public List<String> getImports() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/SelectTableItemRule.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/SelectTableItemRule.java
new file mode 100644
index 0000000..5634bb8
--- /dev/null
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/SelectTableItemRule.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Cadence Design Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Aparna Argade - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.generator.framework.rules.simple;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swtbot.generator.framework.GenerationSimpleRule;
+import org.eclipse.swtbot.generator.framework.WidgetUtils;
+
+public class SelectTableItemRule extends GenerationSimpleRule {
+
+	private int index;
+	boolean useIndices = false;
+	private TableItem[] selectedItems;
+	private int[] selectedIndices;
+	private Table table;
+
+	@Override
+	public boolean appliesTo(Event event) {
+		return event.widget instanceof Table && event.type == SWT.Selection && event.detail != SWT.CHECK;
+	}
+
+	@Override
+	public void initializeForEvent(Event event) {
+		this.table = (Table) event.widget;
+		this.index = WidgetUtils.getIndex(this.table);
+		this.selectedIndices = this.table.getSelectionIndices();
+		this.selectedItems = this.table.getSelection();
+		for (TableItem selectedItem : selectedItems) {
+			int nbOccurrences = 0;
+			for (TableItem item : this.table.getItems()) {
+				if (item.getText().equals(selectedItem.getText())) {
+					nbOccurrences++;
+				}
+			}
+			if (nbOccurrences > 1) {
+				this.useIndices = true;
+			}
+		}
+	}
+
+	@Override
+	public List<String> getActions() {
+		List<String> actions = new ArrayList<String>();
+		StringBuilder code = new StringBuilder();
+
+		code.append("bot.table("); //$NON-NLS-1$
+		if (this.index != 0) {
+			code.append(this.index);
+		}
+		code.append(")"); //$NON-NLS-1$
+
+		code.append(".select("); //$NON-NLS-1$
+		if (this.useIndices) {
+			for (int i = 0; i < this.selectedIndices.length; i++) {
+				code.append(this.selectedIndices[i]);
+				if (i < this.selectedIndices.length - 1) {
+					code.append(", "); //$NON-NLS-1$
+				}
+			}
+		} else {
+			for (int i = 0; i < this.selectedItems.length; i++) {
+				code.append('"');
+				code.append(this.selectedItems[i].getText());
+				code.append('"');
+				if (i < this.selectedIndices.length - 1) {
+					code.append(", "); //$NON-NLS-1$
+				}
+			}
+		}
+		code.append(')');
+
+		actions.add(code.toString());
+		return actions;
+	}
+
+	@Override
+	public List<String> getImports() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Table getWidget() {
+		return this.table;
+	}
+
+}
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/SelectTreeItemRule.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/SelectTreeItemRule.java
index d71fb8c..3bd6915 100644
--- a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/SelectTreeItemRule.java
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/SelectTreeItemRule.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012 Red Hat Inc..
+ * Copyright (c) 2012 Red Hat Inc. and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -20,7 +20,7 @@
 
 	@Override
 	public boolean appliesTo(Event e) {
-		return super.appliesTo(e) && e.type == SWT.Selection;
+		return super.appliesTo(e) && e.type == SWT.Selection && e.detail != SWT.CHECK;
 	}
 
 	@Override
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableItem.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableItem.java
index 939d42c..ffd6a3a 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableItem.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableItem.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2017 http://www.inria.fr/ and others.
+ * Copyright (c) 2008, 2018 http://www.inria.fr/ and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -176,7 +176,6 @@
 		notifyTable(SWT.Selection);
 		notifyTable(SWT.MouseUp, createMouseEvent(1, SWT.BUTTON1, 1));
 		notifyTable(SWT.MouseDown, createMouseEvent(1, SWT.NONE, 2));
-		notifyTable(SWT.Selection);
 		notifyTable(SWT.MouseDoubleClick, createMouseEvent(1, SWT.NONE, 2));
 		notifyTable(SWT.DefaultSelection);
 		notifyTable(SWT.MouseUp, createMouseEvent(1, SWT.BUTTON1, 2));