/*
* Copyright (C) 2006 Sun Microsystems, Inc. All rights reserved.
* Copyright (C) 2010 Peransin Nicolas. All rights reserved.
* Use is subject to license terms.
*/
package org.mypsycho.swing.app.task;
import java.awt.ActiveEvent;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.PaintEvent;
import javax.swing.JPanel;
/**
* Class for ...
* <p>Details</p>
*
* @author Peransin Nicolas
*
*/
public abstract class DoWaitForEmptyEventQ extends Task<Void, Void> {
Component placeHolder = new JPanel();
/*
* An event that sets a flag when it's dispatched and another
* flag, see isEventQEmpty(), that indicates if the event queue
* was empty at dispatch time.
*/
@SuppressWarnings("serial")
private static class NotifyingEvent extends PaintEvent implements ActiveEvent {
private boolean dispatched = false;
private boolean qEmpty = false;
NotifyingEvent(Component c) {
super(c, PaintEvent.UPDATE, null);
}
synchronized boolean isDispatched() {
return dispatched;
}
synchronized boolean isEventQEmpty() {
return qEmpty;
}
@Override
public void dispatch() {
EventQueue q = Toolkit.getDefaultToolkit().getSystemEventQueue();
synchronized (this) {
qEmpty = (q.peekEvent() == null);
dispatched = true;
notifyAll();
}
}
}
@Override
protected Void doInBackground() {
boolean qEmpty = false;
EventQueue q = Toolkit.getDefaultToolkit().getSystemEventQueue();
while (!qEmpty) {
NotifyingEvent e = new NotifyingEvent(placeHolder);
q.postEvent(e);
synchronized (e) {
while (!e.isDispatched()) {
try {
e.wait();
} catch (InterruptedException ie) {
// ignore
}
}
qEmpty = e.isEventQEmpty();
}
}
return null;
}
// something must done. Otherwise, it is useless to wait.
@Override
protected abstract void finished();
}