package org.japura.gui.util; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.SwingWorker; import javax.swing.SwingWorker.StateValue; import javax.swing.Timer; /** * <P> * Copyright (C) 2012 Carlos Eduardo Leite de Andrade * <P> * This library is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * <P> * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * <P> * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <A * HREF="www.gnu.org/licenses/">www.gnu.org/licenses/</A> * <P> * For more information, contact: <A HREF="www.japura.org">www.japura.org</A> * <P> * * @author Carlos Eduardo Leite de Andrade */ public class SwingWorkerHandler{ private int delay = 600; private int workersCount; public void setDelay(int delay) { this.delay = delay; } public int getDelay() { return delay; } public int getWorkersCount() { return workersCount; } void decWorkersCount() { workersCount--; } void incWorkersCount() { workersCount++; } public void register(SwingWorker<?, ?> worker, String name) { worker.addPropertyChangeListener(new Starter(this, name)); } protected void progress(int value) {} protected void before(SwingWorkerHandlerEvent event) {} protected void after(SwingWorkerHandlerEvent event) {} private static class Starter extends Timer implements ActionListener, PropertyChangeListener{ private static final long serialVersionUID = 1L; private SwingWorkerHandler handler; private String name; private InputEventBlocker eventHook = new InputEventBlocker(); private boolean stop; private boolean called; public Starter(SwingWorkerHandler handler, String name) { super(handler.getDelay(), null); this.name = name; this.handler = handler; addActionListener(this); setRepeats(false); } @Override public void propertyChange(PropertyChangeEvent evt) { if ("state".equals(evt.getPropertyName())) { if (evt.getNewValue().equals(StateValue.STARTED)) { handler.incWorkersCount(); eventHook.apply(); start(); } else if (evt.getNewValue().equals(StateValue.DONE)) { handler.decWorkersCount(); stop(); eventHook.remove(); } } else if ("progress".equals(evt.getPropertyName())) { handler.progress((Integer) evt.getNewValue()); } } @Override public void actionPerformed(ActionEvent e) { if (stop == false) { called = true; eventHook.remove(); handler.before(new SwingWorkerHandlerEvent(handler.getWorkersCount(), name)); } } @Override public void stop() { stop = true; super.stop(); if (called) { handler.after(new SwingWorkerHandlerEvent(handler.getWorkersCount(), name)); } } } }