00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kptrequestresourcespanel.h"
00021 #include "kpttask.h"
00022 #include "kptproject.h"
00023 #include "kptresource.h"
00024 #include "kptcalendar.h"
00025
00026 #include <kdebug.h>
00027 #include <kmessagebox.h>
00028 #include <klocale.h>
00029 #include <kptcommand.h>
00030
00031 #include <QPushButton>
00032 #include <QLineEdit>
00033 #include <QString>
00034 #include <QSpinBox>
00035 #include <qvalidator.h>
00036 #include <QComboBox>
00037 #include <QDateTime>
00038
00039 #include <qtablewidget.h>
00040
00041 #include <q3datetimeedit.h>
00042
00043 namespace KPlato
00044 {
00045
00046 ResourceTableItem::ResourceTableItem(Resource *resource, ResourceRequest *request, bool check) {
00047 m_resource = resource;
00048 m_request = request;
00049 m_checked = check;
00050 m_origChecked = check;
00051 m_checkitem = 0;
00052 m_units = 100;
00053 m_origUnits = 100;
00054
00055 }
00056
00057 ResourceTableItem::~ResourceTableItem() {
00058
00059 }
00060
00061 void ResourceTableItem::update() {
00062 if (m_checkitem)
00063 m_checked = m_checkitem->checkState() == Qt::Checked;
00064
00065 }
00066
00067 void ResourceTableItem::insert(QTableWidget *table, int row) {
00068
00069 m_checkitem = new QTableWidgetItem(m_resource->name());
00070 m_checkitem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
00071 m_checkitem->setCheckState(m_checked ? Qt::Checked : Qt::Unchecked);
00072 table->setItem(row, 0, m_checkitem);
00073
00074
00075 }
00076
00077 GroupLVItem::GroupLVItem(QTreeWidget *parent, ResourceGroup *group, Task &task)
00078 : QTreeWidgetItem(parent),
00079 m_group(group),
00080 m_units(0)
00081 {
00082 setText(0, group->name());
00083 setText(1, QString("%1").arg(group->units()));
00084
00085 m_request = task.resourceGroupRequest(group);
00086 if (m_request) {
00087 m_units = m_request->units();
00088 }
00089 foreach (Resource *r, group->resources()) {
00090
00091 ResourceRequest *req=0;
00092 if (m_request) {
00093 req = m_request->find(r);
00094 }
00095 m_resources.append(new ResourceTableItem(r, req, (bool)req));
00096 }
00097 }
00098
00099 GroupLVItem::~GroupLVItem() {
00100
00101
00102 while (!m_resources.isEmpty())
00103 delete m_resources.takeFirst();
00104 }
00105
00106 void GroupLVItem::update() {
00107 foreach (ResourceTableItem *i, m_resources) {
00108 i->update();
00109 }
00110 }
00111
00112 void GroupLVItem::insert(QTableWidget *table) {
00113
00114 table->clear();
00115 table->setColumnCount(1);
00116 if (m_group->numResources() == 0) {
00117 table->setRowCount(1);
00118 table->setItem(0, 0, new QTableWidgetItem(i18n("None")));
00119 } else {
00120 table->setRowCount(m_group->numResources());
00121 int i = 0;
00122 foreach (ResourceTableItem *r, m_resources) {
00123 r->insert(table, i++);
00124 }
00125 }
00126 }
00127
00128 int GroupLVItem::numRequests() {
00129
00130 int value = m_units;
00131 foreach (ResourceTableItem *r, m_resources) {
00132 value += r->numRequests();
00133 }
00134 return value;
00135 }
00136
00137 bool GroupLVItem::isNull() const {
00138
00139 foreach (ResourceTableItem *r, m_resources) {
00140 if (r->isChecked())
00141 return false;
00142 }
00143 if (m_units > 0)
00144 return false;
00145 return true;
00146 }
00147
00148 RequestResourcesPanel::RequestResourcesPanel(QWidget *parent, Task &task, bool baseline)
00149 : TaskResourcesPanelBase(parent),
00150 m_task(task),
00151 m_worktime(0),
00152 selectedGroup(0),
00153 m_blockChanged(false) {
00154
00155 Project *p = dynamic_cast<Project*>(task.projectNode());
00156 if (p) {
00157 m_worktime = p->standardWorktime();
00158 foreach (ResourceGroup *grp, p->resourceGroups()) {
00159 GroupLVItem *grpitem = new GroupLVItem(groupList, grp, task);
00160 groupList-> addTopLevelItem(grpitem);
00161
00162 }
00163 }
00164 QTreeWidgetItem *item = groupList->topLevelItem(0);
00165 if (item) {
00166 item->setSelected(true);
00167 groupChanged(item);
00168 }
00169
00170
00171
00172 connect(groupList, SIGNAL(itemSelectionChanged()), SLOT(groupChanged()));
00173 connect(resourceTable, SIGNAL(cellChanged(int, int)), SLOT(resourceChanged(int, int)));
00174
00175
00176 }
00177
00178 void RequestResourcesPanel::groupChanged() {
00179
00180 QTreeWidgetItem *item = 0;
00181 QList<QTreeWidgetItem*> lst = groupList->selectedItems();
00182 if (lst.count() > 0)
00183 item = lst.first();
00184 groupChanged(item);
00185 }
00186
00187 void RequestResourcesPanel::groupChanged(QTreeWidgetItem *item) {
00188
00189 GroupLVItem *grp = dynamic_cast<GroupLVItem *>(item);
00190 if (grp == 0)
00191 return;
00192
00193 if (selectedGroup) {
00194 selectedGroup->update();
00195 }
00196 selectedGroup = grp;
00197
00198
00199
00200
00201
00202 grp->insert(resourceTable);
00203 }
00204
00205 void RequestResourcesPanel::resourceChanged(int , int ) {
00206
00207 sendChanged();
00208 }
00209
00210 void RequestResourcesPanel::unitsChanged(int units) {
00211
00212 if (selectedGroup) {
00213 selectedGroup->m_units = units;
00214 sendChanged();
00215 }
00216 }
00217
00218 KCommand *RequestResourcesPanel::buildCommand(Part *part) {
00219
00220 KMacroCommand *cmd = 0;
00221 if (selectedGroup) {
00222 selectedGroup->update();
00223 }
00224 QTreeWidgetItem *item=0;
00225 for (int i = 0; (item = groupList->topLevelItem(i)) != 0; ++i) {
00226 GroupLVItem *grp = static_cast<GroupLVItem*>(item);
00227 foreach (ResourceTableItem *r, grp->resources()) {
00228 if (r->isChecked() != r->isOrigChecked()) {
00229 if (!cmd) cmd = new KMacroCommand("");
00230 if (r->isChecked()) {
00231 if (!grp->m_request) {
00232 grp->m_request = new ResourceGroupRequest(grp->m_group, grp->m_units);
00233 cmd->addCommand(new AddResourceGroupRequestCmd(part, m_task, grp->m_request));
00234 }
00235 cmd->addCommand(new AddResourceRequestCmd(part, grp->m_request, new ResourceRequest(r->resource(), r->units())));
00236
00237 continue;
00238 }
00239 if (grp->m_request && r->request()) {
00240 cmd->addCommand(new RemoveResourceRequestCmd(part, grp->m_request, r->request()));
00241 if (grp->isNull()) {
00242 cmd->addCommand(new RemoveResourceGroupRequestCmd(part, m_task, grp->m_request));
00243 }
00244 } else {
00245 kError()<<k_funcinfo<<"Remove failed"<<endl;
00246 }
00247 continue;
00248 }
00249 if (!r->isChecked()) {
00250 continue;
00251 }
00252 }
00253 }
00254 return cmd;
00255 }
00256
00257 bool RequestResourcesPanel::ok() {
00258 if (selectedGroup)
00259 selectedGroup->update();
00260 return true;
00261 }
00262
00263 void RequestResourcesPanel::sendChanged() {
00264 if (!m_blockChanged) emit changed();
00265 }
00266
00267 }
00268
00269 #include "kptrequestresourcespanel.moc"