00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <qlistview.h>
00026 #include <qlayout.h>
00027 #include <qpopupmenu.h>
00028
00029 #include <klocale.h>
00030 #include <kdebug.h>
00031 #include <kiconloader.h>
00032 #include <kglobal.h>
00033
00034 #include <libkcal/calendar.h>
00035
00036 #ifndef KORG_NOPRINTER
00037 #include "calprinter.h"
00038 #endif
00039 #include "koglobals.h"
00040 #include "koincidencetooltip.h"
00041
00042 #include "kolistview.h"
00043 #include "kolistview.moc"
00044
00045
00046 KOListViewToolTip::KOListViewToolTip( QWidget* parent,
00047 KListView* lv )
00048 :QToolTip(parent)
00049 {
00050 eventlist=lv;
00051 }
00052
00053 void KOListViewToolTip::maybeTip( const QPoint & pos)
00054 {
00055 QRect r;
00056 QListViewItem *it = eventlist->itemAt(pos);
00057 KOListViewItem *i = static_cast<KOListViewItem*>(it);
00058
00059 if( i && KOPrefs::instance()->mEnableToolTips ) {
00060
00061 r=eventlist->itemRect( it );
00062
00063 QString tipText;
00064 ToolTipVisitor v;
00065 if (v.act(i->data(), &tipText, true)) {
00066 tip(r, tipText);
00067 }
00068 }
00069
00070 }
00071
00072 ListItemVisitor::ListItemVisitor(KOListViewItem *item)
00073 {
00074 mItem = item;
00075 }
00076
00077 ListItemVisitor::~ListItemVisitor()
00078 {
00079 }
00080
00081 bool ListItemVisitor::visit(Event *e)
00082 {
00083 mItem->setText(0,e->summary());
00084 mItem->setText(1,e->dtStartDateStr());
00085 mItem->setText(2,e->dtStartTimeStr());
00086 mItem->setText(3,e->dtEndDateStr());
00087 mItem->setText(4,e->dtEndTimeStr());
00088 mItem->setText(5,e->isAlarmEnabled() ? i18n("Yes") : i18n("No"));
00089 mItem->setText(6,e->doesRecur() ? i18n("Yes") : i18n("No"));
00090 mItem->setText(7,"---");
00091 mItem->setText(8,"---");
00092 mItem->setText(9,e->categoriesStr());
00093
00094 QString key;
00095 QDate d = e->dtStart().date();
00096 QTime t = e->doesFloat() ? QTime(0,0) : e->dtStart().time();
00097 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),t.hour(),t.minute());
00098 mItem->setSortKey(1,key);
00099
00100 d = e->dtEnd().date();
00101 t = e->doesFloat() ? QTime(0,0) : e->dtEnd().time();
00102 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),t.hour(),t.minute());
00103 mItem->setSortKey(3,key);
00104
00105 return true;
00106 }
00107
00108 bool ListItemVisitor::visit(Todo *t)
00109 {
00110 mItem->setText(0,i18n("To-Do: %1").arg(t->summary()));
00111 mItem->setText(1,"---");
00112 mItem->setText(2,"---");
00113 mItem->setText(3,"---");
00114 mItem->setText(4,"---");
00115 mItem->setText(5,"---");
00116 mItem->setText(6,"---");
00117 if (t->hasDueDate()) {
00118 mItem->setText(7,t->dtDueDateStr());
00119 if (t->doesFloat()) {
00120 mItem->setText(8,"---");
00121 } else {
00122 mItem->setText(8,t->dtDueTimeStr());
00123 }
00124 } else {
00125 mItem->setText(7,"---");
00126 mItem->setText(8,"---");
00127 }
00128 mItem->setText(9,t->categoriesStr());
00129
00130 QString key;
00131 QDate d = t->dtDue().date();
00132 QTime tm = t->doesFloat() ? QTime(0,0) : t->dtDue().time();
00133 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute());
00134 mItem->setSortKey(7,key);
00135
00136 return true;
00137 }
00138
00139 bool ListItemVisitor::visit(Journal *t)
00140 {
00141
00142
00143 mItem->setText( 0, t->description() );
00144 mItem->setText( 1, t->dtStartDateStr() );
00145
00146 return true;
00147 }
00148
00149 KOListView::KOListView( Calendar *calendar, QWidget *parent,
00150 const char *name)
00151 : KOEventView(calendar, parent, name)
00152 {
00153 mActiveItem = 0;
00154
00155 mListView = new KListView(this);
00156 mListView->addColumn(i18n("Summary"));
00157 mListView->addColumn(i18n("Start Date"));
00158 mListView->setColumnAlignment(1,AlignHCenter);
00159 mListView->addColumn(i18n("Start Time"));
00160 mListView->setColumnAlignment(2,AlignHCenter);
00161 mListView->addColumn(i18n("End Date"));
00162 mListView->setColumnAlignment(3,AlignHCenter);
00163 mListView->addColumn(i18n("End Time"));
00164 mListView->setColumnAlignment(4,AlignHCenter);
00165 mListView->addColumn(i18n("Alarm"));
00166 mListView->addColumn(i18n("Recurs"));
00167 mListView->addColumn(i18n("Due Date"));
00168 mListView->setColumnAlignment(7,AlignHCenter);
00169 mListView->addColumn(i18n("Due Time"));
00170 mListView->setColumnAlignment(8,AlignHCenter);
00171 mListView->addColumn(i18n("Categories"));
00172 mListView->setColumnAlignment(9,AlignHCenter);
00173
00174 QBoxLayout *layoutTop = new QVBoxLayout(this);
00175 layoutTop->addWidget(mListView);
00176
00177 mPopupMenu = eventPopup();
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191 QObject::connect( mListView, SIGNAL( doubleClicked( QListViewItem * ) ),
00192 SLOT( defaultItemAction( QListViewItem * ) ) );
00193 QObject::connect( mListView, SIGNAL( returnPressed( QListViewItem * ) ),
00194 SLOT( defaultItemAction( QListViewItem * ) ) );
00195 QObject::connect( mListView, SIGNAL( rightButtonClicked ( QListViewItem *,
00196 const QPoint &,
00197 int ) ),
00198 SLOT( popupMenu( QListViewItem *, const QPoint &, int ) ) );
00199 QObject::connect( mListView, SIGNAL( selectionChanged() ),
00200 SLOT( processSelectionChange() ) );
00201
00202
00203 mListView->restoreLayout(KOGlobals::self()->config(),"KOListView Layout");
00204
00205 new KOListViewToolTip( mListView->viewport(), mListView );
00206 }
00207
00208 KOListView::~KOListView()
00209 {
00210 delete mPopupMenu;
00211 }
00212
00213 int KOListView::maxDatesHint()
00214 {
00215 return 0;
00216 }
00217
00218 int KOListView::currentDateCount()
00219 {
00220 return 0;
00221 }
00222
00223 Incidence::List KOListView::selectedIncidences()
00224 {
00225 Incidence::List eventList;
00226
00227 QListViewItem *item = mListView->selectedItem();
00228 if (item) eventList.append(((KOListViewItem *)item)->data());
00229
00230 return eventList;
00231 }
00232
00233 DateList KOListView::selectedDates()
00234 {
00235 DateList eventList;
00236 return eventList;
00237 }
00238
00239 void KOListView::showDates(bool show)
00240 {
00241
00242
00243 static int oldColWidth1 = 0;
00244 static int oldColWidth3 = 0;
00245
00246 if (!show) {
00247 oldColWidth1 = mListView->columnWidth(1);
00248 oldColWidth3 = mListView->columnWidth(3);
00249 mListView->setColumnWidth(1, 0);
00250 mListView->setColumnWidth(3, 0);
00251 } else {
00252 mListView->setColumnWidth(1, oldColWidth1);
00253 mListView->setColumnWidth(3, oldColWidth3);
00254 }
00255 mListView->repaint();
00256 }
00257
00258 void KOListView::printPreview(CalPrinter *calPrinter, const QDate &fd,
00259 const QDate &td)
00260 {
00261 #ifndef KORG_NOPRINTER
00262 calPrinter->preview(CalPrinter::Day, fd, td);
00263 #endif
00264 }
00265
00266 void KOListView::showDates()
00267 {
00268 showDates(true);
00269 }
00270
00271 void KOListView::hideDates()
00272 {
00273 showDates(false);
00274 }
00275
00276 void KOListView::updateView()
00277 {
00278 kdDebug(5850) << "KOListView::updateView() does nothing" << endl;
00279 }
00280
00281 void KOListView::showDates(const QDate &start, const QDate &end)
00282 {
00283 clear();
00284
00285 QDate date = start;
00286 while( date <= end ) {
00287 addEvents(calendar()->events(date));
00288 addTodos(calendar()->todos(date));
00289 date = date.addDays( 1 );
00290 }
00291
00292 emit incidenceSelected( 0 );
00293 }
00294
00295 void KOListView::addEvents( const Event::List &eventList )
00296 {
00297 Event::List::ConstIterator it;
00298 for( it = eventList.begin(); it != eventList.end(); ++it ) {
00299 addIncidence( *it );
00300 }
00301 }
00302
00303 void KOListView::addTodos( const Todo::List &eventList )
00304 {
00305 Todo::List::ConstIterator it;
00306 for( it = eventList.begin(); it != eventList.end(); ++it ) {
00307 addIncidence( *it );
00308 }
00309 }
00310
00311 void KOListView::addIncidences( const Incidence::List &incidenceList )
00312 {
00313 Incidence::List::ConstIterator it;
00314 for( it = incidenceList.begin(); it != incidenceList.end(); ++it ) {
00315 addIncidence( *it );
00316 }
00317 }
00318
00319 void KOListView::addIncidence(Incidence *incidence)
00320 {
00321 if ( mUidDict.find( incidence->uid() ) ) return;
00322
00323 mUidDict.insert( incidence->uid(), incidence );
00324
00325 KOListViewItem *item = new KOListViewItem( incidence, mListView );
00326 ListItemVisitor v(item);
00327 if (incidence->accept(v)) return;
00328 else delete item;
00329 }
00330
00331 void KOListView::showEvents( const Event::List &eventList )
00332 {
00333 clear();
00334
00335 addEvents( eventList );
00336
00337
00338 emit incidenceSelected( 0 );
00339 }
00340
00341 void KOListView::showIncidences( const Incidence::List &eventList )
00342 {
00343 clear();
00344
00345 addIncidences( eventList );
00346
00347
00348 emit incidenceSelected( 0 );
00349 }
00350
00351 void KOListView::changeEventDisplay(Event *event, int action)
00352 {
00353 KOListViewItem *item;
00354
00355 switch(action) {
00356 case KOGlobals::EVENTADDED:
00357 addIncidence( event );
00358 break;
00359 case KOGlobals::EVENTEDITED:
00360 item = getItemForEvent(event);
00361 if (item) {
00362 delete item;
00363 mUidDict.remove( event->uid() );
00364 addIncidence( event );
00365 }
00366 break;
00367 case KOGlobals::EVENTDELETED:
00368 item = getItemForEvent(event);
00369 if (item) {
00370 delete item;
00371 }
00372 break;
00373 default:
00374 kdDebug(5850) << "KOListView::changeEventDisplay(): Illegal action " << action << endl;
00375 }
00376 }
00377
00378 KOListViewItem *KOListView::getItemForEvent(Event *event)
00379 {
00380 KOListViewItem *item = (KOListViewItem *)mListView->firstChild();
00381 while (item) {
00382
00383 if (item->data() == event) return item;
00384 item = (KOListViewItem *)item->nextSibling();
00385 }
00386 return 0;
00387 }
00388
00389 void KOListView::defaultItemAction(QListViewItem *i)
00390 {
00391 KOListViewItem *item = static_cast<KOListViewItem *>( i );
00392 if ( item ) defaultAction( item->data() );
00393 }
00394
00395 void KOListView::popupMenu(QListViewItem *item,const QPoint &,int)
00396 {
00397 mActiveItem = (KOListViewItem *)item;
00398 if (mActiveItem) {
00399 Incidence *incidence = mActiveItem->data();
00400 mPopupMenu->showIncidencePopup(incidence);
00401
00402
00403
00404
00405
00406
00407
00408 }
00409 }
00410
00411 void KOListView::readSettings(KConfig *config)
00412 {
00413 mListView->restoreLayout(config,"KOListView Layout");
00414 }
00415
00416 void KOListView::writeSettings(KConfig *config)
00417 {
00418 mListView->saveLayout(config,"KOListView Layout");
00419 }
00420
00421 void KOListView::processSelectionChange()
00422 {
00423 kdDebug(5850) << "KOListView::processSelectionChange()" << endl;
00424
00425 KOListViewItem *item =
00426 static_cast<KOListViewItem *>( mListView->selectedItem() );
00427
00428 if ( !item ) {
00429 emit incidenceSelected( 0 );
00430 } else {
00431 emit incidenceSelected( item->data() );
00432 }
00433 }
00434
00435 void KOListView::clearSelection()
00436 {
00437 mListView->selectAll( false );
00438 }
00439
00440 void KOListView::clear()
00441 {
00442 mListView->clear();
00443 mUidDict.clear();
00444 }