Skip to content

Commit b189bf1

Browse files
authored
Add project-filter field to App Engine deploy dialog (#2135)
Includes some minor refactoring of ProjectSelector API
1 parent ea87b6a commit b189bf1

9 files changed

Lines changed: 162 additions & 56 deletions

File tree

plugins/com.google.cloud.tools.eclipse.appengine.deploy.ui.test/src/com/google/cloud/tools/eclipse/appengine/deploy/ui/AppEngineDeployPreferencesPanelTest.java

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@
5252
import org.eclipse.core.runtime.jobs.Job;
5353
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
5454
import org.eclipse.jface.viewers.IStructuredSelection;
55+
import org.eclipse.jface.viewers.StructuredSelection;
5556
import org.eclipse.swt.SWT;
5657
import org.eclipse.swt.widgets.Button;
5758
import org.eclipse.swt.widgets.Composite;
5859
import org.eclipse.swt.widgets.Control;
59-
import org.eclipse.swt.widgets.Table;
6060
import org.eclipse.swtbot.swt.finder.widgets.SWTBotCheckBox;
6161
import org.junit.Before;
6262
import org.junit.Rule;
@@ -120,8 +120,7 @@ public void testAutoSelectSingleAccount_loadGcpProjects()
120120
assertNotNull(deployPanel.latestGcpProjectQueryJob);
121121
deployPanel.latestGcpProjectQueryJob.join();
122122

123-
Table projectTable = getProjectSelector().getViewer().getTable();
124-
assertThat(projectTable.getItemCount(), is(2));
123+
assertThat(getProjectSelector().getProjectCount(), is(2));
125124
}
126125

127126
@Test
@@ -238,16 +237,15 @@ public void testRefreshProjectsForSelectedCredential()
238237
initializeProjectRepository();
239238

240239
deployPanel = createPanel(false /* requireValues */);
241-
Table projectTable = getProjectSelector().getViewer().getTable();
242240
assertNull(deployPanel.latestGcpProjectQueryJob);
243-
assertThat(projectTable.getItemCount(), is(0));
241+
assertThat(getProjectSelector().getProjectCount(), is(0));
244242

245243
selectAccount(account1);
246244
assertNotNull(deployPanel.latestGcpProjectQueryJob);
247245
deployPanel.latestGcpProjectQueryJob.join();
248-
assertThat(projectTable.getItemCount(), is(2));
249-
assertThat(((GcpProject) projectTable.getItem(0).getData()).getId(), is("projectId1"));
250-
assertThat(((GcpProject) projectTable.getItem(1).getData()).getId(), is("projectId2"));
246+
assertThat(getProjectSelector().getProjectCount(), is(2));
247+
assertThat(getProjectSelector().getProjects().get(0).getId(), is("projectId1"));
248+
assertThat(getProjectSelector().getProjects().get(1).getId(), is("projectId2"));
251249
}
252250

253251
@Test
@@ -257,20 +255,19 @@ public void testRefreshProjectsForSelectedCredential_switchAccounts()
257255
initializeProjectRepository();
258256

259257
deployPanel = createPanel(false /* requireValues */);
260-
Table projectTable = getProjectSelector().getViewer().getTable();
261258
assertNull(deployPanel.latestGcpProjectQueryJob);
262-
assertThat(projectTable.getItemCount(), is(0));
259+
assertThat(getProjectSelector().getProjectCount(), is(0));
263260

264261
selectAccount(account1);
265262
Job jobForAccount1 = deployPanel.latestGcpProjectQueryJob;
266263
jobForAccount1.join();
267-
assertThat(projectTable.getItemCount(), is(2));
264+
assertThat(getProjectSelector().getProjectCount(), is(2));
268265

269266
selectAccount(account2);
270267
assertNotEquals(jobForAccount1, deployPanel.latestGcpProjectQueryJob);
271268
deployPanel.latestGcpProjectQueryJob.join();
272-
assertThat(projectTable.getItemCount(), is(1));
273-
assertThat(((GcpProject) projectTable.getItem(0).getData()).getId(), is("projectId2"));
269+
assertThat(getProjectSelector().getProjectCount(), is(1));
270+
assertThat(getProjectSelector().getProjects().get(0).getId(), is("projectId2"));
274271
}
275272

