diff options
Diffstat (limited to 'hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java')
-rw-r--r-- | hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java | 1621 |
1 files changed, 0 insertions, 1621 deletions
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java deleted file mode 100644 index bfa15b3d4..000000000 --- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java +++ /dev/null @@ -1,1621 +0,0 @@ -/* - * Copyright (C) 2008 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; - -import com.android.ddmlib.AndroidDebugBridge; -import com.android.ddmlib.IDevice; -import com.android.hierarchyviewer.device.DeviceBridge; -import com.android.hierarchyviewer.device.Window; -import com.android.hierarchyviewer.laf.UnifiedContentBorder; -import com.android.hierarchyviewer.scene.CaptureLoader; -import com.android.hierarchyviewer.scene.ProfilesLoader; -import com.android.hierarchyviewer.scene.VersionLoader; -import com.android.hierarchyviewer.scene.ViewHierarchyLoader; -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.ui.action.CaptureLayersAction; -import com.android.hierarchyviewer.ui.action.CaptureNodeAction; -import com.android.hierarchyviewer.ui.action.DumpDisplayListAction; -import com.android.hierarchyviewer.ui.action.ExitAction; -import com.android.hierarchyviewer.ui.action.InvalidateAction; -import com.android.hierarchyviewer.ui.action.LoadGraphAction; -import com.android.hierarchyviewer.ui.action.RefreshWindowsAction; -import com.android.hierarchyviewer.ui.action.RequestLayoutAction; -import com.android.hierarchyviewer.ui.action.SaveSceneAction; -import com.android.hierarchyviewer.ui.action.ShowDevicesAction; -import com.android.hierarchyviewer.ui.action.StartServerAction; -import com.android.hierarchyviewer.ui.action.StopServerAction; -import com.android.hierarchyviewer.ui.model.ProfilesTableModel; -import com.android.hierarchyviewer.ui.model.PropertiesTableModel; -import com.android.hierarchyviewer.ui.model.ViewsTreeModel; -import com.android.hierarchyviewer.ui.util.IconLoader; -import com.android.hierarchyviewer.ui.util.PngFileFilter; -import com.android.hierarchyviewer.ui.util.PsdFileFilter; -import com.android.hierarchyviewer.util.OS; -import com.android.hierarchyviewer.util.WorkerThread; - -import org.netbeans.api.visual.graph.layout.TreeGraphLayout; -import org.netbeans.api.visual.model.ObjectSceneEvent; -import org.netbeans.api.visual.model.ObjectSceneEventType; -import org.netbeans.api.visual.model.ObjectSceneListener; -import org.netbeans.api.visual.model.ObjectState; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Graphics2D; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Image; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseWheelEvent; -import java.awt.event.MouseWheelListener; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.ExecutionException; -import java.util.regex.Pattern; -import java.util.regex.PatternSyntaxException; - -import javax.imageio.ImageIO; -import javax.swing.ActionMap; -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.ButtonGroup; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComponent; -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JProgressBar; -import javax.swing.JScrollBar; -import javax.swing.JScrollPane; -import javax.swing.JSlider; -import javax.swing.JSplitPane; -import javax.swing.JTable; -import javax.swing.JTextField; -import javax.swing.JToggleButton; -import javax.swing.JToolBar; -import javax.swing.JTree; -import javax.swing.ListSelectionModel; -import javax.swing.SwingUtilities; -import javax.swing.SwingWorker; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.table.DefaultTableModel; -import javax.swing.text.BadLocationException; -import javax.swing.text.Document; -import javax.swing.tree.DefaultTreeCellRenderer; -import javax.swing.tree.TreePath; - -public class Workspace extends JFrame { - private JLabel viewCountLabel; - private JSlider zoomSlider; - private JSplitPane sideSplitter; - private JSplitPane mainSplitter; - private JTable propertiesTable; - private JTable profilingTable; - private JComponent pixelPerfectPanel; - private JTree pixelPerfectTree; - private ScreenViewer screenViewer; - - private JPanel extrasPanel; - private LayoutRenderer layoutView; - - private JScrollPane sceneScroller; - private JComponent sceneView; - - private ViewHierarchyScene scene; - - private ActionMap actionsMap; - private JPanel mainPanel; - private JProgressBar progress; - private JToolBar buttonsPanel; - private JToolBar commandButtonsPanel; - - private JComponent deviceSelector; - private DevicesTableModel devicesTableModel; - private WindowsTableModel windowsTableModel; - - private IDevice currentDevice; - private Window currentWindow = Window.FOCUSED_WINDOW; - - private JButton displayNodeButton; - private JButton dumpDisplayListButton; - private JButton captureLayersButton; - private JButton invalidateButton; - private JButton requestLayoutButton; - private JButton loadButton; - private JButton startButton; - private JButton stopButton; - private JButton showDevicesButton; - private JButton refreshButton; - private JToggleButton graphViewButton; - private JToggleButton pixelPerfectViewButton; - private JMenuItem saveMenuItem; - private JMenuItem showDevicesMenuItem; - private JMenuItem loadMenuItem; - private JMenuItem startMenuItem; - private JMenuItem stopMenuItem; - private JTable devices; - private JTable windows; - private JLabel minZoomLabel; - private JLabel maxZoomLabel; - private JTextField filterText; - private JLabel filterLabel; - - private int protocolVersion; - private int serverVersion; - - public Workspace() { - super("Hierarchy Viewer"); - - buildActions(); - add(buildMainPanel()); - setJMenuBar(buildMenuBar()); - - devices.changeSelection(0, 0, false, false); - currentDeviceChanged(); - - pack(); - } - - private void buildActions() { - actionsMap = new ActionMap(); - actionsMap.put(ExitAction.ACTION_NAME, new ExitAction(this)); - actionsMap.put(ShowDevicesAction.ACTION_NAME, new ShowDevicesAction(this)); - actionsMap.put(LoadGraphAction.ACTION_NAME, new LoadGraphAction(this)); - actionsMap.put(SaveSceneAction.ACTION_NAME, new SaveSceneAction(this)); - actionsMap.put(StartServerAction.ACTION_NAME, new StartServerAction(this)); - 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)); - } - - private JComponent buildMainPanel() { - mainPanel = new JPanel(); - mainPanel.setLayout(new BorderLayout()); - commandButtonsPanel = buildToolBar(); - mainPanel.add(commandButtonsPanel, BorderLayout.PAGE_START); - mainPanel.add(deviceSelector = buildDeviceSelector(), BorderLayout.CENTER); - mainPanel.add(buildStatusPanel(), BorderLayout.SOUTH); - - mainPanel.setPreferredSize(new Dimension(1200, 800)); - - return mainPanel; - } - - private JComponent buildGraphPanel() { - sceneScroller = new JScrollPane(); - sceneScroller.setBorder(null); - - mainSplitter = new JSplitPane(); - mainSplitter.setResizeWeight(1.0); - mainSplitter.setContinuousLayout(true); - if (OS.isMacOsX() && OS.isLeopardOrLater()) { - mainSplitter.setBorder(new UnifiedContentBorder()); - } - - mainSplitter.setLeftComponent(sceneScroller); - mainSplitter.setRightComponent(buildSideSplitter()); - - return mainSplitter; - } - - private JComponent buildDeviceSelector() { - JPanel panel = new JPanel(new GridBagLayout()); - if (OS.isMacOsX() && OS.isLeopardOrLater()) { - panel.setBorder(new UnifiedContentBorder()); - } - - devicesTableModel = new DevicesTableModel(); - for (IDevice device : DeviceBridge.getDevices()) { - DeviceBridge.setupDeviceForward(device); - devicesTableModel.addDevice(device); - } - DeviceBridge.startListenForDevices(devicesTableModel); - - devices = new JTable(devicesTableModel); - devices.getSelectionModel().addListSelectionListener(new DeviceSelectedListener()); - devices.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - devices.setBorder(null); - JScrollPane devicesScroller = new JScrollPane(devices); - devicesScroller.setBorder(null); - panel.add(devicesScroller, new GridBagConstraints(0, 0, 1, 1, 0.5, 1.0, - GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), - 0, 0)); - - windowsTableModel = new WindowsTableModel(); - windowsTableModel.setVisible(false); - - windows = new JTable(windowsTableModel); - windows.getSelectionModel().addListSelectionListener(new WindowSelectedListener()); - windows.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - windows.setBorder(null); - JScrollPane windowsScroller = new JScrollPane(windows); - windowsScroller.setBorder(null); - panel.add(windowsScroller, new GridBagConstraints(2, 0, 1, 1, 0.5, 1.0, - GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), - 0, 0)); - - return panel; - } - - private JComponent buildSideSplitter() { - propertiesTable = new JTable(); - propertiesTable.setModel(new DefaultTableModel(new Object[][] { }, - new String[] { "Property", "Value" })); - propertiesTable.setBorder(null); - propertiesTable.getTableHeader().setBorder(null); - - 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(tablesSplitter); - sideSplitter.setBottomComponent(null); - sideSplitter.setContinuousLayout(true); - - return sideSplitter; - } - - private JPanel buildStatusPanel() { - JPanel statusPanel = new JPanel(); - statusPanel.setLayout(new BorderLayout()); - - JPanel leftSide = new JPanel(); - leftSide.setOpaque(false); - leftSide.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 5)); - leftSide.add(Box.createHorizontalStrut(6)); - - ButtonGroup group = new ButtonGroup(); - - graphViewButton = new JToggleButton(IconLoader.load(getClass(), - "/images/icon-graph-view.png")); - graphViewButton.setSelectedIcon(IconLoader.load(getClass(), - "/images/icon-graph-view-selected.png")); - graphViewButton.putClientProperty("JButton.buttonType", "segmentedTextured"); - graphViewButton.putClientProperty("JButton.segmentPosition", "first"); - graphViewButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - toggleGraphView(); - } - }); - group.add(graphViewButton); - leftSide.add(graphViewButton); - - pixelPerfectViewButton = new JToggleButton(IconLoader.load(getClass(), - "/images/icon-pixel-perfect-view.png")); - pixelPerfectViewButton.setSelectedIcon(IconLoader.load(getClass(), - "/images/icon-pixel-perfect-view-selected.png")); - pixelPerfectViewButton.putClientProperty("JButton.buttonType", "segmentedTextured"); - pixelPerfectViewButton.putClientProperty("JButton.segmentPosition", "last"); - pixelPerfectViewButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - togglePixelPerfectView(); - } - }); - group.add(pixelPerfectViewButton); - leftSide.add(pixelPerfectViewButton); - - graphViewButton.setSelected(true); - - filterText = new JTextField(20); - filterText.putClientProperty("JComponent.sizeVariant", "small"); - filterText.getDocument().addDocumentListener(new DocumentListener() { - public void insertUpdate(DocumentEvent e) { - updateFilter(e); - } - - public void removeUpdate(DocumentEvent e) { - updateFilter(e); - } - - public void changedUpdate(DocumentEvent e) { - updateFilter(e); - } - }); - - filterLabel = new JLabel("Filter by class or id:"); - filterLabel.putClientProperty("JComponent.sizeVariant", "small"); - filterLabel.setBorder(BorderFactory.createEmptyBorder(0, 6, 0, 6)); - - leftSide.add(filterLabel); - leftSide.add(filterText); - - minZoomLabel = new JLabel(); - minZoomLabel.setText("20%"); - minZoomLabel.putClientProperty("JComponent.sizeVariant", "small"); - minZoomLabel.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); - leftSide.add(minZoomLabel); - - zoomSlider = new JSlider(); - zoomSlider.putClientProperty("JComponent.sizeVariant", "small"); - zoomSlider.setMaximum(200); - zoomSlider.setMinimum(20); - zoomSlider.setValue(100); - zoomSlider.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent evt) { - zoomSliderStateChanged(evt); - } - }); - leftSide.add(zoomSlider); - - maxZoomLabel = new JLabel(); - maxZoomLabel.putClientProperty("JComponent.sizeVariant", "small"); - maxZoomLabel.setText("200%"); - leftSide.add(maxZoomLabel); - - viewCountLabel = new JLabel(); - viewCountLabel.setText("0 views"); - viewCountLabel.putClientProperty("JComponent.sizeVariant", "small"); - viewCountLabel.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); - leftSide.add(viewCountLabel); - - statusPanel.add(leftSide, BorderLayout.LINE_START); - - JPanel rightSide = new JPanel(); - rightSide.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 12)); - rightSide.setLayout(new FlowLayout(FlowLayout.RIGHT)); - - progress = new JProgressBar(); - progress.setVisible(false); - progress.setIndeterminate(true); - progress.putClientProperty("JComponent.sizeVariant", "mini"); - progress.putClientProperty("JProgressBar.style", "circular"); - rightSide.add(progress); - - statusPanel.add(rightSide, BorderLayout.LINE_END); - - hideStatusBarComponents(); - - return statusPanel; - } - - private void hideStatusBarComponents() { - viewCountLabel.setVisible(false); - zoomSlider.setVisible(false); - minZoomLabel.setVisible(false); - maxZoomLabel.setVisible(false); - filterLabel.setVisible(false); - filterText.setVisible(false); - } - - private JToolBar buildToolBar() { - JToolBar toolBar = new JToolBar(); - toolBar.setFloatable(false); - toolBar.setRollover(true); - - startButton = new JButton(); - startButton.setAction(actionsMap.get(StartServerAction.ACTION_NAME)); - startButton.putClientProperty("JButton.buttonType", "segmentedTextured"); - startButton.putClientProperty("JButton.segmentPosition", "first"); - toolBar.add(startButton); - - stopButton = new JButton(); - stopButton.setAction(actionsMap.get(StopServerAction.ACTION_NAME)); - stopButton.putClientProperty("JButton.buttonType", "segmentedTextured"); - stopButton.putClientProperty("JButton.segmentPosition", "middle"); - toolBar.add(stopButton); - - refreshButton = new JButton(); - refreshButton.setAction(actionsMap.get(RefreshWindowsAction.ACTION_NAME)); - refreshButton.putClientProperty("JButton.buttonType", "segmentedTextured"); - refreshButton.putClientProperty("JButton.segmentPosition", "last"); - toolBar.add(refreshButton); - - showDevicesButton = new JButton(); - showDevicesButton.setAction(actionsMap.get(ShowDevicesAction.ACTION_NAME)); - showDevicesButton.putClientProperty("JButton.buttonType", "segmentedTextured"); - showDevicesButton.putClientProperty("JButton.segmentPosition", "first"); - toolBar.add(showDevicesButton); - showDevicesButton.setEnabled(false); - - loadButton = new JButton(); - loadButton.setAction(actionsMap.get(LoadGraphAction.ACTION_NAME)); - loadButton.putClientProperty("JButton.buttonType", "segmentedTextured"); - loadButton.putClientProperty("JButton.segmentPosition", "last"); - toolBar.add(loadButton); - - displayNodeButton = new JButton(); - displayNodeButton.setAction(actionsMap.get(CaptureNodeAction.ACTION_NAME)); - displayNodeButton.putClientProperty("JButton.buttonType", "segmentedTextured"); - 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"); - captureLayersButton.putClientProperty("JButton.segmentPosition", "middle"); - toolBar.add(captureLayersButton); - - invalidateButton = new JButton(); - invalidateButton.setAction(actionsMap.get(InvalidateAction.ACTION_NAME)); - invalidateButton.putClientProperty("JButton.buttonType", "segmentedTextured"); - invalidateButton.putClientProperty("JButton.segmentPosition", "middle"); - toolBar.add(invalidateButton); - - requestLayoutButton = new JButton(); - requestLayoutButton.setAction(actionsMap.get(RequestLayoutAction.ACTION_NAME)); - requestLayoutButton.putClientProperty("JButton.buttonType", "segmentedTextured"); - requestLayoutButton.putClientProperty("JButton.segmentPosition", "last"); - toolBar.add(requestLayoutButton); - - 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(); - - JMenu fileMenu = new JMenu(); - JMenu viewMenu = new JMenu(); - JMenu viewHierarchyMenu = new JMenu(); - JMenu serverMenu = new JMenu(); - - saveMenuItem = new JMenuItem(); - JMenuItem exitMenuItem = new JMenuItem(); - - showDevicesMenuItem = new JMenuItem(); - - loadMenuItem = new JMenuItem(); - - startMenuItem = new JMenuItem(); - stopMenuItem = new JMenuItem(); - - fileMenu.setText("File"); - - saveMenuItem.setAction(actionsMap.get(SaveSceneAction.ACTION_NAME)); - fileMenu.add(saveMenuItem); - - exitMenuItem.setAction(actionsMap.get(ExitAction.ACTION_NAME)); - fileMenu.add(exitMenuItem); - - menuBar.add(fileMenu); - - viewMenu.setText("View"); - - showDevicesMenuItem.setAction(actionsMap.get(ShowDevicesAction.ACTION_NAME)); - showDevicesMenuItem.setEnabled(false); - viewMenu.add(showDevicesMenuItem); - - menuBar.add(viewMenu); - - viewHierarchyMenu.setText("Hierarchy"); - - loadMenuItem.setAction(actionsMap.get(LoadGraphAction.ACTION_NAME)); - viewHierarchyMenu.add(loadMenuItem); - - menuBar.add(viewHierarchyMenu); - - serverMenu.setText("Server"); - - startMenuItem.setAction(actionsMap.get(StartServerAction.ACTION_NAME)); - serverMenu.add(startMenuItem); - - stopMenuItem.setAction(actionsMap.get(StopServerAction.ACTION_NAME)); - serverMenu.add(stopMenuItem); - - menuBar.add(serverMenu); - - return menuBar; - } - - private JComponent buildPixelPerfectPanel() { - JSplitPane splitter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); - - pixelPerfectTree = new JTree(new Object[0]); - pixelPerfectTree.setBorder(null); - pixelPerfectTree.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); - pixelPerfectTree.addTreeSelectionListener(new TreeSelectionListener() { - public void valueChanged(TreeSelectionEvent event) { - ViewNode node = (ViewNode) event.getPath().getLastPathComponent(); - screenViewer.select(node); - } - }); - - JScrollPane scroller = new JScrollPane(pixelPerfectTree); - scroller.setBorder(null); - scroller.getViewport().setBorder(null); - - splitter.setContinuousLayout(true); - splitter.setLeftComponent(scroller); - splitter.setRightComponent(buildPixelPerfectViewer(splitter)); - splitter.setBorder(null); - - if (OS.isMacOsX() && OS.isLeopardOrLater()) { - splitter.setBorder(new UnifiedContentBorder()); - } - - return splitter; - } - - private JComponent buildPixelPerfectViewer(JSplitPane splitter) { - screenViewer = new ScreenViewer(this, currentDevice, splitter.getDividerSize()); - return screenViewer; - } - - private void toggleGraphView() { - showStatusBarComponents(); - - screenViewer.stop(); - mainPanel.remove(pixelPerfectPanel); - mainPanel.add(mainSplitter, BorderLayout.CENTER); - - validate(); - repaint(); - } - - private void showStatusBarComponents() { - viewCountLabel.setVisible(true); - zoomSlider.setVisible(true); - minZoomLabel.setVisible(true); - maxZoomLabel.setVisible(true); - filterLabel.setVisible(true); - filterText.setVisible(true); - } - - private void togglePixelPerfectView() { - if (pixelPerfectPanel == null) { - pixelPerfectPanel = buildPixelPerfectPanel(); - showPixelPerfectTree(); - } else { - screenViewer.start(); - } - - hideStatusBarComponents(); - - mainPanel.remove(mainSplitter); - mainPanel.add(pixelPerfectPanel, BorderLayout.CENTER); - - validate(); - repaint(); - } - - private void zoomSliderStateChanged(ChangeEvent evt) { - JSlider slider = (JSlider) evt.getSource(); - if (sceneView != null) { - scene.setZoomFactor(slider.getValue() / 100.0d); - sceneView.repaint(); - } - } - - private void showProperties(ViewNode node) { - 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; - } - pixelPerfectTree.setModel(new ViewsTreeModel(scene.getRoot())); - pixelPerfectTree.setCellRenderer(new ViewsTreeCellRenderer()); - expandAll(pixelPerfectTree, true); - - } - - private static void expandAll(JTree tree, boolean expand) { - ViewNode root = (ViewNode) tree.getModel().getRoot(); - expandAll(tree, new TreePath(root), expand); - } - - private static void expandAll(JTree tree, TreePath parent, boolean expand) { - // Traverse children - ViewNode node = (ViewNode)parent.getLastPathComponent(); - if (node.children != null) { - for (ViewNode n : node.children) { - TreePath path = parent.pathByAddingChild(n); - expandAll(tree, path, expand); - } - } - - if (expand) { - tree.expandPath(parent); - } else { - tree.collapsePath(parent); - } - } - - private void createGraph(ViewHierarchyScene scene) { - scene.addObjectSceneListener(new SceneFocusListener(), - ObjectSceneEventType.OBJECT_FOCUS_CHANGED); - - if (mainSplitter == null) { - mainPanel.remove(deviceSelector); - mainPanel.add(buildGraphPanel(), BorderLayout.CENTER); - showDevicesButton.setEnabled(true); - showDevicesMenuItem.setEnabled(true); - graphViewButton.setEnabled(true); - pixelPerfectViewButton.setEnabled(true); - - showStatusBarComponents(); - } - - sceneView = scene.createView(); - sceneView.addMouseListener(new NodeClickListener()); - sceneView.addMouseWheelListener(new WheelZoomListener()); - sceneScroller.setViewportView(sceneView); - - if (extrasPanel != null) { - sideSplitter.remove(extrasPanel); - } - sideSplitter.setBottomComponent(buildExtrasPanel()); - - mainSplitter.setDividerLocation(getWidth() - mainSplitter.getDividerSize() - - buttonsPanel.getPreferredSize().width); - - captureLayersButton.setEnabled(true); - saveMenuItem.setEnabled(true); - showPixelPerfectTree(); - - updateStatus(); - layoutScene(); - } - - private void layoutScene() { - TreeGraphLayout<ViewNode, String> layout = - new TreeGraphLayout<ViewNode, String>(scene, 50, 50, 70, 30, true); - layout.layout(scene.getRoot()); - } - - private void updateStatus() { - viewCountLabel.setText("" + scene.getNodes().size() + " views"); - zoomSlider.setEnabled(scene.getNodes().size() > 0); - } - - private JPanel buildExtrasPanel() { - extrasPanel = new JPanel(new BorderLayout()); - JScrollPane p = new JScrollPane(layoutView = new LayoutRenderer(scene, sceneView)); - JScrollBar b = p.getVerticalScrollBar(); - b.setUnitIncrement(10); - extrasPanel.add(p); - extrasPanel.add(scene.createSatelliteView(), BorderLayout.SOUTH); - extrasPanel.add(buildLayoutViewControlButtons(), BorderLayout.NORTH); - return extrasPanel; - } - - private JComponent buildLayoutViewControlButtons() { - buttonsPanel = new JToolBar(); - buttonsPanel.setFloatable(false); - - ButtonGroup group = new ButtonGroup(); - - JToggleButton white = new JToggleButton("On White"); - toggleColorOnSelect(white); - white.putClientProperty("JButton.buttonType", "segmentedTextured"); - white.putClientProperty("JButton.segmentPosition", "first"); - white.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - layoutView.setBackground(Color.WHITE); - layoutView.setForeground(Color.BLACK); - } - }); - group.add(white); - buttonsPanel.add(white); - - JToggleButton black = new JToggleButton("On Black"); - toggleColorOnSelect(black); - black.putClientProperty("JButton.buttonType", "segmentedTextured"); - black.putClientProperty("JButton.segmentPosition", "last"); - black.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - layoutView.setBackground(Color.BLACK); - layoutView.setForeground(Color.WHITE); - } - }); - group.add(black); - buttonsPanel.add(black); - - black.setSelected(true); - - JCheckBox showExtras = new JCheckBox("Show Extras"); - showExtras.putClientProperty("JComponent.sizeVariant", "small"); - showExtras.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - layoutView.setShowExtras(((JCheckBox) e.getSource()).isSelected()); - } - }); - buttonsPanel.add(showExtras); - - return buttonsPanel; - } - - private void showCaptureWindow(ViewNode node, String captureParams, Image image) { - if (image != null) { - layoutView.repaint(); - - JFrame frame = new JFrame(captureParams); - JPanel panel = new JPanel(new BorderLayout()); - - final CaptureRenderer label = new CaptureRenderer(new ImageIcon(image), node); - label.setBorder(BorderFactory.createEmptyBorder(24, 24, 24, 24)); - - final JPanel solidColor = new JPanel(new BorderLayout()); - solidColor.setBackground(Color.BLACK); - solidColor.add(label); - - JToolBar toolBar = new JToolBar(); - toolBar.setFloatable(false); - - ButtonGroup group = new ButtonGroup(); - - JToggleButton white = new JToggleButton("On White"); - toggleColorOnSelect(white); - white.putClientProperty("JButton.buttonType", "segmentedTextured"); - white.putClientProperty("JButton.segmentPosition", "first"); - white.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - solidColor.setBackground(Color.WHITE); - } - }); - group.add(white); - toolBar.add(white); - - JToggleButton black = new JToggleButton("On Black"); - toggleColorOnSelect(black); - black.putClientProperty("JButton.buttonType", "segmentedTextured"); - black.putClientProperty("JButton.segmentPosition", "last"); - black.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - solidColor.setBackground(Color.BLACK); - } - }); - group.add(black); - toolBar.add(black); - - black.setSelected(true); - - JCheckBox showExtras = new JCheckBox("Show Extras"); - showExtras.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - label.setShowExtras(((JCheckBox) e.getSource()).isSelected()); - } - }); - toolBar.add(showExtras); - - panel.add(toolBar, BorderLayout.NORTH); - panel.add(solidColor); - frame.add(panel); - - frame.pack(); - frame.setResizable(false); - frame.setLocationRelativeTo(Workspace.this); - frame.setVisible(true); - } - } - - private void reset() { - currentDevice = null; - currentWindow = null; - currentDeviceChanged(); - windowsTableModel.setVisible(false); - windowsTableModel.clear(); - - showDevicesSelector(); - } - - public void showDevicesSelector() { - if (mainSplitter != null) { - if (pixelPerfectPanel != null) { - screenViewer.start(); - } - mainPanel.remove(graphViewButton.isSelected() ? mainSplitter : pixelPerfectPanel); - mainPanel.add(deviceSelector, BorderLayout.CENTER); - pixelPerfectPanel = mainSplitter = null; - graphViewButton.setSelected(true); - - hideStatusBarComponents(); - - saveMenuItem.setEnabled(false); - showDevicesMenuItem.setEnabled(false); - showDevicesButton.setEnabled(false); - displayNodeButton.setEnabled(false); - captureLayersButton.setEnabled(false); - invalidateButton.setEnabled(false); - dumpDisplayListButton.setEnabled(false); - requestLayoutButton.setEnabled(false); - graphViewButton.setEnabled(false); - pixelPerfectViewButton.setEnabled(false); - - if (currentDevice != null) { - if (!DeviceBridge.isViewServerRunning(currentDevice)) { - DeviceBridge.startViewServer(currentDevice); - } - loadWindows().execute(); - windowsTableModel.setVisible(true); - } - - validate(); - repaint(); - } - } - - private void currentDeviceChanged() { - if (currentDevice == null) { - startButton.setEnabled(false); - startMenuItem.setEnabled(false); - stopButton.setEnabled(false); - stopMenuItem.setEnabled(false); - refreshButton.setEnabled(false); - saveMenuItem.setEnabled(false); - loadButton.setEnabled(false); - displayNodeButton.setEnabled(false); - captureLayersButton.setEnabled(false); - invalidateButton.setEnabled(false); - dumpDisplayListButton.setEnabled(false); - graphViewButton.setEnabled(false); - pixelPerfectViewButton.setEnabled(false); - requestLayoutButton.setEnabled(false); - loadMenuItem.setEnabled(false); - } else { - loadMenuItem.setEnabled(true); - checkForServerOnCurrentDevice(); - } - } - - private void checkForServerOnCurrentDevice() { - if (DeviceBridge.isViewServerRunning(currentDevice)) { - startButton.setEnabled(false); - startMenuItem.setEnabled(false); - stopButton.setEnabled(true); - stopMenuItem.setEnabled(true); - loadButton.setEnabled(true); - refreshButton.setEnabled(true); - } else { - startButton.setEnabled(true); - startMenuItem.setEnabled(true); - stopButton.setEnabled(false); - stopMenuItem.setEnabled(false); - loadButton.setEnabled(false); - refreshButton.setEnabled(false); - } - } - - public void cleanupDevices() { - for (IDevice device : devicesTableModel.getDevices()) { - DeviceBridge.removeDeviceForward(device); - } - } - - private static void toggleColorOnSelect(JToggleButton button) { - if (!OS.isMacOsX() || !OS.isLeopardOrLater()) { - return; - } - - button.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent event) { - JToggleButton button = (JToggleButton) event.getSource(); - if (button.isSelected()) { - button.setForeground(Color.WHITE); - } else { - button.setForeground(Color.BLACK); - } - } - }); - } - - private void updateFilter(DocumentEvent e) { - final Document document = e.getDocument(); - try { - updateFilteredNodes(document.getText(0, document.getLength())); - } catch (BadLocationException e1) { - e1.printStackTrace(); - } - } - - private void updateFilteredNodes(String filterText) { - final ViewNode root = scene.getRoot(); - try { - final Pattern pattern = Pattern.compile(filterText, Pattern.CASE_INSENSITIVE); - filterNodes(pattern, root); - } catch (PatternSyntaxException e) { - filterNodes(null, root); - } - repaint(); - } - - private void filterNodes(Pattern pattern, ViewNode root) { - root.filter(pattern); - - for (ViewNode node : root.children) { - filterNodes(pattern, node); - } - } - - public void beginTask() { - progress.setVisible(true); - } - - public void endTask() { - progress.setVisible(false); - } - - public SwingWorker<?, ?> showNodeCapture() { - if (scene.getFocusedObject() == null) { - return null; - } - 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()); - int choice = chooser.showSaveDialog(sceneView); - if (choice == JFileChooser.APPROVE_OPTION) { - return new CaptureLayersTask(chooser.getSelectedFile()); - } else { - return null; - } - } - - public SwingWorker<?, ?> startServer() { - return new StartServerTask(); - } - - public SwingWorker<?, ?> stopServer() { - return new StopServerTask(); - } - - public SwingWorker<?, ?> loadWindows() { - return new LoadWindowsTask(); - } - - public SwingWorker<?, ?> loadGraph() { - return new LoadGraphTask(); - } - - public SwingWorker<?, ?> invalidateView() { - if (scene.getFocusedObject() == null) { - return null; - } - return new InvalidateTask(); - } - - public SwingWorker<?, ?> requestLayout() { - if (scene.getFocusedObject() == null) { - return null; - } - return new RequestLayoutTask(); - } - - public SwingWorker<?, ?> saveSceneAsImage() { - JFileChooser chooser = new JFileChooser(); - chooser.setFileFilter(new PngFileFilter()); - int choice = chooser.showSaveDialog(sceneView); - if (choice == JFileChooser.APPROVE_OPTION) { - return new SaveSceneTask(chooser.getSelectedFile()); - } else { - return null; - } - } - - private class InvalidateTask extends SwingWorker<Object, Void> { - private String captureParams; - - private InvalidateTask() { - captureParams = scene.getFocusedObject().toString(); - beginTask(); - } - - @Override - @WorkerThread - protected Object doInBackground() throws Exception { - ViewManager.invalidate(currentDevice, currentWindow, captureParams); - return null; - } - - @Override - protected void done() { - endTask(); - } - } - - 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; - - private RequestLayoutTask() { - captureParams = scene.getFocusedObject().toString(); - beginTask(); - } - - @Override - @WorkerThread - protected Object doInBackground() throws Exception { - ViewManager.requestLayout(currentDevice, currentWindow, captureParams); - return null; - } - - @Override - protected void done() { - endTask(); - } - } - - private class CaptureLayersTask extends SwingWorker<Boolean, Void> { - private File file; - - private CaptureLayersTask(File file) { - this.file = file; - beginTask(); - } - - @Override - @WorkerThread - protected Boolean doInBackground() throws Exception { - return CaptureLoader.saveLayers(currentDevice, currentWindow, file); - } - - @Override - protected void done() { - endTask(); - } - } - - private class CaptureNodeTask extends SwingWorker<Image, Void> { - private String captureParams; - private ViewNode node; - - private CaptureNodeTask() { - node = (ViewNode) scene.getFocusedObject(); - captureParams = node.toString(); - beginTask(); - } - - @Override - @WorkerThread - protected Image doInBackground() throws Exception { - node.image = CaptureLoader.loadCapture(currentDevice, currentWindow, captureParams); - return node.image; - } - - @Override - protected void done() { - try { - Image image = get(); - showCaptureWindow(node, captureParams, image); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } finally { - endTask(); - } - } - } - - static class WindowsResult { - Window[] windows; - int serverVersion; - int protocolVersion; - } - - private class LoadWindowsTask extends SwingWorker<WindowsResult, Void> { - private LoadWindowsTask() { - beginTask(); - } - - @Override - @WorkerThread - protected WindowsResult doInBackground() throws Exception { - WindowsResult r = new WindowsResult(); - r.protocolVersion = VersionLoader.loadProtocolVersion(currentDevice); - r.serverVersion = VersionLoader.loadServerVersion(currentDevice); - r.windows = WindowsLoader.loadWindows(currentDevice, - r.protocolVersion, r.serverVersion); - return r; - } - - @Override - protected void done() { - try { - WindowsResult result = get(); - protocolVersion = result.protocolVersion; - serverVersion = result.serverVersion; - setupProtocolDependentToolbar(); - windowsTableModel.clear(); - windowsTableModel.addWindows(result.windows); - } catch (ExecutionException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - endTask(); - } - } - } - - private class StartServerTask extends SwingWorker<Object, Void> { - public StartServerTask() { - beginTask(); - } - - @Override - @WorkerThread - protected Object doInBackground() { - DeviceBridge.startViewServer(currentDevice); - return null; - } - - @Override - protected void done() { - new LoadWindowsTask().execute(); - windowsTableModel.setVisible(true); - checkForServerOnCurrentDevice(); - endTask(); - } - } - - private class StopServerTask extends SwingWorker<Object, Void> { - public StopServerTask() { - beginTask(); - } - - @Override - @WorkerThread - protected Object doInBackground() { - DeviceBridge.stopViewServer(currentDevice); - return null; - } - - @Override - protected void done() { - windowsTableModel.setVisible(false); - windowsTableModel.clear(); - checkForServerOnCurrentDevice(); - endTask(); - } - } - - private class LoadGraphTask extends SwingWorker<double[], Void> { - public LoadGraphTask() { - beginTask(); - } - - @Override - @WorkerThread - protected double[] doInBackground() { - scene = ViewHierarchyLoader.loadScene(currentDevice, currentWindow); - return ProfilesLoader.loadProfiles(currentDevice, currentWindow, - scene.getRoot().toString()); - } - - @Override - protected void done() { - try { - createGraph(scene); - updateProfiles(get()); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } finally { - endTask(); - } - } - } - - private class SaveSceneTask extends SwingWorker<Object, Void> { - private File file; - - private SaveSceneTask(File file) { - this.file = file; - beginTask(); - } - - @Override - @WorkerThread - protected Object doInBackground() { - if (sceneView == null) { - return null; - } - - try { - BufferedImage image = new BufferedImage(sceneView.getWidth(), - sceneView.getHeight(), BufferedImage.TYPE_INT_RGB); - Graphics2D g2 = image.createGraphics(); - sceneView.paint(g2); - g2.dispose(); - ImageIO.write(image, "PNG", file); - } catch (IOException ex) { - ex.printStackTrace(); - } - return null; - } - - @Override - protected void done() { - endTask(); - } - } - - private class SceneFocusListener implements ObjectSceneListener { - - public void objectAdded(ObjectSceneEvent arg0, Object arg1) { - } - - public void objectRemoved(ObjectSceneEvent arg0, Object arg1) { - } - - public void objectStateChanged(ObjectSceneEvent arg0, Object arg1, - ObjectState arg2, ObjectState arg3) { - } - - public void selectionChanged(ObjectSceneEvent e, Set<Object> previousSelection, - Set<Object> newSelection) { - } - - public void highlightingChanged(ObjectSceneEvent arg0, Set<Object> arg1, Set<Object> arg2) { - } - - public void hoverChanged(ObjectSceneEvent arg0, Object arg1, Object arg2) { - } - - 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>(); - selection.add(newFocus); - scene.setSelectedObjects(selection); - - showProperties((ViewNode) newFocus); - layoutView.repaint(); - } - } - - private class NodeClickListener extends MouseAdapter { - @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) { - showNodeCapture().execute(); - } - } - } - - private class WheelZoomListener implements MouseWheelListener { - public void mouseWheelMoved(MouseWheelEvent e) { - if (zoomSlider != null) { - int val = zoomSlider.getValue(); - val -= e.getWheelRotation() * 10; - zoomSlider.setValue(val); - } - } - } - private class DevicesTableModel extends DefaultTableModel implements - AndroidDebugBridge.IDeviceChangeListener { - - private ArrayList<IDevice> devices; - - private DevicesTableModel() { - devices = new ArrayList<IDevice>(); - } - - @Override - public int getColumnCount() { - return 1; - } - - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - - @Override - public Object getValueAt(int row, int column) { - return devices.get(row); - } - - @Override - public String getColumnName(int column) { - return "Devices"; - } - - @WorkerThread - public void deviceConnected(final IDevice device) { - DeviceBridge.setupDeviceForward(device); - - SwingUtilities.invokeLater(new Runnable() { - public void run() { - addDevice(device); - } - }); - } - - @WorkerThread - public void deviceDisconnected(final IDevice device) { - DeviceBridge.removeDeviceForward(device); - - SwingUtilities.invokeLater(new Runnable() { - public void run() { - removeDevice(device); - } - }); - } - - public void addDevice(IDevice device) { - if (!devices.contains(device)) { - devices.add(device); - fireTableDataChanged(); - } - } - - public void removeDevice(IDevice device) { - if (device.equals(currentDevice)) { - reset(); - } - - if (devices.contains(device)) { - devices.remove(device); - fireTableDataChanged(); - } - } - - @WorkerThread - public void deviceChanged(IDevice device, int changeMask) { - if ((changeMask & IDevice.CHANGE_STATE) != 0 && - device.isOnline()) { - // if the device state changed and it's now online, we set up its port forwarding. - DeviceBridge.setupDeviceForward(device); - } else if (device == currentDevice && (changeMask & IDevice.CHANGE_CLIENT_LIST) != 0) { - // if the changed device is the current one and the client list changed, we update - // the UI. - loadWindows().execute(); - windowsTableModel.setVisible(true); - } - } - - @Override - public int getRowCount() { - return devices == null ? 0 : devices.size(); - } - - public IDevice getDevice(int index) { - return index < devices.size() ? devices.get(index) : null; - } - - public IDevice[] getDevices() { - return devices.toArray(new IDevice[devices.size()]); - } - } - - private static class WindowsTableModel extends DefaultTableModel { - private ArrayList<Window> windows; - private boolean visible; - - private WindowsTableModel() { - windows = new ArrayList<Window>(); - windows.add(Window.FOCUSED_WINDOW); - } - - @Override - public int getColumnCount() { - return 1; - } - - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - - @Override - public String getColumnName(int column) { - return "Windows"; - } - - @Override - public Object getValueAt(int row, int column) { - return windows.get(row); - } - - @Override - public int getRowCount() { - return !visible || windows == null ? 0 : windows.size(); - } - - public void setVisible(boolean visible) { - this.visible = visible; - fireTableDataChanged(); - } - - public void addWindow(Window window) { - windows.add(window); - fireTableDataChanged(); - } - - public void addWindows(Window[] windowsList) { - //noinspection ManualArrayToCollectionCopy - for (Window window : windowsList) { - windows.add(window); - } - fireTableDataChanged(); - } - - public void clear() { - windows.clear(); - windows.add(Window.FOCUSED_WINDOW); - } - - public Window getWindow(int index) { - return windows.get(index); - } - } - - private class DeviceSelectedListener implements ListSelectionListener { - public void valueChanged(ListSelectionEvent event) { - if (event.getValueIsAdjusting()) { - return; - } - - int row = devices.getSelectedRow(); - if (row >= 0) { - currentDevice = devicesTableModel.getDevice(row); - currentDeviceChanged(); - if (currentDevice != null) { - if (!DeviceBridge.isViewServerRunning(currentDevice)) { - DeviceBridge.startViewServer(currentDevice); - checkForServerOnCurrentDevice(); - } - loadWindows().execute(); - windowsTableModel.setVisible(true); - } - } else { - currentDevice = null; - currentDeviceChanged(); - windowsTableModel.setVisible(false); - windowsTableModel.clear(); - } - } - } - - private class WindowSelectedListener implements ListSelectionListener { - public void valueChanged(ListSelectionEvent event) { - if (event.getValueIsAdjusting()) { - return; - } - - int row = windows.getSelectedRow(); - if (row >= 0) { - currentWindow = windowsTableModel.getWindow(row); - } else { - currentWindow = Window.FOCUSED_WINDOW; - } - } - } - - private static class ViewsTreeCellRenderer extends DefaultTreeCellRenderer { - public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, - boolean expanded, boolean leaf, int row, boolean hasFocus) { - - final String name = ((ViewNode) value).name; - value = name.substring(name.lastIndexOf('.') + 1, name.lastIndexOf('@')); - return super.getTreeCellRendererComponent(tree, value, selected, expanded, - leaf, row, hasFocus); - } - } -} |