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 <klistview.h>
00028 #include <kmessagebox.h>
00029 #include <klocale.h>
00030 #include <kabc/addressee.h>
00031 #include <kabc/addresseedialog.h>
00032
00033 #include <qgroupbox.h>
00034 #include <qheader.h>
00035 #include <qlistbox.h>
00036 #include <qlineedit.h>
00037 #include <qlistview.h>
00038 #include <qpushbutton.h>
00039
00041
00042 namespace KPlato
00043 {
00044
00045 class GroupItem;
00046 class ResourcesPanelGroupLVItem;
00047 class ResourcesPanelResourceItem;
00048 class Part;
00049
00050 class ResourcesPanelResourceItem {
00051 public:
00052 enum State {None, Modified, New};
00053
00054 ResourcesPanelResourceItem(Resource *res, State state = None)
00055 : m_originalResource(0),
00056 m_state(state) {
00057 if (state == New) {
00058 m_resource = res;
00059 } else {
00060 m_originalResource = res;
00061 m_resource = new Resource(res);
00062 }
00063
00064 }
00065 ~ResourcesPanelResourceItem() {
00066
00067 delete m_resource;
00068 }
00069 void setState(State s) {
00070 if (m_state == New)
00071 return;
00072 m_state = s;
00073 }
00074 QString name() { return m_resource->name(); }
00075 void setName(const QString &newName) {
00076 m_resource->setName(newName);
00077 setState(Modified);
00078 }
00079 Resource *takeResource() {
00080 Resource *r = m_resource;
00081 m_resource = 0;
00082 return r;
00083 }
00084 KCommand *saveResource(Part *part, ResourceGroup *group);
00085
00086 Resource *m_originalResource;
00087 Resource *m_resource;
00088 State m_state;
00089 };
00090 KCommand *ResourcesPanelResourceItem::saveResource(Part *part, ResourceGroup *group) {
00091 KMacroCommand *m=0;
00092 if (m_state == New) {
00093
00094 if (!m) m = new KMacroCommand("Add resource");
00095 m->addCommand(new AddResourceCmd(part, group, takeResource()));
00096 } else if (m_state == Modified) {
00097
00098 KCommand *cmd = ResourceDialog::buildCommand(m_originalResource, *m_resource, part);
00099 if (cmd) {
00100 if (!m) m = new KMacroCommand("Modify resource");
00101 m->addCommand(cmd);
00102 }
00103 }
00104 return m;
00105 }
00106
00107 class ResourceLBItem : public QListBoxText {
00108 public:
00109 ResourceLBItem(ResourcesPanelResourceItem *item) {
00110 m_resourceItem = item; setText(item->name());
00111 }
00112 QString name() { return m_resourceItem->name(); }
00113 void setName(const QString &newName) {
00114 setText(newName);
00115 m_resourceItem->setName(newName);
00116 }
00117
00118 ResourcesPanelResourceItem *m_resourceItem;
00119 };
00120
00121
00122
00123 class GroupItem {
00124 public:
00125 enum State {None=0, Modified=1, New=2};
00126
00127 GroupItem(ResourceGroup *group, State state = None) {
00128 m_group = group;
00129 m_name = group->name();
00130 m_state = state;
00131 m_resourceItems.setAutoDelete(true);
00132 m_deletedItems.setAutoDelete(true);
00133
00134 }
00135 ~GroupItem() {
00136
00137 if (m_state & New) {
00138 delete m_group;
00139 }
00140 }
00141 void setState(State s) { m_state |= s; }
00142 void setName(const QString &newName) {
00143 m_name = newName;
00144 if (m_state & New)
00145 m_group->setName(newName);
00146 setState(Modified);
00147
00148 }
00149 void addResource(ResourcesPanelResourceItem *item) {
00150
00151 m_resourceItems.append(item);
00152 }
00153 void deleteResource(ResourcesPanelResourceItem *item) {
00154
00155 m_resourceItems.take(m_resourceItems.findRef(item));
00156 if (item->m_state == ResourcesPanelResourceItem::New)
00157 delete item;
00158 else
00159 m_deletedItems.append(item);
00160
00161 }
00162 ResourceGroup *takeGroup() {
00163
00164 ResourceGroup *g = m_group;
00165 m_group = 0;
00166 return g;
00167 }
00168 void saveResources() {
00169 ResourcesPanelResourceItem *item = m_resourceItems.first();
00170 while ((item = m_resourceItems.take())) {
00171
00172 m_group->addResource(item->takeResource(), 0);
00173 delete item;
00174 }
00175 }
00176 ResourceGroup *m_group;
00177 QString m_name;
00178 QPtrList<ResourcesPanelResourceItem> m_resourceItems;
00179 QPtrList<ResourcesPanelResourceItem> m_deletedItems;
00180 int m_state;
00181 };
00182
00183 class ResourcesPanelGroupLVItem : public KListViewItem {
00184 public:
00185 ResourcesPanelGroupLVItem(ResourcesPanel &pan, KListView *lv, GroupItem *item)
00186 : KListViewItem(lv, item->m_name),
00187 m_group(item),
00188 panel(pan) {
00189
00190 setRenameEnabled(0, false);
00191
00192 }
00193 ~ResourcesPanelGroupLVItem() {
00194
00195 }
00196 void setName(const QString &newName) {
00197 setText(0, newName);
00198 m_group->setName(newName);
00199 }
00200 void deleteGroup() {
00201 delete m_group;
00202 m_group = 0;
00203 }
00204 GroupItem *takeGroup() {
00205
00206 GroupItem *g = m_group;
00207 m_group = 0;
00208 return g;
00209 }
00210 GroupItem *m_group;
00211 ResourcesPanel &panel;
00212 QString oldText;
00213
00214 protected:
00215 virtual void cancelRename(int col) {
00216
00217 if (col == 0 && oldText.isEmpty()){
00218 return;
00219 }
00220 panel.renameStopped(this);
00221 KListViewItem::cancelRename(col);
00222 setRenameEnabled(col, false);
00223 }
00224 };
00225
00227
00228 ResourcesPanel::ResourcesPanel(QWidget *parent, Project *p) : ResourcesPanelBase(parent) {
00229 project = p;
00230 m_groupItem = 0;
00231 m_blockResourceRename = false;
00232 m_renameItem = 0;
00233
00234 bEditResource->setEnabled(false);
00235 bRemoveResource->setEnabled(false);
00236 resourceName->setEnabled(false);
00237
00238 listOfGroups->header()->setStretchEnabled(true, 0);
00239 listOfGroups->setSorting(0);
00240 listOfGroups->setShowSortIndicator(true);
00241 listOfGroups->setDefaultRenameAction (QListView::Accept);
00242 bAdd->setEnabled(true);
00243
00244 m_groupItems.setAutoDelete(true);
00245 m_deletedGroupItems.setAutoDelete(true);
00246
00247 QPtrListIterator<ResourceGroup> git(project->resourceGroups());
00248 for(; git.current(); ++git) {
00249 ResourceGroup *grp = git.current();
00250 GroupItem *groupItem = new GroupItem(grp);
00251
00252 QPtrListIterator<Resource> rit(grp->resources());
00253 for(; rit.current(); ++rit) {
00254 Resource *res = rit.current();
00255 ResourcesPanelResourceItem *ritem = new ResourcesPanelResourceItem(res);
00256 groupItem->addResource(ritem);
00257
00258 }
00259 m_groupItems.append(groupItem);
00260 new ResourcesPanelGroupLVItem(*this, listOfGroups, groupItem);
00261 }
00262 listOfGroups->setSelected(listOfGroups->firstChild(), true);
00263 slotGroupChanged();
00264
00265 connect(bAdd, SIGNAL(clicked()), SLOT(slotAddGroup()));
00266 connect(bRemove, SIGNAL(clicked()), SLOT(slotDeleteGroup()));
00267 connect(listOfGroups, SIGNAL(selectionChanged()), SLOT(slotGroupChanged()));
00268 connect(listOfGroups, SIGNAL(doubleClicked(QListViewItem*, const QPoint&, int)), SLOT(slotListDoubleClicked(QListViewItem*, const QPoint&, int)));
00269 connect(listOfGroups, SIGNAL(itemRenamed(QListViewItem*, int)), SLOT(slotItemRenamed(QListViewItem*, int)));
00270
00271 connect(bAddResource, SIGNAL( clicked() ), this, SLOT ( slotAddResource() ));
00272 connect(bEditResource, SIGNAL( clicked() ), this, SLOT ( slotEditResource() ));
00273 connect(bRemoveResource, SIGNAL( clicked() ), this, SLOT ( slotDeleteResource() ));
00274 connect(listOfResources, SIGNAL(selectionChanged(QListBoxItem*)), SLOT(slotResourceChanged(QListBoxItem*)));
00275 connect(listOfResources, SIGNAL(currentChanged(QListBoxItem*)), SLOT(slotCurrentChanged(QListBoxItem*)));
00276 connect(resourceName, SIGNAL(textChanged(const QString&)), SLOT(slotResourceRename(const QString&)));
00277
00278
00279
00280
00281 connect(this, SIGNAL(renameStarted(QListViewItem*, int)), SLOT(slotRenameStarted(QListViewItem*, int)));
00282 connect(this, SIGNAL(startRename(QListViewItem*, int)), SLOT(slotStartRename(QListViewItem*, int)));
00283 connect(this, SIGNAL(selectionChanged()), SLOT(slotGroupChanged()));
00284 }
00285
00286 void ResourcesPanel::slotAddGroup() {
00287
00288 ResourceGroup *r = new ResourceGroup(project);
00289 GroupItem *gitem = new GroupItem(r, GroupItem::New);
00290 m_groupItems.append(gitem);
00291 ResourcesPanelGroupLVItem *groupItem = new ResourcesPanelGroupLVItem(*this, listOfGroups, gitem);
00292
00293 slotListDoubleClicked(groupItem, QPoint(), 0);
00294 }
00295
00296 void ResourcesPanel::slotDeleteGroup() {
00297
00298 ResourcesPanelGroupLVItem *groupLVItem = dynamic_cast<ResourcesPanelGroupLVItem*> (listOfGroups->selectedItem());
00299 if (groupLVItem == 0)
00300 return;
00301
00302 listOfResources->clear();
00303
00304 listOfGroups->takeItem(groupLVItem);
00305 m_groupItems.take(m_groupItems.findRef(groupLVItem->m_group));
00306 m_deletedGroupItems.append(groupLVItem->takeGroup());
00307
00308
00309
00310 delete groupLVItem;
00311 emit changed();
00312 }
00313
00314 void ResourcesPanel::slotAddResource() {
00315 if (!m_groupItem) {
00316 KMessageBox::sorry(this, i18n("Resources belong to resource groups, select the group first to add a new resource to"));
00317 return;
00318 }
00319 listOfResources->setSelected(listOfResources->selectedItem(), false);
00320 Resource *r = new Resource(project);
00321 ResourceDialog *dia = new ResourceDialog(*project, r);
00322 if (dia->exec()) {
00323 KCommand *cmd = dia->buildCommand();
00324 if (cmd) {
00325 cmd->execute();
00326 delete cmd;
00327 }
00328 ResourcesPanelResourceItem *resourceItem = new ResourcesPanelResourceItem(r, ResourcesPanelResourceItem::New);
00329 m_groupItem->m_group->addResource(resourceItem);
00330 ResourceLBItem *item = new ResourceLBItem(resourceItem);
00331 listOfResources->insertItem(item);
00332 resourceName->clear();
00333 listOfResources->setSelected(item, true);
00334 emit changed();
00335
00336 } else {
00337 delete r;
00338 }
00339 delete dia;
00340 }
00341
00342 void ResourcesPanel::slotEditResource() {
00343
00344 ResourceLBItem *item = dynamic_cast<ResourceLBItem*> (listOfResources->selectedItem());
00345 if(item == 0) return;
00346 Resource *r = item->m_resourceItem->m_resource;
00347 ResourceDialog *dia = new ResourceDialog(*project, r);
00348 if (dia->exec()) {
00349 KCommand *cmd = dia->buildCommand();
00350 if (cmd) {
00351 cmd->execute();
00352 delete cmd;
00353 }
00354 resourceName->setText(r->name());
00355 item->m_resourceItem->setState(ResourcesPanelResourceItem::Modified);
00356 item->setName(r->name());
00357 listOfResources->triggerUpdate(false);
00358 emit changed();
00359 }
00360 delete dia;
00361 }
00362
00363 void ResourcesPanel::slotDeleteResource() {
00364
00365 ResourceLBItem *item = dynamic_cast<ResourceLBItem*> (listOfResources->selectedItem());
00366 if(item == 0) return;
00367
00368
00369 if(m_groupItem == 0) return;
00370
00371 m_groupItem->m_group->deleteResource(item->m_resourceItem);
00372 listOfResources->removeItem(listOfResources->currentItem());
00373
00374 emit changed();
00375 }
00376
00377
00378 void ResourcesPanel::slotResourceChanged( QListBoxItem *item) {
00379 if (!item) {
00380 resourceName->setEnabled(false);
00381 bEditResource->setEnabled(false);
00382 bRemoveResource->setEnabled(false);
00383 return;
00384 }
00385 resourceName->setText( ((ResourceLBItem *)item)->name());
00386 resourceName->setEnabled(true);
00387 bEditResource->setEnabled(true);
00388 bRemoveResource->setEnabled(true);
00389 }
00390
00391
00392 void ResourcesPanel::slotCurrentChanged( QListBoxItem *item) {
00393 if (item && !item->isSelected()) {
00394 listOfResources->setSelected(item, true);
00395 }
00396 }
00397
00398 void ResourcesPanel::slotResourceRename( const QString &newName) {
00399 QListBoxItem *item = listOfResources->selectedItem();
00400 if(!item || m_blockResourceRename) return;
00401
00402 ResourceLBItem *i = dynamic_cast<ResourceLBItem *>(item);
00403 if (i->name() == newName) return;
00404
00405 i->setName(newName);
00406 listOfResources->triggerUpdate(false);
00407
00408 emit changed();
00409 }
00410
00411 bool ResourcesPanel::ok() {
00412 return true;
00413 }
00414
00415 KCommand *ResourcesPanel::buildCommand(Part *part) {
00416 KMacroCommand *m=0;
00417 GroupItem *gitem;
00418
00419 QString cmdName = "Modify resourcegroups";
00420 QPtrListIterator<GroupItem> dgit(m_deletedGroupItems);
00421 for (; (gitem = dgit.current()) != 0; ++dgit) {
00422 if (!(gitem->m_state & GroupItem::New)) {
00423 if (!m) m = new KMacroCommand(cmdName);
00424
00425 m->addCommand(new RemoveResourceGroupCmd(part, gitem->takeGroup()));
00426 }
00427 }
00428
00429 QPtrListIterator<GroupItem> git(m_groupItems);
00430 for (; (gitem = git.current()) != 0; ++git) {
00431
00432
00433 QPtrListIterator<ResourcesPanelResourceItem> dit(gitem->m_deletedItems);
00434 ResourcesPanelResourceItem *ditem;
00435 for (; (ditem = dit.current()) != 0; ++dit) {
00436 if (!m) m = new KMacroCommand(cmdName);
00437
00438 m->addCommand(new RemoveResourceCmd(part, gitem->m_group, ditem->m_originalResource));
00439 }
00440
00441 if (gitem->m_state & GroupItem::New) {
00442 if (!m) m = new KMacroCommand(cmdName);
00443
00444 gitem->saveResources();
00445 m->addCommand(new AddResourceGroupCmd(part, gitem->takeGroup()));
00446 continue;
00447 }
00448 ResourceGroup *rg = gitem->takeGroup();
00449 if (gitem->m_state & GroupItem::Modified) {
00450 if (gitem->m_name != rg->name()) {
00451 if (!m) m = new KMacroCommand(cmdName);
00452
00453 m->addCommand(new ModifyResourceGroupNameCmd(part, rg, gitem->m_name));
00454 }
00455 }
00456 QPtrListIterator<ResourcesPanelResourceItem> it(gitem->m_resourceItems);
00457 for (; it.current() != 0; ++it) {
00458 KCommand *cmd = it.current()->saveResource(part, rg);
00459 if (cmd) {
00460 if (!m) m = new KMacroCommand(cmdName);
00461 m->addCommand(cmd);
00462 }
00463 }
00464 }
00465 return m;
00466 }
00467
00468 void ResourcesPanel::slotGroupChanged() {
00469 slotGroupChanged(listOfGroups->selectedItem());
00470 }
00471
00472 void ResourcesPanel::slotGroupChanged(QListViewItem *itm) {
00473 ResourcesPanelGroupLVItem *item = static_cast<ResourcesPanelGroupLVItem*>(itm);
00474 if (!item) {
00475 bAdd->setEnabled(true);
00476 bRemove->setEnabled(false);
00477 listOfResources->clear();
00478 resourceName->clear();
00479 resourceGroupBox->setEnabled(false);
00480 return;
00481 }
00482 m_blockResourceRename = true;
00483 resourceName->clear();
00484 resourceName->setEnabled(false);
00485 m_blockResourceRename = false;
00486
00487 m_groupItem = item;
00488 listOfResources->clear();
00489
00490 QPtrListIterator<ResourcesPanelResourceItem> it(m_groupItem->m_group->m_resourceItems);
00491 for ( ; it.current(); ++it ) {
00492 listOfResources->insertItem(new ResourceLBItem(it.current()));
00493
00494 }
00495 bAdd->setEnabled(true);
00496 bRemove->setEnabled(true);
00497 slotResourceChanged(0);
00498 resourceGroupBox->setEnabled(true);
00499 }
00500
00501 void ResourcesPanel::slotListDoubleClicked(QListViewItem* item, const QPoint&, int col) {
00502
00503 if (m_renameItem)
00504 return;
00505 slotStartRename(item, col);
00506 }
00507
00508 void ResourcesPanel::slotItemRenamed(QListViewItem *item, int col) {
00509
00510 item->setRenameEnabled(col, false);
00511 m_renameItem = 0;
00512 if (col != 0) {
00513 renameStopped(item);
00514 emit changed();
00515 return;
00516 }
00517 if (item->text(0).isEmpty()) {
00518 item->setText(0, static_cast<ResourcesPanelGroupLVItem*>(item)->oldText);
00519 }
00520 if (item->text(0).isEmpty()) {
00521
00522
00523 emit startRename(item, 0);
00524 return;
00525 }
00526 static_cast<ResourcesPanelGroupLVItem*>(item)->setName(item->text(0));
00527 bRemove->setEnabled(listOfGroups->selectedItem());
00528 bAdd->setEnabled(listOfGroups->selectedItem());
00529 renameStopped(item);
00530 emit changed();
00531 }
00532
00533 void ResourcesPanel::slotRenameStarted(QListViewItem *, int ) {
00534
00535 if (listOfGroups->isRenaming()) {
00536 bRemove->setEnabled(false);
00537 bAdd->setEnabled(false);
00538 }
00539 }
00540
00541 void ResourcesPanel::slotStartRename(QListViewItem *item, int col) {
00542
00543 static_cast<ResourcesPanelGroupLVItem*>(item)->oldText = item->text(col);
00544 item->setRenameEnabled(col, true);
00545 item->startRename(col);
00546 m_renameItem = item;
00547
00548 emit renameStarted(item, col);
00549 }
00550
00551
00552 void ResourcesPanel::renameStopped(QListViewItem *) {
00553
00554 m_renameItem = 0;
00555 emit selectionChanged();
00556 }
00557
00558
00559 }
00560
00561 #include "kptresourcespanel.moc"