/* This file is part of the KDE project Copyright (C) 2003 Thomas Zander Copyright (C) 2004, 2005 Dag Andersen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "kptresourcespanel.h" #include "kptproject.h" #include "kptresourcedialog.h" #include "kptcommand.h" #include #include #include #include #include #include #include #include #include #include #include #include //////////////////////////// Private classes ////////////////////////////////// namespace KPlato { class GroupItem; class ResourcesPanelGroupLVItem; class ResourcesPanelResourceItem; class Part; class ResourcesPanelResourceItem { public: enum State {None, Modified, New}; ResourcesPanelResourceItem(Resource *res, State state = None) : m_originalResource(0), m_state(state) { if (state == New) { m_resource = res; } else { m_originalResource = res; m_resource = new Resource(res); } //kdDebug()<name()<addCommand(new AddResourceCmd(part, group, takeResource())); } else if (m_state == Modified) { //kdDebug()<name()<addCommand(cmd); } } return m; } class ResourceLBItem : public TQListBoxText { public: ResourceLBItem(ResourcesPanelResourceItem *item) { m_resourceItem = item; setText(item->name()); } TQString name() { return m_resourceItem->name(); } void setName(const TQString &newName) { setText(newName); m_resourceItem->setName(newName); } ResourcesPanelResourceItem *m_resourceItem; }; //------------------- class GroupItem { public: enum State {None=0, Modified=1, New=2}; //bitmap GroupItem(ResourceGroup *group, State state = None) { m_group = group; m_name = group->name(); m_state = state; m_resourceItems.setAutoDelete(true); m_deletedItems.setAutoDelete(true); //kdDebug()<setName(newName); setState(Modified); //kdDebug()<name()<<"' state="<name():"")<<" ("<m_name<<" ("<m_state == ResourcesPanelResourceItem::New) delete item; else m_deletedItems.append(item); //kdDebug()<m_resource->name()<addResource(item->takeResource(), 0); delete item; } } ResourceGroup *m_group; TQString m_name; TQPtrList m_resourceItems; TQPtrList m_deletedItems; int m_state; }; class ResourcesPanelGroupLVItem : public TDEListViewItem { public: ResourcesPanelGroupLVItem(ResourcesPanel &pan, TDEListView *lv, GroupItem *item) : TDEListViewItem(lv, item->m_name), m_group(item), panel(pan) { setRenameEnabled(0, false); //kdDebug()<setName(newName); } void deleteGroup() { delete m_group; m_group = 0; } GroupItem *takeGroup() { //kdDebug()<setEnabled(false); bRemoveResource->setEnabled(false); resourceName->setEnabled(false); listOfGroups->header()->setStretchEnabled(true, 0); listOfGroups->setSorting(0); listOfGroups->setShowSortIndicator(true); listOfGroups->setDefaultRenameAction (TQListView::Accept); bAdd->setEnabled(true); m_groupItems.setAutoDelete(true); m_deletedGroupItems.setAutoDelete(true); TQPtrListIterator git(project->resourceGroups()); for(; git.current(); ++git) { ResourceGroup *grp = git.current(); GroupItem *groupItem = new GroupItem(grp); //kdDebug()<m_name<<" ("< rit(grp->resources()); for(; rit.current(); ++rit) { Resource *res = rit.current(); ResourcesPanelResourceItem *ritem = new ResourcesPanelResourceItem(res); groupItem->addResource(ritem); //kdDebug()<m_name<<" ("<setSelected(listOfGroups->firstChild(), true); slotGroupChanged(); connect(bAdd, TQ_SIGNAL(clicked()), TQ_SLOT(slotAddGroup())); connect(bRemove, TQ_SIGNAL(clicked()), TQ_SLOT(slotDeleteGroup())); connect(listOfGroups, TQ_SIGNAL(selectionChanged()), TQ_SLOT(slotGroupChanged())); connect(listOfGroups, TQ_SIGNAL(doubleClicked(TQListViewItem*, const TQPoint&, int)), TQ_SLOT(slotListDoubleClicked(TQListViewItem*, const TQPoint&, int))); connect(listOfGroups, TQ_SIGNAL(itemRenamed(TQListViewItem*, int)), TQ_SLOT(slotItemRenamed(TQListViewItem*, int))); connect(bAddResource, TQ_SIGNAL( clicked() ), this, TQ_SLOT ( slotAddResource() )); connect(bEditResource, TQ_SIGNAL( clicked() ), this, TQ_SLOT ( slotEditResource() )); connect(bRemoveResource, TQ_SIGNAL( clicked() ), this, TQ_SLOT ( slotDeleteResource() )); connect(listOfResources, TQ_SIGNAL(selectionChanged(TQListBoxItem*)), TQ_SLOT(slotResourceChanged(TQListBoxItem*))); connect(listOfResources, TQ_SIGNAL(currentChanged(TQListBoxItem*)), TQ_SLOT(slotCurrentChanged(TQListBoxItem*))); connect(resourceName, TQ_SIGNAL(textChanged(const TQString&)), TQ_SLOT(slotResourceRename(const TQString&))); // Internal hacks, to get renaming to behave // Uses signals to not get in the way of TQListView connect(this, TQ_SIGNAL(renameStarted(TQListViewItem*, int)), TQ_SLOT(slotRenameStarted(TQListViewItem*, int))); connect(this, TQ_SIGNAL(startRename(TQListViewItem*, int)), TQ_SLOT(slotStartRename(TQListViewItem*, int))); connect(this, TQ_SIGNAL(selectionChanged()), TQ_SLOT(slotGroupChanged())); } void ResourcesPanel::slotAddGroup() { //kdDebug()< (listOfGroups->selectedItem()); if (groupLVItem == 0) return; listOfResources->clear(); listOfGroups->takeItem(groupLVItem); // remove from listbox m_groupItems.take(m_groupItems.findRef(groupLVItem->m_group)); // remove GroupItem from active list m_deletedGroupItems.append(groupLVItem->takeGroup()); // remove GroupItem from GroupLVItem and add to deleted list //kdDebug()<setSelected(listOfResources->selectedItem(), false); Resource *r = new Resource(project); ResourceDialog *dia = new ResourceDialog(*project, r); if (dia->exec()) { KCommand *cmd = dia->buildCommand(); if (cmd) { cmd->execute(); // modifications -> r delete cmd; } ResourcesPanelResourceItem *resourceItem = new ResourcesPanelResourceItem(r, ResourcesPanelResourceItem::New); m_groupItem->m_group->addResource(resourceItem); ResourceLBItem *item = new ResourceLBItem(resourceItem); listOfResources->insertItem(item); resourceName->clear(); listOfResources->setSelected(item, true); emit changed(); //kdDebug()<name()<<" to "<m_group->m_name< (listOfResources->selectedItem()); if(item == 0) return; Resource *r = item->m_resourceItem->m_resource; ResourceDialog *dia = new ResourceDialog(*project, r); if (dia->exec()) { KCommand *cmd = dia->buildCommand(); if (cmd) { cmd->execute(); // modifications -> r delete cmd; } resourceName->setText(r->name()); item->m_resourceItem->setState(ResourcesPanelResourceItem::Modified); item->setName(r->name()); // refresh list listOfResources->triggerUpdate(false); emit changed(); } delete dia; } void ResourcesPanel::slotDeleteResource() { //kdDebug()< (listOfResources->selectedItem()); if(item == 0) return; //Can't delete resource from unselected group if(m_groupItem == 0) return; m_groupItem->m_group->deleteResource(item->m_resourceItem); listOfResources->removeItem(listOfResources->currentItem()); emit changed(); } /* Select another resource */ void ResourcesPanel::slotResourceChanged( TQListBoxItem *item) { if (!item) { resourceName->setEnabled(false); bEditResource->setEnabled(false); bRemoveResource->setEnabled(false); return; } resourceName->setText( ((ResourceLBItem *)item)->name()); resourceName->setEnabled(true); bEditResource->setEnabled(true); bRemoveResource->setEnabled(true); } /* Select another resource */ void ResourcesPanel::slotCurrentChanged( TQListBoxItem *item) { if (item && !item->isSelected()) { listOfResources->setSelected(item, true); } } void ResourcesPanel::slotResourceRename( const TQString &newName) { TQListBoxItem *item = listOfResources->selectedItem(); if(!item || m_blockResourceRename) return; ResourceLBItem *i = dynamic_cast(item); if (i->name() == newName) return; i->setName(newName); listOfResources->triggerUpdate(false); emit changed(); } bool ResourcesPanel::ok() { return true; } KCommand *ResourcesPanel::buildCommand(Part *part) { KMacroCommand *m=0; GroupItem *gitem; TQString cmdName = "Modify resourcegroups"; TQPtrListIterator dgit(m_deletedGroupItems); for (; (gitem = dgit.current()) != 0; ++dgit) { if (!(gitem->m_state & GroupItem::New)) { if (!m) m = new KMacroCommand(cmdName); //kdDebug()<m_name<<"'"<addCommand(new RemoveResourceGroupCmd(part, gitem->takeGroup())); } } TQPtrListIterator git(m_groupItems); for (; (gitem = git.current()) != 0; ++git) { //kdDebug()<m_name<<" has "<m_resourceItems.count()<<" resources"<<" and "<m_deletedItems.count()<<" deleted resources"< dit(gitem->m_deletedItems); ResourcesPanelResourceItem *ditem; for (; (ditem = dit.current()) != 0; ++dit) { if (!m) m = new KMacroCommand(cmdName); //kdDebug()<m_originalResource->name()<<"'"<addCommand(new RemoveResourceCmd(part, gitem->m_group, ditem->m_originalResource)); } // Now add/modify group/resources if (gitem->m_state & GroupItem::New) { if (!m) m = new KMacroCommand(cmdName); //kdDebug()<m_name<<"'"<saveResources(); m->addCommand(new AddResourceGroupCmd(part, gitem->takeGroup())); continue; } ResourceGroup *rg = gitem->takeGroup(); if (gitem->m_state & GroupItem::Modified) { if (gitem->m_name != rg->name()) { if (!m) m = new KMacroCommand(cmdName); //kdDebug()<m_name<<"'"<addCommand(new ModifyResourceGroupNameCmd(part, rg, gitem->m_name)); } } TQPtrListIterator it(gitem->m_resourceItems); for (; it.current() != 0; ++it) { KCommand *cmd = it.current()->saveResource(part, rg); if (cmd) { if (!m) m = new KMacroCommand(cmdName); m->addCommand(cmd); } } } return m; } void ResourcesPanel::slotGroupChanged() { slotGroupChanged(listOfGroups->selectedItem()); } void ResourcesPanel::slotGroupChanged(TQListViewItem *itm) { ResourcesPanelGroupLVItem *item = static_cast(itm); if (!item) { bAdd->setEnabled(true); bRemove->setEnabled(false); listOfResources->clear(); resourceName->clear(); resourceGroupBox->setEnabled(false); return; } m_blockResourceRename = true; resourceName->clear(); resourceName->setEnabled(false); m_blockResourceRename = false; m_groupItem = item; listOfResources->clear(); TQPtrListIterator it(m_groupItem->m_group->m_resourceItems); for ( ; it.current(); ++it ) { listOfResources->insertItem(new ResourceLBItem(it.current())); //kdDebug()<name()<setEnabled(true); bRemove->setEnabled(true); slotResourceChanged(0); resourceGroupBox->setEnabled(true); } void ResourcesPanel::slotListDoubleClicked(TQListViewItem* item, const TQPoint&, int col) { //kdDebug()<text(0):"")<text(0)<setRenameEnabled(col, false); m_renameItem = 0; if (col != 0) { renameStopped(item); emit changed(); return; } if (item->text(0).isEmpty()) { item->setText(0, static_cast(item)->oldText); // keep the old name } if (item->text(0).isEmpty()) { // Not allowed //kdDebug()<(item)->setName(item->text(0)); bRemove->setEnabled(listOfGroups->selectedItem()); bAdd->setEnabled(listOfGroups->selectedItem()); renameStopped(item); emit changed(); } void ResourcesPanel::slotRenameStarted(TQListViewItem */*item*/, int /*col*/) { //kdDebug()<text(0):"")<isRenaming()) { bRemove->setEnabled(false); bAdd->setEnabled(false); } } void ResourcesPanel::slotStartRename(TQListViewItem *item, int col) { //kdDebug()<text(0):"")<(item)->oldText = item->text(col); item->setRenameEnabled(col, true); item->startRename(col); m_renameItem = item; emit renameStarted(item, col); } // We don't get notified when rename is cancelled, this is called from the item void ResourcesPanel::renameStopped(TQListViewItem *) { //kdDebug()<