/*
* WPCleaner: A tool to help on Wikipedia maintenance tasks.
* Copyright (C) 2013 Nicolas Vervelle
*
* See README.txt file for licensing information.
*/
package org.wikipediacleaner.gui.swing.basic;
import org.wikipediacleaner.api.MediaWikiListener;
import org.wikipediacleaner.api.constants.EnumWikipedia;
/**
*
*/
public class BasicWorker extends SwingWorker implements MediaWikiListener {
private final EnumWikipedia wikipedia;
private final BasicWindow window;
private BasicWorkerListener listener;
private Integer timeLimit;
private long startTime;
/**
* @param wikipedia Wikipedia.
* @param window Window.
*/
public BasicWorker(EnumWikipedia wikipedia, BasicWindow window) {
super();
this.wikipedia = wikipedia;
this.window = window;
this.timeLimit = null;
this.startTime = System.currentTimeMillis();
}
/**
* Modify the displayed message.
*
* @param message Message to display.
*/
@Override
public void setText(String message) {
if ((window != null) && (window.getGlassPane() != null)) {
window.getGlassPane().setText(message);
}
}
/**
* @param listener Listener.
*/
public void setListener(BasicWorkerListener listener) {
this.listener = listener;
}
/**
* @param limit Time limit for execution.
*/
public void setTimeLimit(Integer limit) {
this.timeLimit = limit;
this.startTime = System.currentTimeMillis();
}
/**
* @return Flag indicating if the Swing Worker should stop.
*/
@Override
public boolean shouldStop() {
return !shouldContinue();
}
/**
* @return Flag indicating if the Swing Worker should continue.
*/
public boolean shouldContinue() {
if (timeLimit != null) {
long currentTime = System.currentTimeMillis();
if ((currentTime - startTime) / 1000 > timeLimit.intValue()) {
return false;
}
}
if (window == null) {
return true;
}
if ((window.getParentComponent() == null) ||
!window.getParentComponent().isDisplayable()) {
return false;
}
return true;
}
/* (non-Javadoc)
* @see org.wikipediacleaner.gui.swing.basic.SwingWorker#start()
*/
@Override
public void start() {
if ((window != null) && (window.getGlassPane() != null)) {
window.getGlassPane().start();
}
if (listener != null) {
listener.beforeStart(this);
}
startTime = System.currentTimeMillis();
super.start();
if (listener != null) {
listener.afterStart(this);
}
}
/* (non-Javadoc)
* @see org.wikipediacleaner.gui.swing.basic.SwingWorker#construct()
*/
@Override
public Object construct() {
return null;
}
/* (non-Javadoc)
* @see org.wikipediacleaner.gui.swing.basic.SwingWorker#finished()
*/
@Override
public void finished() {
try {
if (listener != null) {
listener.beforeFinished(this);
}
super.finished();
Object result = get();
boolean ok = true;
if (result instanceof Throwable) {
ok = false;
}
if (window != null) {
if (result instanceof Throwable) {
window.displayError((Throwable) result);
}
window.updateComponentState();
}
if (listener != null) {
listener.afterFinished(this, ok);
}
} catch (Throwable t) {
if (window != null) {
window.displayError(t);
}
} finally {
if ((window != null) && (window.getGlassPane() != null)) {
window.getGlassPane().stop();
}
}
}
/**
* @return Associated window.
*/
public BasicWindow getWindow() {
return window;
}
/**
* @return Wikipedia.
*/
public EnumWikipedia getWikipedia() {
return wikipedia;
}
}