summaryrefslogtreecommitdiffstats
path: root/kplato/kpttaskdefaultpanel.cc
diff options
context:
space:
mode:
Diffstat (limited to 'kplato/kpttaskdefaultpanel.cc')
-rw-r--r--kplato/kpttaskdefaultpanel.cc515
1 files changed, 515 insertions, 0 deletions
diff --git a/kplato/kpttaskdefaultpanel.cc b/kplato/kpttaskdefaultpanel.cc
new file mode 100644
index 00000000..a76249d3
--- /dev/null
+++ b/kplato/kpttaskdefaultpanel.cc
@@ -0,0 +1,515 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 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 "kpttaskdefaultpanel.h"
+#include "kpttask.h"
+#include "kptcommand.h"
+#include "kptduration.h"
+#include "kptdurationwidget.h"
+#include "kptcalendar.h"
+#include "kptdatetime.h"
+#include "kptconfig.h"
+#include "kptpart.h"
+
+#include <kmessagebox.h>
+#include <klineedit.h>
+#include <ktextedit.h>
+#include <kcombobox.h>
+#include <kdatetimewidget.h>
+#include <klocale.h>
+#include <kcommand.h>
+#include <kabc/addressee.h>
+#include <kabc/addresseedialog.h>
+#include <kdatewidget.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qdatetime.h>
+#include <qdatetimeedit.h>
+#include <qgroupbox.h>
+#include <qpushbutton.h>
+#include <qspinbox.h>
+
+#include <kdebug.h>
+
+namespace KPlato
+{
+
+TaskDefaultPanel::TaskDefaultPanel(Task &task, StandardWorktime *workTime, QWidget *parent, const char *n)
+ : ConfigTaskPanelImpl(parent, n),
+ m_task(task),
+ m_dayLength(24)
+{
+ setStartValues(task, workTime);
+}
+
+void TaskDefaultPanel::setStartValues(Task &task, StandardWorktime *workTime) {
+ m_effort = m_duration = task.effort()->expected();
+ leaderfield->setText(task.leader());
+ descriptionfield->setText(task.description());
+
+ setEstimateFields(DurationWidget::Days|DurationWidget::Hours|DurationWidget::Minutes);
+ if (workTime) {
+ //kdDebug()<<k_funcinfo<<"daylength="<<workTime->day()<<endl;
+ m_dayLength = workTime->day();
+ if (task.effort()->type() == Effort::Type_Effort) {
+ setEstimateScales(m_dayLength);
+ }
+ }
+ setEstimateFieldUnit(0, i18n("days", "d"));
+ setEstimateFieldUnit(1, i18n("hours", "h"));
+ setEstimateFieldUnit(2, i18n("minutes", "m"));
+ setEstimateType(task.effort()->type());
+
+ setSchedulingType(task.constraint());
+ if (task.constraintStartTime().isValid()) {
+ setStartDateTime(task.constraintStartTime());
+ } else {
+ QDate date = QDate::currentDate();
+ setStartDateTime(QDateTime(date, QTime()));
+ }
+ if (task.constraintEndTime().isValid()) {
+ setEndDateTime(task.constraintEndTime());
+ } else {
+ setEndDateTime(QDateTime(startDate().addDays(1), QTime()));
+ }
+ //kdDebug()<<k_funcinfo<<"Effort: "<<task.effort()->expected().toString()<<endl;
+ setEstimate(task.effort()->expected());
+ setOptimistic(task.effort()->optimisticRatio());
+ setPessimistic(task.effort()->pessimisticRatio());
+
+ leaderfield->setFocus();
+}
+
+KMacroCommand *TaskDefaultPanel::buildCommand(Part *part) {
+ KMacroCommand *cmd = new KMacroCommand(i18n("Modify Default Task"));
+ bool modified = false;
+
+ Duration dt = Duration();
+
+ if (m_task.leader() != leaderfield->text()) {
+ cmd->addCommand(new NodeModifyLeaderCmd(part, m_task, leaderfield->text()));
+ modified = true;
+ }
+ if (m_task.description() != descriptionfield->text()) {
+ cmd->addCommand(new NodeModifyDescriptionCmd(part, m_task, descriptionfield->text()));
+ modified = true;
+ }
+ Node::ConstraintType c = (Node::ConstraintType)schedulingType();
+ if (c != m_task.constraint()) {
+ cmd->addCommand(new NodeModifyConstraintCmd(part, m_task, c));
+ modified = true;
+ }
+ if (startDateTime() != m_task.constraintStartTime() &&
+ (c == Node::FixedInterval || c == Node::StartNotEarlier || c == Node::MustStartOn)) {
+ cmd->addCommand(new NodeModifyConstraintStartTimeCmd(part, m_task, startDateTime()));
+ modified = true;
+ }
+ if (endDateTime() != m_task.constraintEndTime() &&
+ (c == Node::FinishNotLater || c == Node::FixedInterval || c == Node::MustFinishOn)) {
+ cmd->addCommand(new NodeModifyConstraintEndTimeCmd(part, m_task, endDateTime()));
+ modified = true;
+ }
+ int et = estimationType();
+ if (et != m_task.effort()->type()) {
+ cmd->addCommand(new ModifyEffortTypeCmd(part, m_task, m_task.effort()->type(), et));
+ modified = true;
+ }
+ dt = estimationValue();
+ kdDebug()<<k_funcinfo<<"Estimate: "<<dt.toString()<<endl;
+ bool expchanged = dt != m_task.effort()->expected();
+ if ( expchanged ) {
+ cmd->addCommand(new ModifyEffortCmd(part, m_task, m_task.effort()->expected(), dt));
+ modified = true;
+ }
+ int x = optimistic();
+ if ( x != m_task.effort()->optimisticRatio() || expchanged) {
+ cmd->addCommand(new EffortModifyOptimisticRatioCmd(part, m_task, m_task.effort()->optimisticRatio(), x));
+ modified = true;
+ }
+ x = pessimistic();
+ if ( x != m_task.effort()->pessimisticRatio() || expchanged) {
+ cmd->addCommand(new EffortModifyPessimisticRatioCmd(part, m_task, m_task.effort()->pessimisticRatio(), x));
+ modified = true;
+ }
+ if (!modified) {
+ delete cmd;
+ return 0;
+ }
+ return cmd;
+}
+
+bool TaskDefaultPanel::ok() {
+ return true;
+}
+
+void TaskDefaultPanel::estimationTypeChanged(int type) {
+ if (type == 0 /*Effort*/) {
+ Duration d = estimationValue();
+ setEstimateScales(m_dayLength);
+ //setEstimate(d);
+ } else {
+ Duration d = estimationValue();
+ setEstimateScales(24);
+ //setEstimate(d);
+ }
+ ConfigTaskPanelImpl::estimationTypeChanged(type);
+}
+
+void TaskDefaultPanel::scheduleTypeChanged(int value)
+{
+ if (value == 6 /*Fixed interval*/) {
+ if (estimateType->currentItem() == 1/*duration*/){
+ setEstimateScales(24);
+ //estimate->setEnabled(false);
+ //setEstimate(DateTime(endDateTime()) - DateTime(startDateTime()));
+ }
+ } else {
+ setEstimateScales(m_dayLength);
+ estimate->setEnabled(true);
+ }
+ ConfigTaskPanelImpl::scheduleTypeChanged(value);
+}
+
+
+//-----------------------------
+ConfigTaskPanelImpl::ConfigTaskPanelImpl(QWidget *p, const char *n)
+ : ConfigTaskPanelBase(p, n) {
+
+ connect(leaderfield, SIGNAL(textChanged(const QString &)), SLOT(checkAllFieldsFilled()));
+ connect(chooseLeader, SIGNAL(clicked()), SLOT(changeLeader()));
+ connect(estimateType, SIGNAL(activated(int)), SLOT(estimationTypeChanged(int)));
+ connect(scheduleType, SIGNAL(activated(int)), SLOT(scheduleTypeChanged(int)));
+ connect(scheduleStartDate, SIGNAL(changed(QDate)), SLOT(startDateChanged()));
+ connect(scheduleStartTime, SIGNAL(valueChanged(const QTime&)), SLOT(startTimeChanged(const QTime&)));
+ connect(scheduleEndDate, SIGNAL(changed(QDate)), SLOT(endDateChanged()));
+ connect(scheduleEndTime, SIGNAL(valueChanged(const QTime&)), SLOT(endTimeChanged(const QTime&)));
+ connect(estimate, SIGNAL(valueChanged()), SLOT(checkAllFieldsFilled()));
+ connect(optimisticValue, SIGNAL(valueChanged(int)), SLOT(checkAllFieldsFilled()));
+ connect(pessimisticValue, SIGNAL(valueChanged(int)), SLOT(checkAllFieldsFilled()));
+ connect(descriptionfield, SIGNAL(textChanged()), SLOT(checkAllFieldsFilled()));
+}
+
+void ConfigTaskPanelImpl::setSchedulingType(int type)
+{
+ enableDateTime(type);
+ scheduleType->setCurrentItem(type);
+ emit schedulingTypeChanged(type);
+}
+
+int ConfigTaskPanelImpl::schedulingType() const
+{
+ return scheduleType->currentItem();
+}
+
+void ConfigTaskPanelImpl::changeLeader()
+{
+ KABC::Addressee a = KABC::AddresseeDialog::getAddressee(this);
+ if (!a.isEmpty())
+ {
+ leaderfield->setText(a.fullEmail());
+ }
+}
+
+void ConfigTaskPanelImpl::setEstimationType( int type )
+{
+ estimateType->setCurrentItem(type);
+}
+
+int ConfigTaskPanelImpl::estimationType() const
+{
+ return estimateType->currentItem();
+}
+
+void ConfigTaskPanelImpl::setOptimistic( int value )
+{
+ optimisticValue->setValue(value);
+}
+
+void ConfigTaskPanelImpl::setPessimistic( int value )
+{
+ pessimisticValue->setValue(value);
+}
+
+int ConfigTaskPanelImpl::optimistic() const
+{
+ return optimisticValue->value();
+}
+
+int ConfigTaskPanelImpl::pessimistic()
+{
+ return pessimisticValue->value();
+}
+
+void ConfigTaskPanelImpl::enableDateTime( int /*scheduleType*/ )
+{
+ scheduleStartTime->setEnabled(true);
+ scheduleEndTime->setEnabled(true);
+ scheduleStartDate->setEnabled(true);
+ scheduleEndDate->setEnabled(true);
+/* switch (scheduleType)
+ {
+ case 0: //ASAP
+ case 1: //ALAP
+ break;
+ case 2: //Must start on
+ case 4: // Start not earlier
+ if (useTime) {
+ scheduleStartTime->setEnabled(true);
+ scheduleEndTime->setEnabled(false);
+ }
+ scheduleStartDate->setEnabled(true);
+ scheduleEndDate->setEnabled(false);
+ break;
+ case 3: //Must finish on
+ case 5: // Finish not later
+ if (useTime) {
+ scheduleStartTime->setEnabled(false);
+ scheduleEndTime->setEnabled(true);
+ }
+ scheduleStartDate->setEnabled(false);
+ scheduleEndDate->setEnabled(true);
+ break;
+ case 6: //Fixed interval
+ if (useTime) {
+ scheduleStartTime->setEnabled(true);
+ scheduleEndTime->setEnabled(true);
+ }
+ scheduleStartDate->setEnabled(true);
+ scheduleEndDate->setEnabled(true);
+ break;
+ default:
+ break;
+ }*/
+}
+
+
+void ConfigTaskPanelImpl::estimationTypeChanged( int /*type*/ )
+{
+ checkAllFieldsFilled();
+}
+
+
+
+void ConfigTaskPanelImpl::setEstimate( const Duration & duration)
+{
+ estimate->setValue( duration );
+}
+
+
+void ConfigTaskPanelImpl::setEstimateType( int type)
+{
+ estimateType->setCurrentItem(type);
+}
+
+
+void ConfigTaskPanelImpl::checkAllFieldsFilled()
+{
+ emit changed();
+ emit obligatedFieldsFilled(true);
+}
+
+
+Duration ConfigTaskPanelImpl::estimationValue()
+{
+ return estimate->value();
+}
+
+
+void ConfigTaskPanelImpl::setEstimateFields( int mask )
+{
+ estimate->setVisibleFields(mask);
+}
+
+
+void ConfigTaskPanelImpl::setEstimateScales( double day )
+{
+ estimate->setFieldScale(0, day);
+ estimate->setFieldRightscale(0, day);
+
+ estimate->setFieldLeftscale(1, day);
+}
+
+
+void ConfigTaskPanelImpl::setEstimateFieldUnit( int field, QString unit )
+{
+ estimate->setFieldUnit(field, unit);
+}
+
+void ConfigTaskPanelImpl::startDateChanged()
+{
+ if (!scheduleStartDate->isEnabled()) {
+ return;
+ }
+ QDate date = startDate();
+ if (startDateTime() > endDateTime())
+ {
+ scheduleEndTime->blockSignals(true);
+ scheduleEndDate->blockSignals(true);
+ setEndDate(date);
+ setEndTime(startTime());
+ scheduleEndTime->blockSignals(false);
+ scheduleEndDate->blockSignals(false);
+ }
+ if (scheduleType->currentItem() == 6 /*FixedInterval*/)
+ {
+ estimationTypeChanged(estimateType->currentItem());
+ }
+ checkAllFieldsFilled();
+}
+
+void ConfigTaskPanelImpl::startTimeChanged( const QTime &time )
+{
+ if (!scheduleStartTime->isEnabled()) {
+ return;
+ }
+ if (startDateTime() > endDateTime())
+ {
+ scheduleEndTime->blockSignals(true);
+ setEndTime(time);
+ scheduleEndTime->blockSignals(false);
+ }
+ if (scheduleType->currentItem() == 6 /*FixedInterval*/)
+ {
+ estimationTypeChanged(estimateType->currentItem());
+ }
+ checkAllFieldsFilled();
+}
+
+
+void ConfigTaskPanelImpl::endDateChanged()
+{
+ if (!scheduleEndDate->isEnabled()) {
+ return;
+ }
+ QDate date = endDate();
+ if (endDateTime() < startDateTime())
+ {
+ scheduleStartTime->blockSignals(true);
+ scheduleStartDate->blockSignals(true);
+ setStartDate(date);
+ setStartTime(endTime());
+ scheduleStartTime->blockSignals(false);
+ scheduleStartDate->blockSignals(false);
+ }
+
+ if (scheduleType->currentItem() == 6 /*FixedInterval*/)
+ {
+ estimationTypeChanged(estimateType->currentItem());
+ }
+ checkAllFieldsFilled();
+}
+
+void ConfigTaskPanelImpl::endTimeChanged( const QTime &time )
+{
+ if (!scheduleEndTime->isEnabled()) {
+ return;
+ }
+ if (endDateTime() < startDateTime())
+ {
+ scheduleStartTime->blockSignals(true);
+ setStartTime(time);
+ scheduleStartTime->blockSignals(false);
+ }
+
+ if (scheduleType->currentItem() == 6 /*FixedInterval*/)
+ {
+ estimationTypeChanged(estimateType->currentItem());
+ }
+ checkAllFieldsFilled();
+}
+
+void ConfigTaskPanelImpl::scheduleTypeChanged( int value )
+{
+ estimationTypeChanged(estimateType->currentItem());
+ enableDateTime(value);
+ checkAllFieldsFilled();
+}
+
+
+QDateTime ConfigTaskPanelImpl::startDateTime()
+{
+ return QDateTime(startDate(), startTime());
+}
+
+
+QDateTime ConfigTaskPanelImpl::endDateTime()
+{
+ return QDateTime(endDate(), endTime());
+}
+
+void ConfigTaskPanelImpl::setStartTime( const QTime &time )
+{
+ scheduleStartTime->setTime(time);
+}
+
+void ConfigTaskPanelImpl::setEndTime( const QTime &time )
+{
+ scheduleEndTime->setTime(time);
+}
+
+QTime ConfigTaskPanelImpl::startTime() const
+{
+ return scheduleStartTime->time();
+}
+
+QTime ConfigTaskPanelImpl::endTime()
+{
+ return scheduleEndTime->time();
+}
+
+QDate ConfigTaskPanelImpl::startDate()
+{
+ return scheduleStartDate->date();
+}
+
+
+QDate ConfigTaskPanelImpl::endDate()
+{
+ return scheduleEndDate->date();
+}
+
+void ConfigTaskPanelImpl::setStartDateTime( const QDateTime &dt )
+{
+ setStartDate(dt.date());
+ setStartTime(dt.time());
+}
+
+
+void ConfigTaskPanelImpl::setEndDateTime( const QDateTime &dt )
+{
+ setEndDate(dt.date());
+ setEndTime(dt.time());
+}
+
+void ConfigTaskPanelImpl::setStartDate( const QDate &date )
+{
+ scheduleStartDate->setDate(date);
+}
+
+
+void ConfigTaskPanelImpl::setEndDate( const QDate &date )
+{
+ scheduleEndDate->setDate(date);
+}
+
+
+} //KPlato namespace
+
+#include "kpttaskdefaultpanel.moc"