korganizer Library API Documentation

kotodoview.cpp

00001 /*
00002     This file is part of KOrganizer.
00003 
00004     Copyright (c) 2000,2001,2003 Cornelius Schumacher <schumacher@kde.org>
00005 
00006     This program is free software; you can redistribute it and/or modify
00007     it under the terms of the GNU General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or
00009     (at your option) any later version.
00010 
00011     This program is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00014     GNU General Public License for more details.
00015 
00016     You should have received a copy of the GNU General Public License
00017     along with this program; if not, write to the Free Software
00018     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00019 
00020     As a special exception, permission is given to link this program
00021     with any edition of Qt, and distribute the resulting executable,
00022     without including the source code for Qt in the source distribution.
00023 */
00024 
00025 #include <qlayout.h>
00026 #include <qheader.h>
00027 #include <qcursor.h>
00028 
00029 #include <kdebug.h>
00030 #include <klocale.h>
00031 #include <kglobal.h>
00032 #include <kiconloader.h>
00033 #include <kmessagebox.h>
00034 
00035 #include <libkcal/icaldrag.h>
00036 #include <libkcal/vcaldrag.h>
00037 #include <libkcal/dndfactory.h>
00038 #include <libkcal/calendarresources.h>
00039 #include <libkcal/resourcecalendar.h>
00040 
00041 #ifndef KORG_NOPRINTER
00042 #include "calprinter.h"
00043 #endif
00044 #include "docprefs.h"
00045 
00046 #include "koincidencetooltip.h"
00047 #include "kodialogmanager.h"
00048 #include "kotodoview.h"
00049 #include "koglobals.h"
00050 using namespace KOrg;
00051 #include "kotodoview.moc"
00052 
00053 const int KOTodoView::POPUP_UNSUBTODO=1234;
00054 
00055 KOTodoListViewToolTip::KOTodoListViewToolTip (QWidget* parent,
00056                                               KOTodoListView* lv )
00057   :QToolTip(parent)
00058 {
00059   todolist=lv;
00060 }
00061 
00062 void KOTodoListViewToolTip::maybeTip( const QPoint & pos)
00063 {
00064   QRect r;
00065   int headerPos;
00066   int col=todolist->header()->sectionAt(todolist->contentsX() + pos.x());
00067   KOTodoViewItem *i=(KOTodoViewItem *)todolist->itemAt(pos);
00068 
00069   /* Check wether a tooltip is necessary. */
00070   if( i && KOPrefs::instance()->mEnableToolTips )
00071   {
00072 
00073     /* Calculate the rectangle. */
00074     r=todolist->itemRect(i);
00075     headerPos = todolist->header()->sectionPos(col)-todolist->contentsX();
00076     r.setLeft( (headerPos < 0 ? 0 : headerPos) );
00077     r.setRight(headerPos + todolist->header()->sectionSize(col));
00078 
00079     /* Show the tip */
00080     QString tipText;
00081     ToolTipVisitor v;
00082     if (v.act(i->todo(), &tipText, true)) {
00083       tip(r, tipText);
00084     }
00085   }
00086 
00087 }
00088 
00089 
00090 
00091 KOTodoListView::KOTodoListView( QWidget *parent, const char *name )
00092   : KListView( parent, name ), mCalendar( 0 )
00093 {
00094   mOldCurrent = 0;
00095   mMousePressed = false;
00096 
00097   /* Create a Tooltip */
00098   tooltip = new KOTodoListViewToolTip( viewport(), this );
00099 }
00100 
00101 KOTodoListView::~KOTodoListView()
00102 {
00103   delete tooltip;
00104 }
00105 
00106 void KOTodoListView::setCalendar( Calendar *cal )
00107 {
00108   mCalendar = cal;
00109   setAcceptDrops( mCalendar );
00110   viewport()->setAcceptDrops( mCalendar );
00111 }
00112 
00113 bool KOTodoListView::event(QEvent *e)
00114 {
00115   int tmp=0;
00116   KOTodoViewItem *i;
00117 
00118   /* Checks for an ApplicationPaletteChange event and updates
00119    * the small Progress bars to make therm have the right colors. */
00120   if(e->type()==QEvent::ApplicationPaletteChange)
00121   {
00122 
00123     KListView::event(e);
00124     i=(KOTodoViewItem *)itemAtIndex(tmp);
00125 
00126     while(i!=0)
00127     {
00128       i->construct();
00129       tmp++;
00130       i=(KOTodoViewItem *)itemAtIndex(tmp);
00131     }
00132 
00133   }
00134 
00135   return (KListView::event(e) || e->type()==QEvent::ApplicationPaletteChange);
00136 }
00137 
00138 void KOTodoListView::contentsDragEnterEvent(QDragEnterEvent *e)
00139 {
00140 #ifndef KORG_NODND
00141 //  kdDebug(5850) << "KOTodoListView::contentsDragEnterEvent" << endl;
00142   if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) &&
00143        !QTextDrag::canDecode( e ) ) {
00144     e->ignore();
00145     return;
00146   }
00147 
00148   mOldCurrent = currentItem();
00149 #endif
00150 }
00151 
00152 
00153 void KOTodoListView::contentsDragMoveEvent(QDragMoveEvent *e)
00154 {
00155 #ifndef KORG_NODND
00156 //  kdDebug(5850) << "KOTodoListView::contentsDragMoveEvent" << endl;
00157 
00158   if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) &&
00159        !QTextDrag::canDecode( e ) ) {
00160     e->ignore();
00161     return;
00162   }
00163 
00164   e->accept();
00165 #endif
00166 }
00167 
00168 void KOTodoListView::contentsDragLeaveEvent( QDragLeaveEvent * )
00169 {
00170 #ifndef KORG_NODND
00171 //  kdDebug(5850) << "KOTodoListView::contentsDragLeaveEvent" << endl;
00172 
00173   setCurrentItem(mOldCurrent);
00174   setSelected(mOldCurrent,true);
00175 #endif
00176 }
00177 
00178 void KOTodoListView::contentsDropEvent( QDropEvent *e )
00179 {
00180 #ifndef KORG_NODND
00181 //  kdDebug(5850) << "KOTodoListView::contentsDropEvent" << endl;
00182 
00183   if ( !mCalendar ||
00184        ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) &&
00185          !QTextDrag::canDecode( e ) ) ) {
00186     e->ignore();
00187     return;
00188   }
00189 
00190   DndFactory factory( mCalendar );
00191   Todo *todo = factory.createDropTodo(e);
00192 
00193   if (todo) {
00194     e->acceptAction();
00195 
00196     KOTodoViewItem *destination =
00197         (KOTodoViewItem *)itemAt(contentsToViewport(e->pos()));
00198     Todo *destinationEvent = 0;
00199     if (destination) destinationEvent = destination->todo();
00200 
00201     Todo *existingTodo = mCalendar->todo(todo->uid());
00202 
00203     if(existingTodo) {
00204 //      kdDebug(5850) << "Drop existing Todo" << endl;
00205       Incidence *to = destinationEvent;
00206       while(to) {
00207         if (to->uid() == todo->uid()) {
00208           KMessageBox::sorry(this,
00209               i18n("Cannot move To-Do to itself or a child of itself"),
00210               i18n("Drop To-Do"));
00211           delete todo;
00212           return;
00213         }
00214         to = to->relatedTo();
00215       }
00216       Todo*oldTodo = existingTodo->clone();
00217       existingTodo->setRelatedTo(destinationEvent);
00218 
00219       emit todoDropped( todo );
00220       emit todoChanged( oldTodo, todo );
00221       delete oldTodo;
00222       delete todo;
00223     } else {
00224 //      kdDebug(5850) << "Drop new Todo" << endl;
00225       todo->setRelatedTo(destinationEvent);
00226       if ( !mCalendar->addTodo( todo ) ) {
00227         KODialogManager::errorSaveTodo( this );
00228         return;
00229       }
00230 
00231       emit todoDropped(todo);
00232       emit todoAdded( todo );
00233     }
00234   }
00235   else {
00236     QString text;
00237     if (QTextDrag::decode(e,text)) {
00238       //QListViewItem *qlvi = itemAt( contentsToViewport(e->pos()) );
00239       KOTodoViewItem *todoi = static_cast<KOTodoViewItem *>(itemAt( contentsToViewport(e->pos()) ));
00240       kdDebug(5850) << "Dropped : " << text << endl;
00241       QStringList emails = QStringList::split(",",text);
00242       for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) {
00243         kdDebug(5850) << " Email: " << (*it) << endl;
00244         int pos = (*it).find("<");
00245         QString name = (*it).left(pos);
00246         QString email = (*it).mid(pos);
00247         if (!email.isEmpty() && todoi) {
00248           todoi->todo()->addAttendee(new Attendee(name,email));
00249         }
00250       }
00251     }
00252     else {
00253       kdDebug(5850) << "KOTodoListView::contentsDropEvent(): Todo from drop not decodable" << endl;
00254       e->ignore();
00255     }
00256   }
00257 #endif
00258 }
00259 
00260 void KOTodoListView::contentsMousePressEvent(QMouseEvent* e)
00261 {
00262   QListView::contentsMousePressEvent(e);
00263   QPoint p(contentsToViewport(e->pos()));
00264   QListViewItem *i = itemAt(p);
00265   if (i) {
00266     // if the user clicked into the root decoration of the item, don't
00267     // try to start a drag!
00268     if (p.x() > header()->sectionPos(header()->mapToIndex(0)) +
00269         treeStepSize() * (i->depth() + (rootIsDecorated() ? 1 : 0)) +
00270         itemMargin() ||
00271         p.x() < header()->sectionPos(header()->mapToIndex(0))) {
00272       if (e->button()==Qt::LeftButton) {
00273         mPressPos = e->pos();
00274         mMousePressed = true;
00275       }
00276     }
00277   }
00278 }
00279 
00280 void KOTodoListView::contentsMouseMoveEvent(QMouseEvent* e)
00281 {
00282 #ifndef KORG_NODND
00283 //  kdDebug(5850) << "KOTodoListView::contentsMouseMoveEvent()" << endl;
00284   QListView::contentsMouseMoveEvent(e);
00285   if (mMousePressed && (mPressPos - e->pos()).manhattanLength() >
00286       QApplication::startDragDistance()) {
00287     mMousePressed = false;
00288     QListViewItem *item = itemAt(contentsToViewport(mPressPos));
00289     if ( item && mCalendar ) {
00290 //      kdDebug(5850) << "Start Drag for item " << item->text(0) << endl;
00291       DndFactory factory( mCalendar );
00292       ICalDrag *vd = factory.createDrag(
00293                           ((KOTodoViewItem *)item)->todo(),viewport());
00294       if (vd->drag()) {
00295         kdDebug(5850) << "KOTodoListView::contentsMouseMoveEvent(): Delete drag source" << endl;
00296       }
00297 /*
00298       QString source = fullPath(item);
00299       if ( QFile::exists(source) ) {
00300         KURL url;
00301         url.setPath(source);
00302         KURLDrag* ud = KURLDrag::newDrag(KURL::List(url), viewport());
00303         if ( ud->drag() )
00304           QMessageBox::information( this, "Drag source",
00305                                     QString("Delete ")+source, "Not implemented" );
00306 */
00307     }
00308   }
00309 #endif
00310 }
00311 
00312 void KOTodoListView::contentsMouseReleaseEvent(QMouseEvent *e)
00313 {
00314   QListView::contentsMouseReleaseEvent(e);
00315   mMousePressed = false;
00316 }
00317 
00318 void KOTodoListView::contentsMouseDoubleClickEvent(QMouseEvent *e)
00319 {
00320   if (!e) return;
00321 
00322   QPoint vp = contentsToViewport(e->pos());
00323 
00324   QListViewItem *item = itemAt(vp);
00325 
00326   if (!item) return;
00327 
00328   emit doubleClicked(item,vp,0);
00329 }
00330 
00332 
00333 KOQuickTodo::KOQuickTodo(QWidget *parent) :
00334   QLineEdit(parent)
00335 {
00336   setText(i18n("Click to add a new Todo"));
00337   setPaletteForegroundColor(gray);
00338 }
00339 
00340 void KOQuickTodo::focusInEvent(QFocusEvent *ev)
00341 {
00342   if ( text()==i18n("Click to add a new Todo") )
00343     setText(QString::null);
00344   setPaletteForegroundColor(parentWidget()->paletteForegroundColor());
00345   QLineEdit::focusInEvent(ev);
00346 }
00347 
00348 void KOQuickTodo::focusOutEvent(QFocusEvent *ev)
00349 {
00350   if ( text().isEmpty() ) 
00351       setText(i18n("Click to add a new Todo"));
00352   setPaletteForegroundColor(gray);
00353   QLineEdit::focusOutEvent(ev);
00354 }
00355 
00357 
00358 KOTodoView::KOTodoView( Calendar *calendar, QWidget *parent, const char* name)
00359   : KOrg::BaseView( calendar, parent, name )
00360 {
00361   QBoxLayout *topLayout = new QVBoxLayout( this );
00362 
00363   QLabel *title = new QLabel( i18n("To-do items:"), this );
00364   title->setFrameStyle( QFrame::Panel | QFrame::Raised );
00365   topLayout->addWidget( title );
00366 
00367   mQuickAdd = new KOQuickTodo( this );
00368   topLayout->addWidget( mQuickAdd );
00369 
00370   if ( !KOPrefs::instance()->mEnableQuickTodo ) mQuickAdd->hide();
00371 
00372   mTodoListView = new KOTodoListView( this );
00373   topLayout->addWidget( mTodoListView );
00374 
00375   mTodoListView->setRootIsDecorated( true );
00376   mTodoListView->setAllColumnsShowFocus( true );
00377 
00378   mTodoListView->setShowSortIndicator( true );
00379 
00380   mTodoListView->addColumn( i18n("Summary") );
00381   mTodoListView->addColumn( i18n("Priority") );
00382   mTodoListView->setColumnAlignment( 1, AlignHCenter );
00383   mTodoListView->addColumn( i18n("Complete") );
00384   mTodoListView->setColumnAlignment( 2, AlignRight );
00385   mTodoListView->addColumn( i18n("Due Date") );
00386   mTodoListView->setColumnAlignment( 3, AlignHCenter );
00387   mTodoListView->addColumn( i18n("Due Time") );
00388   mTodoListView->setColumnAlignment( 4, AlignHCenter );
00389   mTodoListView->addColumn( i18n("Categories") );
00390 #if 0
00391   mTodoListView->addColumn( i18n("Sort Id") );
00392   mTodoListView->setColumnAlignment( 4, AlignHCenter );
00393 #endif
00394 
00395   mTodoListView->setMinimumHeight( 60 );
00396   mTodoListView->setItemsRenameable( true );
00397   mTodoListView->setRenameable( 0 );
00398 
00399   mTodoListView->setColumnWidthMode( 0, QListView::Manual );
00400   mTodoListView->setColumnWidthMode( 1, QListView::Manual );
00401   mTodoListView->setColumnWidthMode( 2, QListView::Manual );
00402   mTodoListView->setColumnWidthMode( 3, QListView::Manual );
00403   mTodoListView->setColumnWidthMode( 4, QListView::Manual );
00404   mTodoListView->setColumnWidthMode( 5, QListView::Manual );
00405 #if 0
00406   mTodoListView->setColumnWidthMode( 6, QListView::Manual );
00407 #endif
00408 
00409   mPriorityPopupMenu = new QPopupMenu( this );
00410   for ( int i = 1; i <= 5; i++ ) {
00411     QString label = QString ("%1").arg( i );
00412     mPriority[ mPriorityPopupMenu->insertItem( label ) ] = i;
00413   }
00414   connect( mPriorityPopupMenu, SIGNAL( activated( int ) ),
00415            SLOT( setNewPriority( int ) ));
00416 
00417   mPercentageCompletedPopupMenu = new QPopupMenu(this);
00418   for (int i = 0; i <= 100; i+=20) {
00419     QString label = QString ("%1 %").arg (i);
00420     mPercentage[mPercentageCompletedPopupMenu->insertItem (label)] = i;
00421   }
00422   connect( mPercentageCompletedPopupMenu, SIGNAL( activated( int ) ),
00423            SLOT( setNewPercentage( int ) ) );
00424 
00425   mItemPopupMenu = new QPopupMenu(this);
00426   mItemPopupMenu->insertItem(i18n("Show"), this,
00427                              SLOT (showTodo()));
00428   mItemPopupMenu->insertItem(i18n("Edit..."), this,
00429                              SLOT (editTodo()));
00430   mItemPopupMenu->insertItem(KOGlobals::self()->smallIconSet("editdelete"), i18n("Delete"), this,
00431                              SLOT (deleteTodo()));
00432   mItemPopupMenu->insertSeparator();
00433   mItemPopupMenu->insertItem(KOGlobals::self()->smallIconSet("todo"), i18n("New To-Do..."), this,
00434                              SLOT (newTodo()));
00435   mItemPopupMenu->insertItem(i18n("New Sub-To-Do..."), this,
00436                              SLOT (newSubTodo()));
00437   mItemPopupMenu->insertItem( i18n("Make Sub-To-Do Independent"), this,
00438       SIGNAL( unSubTodoSignal() ), 0, POPUP_UNSUBTODO );
00439   mItemPopupMenu->insertSeparator();
00440   mItemPopupMenu->insertItem(i18n("delete completed To-Dos","Purge Completed"),
00441                              this, SLOT( purgeCompleted() ) );
00442 
00443   mPopupMenu = new QPopupMenu(this);
00444   mPopupMenu->insertItem(KOGlobals::self()->smallIconSet("todo"), i18n("New To-Do..."), this,
00445                          SLOT (newTodo()));
00446   mPopupMenu->insertItem(i18n("delete completed To-Dos","Purge Completed"),
00447                          this, SLOT(purgeCompleted()));
00448 
00449   mDocPrefs = new DocPrefs( name );
00450 
00451   // Double clicking conflicts with opening/closing the subtree
00452   connect( mTodoListView, SIGNAL( doubleClicked( QListViewItem *,
00453                                                  const QPoint &, int ) ),
00454            SLOT( editItem( QListViewItem *, const QPoint &, int ) ) );
00455   connect( mTodoListView, SIGNAL( returnPressed( QListViewItem * ) ),
00456            SLOT( editItem( QListViewItem * ) ) );
00457   connect( mTodoListView, SIGNAL( contextMenuRequested( QListViewItem *,
00458                                                         const QPoint &, int ) ),
00459            SLOT( popupMenu( QListViewItem *, const QPoint &, int ) ) );
00460   connect( mTodoListView, SIGNAL( clicked( QListViewItem * ) ),
00461            SLOT( itemClicked( QListViewItem * ) ) );
00462   connect( mTodoListView, SIGNAL( todoDropped( Todo * ) ),
00463            SLOT( updateView() ) );
00464   connect( mTodoListView, SIGNAL( expanded( QListViewItem * ) ),
00465            SLOT( itemStateChanged( QListViewItem * ) ) );
00466   connect( mTodoListView, SIGNAL( collapsed( QListViewItem * ) ),
00467            SLOT( itemStateChanged( QListViewItem * ) ) );
00468 
00469 #if 0
00470   connect(mTodoListView,SIGNAL(selectionChanged(QListViewItem *)),
00471           SLOT(selectionChanged(QListViewItem *)));
00472   connect(mTodoListView,SIGNAL(clicked(QListViewItem *)),
00473           SLOT(selectionChanged(QListViewItem *)));
00474   connect(mTodoListView,SIGNAL(pressed(QListViewItem *)),
00475           SLOT(selectionChanged(QListViewItem *)));
00476 #endif
00477   connect( mTodoListView, SIGNAL(selectionChanged() ),
00478            SLOT( processSelectionChange() ) );
00479   connect( mQuickAdd, SIGNAL( returnPressed () ),
00480            SLOT( addQuickTodo() ) );
00481   connect( mTodoListView, SIGNAL( todoChanged( Todo*, Todo* ) ),
00482            SIGNAL( todoChanged( Todo*, Todo* ) ) );
00483   connect( mTodoListView, SIGNAL( todoAdded( Todo* ) ),
00484            SIGNAL( todoAdded( Todo* ) ) );
00485 }
00486 
00487 KOTodoView::~KOTodoView()
00488 {
00489   delete mDocPrefs;
00490 }
00491 
00492 void KOTodoView::setCalendar( Calendar *cal )
00493 {
00494   BaseView::setCalendar( cal );
00495   mTodoListView->setCalendar( cal );
00496 }
00497 
00498 void KOTodoView::updateView()
00499 {
00500 //  kdDebug(5850) << "KOTodoView::updateView()" << endl;
00501 
00502   mTodoListView->clear();
00503 
00504   Todo::List todoList = calendar()->todos();
00505 
00506 /*
00507   kdDebug(5850) << "KOTodoView::updateView(): Todo List:" << endl;
00508   Event *t;
00509   for(t = todoList.first(); t; t = todoList.next()) {
00510     kdDebug(5850) << "  " << t->getSummary() << endl;
00511 
00512     if (t->getRelatedTo()) {
00513       kdDebug(5850) << "      (related to " << t->getRelatedTo()->getSummary() << ")" << endl;
00514     }
00515 
00516     QPtrList<Event> l = t->getRelations();
00517     Event *c;
00518     for(c=l.first();c;c=l.next()) {
00519       kdDebug(5850) << "    - relation: " << c->getSummary() << endl;
00520     }
00521   }
00522 */
00523 
00524   // Put for each Event a KOTodoViewItem in the list view. Don't rely on a
00525   // specific order of events. That means that we have to generate parent items
00526   // recursively for proper hierarchical display of Todos.
00527   mTodoMap.clear();
00528   Todo::List::ConstIterator it;
00529   for( it = todoList.begin(); it != todoList.end(); ++it ) {
00530     if ( !mTodoMap.contains( *it ) ) {
00531       insertTodoItem( *it );
00532     }
00533   }
00534 
00535   // Restore opened/closed state
00536   mTodoListView->blockSignals( true );
00537   if( mDocPrefs ) restoreItemState( mTodoListView->firstChild() );
00538   mTodoListView->blockSignals( false );
00539 
00540   processSelectionChange();
00541 }
00542 
00543 void KOTodoView::restoreItemState( QListViewItem *item )
00544 {
00545   while( item ) {
00546     KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
00547     todoItem->setOpen( mDocPrefs->readBoolEntry( todoItem->todo()->uid() ) );
00548     if( item->childCount() > 0 ) restoreItemState( item->firstChild() );
00549     item = item->nextSibling();
00550   }
00551 }
00552 
00553 
00554 QMap<Todo *,KOTodoViewItem *>::ConstIterator
00555   KOTodoView::insertTodoItem(Todo *todo)
00556 {
00557 //  kdDebug(5850) << "KOTodoView::insertTodoItem(): " << todo->getSummary() << endl;
00558   // TODO: Check, if dynmaic cast is necessary
00559   Incidence *incidence = todo->relatedTo();
00560   if (incidence && incidence->type() == "Todo") {
00561     Todo *relatedTodo = static_cast<Todo *>(incidence);
00562 
00563 //    kdDebug(5850) << "  has Related" << endl;
00564     QMap<Todo *,KOTodoViewItem *>::ConstIterator itemIterator;
00565     itemIterator = mTodoMap.find(relatedTodo);
00566     if (itemIterator == mTodoMap.end()) {
00567 //      kdDebug(5850) << "    related not yet in list" << endl;
00568       itemIterator = insertTodoItem (relatedTodo);
00569     }
00570     // isn't this pretty stupid? We give one Todo  to the KOTodoViewItem
00571     // and one into the map. Sure finding is more easy but why? -zecke
00572     KOTodoViewItem *todoItem = new KOTodoViewItem(*itemIterator,todo,this);
00573     return mTodoMap.insert(todo,todoItem);
00574   } else {
00575 //    kdDebug(5850) << "  no Related" << endl;
00576       // see above -zecke
00577     KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this);
00578     return mTodoMap.insert(todo,todoItem);
00579   }
00580 }
00581 
00582 
00583 void KOTodoView::updateConfig()
00584 {
00585   mTodoListView->repaintContents();
00586 }
00587 
00588 Incidence::List KOTodoView::selectedIncidences()
00589 {
00590   Incidence::List selected;
00591 
00592   KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem());
00593 //  if (!item) item = mActiveItem;
00594   if (item) selected.append(item->todo());
00595 
00596   return selected;
00597 }
00598 
00599 Todo::List KOTodoView::selectedTodos()
00600 {
00601   Todo::List selected;
00602 
00603   KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem());
00604 //  if (!item) item = mActiveItem;
00605   if (item) selected.append(item->todo());
00606 
00607   return selected;
00608 }
00609 
00610 void KOTodoView::changeEventDisplay(Event *, int)
00611 {
00612   updateView();
00613 }
00614 
00615 void KOTodoView::showDates(const QDate &, const QDate &)
00616 {
00617 }
00618 
00619 void KOTodoView::showEvents( const Event::List & )
00620 {
00621   kdDebug(5850) << "KOTodoView::selectEvents(): not yet implemented" << endl;
00622 }
00623 
00624 void KOTodoView::printPreview(CalPrinter *calPrinter, const QDate &fd,
00625                               const QDate &td)
00626 {
00627 #ifndef KORG_NOPRINTER
00628   calPrinter->preview(CalPrinter::Todolist, fd, td);
00629 #endif
00630 }
00631 
00632 CalPrinter::PrintType KOTodoView::printType()
00633 {
00634   return CalPrinter::Todolist;
00635 }
00636 
00637 void KOTodoView::editItem( QListViewItem *item )
00638 {
00639   emit editTodoSignal( static_cast<KOTodoViewItem *>( item )->todo() );
00640 }
00641 
00642 void KOTodoView::editItem( QListViewItem *item, const QPoint &, int )
00643 {
00644   editItem( item );
00645 }
00646 
00647 void KOTodoView::showItem( QListViewItem *item, const QPoint &, int )
00648 {
00649   emit showTodoSignal( static_cast<KOTodoViewItem *>( item )->todo() );
00650 }
00651 
00652 void KOTodoView::popupMenu( QListViewItem *item, const QPoint &, int column )
00653 {
00654   mActiveItem = static_cast<KOTodoViewItem *>( item );
00655   if ( item ) {
00656     switch ( column ) {
00657       case 1:
00658         mPriorityPopupMenu->popup( QCursor::pos () );
00659         break;
00660       case 2:
00661         mPercentageCompletedPopupMenu->popup( QCursor::pos () );
00662         break;
00663       case 5:
00664         getCategoryPopupMenu(
00665             static_cast<KOTodoViewItem *>( item ) )->popup( QCursor::pos () );
00666         break;
00667       default:
00668         mItemPopupMenu->setItemEnabled( POPUP_UNSUBTODO,
00669                                         mActiveItem->todo()->relatedTo() );
00670         mItemPopupMenu->popup( QCursor::pos() );
00671     }
00672   } else mPopupMenu->popup( QCursor::pos() );
00673 }
00674 
00675 void KOTodoView::newTodo()
00676 {
00677   emit newTodoSignal();
00678 }
00679 
00680 void KOTodoView::newSubTodo()
00681 {
00682   if (mActiveItem) {
00683     emit newSubTodoSignal(mActiveItem->todo());
00684   }
00685 }
00686 
00687 void KOTodoView::editTodo()
00688 {
00689   if (mActiveItem) {
00690     emit editTodoSignal(mActiveItem->todo());
00691   }
00692 }
00693 
00694 void KOTodoView::showTodo()
00695 {
00696   if (mActiveItem) {
00697     emit showTodoSignal(mActiveItem->todo());
00698   }
00699 }
00700 
00701 void KOTodoView::deleteTodo()
00702 {
00703   if (mActiveItem) {
00704     if (mActiveItem->childCount()) {
00705       KMessageBox::sorry(this,i18n("Cannot delete To-Do which has children."),
00706                          i18n("Delete To-Do"));
00707     } else {
00708       emit deleteTodoSignal(mActiveItem->todo());
00709     }
00710   }
00711 }
00712 
00713 void KOTodoView::setNewPriority(int index)
00714 {
00715   if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
00716     Todo*todo = mActiveItem->todo();
00717     Todo*oldTodo = todo->clone();
00718     todo->setPriority(mPriority[index]);
00719     mActiveItem->construct();
00720     emit todoModifiedSignal ( todo, oldTodo, KOGlobals::PRIORITY_MODIFIED );
00721     delete oldTodo;
00722   }
00723 }
00724 
00725 void KOTodoView::setNewPercentage(int index)
00726 {
00727   if ( mActiveItem && !mActiveItem->todo()->isReadOnly () ) {
00728     Todo*todo = mActiveItem->todo();
00729     Todo*oldTodo = todo->clone();
00730 
00731     if (mPercentage[index] == 100) {
00732       todo->setCompleted(QDateTime::currentDateTime());
00733     } else {
00734       todo->setCompleted(false);
00735     }
00736     todo->setPercentComplete(mPercentage[index]);
00737     mActiveItem->construct();
00738     emit todoModifiedSignal( todo, oldTodo, KOGlobals::COMPLETION_MODIFIED );
00739     delete oldTodo;
00740   }
00741 }
00742 
00743 
00744 QPopupMenu *KOTodoView::getCategoryPopupMenu( KOTodoViewItem *todoItem )
00745 {
00746   QPopupMenu *tempMenu = new QPopupMenu( this );
00747   QStringList checkedCategories = todoItem->todo()->categories();
00748 
00749   tempMenu->setCheckable( true );
00750   QStringList::Iterator it;
00751   for ( it = KOPrefs::instance()->mCustomCategories.begin();
00752         it != KOPrefs::instance()->mCustomCategories.end();
00753         ++it ) {
00754     int index = tempMenu->insertItem( *it );
00755     mCategory[ index ] = *it;
00756     if ( checkedCategories.find( *it ) != checkedCategories.end() )
00757       tempMenu->setItemChecked( index, true );
00758   }
00759 
00760   connect ( tempMenu, SIGNAL( activated( int ) ),
00761             SLOT( changedCategories( int ) ) );
00762   return tempMenu;
00763 }
00764 
00765 void KOTodoView::changedCategories(int index)
00766 {
00767   if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
00768     Todo*todo = mActiveItem->todo();
00769     Todo*oldTodo = todo->clone();
00770     QStringList categories = todo->categories ();
00771     if (categories.find (mCategory[index]) != categories.end ())
00772       categories.remove (mCategory[index]);
00773     else
00774       categories.insert (categories.end(), mCategory[index]);
00775     categories.sort ();
00776     todo->setCategories (categories);
00777     mActiveItem->construct();
00778     emit todoModifiedSignal( todo, oldTodo, KOGlobals::CATEGORY_MODIFIED);
00779     delete oldTodo;
00780   }
00781 }
00782 
00783 void KOTodoView::itemClicked(QListViewItem *item)
00784 {
00785   if (!item) return;
00786 
00787   KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
00788   int completed = todoItem->todo()->isCompleted();  // Completed or not?
00789 
00790   if (todoItem->isOn()) {
00791     if (!completed) {
00792       todoItem->todo()->setCompleted(QDateTime::currentDateTime());
00793     }
00794   } else {
00795     if (completed) {
00796       todoItem->todo()->setCompleted(false);
00797     }
00798   }
00799 }
00800 
00801 void KOTodoView::setDocumentId( const QString &id )
00802 {
00803   kdDebug(5850) << "KOTodoView::setDocumentId()" << endl;
00804 
00805   mDocPrefs->setDoc( id );
00806 }
00807 
00808 void KOTodoView::itemStateChanged( QListViewItem *item )
00809 {
00810   if (!item) return;
00811 
00812   KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
00813 
00814 //  kdDebug(5850) << "KOTodoView::itemStateChanged(): " << todoItem->todo()->summary() << endl;
00815 
00816   if( mDocPrefs ) mDocPrefs->writeEntry( todoItem->todo()->uid(), todoItem->isOpen() );
00817 }
00818 
00819 void KOTodoView::saveLayout(KConfig *config, const QString &group) const
00820 {
00821   mTodoListView->saveLayout(config,group);
00822 }
00823 
00824 void KOTodoView::restoreLayout(KConfig *config, const QString &group)
00825 {
00826   mTodoListView->restoreLayout(config,group);
00827 }
00828 
00829 void KOTodoView::processSelectionChange()
00830 {
00831 //  kdDebug(5850) << "KOTodoView::processSelectionChange()" << endl;
00832 
00833   KOTodoViewItem *item =
00834     static_cast<KOTodoViewItem *>( mTodoListView->selectedItem() );
00835 
00836   if ( !item ) {
00837     emit incidenceSelected( 0 );
00838   } else {
00839     emit incidenceSelected( item->todo() );
00840   }
00841 }
00842 
00843 void KOTodoView::modified(bool b)
00844 {
00845   emit isModified(b);
00846 }
00847 
00848 void KOTodoView::clearSelection()
00849 {
00850   mTodoListView->selectAll( false );
00851 }
00852 
00853 void KOTodoView::purgeCompleted()
00854 {
00855   emit purgeCompletedSignal();
00856 }
00857 
00858 void KOTodoView::addQuickTodo()
00859 {
00860   Todo *todo = new Todo();
00861   todo->setSummary( mQuickAdd->text() );
00862   todo->setOrganizer( KOPrefs::instance()->email() );
00863   if ( !calendar()->addTodo( todo ) ) {
00864     KODialogManager::errorSaveTodo( this );
00865     return;
00866   }
00867   mQuickAdd->setText( QString::null );
00868   emit todoAdded( todo );
00869   updateView();
00870 }
KDE Logo
This file is part of the documentation for korganizer Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:38:30 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003