Merge "Removes GCRoots pane" into studio-1.3-dev
automerge: 79614aa

* commit '79614aa436dd1cc3a829476bec1250ad3b18041c':
  Removes GCRoots pane
diff --git a/android/src/com/android/tools/idea/editors/hprof/ComputeDominatorAction.java b/android/src/com/android/tools/idea/editors/hprof/ComputeDominatorAction.java
new file mode 100644
index 0000000..df6b794
--- /dev/null
+++ b/android/src/com/android/tools/idea/editors/hprof/ComputeDominatorAction.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.editors.hprof;
+
+import com.android.tools.idea.editors.hprof.tables.heaptable.HeapTableManager;
+import com.android.tools.perflib.heap.Snapshot;
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.progress.ProgressIndicator;
+import com.intellij.openapi.progress.ProgressManager;
+import com.intellij.openapi.progress.Task;
+import com.intellij.openapi.project.Project;
+import icons.AndroidIcons;
+import org.jetbrains.annotations.NotNull;
+
+public class ComputeDominatorAction extends AnAction {
+  private Snapshot mySnapshot;
+  private HeapTableManager myHeapTableManager;
+  @NotNull Project myProject;
+
+  public ComputeDominatorAction(@NotNull Snapshot snapshot, @NotNull HeapTableManager heapTableManager, @NotNull Project project) {
+    super(null, "Compute Dominators", AndroidIcons.Ddms.AllocationTracker);
+    mySnapshot = snapshot;
+    myHeapTableManager = heapTableManager;
+    myProject = project;
+  }
+
+  @Override
+  public void actionPerformed(AnActionEvent e) {
+    ProgressManager.getInstance().run(new ComputeDominatorIndicator(myProject));
+  }
+
+  private class ComputeDominatorIndicator extends Task.Modal {
+    public ComputeDominatorIndicator(@NotNull Project project) {
+      super(project, "Computing dominators...", true);
+    }
+
+    @Override
+    public void onSuccess() {
+      super.onSuccess();
+      myHeapTableManager.notifyDominatorsComputed();
+    }
+
+    @Override
+    public void run(@NotNull ProgressIndicator indicator) {
+      indicator.setIndeterminate(true);
+      // TODO do this in a separate thread.
+      mySnapshot.computeDominators();
+    }
+  }
+}
diff --git a/android/src/com/android/tools/idea/editors/hprof/HprofViewPanel.java b/android/src/com/android/tools/idea/editors/hprof/HprofViewPanel.java
index 6e15199..dbc2f5d 100644
--- a/android/src/com/android/tools/idea/editors/hprof/HprofViewPanel.java
+++ b/android/src/com/android/tools/idea/editors/hprof/HprofViewPanel.java
@@ -15,17 +15,12 @@
  */
 package com.android.tools.idea.editors.hprof;
 
-import com.android.tools.idea.editors.hprof.tables.gcroottable.GcRootTable;
 import com.android.tools.idea.editors.hprof.tables.heaptable.HeapTableManager;
 import com.android.tools.idea.editors.hprof.tables.instancestable.InstanceDetailView;
 import com.android.tools.perflib.heap.Snapshot;
 import com.intellij.execution.ui.layout.impl.JBRunnerTabs;
 import com.intellij.openapi.Disposable;
-import com.intellij.openapi.actionSystem.*;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.progress.ProgressIndicator;
-import com.intellij.openapi.progress.ProgressManager;
-import com.intellij.openapi.progress.Task;
+import com.intellij.openapi.actionSystem.ActionManager;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.wm.IdeFocusManager;
 import com.intellij.ui.JBColor;
@@ -35,7 +30,6 @@
 import com.intellij.ui.components.panels.Wrapper;
 import com.intellij.ui.tabs.TabInfo;
 import com.intellij.util.ui.UIUtil;
