21#include "kptresourcespanel.h"
22#include "kptproject.h"
23#include "kptresourcedialog.h"
24#include "kptcommand.h"
27#include <tdelistview.h>
28#include <tdemessagebox.h>
30#include <tdeabc/addressee.h>
31#include <tdeabc/addresseedialog.h>
33#include <tqgroupbox.h>
36#include <tqlineedit.h>
37#include <tqlistview.h>
38#include <tqpushbutton.h>
46class ResourcesPanelGroupLVItem;
47class ResourcesPanelResourceItem;
50class ResourcesPanelResourceItem {
52 enum State {None, Modified, New};
54 ResourcesPanelResourceItem(Resource *res, State state = None)
55 : m_originalResource(0),
60 m_originalResource = res;
61 m_resource =
new Resource(res);
65 ~ResourcesPanelResourceItem() {
69 void setState(State s) {
74 TQString name() {
return m_resource->name(); }
75 void setName(
const TQString &newName) {
76 m_resource->setName(newName);
79 Resource *takeResource() {
80 Resource *r = m_resource;
84 KCommand *saveResource(Part *part, ResourceGroup *group);
86 Resource *m_originalResource;
90KCommand *ResourcesPanelResourceItem::saveResource(Part *part,
ResourceGroup *group) {
94 if (!m) m =
new KMacroCommand(
"Add resource");
95 m->addCommand(
new AddResourceCmd(part, group, takeResource()));
96 }
else if (m_state == Modified) {
98 KCommand *cmd = ResourceDialog::buildCommand(m_originalResource, *m_resource, part);
100 if (!m) m =
new KMacroCommand(
"Modify resource");
107class ResourceLBItem :
public TQListBoxText {
109 ResourceLBItem(ResourcesPanelResourceItem *item) {
110 m_resourceItem = item; setText(item->name());
112 TQString name() {
return m_resourceItem->name(); }
113 void setName(
const TQString &newName) {
115 m_resourceItem->setName(newName);
118 ResourcesPanelResourceItem *m_resourceItem;
125 enum State {None=0, Modified=1, New=2};
127 GroupItem(ResourceGroup *group, State state = None) {
129 m_name = group->name();
131 m_resourceItems.setAutoDelete(
true);
132 m_deletedItems.setAutoDelete(
true);
141 void setState(State s) { m_state |= s; }
142 void setName(
const TQString &newName) {
145 m_group->setName(newName);
149 void addResource(ResourcesPanelResourceItem *item) {
151 m_resourceItems.append(item);
153 void deleteResource(ResourcesPanelResourceItem *item) {
155 m_resourceItems.take(m_resourceItems.findRef(item));
156 if (item->m_state == ResourcesPanelResourceItem::New)
159 m_deletedItems.append(item);
162 ResourceGroup *takeGroup() {
164 ResourceGroup *g = m_group;
168 void saveResources() {
169 ResourcesPanelResourceItem *item = m_resourceItems.first();
170 while ((item = m_resourceItems.take())) {
172 m_group->addResource(item->takeResource(), 0);
176 ResourceGroup *m_group;
178 TQPtrList<ResourcesPanelResourceItem> m_resourceItems;
179 TQPtrList<ResourcesPanelResourceItem> m_deletedItems;
183class ResourcesPanelGroupLVItem :
public TDEListViewItem {
185 ResourcesPanelGroupLVItem(ResourcesPanel &pan, TDEListView *lv, GroupItem *item)
186 : TDEListViewItem(lv, item->m_name),
190 setRenameEnabled(0,
false);
193 ~ResourcesPanelGroupLVItem() {
196 void setName(
const TQString &newName) {
198 m_group->setName(newName);
204 GroupItem *takeGroup() {
206 GroupItem *g = m_group;
211 ResourcesPanel &panel;
215 virtual void cancelRename(
int col) {
217 if (col == 0 && oldText.isEmpty()){
220 panel.renameStopped(
this);
221 TDEListViewItem::cancelRename(col);
222 setRenameEnabled(col,
false);
228ResourcesPanel::ResourcesPanel(TQWidget *parent,
Project *p) : ResourcesPanelBase(parent) {
231 m_blockResourceRename =
false;
234 bEditResource->setEnabled(
false);
235 bRemoveResource->setEnabled(
false);
236 resourceName->setEnabled(
false);
238 listOfGroups->header()->setStretchEnabled(
true, 0);
239 listOfGroups->setSorting(0);
240 listOfGroups->setShowSortIndicator(
true);
241 listOfGroups->setDefaultRenameAction (TQListView::Accept);
242 bAdd->setEnabled(
true);
244 m_groupItems.setAutoDelete(
true);
245 m_deletedGroupItems.setAutoDelete(
true);
247 TQPtrListIterator<ResourceGroup> git(project->resourceGroups());
248 for(; git.current(); ++git) {
249 ResourceGroup *grp = git.current();
250 GroupItem *groupItem =
new GroupItem(grp);
252 TQPtrListIterator<Resource> rit(grp->resources());
253 for(; rit.current(); ++rit) {
254 Resource *res = rit.current();
255 ResourcesPanelResourceItem *ritem =
new ResourcesPanelResourceItem(res);
256 groupItem->addResource(ritem);
259 m_groupItems.append(groupItem);
260 new ResourcesPanelGroupLVItem(*
this, listOfGroups, groupItem);
262 listOfGroups->setSelected(listOfGroups->firstChild(),
true);
265 connect(bAdd, TQ_SIGNAL(clicked()), TQ_SLOT(slotAddGroup()));
266 connect(bRemove, TQ_SIGNAL(clicked()), TQ_SLOT(slotDeleteGroup()));
267 connect(listOfGroups, TQ_SIGNAL(selectionChanged()), TQ_SLOT(slotGroupChanged()));
268 connect(listOfGroups, TQ_SIGNAL(doubleClicked(TQListViewItem*,
const TQPoint&,
int)), TQ_SLOT(slotListDoubleClicked(TQListViewItem*,
const TQPoint&,
int)));
269 connect(listOfGroups, TQ_SIGNAL(itemRenamed(TQListViewItem*,
int)), TQ_SLOT(slotItemRenamed(TQListViewItem*,
int)));
271 connect(bAddResource, TQ_SIGNAL( clicked() ),
this, TQ_SLOT ( slotAddResource() ));
272 connect(bEditResource, TQ_SIGNAL( clicked() ),
this, TQ_SLOT ( slotEditResource() ));
273 connect(bRemoveResource, TQ_SIGNAL( clicked() ),
this, TQ_SLOT ( slotDeleteResource() ));
274 connect(listOfResources, TQ_SIGNAL(selectionChanged(TQListBoxItem*)), TQ_SLOT(slotResourceChanged(TQListBoxItem*)));
275 connect(listOfResources, TQ_SIGNAL(currentChanged(TQListBoxItem*)), TQ_SLOT(slotCurrentChanged(TQListBoxItem*)));
276 connect(resourceName, TQ_SIGNAL(textChanged(
const TQString&)), TQ_SLOT(slotResourceRename(
const TQString&)));
281 connect(
this, TQ_SIGNAL(renameStarted(TQListViewItem*,
int)), TQ_SLOT(slotRenameStarted(TQListViewItem*,
int)));
282 connect(
this, TQ_SIGNAL(startRename(TQListViewItem*,
int)), TQ_SLOT(slotStartRename(TQListViewItem*,
int)));
283 connect(
this, TQ_SIGNAL(selectionChanged()), TQ_SLOT(slotGroupChanged()));
286void ResourcesPanel::slotAddGroup() {
288 ResourceGroup *r =
new ResourceGroup(project);
289 GroupItem *gitem =
new GroupItem(r, GroupItem::New);
290 m_groupItems.append(gitem);
291 ResourcesPanelGroupLVItem *groupItem =
new ResourcesPanelGroupLVItem(*
this, listOfGroups, gitem);
293 slotListDoubleClicked(groupItem, TQPoint(), 0);
296void ResourcesPanel::slotDeleteGroup() {
298 ResourcesPanelGroupLVItem *groupLVItem =
dynamic_cast<ResourcesPanelGroupLVItem*
> (listOfGroups->selectedItem());
299 if (groupLVItem == 0)
302 listOfResources->clear();
304 listOfGroups->takeItem(groupLVItem);
305 m_groupItems.take(m_groupItems.findRef(groupLVItem->m_group));
306 m_deletedGroupItems.append(groupLVItem->takeGroup());
314void ResourcesPanel::slotAddResource() {
316 KMessageBox::sorry(
this, i18n(
"Resources belong to resource groups, select the group first to add a new resource to"));
319 listOfResources->setSelected(listOfResources->selectedItem(),
false);
320 Resource *r =
new Resource(project);
321 ResourceDialog *dia =
new ResourceDialog(*project, r);
323 KCommand *cmd = dia->buildCommand();
328 ResourcesPanelResourceItem *resourceItem =
new ResourcesPanelResourceItem(r, ResourcesPanelResourceItem::New);
329 m_groupItem->m_group->addResource(resourceItem);
330 ResourceLBItem *item =
new ResourceLBItem(resourceItem);
331 listOfResources->insertItem(item);
332 resourceName->clear();
333 listOfResources->setSelected(item,
true);
342void ResourcesPanel::slotEditResource() {
344 ResourceLBItem *item =
dynamic_cast<ResourceLBItem*
> (listOfResources->selectedItem());
345 if(item == 0)
return;
346 Resource *r = item->m_resourceItem->m_resource;
347 ResourceDialog *dia =
new ResourceDialog(*project, r);
349 KCommand *cmd = dia->buildCommand();
354 resourceName->setText(r->name());
355 item->m_resourceItem->setState(ResourcesPanelResourceItem::Modified);
356 item->setName(r->name());
357 listOfResources->triggerUpdate(
false);
363void ResourcesPanel::slotDeleteResource() {
365 ResourceLBItem *item =
dynamic_cast<ResourceLBItem*
> (listOfResources->selectedItem());
366 if(item == 0)
return;
369 if(m_groupItem == 0)
return;
371 m_groupItem->m_group->deleteResource(item->m_resourceItem);
372 listOfResources->removeItem(listOfResources->currentItem());
378void ResourcesPanel::slotResourceChanged( TQListBoxItem *item) {
380 resourceName->setEnabled(
false);
381 bEditResource->setEnabled(
false);
382 bRemoveResource->setEnabled(
false);
385 resourceName->setText( ((ResourceLBItem *)item)->name());
386 resourceName->setEnabled(
true);
387 bEditResource->setEnabled(
true);
388 bRemoveResource->setEnabled(
true);
392void ResourcesPanel::slotCurrentChanged( TQListBoxItem *item) {
393 if (item && !item->isSelected()) {
394 listOfResources->setSelected(item,
true);
398void ResourcesPanel::slotResourceRename(
const TQString &newName) {
399 TQListBoxItem *item = listOfResources->selectedItem();
400 if(!item || m_blockResourceRename)
return;
402 ResourceLBItem *i =
dynamic_cast<ResourceLBItem *
>(item);
403 if (i->name() == newName)
return;
406 listOfResources->triggerUpdate(
false);
411bool ResourcesPanel::ok() {
415KCommand *ResourcesPanel::buildCommand(Part *part) {
419 TQString cmdName =
"Modify resourcegroups";
420 TQPtrListIterator<GroupItem> dgit(m_deletedGroupItems);
421 for (; (gitem = dgit.current()) != 0; ++dgit) {
422 if (!(gitem->m_state & GroupItem::New)) {
423 if (!m) m =
new KMacroCommand(cmdName);
425 m->addCommand(
new RemoveResourceGroupCmd(part, gitem->takeGroup()));
429 TQPtrListIterator<GroupItem> git(m_groupItems);
430 for (; (gitem = git.current()) != 0; ++git) {
433 TQPtrListIterator<ResourcesPanelResourceItem> dit(gitem->m_deletedItems);
434 ResourcesPanelResourceItem *ditem;
435 for (; (ditem = dit.current()) != 0; ++dit) {
436 if (!m) m =
new KMacroCommand(cmdName);
438 m->addCommand(
new RemoveResourceCmd(part, gitem->m_group, ditem->m_originalResource));
441 if (gitem->m_state & GroupItem::New) {
442 if (!m) m =
new KMacroCommand(cmdName);
444 gitem->saveResources();
445 m->addCommand(
new AddResourceGroupCmd(part, gitem->takeGroup()));
448 ResourceGroup *rg = gitem->takeGroup();
449 if (gitem->m_state & GroupItem::Modified) {
450 if (gitem->m_name != rg->name()) {
451 if (!m) m =
new KMacroCommand(cmdName);
453 m->addCommand(
new ModifyResourceGroupNameCmd(part, rg, gitem->m_name));
456 TQPtrListIterator<ResourcesPanelResourceItem> it(gitem->m_resourceItems);
457 for (; it.current() != 0; ++it) {
458 KCommand *cmd = it.current()->saveResource(part, rg);
460 if (!m) m =
new KMacroCommand(cmdName);
468void ResourcesPanel::slotGroupChanged() {
469 slotGroupChanged(listOfGroups->selectedItem());
472void ResourcesPanel::slotGroupChanged(TQListViewItem *itm) {
473 ResourcesPanelGroupLVItem *item =
static_cast<ResourcesPanelGroupLVItem*
>(itm);
475 bAdd->setEnabled(
true);
476 bRemove->setEnabled(
false);
477 listOfResources->clear();
478 resourceName->clear();
479 resourceGroupBox->setEnabled(
false);
482 m_blockResourceRename =
true;
483 resourceName->clear();
484 resourceName->setEnabled(
false);
485 m_blockResourceRename =
false;
488 listOfResources->clear();
490 TQPtrListIterator<ResourcesPanelResourceItem> it(m_groupItem->m_group->m_resourceItems);
491 for ( ; it.current(); ++it ) {
492 listOfResources->insertItem(
new ResourceLBItem(it.current()));
495 bAdd->setEnabled(
true);
496 bRemove->setEnabled(
true);
497 slotResourceChanged(0);
498 resourceGroupBox->setEnabled(
true);
501void ResourcesPanel::slotListDoubleClicked(TQListViewItem* item,
const TQPoint&,
int col) {
505 slotStartRename(item, col);
508void ResourcesPanel::slotItemRenamed(TQListViewItem *item,
int col) {
510 item->setRenameEnabled(col,
false);
517 if (item->text(0).isEmpty()) {
518 item->setText(0,
static_cast<ResourcesPanelGroupLVItem*
>(item)->oldText);
520 if (item->text(0).isEmpty()) {
523 emit startRename(item, 0);
526 static_cast<ResourcesPanelGroupLVItem*
>(item)->setName(item->text(0));
527 bRemove->setEnabled(listOfGroups->selectedItem());
528 bAdd->setEnabled(listOfGroups->selectedItem());
533void ResourcesPanel::slotRenameStarted(TQListViewItem *,
int ) {
535 if (listOfGroups->isRenaming()) {
536 bRemove->setEnabled(
false);
537 bAdd->setEnabled(
false);
541void ResourcesPanel::slotStartRename(TQListViewItem *item,
int col) {
543 static_cast<ResourcesPanelGroupLVItem*
>(item)->oldText = item->text(col);
544 item->setRenameEnabled(col,
true);
545 item->startRename(col);
548 emit renameStarted(item, col);
552void ResourcesPanel::renameStopped(TQListViewItem *) {
555 emit selectionChanged();
561#include "kptresourcespanel.moc"
Project is the main node in a project, it contains child nodes and possibly sub-projects.
This class represents a group of similar resources to be assigned to a task e.g.