Bug 489285 - fix file selection on RemoteResourceBrowserWidget

It should allows selection of file on resources browsing mode.

Patch backported to R2_0_maintenance branch.

Change-Id: I24e891490b88b9460b4eefb22e06118eee46b115
Signed-off-by: Wainer dos Santos Moschetta <wainersm@linux.vnet.ibm.com>
diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java
index 5564ece..dca4f19 100644
--- a/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java
+++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteResourceBrowserWidget.java
@@ -403,7 +403,9 @@
 		/*
 		 * Only add filter if we are a directory browser. File and resource browsers show everything.
 		 */
-		if ((fOptionFlags & DIRECTORY_BROWSER) != 0) {
+		int mask = FILE_BROWSER|DIRECTORY_BROWSER;
+		if ((fOptionFlags & mask) != mask	// Avoid filter on resource browsers.
+				&& (fOptionFlags & DIRECTORY_BROWSER) != 0) {
 			fTreeViewer.addFilter(new ViewerFilter() {
 				@Override
 				public boolean select(Viewer viewer, Object parentElement, Object element) {
diff --git a/tests/org.eclipse.remote.ui.tests/.classpath b/tests/org.eclipse.remote.ui.tests/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/tests/org.eclipse.remote.ui.tests/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.remote.ui.tests/.project b/tests/org.eclipse.remote.ui.tests/.project
new file mode 100644
index 0000000..c0c71f6
--- /dev/null
+++ b/tests/org.eclipse.remote.ui.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.remote.ui.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/tests/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/tests/org.eclipse.remote.ui.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/tests/org.eclipse.remote.ui.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.remote.ui.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5963365
--- /dev/null
+++ b/tests/org.eclipse.remote.ui.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Remote UI Tests
+Bundle-SymbolicName: org.eclipse.remote.ui.tests
+Bundle-Version: 1.0.0.qualifier
+Fragment-Host: org.eclipse.remote.ui;bundle-version="2.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.junit;bundle-version="4.12.0",
+ org.eclipse.remote.core,
+ org.eclipse.ui.workbench,
+ org.eclipse.swt,
+ org.eclipse.core.filesystem
+Bundle-Vendor: Eclipse PTP
diff --git a/tests/org.eclipse.remote.ui.tests/build.properties b/tests/org.eclipse.remote.ui.tests/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/tests/org.eclipse.remote.ui.tests/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/tests/org.eclipse.remote.ui.tests/src/org/eclipse/remote/ui/tests/RemoteResourceBrowserTest.java b/tests/org.eclipse.remote.ui.tests/src/org/eclipse/remote/ui/tests/RemoteResourceBrowserTest.java
new file mode 100644
index 0000000..1a73add
--- /dev/null
+++ b/tests/org.eclipse.remote.ui.tests/src/org/eclipse/remote/ui/tests/RemoteResourceBrowserTest.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright (c) 2016 IBM Corporation 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:
+ *   IBM Corporation - initial API and implementation
+ */
+package org.eclipse.remote.ui.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.List;
+
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.remote.core.IRemoteConnection;
+import org.eclipse.remote.core.IRemoteConnectionHostService;
+import org.eclipse.remote.core.IRemoteConnectionType;
+import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
+import org.eclipse.remote.core.IRemoteServicesManager;
+import org.eclipse.remote.core.exception.RemoteConnectionException;
+import org.eclipse.remote.internal.ui.RemoteUIPlugin;
+import org.eclipse.remote.ui.dialogs.RemoteResourceBrowser;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+/*
+ * Provides tests to several scenarios but they should be
+ *  executed manually (i.e. browse and click OK)
+ */
+@RunWith(JUnit4.class)
+public class RemoteResourceBrowserTest {
+	private static final String USERNAME = "test"; //$NON-NLS-1$
+	private static final String PASSWORD = ""; //$NON-NLS-1$
+	private static final String HOST = "localhost"; //$NON-NLS-1$
+	private static IRemoteConnectionType fConnectionType;
+	private static IRemoteConnection fRemoteConnection;
+	private static Shell shell = null;
+	private RemoteResourceBrowser browser;
+	private IFileStore expectedResource;
+
+	@BeforeClass
+	public static void setUp() {
+		IRemoteServicesManager manager = RemoteUIPlugin.getService(IRemoteServicesManager.class);
+		fConnectionType = manager.getConnectionType("org.eclipse.remote.JSch"); //$NON-NLS-1$
+		assertNotNull(fConnectionType);
+		IRemoteConnectionWorkingCopy wc = null;
+		try {
+			wc = fConnectionType.newConnection("test_connection");//$NON-NLS-1$
+		} catch (RemoteConnectionException e) {
+			fail(e.getLocalizedMessage());
+		}
+
+		IRemoteConnectionHostService hostService = wc.getService(IRemoteConnectionHostService.class);
+		assertNotNull(hostService);
+
+		String host = System.getenv("TEST_HOST");
+		if (host == null) {
+			host = HOST;
+		}
+		hostService.setHostname(host);
+
+		String username = System.getenv("TEST_USERNAME");
+		if (username == null) {
+			username = USERNAME;
+		}
+		hostService.setUsername(username);
+
+		String password = System.getenv("TEST_PASSWORD");
+		if (password == null) {
+			password = PASSWORD;
+		}
+		hostService.setPassword(password);
+
+		try {
+			fRemoteConnection = wc.save();
+		} catch (RemoteConnectionException e) {
+			fail(e.getLocalizedMessage());
+		}
+		assertNotNull(fRemoteConnection);
+
+		try {
+			fRemoteConnection.open(new NullProgressMonitor());
+		} catch (RemoteConnectionException e) {
+			fail(e.getLocalizedMessage());
+		}
+		assertTrue(fRemoteConnection.isOpen());
+
+		shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+		assertNotNull(shell);
+	}
+
+	@AfterClass
+	public static void tearDown() throws RemoteConnectionException {
+		fConnectionType.removeConnection(fRemoteConnection);
+	}
+	/*
+	 * Select any file.
+	 */
+	@Test
+	public void browseFileTest() {
+		browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+		browser.setConnection(fRemoteConnection);
+		browser.setType(RemoteResourceBrowser.FILE_BROWSER);
+		browser.setTitle("Allows to select file only");
+		browser.open();
+		expectedResource = browser.getResource();
+		assertNotNull(expectedResource);
+		assertTrue(!expectedResource.fetchInfo().isDirectory());
+	}
+	/*
+	 * Select any directory.
+	 */
+	@Test
+	public void browseDirectoryTest() {
+		browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+		browser.setConnection(fRemoteConnection);
+		browser.setType(RemoteResourceBrowser.DIRECTORY_BROWSER);
+		browser.setTitle("Allows to select directory only");
+		browser.open();
+		expectedResource = browser.getResource();
+		assertNotNull(expectedResource);
+		assertTrue(expectedResource.fetchInfo().isDirectory());
+	}
+	/*
+	 * Select either file or directory.
+	 */
+	@Test
+	public void browseResourceTest() {
+		browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+		browser.setConnection(fRemoteConnection);
+		browser.setTitle("Allows to select either file or directory");
+		browser.open();
+		expectedResource = browser.getResource();
+		assertNotNull(expectedResource);
+	}
+	/*
+	 * Select more than one resource.
+	 */
+	@Test
+	public void browseResourcesTest() {
+		browser = new RemoteResourceBrowser(shell, SWT.MULTI);
+		browser.setConnection(fRemoteConnection);
+		browser.setTitle("Allows to select either multiple resources");
+		browser.open();
+		List<IFileStore> expectedResources = browser.getResources();
+		assertNotNull(expectedResources);
+		assertTrue(expectedResources.size() > 0);
+	}
+	/*
+	 * Select to local connection and select a directory.
+	 */
+	@Test
+	public void changeLocalConnectionTest() {
+		browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+		browser.setConnection(fRemoteConnection);
+		browser.setTitle("Allows to switch to local browsing");
+		browser.setType(RemoteResourceBrowser.DIRECTORY_BROWSER);
+		browser.showConnections(true);
+		browser.showLocalSelection(true);
+		browser.open();
+		expectedResource = browser.getResource();
+		assertNotNull(expectedResource);
+		assertEquals(expectedResource.getFileSystem().getScheme(), "file");
+	}
+	/*
+	 * Initial path set.
+	 */
+	@Test
+	public void setInitialPathTest() {
+		String initialPath = "/tmp";
+		browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+		browser.setConnection(fRemoteConnection);
+		browser.setTitle("Initial path set to " + initialPath);
+		browser.setType(RemoteResourceBrowser.FILE_BROWSER);
+		browser.setInitialPath(initialPath);
+		browser.open();
+	}
+	/*
+	 * Show connections.
+	 * Don't show hidden check box and new folder button.
+	 */
+	@Test
+	public void changeDefaultSettingsTest() {
+		browser = new RemoteResourceBrowser(shell, SWT.SINGLE);
+		browser.setConnection(fRemoteConnection);
+		browser.setType(RemoteResourceBrowser.FILE_BROWSER);
+		browser.showConnections(true);
+		browser.showHiddenCheckbox(false);
+		browser.showNewFolderButton(false);
+		browser.open();
+	}
+}