package thaw.plugins;
import java.util.Observable;
import java.util.Observer;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import thaw.core.I18n;
import thaw.core.Core;
import thaw.core.Logger;
import thaw.core.ThawThread;
import thaw.core.ThawRunnable;
import thaw.plugins.peerMonitor.*;
import thaw.fcp.*;
public class PeerMonitor implements thaw.core.Plugin, Observer, ActionListener
{
public final static int DEFAULT_REFRESH_RATE = 10; /* in sec */
private PeerMonitorPanel peerPanel;
private Core core;
private boolean running = false;
private JButton unfoldButton;
private boolean folded = false;
public PeerMonitor() {
}
protected class DisplayRefresher implements Observer, ThawRunnable{
private FCPGetNode getNode = null;
private FCPListPeers listPeers = null;
public DisplayRefresher() {
}
public void run() {
while(running) {
if (getNode == null) {
getNode = new FCPGetNode(false /* private */, true /* volatile */);
getNode.addObserver(this);
}
getNode.start(core.getQueueManager());
if (listPeers == null) {
listPeers = new FCPListPeers(false /* metadata */, true /* volatile */);
listPeers.addObserver(this);
}
if (listPeers.hasEnded())
listPeers.start(core.getQueueManager());
try {
Thread.sleep(DEFAULT_REFRESH_RATE * 1000);
} catch(InterruptedException e) {
/* \_o< \_o< \_o< */
}
if (!running)
return;
}
}
public void update(Observable o, Object param) {
if (!running)
return;
if (o instanceof FCPGetNode) {
FCPGetNode gN = (FCPGetNode)o;
peerPanel.setMemBar(gN.getUsedJavaMemory(), gN.getMaxJavaMemory());
peerPanel.setNmbThreads(gN.getNmbThreads());
peerPanel.setNodeInfos(gN.getAllParameters());
}
if (o instanceof FCPListPeers) {
FCPListPeers lP = (FCPListPeers)o;
peerPanel.setPeerList(lP.getPeers());
}
}
public void stop() {
running = false;
}
}
public boolean run(Core core) {
this.core = core;
core.getConfig().addListener("advancedMode", this);
unfoldButton = new JButton("<");
unfoldButton.addActionListener(this);
peerPanel = new PeerMonitorPanel(this, core.getQueueManager(), core.getConfig(),
core.getMainWindow());
peerPanel.addObserver(this);
peerPanel.getFoldButton().addActionListener(this);
core.getMainWindow().addComponent(peerPanel.getPeerListPanel(),
BorderLayout.EAST);
running = true;
Thread th = new ThawThread(new DisplayRefresher(),
"Peer monitor refresh",
this);
th.start();
if (core.getConfig().getValue("peerMonitorFolded") != null) {
boolean f = (new Boolean(core.getConfig().getValue("peerMonitorFolded"))).booleanValue();
if (f) foldPanel();
}
return true;
}
public void stop() {
hideTab();
if (!folded)
core.getMainWindow().removeComponent(peerPanel.getPeerListPanel());
else
core.getMainWindow().removeComponent(unfoldButton);
core.getConfig().setValue("peerMonitorFolded", Boolean.toString(folded));
running = false;
}
public String getNameForUser() {
return I18n.getMessage("thaw.plugin.peerMonitor.peerMonitor");
}
public javax.swing.ImageIcon getIcon() {
return thaw.gui.IconBox.peers;
}
private boolean tabVisible = false;
public void update(Observable o, Object param) {
core.getMainWindow().addTab(I18n.getMessage("thaw.plugin.peerMonitor.peerMonitor"),
thaw.gui.IconBox.peers,
peerPanel.getTabPanel());
core.getMainWindow().setSelectedTab(peerPanel.getTabPanel());
tabVisible = true;
peerPanel.showToolbarButtons();
}
public void hideTab() {
if (tabVisible) {
peerPanel.hideToolbarButtons();
core.getMainWindow().removeTab(peerPanel.getTabPanel());
tabVisible = false;
}
}
public void foldPanel() {
Logger.info(this, "Folding peer monitor panel");
core.getMainWindow().removeComponent(peerPanel.getPeerListPanel());
core.getMainWindow().getMainFrame().validate();
core.getMainWindow().addComponent(unfoldButton,
BorderLayout.EAST);
core.getMainWindow().getMainFrame().validate();
folded = true;
}
public void unfoldPanel() {
Logger.info(this, "Unfolding peer monitor panel");
core.getMainWindow().removeComponent(unfoldButton);
core.getMainWindow().getMainFrame().validate();
core.getMainWindow().addComponent(peerPanel.getPeerListPanel(),
BorderLayout.EAST);
core.getMainWindow().getMainFrame().validate();
folded = false;
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == peerPanel.getFoldButton())
foldPanel();
else if (e.getSource() == unfoldButton)
unfoldPanel();
}
public void setNodeVersion(String version) {
}
/**
* check if it's not more recent than the node version
*/
public void checkPeerVersion(String version) {
}
}