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 Wed Jul 28 23:58:14 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003