/* * * * Copyright 1990-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program 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 program 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 at /legal/license.txt). * * 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 or visit www.sun.com if you need additional * information or have any questions. */ package view; import javax.swing.*; import javax.swing.table.*; import java.net.*; import java.awt.*; import java.awt.event.*; import com.sun.cldchi.tools.memoryprofiler.data.JavaObject; import com.sun.cldchi.tools.memoryprofiler.data.MPDataProvider; import javax.swing.table.*; import javax.swing.event.*; public class ViewObjectsPanel extends JPanel { private JLabel address_label = new JLabel("address"); private JTextField address_field = new JTextField(); private JLabel type_label = new JLabel("type"); private JTextField type_field = new JTextField(); private JTable references = new ObjectListTable(new ObjectListTableModel()); private JTable referees = new ObjectListTable(new ObjectListTableModel()); private JavaObject _obj = null; private MPDataProvider _provider; private JButton _root_path; private JList _object_list; private JButton _stack_location; private Object[] _objects; public ViewObjectsPanel(MPDataProvider provider) { _provider = provider; } public void initUI(boolean add_show_root_path_button) { setLayout(new GridBagLayout()); JPanel top_panel = new JPanel(); top_panel.add(address_label); top_panel.add(address_field); address_field.setEditable(false); type_field.setEditable(false); address_field.setPreferredSize(new Dimension(80, 20)); type_field.setPreferredSize(new Dimension(120, 20)); top_panel.add(type_label); top_panel.add(type_field); if (add_show_root_path_button) { _root_path = new JButton("Show path from the root") { public Dimension getPreferredSize() { return new Dimension(160, 20); } }; _root_path.addActionListener(new ShowRootPathListener()); _root_path.setFont(_root_path.getFont().deriveFont(9.0f)); _root_path.setEnabled(false); top_panel.add(_root_path); } else { //this is show path from the root object _stack_location = new JButton("Show stack trace") { public Dimension getPreferredSize() { return new Dimension(160, 20); } }; _stack_location.addActionListener(new ShowStackTraceListener()); _stack_location.setFont(_stack_location.getFont().deriveFont(9.0f)); _stack_location.setEnabled(false); top_panel.add(_stack_location); } add(top_panel, new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); JPanel bottom_panel = new JPanel(); JScrollPane pane = new JScrollPane() { public Dimension getPreferredSize() {return new Dimension(100, 220);} }; _object_list = new JList(); _object_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); _object_list.addListSelectionListener(new ObjectListSelectionListener()); pane.getViewport().setView(_object_list); bottom_panel.setLayout(new GridBagLayout()); bottom_panel.add(pane, new GridBagConstraints(0, 0, 1, 2, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); bottom_panel.add(new JLabel("Referees"), new GridBagConstraints(1, 0, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); bottom_panel.add(new JLabel("References"), new GridBagConstraints(2, 0, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); pane = new JScrollPane() { public Dimension getPreferredSize() { return new Dimension(220, 200); } }; pane.getViewport().setView(referees); bottom_panel.add(pane, new GridBagConstraints(1, 1, 1, 1, 1, 21, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); pane = new JScrollPane() { public Dimension getPreferredSize() { return new Dimension(220, 200); } }; pane.getViewport().setView(references); bottom_panel.add(pane, new GridBagConstraints(2, 1, 1, 1, 1, 21, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); add(bottom_panel, new GridBagConstraints(0, 1, 1, 1, 1, 20, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); } private void setObject(JavaObject obj) { _obj = obj; ObjectListTableModel refs = (ObjectListTableModel)references.getModel(); ObjectListTableModel refes = (ObjectListTableModel)referees.getModel(); if (obj != null) { address_field.setText(obj.toString()); type_field.setText(_provider.getObjectTypeName(obj)); refs.setData(obj.get_references()); refes.setData(obj.get_referees()); if (_root_path != null) { _root_path.setEnabled(obj.getRootDistance() != -1); } if (_stack_location != null) { _stack_location.setEnabled(obj.object_type == MPDataProvider.STACK_OBJECT); } } else { address_field.setText(""); type_field.setText(""); refs.setData(null); refes.setData(null); if (_root_path != null) { _root_path.setEnabled(false); } } refs.fireTableDataChanged(); refes.fireTableDataChanged(); } public void setObjects(Object[] objects) { _object_list.setListData(objects); _objects = objects; repaint(); } class ObjectListTableModel extends AbstractTableModel { private Object[] _data; public void setData(Object[] data) { _data = data; } public int getColumnCount() {return 2;} public Object getValueAt(int row, int col) { if (_data == null) return "y"; if (row >= _data.length) return "z"; if (col == 0) { return _data[row].toString(); } else if (col == 1) { return _provider.getObjectTypeName((JavaObject)_data[row]); } else { throw new RuntimeException(); } } public int getRowCount() { if (_data == null) { return 0; } else { return _data.length; } } public String getColumnName(int i) { if (i == 0) { return "address"; } else if (i == 1) { return "type"; } else { throw new RuntimeException("Should not reach here!"); } } } class ObjectListTable extends JTable { public ObjectListTable(TableModel model) {super(model);} public String getToolTipText(MouseEvent e) { int row = rowAtPoint(e.getPoint()); int col = columnAtPoint(e.getPoint()); return (String)getModel().getValueAt(row, col); } } class ShowRootPathListener implements ActionListener { public void actionPerformed(ActionEvent e) { Object[] objs = _provider.pathFromTheRoot(_obj); ViewRootPathDialog.showDialog(ViewObjectsPanel.this, objs, "Path from the Root", _provider); } } class ObjectListSelectionListener implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { JavaObject item = (JavaObject)_object_list.getSelectedValue(); setObject(item); } } class ShowStackTraceListener implements ActionListener { public void actionPerformed(ActionEvent e) { for (int i = 0; i < _objects.length-1; i++) { if (_objects[i] == _obj) { int ptr = ((JavaObject)_objects[i+1]).address; String stackTrace = null; try { stackTrace = _provider.getStackTrace((JavaObject)_objects[i], ptr); } catch (SocketException ex) { //IMPL_NOTE: need to handle it } JOptionPane.showMessageDialog(null, stackTrace, "Object location StackTrace", JOptionPane.PLAIN_MESSAGE); } } } } }