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 }