org.chromium.debug.ui/src/org/chromium/debug/ui/DialogBasedTabSelector.java
changeset 2 e4420d2515f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.chromium.debug.ui/src/org/chromium/debug/ui/DialogBasedTabSelector.java	Wed Dec 23 17:13:18 2009 -0800
@@ -0,0 +1,75 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.debug.ui;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.chromium.debug.core.model.TabSelector;
+import org.chromium.sdk.Browser;
+import org.chromium.sdk.Browser.TabConnector;
+import org.chromium.sdk.Browser.TabFetcher;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * A TabSelector which brings up a dialog allowing users to select which target
+ * browser tab to debug.
+ */
+public class DialogBasedTabSelector implements TabSelector {
+
+  public TabConnector selectTab(TabFetcher tabFetcher) throws IOException {
+    List<? extends Browser.TabConnector> allTabs = tabFetcher.getTabs();
+
+    List<Browser.TabConnector> filteredTabs = new ArrayList<TabConnector>(allTabs.size());
+
+    for (Browser.TabConnector tab : allTabs) {
+      if (!tab.isAlreadyAttached()) {
+        filteredTabs.add(tab);
+      }
+    }
+
+    if (autoSelectSingleTab()) {
+      if (allTabs.size() == 1 && filteredTabs.size() == 1) {
+        // if all crystal clear -- choose by default
+        // disable auto-select if there are some already attached tabs:
+        //  user has already seen this dialog and might have got used to it
+        //  he might not understand why it didn't show up this time
+        return allTabs.get(0);
+      }
+    }
+
+    final Map<Integer, Browser.TabConnector> map = new HashMap<Integer, Browser.TabConnector>();
+    final List<String> urls = new ArrayList<String>(filteredTabs.size());
+    for (int i = 0; i < filteredTabs.size(); ++i) {
+      Browser.TabConnector connector = filteredTabs.get(i);
+      map.put(i, connector);
+      urls.add(connector.getUrl());
+    }
+    final Browser.TabConnector[] result = { null };
+    Display.getDefault().syncExec(new Runnable() {
+      public void run() {
+        final Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+        final ChromiumTabSelectionDialog dialog = new ChromiumTabSelectionDialog(shell, urls);
+        dialog.setBlockOnOpen(true);
+        int dialogResult = dialog.open();
+        if (dialogResult == ChromiumTabSelectionDialog.OK) {
+          result[0] = map.get(dialog.getSelectedLine());
+        }
+        // otherwise (result[0] == null) which means "Do not attach"
+      }
+    });
+    return result[0];
+  }
+
+  private boolean autoSelectSingleTab() {
+    return true;
+  }
+
+}