diff options
author | Chet Haase <chet@google.com> | 2011-04-22 16:24:23 -0700 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2011-05-04 17:37:22 -0700 |
commit | 3fe16ced4294bdeeab31008e93b5e2d004da7437 (patch) | |
tree | a82c16fc41828ac25f6d744735fc709c7bcf6559 /hierarchyviewer | |
parent | 4355ff5f80690a4503314ead5299b88f04bfcfaa (diff) | |
download | sdk-3fe16ced4294bdeeab31008e93b5e2d004da7437.zip sdk-3fe16ced4294bdeeab31008e93b5e2d004da7437.tar.gz sdk-3fe16ced4294bdeeab31008e93b5e2d004da7437.tar.bz2 |
hierarchyviewer can dump displaylists for selected nodes.
In hierarchyviewer (and hierarchyviewer1):
The displaylist for the selected node (if there is one) is output
into logcat when the "Dump DisplayList" button is clicked.
Change-Id: I1996bbd1cbe32d8bc25708453c777800385fe444
Diffstat (limited to 'hierarchyviewer')
3 files changed, 98 insertions, 3 deletions
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewManager.java b/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewManager.java index df2a63e..ba346df 100644 --- a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewManager.java +++ b/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewManager.java @@ -35,6 +35,10 @@ public class ViewManager { sendCommand("REQUEST_LAYOUT", device, window, params); } + public static void outputDisplayList(IDevice device, Window window, String params) { + sendCommand("OUTPUT_DISPLAYLIST", device, window, params); + } + private static void sendCommand(String command, IDevice device, Window window, String params) { Socket socket = null; BufferedWriter out = null; diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java index a7db985..82375e0 100644 --- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java +++ b/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java @@ -29,6 +29,7 @@ import com.android.hierarchyviewer.scene.ViewManager; import com.android.hierarchyviewer.scene.ViewNode; import com.android.hierarchyviewer.scene.WindowsLoader; import com.android.hierarchyviewer.scene.ProfilesLoader; +import com.android.hierarchyviewer.ui.action.DumpDisplayListAction; import com.android.hierarchyviewer.ui.util.PsdFileFilter; import com.android.hierarchyviewer.util.OS; import com.android.hierarchyviewer.util.WorkerThread; @@ -145,6 +146,7 @@ public class Workspace extends JFrame { private JPanel mainPanel; private JProgressBar progress; private JToolBar buttonsPanel; + private JToolBar commandButtonsPanel; private JComponent deviceSelector; private DevicesTableModel devicesTableModel; @@ -154,6 +156,7 @@ public class Workspace extends JFrame { private Window currentWindow = Window.FOCUSED_WINDOW; private JButton displayNodeButton; + private JButton dumpDisplayListButton; private JButton captureLayersButton; private JButton invalidateButton; private JButton requestLayoutButton; @@ -202,6 +205,7 @@ public class Workspace extends JFrame { actionsMap.put(StopServerAction.ACTION_NAME, new StopServerAction(this)); actionsMap.put(InvalidateAction.ACTION_NAME, new InvalidateAction(this)); actionsMap.put(RequestLayoutAction.ACTION_NAME, new RequestLayoutAction(this)); + actionsMap.put(DumpDisplayListAction.ACTION_NAME, new DumpDisplayListAction(this)); actionsMap.put(CaptureNodeAction.ACTION_NAME, new CaptureNodeAction(this)); actionsMap.put(CaptureLayersAction.ACTION_NAME, new CaptureLayersAction(this)); actionsMap.put(RefreshWindowsAction.ACTION_NAME, new RefreshWindowsAction(this)); @@ -210,11 +214,12 @@ public class Workspace extends JFrame { private JComponent buildMainPanel() { mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); - mainPanel.add(buildToolBar(), BorderLayout.PAGE_START); + commandButtonsPanel = buildToolBar(); + mainPanel.add(commandButtonsPanel, BorderLayout.PAGE_START); mainPanel.add(deviceSelector = buildDeviceSelector(), BorderLayout.CENTER); mainPanel.add(buildStatusPanel(), BorderLayout.SOUTH); - mainPanel.setPreferredSize(new Dimension(950, 800)); + mainPanel.setPreferredSize(new Dimension(1200, 800)); return mainPanel; } @@ -481,6 +486,11 @@ public class Workspace extends JFrame { displayNodeButton.putClientProperty("JButton.segmentPosition", "first"); toolBar.add(displayNodeButton); + dumpDisplayListButton = new JButton(); + dumpDisplayListButton.setAction(actionsMap.get(DumpDisplayListAction.ACTION_NAME)); + dumpDisplayListButton.putClientProperty("JButton.buttonType", "segmentedTextured"); + dumpDisplayListButton.putClientProperty("JButton.segmentPosition", "middle"); + captureLayersButton = new JButton(); captureLayersButton.setAction(actionsMap.get(CaptureLayersAction.ACTION_NAME)); captureLayersButton.putClientProperty("JButton.buttonType", "segmentedTextured"); @@ -502,6 +512,17 @@ public class Workspace extends JFrame { return toolBar; } + private void setupProtocolDependentToolbar() { + // Some functionality is only enabled in certain versions of the protocol. + // Add/remove those buttons here + if (protocolVersion < 4) { + commandButtonsPanel.remove(dumpDisplayListButton); + } else if (dumpDisplayListButton.getParent() == null) { + commandButtonsPanel.add(dumpDisplayListButton, + commandButtonsPanel.getComponentCount() - 1); + } + } + private JMenuBar buildMenuBar() { JMenuBar menuBar = new JMenuBar(); @@ -885,6 +906,7 @@ public class Workspace extends JFrame { displayNodeButton.setEnabled(false); captureLayersButton.setEnabled(false); invalidateButton.setEnabled(false); + dumpDisplayListButton.setEnabled(false); requestLayoutButton.setEnabled(false); graphViewButton.setEnabled(false); pixelPerfectViewButton.setEnabled(false); @@ -914,6 +936,7 @@ public class Workspace extends JFrame { displayNodeButton.setEnabled(false); captureLayersButton.setEnabled(false); invalidateButton.setEnabled(false); + dumpDisplayListButton.setEnabled(false); graphViewButton.setEnabled(false); pixelPerfectViewButton.setEnabled(false); requestLayoutButton.setEnabled(false); @@ -1008,6 +1031,13 @@ public class Workspace extends JFrame { return new CaptureNodeTask(); } + public SwingWorker<?, ?> outputDisplayList() { + if (scene.getFocusedObject() == null) { + return null; + } + return new DumpDisplayListTask(); + } + public SwingWorker<?, ?> captureLayers() { JFileChooser chooser = new JFileChooser(); chooser.setFileFilter(new PsdFileFilter()); @@ -1081,6 +1111,27 @@ public class Workspace extends JFrame { } } + private class DumpDisplayListTask extends SwingWorker<Object, Void> { + private String captureParams; + + private DumpDisplayListTask() { + captureParams = scene.getFocusedObject().toString(); + beginTask(); + } + + @Override + @WorkerThread + protected Object doInBackground() throws Exception { + ViewManager.outputDisplayList(currentDevice, currentWindow, captureParams); + return null; + } + + @Override + protected void done() { + endTask(); + } + } + private class RequestLayoutTask extends SwingWorker<Object, Void> { private String captureParams; @@ -1182,7 +1233,7 @@ public class Workspace extends JFrame { WindowsResult result = get(); protocolVersion = result.protocolVersion; serverVersion = result.serverVersion; - + setupProtocolDependentToolbar(); windowsTableModel.clear(); windowsTableModel.addWindows(result.windows); } catch (ExecutionException e) { @@ -1324,6 +1375,7 @@ public class Workspace extends JFrame { public void focusChanged(ObjectSceneEvent e, Object oldFocus, Object newFocus) { displayNodeButton.setEnabled(true); invalidateButton.setEnabled(true); + dumpDisplayListButton.setEnabled(true); requestLayoutButton.setEnabled(true); Set<Object> selection = new HashSet<Object>(); diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/DumpDisplayListAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/DumpDisplayListAction.java new file mode 100644 index 0000000..3e66794 --- /dev/null +++ b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/DumpDisplayListAction.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2011 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.hierarchyviewer.ui.action; + +import com.android.hierarchyviewer.ui.Workspace; + +import javax.swing.KeyStroke; +import java.awt.event.KeyEvent; +import java.awt.event.ActionEvent; +import java.awt.Toolkit; + +public class DumpDisplayListAction extends BackgroundAction { + public static final String ACTION_NAME = "dumpDisplayList"; + private Workspace mWorkspace; + + public DumpDisplayListAction(Workspace workspace) { + putValue(NAME, "Dump DisplayList"); + putValue(SHORT_DESCRIPTION, "Dump DisplayList"); + putValue(LONG_DESCRIPTION, "Dump DisplayList"); + this.mWorkspace = workspace; + } + + public void actionPerformed(ActionEvent e) { + executeBackgroundTask(mWorkspace.outputDisplayList()); + } +} |