276273
// "AppEngineApplicationQueryJob" assumes no project gets selected when switching accounts.
@@ -284,16 +281,16 @@ public void testNoProjectSelectedWhenSwitchingAccounts()
284281
selectAccount(account1);
285282
deployPanel.latestGcpProjectQueryJob.join();
286283

287-
Table projectTable = getProjectSelector().getViewer().getTable();
288-
assertThat(projectTable.getItemCount(), is(2));
289-
projectTable.setSelection(0);
290-
assertThat(projectTable.getSelectionCount(), is(1));
284+
assertThat(getProjectSelector().getProjectCount(), is(2));
285+
getProjectSelector()
286+
.setSelection(new StructuredSelection(getProjectSelector().getProjects().get(0)));
287+
assertThat(getProjectSelector().getSelection().size(), is(1));
291288

292289
selectAccount(account2);
293290
deployPanel.latestGcpProjectQueryJob.join();
294291

295-
assertThat(projectTable.getItemCount(), is(1));
296-
assertThat(projectTable.getSelectionCount(), is(0));
292+
assertThat(getProjectSelector().getProjectCount(), is(1));
293+
assertThat(getProjectSelector().getSelection().size(), is(0));
297294
}
298295

299296
private Button getButtonWithText(final String text) {

plugins/com.google.cloud.tools.eclipse.appengine.deploy.ui.test/src/com/google/cloud/tools/eclipse/appengine/deploy/ui/internal/AppEngineApplicationQueryJobTest.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@
3434
import com.google.cloud.tools.eclipse.projectselector.model.GcpProject;
3535
import com.google.common.base.Predicate;
3636
import org.eclipse.core.runtime.jobs.Job;
37-
import org.eclipse.jface.viewers.ISelection;
38-
import org.eclipse.jface.viewers.TableViewer;
37+
import org.eclipse.jface.viewers.IStructuredSelection;
3938
import org.eclipse.swt.widgets.Display;
4039
import org.junit.After;
4140
import org.junit.Before;
@@ -59,7 +58,8 @@ public class AppEngineApplicationQueryJobTest {
5958
@Mock private ProjectRepository projectRepository;
6059
@Mock private ProjectSelector projectSelector;
6160
@Mock private Predicate<Job> isLatestQueryJob;
62-
@Mock private ISelection projectSelection;
61+
@Mock
62+
private IStructuredSelection projectSelection;
6363

6464
private Job queryJob;
6565

@@ -74,9 +74,7 @@ public void setUp() {
7474
when(projectSelector.isDisposed()).thenReturn(false);
7575
when(isLatestQueryJob.apply(queryJob)).thenReturn(true);
7676

77-
TableViewer viewer = mock(TableViewer.class);
78-
when(viewer.getSelection()).thenReturn(projectSelection);
79-
when(projectSelector.getViewer()).thenReturn(viewer);
77+
when(projectSelector.getSelection()).thenReturn(projectSelection);
8078
}
8179

8280
@After

plugins/com.google.cloud.tools.eclipse.appengine.deploy.ui.test/src/com/google/cloud/tools/eclipse/appengine/deploy/ui/internal/ProjectSelectorSelectionChangedListenerTest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
import com.google.cloud.tools.eclipse.projectselector.model.AppEngine;
3737
import com.google.cloud.tools.eclipse.projectselector.model.GcpProject;
3838
import org.eclipse.core.runtime.jobs.Job;
39-
import org.eclipse.jface.viewers.ISelection;
39+
import org.eclipse.jface.viewers.IStructuredSelection;
4040
import org.eclipse.jface.viewers.SelectionChangedEvent;
4141
import org.eclipse.jface.viewers.StructuredSelection;
4242
import org.eclipse.jface.viewers.TableViewer;
@@ -75,9 +75,8 @@ public void setUp() {
7575
when(accountSelector.getSelectedCredential()).thenReturn(mock(Credential.class));
7676

7777
TableViewer viewer = mock(TableViewer.class);
78-
ISelection projectSelection = mock(ISelection.class);
79-
when(projectSelector.getViewer()).thenReturn(viewer);
80-
when(viewer.getSelection()).thenReturn(projectSelection);
78+
IStructuredSelection projectSelection = mock(IStructuredSelection.class);
79+
when(projectSelector.getSelection()).thenReturn(projectSelection);
8180
when(projectSelection.isEmpty()).thenReturn(false);
8281

8382
listener = new ProjectSelectorSelectionChangedListener(accountSelector, projectRepository,

plugins/com.google.cloud.tools.eclipse.appengine.deploy.ui/src/com/google/cloud/tools/eclipse/appengine/deploy/ui/AppEngineDeployPreferencesPanel.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@
6666
import org.eclipse.jface.layout.GridDataFactory;
6767
import org.eclipse.jface.layout.GridLayoutFactory;
6868
import org.eclipse.swt.SWT;
69+
import org.eclipse.swt.events.ModifyEvent;
70+
import org.eclipse.swt.events.ModifyListener;
6971
import org.eclipse.swt.events.SelectionAdapter;
7072
import org.eclipse.swt.events.SelectionEvent;
7173
import org.eclipse.swt.graphics.Font;
@@ -354,6 +356,13 @@ public Map<String, String> getParameters() {
354356
GridLayoutFactory.fillDefaults().numColumns(2).spacing(0, 0).applyTo(projectSelectorComposite);
355357
GridDataFactory.fillDefaults().grab(true, false).applyTo(projectSelectorComposite);
356358

359+
final Text filterField = new Text(projectSelectorComposite,
360+
SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH | SWT.ICON_CANCEL);
361+
filterField.setMessage(Messages.getString("projectselector.filter"));
362+
GridDataFactory.fillDefaults().applyTo(filterField);
363+
364+
new Label(projectSelectorComposite, SWT.NONE); // spacer
365+
357366
projectSelector = new ProjectSelector(projectSelectorComposite);
358367
GridDataFactory.fillDefaults().grab(true, false).hint(SWT.DEFAULT, 200)
359368
.applyTo(projectSelector);
@@ -375,6 +384,12 @@ public void widgetSelected(SelectionEvent event) {
375384
new ProjectSelectorSelectionChangedListener(accountSelector,
376385
projectRepository,
377386
projectSelector));
387+
filterField.addModifyListener(new ModifyListener() {
388+
@Override
389+
public void modifyText(ModifyEvent event) {
390+
projectSelector.setFilter(filterField.getText());
391+
}
392+
});
378393
}
379394

380395
private void createProjectVersionSection() {

plugins/com.google.cloud.tools.eclipse.appengine.deploy.ui/src/com/google/cloud/tools/eclipse/appengine/deploy/ui/internal/AppEngineApplicationQueryJob.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public void run() {
8989
if (!projectSelector.isDisposed()
9090
&& isLatestAppQueryJob.apply(thisJob) /* intentionally checking in UI context */
9191
// Covers the case where user switches accounts.
92-
&& !projectSelector.getViewer().getSelection().isEmpty()) {
92+
&& !projectSelector.getSelection().isEmpty()) {
9393
projectSelector.setStatusLink(statusMessage, statusTooltip);
9494
}
9595
}

plugins/com.google.cloud.tools.eclipse.appengine.deploy.ui/src/com/google/cloud/tools/eclipse/appengine/deploy/ui/messages.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ projectselector.createproject.tooltip=Opens the Cloud Console in a browser. You
6666
after the project is created.
6767
projectselector.no.projects=No projects found
6868
projectselector.project.not.selected=Select a project
69+
projectselector.filter=Filter projects by name or ID
6970
projectselector.retrieveproject.error.message=An error occurred while retrieving projects: {0}
7071
projectselector.retrieveapplication.error.message=An error occurred while retrieving App Engine application:\n{0}
7172
projectselector.missing.appengine.application.link=This project does not have an App Engine application which is \

plugins/com.google.cloud.tools.eclipse.projectselector.test/src/com/google/cloud/tools/eclipse/projectselector/ProjectSelectorTest.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,17 @@
1818

1919
import static org.hamcrest.MatcherAssert.assertThat;
2020
import static org.hamcrest.Matchers.is;
21+
import static org.junit.Assert.assertFalse;
22+
import static org.junit.Assert.assertTrue;
23+
import static org.mockito.Matchers.any;
24+
import static org.mockito.Mockito.mock;
25+
import static org.mockito.Mockito.when;
2126

2227
import com.google.cloud.tools.eclipse.projectselector.model.GcpProject;
2328
import com.google.cloud.tools.eclipse.test.util.ui.ShellTestResource;
2429
import java.util.Arrays;
2530
import java.util.List;
31+
import org.eclipse.core.databinding.property.value.IValueProperty;
2632
import org.eclipse.jface.viewers.IStructuredSelection;
2733
import org.eclipse.jface.viewers.StructuredSelection;
2834
import org.eclipse.swt.widgets.TableColumn;
@@ -53,10 +59,14 @@ public void testProjectsAreSortedAlphabetically() throws Exception {
5359
new ProjectSelector(shellResource.getShell());
5460
projectSelector.setProjects(getUnsortedProjectList());
5561

56-
assertThat(((GcpProject) projectSelector.getViewer().getElementAt(0)).getName(), is("a"));
57-
assertThat(((GcpProject) projectSelector.getViewer().getElementAt(1)).getName(), is("b"));
58-
assertThat(((GcpProject) projectSelector.getViewer().getElementAt(2)).getName(), is("c"));
59-
assertThat(((GcpProject) projectSelector.getViewer().getElementAt(3)).getName(), is("d"));
62+
assertThat(getVisibleProjectAtIndex(projectSelector, 0).getName(), is("a"));
63+
assertThat(getVisibleProjectAtIndex(projectSelector, 1).getName(), is("b"));
64+
assertThat(getVisibleProjectAtIndex(projectSelector, 2).getName(), is("c"));
65+
assertThat(getVisibleProjectAtIndex(projectSelector, 3).getName(), is("d"));
66+
}
67+
68+
private static GcpProject getVisibleProjectAtIndex(ProjectSelector projectSelector, int index) {
69+
return (GcpProject) projectSelector.getViewer().getTable().getItem(index).getData();
6070
}
6171

6272
@Test
@@ -74,6 +84,16 @@ public void testSetProjectMaintainsSelection() {
7484
assertThat((GcpProject) selection.getFirstElement(), is(selectedProject));
7585
}
7686

87+
@Test
88+
public void testMatches() {
89+
IValueProperty property = mock(IValueProperty.class);
90+
when(property.getValue(any())).thenReturn("a");
91+
assertTrue(ProjectSelector.matches(new String[] { "a" }, new Object(), new IValueProperty[] { property }));
92+
assertFalse(
93+
ProjectSelector.matches(new String[] {"b"}, new Object(), new IValueProperty[] {property}));
94+
}
95+
96+
7797
private List<GcpProject> getUnsortedProjectList() {
7898
return Arrays.asList(new GcpProject("b", "b"),
7999
new GcpProject("a", "a"),

plugins/com.google.cloud.tools.eclipse.projectselector/META-INF/MANIFEST.MF

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ Import-Package: com.google.api.client.auth.oauth2;version="[1.22.0,1.23.0)",
3636
org.codehaus.jackson,
3737
org.eclipse.core.databinding.beans,
3838
org.eclipse.core.databinding.conversion,
39+
org.eclipse.core.databinding.observable,
3940
org.eclipse.core.databinding.observable.list,
41+
org.eclipse.core.databinding.property,
42+
org.eclipse.core.databinding.property.list,
4043
org.eclipse.core.databinding.property.value,
4144
org.eclipse.core.runtime;bundle-symbolic-name="org.eclipse.core.runtime",
4245
org.eclipse.jface.databinding.viewers,
@@ -45,4 +48,5 @@ Import-Package: com.google.api.client.auth.oauth2;version="[1.22.0,1.23.0)",
4548
org.eclipse.swt,
4649
org.eclipse.swt.events,
4750
org.eclipse.swt.layout,
48-
org.eclipse.swt.widgets
51+
org.eclipse.swt.widgets,
52+
org.eclipse.ui.dialogs

0 commit comments

Comments
 (0)