summaryrefslogtreecommitdiffabout
path: root/korganizer/koeditorgeneraltodo.cpp
Side-by-side diff
Diffstat (limited to 'korganizer/koeditorgeneraltodo.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/koeditorgeneraltodo.cpp467
1 files changed, 467 insertions, 0 deletions
diff --git a/korganizer/koeditorgeneraltodo.cpp b/korganizer/koeditorgeneraltodo.cpp
new file mode 100644
index 0000000..57837bb
--- a/dev/null
+++ b/korganizer/koeditorgeneraltodo.cpp
@@ -0,0 +1,467 @@
+/*
+ This file is part of KOrganizer.
+ Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include <qtooltip.h>
+#include <qfiledialog.h>
+#include <qlayout.h>
+#include <qvbox.h>
+#include <qbuttongroup.h>
+#include <qvgroupbox.h>
+#include <qwidgetstack.h>
+#include <qdatetime.h>
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <krestrictedline.h>
+#include <kstandarddirs.h>
+#include <kfiledialog.h>
+
+#include <libkcal/todo.h>
+
+#include <libkdepim/kdateedit.h>
+
+#include "koprefs.h"
+#include "ktimeedit.h"
+
+#include "koeditorgeneraltodo.h"
+#include "kolocationbox.h"
+#include "koeditorgeneraltodo.moc"
+
+KOEditorGeneralTodo::KOEditorGeneralTodo(QObject* parent,
+ const char* name)
+ : KOEditorGeneral( parent, name)
+{
+}
+
+KOEditorGeneralTodo::~KOEditorGeneralTodo()
+{
+}
+
+void KOEditorGeneralTodo::finishSetup()
+{
+
+// QWidget::setTabOrder(mSummaryEdit, mLocationEdit);
+// QWidget::setTabOrder(mLocationEdit, mDueCheck);
+// QWidget::setTabOrder(mDueCheck, mDueDateEdit);
+// QWidget::setTabOrder(mDueDateEdit, mDueTimeEdit);
+// QWidget::setTabOrder(mDueTimeEdit, mStartCheck);
+// QWidget::setTabOrder(mStartCheck, mStartDateEdit);
+// QWidget::setTabOrder(mStartDateEdit, mStartTimeEdit);
+// QWidget::setTabOrder(mStartTimeEdit, mTimeButton);
+// QWidget::setTabOrder(mTimeButton, mCompletedCombo);
+// QWidget::setTabOrder(mCompletedCombo, mPriorityCombo);
+// QWidget::setTabOrder(mPriorityCombo, mAlarmButton);
+// QWidget::setTabOrder(mAlarmButton, mCategoriesButton);
+// QWidget::setTabOrder(mCategoriesButton, mSecrecyCombo);
+// QWidget::setTabOrder(mSecrecyCombo, mDescriptionEdit);
+ mSummaryEdit->load(KOLocationBox::SUMMARYTODO);
+ mSummaryEdit->setFocus();
+}
+
+void KOEditorGeneralTodo::initTime(QWidget *parent,QBoxLayout *topLayout)
+{
+ QBoxLayout *timeLayout = new QVBoxLayout(topLayout);
+
+ QGroupBox *timeGroupBox = new QGroupBox(1,QGroupBox::Horizontal,
+ i18n("Date && Time"),parent);
+ timeLayout->addWidget(timeGroupBox);
+ timeGroupBox->layout()->setSpacing( 0 );
+ timeGroupBox->layout()->setMargin( 5 );
+ QFrame *timeBoxFrame = new QFrame(timeGroupBox);
+
+ QGridLayout *layoutTimeBox = new QGridLayout(timeBoxFrame,3,3);
+ layoutTimeBox->setSpacing(topLayout->spacing());
+ layoutTimeBox->setColStretch( 1, 1 );
+
+ mDueCheck = new QCheckBox(i18n("Due:"),timeBoxFrame);
+ layoutTimeBox->addWidget(mDueCheck,0,0);
+ connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(enableDueEdit(bool)));
+ connect(mDueCheck,SIGNAL(toggled(bool)),SLOT(showAlarm()));
+
+
+ mDueDateEdit = new KDateEdit(timeBoxFrame);
+ layoutTimeBox->addWidget(mDueDateEdit,0,1);
+
+ mDueTimeEdit = new KOTimeEdit(timeBoxFrame);
+ layoutTimeBox->addWidget(mDueTimeEdit,0,2);
+
+
+ mStartCheck = new QCheckBox(i18n("Start:"),timeBoxFrame);
+ layoutTimeBox->addWidget(mStartCheck,1,0);
+ connect(mStartCheck,SIGNAL(toggled(bool)),SLOT(enableStartEdit(bool)));
+
+ mStartDateEdit = new KDateEdit(timeBoxFrame);
+ layoutTimeBox->addWidget(mStartDateEdit,1,1);
+
+ mStartTimeEdit = new KOTimeEdit(timeBoxFrame);
+ layoutTimeBox->addWidget(mStartTimeEdit,1,2);
+
+
+ mTimeButton = new QCheckBox(i18n("Time associated"),timeBoxFrame);
+ layoutTimeBox->addMultiCellWidget(mTimeButton,2,2,0,1);
+
+ connect(mTimeButton,SIGNAL(toggled(bool)),SLOT(enableTimeEdits(bool)));
+
+ // some more layouting
+ //layoutTimeBox->setColStretch(3,1);
+}
+
+
+void KOEditorGeneralTodo::initCompletion(QWidget *parent, QBoxLayout *topLayout)
+{
+ mCompletedCombo = new QComboBox(parent);
+ // xgettext:no-c-format
+ mCompletedCombo->insertItem(i18n(" 0 %"));
+ // xgettext:no-c-format
+ mCompletedCombo->insertItem(i18n(" 20 %"));
+ // xgettext:no-c-format
+ mCompletedCombo->insertItem(i18n(" 40 %"));
+ // xgettext:no-c-format
+ mCompletedCombo->insertItem(i18n(" 60 %"));
+ // xgettext:no-c-format
+ mCompletedCombo->insertItem(i18n(" 80 %"));
+ // xgettext:no-c-format
+ mCompletedCombo->insertItem(i18n("100 %"));
+ connect(mCompletedCombo,SIGNAL(activated(int)),SLOT(completedChanged(int)));
+ topLayout->addWidget(mCompletedCombo);
+
+ mCompletedLabel = new QLabel(i18n("completed"),parent);
+ topLayout->addWidget(mCompletedLabel);
+}
+
+void KOEditorGeneralTodo::initPriority(QWidget *parent, QBoxLayout *topLayout)
+{
+
+ QHBox* h = new QHBox ( parent );
+ topLayout->addWidget( h );
+ QLabel *priorityLabel = new QLabel(i18n("Priority:"), h);
+ // topLayout->addWidget(priorityLabel);
+
+ mPriorityCombo = new QComboBox( h );
+ mPriorityCombo->insertItem(i18n("1 (high)"));
+ mPriorityCombo->insertItem(i18n("2"));
+ mPriorityCombo->insertItem(i18n("3"));
+ mPriorityCombo->insertItem(i18n("4"));
+ mPriorityCombo->insertItem(i18n("5 (low)"));
+ //topLayout->addWidget(mPriorityCombo);
+}
+
+void KOEditorGeneralTodo::initStatus(QWidget *parent,QBoxLayout *topLayout)
+{
+ QBoxLayout *statusLayout = new QHBoxLayout(topLayout);
+
+ initCompletion( parent, statusLayout );
+
+ statusLayout->addStretch( 1 );
+
+ initPriority( parent, statusLayout );
+}
+
+void KOEditorGeneralTodo::setDefaults(QDateTime due,bool allDay)
+{
+
+ mSummaryEdit->load(KOLocationBox::SUMMARYTODO);
+ mLocationEdit->load(KOLocationBox::LOCATION);
+ KOEditorGeneral::setDefaults(allDay);
+
+ mTimeButton->setChecked( !allDay );
+ if(mTimeButton->isChecked()) {
+ mTimeButton->setEnabled(true);
+ }
+ else {
+ mTimeButton->setEnabled(false);
+ }
+
+ enableTimeEdits( !allDay );
+
+ mDueCheck->setChecked(false);
+ enableDueEdit(false);
+
+ alarmDisable(true);
+
+ mStartCheck->setChecked(false);
+ enableStartEdit(false);
+
+ mDueDateEdit->setDate(due.date());
+ mDueTimeEdit->setTime(due.time());
+
+ mStartDateEdit->setDate(QDate::currentDate());
+ mStartTimeEdit->setTime(QTime::currentTime());
+
+ mPriorityCombo->setCurrentItem(2);
+ mCompletedLabel->setText(i18n("completed"));;
+ mCompletedCombo->setCurrentItem(0);
+}
+
+void KOEditorGeneralTodo::readTodo(Todo *todo)
+{
+
+ mSummaryEdit->load(KOLocationBox::SUMMARYTODO);
+ mLocationEdit->load(KOLocationBox::LOCATION);
+ KOEditorGeneral::readIncidence(todo);
+
+ QDateTime dueDT;
+
+ if (todo->hasDueDate()) {
+ enableAlarmEdit(true);
+ dueDT = todo->dtDue();
+ mDueDateEdit->setDate(todo->dtDue().date());
+ mDueTimeEdit->setTime(todo->dtDue().time());
+ mDueCheck->setChecked(true);
+ } else {
+ alarmDisable(true);
+ mDueDateEdit->setEnabled(false);
+ mDueTimeEdit->setEnabled(false);
+ mDueDateEdit->setDate(QDate::currentDate());
+ mDueTimeEdit->setTime(QTime::currentTime());
+ mDueCheck->setChecked(false);
+ }
+
+ if (todo->hasStartDate()) {
+ mStartDateEdit->setDate(todo->dtStart().date());
+ mStartTimeEdit->setTime(todo->dtStart().time());
+ mStartCheck->setChecked(true);
+ } else {
+ mStartDateEdit->setEnabled(false);
+ mStartTimeEdit->setEnabled(false);
+ mStartDateEdit->setDate(QDate::currentDate());
+ mStartTimeEdit->setTime(QTime::currentTime());
+ mStartCheck->setChecked(false);
+ }
+
+ mTimeButton->setChecked( !todo->doesFloat() );
+
+ mCompletedCombo->setCurrentItem(todo->percentComplete() / 20);
+ if (todo->isCompleted() && todo->hasCompletedDate()) {
+ mCompleted = todo->completed();
+ }
+ setCompletedDate();
+
+ mPriorityCombo->setCurrentItem(todo->priority()-1);
+}
+
+void KOEditorGeneralTodo::writeTodo(Todo *todo)
+{
+ KOEditorGeneral::writeIncidence(todo);
+
+ // temp. until something better happens.
+ QString tmpStr;
+
+ todo->setHasDueDate(mDueCheck->isChecked());
+ todo->setHasStartDate(mStartCheck->isChecked());
+
+ QDate tmpDate;
+ QTime tmpTime;
+ QDateTime tmpDT;
+ if ( mTimeButton->isChecked() ) {
+ todo->setFloats(false);
+
+ // set due date/time
+ tmpDate = mDueDateEdit->date();
+ tmpTime = mDueTimeEdit->getTime();
+ tmpDT.setDate(tmpDate);
+ tmpDT.setTime(tmpTime);
+ todo->setDtDue(tmpDT);
+
+ // set start date/time
+ tmpDate = mStartDateEdit->date();
+ tmpTime = mStartTimeEdit->getTime();
+ tmpDT.setDate(tmpDate);
+ tmpDT.setTime(tmpTime);
+ todo->setDtStart(tmpDT);
+ } else {
+ todo->setFloats(true);
+
+ // need to change this.
+ tmpDate = mDueDateEdit->date();
+ tmpTime.setHMS(0,0,0);
+ tmpDT.setDate(tmpDate);
+ tmpDT.setTime(tmpTime);
+ todo->setDtDue(tmpDT);
+
+ tmpDate = mStartDateEdit->date();
+ tmpTime.setHMS(0,0,0);
+ tmpDT.setDate(tmpDate);
+ tmpDT.setTime(tmpTime);
+ todo->setDtStart(tmpDT);
+ }
+
+ todo->setPriority(mPriorityCombo->currentItem()+1);
+
+ // set completion state
+ todo->setPercentComplete(mCompletedCombo->currentItem() * 20);
+
+ if (mCompletedCombo->currentItem() == 5 && mCompleted.isValid()) {
+ todo->setCompleted(mCompleted);
+ }
+ mSummaryEdit->save(KOLocationBox::SUMMARYTODO);
+}
+
+void KOEditorGeneralTodo::enableDueEdit(bool enable)
+{
+ mDueDateEdit->setEnabled( enable );
+
+ if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
+ mTimeButton->setEnabled(true);
+ }
+ else {
+ mTimeButton->setEnabled(false);
+ mTimeButton->setChecked(false);
+ }
+
+ if (enable) {
+ mDueTimeEdit->setEnabled( mTimeButton->isChecked() );
+ } else {
+ mDueTimeEdit->setEnabled( false );
+ }
+}
+
+void KOEditorGeneralTodo::enableStartEdit( bool enable )
+{
+ mStartDateEdit->setEnabled( enable );
+
+ if(mDueCheck->isChecked() || mStartCheck->isChecked()) {
+ mTimeButton->setEnabled(true);
+ }
+ else {
+ mTimeButton->setEnabled(false);
+ mTimeButton->setChecked(false);
+ }
+
+ if (enable) {
+ mStartTimeEdit->setEnabled( mTimeButton->isChecked() );
+ } else {
+ mStartTimeEdit->setEnabled( false );
+ }
+}
+
+void KOEditorGeneralTodo::enableTimeEdits(bool enable)
+{
+ if(mStartCheck->isChecked()) {
+ mStartTimeEdit->setEnabled( enable );
+ }
+ if(mDueCheck->isChecked()) {
+ mDueTimeEdit->setEnabled( enable );
+ }
+}
+
+void KOEditorGeneralTodo::showAlarm()
+{
+ if ( mDueCheck->isChecked() ) {
+ alarmDisable(false);
+ }
+ else {
+ alarmDisable(true);
+ }
+}
+
+bool KOEditorGeneralTodo::validateInput()
+{
+ if (mDueCheck->isChecked()) {
+ if (!mDueDateEdit->inputIsValid()) {
+ KMessageBox::sorry(0,i18n("Please specify a valid due date."));
+ return false;
+ }
+ if (mTimeButton->isChecked()) {
+ if (!mDueTimeEdit->inputIsValid()) {
+ KMessageBox::sorry(0,i18n("Please specify a valid due time."));
+ return false;
+ }
+ }
+ }
+
+ if (mStartCheck->isChecked()) {
+ if (!mStartDateEdit->inputIsValid()) {
+ KMessageBox::sorry(0,i18n("Please specify a valid start date."));
+ return false;
+ }
+ if (mTimeButton->isChecked()) {
+ if (!mStartTimeEdit->inputIsValid()) {
+ KMessageBox::sorry(0,i18n("Please specify a valid start time."));
+ return false;
+ }
+ }
+ }
+
+ if (mStartCheck->isChecked() && mDueCheck->isChecked()) {
+ QDateTime startDate;
+ QDateTime dueDate;
+ startDate.setDate(mStartDateEdit->date());
+ dueDate.setDate(mDueDateEdit->date());
+ if (mTimeButton->isChecked()) {
+ startDate.setTime(mStartTimeEdit->getTime());
+ dueDate.setTime(mDueTimeEdit->getTime());
+ }
+ if (startDate > dueDate) {
+ KMessageBox::sorry(0,
+ i18n("The start date cannot be after the due date."));
+ return false;
+ }
+ }
+
+ return KOEditorGeneral::validateInput();
+}
+
+void KOEditorGeneralTodo::completedChanged(int index)
+{
+ if (index == 5) {
+ mCompleted = QDateTime::currentDateTime();
+ }
+ setCompletedDate();
+}
+
+void KOEditorGeneralTodo::setCompletedDate()
+{
+ if (mCompletedCombo->currentItem() == 5 && mCompleted.isValid()) {
+ mCompletedLabel->setText(i18n("completed on %1")
+ .arg(KGlobal::locale()->formatDateTime(mCompleted)));
+ } else {
+ mCompletedLabel->setText(i18n("completed"));
+ }
+}
+
+void KOEditorGeneralTodo::modified (Todo* todo, int modification)
+{
+ switch (modification) {
+ case KOGlobals::PRIORITY_MODIFIED:
+ mPriorityCombo->setCurrentItem(todo->priority()-1);
+ break;
+ case KOGlobals::COMPLETION_MODIFIED:
+ mCompletedCombo->setCurrentItem(todo->percentComplete() / 20);
+ if (todo->isCompleted() && todo->hasCompletedDate()) {
+ mCompleted = todo->completed();
+ }
+ setCompletedDate();
+ break;
+ case KOGlobals::CATEGORY_MODIFIED:
+ setCategories (todo->categoriesStr ());
+ break;
+ case KOGlobals::UNKNOWN_MODIFIED: // fall through
+ default:
+ readTodo( todo );
+ break;
+ }
+}