-import icons.AndroidIcons;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -44,27 +38,19 @@
 import java.awt.*;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
 
 public class HprofViewPanel implements Disposable {
   private static final int DIVIDER_WIDTH = 4;
-  @NotNull private Project myProject;
   @NotNull private JPanel myContainer;
-  @NotNull private JBRunnerTabs myNavigationTabs;
   @NotNull private JBRunnerTabs myDetailTabs;
   @NotNull private HeapTableManager myHeapTableManager;
-  private GcRootTable myGcRootTable;
-  private Snapshot mySnapshot;
 
   public HprofViewPanel(@NotNull final Project project) {
-    myProject = project;
+    JBRunnerTabs navigationTabs = new JBRunnerTabs(project, ActionManager.getInstance(), IdeFocusManager.findInstance(), this);
+    navigationTabs.setBorder(new EmptyBorder(0, 2, 0, 0));
+    navigationTabs.setPaintBorder(0, 0, 0, 0);
 
-    myNavigationTabs = new JBRunnerTabs(myProject, ActionManager.getInstance(), IdeFocusManager.findInstance(), this);
-    myNavigationTabs.setBorder(new EmptyBorder(0, 2, 0, 0));
-    myNavigationTabs.setPaintBorder(0, 0, 0, 0);
-
-    myDetailTabs = new JBRunnerTabs(myProject, ActionManager.getInstance(), IdeFocusManager.findInstance(), this);
+    myDetailTabs = new JBRunnerTabs(project, ActionManager.getInstance(), IdeFocusManager.findInstance(), this);
     myDetailTabs.setBorder(new EmptyBorder(0, 2, 0, 0));
     myDetailTabs.setPaintBorder(0, 0, 0, 0);
     myDetailTabs.addTabMouseListener(new MouseAdapter() {
@@ -79,7 +65,7 @@
       }
     });
 
-    myHeapTableManager = new HeapTableManager(myProject, this, myNavigationTabs);
+    myHeapTableManager = new HeapTableManager(project, this, navigationTabs);
 
     JBPanel treePanel = new JBPanel(new BorderLayout());
     treePanel.setBorder(BorderFactory.createLineBorder(JBColor.border()));
@@ -90,7 +76,7 @@
     treePanelWrapper.setBorder(new EmptyBorder(0, 1, 0, 0));
 
     JBSplitter mainSplitter = new JBSplitter(true);
-    mainSplitter.setFirstComponent(myNavigationTabs);
+    mainSplitter.setFirstComponent(navigationTabs);
     mainSplitter.setSecondComponent(treePanelWrapper);
     mainSplitter.setDividerWidth(DIVIDER_WIDTH);
 
@@ -99,12 +85,6 @@
   }
 
   public void setSnapshot(@NotNull Snapshot snapshot) {
-    mySnapshot = snapshot;
-
-    myGcRootTable = new GcRootTable(mySnapshot);
-    myNavigationTabs.addTab(new TabInfo(HeapTableManager.createNavigationSplitter(myGcRootTable, null)).setText("GC Roots")
-                              .setActions(new DefaultActionGroup(new ComputeDominatorAction(myProject)), ActionPlaces.UNKNOWN));
-
     myHeapTableManager.setSnapshot(snapshot);
   }
 
@@ -133,78 +113,4 @@
   public void dispose() {
 
   }
