package org.rr.jeborker.gui;
import static org.rr.commons.utils.StringUtil.EMPTY;
import java.util.concurrent.Callable;
import java.util.logging.Level;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import org.rr.commons.log.LoggerFactory;
import org.rr.jeborker.Jeboorker;
public class MainMonitor {
private static final int DEFAULT_CLEAN_TIMEOUT = 5000;
private static MainMonitor instance;
private static int clearTimeout = -1;
private JProgressBar progressbar;
private int started = 0;
private boolean isEnabled;
private MainMonitor(JProgressBar progressbar) {
this.progressbar = progressbar;
startMessageCleanerThread();
}
private void startMessageCleanerThread() {
Jeboorker.APPLICATION_THREAD_POOL.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
while(true) {
if(clearTimeout == -1) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
LoggerFactory.getLogger().log(Level.WARNING, "Sleep InterruptedException", e);
}
} else {
try {
Thread.sleep(clearTimeout);
if(!isBlocked()) {
clearMessage();
clearTimeout = -1;
}
} catch (InterruptedException e) {
LoggerFactory.getLogger().log(Level.WARNING, "Sleep InterruptedException", e);
}
}
}
}
});
}
static MainMonitor getInstance(JProgressBar progressbar) {
if(instance == null) {
instance = new MainMonitor(progressbar);
}
return instance;
}
public void monitorProgressStart(final String message, final boolean indeterminate) {
if(isEnabled) {
started++;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
progressbar.setIndeterminate(indeterminate);
setMessage(message);
blockMainFrame(true);
}
});
}
}
public void monitorProgressStart(final String message) {
monitorProgressStart(message, true);
}
public MainMonitor blockMainFrame(boolean block) {
MainController.getController().getMainWindow().getGlassPane().setVisible(block);
return this;
}
private boolean isBlocked() {
return MainController.getController().getMainWindow().getGlassPane().isVisible();
}
public void monitorProgressStop() {
this.monitorProgressStop(Bundle.getString("JEBorkerMainMonitor.finished"));
}
public void monitorProgressStop(final String message) {
if(isEnabled) {
started--;
if(started <= 0) {
started = 0;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
progressbar.setIndeterminate(false);
progressbar.setValue(0);
if(message != null) {
setMessage(message);
}
blockMainFrame(false);
}
});
}
}
}
public void clearMessage() {
setMessage(EMPTY);
}
public void setMessage(final String message) {
if(isEnabled) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
progressbar.setString(message != null ? message : EMPTY);
progressbar.setStringPainted(true);
progressbar.setToolTipText(message != null ? message : EMPTY);
clearTimeout = DEFAULT_CLEAN_TIMEOUT;
}
});
}
}
public void setProgress(final int progress, final int max) {
if(isEnabled) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
progressbar.setIndeterminate(false);
progressbar.setMinimum(0);
progressbar.setMaximum(max);
progressbar.setValue(progress);
progressbar.setString(progressbar.getString());
}
});
}
}
public void resetProgress() {
if(isEnabled) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
progressbar.setIndeterminate(false);
progressbar.setMinimum(0);
progressbar.setMaximum(100);
progressbar.setValue(0);
}
});
}
}
public boolean isEnabled() {
return isEnabled;
}
public void setEnabled(boolean enabled) {
isEnabled = enabled;
}
}