diff agent/src/share/classes/sun/jvm/hotspot/ui/ObjectHistogramPanel.java @ 0:a61af66fc99e jdk7-b24

Initial load
author duke
date Sat, 01 Dec 2007 00:00:00 +0000
parents
children c18cbe5936b8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/agent/src/share/classes/sun/jvm/hotspot/ui/ObjectHistogramPanel.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,345 @@
+/*
+ * Copyright 2000-2002 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+package sun.jvm.hotspot.ui;
+
+import java.util.*;
+
+import java.awt.*;
+import java.awt.event.*;
+
+import javax.swing.*;
+import javax.swing.table.*;
+
+import sun.jvm.hotspot.oops.ObjectHistogram;
+import sun.jvm.hotspot.oops.ObjectHistogramElement;
+import sun.jvm.hotspot.oops.Klass;
+
+import sun.jvm.hotspot.ui.table.LongCellRenderer;
+import sun.jvm.hotspot.ui.table.SortableTableModel;
+import sun.jvm.hotspot.ui.table.SortHeaderCellRenderer;
+import sun.jvm.hotspot.ui.table.SortHeaderMouseAdapter;
+import sun.jvm.hotspot.ui.table.TableModelComparator;
+
+import sun.jvm.hotspot.ui.action.*;
+
+import com.sun.java.swing.ui.StatusBar;
+import com.sun.java.swing.ui.CommonToolBar;
+
+import com.sun.java.swing.action.ActionManager;
+import com.sun.java.swing.action.DelegateAction;
+
+/**
+ * Displays the results of an ObjectHistogram run in a JTable, with a
+ * button to display all objects of that type
+ */
+public class ObjectHistogramPanel extends JPanel implements ActionListener {
+    private ObjectHistogramTableModel dataModel;
+    private ObjectHistogramToolBar toolbar;
+    private StatusBar statusBar;
+    private JTable     table;
+    private java.util.List listeners;
+
+    public ObjectHistogramPanel(ObjectHistogram histo) {
+        dataModel = new ObjectHistogramTableModel(histo);
+        statusBar = new StatusBar();
+
+        table = new JTable(dataModel, new ObjectHistogramColummModel());
+        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+        table.addMouseListener(new MouseAdapter() {
+                public void mouseClicked(MouseEvent evt) {
+                    if (evt.getClickCount() == 2) {
+                        fireShowObjectsOfType();
+                    }
+                }
+            });
+
+        JTableHeader header = table.getTableHeader();
+        header.setDefaultRenderer(new SortHeaderCellRenderer(header, dataModel));
+        header.addMouseListener(new SortHeaderMouseAdapter(table, dataModel));
+
+        setLayout(new BorderLayout());
+
+        toolbar = new ObjectHistogramToolBar(statusBar);
+        add(toolbar, BorderLayout.NORTH);
+        add(new JScrollPane(table), BorderLayout.CENTER);
+        add(statusBar, BorderLayout.SOUTH);
+
+        registerActions();
+    }
+
+    private class ObjectHistogramToolBar extends CommonToolBar {
+
+        private JTextField searchTF;
+
+        public ObjectHistogramToolBar(StatusBar status) {
+            super(HSDBActionManager.getInstance(), status);
+        }
+
+        protected void addComponents() {
+            searchTF = new JTextField();
+            searchTF.setToolTipText("Find in Class Description");
+
+            // Pressing Enter on the text field will search
+            InputMap im = searchTF.getInputMap();
+            im.put(KeyStroke.getKeyStroke("ENTER"), "enterPressed");
+            ActionMap am = searchTF.getActionMap();
+            am.put("enterPressed", manager.getAction(FindAction.VALUE_COMMAND));
+
+            add(searchTF);
+            addButton(manager.getAction(FindAction.VALUE_COMMAND));
+            addButton(manager.getAction(ShowAction.VALUE_COMMAND));
+        }
+
+        public String getFindText() {
+            return searchTF.getText();
+        }
+    }
+
+    private class ObjectHistogramColummModel extends DefaultTableColumnModel {
+        private final String LABEL_SIZE = "Size";
+        private final String LABEL_COUNT = "Count";
+        private final String LABEL_DESC = "Class Description";
+
+
+        public ObjectHistogramColummModel() {
+            // Should actually get the line metrics for
+            int PREF_WIDTH = 80;
+            int MAX_WIDTH = 100;
+            int HUGE_WIDTH = 140;
+
+            LongCellRenderer lcRender = new LongCellRenderer();
+
+            TableColumn column;
+
+            // Size
+            column = new TableColumn(0, PREF_WIDTH);
+            column.setHeaderValue(LABEL_SIZE);
+            column.setMaxWidth(MAX_WIDTH);
+            column.setResizable(false);
+            column.setCellRenderer(lcRender);
+            addColumn(column);
+
+            // Count
+            column = new TableColumn(1, PREF_WIDTH);
+            column.setHeaderValue(LABEL_COUNT);
+            column.setMaxWidth(MAX_WIDTH);
+            column.setResizable(false);
+            column.setCellRenderer(lcRender);
+            addColumn(column);
+
+            // Description
+            column = new TableColumn(2, HUGE_WIDTH);
+            column.setHeaderValue(LABEL_DESC);
+            addColumn(column);
+        }
+    }
+
+
+    /**
+     * A table model which encapsulates the ObjectHistogram
+     */
+    private class ObjectHistogramTableModel extends SortableTableModel {
+        private String[] columnNames = { "Size", "Count", "Class Description" };
+        private Class[] columnClasses = { Long.class, Long.class, String.class };
+
+        public ObjectHistogramTableModel(ObjectHistogram histo) {
+            // Set the rows
+            elements = histo.getElements();
+            setComparator(new ObjectHistogramComparator(this));
+
+        }
+
+        public int getColumnCount() {
+            return columnNames.length;
+        }
+
+        public int getRowCount() {
+            return elements.size();
+        }
+
+        public String getColumnName(int col) {
+            return columnNames[col];
+        }
+
+        public Class getColumnClass(int col) {
+            return columnClasses[col];
+        }
+
+        public Object getValueAt(int row, int col) {
+            return getValueForColumn(getElement(row), col);
+        }
+
+        public Object getValueForColumn(Object obj, int col) {
+            ObjectHistogramElement el = (ObjectHistogramElement)obj;
+            switch (col) {
+            case 0:
+                return new Long(el.getSize());
+            case 1:
+                return new Long(el.getCount());
+            case 2:
+                return el.getDescription();
+            default:
+                throw new RuntimeException("Index (" + col + ") out of bounds");
+            }
+        }
+
+        public ObjectHistogramElement getElement(int index) {
+            return (ObjectHistogramElement) elements.get(index);
+        }
+
+        private class ObjectHistogramComparator extends TableModelComparator {
+
+            public ObjectHistogramComparator(ObjectHistogramTableModel model) {
+                super(model);
+            }
+
+            /**
+             * Returns the value for the comparing object for the
+             * column.
+             *
+             * @param obj Object that was passed for Comparator
+             * @param column the column to retrieve
+             */
+            public Object getValueForColumn(Object obj, int column) {
+                ObjectHistogramTableModel omodel = (ObjectHistogramTableModel)model;
+                return omodel.getValueForColumn(obj, column);
+            }
+        }
+
+    }
+
+
+    //
+    // ActionListener implementation and actions support
+    //
+
+    public void actionPerformed(ActionEvent evt) {
+        String command = evt.getActionCommand();
+
+        if (command.equals(ShowAction.VALUE_COMMAND)) {
+            fireShowObjectsOfType();
+        } else if (command.equals(FindAction.VALUE_COMMAND)) {
+            findObject();
+        }
+
+    }
+
+    protected void registerActions() {
+        registerAction(FindAction.VALUE_COMMAND);
+        registerAction(ShowAction.VALUE_COMMAND);
+    }
+
+    private void registerAction(String actionName) {
+        ActionManager manager = ActionManager.getInstance();
+        DelegateAction action = manager.getDelegateAction(actionName);
+        action.addActionListener(this);
+    }
+
+    public interface Listener {
+        public void showObjectsOfType(Klass type);
+    }
+
+    public void addPanelListener(Listener listener) {
+        if (listeners == null) {
+            listeners = new ArrayList();
+        }
+        listeners.add(listener);
+    }
+
+    public void removePanelListener(Listener listener) {
+        if (listeners != null) {
+            listeners.remove(listener);
+        }
+    }
+
+    //--------------------------------------------------------------------------------
+    // Internals only below this point
+    //
+
+    /**
+     * Find and select the row that contains the text in the find field starting
+     * from the current selected row.
+     *
+     * Uses a linear search from the current row. Could be optimized withing the
+     * model and internal representation.
+     */
+    private void findObject() {
+        String findText = toolbar.getFindText();
+
+        if (findText == null || findText.equals("")) {
+            return;
+        }
+
+        TableModel model = table.getModel();
+
+        int row = table.getSelectedRow();
+        if (row == model.getRowCount()) {
+            row = 0;
+        } else {
+            // Start at the row after the selected row.
+            row++;
+        }
+
+        String value;
+        for (int i = row; i < model.getRowCount(); i++) {
+            value = (String)model.getValueAt(i, 2);
+            if (value != null && value.startsWith(findText)) {
+                table.setRowSelectionInterval(i, i);
+                Rectangle cellBounds = table.getCellRect(i, 0, true);
+                table.scrollRectToVisible(cellBounds);
+                return;
+            }
+        }
+
+        // Wrap the table to search in the top rows.
+        for (int i = 0; i < row; i++) {
+            value = (String)model.getValueAt(i, 2);
+            if (value != null && value.startsWith(findText)) {
+                table.setRowSelectionInterval(i, i);
+                Rectangle cellBounds = table.getCellRect(i, 0, true);
+                table.scrollRectToVisible(cellBounds);
+                return;
+            }
+        }
+    }
+
+    private void fireShowObjectsOfType() {
+        int i = table.getSelectedRow();
+        if (i < 0) {
+            return;
+        }
+
+        ObjectHistogramElement el = dataModel.getElement(i);
+
+        for (Iterator iter = listeners.iterator(); iter.hasNext(); ) {
+            Listener listener = (Listener) iter.next();
+            listener.showObjectsOfType(el.getKlass());
+        }
+    }
+
+    public static void main(String[] args) {
+
+    }
+}