Mercurial > hg > truffle
diff agent/src/share/classes/sun/jvm/hotspot/ui/ProcessListPanel.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/ProcessListPanel.java Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,232 @@ +/* + * Copyright 2001 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.awt.*; +import java.awt.event.*; +import java.util.*; +import javax.swing.*; +import javax.swing.event.*; +import javax.swing.table.*; + +import sun.jvm.hotspot.debugger.*; + +public class ProcessListPanel extends JPanel { + private Debugger dbg; + private AbstractTableModel dataModel; + private java.util.List els; + private boolean sortByName = true; + private boolean sortReversed = false; + private javax.swing.Timer timer; + private JTable table; + + /** Takes a Debugger in constructor. Updates the list once during + construction; list can be updated automatically by "starting" + the panel. */ + public ProcessListPanel(Debugger dbg) { + super(); + + this.dbg = dbg; + + update(); + + dataModel = new AbstractTableModel() { + public int getColumnCount() { return 2; } + public int getRowCount() { return els.size(); } + public String getColumnName(int col) { + switch (col) { + case 0: + return "Process Name"; + case 1: + return "Process ID"; + default: + throw new RuntimeException("Index " + col + " out of bounds"); + } + } + + public Object getValueAt(int row, int col) { + ProcessInfo info = (ProcessInfo) els.get(row); + + switch (col) { + case 0: + return info.getName(); + case 1: + return new Integer(info.getPid()); + default: + throw new RuntimeException("Index (" + col + ", " + row + ") out of bounds"); + } + } + }; + + // Create user interface + setLayout(new BorderLayout()); + table = new JTable(dataModel); + table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + JTableHeader header = table.getTableHeader(); + header.setReorderingAllowed(false); + table.setRowSelectionAllowed(true); + table.setColumnSelectionAllowed(false); + // Provide sorting in similar fashion to Task Manager + header.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + int viewColumn = table.getColumnModel().getColumnIndexAtX(e.getX()); + int column = table.convertColumnIndexToModel(viewColumn); + if (column != -1) { + boolean newSortByName = (column == 0); + if (newSortByName == sortByName) { + // Switch sense of "reversed" instead + sortReversed = !sortReversed; + } else { + sortByName = newSortByName; + sortReversed = false; + } + + // Keep the current selection if possible + int i = table.getSelectedRow(); + int pid = getPid(els, i); + sort(els); + i = findPid(els, pid); + dataModel.fireTableDataChanged(); + if ((i >= 0) || (els.size() > 0)) { + if (i >= 0) { + table.setRowSelectionInterval(i, i); + } else { + table.setRowSelectionInterval(0, 0); + } + } + } + } + }); + + JScrollPane scrollPane = new JScrollPane(table); + add(scrollPane, BorderLayout.CENTER); + + if (els.size() > 0) { + table.setRowSelectionInterval(0, 0); + } + } + + /** Set update interval for automatic updating of the process list */ + + public void setAutoUpdateInterval(int millis) { + getTimer().setDelay(millis); + } + + /** Start auto updating of the panel */ + public void start() { + getTimer().start(); + } + + /** Stop auto updating of the panel */ + public void stop() { + getTimer().stop(); + } + + /** Call this to update the panel's notion of the process list */ + public synchronized void update() { + if (!dbg.hasProcessList()) { + throw new RuntimeException("ProcessListPanel requires that debugger supports getProcessList()"); + } + java.util.List newEls = dbg.getProcessList(); + sort(newEls); + if (table != null) { + // Keep the current selection if possible + int i = table.getSelectedRow(); + int pid = getPid(els, i); + i = findPid(newEls, pid); + els = newEls; + dataModel.fireTableDataChanged(); + if ((i >= 0) || (els.size() > 0)) { + if (i >= 0) { + table.setRowSelectionInterval(i, i); + } else { + table.setRowSelectionInterval(0, 0); + } + } + } else { + els = newEls; + } + } + + /** Call this to get the selected ProcessInfo, or null if none selected */ + public synchronized ProcessInfo getSelectedProcess() { + int i = table.getSelectedRow(); + if (i < 0) { + return null; + } + return (ProcessInfo) els.get(i); + } + + private synchronized void sort(java.util.List els) { + Comparator c; + if (sortByName) { + c = new Comparator() { + public int compare(Object o1, Object o2) { + int scale = (sortReversed ? -1 : 1); + return scale * ((ProcessInfo) o1).getName().compareToIgnoreCase(((ProcessInfo) o2).getName()); + } + }; + } else { + c = new Comparator() { + public int compare(Object o1, Object o2) { + int scale = (sortReversed ? -1 : 1); + int pid1 = ((ProcessInfo) o1).getPid(); + int pid2 = ((ProcessInfo) o2).getPid(); + int ret; + if (pid1 < pid2) ret = -1; + else if (pid1 == pid2) ret = 0; + else ret = 1; + return ret * scale; + } + }; + } + Collections.sort(els, c); + } + + private javax.swing.Timer getTimer() { + if (timer == null) { + timer = new javax.swing.Timer(1000, new ActionListener() { + public void actionPerformed(ActionEvent e) { + update(); + } + }); + } + return timer; + } + + private synchronized int getPid(java.util.List els, int index) { + return ((ProcessInfo) els.get(index)).getPid(); + } + + private synchronized int findPid(java.util.List els, int pid) { + for (int i = 0; i < els.size(); i++) { + ProcessInfo info = (ProcessInfo) els.get(i); + if (info.getPid() == pid) { + return i; + } + } + return -1; + } +}