summaryrefslogtreecommitdiffstats
path: root/kplato/kptrequestresourcespanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kplato/kptrequestresourcespanel.cpp')
-rw-r--r--kplato/kptrequestresourcespanel.cpp266
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"