📄 datebook.cpp
字号:
QDataStream ds( dataref, IO_WriteOnly ); PimEvent event = evtPick.currentEvent(); ds << event.uid() << evtPick.currentDate();#ifndef QT_NO_COP QCopEnvelope e( QDL::CLIENT_CHANNEL, "QDLProvideLink(QString,int,...)" ); e << clientID; e << (int)1; e << QDLLink( QCString( "datebook" ), dataref, event.description(), QCString( "datebook/DateBook" ) );#endif } } else {#ifndef QT_NO_COP QCopEnvelope e( QDL::CLIENT_CHANNEL, "QDLProvideLink(QString,int,...)" ); e << clientID; e << (int)0;#endif } } else if ( msg == "QDLActivateLink(QByteArray)" ) { QByteArray dataref; stream >> dataref; QDataStream ds( dataref, IO_ReadOnly ); QUuid u; QDate date; ds >> u >> date; bool ok; Occurrence o = db->find( u, date, &ok ); if ( ok ) { viewDay( o.startInCurrentTZ().date() ); dayView->setCurrentItem( o ); needShow = TRUE; } }#endif else if ( msg == "cleanByDate(QDate)" ) { QDate d; stream >> d; purgeEvents( d, FALSE ); } if ( needShow ) {#if defined(Q_WS_QWS) || defined(_WS_QWS_) //showMaximized();#else //show();#endif //raise(); QPEApplication::setKeepRunning(); //setActiveWindow(); }}void DateBook::nextView(){ QWidget* cur = views->visibleWidget(); if ( cur ) { if ( cur == dayView )#if !defined(QTOPIA_PHONE) viewWeek(); else if ( cur == weekView )#endif viewMonth(); else if ( cur == monthView ) viewDay(); }}void DateBook::reload(){ // reload isn't as meaningful anymore. //db->reload();} else db->reload(); if ( actionDay->isOn() ) viewDay();#if !defined(QTOPIA_PHONE) else if ( actionWeek->isOn() ) viewWeek();#endif else if ( actionMonth->isOn() ) viewMonth(); syncing = FALSE;}void DateBook::flush(){ db->flush(); syncing = TRUE; // db->save(); // neither is saving.}void DateBook::timerEvent( QTimerEvent *e ){ static int stop = 0; if ( stop < 10 ) { Sound::soundAlarm(); stop++; } else { stop = 0; killTimer( e->timerId() ); }}void DateBook::changeClock(){ // repaint the affected objects... if (dayView) dayView->redraw();#if !defined(QTOPIA_PHONE) if (weekView) weekView->redraw();#endif}void DateBook::changeWeek( bool m ){ /* no need to redraw, each widget catches. Do need to store though for widgets we haven't made yet */ onMonday = m;}void DateBook::slotToday(){ // we need to view today lastToday = QDate::currentDate(); if ( views->visibleWidget() == dayView ) { viewDay( lastToday );#if !defined(QTOPIA_PHONE) } else if (views->visibleWidget() == weekView) { weekView->selectDate( lastToday );#endif } else if (views->visibleWidget() == monthView){ monthView->setDate( lastToday ); }}void DateBook::closeEvent( QCloseEvent *e ){#ifdef QTOPIA_PHONE if ( views->visibleWidget() == eventView ) { e->ignore(); hideEventDetails(); return; }#endif slotToday(); if(syncing) { /* no need to save, did that at flush */ e->accept(); return; } // save settings will generate it's own error messages, no // need to do checking ourselves. saveSettings(); //if ( db->save() ) e->accept();#if 0 else { if ( QMessageBox::critical( parentWidget, tr( "Out of space" ), tr("<qt>Calendar was unable to save " "your changes. " "Free up some space and try again." "<br>Quit anyway?</qt>"), QMessageBox::Yes|QMessageBox::Escape, QMessageBox::No|QMessageBox::Default ) != QMessageBox::No ) e->accept(); else e->ignore(); }#endif}void DateBook::newEvent( const QString &description ){ QDateTime current = QDateTime::currentDateTime(); QDateTime start=current, end=current; int mod = QTime(0,0,0).secsTo(current.time()) % 900; if (mod != 0) { mod = 900 - mod; current = current.addSecs( mod ); } start.setTime(current.time()); start.setDate(current.date()); end = current.addSecs( 3600 ); newEvent(start,end,description,QString::null);}bool DateBook::newEvent(const QDateTime& dstart,const QDateTime& dend,const QString& description,const QString& notes){#ifndef QTOPIA_DESKTOP if ( checkSyncing() ) return FALSE;#endif QDateTime start=dstart, end=dend; QDateTime current = QDateTime::currentDateTime(); bool snull = start.date().isNull(); bool enull = end.date().isNull(); if ( views->visibleWidget() ) { if ( views->visibleWidget() == dayView ) { dayView->selectedDates( start, end ); } else if ( views->visibleWidget() == monthView ) { start.setDate( monthView->selectedDate() ); }#if !defined(QTOPIA_PHONE) else if ( views->visibleWidget() == weekView ) { start.setDate( weekView->currentDate() ); }#endif } if ( start.date().isNull() ) start.setDate( current.date() ); if ( end.date().isNull() ) end.setDate( start.date() ); if ( (snull && end.time().isNull()) || !start.time().isValid() ) { // We get to here from a key pressed in the Day View // So we can assume some things. We want the string // passed in to be part of the description. // move current to the next fifteen minutes int mod = QTime(0,0,0).secsTo(current.time()) % 900; if (mod != 0) { mod = 900 - mod; current = current.addSecs( mod ); } // default start start.setTime(current.time()); } if ( (enull && end.time().isNull()) || !end.time().isValid() ) { // default end end = start.addSecs(3600); } PimEvent ev; ev.setDescription( description ); // When the new gui comes in, change this... ev.setLocation( "" ); ev.setStart( start ); ev.setEnd( end ); ev.setNotes( notes ); if ( aPreset ) ev.setAlarm( presetTime, PimEvent::Loud ); EntryDialog e( onMonday, ev, parentWidget->isVisible() ? parentWidget : 0, "new-event", TRUE ); e.setCaption( EntryDetails::tr("New Event") );#ifdef QTOPIA_DESKTOP connect( e.entryDetails()->comboCategory, SIGNAL(editCategoriesClicked(QWidget*)), SLOT(editCategories(QWidget*)) ); connect( this, SIGNAL(categoriesChanged()), &e, SLOT(updateCategories()) ); e.resize( 500, 300 );#endif while (QPEApplication::execDialog(&e)) { ev = e.event(); //ev.assignUid(); // um, don't know if we can drop this or not QString error = checkEvent( ev ); if ( !error.isNull() ) { if ( QMessageBox::warning( parentWidget, tr("Error!"), error, tr("Fix it"), tr("Continue"), 0, 0, 1 ) == 0 ) continue; } QUuid id = db->addEvent( ev ); emit eventsChanged(); if ( views->visibleWidget() == dayView ) { dayView->clearSelectedDates(); bool ok; PimEvent e = db->find( id, &ok ); if ( ok ) dayView->setCurrentEvent( e ); } return TRUE; } if ( views->visibleWidget() == dayView ) dayView->clearSelectedDates(); return FALSE;}void DateBook::setDocument( const QString &filename ){ DocLnk doc(filename); if ( doc.isValid() ) receiveFile(doc.file()); else receiveFile(filename);}bool DateBook::receiveFile( const QString &filename ){ QValueList<PimEvent> tl = PimEvent::readVCalendar( filename ); QString msg = tr("<P>%1 new events.<p>Do you want to add them to your Calendar?"). arg(tl.count()); if ( QMessageBox::information(parentWidget, tr("New Events"), msg, QMessageBox::Ok, QMessageBox::Cancel)==QMessageBox::Ok ) { QDateTime from,to; for( QValueList<PimEvent>::Iterator it = tl.begin(); it != tl.end(); ++it ) { if ( from.isNull() || (*it).start() < from ) from = (*it).start(); if ( to.isNull() || (*it).end() < to ) to = (*it).end(); db->addEvent( *it ); } // Change view to a sensible one...#ifdef QTOPIA_PHONE if ( from.date() == to.date() ) viewDay( from.date() ); else viewMonth( from.date() );#else if ( from.date() == to.date() ) { viewDay(from.date()); } else { initWeek(); int fw,fy,tw,ty; weekView->calcWeek(from.date(), fw, fy); weekView->calcWeek(to.date(), tw, ty); if ( fw == tw && fy == ty ) { viewWeek(from.date()); } else if ( from.date().month() == to.date().month() && from.date().year() == to.date().year() ) { viewMonth(from.date()); } else { viewDay(from.date()); } }#endif emit eventsChanged(); return TRUE; } return FALSE;}void DateBook::beamEvent( const PimEvent &e ){#ifdef Q_WS_QWS ::unlink( beamfile.local8Bit().data() ); // delete if exists PimEvent::writeVCalendar( beamfile, e ); Ir *ir = new Ir( this ); connect( ir, SIGNAL( done(Ir*) ), this, SLOT( beamDone(Ir*) ) ); QString description = e.description(); ir->send( beamfile, description, "text/x-vCalendar" );#else Q_UNUSED(e)#endif}void DateBook::beamDone( Ir *ir ){#ifdef Q_WS_QWS delete ir; ::unlink( beamfile.local8Bit().data() );#else Q_UNUSED(ir)#endif}void DateBook::slotFind(){ // move it to the day view... viewDay(); FindDialog frmFind( "Calendar", parentWidget ); // No tr frmFind.setUseDate( true ); frmFind.setDate( currentDate() ); connect( &frmFind, SIGNAL(signalFindClicked(const QString&,const QDate&,bool,bool,int)), this, SLOT(slotDoFind(const QString&,const QDate&,bool,bool,int)) ); connect( this, SIGNAL(signalNotFound()), &frmFind, SLOT(slotNotFound()) ); connect( this, SIGNAL(signalWrapAround()), &frmFind, SLOT(slotWrapAround()) ); QPEApplication::execDialog(&frmFind); inSearch = false;}bool catComp( QArray<int> cats, int category ){ bool returnMe; int i, count; count = int(cats.count()); returnMe = false; if ( (category == -1 && count == 0) || category == -2 ) returnMe = true; else { for ( i = 0; i < count; i++ ) { if ( category == cats[i] ) { returnMe = true; break; } } } return returnMe;}void DateBook::slotDoFind( const QString& txt, const QDate &dt, bool caseSensitive, bool searchForward, int category ){ bool ok; QRegExp r(txt); r.setCaseSensitive(caseSensitive); Occurrence o = db->find(r, category, dt, searchForward, &ok); if ( ok ) { dayView->selectDate( o.startInCurrentTZ().date() ); dayView->setCurrentItem(o); }}void DateBook::showEventDetails(){#ifdef QTOPIA_DESKTOP if (eventSelected()) editOccurrence(currentOccurrence(), TRUE);#else initEvent(); if ( views->visibleWidget() != eventView ) { eventView->previousView = views->visibleWidget(); raiseWidget( eventView ); eventView->setFocus(); updateIcons(); if (actionFind) actionFind->setEnabled( FALSE ); } eventView->init( currentEvent() );#endif}void DateBook::hideEventDetails(){ raiseWidget( eventView->previousView ); eventView->previousView->setFocus(); updateIcons(); if (actionFind) actionFind->setEnabled( TRUE );}void DateBook::raiseWidget( QWidget *widget ){ if ( !widget ) return;#ifndef QTOPIA_DESKTOP parentWidget->setName( widget->name() );#endif views->raiseWidget( widget );}void DateBook::slotPurge(){ QDialog dlg( parentWidget->isVisible() ? parentWidget : 0, "purge", TRUE );#ifdef QTOPIA_PHONE dlg.setCaption( tr("Purge") );#else dlg.setCaption( tr("Purge Events") );#endif QVBoxLayout *vb = new QVBoxLayout( &dlg ); QLabel *lbl = new QLabel( tr("<qt>Please select a date. Everything on and before this date will be removed.</qt>"), &dlg ); lbl->setAlignment( AlignCenter|AlignVCenter ); vb->addWidget( lbl ); QPEDateEdit *dp = new QPEDateEdit( &dlg, 0, FALSE, TRUE ); vb->addWidget( dp );#ifdef QTOPIA_DESKTOP QWidget *buttons = new QWidget( &dlg ); vb->addWidget( buttons ); QHBoxLayout *hb = new QHBoxLayout( buttons ); hb->addStretch( 1 ); QPushButton *ok = new QPushButton( tr("Ok"), buttons ); hb->addWidget( ok ); connect( ok, SIGNAL(clicked()), &dlg, SLOT(accept()) ); QPushButton *cancel = new QPushButton( tr("Cancel"), buttons ); hb->addWidget( cancel ); connect( cancel, SIGNAL(clicked()), &dlg, SLOT(reject()) ); dlg.resize( 100, 50 );#endif if ( QPEApplication::execDialog( &dlg ) ) { purgeEvents( dp->date() ); }}void DateBook::purgeEvents( const QDate &date, bool prompt ){ if (date.isNull()) return;#ifndef QTOPIA_DESKTOP QDialog *wait = new QDialog( parentWidget->isVisible() ? parentWidget : 0, 0, TRUE, WStyle_Customize | WStyle_NoBorder ); QVBox *vb = new QVBox( wait ); QLabel *l = new QLabel( tr("<b>Please Wait</b>"), vb ); l->setAlignment( AlignCenter|AlignVCenter ); wait->show(); qApp->processEvents();#endif QDateTime from( date ); { const QList<PrEvent> &pevents = db->eventsIO().events(); QListIterator<PrEvent> it( pevents ); for ( PrEvent *e = it.current(); (e = it.current()); ++it ) { QDateTime s = e->startInCurrentTZ(); if ( s < from ) from = s; } } QValueList<PimEvent> events = purge_getEvents( from, date );#ifndef QTOPIA_DESKTOP wait->close();#endif // nothing to do if ( events.count() == 0 ) return; // give the user a chance to back out if ( prompt && QMessageBox::warning( parentWidget, tr("WARNING"), tr( "<qt>You are about to delete %1 events. " "Are you sure you want to do this?</qt>" ).arg( events.count() ), tr("Delete"), tr("Abort"), 0, 1, 1 ) ) return;#ifndef QTOPIA_DESKTOP wait->show(); qApp->processEvents();#endif // delete everything (multiple passes because of interdependant events do { for ( QValueList<PimEvent>::Iterator it = events.begin(); it != events.end(); ++it ) { db->removeEvent( *it ); } events = purge_getEvents( from, date ); } while ( events.count() > 0 );#ifndef QTOPIA_DESKTOP delete wait;#endif}QValueList<PimEvent> DateBook::purge_getEvents( const QDateTime &from, const QDate &date ){ QValueList<Occurrence> occs = db->getOccurrences( from.date().addDays( -2 ), date ); QValueList<PimEvent> events; for ( QValueList<Occurrence>::Iterator it = occs.begin(); it != occs.end(); ++it ) { Occurrence o = *it; PimEvent e = o.event(); if ( e.hasRepeat() && (e.repeatForever() || e.repeatTill() >= date) ) continue; if ( !events.contains( e ) ) events.append( e ); } return events;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -