/**
* Created : Apr 12, 2012
*
* @author pquiring
*/
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import javaforce.*;
public class MainPanel extends javax.swing.JPanel {
/**
* Creates new form MainPanel
*/
public MainPanel() {
initComponents();
restartTimer();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jTabbedPane1 = new javax.swing.JTabbedPane();
jPanel1 = new javax.swing.JPanel();
terminate = new javax.swing.JButton();
kill = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
table = new javax.swing.JTable();
showAllUsers = new javax.swing.JCheckBox();
showRoot = new javax.swing.JCheckBox();
jLabel2 = new javax.swing.JLabel();
speed = new javax.swing.JSlider();
jPanel2 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
resCPU = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
resMemory = new javax.swing.JLabel();
terminate.setText("Terminate");
terminate.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
terminateActionPerformed(evt);
}
});
kill.setText("Kill");
kill.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
killActionPerformed(evt);
}
});
table.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
"PID", "User", "CPU", "Memory", "Time", "Program"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
};
boolean[] canEdit = new boolean [] {
false, false, false, false, false, false
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
jScrollPane2.setViewportView(table);
showAllUsers.setText("Show all users");
showRoot.setText("Show root processes");
jLabel2.setText("Update Speed:");
speed.setMajorTickSpacing(1);
speed.setMaximum(11);
speed.setMinimum(3);
speed.setPaintTicks(true);
speed.setSnapToTicks(true);
speed.setValue(5);
speed.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
speedStateChanged(evt);
}
});
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane2)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(terminate)
.addComponent(jLabel2))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(kill)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(showAllUsers)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(showRoot))
.addComponent(speed, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(0, 79, Short.MAX_VALUE)))
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(terminate)
.addComponent(kill)
.addComponent(showAllUsers)
.addComponent(showRoot))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel2)
.addComponent(speed, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 507, Short.MAX_VALUE)
.addContainerGap())
);
jTabbedPane1.addTab("Processes", jPanel1);
jLabel1.setText("CPU");
jLabel3.setText("Memory");
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(resMemory, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(resCPU, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanel2Layout.createSequentialGroup()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel1)
.addComponent(jLabel3))
.addGap(0, 508, Short.MAX_VALUE)))
.addContainerGap())
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(resCPU, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(resMemory, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(484, Short.MAX_VALUE))
);
jTabbedPane1.addTab("Resources", jPanel2);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jTabbedPane1)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jTabbedPane1)
);
}// </editor-fold>//GEN-END:initComponents
private void terminateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_terminateActionPerformed
int row = table.getSelectedRow();
if (row == -1) return;
String pid = (String)table.getValueAt(row, 0);
try {
Runtime.getRuntime().exec(new String[] {"kill", "-15", pid});
} catch (Exception e) {
JFLog.log(e);
}
}//GEN-LAST:event_terminateActionPerformed
private void killActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_killActionPerformed
int row = table.getSelectedRow();
if (row == -1) return;
String pid = (String)table.getValueAt(row, 0);
try {
Runtime.getRuntime().exec(new String[] {"kill", "-9", pid});
} catch (Exception e) {
JFLog.log(e);
}
}//GEN-LAST:event_killActionPerformed
private void speedStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_speedStateChanged
restartTimer();
}//GEN-LAST:event_speedStateChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTabbedPane jTabbedPane1;
private javax.swing.JButton kill;
private javax.swing.JLabel resCPU;
private javax.swing.JLabel resMemory;
private javax.swing.JCheckBox showAllUsers;
private javax.swing.JCheckBox showRoot;
private javax.swing.JSlider speed;
private javax.swing.JTable table;
private javax.swing.JButton terminate;
// End of variables declaration//GEN-END:variables
private java.util.Timer timer;
private void restartTimer() {
if (timer != null) {
timer.cancel();
timer = null;
}
int delay = speed.getValue();
if (delay == 11) return;
timer = new java.util.Timer();
timer.schedule(
new java.util.TimerTask() {
public void run() {
try {
java.awt.EventQueue.invokeAndWait(new Runnable() {
public void run() {
try {
update();
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
} catch (Exception e2) {}
}
}, 100, delay * 1000);
}
private void update() {
DefaultTableModel model = (DefaultTableModel)table.getModel();
ArrayList<Object[]> data = new ArrayList<Object[]>();
String pid = null;
int row = table.getSelectedRow();
if (row != -1) {
pid = (String)table.getValueAt(row, 0);
}
row = -1;
boolean show_AllUsers = showAllUsers.isSelected();
boolean show_Root = showRoot.isSelected();
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"top", "-b", "-n", "1"}, false);
String lns[] = output.split("\n");
String cuser = System.getenv("USER");
//0 = top ...
//1 = Tasks ...
//2 = Cpu(s) ...
//3 = Mem ...
//4 = Swap ...
//5 = <blank>
//6 = header
//TODO : prettify this with some nice grafix
resCPU.setText(lns[2]);
resMemory.setText(lns[3]);
for(int a=7;a<lns.length;a++) {
String f[] = lns[a].trim().split(" +"); //greedy space
if (f.length < 12) continue;
//PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
String puser = f[1];
if (puser.equals("root")) {
if (!show_Root) continue;
} else if (!puser.equals(cuser)) {
if (!show_AllUsers) continue;
}
if ((pid != null) && (f[0].equals(pid))) {
row = data.size();
}
//PID USER CPU MEM TIME PROGRAM
data.add(new Object[] {f[0], f[1], f[8], f[4], f[10], f[11]});
}
while (model.getRowCount() > 0) model.removeRow(0);
int cnt = data.size();
for(int a=0;a<cnt;a++) {
model.addRow(data.get(a));
}
if (row != -1) {
table.changeSelection(row, 0, false, false);
table.scrollRectToVisible(table.getCellRect(row, 0, true));
}
}
}