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 #include "calprinter.h"
00037 #include "koglobals.h"
00038
00039 #include "kolistview.h"
00040 #include "kolistview.moc"
00041
00042 ListItemVisitor::ListItemVisitor(KOListViewItem *item)
00043 {
00044 mItem = item;
00045 }
00046
00047 ListItemVisitor::~ListItemVisitor()
00048 {
00049 }
00050
00051 bool ListItemVisitor::visit(Event *e)
00052 {
00053 mItem->setText(0,e->summary());
00054 mItem->setText(1,e->dtStartDateStr());
00055 mItem->setText(2,e->dtStartTimeStr());
00056 mItem->setText(3,e->dtEndDateStr());
00057 mItem->setText(4,e->dtEndTimeStr());
00058 mItem->setText(5,e->isAlarmEnabled() ? i18n("Yes") : i18n("No"));
00059 mItem->setText(6,e->recurrence()->doesRecur() ? i18n("Yes") : i18n("No"));
00060 mItem->setText(7,"---");
00061 mItem->setText(8,"---");
00062 mItem->setText(9,e->categoriesStr());
00063
00064 QString key;
00065 QDate d = e->dtStart().date();
00066 QTime t = e->doesFloat() ? QTime(0,0) : e->dtStart().time();
00067 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),t.hour(),t.minute());
00068 mItem->setSortKey(1,key);
00069
00070 d = e->dtEnd().date();
00071 t = e->doesFloat() ? QTime(0,0) : e->dtEnd().time();
00072 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),t.hour(),t.minute());
00073 mItem->setSortKey(3,key);
00074
00075 return true;
00076 }
00077
00078 bool ListItemVisitor::visit(Todo *t)
00079 {
00080 mItem->setText(0,i18n("To-Do: %1").arg(t->summary()));
00081 mItem->setText(1,"---");
00082 mItem->setText(2,"---");
00083 mItem->setText(3,"---");
00084 mItem->setText(4,"---");
00085 mItem->setText(5,"---");
00086 mItem->setText(6,"---");
00087 if (t->hasDueDate()) {
00088 mItem->setText(7,t->dtDueDateStr());
00089 if (t->doesFloat()) {
00090 mItem->setText(8,"---");
00091 } else {
00092 mItem->setText(8,t->dtDueTimeStr());
00093 }
00094 } else {
00095 mItem->setText(7,"---");
00096 mItem->setText(8,"---");
00097 }
00098 mItem->setText(9,t->categoriesStr());
00099
00100 QString key;
00101 QDate d = t->dtDue().date();
00102 QTime tm = t->doesFloat() ? QTime(0,0) : t->dtDue().time();
00103 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute());
00104 mItem->setSortKey(7,key);
00105
00106 return true;
00107 }
00108
00109 bool ListItemVisitor::visit(Journal *)
00110 {
00111 return false;
00112 }
00113
00114 KOListView::KOListView(Calendar *calendar, QWidget *parent,
00115 const char *name)
00116 : KOEventView(calendar, parent, name)
00117 {
00118 mActiveItem = 0;
00119
00120 mListView = new KListView(this);
00121 mListView->addColumn(i18n("Summary"));
00122 mListView->addColumn(i18n("Start Date"));
00123 mListView->setColumnAlignment(1,AlignHCenter);
00124 mListView->addColumn(i18n("Start Time"));
00125 mListView->setColumnAlignment(2,AlignHCenter);
00126 mListView->addColumn(i18n("End Date"));
00127 mListView->setColumnAlignment(3,AlignHCenter);
00128 mListView->addColumn(i18n("End Time"));
00129 mListView->setColumnAlignment(4,AlignHCenter);
00130 mListView->addColumn(i18n("Alarm"));
00131 mListView->addColumn(i18n("Recurs"));
00132 mListView->addColumn(i18n("Due Date"));
00133 mListView->setColumnAlignment(7,AlignHCenter);
00134 mListView->addColumn(i18n("Due Time"));
00135 mListView->setColumnAlignment(8,AlignHCenter);
00136 mListView->addColumn(i18n("Categories"));
00137 mListView->setColumnAlignment(9,AlignHCenter);
00138
00139 QBoxLayout *layoutTop = new QVBoxLayout(this);
00140 layoutTop->addWidget(mListView);
00141
00142 mPopupMenu = eventPopup();
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 QObject::connect(mListView,SIGNAL(doubleClicked(QListViewItem *)),
00157 this,SLOT(defaultItemAction(QListViewItem *)));
00158 QObject::connect(mListView,SIGNAL(rightButtonClicked ( QListViewItem *,
00159 const QPoint &, int )),
00160 this,SLOT(popupMenu(QListViewItem *,const QPoint &,int)));
00161 QObject::connect(mListView,SIGNAL(selectionChanged()),
00162 SLOT(processSelectionChange()));
00163
00164
00165 mListView->restoreLayout(KGlobal::config(),"KOListView Layout");
00166 }
00167
00168 KOListView::~KOListView()
00169 {
00170 delete mPopupMenu;
00171 }
00172
00173 int KOListView::maxDatesHint()
00174 {
00175 return 0;
00176 }
00177
00178 int KOListView::currentDateCount()
00179 {
00180 return 0;
00181 }
00182
00183 QPtrList<Incidence> KOListView::selectedIncidences()
00184 {
00185 QPtrList<Incidence> eventList;
00186
00187 QListViewItem *item = mListView->selectedItem();
00188 if (item) eventList.append(((KOListViewItem *)item)->data());
00189
00190 return eventList;
00191 }
00192
00193 DateList KOListView::selectedDates()
00194 {
00195 DateList eventList;
00196 return eventList;
00197 }
00198
00199 void KOListView::showDates(bool show)
00200 {
00201
00202
00203 static int oldColWidth1 = 0;
00204 static int oldColWidth3 = 0;
00205
00206 if (!show) {
00207 oldColWidth1 = mListView->columnWidth(1);
00208 oldColWidth3 = mListView->columnWidth(3);
00209 mListView->setColumnWidth(1, 0);
00210 mListView->setColumnWidth(3, 0);
00211 } else {
00212 mListView->setColumnWidth(1, oldColWidth1);
00213 mListView->setColumnWidth(3, oldColWidth3);
00214 }
00215 mListView->repaint();
00216 }
00217
00218 void KOListView::printPreview(CalPrinter *calPrinter, const QDate &fd,
00219 const QDate &td)
00220 {
00221 #ifndef KORG_NOPRINTER
00222 calPrinter->preview(CalPrinter::Day, fd, td);
00223 #endif
00224 }
00225
00226 void KOListView::showDates()
00227 {
00228 showDates(true);
00229 }
00230
00231 void KOListView::hideDates()
00232 {
00233 showDates(false);
00234 }
00235
00236 void KOListView::updateView()
00237 {
00238 kdDebug() << "KOListView::updateView() does nothing" << endl;
00239 }
00240
00241 void KOListView::showDates(const QDate &start, const QDate &end)
00242 {
00243 clear();
00244
00245 QDate date = start;
00246 while( date <= end ) {
00247 addEvents(calendar()->events(date));
00248 addTodos(calendar()->todos(date));
00249 date = date.addDays( 1 );
00250 }
00251
00252 emit incidenceSelected( 0 );
00253 }
00254
00255 void KOListView::addEvents(QPtrList<Event> eventList)
00256 {
00257 Event *ev;
00258 for(ev = eventList.first(); ev; ev = eventList.next()) {
00259 addIncidence(ev);
00260 }
00261 }
00262
00263 void KOListView::addTodos(QPtrList<Todo> eventList)
00264 {
00265 Todo *ev;
00266 for(ev = eventList.first(); ev; ev = eventList.next()) {
00267 addIncidence(ev);
00268 }
00269 }
00270
00271 void KOListView::addIncidence(Incidence *incidence)
00272 {
00273 if ( mUidDict.find( incidence->uid() ) ) return;
00274
00275 mUidDict.insert( incidence->uid(), incidence );
00276
00277 KOListViewItem *item = new KOListViewItem( incidence, mListView );
00278 ListItemVisitor v(item);
00279 if (incidence->accept(v)) return;
00280 else delete item;
00281 }
00282
00283 void KOListView::showEvents(QPtrList<Event> eventList)
00284 {
00285 clear();
00286
00287 addEvents(eventList);
00288
00289
00290 emit incidenceSelected( 0 );
00291 }
00292
00293 void KOListView::changeEventDisplay(Event *event, int action)
00294 {
00295 KOListViewItem *item;
00296
00297 switch(action) {
00298 case KOGlobals::EVENTADDED:
00299 addIncidence( event );
00300 break;
00301 case KOGlobals::EVENTEDITED:
00302 item = getItemForEvent(event);
00303 if (item) {
00304 delete item;
00305 addIncidence( event );
00306 }
00307 break;
00308 case KOGlobals::EVENTDELETED:
00309 item = getItemForEvent(event);
00310 if (item) {
00311 delete item;
00312 }
00313 break;
00314 default:
00315 kdDebug() << "KOListView::changeEventDisplay(): Illegal action " << action << endl;
00316 }
00317 }
00318
00319 KOListViewItem *KOListView::getItemForEvent(Event *event)
00320 {
00321 KOListViewItem *item = (KOListViewItem *)mListView->firstChild();
00322 while (item) {
00323
00324 if (item->data() == event) return item;
00325 item = (KOListViewItem *)item->nextSibling();
00326 }
00327 return 0;
00328 }
00329
00330 void KOListView::defaultItemAction(QListViewItem *i)
00331 {
00332 KOListViewItem *item = static_cast<KOListViewItem *>( i );
00333 if ( item ) defaultAction( item->data() );
00334 }
00335
00336 void KOListView::popupMenu(QListViewItem *item,const QPoint &,int)
00337 {
00338 mActiveItem = (KOListViewItem *)item;
00339 if (mActiveItem) {
00340 Incidence *incidence = mActiveItem->data();
00341 if ( incidence && incidence->type() == "Event" ) {
00342 Event *event = static_cast<Event *>( incidence );
00343 mPopupMenu->showEventPopup(event);
00344 }
00345 }
00346 }
00347
00348 void KOListView::readSettings(KConfig *config)
00349 {
00350 mListView->restoreLayout(config,"KOListView Layout");
00351 }
00352
00353 void KOListView::writeSettings(KConfig *config)
00354 {
00355 mListView->saveLayout(config,"KOListView Layout");
00356 }
00357
00358 void KOListView::processSelectionChange()
00359 {
00360 kdDebug() << "KOListView::processSelectionChange()" << endl;
00361
00362 KOListViewItem *item =
00363 static_cast<KOListViewItem *>( mListView->selectedItem() );
00364
00365 if ( !item ) {
00366 emit incidenceSelected( 0 );
00367 } else {
00368 emit incidenceSelected( item->data() );
00369 }
00370 }
00371
00372 void KOListView::clearSelection()
00373 {
00374 mListView->selectAll( false );
00375 }
00376
00377 void KOListView::clear()
00378 {
00379 mListView->clear();
00380 mUidDict.clear();
00381 }