/* * TaskListModel.java * * Copyright (C) 2010 Leo Osvald <leo.osvald@gmail.com> * * This file is part of SGLJ. * * SGLJ 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. * * SGLJ 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. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see <http://www.gnu.org/licenses/>. */ package org.sglj.swing.task; import java.util.List; import javax.swing.AbstractListModel; import javax.swing.SwingUtilities; import org.sglj.task.Task; import org.sglj.task.TaskEvent; import org.sglj.task.TaskManager; import org.sglj.task.TaskManagerListener; import org.sglj.util.AmortizedRandomAccessQueue; /** * Model for {@link TaskList}. * * @author Leo Osvald * @version 0.76 */ public class TaskListModel extends AbstractListModel implements TaskManagerListener { private TaskManager taskManager; private List<Task> list = new AmortizedRandomAccessQueue<Task>(); private static final long serialVersionUID = 1L; public TaskListModel(TaskManager taskManager) { setTaskManager(taskManager); } @Override public Task getElementAt(int index) { return list.get(index); } @Override public int getSize() { return list.size(); } @Override public void taskAdded(TaskEvent e) { // pd("TASK ADDED: "+e.getTask()); list.add(e.getTask()); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { fireIntervalAdded(1, list.size()-1, list.size()-1); } }); } @Override public void taskRemoved(final TaskEvent e) { // pd("TASK REMOVED: "+e.getTask()); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { int index = indexOf(e.getTask()); if(index == -1) return ; list.remove(index); fireIntervalRemoved(this, index, index); } }); } @Override public void taskStateChanged(TaskEvent e) { } @Override public void taskStatusChanged(TaskEvent e) { } @Override public void taskUpdated(final TaskEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { int index = indexOf(e.getTask()); fireContentsChanged(this, index, index); } }); } public TaskManager getTaskManager() { return taskManager; } public void setTaskManager(TaskManager taskManager) { fireIntervalRemoved(this, 0, list.size()-1); list.clear(); if(this.taskManager != null) this.taskManager.removeTaskManagerListener(this); this.taskManager = taskManager; if(taskManager != null) { taskManager.addTaskManagerListener(this); list.addAll(taskManager.getTasks()); fireIntervalAdded(this, 0, list.size()); } } /** * Returns the position of the specified task in this list model. * @param task task which position is queried * @return the position of the task or -1 if task is not found in the list */ private int indexOf(Task task) { int ind = 0; for(Task t : list) { if(t == task) return ind; ++ind; } return -1; } // private void pd(String msg) { // System.out.println(msg); // } }