00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kptresourcespanel.h"
00022 #include "kptproject.h"
00023 #include "kptresourcedialog.h"
00024 #include "kptcommand.h"
00025
00026 #include <kdebug.h>
00027 #include <kmessagebox.h>
00028 #include <klocale.h>
00029 #include <kabc/addressee.h>
00030 #include <kabc/addresseedialog.h>
00031
00032 #include <QGroupBox>
00033 #include <QHeaderView>
00034 #include <QListWidget>
00035 #include <QLineEdit>
00036 #include <QPushButton>
00037 #include <QList>
00038
00040
00041 namespace KPlato
00042 {
00043
00044 class GroupItem;
00045 class ResourcesPanelGroupLVItem;
00046 class ResourcesPanelResourceItem;
00047 class Part;
00048
00049 class ResourcesPanelResourceItem {
00050 public:
00051 enum State {None, Modified, New};
00052
00053 ResourcesPanelResourceItem(Resource *res, State state = None)
00054 : m_originalResource(0),
00055 m_state(state) {
00056 if (state == New) {
00057 m_resource = res;
00058 } else {
00059 m_originalResource = res;
00060 m_resource = new Resource(res);
00061 }
00062
00063 }
00064 ~ResourcesPanelResourceItem() {
00065
00066 delete m_resource;
00067 }
00068 void setState(State s) {
00069 if (m_state == New)
00070 return;
00071 m_state = s;
00072 }
00073 QString name() { return m_resource->name(); }
00074 void setName(const QString &newName) {
00075 m_resource->setName(newName);
00076 setState(Modified);
00077 }
00078 Resource *takeResource() {
00079 Resource *r = m_resource;
00080 m_resource = 0;
00081 return r;
00082 }
00083 KCommand *saveResource(Part *part, ResourceGroup *group);
00084
00085 Resource *m_originalResource;
00086 Resource *m_resource;
00087 State m_state;
00088 };
00089 KCommand *ResourcesPanelResourceItem::saveResource(Part *part, ResourceGroup *group) {
00090 KMacroCommand *m=0;
00091 if (m_state == New) {
00092
00093 if (!m) m = new KMacroCommand("Add resource");
00094 m->addCommand(new AddResourceCmd(part, group, takeResource()));
00095 } else if (m_state == Modified) {
00096
00097 KCommand *cmd = ResourceDialog::buildCommand(m_originalResource, *m_resource, part);
00098 if (cmd) {
00099 if (!m) m = new KMacroCommand("Modify resource");
00100 m->addCommand(cmd);
00101 }
00102 }
00103 return m;
00104 }
00105
00106 class ResourceLBItem : public QListWidgetItem {
00107 public:
00108 ResourceLBItem(ResourcesPanelResourceItem *item) {
00109 m_resourceItem = item; setText(item->name());
00110 }
00111 QString name() { return m_resourceItem->name(); }
00112 void setName(const QString &newName) {
00113 setText(newName);
00114 m_resourceItem->setName(newName);
00115 }
00116
00117 ResourcesPanelResourceItem *m_resourceItem;
00118 };
00119
00120
00121
00122 class GroupItem {
00123 public:
00124 enum State {None=0, Modified=1, New=2};
00125
00126 GroupItem(ResourceGroup *group, State state = None) {
00127 m_group = group;
00128 m_name = group->name();
00129 m_state = state;
00130
00131 }
00132 ~GroupItem() {
00133
00134 if (m_state & New) {
00135 delete m_group;
00136 }
00137 while (!m_resourceItems.isEmpty())
00138 delete m_resourceItems.takeFirst();
00139
00140 while (!m_deletedItems.isEmpty())
00141 delete m_deletedItems.takeFirst();
00142 }
00143 void setState(State s) { m_state |= s; }
00144 void setName(const QString &newName) {
00145 m_name = newName;
00146 if (m_state & New)
00147 m_group->setName(newName);
00148 setState(Modified);
00149
00150 }
00151 void addResource(ResourcesPanelResourceItem *item) {
00152
00153 m_resourceItems.append(item);
00154 }
00155 void deleteResource(ResourcesPanelResourceItem *item) {
00156
00157 if (item == 0)
00158 return;
00159 int i = m_resourceItems.indexOf(item);
00160 if (i != -1)
00161 m_resourceItems.removeAt(i);
00162 if (item->m_state == ResourcesPanelResourceItem::New)
00163 delete item;
00164 else
00165 m_deletedItems.append(item);
00166
00167 }
00168 ResourceGroup *takeGroup() {
00169
00170 ResourceGroup *g = m_group;
00171 m_group = 0;
00172 return g;
00173 }
00174 void saveResources() {
00175 while (!m_resourceItems.isEmpty()) {
00176 ResourcesPanelResourceItem *item = m_resourceItems.takeFirst();
00177
00178 m_group->addResource(item->takeResource(), 0);
00179 delete item;
00180 }
00181 }
00182 ResourceGroup *m_group;
00183 QString m_name;
00184 QList<ResourcesPanelResourceItem*> m_resourceItems;
00185 QList<ResourcesPanelResourceItem*> m_deletedItems;
00186 int m_state;
00187 };
00188
00189 class ResourcesPanelGroupLVItem : public QTreeWidgetItem {
00190 public:
00191 ResourcesPanelGroupLVItem(ResourcesPanel &pan, QTreeWidget *lv, GroupItem *item)
00192 : QTreeWidgetItem(lv),
00193 m_group(item),
00194 panel(pan) {
00195
00196 setText(0, item->m_name);
00197 setFlags(flags() | Qt::ItemIsEditable);
00198
00199 }
00200 ~ResourcesPanelGroupLVItem() {
00201
00202 }
00203 void setName(const QString &newName) {
00204 setText(0, newName);
00205 m_group->setName(newName);
00206 }
00207 void deleteGroup() {
00208 delete m_group;
00209 m_group = 0;
00210 }
00211 GroupItem *takeGroup() {
00212
00213 GroupItem *g = m_group;
00214 m_group = 0;
00215 return g;
00216 }
00217 GroupItem *m_group;
00218 ResourcesPanel &panel;
00219 QString oldText;
00220
00221 };
00222
00224
00225 ResourcesPanel::ResourcesPanel(QWidget *parent, Project *p) : ResourcesPanelBase(parent) {
00226 project = p;
00227 m_groupItem = 0;
00228
00229 bEditResource->setEnabled(false);
00230 bRemoveResource->setEnabled(false);
00231
00232 listOfGroups->setHeaderLabel(i18n("Group"));
00233 listOfGroups->header()->setStretchLastSection(true);
00234 listOfGroups->setSortingEnabled(true);
00235 listOfGroups->setSelectionMode(QAbstractItemView::SingleSelection);
00236
00237 bAdd->setEnabled(true);
00238
00239
00240 foreach (ResourceGroup *grp, project->resourceGroups()) {
00241 GroupItem *groupItem = new GroupItem(grp);
00242
00243 foreach (Resource *res, grp->resources()) {
00244 ResourcesPanelResourceItem *ritem = new ResourcesPanelResourceItem(res);
00245 groupItem->addResource(ritem);
00246
00247 }
00248 m_groupItems.append(groupItem);
00249 new ResourcesPanelGroupLVItem(*this, listOfGroups, groupItem);
00250 }
00251 if (listOfGroups->topLevelItemCount() > 0)
00252 listOfGroups->topLevelItem(0)->setSelected(true);
00253
00254 slotGroupSelectionChanged();
00255
00256 connect(bAdd, SIGNAL(clicked()), SLOT(slotAddGroup()));
00257 connect(bRemove, SIGNAL(clicked()), SLOT(slotDeleteGroup()));
00258 connect(listOfGroups, SIGNAL(itemSelectionChanged()), SLOT(slotGroupSelectionChanged()));
00259
00260 connect(bAddResource, SIGNAL( clicked() ), this, SLOT ( slotAddResource() ));
00261 connect(bEditResource, SIGNAL( clicked() ), this, SLOT ( slotEditResource() ));
00262 connect(bRemoveResource, SIGNAL( clicked() ), this, SLOT ( slotDeleteResource() ));
00263 connect(listOfResources, SIGNAL(itemSelectionChanged()), SLOT(slotResourceChanged()));
00264 connect(listOfResources, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), SLOT(slotCurrentChanged(QListWidgetItem*, QListWidgetItem*)));
00265
00266 connect(listOfGroups, SIGNAL(itemChanged(QTreeWidgetItem*, int)), SLOT(slotGroupChanged(QTreeWidgetItem*, int)));
00267
00268 }
00269
00270 ResourcesPanel::~ResourcesPanel()
00271 {
00272 while (!m_groupItems.isEmpty())
00273 delete m_groupItems.takeFirst();
00274 while (!m_deletedGroupItems.isEmpty())
00275 delete m_deletedGroupItems.takeFirst();
00276 }
00277
00278 void ResourcesPanel::slotAddGroup() {
00279
00280 listOfGroups->clearSelection();
00281 ResourceGroup *r = new ResourceGroup(project);
00282 GroupItem *gitem = new GroupItem(r, GroupItem::New);
00283 m_groupItems.append(gitem);
00284 ResourcesPanelGroupLVItem *groupItem = new ResourcesPanelGroupLVItem(*this, listOfGroups, gitem);
00285 groupItem->setSelected(true);
00286 listOfGroups->editItem(groupItem);
00287 }
00288
00289 void ResourcesPanel::slotDeleteGroup() {
00290
00291 QList<QTreeWidgetItem*> lst = listOfGroups->selectedItems();
00292 foreach (QTreeWidgetItem *i, lst) {
00293 listOfResources->clear();
00294 listOfGroups->takeTopLevelItem(listOfGroups->indexOfTopLevelItem(i));
00295 ResourcesPanelGroupLVItem *groupLVItem = static_cast<ResourcesPanelGroupLVItem*>(i);
00296 m_groupItems.takeAt(m_groupItems.indexOf(groupLVItem->m_group));
00297 m_deletedGroupItems.append(groupLVItem->takeGroup());
00298
00299
00300
00301 delete groupLVItem;
00302 }
00303 emit changed();
00304 }
00305
00306 void ResourcesPanel::slotAddResource() {
00307 if (!m_groupItem) {
00308 KMessageBox::sorry(this, i18n("Resources belong to resource groups, select the group first to add a new resource to"));
00309 return;
00310 }
00311 listOfResources->clearSelection();
00312 Resource *r = new Resource(project);
00313 ResourceDialog *dia = new ResourceDialog(*project, r);
00314 if (dia->exec()) {
00315 KCommand *cmd = dia->buildCommand();
00316 if (cmd) {
00317 cmd->execute();
00318 delete cmd;
00319 }
00320 ResourcesPanelResourceItem *resourceItem = new ResourcesPanelResourceItem(r, ResourcesPanelResourceItem::New);
00321 m_groupItem->m_group->addResource(resourceItem);
00322 ResourceLBItem *item = new ResourceLBItem(resourceItem);
00323 listOfResources->addItem(item);
00324 item->setSelected(true);
00325 emit changed();
00326
00327 } else {
00328 delete r;
00329 }
00330 delete dia;
00331 }
00332
00333 void ResourcesPanel::slotEditResource() {
00334
00335 QList<QListWidgetItem*> lst = listOfResources->selectedItems();
00336 if (lst.isEmpty()) {
00337 return;
00338 }
00339 ResourceLBItem *item = static_cast<ResourceLBItem*>(lst[0]);
00340 Resource *r = item->m_resourceItem->m_resource;
00341 ResourceDialog *dia = new ResourceDialog(*project, r);
00342 if (dia->exec()) {
00343 KCommand *cmd = dia->buildCommand();
00344 if (cmd) {
00345 cmd->execute();
00346 delete cmd;
00347 }
00348 item->m_resourceItem->setState(ResourcesPanelResourceItem::Modified);
00349 item->setName(r->name());
00350 emit changed();
00351 }
00352 delete dia;
00353 }
00354
00355 void ResourcesPanel::slotDeleteResource() {
00356
00357 QList<QListWidgetItem*> lst = listOfResources->selectedItems();
00358 if (lst.isEmpty()) {
00359 return;
00360 }
00361 ResourceLBItem *item = static_cast<ResourceLBItem*>(lst[0]);
00362
00363 if(m_groupItem == 0) return;
00364
00365 m_groupItem->m_group->deleteResource(item->m_resourceItem);
00366 listOfResources->takeItem(listOfResources->row(lst[0]));
00367
00368 emit changed();
00369 }
00370
00371
00372 void ResourcesPanel::slotResourceChanged() {
00373 QList<QListWidgetItem*> lst = listOfResources->selectedItems();
00374 if (listOfResources->selectedItems().count() == 0) {
00375 bEditResource->setEnabled(false);
00376 bRemoveResource->setEnabled(false);
00377 return;
00378 }
00379 bEditResource->setEnabled(true);
00380 bRemoveResource->setEnabled(true);
00381 }
00382
00383
00384 void ResourcesPanel::slotCurrentChanged(QListWidgetItem *curr, QListWidgetItem* prev) {
00385 if (curr && !curr->isSelected()) {
00386 curr->setSelected(true);
00387 }
00388 }
00389
00390 bool ResourcesPanel::ok() {
00391 return true;
00392 }
00393
00394 KCommand *ResourcesPanel::buildCommand(Part *part) {
00395 KMacroCommand *m=0;
00396 GroupItem *gitem;
00397
00398 QString cmdName = "Modify resourcegroups";
00399 foreach (GroupItem *gitem, m_deletedGroupItems) {
00400 if (!(gitem->m_state & GroupItem::New)) {
00401 if (!m) m = new KMacroCommand(cmdName);
00402
00403 m->addCommand(new RemoveResourceGroupCmd(part, gitem->takeGroup()));
00404 }
00405 }
00406 foreach (GroupItem *gitem, m_groupItems) {
00407
00408
00409 foreach (ResourcesPanelResourceItem *ditem, gitem->m_deletedItems) {
00410 if (!m) m = new KMacroCommand(cmdName);
00411
00412 m->addCommand(new RemoveResourceCmd(part, gitem->m_group, ditem->m_originalResource));
00413 }
00414
00415 if (gitem->m_state & GroupItem::New) {
00416 if (!m) m = new KMacroCommand(cmdName);
00417
00418 gitem->saveResources();
00419 m->addCommand(new AddResourceGroupCmd(part, gitem->takeGroup()));
00420 continue;
00421 }
00422 ResourceGroup *rg = gitem->takeGroup();
00423 if (gitem->m_state & GroupItem::Modified) {
00424 if (gitem->m_name != rg->name()) {
00425 if (!m) m = new KMacroCommand(cmdName);
00426
00427 m->addCommand(new ModifyResourceGroupNameCmd(part, rg, gitem->m_name));
00428 }
00429 }
00430 foreach (ResourcesPanelResourceItem *item, gitem->m_resourceItems) {
00431 KCommand *cmd = item->saveResource(part, rg);
00432 if (cmd) {
00433 if (!m) m = new KMacroCommand(cmdName);
00434 m->addCommand(cmd);
00435 }
00436 }
00437 }
00438 return m;
00439 }
00440
00441 void ResourcesPanel::slotGroupChanged(QTreeWidgetItem *ci, int col) {
00442 if (ci == 0)
00443 return;
00444
00445 ResourcesPanelGroupLVItem *item = static_cast<ResourcesPanelGroupLVItem*>(ci);
00446 item->setName(item->text(0));
00447 emit changed();
00448 }
00449
00450 void ResourcesPanel::slotGroupSelectionChanged() {
00451 QList<QTreeWidgetItem*> lst = listOfGroups->selectedItems();
00452 QTreeWidgetItem *i = 0;
00453 if (lst.count() > 0)
00454 i = lst[0];
00455 slotGroupSelectionChanged(i);
00456 }
00457
00458 void ResourcesPanel::slotGroupSelectionChanged(QTreeWidgetItem *itm) {
00459 ResourcesPanelGroupLVItem *item = static_cast<ResourcesPanelGroupLVItem*>(itm);
00460 if (!item) {
00461 bAdd->setEnabled(true);
00462 bRemove->setEnabled(false);
00463 listOfResources->clear();
00464 resourceGroupBox->setEnabled(false);
00465 return;
00466 }
00467 m_groupItem = item;
00468 listOfResources->clear();
00469
00470 foreach (ResourcesPanelResourceItem *i, m_groupItem->m_group->m_resourceItems) {
00471 listOfResources->addItem(new ResourceLBItem(i));
00472
00473 }
00474 bAdd->setEnabled(true);
00475 bRemove->setEnabled(true);
00476 slotResourceChanged();
00477 resourceGroupBox->setEnabled(true);
00478 }
00479
00480 }
00481
00482 #include "kptresourcespanel.moc"