|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package sun.tools.jconsole; |
|
|
|
import java.util.List; |
|
import java.awt.*; |
|
import java.awt.event.*; |
|
import java.util.*; |
|
|
|
import javax.swing.*; |
|
import javax.swing.border.*; |
|
import javax.swing.event.*; |
|
import javax.swing.plaf.basic.BasicRadioButtonUI; |
|
import javax.swing.table.*; |
|
|
|
|
|
|
|
import static java.awt.BorderLayout.*; |
|
import static javax.swing.ListSelectionModel.*; |
|
import static sun.tools.jconsole.Utilities.*; |
|
|
|
@SuppressWarnings("serial") |
|
public class ConnectDialog extends InternalDialog |
|
implements DocumentListener, FocusListener, |
|
ItemListener, ListSelectionListener, KeyListener { |
|
|
|
private static final int COL_NAME = 0; |
|
private static final int COL_PID = 1; |
|
|
|
|
|
JConsole jConsole; |
|
JTextField userNameTF, passwordTF; |
|
JRadioButton localRadioButton, remoteRadioButton; |
|
JLabel localMessageLabel, remoteMessageLabel; |
|
JTextField remoteTF; |
|
JButton connectButton, cancelButton; |
|
JPanel radioButtonPanel; |
|
|
|
private Icon mastheadIcon = |
|
new MastheadIcon(Messages.CONNECT_DIALOG_MASTHEAD_TITLE); |
|
private Color hintTextColor, disabledTableCellColor; |
|
|
|
|
|
JTable vmTable; |
|
ManagedVmTableModel vmModel = null; |
|
|
|
JScrollPane localTableScrollPane = null; |
|
|
|
private Action connectAction, cancelAction; |
|
|
|
|
|
public ConnectDialog(JConsole jConsole) { |
|
super(jConsole, Messages.CONNECT_DIALOG_TITLE, true); |
|
|
|
this.jConsole = jConsole; |
|
setAccessibleDescription(this, |
|
Messages.CONNECT_DIALOG_ACCESSIBLE_DESCRIPTION); |
|
setDefaultCloseOperation(HIDE_ON_CLOSE); |
|
setResizable(false); |
|
Container cp = (JComponent)getContentPane(); |
|
|
|
radioButtonPanel = new JPanel(new BorderLayout(0, 12)); |
|
radioButtonPanel.setBorder(new EmptyBorder(6, 12, 12, 12)); |
|
ButtonGroup radioButtonGroup = new ButtonGroup(); |
|
JPanel bottomPanel = new JPanel(new BorderLayout()); |
|
|
|
statusBar = new JLabel(" ", JLabel.CENTER); |
|
setAccessibleName(statusBar, |
|
Messages.CONNECT_DIALOG_STATUS_BAR_ACCESSIBLE_NAME); |
|
|
|
Font normalLabelFont = statusBar.getFont(); |
|
Font boldLabelFont = normalLabelFont.deriveFont(Font.BOLD); |
|
Font smallLabelFont = normalLabelFont.deriveFont(normalLabelFont.getSize2D() - 1); |
|
|
|
JLabel mastheadLabel = new JLabel(mastheadIcon); |
|
setAccessibleName(mastheadLabel, |
|
Messages.CONNECT_DIALOG_MASTHEAD_ACCESSIBLE_NAME); |
|
|
|
cp.add(mastheadLabel, NORTH); |
|
cp.add(radioButtonPanel, CENTER); |
|
cp.add(bottomPanel, SOUTH); |
|
|
|
createActions(); |
|
|
|
remoteTF = new JTextField(); |
|
remoteTF.addActionListener(connectAction); |
|
remoteTF.getDocument().addDocumentListener(this); |
|
remoteTF.addFocusListener(this); |
|
remoteTF.setPreferredSize(remoteTF.getPreferredSize()); |
|
setAccessibleName(remoteTF, |
|
Messages.REMOTE_PROCESS_TEXT_FIELD_ACCESSIBLE_NAME); |
|
|
|
// |
|
// If the VM supports the local attach mechanism (is: Sun |
|
// implementation) then the Local Process panel is created. |
|
|
|
if (JConsole.isLocalAttachAvailable()) { |
|
vmModel = new ManagedVmTableModel(); |
|
vmTable = new LocalTabJTable(vmModel); |
|
vmTable.setSelectionMode(SINGLE_SELECTION); |
|
vmTable.setPreferredScrollableViewportSize(new Dimension(400, 250)); |
|
vmTable.setColumnSelectionAllowed(false); |
|
vmTable.addFocusListener(this); |
|
vmTable.getSelectionModel().addListSelectionListener(this); |
|
|
|
TableColumnModel columnModel = vmTable.getColumnModel(); |
|
|
|
TableColumn pidColumn = columnModel.getColumn(COL_PID); |
|
pidColumn.setMaxWidth(getLabelWidth("9999999")); |
|
pidColumn.setResizable(false); |
|
|
|
TableColumn cmdLineColumn = columnModel.getColumn(COL_NAME); |
|
cmdLineColumn.setResizable(false); |
|
|
|
localRadioButton = new JRadioButton(Messages.LOCAL_PROCESS_COLON); |
|
localRadioButton.setMnemonic(Resources.getMnemonicInt(Messages.LOCAL_PROCESS_COLON)); |
|
localRadioButton.setFont(boldLabelFont); |
|
localRadioButton.addItemListener(this); |
|
radioButtonGroup.add(localRadioButton); |
|
|
|
JPanel localPanel = new JPanel(new BorderLayout()); |
|
|
|
JPanel localTablePanel = new JPanel(new BorderLayout()); |
|
|
|
radioButtonPanel.add(localPanel, NORTH); |
|
|
|
localPanel.add(localRadioButton, NORTH); |
|
localPanel.add(new Padder(localRadioButton), LINE_START); |
|
localPanel.add(localTablePanel, CENTER); |
|
|
|
localTableScrollPane = new JScrollPane(vmTable); |
|
|
|
localTablePanel.add(localTableScrollPane, NORTH); |
|
|
|
localMessageLabel = new JLabel(" "); |
|
localMessageLabel.setFont(smallLabelFont); |
|
localMessageLabel.setForeground(hintTextColor); |
|
localTablePanel.add(localMessageLabel, SOUTH); |
|
} |
|
|
|
remoteRadioButton = new JRadioButton(Messages.REMOTE_PROCESS_COLON); |
|
remoteRadioButton.setMnemonic(Resources.getMnemonicInt(Messages.REMOTE_PROCESS_COLON)); |
|
remoteRadioButton.setFont(boldLabelFont); |
|
radioButtonGroup.add(remoteRadioButton); |
|
|
|
JPanel remotePanel = new JPanel(new BorderLayout()); |
|
if (localRadioButton != null) { |
|
remotePanel.add(remoteRadioButton, NORTH); |
|
remotePanel.add(new Padder(remoteRadioButton), LINE_START); |
|
|
|
Action nextRadioButtonAction = |
|
new AbstractAction("nextRadioButton") { |
|
public void actionPerformed(ActionEvent ev) { |
|
JRadioButton rb = |
|
(ev.getSource() == localRadioButton) ? remoteRadioButton |
|
: localRadioButton; |
|
rb.doClick(); |
|
rb.requestFocus(); |
|
} |
|
}; |
|
|
|
localRadioButton.getActionMap().put("nextRadioButton", nextRadioButtonAction); |
|
remoteRadioButton.getActionMap().put("nextRadioButton", nextRadioButtonAction); |
|
|
|
localRadioButton.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), |
|
"nextRadioButton"); |
|
remoteRadioButton.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), |
|
"nextRadioButton"); |
|
} else { |
|
JLabel remoteLabel = new JLabel(remoteRadioButton.getText()); |
|
remoteLabel.setFont(boldLabelFont); |
|
remotePanel.add(remoteLabel, NORTH); |
|
} |
|
radioButtonPanel.add(remotePanel, SOUTH); |
|
|
|
JPanel remoteTFPanel = new JPanel(new BorderLayout()); |
|
remotePanel.add(remoteTFPanel, CENTER); |
|
|
|
remoteTFPanel.add(remoteTF, NORTH); |
|
|
|
remoteMessageLabel = new JLabel("<html>" + Messages.REMOTE_TF_USAGE + "</html>"); |
|
remoteMessageLabel.setFont(smallLabelFont); |
|
remoteMessageLabel.setForeground(hintTextColor); |
|
remoteTFPanel.add(remoteMessageLabel, CENTER); |
|
|
|
JPanel userPwdPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0)); |
|
userPwdPanel.setBorder(new EmptyBorder(12, 0, 0, 0)); |
|
|
|
int tfWidth = JConsole.IS_WIN ? 12 : 8; |
|
|
|
userNameTF = new JTextField(tfWidth); |
|
userNameTF.addActionListener(connectAction); |
|
userNameTF.getDocument().addDocumentListener(this); |
|
userNameTF.addFocusListener(this); |
|
setAccessibleName(userNameTF, |
|
Messages.USERNAME_ACCESSIBLE_NAME); |
|
LabeledComponent lc; |
|
lc = new LabeledComponent(Messages.USERNAME_COLON_, |
|
Resources.getMnemonicInt(Messages.USERNAME_COLON_), |
|
userNameTF); |
|
lc.label.setFont(boldLabelFont); |
|
userPwdPanel.add(lc); |
|
|
|
passwordTF = new JPasswordField(tfWidth); |
|
|
|
passwordTF.setPreferredSize(userNameTF.getPreferredSize()); |
|
passwordTF.addActionListener(connectAction); |
|
passwordTF.getDocument().addDocumentListener(this); |
|
passwordTF.addFocusListener(this); |
|
setAccessibleName(passwordTF, |
|
Messages.PASSWORD_ACCESSIBLE_NAME); |
|
|
|
lc = new LabeledComponent(Messages.PASSWORD_COLON_, |
|
Resources.getMnemonicInt(Messages.PASSWORD_COLON_), |
|
passwordTF); |
|
lc.setBorder(new EmptyBorder(0, 12, 0, 0)); |
|
lc.label.setFont(boldLabelFont); |
|
userPwdPanel.add(lc); |
|
|
|
remoteTFPanel.add(userPwdPanel, SOUTH); |
|
|
|
String connectButtonToolTipText = |
|
Messages.CONNECT_DIALOG_CONNECT_BUTTON_TOOLTIP; |
|
connectButton = new JButton(connectAction); |
|
connectButton.setToolTipText(connectButtonToolTipText); |
|
|
|
cancelButton = new JButton(cancelAction); |
|
|
|
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING)); |
|
buttonPanel.setBorder(new EmptyBorder(12, 12, 2, 12)); |
|
if (JConsole.IS_GTK) { |
|
buttonPanel.add(cancelButton); |
|
buttonPanel.add(connectButton); |
|
} else { |
|
buttonPanel.add(connectButton); |
|
buttonPanel.add(cancelButton); |
|
} |
|
bottomPanel.add(buttonPanel, NORTH); |
|
|
|
bottomPanel.add(statusBar, SOUTH); |
|
|
|
updateButtonStates(); |
|
Utilities.updateTransparency(this); |
|
} |
|
|
|
public void revalidate() { |
|
|
|
Color disabledForeground = UIManager.getColor("Label.disabledForeground"); |
|
if (disabledForeground == null) { |
|
|
|
disabledForeground = UIManager.getColor("Label.disabledText"); |
|
} |
|
hintTextColor = |
|
ensureContrast(disabledForeground, |
|
UIManager.getColor("Panel.background")); |
|
disabledTableCellColor = |
|
ensureContrast(new Color(0x808080), |
|
UIManager.getColor("Table.background")); |
|
|
|
if (remoteMessageLabel != null) { |
|
remoteMessageLabel.setForeground(hintTextColor); |
|
|
|
String colorStr = |
|
String.format("%06x", hintTextColor.getRGB() & 0xFFFFFF); |
|
remoteMessageLabel.setText("<html><font color=#" + colorStr + ">" + |
|
Messages.REMOTE_TF_USAGE); |
|
} |
|
if (localMessageLabel != null) { |
|
localMessageLabel.setForeground(hintTextColor); |
|
|
|
valueChanged(null); |
|
} |
|
|
|
super.revalidate(); |
|
} |
|
|
|
private void createActions() { |
|
connectAction = new AbstractAction(Messages.CONNECT) { |
|
{ |
|
putValue(Action.MNEMONIC_KEY, Resources.getMnemonicInt(Messages.CONNECT)); |
|
} |
|
|
|
public void actionPerformed(ActionEvent ev) { |
|
if (!isEnabled() || !isVisible()) { |
|
return; |
|
} |
|
setVisible(false); |
|
statusBar.setText(""); |
|
|
|
if (remoteRadioButton.isSelected()) { |
|
String txt = remoteTF.getText().trim(); |
|
String userName = userNameTF.getText().trim(); |
|
userName = userName.equals("") ? null : userName; |
|
String password = passwordTF.getText(); |
|
password = password.equals("") ? null : password; |
|
try { |
|
if (txt.startsWith(JConsole.ROOT_URL)) { |
|
String url = txt; |
|
jConsole.addUrl(url, userName, password, false); |
|
remoteTF.setText(JConsole.ROOT_URL); |
|
return; |
|
} else { |
|
String host = remoteTF.getText().trim(); |
|
String port = "0"; |
|
int index = host.lastIndexOf(":"); |
|
if (index >= 0) { |
|
port = host.substring(index + 1); |
|
host = host.substring(0, index); |
|
} |
|
if (host.length() > 0 && port.length() > 0) { |
|
int p = Integer.parseInt(port.trim()); |
|
jConsole.addHost(host, p, userName, password); |
|
remoteTF.setText(""); |
|
userNameTF.setText(""); |
|
passwordTF.setText(""); |
|
return; |
|
} |
|
} |
|
} catch (Exception ex) { |
|
statusBar.setText(ex.toString()); |
|
} |
|
setVisible(true); |
|
} else if (localRadioButton != null && localRadioButton.isSelected()) { |
|
// Try to connect to selected VM. If a connection |
|
// cannot be established for some reason (the process has |
|
// terminated for example) then keep the dialog open showing |
|
// the connect error. |
|
|
|
int row = vmTable.getSelectedRow(); |
|
if (row >= 0) { |
|
jConsole.addVmid(vmModel.vmAt(row)); |
|
} |
|
refresh(); |
|
} |
|
} |
|
}; |
|
|
|
cancelAction = new AbstractAction(Messages.CANCEL) { |
|
public void actionPerformed(ActionEvent ev) { |
|
setVisible(false); |
|
statusBar.setText(""); |
|
} |
|
}; |
|
} |
|
|
|
|
|
|
|
private static JLabel tmpLabel = new JLabel(); |
|
public static int getLabelWidth(String text) { |
|
tmpLabel.setText(text); |
|
return (int) tmpLabel.getPreferredSize().getWidth() + 1; |
|
} |
|
|
|
private class LocalTabJTable extends JTable { |
|
ManagedVmTableModel vmModel; |
|
Border rendererBorder = new EmptyBorder(0, 6, 0, 6); |
|
|
|
public LocalTabJTable(ManagedVmTableModel model) { |
|
super(model); |
|
this.vmModel = model; |
|
|
|
// Remove vertical lines, expect for GTK L&F. |
|
|
|
if (!JConsole.IS_GTK) { |
|
setShowVerticalLines(false); |
|
setIntercellSpacing(new Dimension(0, 1)); |
|
} |
|
|
|
|
|
addMouseListener(new MouseAdapter() { |
|
public void mouseClicked(MouseEvent evt) { |
|
if (evt.getClickCount() == 2) { |
|
connectButton.doClick(); |
|
} |
|
} |
|
}); |
|
|
|
|
|
getActionMap().put("connect", connectAction); |
|
InputMap inputMap = getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); |
|
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "connect"); |
|
} |
|
|
|
public String getToolTipText(MouseEvent e) { |
|
String tip = null; |
|
java.awt.Point p = e.getPoint(); |
|
int rowIndex = rowAtPoint(p); |
|
int colIndex = columnAtPoint(p); |
|
int realColumnIndex = convertColumnIndexToModel(colIndex); |
|
|
|
if (realColumnIndex == COL_NAME) { |
|
LocalVirtualMachine vmd = vmModel.vmAt(rowIndex); |
|
tip = vmd.toString(); |
|
} |
|
return tip; |
|
} |
|
|
|
public TableCellRenderer getCellRenderer(int row, int column) { |
|
return new DefaultTableCellRenderer() { |
|
public Component getTableCellRendererComponent(JTable table, |
|
Object value, |
|
boolean isSelected, |
|
boolean hasFocus, |
|
int row, |
|
int column) { |
|
Component comp = |
|
super.getTableCellRendererComponent(table, value, isSelected, |
|
hasFocus, row, column); |
|
|
|
if (!isSelected) { |
|
LocalVirtualMachine lvm = vmModel.vmAt(row); |
|
if (!lvm.isManageable() && !lvm.isAttachable()) { |
|
comp.setForeground(disabledTableCellColor); |
|
} |
|
} |
|
|
|
if (comp instanceof JLabel) { |
|
JLabel label = (JLabel)comp; |
|
label.setBorder(rendererBorder); |
|
|
|
if (value instanceof Integer) { |
|
label.setHorizontalAlignment(JLabel.RIGHT); |
|
} |
|
} |
|
|
|
return comp; |
|
} |
|
}; |
|
} |
|
} |
|
|
|
public void setConnectionParameters(String url, |
|
String host, |
|
int port, |
|
String userName, |
|
String password, |
|
String msg) { |
|
if ((url != null && url.length() > 0) || |
|
(host != null && host.length() > 0 && port > 0)) { |
|
|
|
remoteRadioButton.setSelected(true); |
|
if (url != null && url.length() > 0) { |
|
remoteTF.setText(url); |
|
} else { |
|
remoteTF.setText(host+":"+port); |
|
} |
|
userNameTF.setText((userName != null) ? userName : ""); |
|
passwordTF.setText((password != null) ? password : ""); |
|
|
|
statusBar.setText((msg != null) ? msg : ""); |
|
if (getPreferredSize().width > getWidth()) { |
|
pack(); |
|
} |
|
remoteTF.requestFocus(); |
|
remoteTF.selectAll(); |
|
} |
|
} |
|
|
|
|
|
public void itemStateChanged(ItemEvent ev) { |
|
if (!localRadioButton.isSelected()) { |
|
vmTable.getSelectionModel().clearSelection(); |
|
} |
|
updateButtonStates(); |
|
} |
|
|
|
private void updateButtonStates() { |
|
boolean connectEnabled = false; |
|
|
|
if (remoteRadioButton.isSelected()) { |
|
connectEnabled = JConsole.isValidRemoteString(remoteTF.getText()); |
|
} else if (localRadioButton != null && localRadioButton.isSelected()) { |
|
int row = vmTable.getSelectedRow(); |
|
if (row >= 0) { |
|
LocalVirtualMachine lvm = vmModel.vmAt(row); |
|
connectEnabled = (lvm.isManageable() || lvm.isAttachable()); |
|
} |
|
} |
|
|
|
connectAction.setEnabled(connectEnabled); |
|
} |
|
|
|
public void insertUpdate(DocumentEvent e) { |
|
updateButtonStates(); |
|
} |
|
|
|
public void removeUpdate(DocumentEvent e) { |
|
updateButtonStates(); |
|
} |
|
|
|
public void changedUpdate(DocumentEvent e) { |
|
updateButtonStates(); |
|
} |
|
|
|
public void focusGained(FocusEvent e) { |
|
Object source = e.getSource(); |
|
Component opposite = e.getOppositeComponent(); |
|
|
|
if (!e.isTemporary() && |
|
source instanceof JTextField && |
|
opposite instanceof JComponent && |
|
SwingUtilities.getRootPane(opposite) == getRootPane()) { |
|
|
|
((JTextField)source).selectAll(); |
|
} |
|
|
|
if (source == remoteTF) { |
|
remoteRadioButton.setSelected(true); |
|
} else if (source == vmTable) { |
|
localRadioButton.setSelected(true); |
|
if (vmModel.getRowCount() == 1) { |
|
|
|
vmTable.setRowSelectionInterval(0, 0); |
|
} |
|
} |
|
updateButtonStates(); |
|
} |
|
|
|
public void focusLost(FocusEvent e) { |
|
} |
|
|
|
public void keyTyped(KeyEvent e) { |
|
char c = e.getKeyChar(); |
|
if (c == KeyEvent.VK_ESCAPE) { |
|
setVisible(false); |
|
} else if (!(Character.isDigit(c) || |
|
c == KeyEvent.VK_BACK_SPACE || |
|
c == KeyEvent.VK_DELETE)) { |
|
getToolkit().beep(); |
|
e.consume(); |
|
} |
|
} |
|
|
|
public void setVisible(boolean b) { |
|
boolean wasVisible = isVisible(); |
|
super.setVisible(b); |
|
if (b && !wasVisible) { |
|
SwingUtilities.invokeLater(new Runnable() { |
|
public void run() { |
|
if (remoteRadioButton.isSelected()) { |
|
remoteTF.requestFocus(); |
|
remoteTF.selectAll(); |
|
} |
|
} |
|
}); |
|
} |
|
} |
|
|
|
public void keyPressed(KeyEvent e) { |
|
} |
|
|
|
public void keyReleased(KeyEvent e) { |
|
} |
|
|
|
|
|
|
|
public void valueChanged(ListSelectionEvent e) { |
|
updateButtonStates(); |
|
String labelText = " "; |
|
int row = vmTable.getSelectedRow(); |
|
if (row >= 0) { |
|
LocalVirtualMachine lvm = vmModel.vmAt(row); |
|
if (!lvm.isManageable()) { |
|
if (lvm.isAttachable()) { |
|
labelText = Messages.MANAGEMENT_WILL_BE_ENABLED; |
|
} else { |
|
labelText = Messages.MANAGEMENT_NOT_ENABLED; |
|
} |
|
} |
|
} |
|
String colorStr = |
|
String.format("%06x", hintTextColor.getRGB() & 0xFFFFFF); |
|
localMessageLabel.setText("<html><font color=#" + colorStr + ">" + labelText); |
|
} |
|
// ---- |
|
|
|
|
|
|
|
public void refresh() { |
|
if (vmModel != null) { |
|
|
|
LocalVirtualMachine selected = null; |
|
int row = vmTable.getSelectedRow(); |
|
if (row >= 0) { |
|
selected = vmModel.vmAt(row); |
|
} |
|
|
|
vmModel.refresh(); |
|
|
|
int selectRow = -1; |
|
int n = vmModel.getRowCount(); |
|
if (selected != null) { |
|
for (int i = 0; i < n; i++) { |
|
LocalVirtualMachine lvm = vmModel.vmAt(i); |
|
if (selected.vmid() == lvm.vmid() && |
|
selected.toString().equals(lvm.toString())) { |
|
|
|
selectRow = i; |
|
break; |
|
} |
|
} |
|
} |
|
if (selectRow > -1) { |
|
vmTable.setRowSelectionInterval(selectRow, selectRow); |
|
} else { |
|
vmTable.getSelectionModel().clearSelection(); |
|
} |
|
|
|
Dimension dim = vmTable.getPreferredSize(); |
|
|
|
// Tricky. Reduce height by one to avoid double line at bottom, |
|
|
|
dim.height = Math.min(dim.height-1, 100); |
|
localTableScrollPane.setVerticalScrollBarPolicy((dim.height < 100) |
|
? JScrollPane.VERTICAL_SCROLLBAR_NEVER |
|
: JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); |
|
localTableScrollPane.getViewport().setMinimumSize(dim); |
|
localTableScrollPane.getViewport().setPreferredSize(dim); |
|
} |
|
pack(); |
|
setLocationRelativeTo(jConsole); |
|
} |
|
|
|
|
|
private static class ManagedVmTableModel extends AbstractTableModel { |
|
private static String[] columnNames = { |
|
Messages.COLUMN_NAME, |
|
Messages.COLUMN_PID, |
|
}; |
|
|
|
private List<LocalVirtualMachine> vmList; |
|
|
|
public int getColumnCount() { |
|
return columnNames.length; |
|
} |
|
|
|
public String getColumnName(int col) { |
|
return columnNames[col]; |
|
} |
|
|
|
public synchronized int getRowCount() { |
|
return vmList.size(); |
|
} |
|
|
|
public synchronized Object getValueAt(int row, int col) { |
|
assert col >= 0 && col <= columnNames.length; |
|
LocalVirtualMachine vm = vmList.get(row); |
|
switch (col) { |
|
case COL_NAME: return vm.displayName(); |
|
case COL_PID: return vm.vmid(); |
|
default: return null; |
|
} |
|
} |
|
|
|
public Class<?> getColumnClass(int column) { |
|
switch (column) { |
|
case COL_NAME: return String.class; |
|
case COL_PID: return Integer.class; |
|
default: return super.getColumnClass(column); |
|
} |
|
} |
|
|
|
public ManagedVmTableModel() { |
|
refresh(); |
|
} |
|
|
|
|
|
public synchronized LocalVirtualMachine vmAt(int pos) { |
|
return vmList.get(pos); |
|
} |
|
|
|
public synchronized void refresh() { |
|
Map<Integer, LocalVirtualMachine> map = |
|
LocalVirtualMachine.getAllVirtualMachines(); |
|
vmList = new ArrayList<LocalVirtualMachine>(); |
|
vmList.addAll(map.values()); |
|
|
|
|
|
fireTableDataChanged(); |
|
} |
|
} |
|
|
|
// A blank component that takes up as much space as the |
|
|
|
private static class Padder extends JPanel { |
|
JRadioButton radioButton; |
|
|
|
Padder(JRadioButton radioButton) { |
|
this.radioButton = radioButton; |
|
|
|
setAccessibleName(this, Messages.BLANK); |
|
} |
|
|
|
public Dimension getPreferredSize() { |
|
Rectangle r = getTextRectangle(radioButton); |
|
int w = (r != null && r.x > 8) ? r.x : 22; |
|
|
|
return new Dimension(w, 0); |
|
} |
|
|
|
private static Rectangle getTextRectangle(AbstractButton button) { |
|
String text = button.getText(); |
|
Icon icon = (button.isEnabled()) ? button.getIcon() : button.getDisabledIcon(); |
|
|
|
if (icon == null && button.getUI() instanceof BasicRadioButtonUI) { |
|
icon = ((BasicRadioButtonUI)button.getUI()).getDefaultIcon(); |
|
} |
|
|
|
if ((icon == null) && (text == null)) { |
|
return null; |
|
} |
|
|
|
Rectangle paintIconR = new Rectangle(); |
|
Rectangle paintTextR = new Rectangle(); |
|
Rectangle paintViewR = new Rectangle(); |
|
Insets paintViewInsets = new Insets(0, 0, 0, 0); |
|
|
|
paintViewInsets = button.getInsets(paintViewInsets); |
|
paintViewR.x = paintViewInsets.left; |
|
paintViewR.y = paintViewInsets.top; |
|
paintViewR.width = button.getWidth() - (paintViewInsets.left + paintViewInsets.right); |
|
paintViewR.height = button.getHeight() - (paintViewInsets.top + paintViewInsets.bottom); |
|
|
|
Graphics g = button.getGraphics(); |
|
if (g == null) { |
|
return null; |
|
} |
|
SwingUtilities.layoutCompoundLabel(button, |
|
g.getFontMetrics(), |
|
text, |
|
icon, |
|
button.getVerticalAlignment(), |
|
button.getHorizontalAlignment(), |
|
button.getVerticalTextPosition(), |
|
button.getHorizontalTextPosition(), |
|
paintViewR, |
|
paintIconR, |
|
paintTextR, |
|
button.getIconTextGap()); |
|
|
|
return paintTextR; |
|
} |
|
} |
|
|
|
} |