/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* For information about the authors of this project Have a look
* at the AUTHORS file in the root of this project.
*/
package net.sourceforge.fullsync.ui;
import java.util.LinkedList;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.swt.widgets.Display;
public class GUIUpdateQueue<Item> {
public interface GUIUpdateTask<Item> {
void doUpdate(Display display, LinkedList<Item> items);
}
private Display m_display;
private ConcurrentLinkedQueue<Item> m_queue;
private AtomicBoolean m_updateScheduled;
private GUIUpdateTask<Item> m_updateTask;
public GUIUpdateQueue(Display display, GUIUpdateTask<Item> guiUpdateTask) {
m_display = display;
m_queue = new ConcurrentLinkedQueue<Item>();
m_updateScheduled = new AtomicBoolean(false);
m_updateTask = guiUpdateTask;
}
public synchronized void add(Item item) {
m_queue.add(item);
if (!m_updateScheduled.get()) {
m_updateScheduled.set(true);
m_display.asyncExec(() -> {
LinkedList<Item> items = new LinkedList<Item>();
getItems(items);
if (!items.isEmpty()) {
m_updateTask.doUpdate(m_display, items);
}
});
}
}
private synchronized void getItems(LinkedList<Item> items) {
Item item;
while (null != (item = m_queue.poll())) {
items.add(item);
}
m_updateScheduled.set(false);
}
}