⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datebook.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		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 + -