F:/KPlato/koffice/kplato/kptresourcespanel.cc

Aller à la documentation de ce fichier.
00001 /* This file is part of the KDE project
00002    Copyright (C) 2003 Thomas Zander <zander@kde.org>
00003    Copyright (C) 2004, 2005 Dag Andersen <danders@get2net.dk>
00004 
00005    This library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Library General Public
00007    License as published by the Free Software Foundation; either
00008    version 2 of the License, or (at your option) any later version.
00009 
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public License
00016    along with this library; see the file COPYING.LIB.  If not, write to
00017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018  * Boston, MA 02110-1301, USA.
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         //kDebug()<<k_funcinfo<<"("<<this<<")"<<" orgres="<<m_originalResource<<" newres="<<m_resource<<endl;
00063     }
00064     ~ResourcesPanelResourceItem() {
00065         //kDebug()<<k_funcinfo<<"("<<this<<") state="<<m_state<<endl;
00066         delete m_resource;
00067     }
00068     void setState(State s) {
00069         if (m_state == New)
00070             return; // A new is always new
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; // work on a local copy
00087     State m_state;
00088 };
00089 KCommand *ResourcesPanelResourceItem::saveResource(Part *part, ResourceGroup *group) {
00090     KMacroCommand *m=0;
00091     if (m_state == New) {
00092         //kDebug()<<k_funcinfo<<"Add resource: "<<m_resource->name()<<endl;
00093         if (!m) m = new KMacroCommand("Add resource");
00094         m->addCommand(new AddResourceCmd(part, group, takeResource()));
00095     } else if (m_state == Modified) {
00096         //kDebug()<<k_funcinfo<<"Modify resource: "<<m_originalResource->name()<<endl;
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}; //bitmap
00125 
00126     GroupItem(ResourceGroup *group, State state = None) {
00127         m_group = group;
00128         m_name = group->name();
00129         m_state = state;
00130         //kDebug()<<k_funcinfo<<"("<<this<<")"<<endl;
00131     }
00132     ~GroupItem() {
00133         //kDebug()<<k_funcinfo<<"("<<this<<")"<<endl;
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         //kDebug()<<k_funcinfo<<"New name: '"<<newName<<"', group name: '"<<m_group->name()<<"' state="<<m_state<<endl;
00150     }
00151     void addResource(ResourcesPanelResourceItem *item) {
00152         //kDebug()<<k_funcinfo<<" add: "<<(item?item->name():"")<<" ("<<item<<")"<<endl;
00153         m_resourceItems.append(item);
00154     }
00155     void deleteResource(ResourcesPanelResourceItem *item) {
00156         //kDebug()<<k_funcinfo<<" Deleted: "<<item->m_name<<" ("<<item<<")"<<endl;
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         //kDebug()<<k_funcinfo<<"No of items now="<<m_resourceItems.count()<<", no of deleted items="<<m_deletedItems.count()<<endl;
00167     }
00168     ResourceGroup *takeGroup() {
00169         //kDebug()<<k_funcinfo<<"("<<m_group<<")"<<endl;
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             //kDebug()<<k_funcinfo<<item->m_resource->name()<<endl;
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         //kDebug()<<k_funcinfo<<"("<<this<<")"<<endl;
00199     }
00200     ~ResourcesPanelGroupLVItem() {
00201         //kDebug()<<k_funcinfo<<"("<<this<<")"<<endl;
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         //kDebug()<<k_funcinfo<<"("<<m_group<<")"<<endl;
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         //kDebug()<<k_funcinfo<<" Added group: "<<groupItem->m_name<<" ("<<groupItem<<")"<<endl;
00243         foreach (Resource *res, grp->resources()) {
00244             ResourcesPanelResourceItem *ritem = new ResourcesPanelResourceItem(res);
00245             groupItem->addResource(ritem);
00246             //kDebug()<<k_funcinfo<<"      Added resource: "<<ritem->m_name<<" ("<<ritem<<")"<<endl;
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     //kDebug()<<k_funcinfo<<endl;
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     //kDebug()<<k_funcinfo<<endl;
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)); // remove GroupItem from active list
00297         m_deletedGroupItems.append(groupLVItem->takeGroup()); // remove GroupItem from GroupLVItem and add to deleted list
00298     
00299         //kDebug()<<k_funcinfo<<" No of deleted groups="<<m_deletedGroupItems.count()<<", now "<<m_groupItems.count()<<" groups left"<<endl;
00300     
00301         delete groupLVItem; // delete GroupLVItem (but not GroupItem)
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(); // modifications -> r
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         //kDebug()<<k_funcinfo<<" Added: "<<resourceItem->name()<<" to "<<m_groupItem->m_group->m_name<<endl;
00327     } else {
00328         delete r;
00329     }
00330     delete dia;
00331 }
00332 
00333 void ResourcesPanel::slotEditResource() {
00334     //kDebug()<<k_funcinfo<<endl;
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(); // modifications -> r
00346             delete cmd;
00347         }
00348         item->m_resourceItem->setState(ResourcesPanelResourceItem::Modified);
00349         item->setName(r->name()); // refresh list
00350         emit changed();
00351     }
00352     delete dia;
00353 }
00354 
00355 void ResourcesPanel::slotDeleteResource() {
00356     //kDebug()<<k_funcinfo<<endl;
00357     QList<QListWidgetItem*> lst = listOfResources->selectedItems();
00358     if (lst.isEmpty()) {
00359         return;
00360     }
00361     ResourceLBItem *item = static_cast<ResourceLBItem*>(lst[0]);
00362     //Can't delete resource from unselected group
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 /* Select another resource */
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 /* Select another resource */
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             //kDebug()<<k_funcinfo<<"Remove group: '"<<gitem->m_name<<"'"<<endl;
00403             m->addCommand(new RemoveResourceGroupCmd(part, gitem->takeGroup()));
00404         }
00405     }
00406     foreach (GroupItem *gitem, m_groupItems) {
00407         //kDebug()<<k_funcinfo<<"Group: "<<gitem->m_name<<" has "<<gitem->m_resourceItems.count()<<" resources"<<" and "<<gitem->m_deletedItems.count()<<" deleted resources"<<endl;
00408         //First remove deleted resources from group
00409         foreach (ResourcesPanelResourceItem *ditem, gitem->m_deletedItems) {
00410             if (!m) m = new KMacroCommand(cmdName);
00411             //kDebug()<<k_funcinfo<<" Deleting resource: '"<<ditem->m_originalResource->name()<<"'"<<endl;
00412             m->addCommand(new RemoveResourceCmd(part, gitem->m_group, ditem->m_originalResource));
00413         }
00414         // Now add/modify group/resources
00415         if (gitem->m_state & GroupItem::New) {
00416             if (!m) m = new KMacroCommand(cmdName);
00417             //kDebug()<<k_funcinfo<<" Adding group: '"<<gitem->m_name<<"'"<<endl;
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                 //kDebug()<<k_funcinfo<<" Modifying group: '"<<gitem->m_name<<"'"<<endl;
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     //kDebug()<<k_funcinfo<<ci->text(0)<<", "<<col<<endl;
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]; // handle only single selection, really
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         //kDebug()<<k_funcinfo<<"Insert resource item: "<<i->name()<<endl;
00473     }
00474     bAdd->setEnabled(true);
00475     bRemove->setEnabled(true);
00476     slotResourceChanged();
00477     resourceGroupBox->setEnabled(true);
00478 }
00479 
00480 }  //KPlato namespace
00481 
00482 #include "kptresourcespanel.moc"

Généré le Wed Nov 22 23:40:57 2006 pour KPlato par  doxygen 1.5.1-p1