summaryrefslogtreecommitdiffabout
path: root/korganizer/kotodoeditor.cpp
Side-by-side diff
Diffstat (limited to 'korganizer/kotodoeditor.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/kotodoeditor.cpp373
1 files changed, 373 insertions, 0 deletions
diff --git a/korganizer/kotodoeditor.cpp b/korganizer/kotodoeditor.cpp
new file mode 100644
index 0000000..1c44f2b
--- a/dev/null
+++ b/korganizer/kotodoeditor.cpp
@@ -0,0 +1,373 @@
+/*
+ This file is part of KOrganizer.
+ Copyright (c) 1997, 1998 Preston Brown
+ 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 <qframe.h>
+#include <qpixmap.h>
+#include <qlayout.h>
+#include <qhbox.h>
+#include <qdir.h>
+#include <qdatetime.h>
+#include <qapplication.h>
+
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kfiledialog.h>
+#include <kstandarddirs.h>
+#include <kmessagebox.h>
+
+#include <libkdepim/categoryselectdialog.h>
+#include <libkcal/calendarlocal.h>
+#include <libkcal/calendarresources.h>
+#include <libkcal/resourcecalendar.h>
+#include <libkcal/icalformat.h>
+#include <kresources/resourceselectdialog.h>
+
+#include "koprefs.h"
+
+#include "kotodoeditor.h"
+#include "kotodoeditor.moc"
+extern int globalFlagBlockAgenda;
+
+KOTodoEditor::KOTodoEditor( Calendar *calendar, QWidget *parent ) :
+ KOIncidenceEditor( i18n("Edit To-Do"), calendar, parent )
+{
+ mTodo = 0;
+ mRelatedTodo = 0;
+ findButton(User1)->hide();
+ init();
+}
+
+KOTodoEditor::~KOTodoEditor()
+{
+ emit dialogClose( mTodo );
+}
+
+void KOTodoEditor::init()
+{
+ setupGeneral();
+ setupAttendeesTab();
+}
+void KOTodoEditor::setCategories( QString s )
+{
+ mGeneral->setCategories(s);
+}
+void KOTodoEditor::setSecrecy( int sec )
+{
+ mGeneral->setSecrecy( sec );
+}
+void KOTodoEditor::reload()
+{
+ if ( mTodo ) readTodo( mTodo );
+}
+
+void KOTodoEditor::setupGeneral()
+{
+ mGeneral = new KOEditorGeneralTodo(this);
+ connect ( mGeneral, SIGNAL ( allAccepted() ), this, SLOT ( slotOk () ) );
+
+ // connect(mGeneral,SIGNAL(openCategoryDialog()),mCategoryDialog,SLOT(show()));
+ //connect(mCategoryDialog, SIGNAL(categoriesSelected(const QString &)),
+ // mGeneral,SLOT(setCategories(const QString &)));
+
+ if (KOPrefs::instance()->mCompactDialogs) {
+ QFrame *topFrame = addPage(i18n("General"));
+
+ QBoxLayout *topLayout = new QVBoxLayout(topFrame);
+ if ( QApplication::desktop()->width() < 480 ) {
+ topLayout->setMargin(1);
+ topLayout->setSpacing(1);
+ } else {
+ topLayout->setMargin(marginHint()-1);
+ topLayout->setSpacing(spacingHint()-1);
+ }
+ mGeneral->initHeader(topFrame,topLayout);
+ mGeneral->initTime(topFrame,topLayout);
+ mGeneral->initAlarm(topFrame,topLayout);
+ mGeneral->enableAlarm( false );
+
+
+ QBoxLayout *priorityLayout;
+ if ( QApplication::desktop()->width() < 500 )
+ priorityLayout = new QVBoxLayout( topLayout );
+ else
+ priorityLayout = new QHBoxLayout( topLayout );
+ QWidget* prioWidget = new QWidget (topFrame);
+ priorityLayout->addWidget( prioWidget );
+ QHBoxLayout* priorityLayout2 = new QHBoxLayout( prioWidget);
+
+
+ QIconSet icon;
+ if ( QApplication::desktop()->width() < 321 )
+ icon = SmallIcon("fileexport16");
+ else
+ icon = SmallIcon("fileexport");
+ QPushButton * saveTemplate = new QPushButton( prioWidget);
+ saveTemplate->setIconSet (icon ) ;
+ int size = saveTemplate->sizeHint().height();
+ saveTemplate->setFixedSize( size, size );
+ if ( QApplication::desktop()->width() < 321 )
+ icon = SmallIcon("fileimport16");
+ else
+ icon = SmallIcon("fileimport");
+ QPushButton * loadTemplate = new QPushButton( prioWidget);
+ loadTemplate->setIconSet (icon ) ;
+ loadTemplate->setFixedSize( size, size );
+
+ priorityLayout2->addWidget(loadTemplate);
+ priorityLayout2->addWidget(saveTemplate);
+ mGeneral->initPriority(prioWidget,priorityLayout2);
+ mGeneral->initCategories( topFrame, priorityLayout );
+ topLayout->addStretch(1);
+
+ QFrame *topFrame2 = addPage(i18n("Details"));
+
+ QBoxLayout *topLayout2 = new QVBoxLayout(topFrame2);
+ topLayout2->setMargin(marginHint());
+ topLayout2->setSpacing(spacingHint());
+
+ QHBoxLayout *completionLayout = new QHBoxLayout( topLayout2 );
+ mGeneral->initCompletion(topFrame2,completionLayout);
+
+
+ mGeneral->initSecrecy( topFrame2, topLayout2 );
+ mGeneral->initDescription(topFrame2,topLayout2);
+
+ // QHBox * hb = new QHBox ( topFrame2 );
+ // topLayout2->addWidget(hb);
+ // hb->setSpacing( 3 );
+
+ connect( saveTemplate, SIGNAL( clicked() ), this , SLOT( slotSaveTemplate() ) );
+ connect( loadTemplate, SIGNAL( clicked() ), this , SLOT( slotLoadTemplate() ) );
+
+ } else {
+ QFrame *topFrame = addPage(i18n("General"));
+
+ QBoxLayout *topLayout = new QVBoxLayout(topFrame);
+ topLayout->setSpacing(spacingHint());
+
+ mGeneral->initHeader(topFrame,topLayout);
+ mGeneral->initTime(topFrame,topLayout);
+ mGeneral->initStatus(topFrame,topLayout);
+ QBoxLayout *alarmLineLayout = new QHBoxLayout(topLayout);
+ mGeneral->initAlarm(topFrame,alarmLineLayout);
+ mGeneral->initDescription(topFrame,topLayout);
+ QBoxLayout *detailsLayout = new QHBoxLayout(topLayout);
+ mGeneral->initCategories( topFrame, detailsLayout );
+ mGeneral->initSecrecy( topFrame, detailsLayout );
+ }
+ mGeneral->finishSetup();
+
+}
+
+void KOTodoEditor::editTodo(Todo *todo, bool editDescription)
+{
+ //init();
+
+ mTodo = todo;
+ readTodo(mTodo);
+ if ( editDescription ) {
+ showPage( 1 );
+ mGeneral->setFocusOn( 1 );
+ } else {
+ showPage( 0 );
+ mGeneral->setFocusOn( 2 );
+ }
+}
+
+void KOTodoEditor::newTodo(QDateTime due,Todo *relatedTodo,bool allDay)
+{
+ //init();
+
+ mTodo = 0;
+ setDefaults(due,relatedTodo,allDay);
+}
+
+void KOTodoEditor::loadDefaults()
+{
+ setDefaults(QDateTime::currentDateTime().addDays(7),0,false);
+}
+
+bool KOTodoEditor::processInput( bool emitTime )
+{
+ if (!validateInput()) return false;
+
+ Todo *todo = 0;
+
+ if (mTodo) todo = mTodo;
+ else {
+ todo = new Todo;
+ todo->setOrganizer(KOPrefs::instance()->email());
+ }
+
+ writeTodo(todo);
+ if ( emitTime ) {
+ globalFlagBlockAgenda = 1;
+ emit showAgendaView( false );
+ if ( todo->hasDueDate() )
+ emit jumpToTime( todo->dtDue().date() );
+ globalFlagBlockAgenda = 2;
+ }
+ if (mTodo) {
+ todo->setRevision(todo->revision()+1);
+ emit todoChanged(todo);
+ } else {
+ mCalendar->addTodo(todo);
+ mTodo = todo;
+ emit todoAdded(todo);
+ }
+
+ return true;
+}
+
+void KOTodoEditor::deleteTodo()
+{
+ if (mTodo) {
+ if (KOPrefs::instance()->mConfirm) {
+ switch (msgItemDelete()) {
+ case KMessageBox::Continue: // OK
+ emit todoToBeDeleted(mTodo);
+ emit dialogClose(mTodo);
+ mCalendar->deleteTodo(mTodo);
+ emit todoDeleted();
+ reject();
+ break;
+ }
+ }
+ else {
+ emit todoToBeDeleted(mTodo);
+ emit dialogClose(mTodo);
+ mCalendar->deleteTodo(mTodo);
+ emit todoDeleted();
+ reject();
+ }
+ } else {
+ reject();
+ }
+}
+
+void KOTodoEditor::setDefaults(QDateTime due,Todo *relatedEvent,bool allDay)
+{
+ mRelatedTodo = relatedEvent;
+
+ mGeneral->setDefaults(due,allDay);
+ mDetails->setDefaults();
+ showPage( 0 );
+ if ( mRelatedTodo )
+ mGeneral->setCategories (mRelatedTodo->categoriesStr ());
+ mGeneral->setFocusOn( 2 );
+}
+
+void KOTodoEditor::readTodo(Todo *todo)
+{
+ mGeneral->readTodo(todo);
+ mDetails->readEvent(todo);
+ mRelatedTodo = 0;//todo->relatedTo();
+ // categories
+ // mCategoryDialog->setSelected(todo->categories());
+
+ // We should handle read-only events here.
+}
+
+void KOTodoEditor::writeTodo(Todo *event)
+{
+ mGeneral->writeTodo(event);
+ mDetails->writeEvent(event);
+
+ // set related event, i.e. parent to-do in this case.
+ if (mRelatedTodo) {
+ event->setRelatedTo(mRelatedTodo);
+ }
+}
+
+bool KOTodoEditor::validateInput()
+{
+ if (!mGeneral->validateInput()) return false;
+ if (!mDetails->validateInput()) return false;
+ return true;
+}
+
+int KOTodoEditor::msgItemDelete()
+{
+ return KMessageBox::warningContinueCancel(this,
+ i18n("This item will be permanently deleted."),
+ i18n("KOrganizer Confirmation"),i18n("Delete"));
+}
+
+void KOTodoEditor::modified (int modification)
+{
+ if (modification == KOGlobals::CATEGORY_MODIFIED ||
+ KOGlobals::UNKNOWN_MODIFIED == modification )
+ // mCategoryDialog->setSelected (mTodo->categories ());
+ mGeneral->modified (mTodo, modification);
+
+}
+
+void KOTodoEditor::slotLoadTemplate()
+{
+
+ QString fileName =locateLocal( "templates", "todos" );
+ QDir t_dir;
+ if ( !t_dir.exists(fileName) )
+ t_dir.mkdir ( fileName );
+ fileName += "/todo";
+ fileName = KFileDialog::getSaveFileName( fileName , "Load Todo template", this );
+ if ( fileName.length() == 0 )
+ return;
+ CalendarLocal cal;
+ ICalFormat format;
+ if ( !format.load( &cal, fileName ) ) {
+ KMessageBox::error( this, i18n("Error loading template file\n '%1'.")
+ .arg( fileName ) );
+ return ;
+ }
+ QPtrList<Todo> todos = cal.todos();
+ Todo * todo = todos.first();
+ if ( !todo ) {
+ KMessageBox::error( this,
+ i18n("Template does not\ncontain a valid Todo."));
+ } else {
+ readTodo( todo );
+ }
+
+}
+
+void KOTodoEditor::slotSaveTemplate()
+{
+ QString fileName =locateLocal( "templates", "todos" );
+ QDir t_dir;
+ if ( !t_dir.exists(fileName) )
+ t_dir.mkdir ( fileName );
+ fileName += "/todo";
+ fileName = KFileDialog::getSaveFileName( fileName , "Save as Todo template", this );
+ if ( fileName.length() > 0 )
+ saveTemplate( fileName );
+}
+
+void KOTodoEditor::saveTemplate( const QString &templateName )
+{
+ Todo *todo = new Todo;
+ writeTodo( todo );
+ saveAsTemplate( todo, templateName );
+}