aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSiva Velusamy <vsiva@google.com>2012-06-06 08:19:06 -0700
committerandroid code review <noreply-gerritcodereview@google.com>2012-06-06 08:19:06 -0700
commit455038d1740083aa5e2b5b0ec852cd81bcc9ce1e (patch)
treef91c95ded13c7139771d4d26076b58388ed84874
parent497549bb430fc67b2e040d86dbbd11d9d3a0995a (diff)
parent645735cee53fbc0ab6a0fd72f006b11a57d73df7 (diff)
downloadsdk-455038d1740083aa5e2b5b0ec852cd81bcc9ce1e.zip
sdk-455038d1740083aa5e2b5b0ec852cd81bcc9ce1e.tar.gz
sdk-455038d1740083aa5e2b5b0ec852cd81bcc9ce1e.tar.bz2
Merge "gltrace: Add support for Copy, Select All and Find actions."
-rwxr-xr-xeclipse/plugins/com.android.ide.eclipse.gldebugger/.classpath1
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLFunctionTraceViewer.java111
2 files changed, 111 insertions, 1 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/.classpath b/eclipse/plugins/com.android.ide.eclipse.gldebugger/.classpath
index ac403f0..59d5fe5 100755
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/.classpath
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/.classpath
@@ -6,5 +6,6 @@
<classpathentry kind="lib" path="libs/host-libprotobuf-java-2.3.0-lite.jar"/>
<classpathentry kind="lib" path="libs/liblzf.jar"/>
<classpathentry combineaccessrules="false" kind="src" path="/ddmlib"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/ddmuilib"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLFunctionTraceViewer.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLFunctionTraceViewer.java
index 7a9f167..fc99764 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLFunctionTraceViewer.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLFunctionTraceViewer.java
@@ -16,6 +16,8 @@
package com.android.ide.eclipse.gltrace.editors;
+import com.android.ddmuilib.FindDialog;
+import com.android.ddmuilib.AbstractBufferFindTarget;
import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function;
import com.android.ide.eclipse.gltrace.SwtUtils;
import com.android.ide.eclipse.gltrace.TraceFileParserTask;
@@ -28,6 +30,7 @@ import com.android.ide.eclipse.gltrace.views.FrameSummaryViewPage;
import com.android.ide.eclipse.gltrace.views.detail.DetailsPage;
import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.CellLabelProvider;
@@ -42,6 +45,9 @@ import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ModifyEvent;
@@ -62,10 +68,12 @@ import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.EditorPart;
import java.io.File;
@@ -80,6 +88,7 @@ public class GLFunctionTraceViewer extends EditorPart implements ISelectionProvi
public static final String ID = "com.android.ide.eclipse.gltrace.GLFunctionTrace"; //$NON-NLS-1$
private static final String DEFAULT_FILTER_MESSAGE = "Filter list of OpenGL calls. Accepts Java regexes.";
+ private static final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
/** Width of thumbnail images of the framebuffer. */
private static final int THUMBNAIL_WIDTH = 50;
@@ -196,6 +205,31 @@ public class GLFunctionTraceViewer extends EditorPart implements ISelectionProvi
refreshUI();
}
});
+
+ IActionBars actionBars = getEditorSite().getActionBars();
+ actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
+ new Action("Copy") {
+ @Override
+ public void run() {
+ copySelectionToClipboard();
+ }
+ });
+
+ actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
+ new Action("Select All") {
+ @Override
+ public void run() {
+ selectAll();
+ }
+ });
+
+ actionBars.setGlobalActionHandler(ActionFactory.FIND.getId(),
+ new Action("Find") {
+ @Override
+ public void run() {
+ showFindDialog();
+ }
+ });
}
private void refreshUI() {
@@ -362,7 +396,7 @@ public class GLFunctionTraceViewer extends EditorPart implements ISelectionProvi
GridData gd = new GridData(GridData.FILL_BOTH);
c.setLayoutData(gd);
- final Tree tree = new Tree(c, SWT.BORDER | SWT.FULL_SELECTION);
+ final Tree tree = new Tree(c, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
gd = new GridData(GridData.FILL_BOTH);
tree.setLayoutData(gd);
tree.setLinesVisible(true);
@@ -673,4 +707,79 @@ public class GLFunctionTraceViewer extends EditorPart implements ISelectionProvi
public DetailsPage getDetailsPage() {
return new DetailsPage(mTrace);
}
+
+ private void copySelectionToClipboard() {
+ if (mFrameTreeViewer == null || mFrameTreeViewer.getTree().isDisposed()) {
+ return;
+ }
+
+ StringBuilder sb = new StringBuilder();
+
+ for (TreeItem it: mFrameTreeViewer.getTree().getSelection()) {
+ Object data = it.getData();
+ if (data instanceof GLCallNode) {
+ sb.append(((GLCallNode) data).getCall());
+ sb.append(NEWLINE);
+ }
+ }
+
+ if (sb.length() > 0) {
+ Clipboard cb = new Clipboard(Display.getDefault());
+ cb.setContents(
+ new Object[] { sb.toString() },
+ new Transfer[] { TextTransfer.getInstance() });
+ cb.dispose();
+ }
+ }
+
+ private void selectAll() {
+ if (mFrameTreeViewer == null || mFrameTreeViewer.getTree().isDisposed()) {
+ return;
+ }
+
+ mFrameTreeViewer.getTree().selectAll();
+ }
+
+ private class TraceViewerFindTarget extends AbstractBufferFindTarget {
+ @Override
+ public int getItemCount() {
+ return mFrameTreeViewer.getTree().getItemCount();
+ }
+
+ @Override
+ public String getItem(int index) {
+ Object data = mFrameTreeViewer.getTree().getItem(index).getData();
+ if (data instanceof GLCallNode) {
+ return ((GLCallNode) data).getCall().toString();
+ }
+ return null;
+ }
+
+ @Override
+ public void selectAndReveal(int index) {
+ Tree t = mFrameTreeViewer.getTree();
+ t.deselectAll();
+ t.select(t.getItem(index));
+ t.showSelection();
+ }
+
+ @Override
+ public int getStartingIndex() {
+ return 0;
+ }
+ };
+
+ private FindDialog mFindDialog;
+ private TraceViewerFindTarget mFindTarget = new TraceViewerFindTarget();
+
+ private void showFindDialog() {
+ if (mFindDialog != null) {
+ // the dialog is already displayed
+ return;
+ }
+
+ mFindDialog = new FindDialog(Display.getDefault().getActiveShell(), mFindTarget);
+ mFindDialog.open(); // blocks until find dialog is closed
+ mFindDialog = null;
+ }
}