00001 #include "taskremover.h"
00002
00003 #include <controldata.h>
00004 #include <models/taskmodel.h>
00005
00006 #include <domain/taskmanagerdata.h>
00007 #include <domain/dependentdataexception.h>
00008 #include <domain/task.h>
00009
00010 #include <tools/invaliddataexception.h>
00011 #include <tools/functions.h>
00012 #include <tools/stringexception.h>
00013
00014 #include <QDebug>
00015
00016 using namespace control;
00017
00018
00019 ControllerInterface::ActionType TaskRemover::actionType() const
00020 {
00021 return RemoveAction;
00022 }
00023
00024 ControllerInterface::DataType TaskRemover::dataType() const
00025 {
00026 return TaskData;
00027 }
00028
00029 QString TaskRemover::description() const
00030 {
00031 return "Remove task";
00032 }
00033
00034 bool TaskRemover::userIsValid() const
00035 {
00036 return userHasLoggedIn() && !userIsAdmin();
00037 }
00038
00039 void TaskRemover::execute(const domain::StorableData* data)
00040 {
00041 const domain::Task* task = qobject_cast<const domain::Task*>(data);
00042
00043 if (task == 0)
00044 throw tools::InvalidDataException("Given data is not a task.");
00045
00046 int size = task->superTasks().size();
00047 while (!task->superTasks().isEmpty())
00048 {
00049 execute(task->superTasks().first());
00050 int newSize = task->superTasks().size();
00051 Q_ASSERT(newSize < size);
00052 size = newSize;
00053 }
00054
00055 this->data->removeData(task);
00056 }
00057
00058 void TaskRemover::execute()
00059 {
00060 QList<domain::Task*> tasksForUser = data->tasksForUser(user());
00061
00062 TaskModel tasks(data, tools::makeConstList(tasksForUser));
00063 data::SelectionData selectedTasks = ui->getSelection("Select a task", &tasks);
00064
00065 if (!selectedTasks.processData)
00066 return;
00067
00068 if (selectedTasks.selection.isEmpty())
00069 {
00070 ui->showWarning("No task selected.");
00071 return;
00072 }
00073
00074 Q_ASSERT(selectedTasks.selection.count() == 1);
00075
00076 const domain::Task* task =
00077 tasks.taskForIndex(selectedTasks.selection.first());
00078
00079 if (!task->superTasks().isEmpty())
00080 {
00081 TaskModel superTasks(data, task->allSuperTasks());
00082 QString before = "The selected task has the following depending tasks.";
00083 QString after = "Do you want to delete them all?";
00084
00085 if (!ui->askQuestion(before, &superTasks, after))
00086 {
00087 QList<domain::Task*> removedSuperTasks;
00088
00089 Q_FOREACH (const domain::Task* constSuperTask, task->superTasks())
00090 {
00091 try
00092 {
00093 domain::Task* superTask = this->data->task(constSuperTask);
00094 superTask->removeSubTask(this->data->task(task));
00095 removedSuperTasks << superTask;
00096 }
00097 catch (tools::StringException& e)
00098 {
00099 Q_FOREACH (domain::Task* superTask, removedSuperTasks)
00100 superTask->addSubTask(this->data->task(task));
00101
00102 ui->showError(QString("Unable to remove link with one of the "
00103 "super tasks:\n%1").arg(e.message()));
00104
00105 return;
00106 }
00107 }
00108 }
00109 }
00110
00111 execute(task);
00112 }
00113
00114 QString TaskRemover::name() const
00115 {
00116 return "TaskRemover";
00117 }
00118
00119 Q_EXPORT_PLUGIN2(controller_taskremover, TaskRemover)
00120