package thaw.plugins; import java.util.Iterator; import java.util.Vector; import java.awt.Color; import thaw.core.Core; import thaw.core.I18n; import thaw.core.Logger; import thaw.core.Main; import thaw.core.Plugin; import thaw.core.LogListener; import thaw.core.ThawThread; import thaw.core.ThawRunnable; import thaw.gui.IconBox; import thaw.fcp.FCPTransferQuery; public class StatusBar implements ThawRunnable, Plugin, LogListener { public final static int INTERVAL = 3000; /* in ms */ public final static String SEPARATOR = " "; private Core core; private boolean running = true; private Thread refresher; private boolean advancedMode = false; private boolean dropNextRefresh = false; public final static Color ORANGE = new Color(240, 160, 0); private final static String connectingStr = I18n.getMessage("thaw.statusBar.connecting"); private final static String disconnectedStr = I18n.getMessage("thaw.statusBar.disconnected"); private final static String globalProgressionStr= I18n.getMessage("thaw.plugin.statistics.globalProgression"); private final static String finishedStr = I18n.getMessage("thaw.plugin.statistics.finished"); private final static String failedStr = I18n.getMessage("thaw.plugin.statistics.failed"); private final static String runningStr = I18n.getMessage("thaw.plugin.statistics.running"); private final static String pendingStr = I18n.getMessage("thaw.plugin.statistics.pending"); public boolean run(final Core core) { this.core = core; advancedMode = Boolean.valueOf(core.getConfig().getValue("advancedMode")).booleanValue(); running = true; refresher = new ThawThread(this, "Status bar refresh", this); refresher.start(); Logger.addLogListener(this); return true; } public void run() { while(running) { try { Thread.sleep(StatusBar.INTERVAL); } catch(final java.lang.InterruptedException e) { // pfff :P } if (!dropNextRefresh) updateStatusBar(); else dropNextRefresh = false; } } public void newLogLine(int level, Object src, String line) { if (level <= 1) { /* error / warnings */ dropNextRefresh = true; String str = Logger.PREFIXES[level]+" " + ((src != null) ? (src.getClass().getName() + ": ") : "") + line; core.getMainWindow().setStatus(IconBox.minStop, str, ((level == 0) ? Color.RED : ORANGE)); } } public void logLevelChanged(int oldLevel, int newLevel) { } public void updateStatusBar() { if (core.isReconnecting()) { core.getMainWindow().setStatus(IconBox.blueBunny, connectingStr, java.awt.Color.RED); return; } if (!core.getConnectionManager().isConnected()) { core.getMainWindow().setStatus(IconBox.minDisconnectAction, disconnectedStr, java.awt.Color.RED); return; } int progressDone = 0; int progressTotal = 0; int finished = 0; int failed = 0; int running = 0; int pending = 0; int total = 0; final Vector runningQueue = core.getQueueManager().getRunningQueue(); synchronized(runningQueue) { for(final Iterator it = runningQueue.iterator(); it.hasNext(); ) { final FCPTransferQuery query = (FCPTransferQuery)it.next(); if(query.isRunning() && !query.isFinished()) { running++; progressTotal += 100; progressDone += query.getProgression(); } if(query.isFinished() && query.isSuccessful()) { finished++; progressTotal += 100; progressDone += 100; } if(query.isFinished() && !query.isSuccessful()) { failed++; } } } final Vector[] pendingQueues = core.getQueueManager().getPendingQueues(); synchronized(pendingQueues) { for(int i =0 ; i < pendingQueues.length; i++) { progressTotal += pendingQueues[i].size() * 100; pending += pendingQueues[i].size(); } } total = finished + failed + running + pending; String status = "Thaw "+Main.VERSION; if(advancedMode) { status = status + StatusBar.SEPARATOR + globalProgressionStr + " " + Integer.toString(progressDone) + "/" + Integer.toString(progressTotal); } status = status + StatusBar.SEPARATOR + finishedStr+ " " + Integer.toString(finished) + "/" + Integer.toString(total) + StatusBar.SEPARATOR + failedStr + " " + Integer.toString(failed) + "/" + Integer.toString(total) + StatusBar.SEPARATOR + runningStr + " " + Integer.toString(running) + "/" + Integer.toString(total) + StatusBar.SEPARATOR + pendingStr + " " + Integer.toString(pending) + "/" + Integer.toString(total); core.getMainWindow().setStatus(IconBox.minConnectAction, status); } public void stop() { running = false; Logger.removeLogListener(this); core.getMainWindow().setStatus(IconBox.blueBunny, "Thaw "+Main.VERSION); } public String getNameForUser() { return I18n.getMessage("thaw.plugin.statistics.statistics"); } public javax.swing.ImageIcon getIcon() { return IconBox.remove; } }