diff options
Diffstat (limited to 'kplato/kptrequestresourcespanel.cpp')
-rw-r--r-- | kplato/kptrequestresourcespanel.cpp | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/kplato/kptrequestresourcespanel.cpp b/kplato/kptrequestresourcespanel.cpp new file mode 100644 index 00000000..790a6177 --- /dev/null +++ b/kplato/kptrequestresourcespanel.cpp @@ -0,0 +1,266 @@ +/* This file is part of the KDE project + Copyright (C) 2003 - 2005 Dag Andersen <[email protected]> + + 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; + version 2 of the License. + + 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 "kptrequestresourcespanel.h" +#include "kpttask.h" +#include "kptproject.h" +#include "kptresource.h" +#include "kptcalendar.h" + +#include <kdebug.h> +#include <tdemessagebox.h> +#include <tdelocale.h> +#include <kptcommand.h> + +#include <tqlistbox.h> +#include <tqpushbutton.h> +#include <tqlineedit.h> +#include <tqstring.h> +#include <tqspinbox.h> +#include <tqvalidator.h> +#include <tqcombobox.h> +#include <tqdatetime.h> +#include <tqdatetimeedit.h> + +namespace KPlato +{ + +ResourceTableItem::ResourceTableItem(Resource *resource, ResourceRequest *request, bool check) { + m_resource = resource; + m_request = request; + m_checked = check; + m_origChecked = check; + m_checkitem = 0; + m_units = 100; + m_origUnits = 100; + //kdDebug()<<k_funcinfo<<"Added: '"<<resource->name()<<"' checked="<<m_checked<<endl; +} + +ResourceTableItem::~ResourceTableItem() { + //kdDebug()<<k_funcinfo<<m_resource->name()<<endl; +} + +void ResourceTableItem::update() { + if (m_checkitem) + m_checked = m_checkitem->isChecked(); + //kdDebug()<<k_funcinfo<<m_resource->name()<<" checked="<<m_checked<<endl; +} + +void ResourceTableItem::insert(TQTable *table, int row) { + //kdDebug()<<k_funcinfo<<endl; + m_checkitem = new TQCheckTableItem(table, m_resource->name()); + m_checkitem->setChecked(m_checked); + table->setItem(row, 0, m_checkitem); + + //kdDebug()<<k_funcinfo<<"Added: '"<<m_resource->name()<<"' checked="<<m_checked<<endl; +} + +GroupLVItem::GroupLVItem(TQListView *parent, ResourceGroup *group, Task &task) + : TQListViewItem(parent, group->name(), TQString("%1").arg(group->units())), + m_group(group), + m_units(0) +{ + + m_request = task.resourceGroupRequest(group); + if (m_request) { + m_units = m_request->units(); + } + TQPtrListIterator<Resource> it(group->resources()); + for (; it.current(); ++it) { + //kdDebug()<<k_funcinfo<<"resource="<<it.current()->name()<<endl; + ResourceRequest *req=0; + if (m_request) { + req = m_request->find(it.current()); + } + m_resources.append(new ResourceTableItem(it.current(), req, (bool)req)); + } + + m_resources.setAutoDelete(true); +} + +GroupLVItem::~GroupLVItem() { + //kdDebug()<<k_funcinfo<<m_group->name()<<endl; +} + +void GroupLVItem::update() { + TQPtrListIterator<ResourceTableItem> it(m_resources); + for (; it.current(); ++it) { + it.current()->update(); + } +} + +void GroupLVItem::insert(TQTable *table) { + + // clear the table, must be a better way! + for (int i = table->numRows(); i > 0; --i) + table->removeRow(i-1); + + if (m_group->numResources() == 0) { + table->setNumRows(1); + table->setItem(0, 0, new TQCheckTableItem(table,i18n("None"))); + table->setItem(0, 1, new TQComboTableItem(table,i18n("None"))); + } else { + table->setNumRows(m_group->numResources()); + TQPtrListIterator<ResourceTableItem> it(m_resources); + for (int i = 0; it.current(); ++it, ++i) { + it.current()->insert(table, i); + } + } + table->adjustColumn(0); +} + +int GroupLVItem::numRequests() { + //kdDebug()<<k_funcinfo<<endl; + int value = m_units; + TQPtrListIterator<ResourceTableItem> it(m_resources); + for (; it.current(); ++it) { + value += it.current()->numRequests(); + } + return value; +} + +bool GroupLVItem::isNull() const { + //kdDebug()<<k_funcinfo<<endl; + TQPtrListIterator<ResourceTableItem> it(m_resources); + for (; it.current(); ++it) { + if (it.current()->isChecked()) + return false; + } + if (m_units > 0) + return false; + return true; +} + +RequestResourcesPanel::RequestResourcesPanel(TQWidget *parent, Task &task, bool baseline) + : TaskResourcesPanelBase(parent), + m_task(task), + m_worktime(0), + selectedGroup(0), + m_blockChanged(false) { + + Project *p = dynamic_cast<Project*>(task.projectNode()); + if (p) { + m_worktime = p->standardWorktime(); + + TQPtrListIterator<ResourceGroup> git(p->resourceGroups()); + for(int i=0; git.current(); ++git, ++i) { + ResourceGroup *grp = git.current(); + GroupLVItem *grpitem = new GroupLVItem(groupList, grp, task); + groupList->insertItem(grpitem); + //kdDebug()<<k_funcinfo<<" Added group: "<<grp->name()<<endl; + } + } + TQListViewItem *item = groupList->firstChild(); + if (item) { + groupList->setSelected(item, true); + groupChanged(item); + } + + resourceTable->setReadOnly(baseline); + + connect(groupList, TQT_SIGNAL(selectionChanged(TQListViewItem*)), TQT_SLOT(groupChanged(TQListViewItem*))); + connect(resourceTable, TQT_SIGNAL(valueChanged(int, int)), TQT_SLOT(resourceChanged(int, int))); +// connect(numUnits, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(unitsChanged(int))); + +} + +void RequestResourcesPanel::groupChanged(TQListViewItem *item) { + //kdDebug()<<k_funcinfo<<endl; + GroupLVItem *grp = dynamic_cast<GroupLVItem *>(item); + if (grp == 0) + return; + + if (selectedGroup) { + selectedGroup->update(); + } + selectedGroup = grp; + +/* m_blockChanged = true; + numUnits->setMaxValue(grp->m_group->units()); + numUnits->setValue(grp->m_units); + m_blockChanged = false;*/ + grp->insert(resourceTable); +} + +void RequestResourcesPanel::resourceChanged(int /*r*/, int /*c*/) { + //kdDebug()<<k_funcinfo<<"("<<r<<","<<c<<")"<<endl; + sendChanged(); +} + +void RequestResourcesPanel::unitsChanged(int units) { + //kdDebug()<<k_funcinfo<<endl; + if (selectedGroup) { + selectedGroup->m_units = units; + sendChanged(); + } +} + +KCommand *RequestResourcesPanel::buildCommand(Part *part) { + //kdDebug()<<k_funcinfo<<endl; + KMacroCommand *cmd = 0; + if (selectedGroup) { + selectedGroup->update(); + } + TQListViewItem *item = groupList->firstChild(); + for (; item; item = item->nextSibling()) { + GroupLVItem *grp = static_cast<GroupLVItem*>(item); + TQPtrListIterator<ResourceTableItem> it = grp->resources(); + for (; it.current(); ++it) { + if (it.current()->isChecked() != it.current()->isOrigChecked()) { + if (!cmd) cmd = new KMacroCommand(""); + if (it.current()->isChecked()) { + if (!grp->m_request) { + grp->m_request = new ResourceGroupRequest(grp->m_group, grp->m_units); + cmd->addCommand(new AddResourceGroupRequestCmd(part, m_task, grp->m_request)); + } + cmd->addCommand(new AddResourceRequestCmd(part, grp->m_request, new ResourceRequest(it.current()->resource(), it.current()->units()))); + + continue; + } + if (grp->m_request && it.current()->request()) { + cmd->addCommand(new RemoveResourceRequestCmd(part, grp->m_request, it.current()->request())); + if (grp->isNull()) { + cmd->addCommand(new RemoveResourceGroupRequestCmd(part, m_task, grp->m_request)); + } + } else { + kdError()<<k_funcinfo<<"Remove failed"<<endl; + } + continue; + } + if (!it.current()->isChecked()) { + continue; + } + } + } + return cmd; +} + +bool RequestResourcesPanel::ok() { + if (selectedGroup) + selectedGroup->update(); + return true; +} + +void RequestResourcesPanel::sendChanged() { + if (!m_blockChanged) emit changed(); +} + +} //KPlato namespace + +#include "kptrequestresourcespanel.moc" |