/* GanttProject is an opensource project management tool. Copyright (C) 2002-2011 Dmitry Barashev, GanttProject Team 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 3 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. */ package net.sourceforge.ganttproject.action.task; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import net.sourceforge.ganttproject.GanttTree2; import net.sourceforge.ganttproject.action.ActionDelegate; import net.sourceforge.ganttproject.action.ActionStateChangedListener; import net.sourceforge.ganttproject.action.GPAction; import net.sourceforge.ganttproject.gui.TaskTreeUIFacade; import net.sourceforge.ganttproject.gui.UIFacade; import net.sourceforge.ganttproject.task.Task; import net.sourceforge.ganttproject.task.TaskContainmentHierarchyFacade; import net.sourceforge.ganttproject.task.TaskManager; import net.sourceforge.ganttproject.task.TaskSelectionManager; import net.sourceforge.ganttproject.task.dependency.TaskDependencyException; public abstract class TaskActionBase extends GPAction implements TaskSelectionManager.Listener, ActionDelegate { private final List<ActionStateChangedListener> myListeners = new ArrayList<ActionStateChangedListener>(); private final TaskManager myTaskManager; private final UIFacade myUIFacade; private final TaskSelectionManager mySelectionManager; private final GanttTree2 myTree; private List<Task> mySelection; protected TaskActionBase(String name, TaskManager taskManager, TaskSelectionManager selectionManager, UIFacade uiFacade, GanttTree2 tree) { this(name, taskManager, selectionManager, uiFacade, tree, IconSize.MENU); } protected TaskActionBase(String name, TaskManager taskManager, TaskSelectionManager selectionManager, UIFacade uiFacade, GanttTree2 tree, IconSize size) { super(name, size); myTaskManager = taskManager; mySelectionManager = selectionManager; myUIFacade = uiFacade; myTree = tree; selectionManager.addSelectionListener(this); selectionChanged(selectionManager.getSelectedTasks()); } @Override public void addStateChangedListener(ActionStateChangedListener l) { myListeners.add(l); } @Override public void actionPerformed(ActionEvent e) { final List<Task> selection = new ArrayList<Task>(mySelection); Collections.sort(selection, new Comparator<Task>() { private final TaskContainmentHierarchyFacade myTaskHierarchy = getTaskManager().getTaskHierarchy(); @Override public int compare(Task o1, Task o2) { return myTaskHierarchy.compareDocumentOrder(o1, o2); } }); if (isEnabled() && askUserPermission(selection)) { myUIFacade.getUndoManager().undoableEdit(getLocalizedDescription(), new Runnable() { @Override public void run() { try { TaskActionBase.this.run(selection); } catch (Exception e) { getUIFacade().showErrorDialog(e); } } }); } } /** * @param selection * of tasks for which permission is required * @return true if the operation is accepted by the user */ protected boolean askUserPermission(List<Task> selection) { // Accept operation by default return true; } @Override public void selectionChanged(List<Task> currentSelection) { setEnabled(isEnabled(currentSelection)); mySelection = currentSelection; } @Override public void setEnabled(boolean newValue) { super.setEnabled(newValue); for (ActionStateChangedListener l : myListeners) { l.actionStateChanged(); } } @Override public void userInputConsumerChanged(Object newConsumer) { } protected TaskManager getTaskManager() { return myTaskManager; } protected TaskSelectionManager getSelectionManager() { return mySelectionManager; } protected UIFacade getUIFacade() { return myUIFacade; } protected GanttTree2 getTree() { return myTree; } protected TaskTreeUIFacade getTreeFacade() { return myTree; } protected void forwardScheduling() throws TaskDependencyException { // TODO 07 Sep 2011: It does seem necessary to reset() the charts: remove if // this indeed is the case // // TODO Find out which chart is opened and only reset that one (maybe add // a resetChart to UIFacade?) // myUIFacade.getGanttChart().reset(); // myUIFacade.getResourceChart().reset(); myTaskManager.getAlgorithmCollection().getRecalculateTaskScheduleAlgorithm().run(); getUIFacade().getTaskTree().getTreeComponent().repaint(); } protected abstract boolean isEnabled(List<Task> selection); protected abstract void run(List<Task> selection) throws Exception; }