diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-11 12:11:54 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-11 12:11:54 -0700 |
commit | 45aacc49a96e083eb68cda88ed0f7e262b7254d1 (patch) | |
tree | cda6eb191928e6e7332ef036e9c8bd7c2c234e67 /hierarchyviewer | |
parent | 67dc23a61d888ba1b39fe6ed23d9f4d1a3df80ee (diff) | |
download | sdk-45aacc49a96e083eb68cda88ed0f7e262b7254d1.zip sdk-45aacc49a96e083eb68cda88ed0f7e262b7254d1.tar.gz sdk-45aacc49a96e083eb68cda88ed0f7e262b7254d1.tar.bz2 |
auto import from //branches/cupcake/...@137873
Diffstat (limited to 'hierarchyviewer')
3 files changed, 192 insertions, 5 deletions
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ProfilesLoader.java b/hierarchyviewer/src/com/android/hierarchyviewer/scene/ProfilesLoader.java new file mode 100644 index 0000000..83b9113 --- /dev/null +++ b/hierarchyviewer/src/com/android/hierarchyviewer/scene/ProfilesLoader.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2009 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.scene; + +import com.android.ddmlib.Device; +import com.android.hierarchyviewer.device.Window; +import com.android.hierarchyviewer.device.DeviceBridge; + +import java.net.Socket; +import java.net.InetSocketAddress; +import java.io.BufferedWriter; +import java.io.OutputStreamWriter; +import java.io.IOException; +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class ProfilesLoader { + public static double[] loadProfiles(Device device, Window window, String params) { + Socket socket = null; + BufferedReader in = null; + BufferedWriter out = null; + + try { + socket = new Socket(); + socket.connect(new InetSocketAddress("127.0.0.1", + DeviceBridge.getDeviceLocalPort(device))); + + out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); + in = new BufferedReader(new InputStreamReader(socket.getInputStream())); + + out.write("PROFILE " + window.encode() + " " + params); + out.newLine(); + out.flush(); + + String response = in.readLine(); + String[] data = response.split(" "); + + double[] profiles = new double[data.length]; + for (int i = 0; i < data.length; i++) { + profiles[i] = (Long.parseLong(data[i]) / 1000.0) / 1000.0; // convert to ms + } + return profiles; + } catch (IOException e) { + // Empty + } finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + if (socket != null) { + socket.close(); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + return null; + } +} diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java index 77ebb39..d530c35 100644 --- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java +++ b/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java @@ -27,6 +27,7 @@ import com.android.hierarchyviewer.scene.ViewHierarchyScene; 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.util.OS; import com.android.hierarchyviewer.util.WorkerThread; import com.android.hierarchyviewer.ui.action.ShowDevicesAction; @@ -43,6 +44,7 @@ import com.android.hierarchyviewer.ui.util.PngFileFilter; import com.android.hierarchyviewer.ui.util.IconLoader; import com.android.hierarchyviewer.ui.model.PropertiesTableModel; import com.android.hierarchyviewer.ui.model.ViewsTreeModel; +import com.android.hierarchyviewer.ui.model.ProfilesTableModel; import org.jdesktop.swingworker.SwingWorker; import org.netbeans.api.visual.graph.layout.TreeGraphLayout; import org.netbeans.api.visual.model.ObjectSceneEvent; @@ -123,6 +125,7 @@ public class Workspace extends JFrame { private JSplitPane sideSplitter; private JSplitPane mainSplitter; private JTable propertiesTable; + private JTable profilingTable; private JComponent pixelPerfectPanel; private JTree pixelPerfectTree; private ScreenViewer screenViewer; @@ -274,11 +277,32 @@ public class Workspace extends JFrame { JScrollPane tableScroller = new JScrollPane(propertiesTable); tableScroller.setBorder(null); + profilingTable = new JTable(); + profilingTable.setModel(new DefaultTableModel(new Object[][] { + { " " , " " }, { " " , " " }, { " " , " " } }, + new String[] { "Operation", "Duration (ms)" })); + profilingTable.setBorder(null); + profilingTable.getTableHeader().setBorder(null); + + JScrollPane firstTableScroller = new JScrollPane(profilingTable); + firstTableScroller.setBorder(null); + + setVisibleRowCount(profilingTable, 5); + firstTableScroller.setMinimumSize(profilingTable.getPreferredScrollableViewportSize()); + + JSplitPane tablesSplitter = new JSplitPane(); + tablesSplitter.setBorder(null); + tablesSplitter.setOrientation(JSplitPane.VERTICAL_SPLIT); + tablesSplitter.setResizeWeight(0); + tablesSplitter.setLeftComponent(firstTableScroller); + tablesSplitter.setBottomComponent(tableScroller); + tablesSplitter.setContinuousLayout(true); + sideSplitter = new JSplitPane(); sideSplitter.setBorder(null); sideSplitter.setOrientation(JSplitPane.VERTICAL_SPLIT); sideSplitter.setResizeWeight(0.5); - sideSplitter.setLeftComponent(tableScroller); + sideSplitter.setLeftComponent(tablesSplitter); sideSplitter.setBottomComponent(null); sideSplitter.setContinuousLayout(true); @@ -603,6 +627,22 @@ public class Workspace extends JFrame { propertiesTable.setModel(new PropertiesTableModel(node)); } + private void updateProfiles(double[] profiles) { + profilingTable.setModel(new ProfilesTableModel(profiles)); + setVisibleRowCount(profilingTable, profiles.length + 1); + } + + public static void setVisibleRowCount(JTable table, int rows) { + int height = 0; + for (int row = 0; row < rows; row++) { + height += table.getRowHeight(row); + } + + Dimension size = new Dimension(table.getPreferredScrollableViewportSize().width, height); + table.setPreferredScrollableViewportSize(size); + table.revalidate(); + } + private void showPixelPerfectTree() { if (pixelPerfectTree == null) { return; @@ -1134,22 +1174,24 @@ public class Workspace extends JFrame { } } - private class LoadGraphTask extends SwingWorker<ViewHierarchyScene, Void> { + private class LoadGraphTask extends SwingWorker<double[], Void> { public LoadGraphTask() { beginTask(); } @Override @WorkerThread - protected ViewHierarchyScene doInBackground() { + protected double[] doInBackground() { scene = ViewHierarchyLoader.loadScene(currentDevice, currentWindow); - return scene; + return ProfilesLoader.loadProfiles(currentDevice, currentWindow, + scene.getRoot().toString()); } @Override protected void done() { try { - createGraph(get()); + createGraph(scene); + updateProfiles(get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/model/ProfilesTableModel.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/model/ProfilesTableModel.java new file mode 100644 index 0000000..fcbe6b5 --- /dev/null +++ b/hierarchyviewer/src/com/android/hierarchyviewer/ui/model/ProfilesTableModel.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2009 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.model; + +import javax.swing.table.DefaultTableModel; +import java.text.NumberFormat; + +public class ProfilesTableModel extends DefaultTableModel { + private static final String[] NAMES = { "measure", "layout", "draw" }; + + private final double[] profiles; + private final NumberFormat formatter; + + public ProfilesTableModel(double[] profiles) { + this.profiles = profiles; + formatter = NumberFormat.getNumberInstance(); + } + + @Override + public int getRowCount() { + return profiles == null ? 0 : profiles.length; + } + + @Override + public Object getValueAt(int row, int column) { + if (profiles == null) return ""; + + if (column == 0) { + return NAMES[row]; + } + + + return formatter.format(profiles[row]) + ""; + } + + @Override + public int getColumnCount() { + return 2; + } + + @Override + public String getColumnName(int column) { + return column == 0 ? "Operation" : "Duration (ms)"; + } + + @Override + public boolean isCellEditable(int arg0, int arg1) { + return false; + } + + @Override + public void setValueAt(Object arg0, int arg1, int arg2) { + } +} |