BugĀ 529835 - Fix DoubleClickTreeItemRule (generator)

SWT.MouseDoubleClick event does not set event.item.
Rule's appliesTo should check event.widget and its selectionCount.
initializeForEvent can then refer to the tree's selected item.

Change-Id: I953ebbe390fa87028a675a4f60fb2f45eb492296
Signed-off-by: Aparna Argade <aprsac@yahoo.com>
diff --git a/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/test/RecordTreeItemDoubleclickTest.java b/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/test/RecordTreeItemDoubleclickTest.java
new file mode 100644
index 0000000..2327e20
--- /dev/null
+++ b/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/test/RecordTreeItemDoubleclickTest.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RecordTreeItemDoubleclickTest 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 testTreeDoubleClick() {
+		this.bot.tree().getTreeItem("item0").doubleClick(); //$NON-NLS-1$
+		flushEvents();
+		Assert.assertEquals(
+				"bot.tree().getTreeItem(\"item0\").select();\nbot.tree().getTreeItem(\"item0\").doubleClick();", //$NON-NLS-1$
+				recorderShellBot().text().getText().trim());
+	}
+
+	@Test
+	public void testTreeLevel2DoubleClick() {
+		this.bot.tree().getTreeItem("item0").getNode("subitem0").doubleClick(); //$NON-NLS-1$
+		flushEvents();
+		Assert.assertEquals(
+				"bot.tree().getTreeItem(\"item0\").expand();\nbot.tree().getTreeItem(\"item0\").getNode(\"subitem0\").select();\nbot.tree().getTreeItem(\"item0\").getNode(\"subitem0\").doubleClick();", //$NON-NLS-1$
+				recorderShellBot().text().getText().trim());
+	}
+
+}
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/DoubleClickTreeItemRule.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/DoubleClickTreeItemRule.java
index 5af6c07..5ba0e60 100644
--- a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/DoubleClickTreeItemRule.java
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/framework/rules/simple/DoubleClickTreeItemRule.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012 Red Hat Inc..
+ * Copyright (c) 2012, 2018 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
@@ -7,20 +7,71 @@
  *
  * Contributors:
  *    Mickael Istria (Red Hat) - initial API and implementation
+ *    Aparna Argade - Bug 529835
  *******************************************************************************/
 package org.eclipse.swtbot.generator.framework.rules.simple;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.swtbot.generator.framework.GenerationSimpleRule;
+import org.eclipse.swtbot.generator.framework.WidgetUtils;
 
-public class DoubleClickTreeItemRule extends AbstractTreeGenerationRule {
+public class DoubleClickTreeItemRule extends GenerationSimpleRule {
 
+	private int index;
+	private List<String> path;
+	private Tree tree;
+
+	/**
+	 * 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 super.appliesTo(event) && event.type == SWT.MouseDoubleClick;
+		return event.widget instanceof Tree && event.type == SWT.MouseDoubleClick
+				&& ((Tree) event.widget).getSelectionCount() == 1;
+	}
+
+	@Override
+	public void initializeForEvent(Event event) {
+		this.tree = (Tree) event.widget;
+		path = new ArrayList<String>();
+		index = WidgetUtils.getIndex(tree);
+		TreeItem currentItem = tree.getSelection()[0];
+		while (currentItem != null) {
+			if (currentItem.getText() != null) {
+				path.add(currentItem.getText());
+			}
+			currentItem = currentItem.getParentItem();
+		}
+		Collections.reverse(path);
+	}
+
+	public String getWidgetAccessor() {
+		StringBuilder res = new StringBuilder();
+		res.append("bot.tree(");
+		if (index != 0) {
+			res.append(index);
+		}
+		res.append(")");
+		boolean first = true;
+		for (String text : path) {
+			if (first) {
+				res.append(".getTreeItem(\"");
+				first = false;
+			} else {
+				res.append(".getNode(\"");
+			}
+			res.append(text);
+			res.append("\")");
+		}
+		return res.toString();
 	}
 
 	@Override
@@ -40,4 +91,9 @@
 		return null;
 	}
 
+	@Override
+	public Tree getWidget() {
+		return this.tree;
+	}
+
 }
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeItem.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeItem.java
index 60e5db2..2d89ff3 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeItem.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeItem.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2017 Ketan Padegaonkar and others.
+ * Copyright (c) 2008, 2018 Ketan Padegaonkar 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
@@ -468,7 +468,6 @@
 		notifyTree(SWT.Selection);
 		notifyTree(SWT.MouseUp, createMouseEvent(1, SWT.BUTTON1, 1));
 		notifyTree(SWT.MouseDown, createMouseEvent(1, SWT.NONE, 2));
-		notifyTree(SWT.Selection);
 		notifyTree(SWT.MouseDoubleClick, createMouseEvent(1, SWT.NONE, 2));
 		notifyTree(SWT.DefaultSelection);
 		notifyTree(SWT.MouseUp, createMouseEvent(1, SWT.BUTTON1, 2));