-
-  private static class ComputeDominatorIndicator extends Task.Backgroundable {
-    @NotNull private final CountDownLatch myLatch;
-
-    public ComputeDominatorIndicator(@NotNull Project project) {
-      super(project, "Computing dominators...", true);
-      myLatch = new CountDownLatch(1);
-    }
-
-    public void exit() {
-      myLatch.countDown();
-    }
-
-    @Override
-    public void run(@NotNull ProgressIndicator indicator) {
-      indicator.setIndeterminate(true);
-
-      while (myLatch.getCount() > 0) {
-        try {
-          myLatch.await(200, TimeUnit.MILLISECONDS);
-        }
-        catch (InterruptedException e) {
-          exit();
-          break;
-        }
-      }
-    }
-  }
-
-  private class ComputeDominatorAction extends ToggleAction {
-    @NotNull Project myProject;
-    private boolean myDominatorsComputed;
-
-    private ComputeDominatorAction(@NotNull Project project) {
-      super(null, "Compute Dominators", AndroidIcons.Ddms.AllocationTracker);
-      myProject = project;
-    }
-
-    @Override
-    public void update(@NotNull AnActionEvent e) {
-      super.update(e);
-      if (!myDominatorsComputed && e.getInputEvent() != null) {
-        myDominatorsComputed = true;
-        final ComputeDominatorIndicator indicator = new ComputeDominatorIndicator(myProject);
-        ProgressManager.getInstance().run(indicator);
-
-        ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
-          @Override
-          public void run() {
-            mySnapshot.computeDominators();
-
-            ApplicationManager.getApplication().invokeLater(new Runnable() {
-              @Override
-              public void run() {
-                myHeapTableManager.notifyDominatorsComputed();
-                myGcRootTable.notifyDominatorsComputed();
-                indicator.exit();
-              }
-            });
-          }
-        });
-      }
-    }
-
-    @Override
-    public boolean isSelected(AnActionEvent e) {
-      return myDominatorsComputed;
-    }
-
-    @Override
-    public void setSelected(AnActionEvent e, boolean state) {
-      myDominatorsComputed |= state;
-    }
-  }
 }
diff --git a/android/src/com/android/tools/idea/editors/hprof/tables/gcroottable/GcRootTable.java b/android/src/com/android/tools/idea/editors/hprof/tables/gcroottable/GcRootTable.java
deleted file mode 100644
index 92e8365..0000000
--- a/android/src/com/android/tools/idea/editors/hprof/tables/gcroottable/GcRootTable.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.tools.idea.editors.hprof.tables.gcroottable;
-
-import com.android.tools.idea.editors.hprof.tables.HprofTable;
-import com.android.tools.perflib.heap.Snapshot;
-import org.jetbrains.annotations.NotNull;
-
-public class GcRootTable extends HprofTable {
-  public GcRootTable(@NotNull Snapshot snapshot) {
-    super(new GcRootTableModel(snapshot));
-  }
-}
diff --git a/android/src/com/android/tools/idea/editors/hprof/tables/gcroottable/GcRootTableModel.java b/android/src/com/android/tools/idea/editors/hprof/tables/gcroottable/GcRootTableModel.java
deleted file mode 100644
index 65f6420..0000000
--- a/android/src/com/android/tools/idea/editors/hprof/tables/gcroottable/GcRootTableModel.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.tools.idea.editors.hprof.tables.gcroottable;
-
-import com.android.tools.idea.editors.hprof.tables.HprofTableModel;
-import com.android.tools.idea.editors.hprof.tables.TableColumn;
-import com.android.tools.perflib.heap.RootObj;
-import com.android.tools.perflib.heap.RootType;
-import com.android.tools.perflib.heap.Snapshot;
-import org.jetbrains.annotations.NotNull;
-
-import javax.swing.*;
-import java.util.ArrayList;
-import java.util.List;
-
-public class GcRootTableModel extends HprofTableModel {
-  private static final boolean HIDE_UNDEFINED_NAMES = false;
-  @NotNull private Snapshot mySnapshot;
-  private List<RootObj> myRoots;
-  @NotNull private List<TableColumn<GcRootTableModel, ?>> myColumns;
-
-  public GcRootTableModel(@NotNull Snapshot snapshot) {
-    super();
-    mySnapshot = snapshot;
-    myColumns = createGcRootTableColumns();
-    myRoots = new ArrayList<RootObj>();
-    if (HIDE_UNDEFINED_NAMES) {
-      for (RootObj root : mySnapshot.getGCRoots()) {
-        if (root.getClassName(mySnapshot) != RootObj.UNDEFINED_CLASS_NAME) {
-          myRoots.add(root);
-        }
-      }
-    }
-    else {
-      myRoots.addAll(mySnapshot.getGCRoots());
-    }
-  }
-
-  @Override
-  public int getRowCount() {
-    return myRoots.size();
-  }
-
-  @Override
-  public int getColumnCount() {
-    return myColumns.size();
-  }
-
-  @NotNull
-  @Override
-  protected TableColumn getColumn(int index) {
-    return myColumns.get(index);
-  }
-
-  @NotNull
-  private List<TableColumn<GcRootTableModel, ?>> createGcRootTableColumns() {
-    List<TableColumn<GcRootTableModel, ?>> columns = new ArrayList<TableColumn<GcRootTableModel, ?>>();
-    columns.add(new TableColumn<GcRootTableModel, String>("Root Instance", String.class, SwingConstants.LEFT, 600, true) {
-      @Override
-      public String getValue(@NotNull GcRootTableModel modelType, int row) {
-        return modelType.myRoots.get(row).getClassName(mySnapshot);
-      }
-    });
-    columns.add(new TableColumn<GcRootTableModel, RootType>("Root Type", RootType.class, SwingConstants.LEFT, 150, true) {
-      @Override
-      public RootType getValue(@NotNull GcRootTableModel modelType, int row) {
-        return modelType.myRoots.get(row).getRootType();
-      }
-    });
-    columns.add(new TableColumn<GcRootTableModel, Long>("Total Retention", Long.class, SwingConstants.RIGHT, 100, false) {
-      @Override
-      public Long getValue(@NotNull GcRootTableModel modelType, int row) {
-        return modelType.myRoots.get(row).getTotalRetainedSize();
-      }
-    });
-
-    return columns;
-  }
-}
diff --git a/android/src/com/android/tools/idea/editors/hprof/tables/heaptable/HeapTableManager.java b/android/src/com/android/tools/idea/editors/hprof/tables/heaptable/HeapTableManager.java
index b6c89f8..eaecde0 100644
--- a/android/src/com/android/tools/idea/editors/hprof/tables/heaptable/HeapTableManager.java
+++ b/android/src/com/android/tools/idea/editors/hprof/tables/heaptable/HeapTableManager.java
@@ -16,6 +16,7 @@
 package com.android.tools.idea.editors.hprof.tables.heaptable;
 
 import com.android.tools.idea.editors.hprof.HprofViewPanel;
+import com.android.tools.idea.editors.hprof.ComputeDominatorAction;
 import com.android.tools.idea.editors.hprof.tables.instancestable.InstanceDetailModel;
 import com.android.tools.idea.editors.hprof.tables.instancestable.InstanceDetailView;
 import com.android.tools.idea.editors.hprof.tables.instancestable.InstancesTreeTable;
@@ -25,6 +26,8 @@
 import com.android.tools.perflib.heap.Instance;
 import com.android.tools.perflib.heap.Snapshot;
 import com.intellij.execution.ui.layout.impl.JBRunnerTabs;
+import com.intellij.openapi.actionSystem.ActionPlaces;
+import com.intellij.openapi.actionSystem.DefaultActionGroup;
 import com.intellij.openapi.project.Project;
 import com.intellij.ui.JBColor;
 import com.intellij.ui.JBSplitter;
@@ -158,7 +161,8 @@
       });
 
       JBSplitter splitter = createNavigationSplitter(heapTable, instancesTreeTable);
-      myParentContainer.addTab(new TabInfo(splitter).setText(model.getHeapName()).setSideComponent(new JPanel()));
+      DefaultActionGroup group = new DefaultActionGroup(new ComputeDominatorAction(mySnapshot, this, myProject));
+      myParentContainer.addTab(new TabInfo(splitter).setText(model.getHeapName()).setActions(group, ActionPlaces.UNKNOWN));
     }
   }
 }