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

📄 datebookplugin.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.** ** This program is free software; you can redistribute it and/or modify it** under the terms of the GNU General Public License as published by the** Free Software Foundation; either version 2 of the License, or (at your** option) any later version.** ** A copy of the GNU GPL license version 2 is included in this package as ** LICENSE.GPL.**** This program is distributed in the hope that it will be useful, but** WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details.**** In addition, as a special exception Trolltech gives permission to link** the code of this program with Qtopia applications copyrighted, developed** and distributed by Trolltech under the terms of the Qtopia Personal Use** License Agreement. You must comply with the GNU General Public License** in all respects for all of the code used other than the applications** licensed under the Qtopia Personal Use License Agreement. If you modify** this file, you may extend this exception to your version of the file,** but you are not obligated to do so. If you do not wish to do so, delete** this exception statement from your version.** ** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "datebookplugin.h"#include "datebookpluginoptions.h"#include <qtopia/timestring.h>#include <qtopia/config.h>#include <qtopia/pim/datebookaccess.h>#include <qtopia/pim/event.h>#include <qtopia/qcopenvelope_qws.h>#include <qtopia/services.h>#include <qtopia/quuid.h>#include <qtopia/resource.h>#include <qtl.h>class ShortDateEvent{public:    ShortDateEvent(void): repeating(FALSE) {}    QString	description;    QDateTime	start;    QDateTime	end;    QUuid	uid;    bool	repeating;    bool	allday;    bool	operator<(ShortDateEvent &s) { return start < s.start; }    bool	operator>(ShortDateEvent &s) { return start > s.start; }    bool	operator<=(ShortDateEvent &s) { return start <= s.start; }};class DatebookPluginPrivate{public:    DatebookPluginPrivate()    {	datebookAccess = new DateBookAccess();	days = 1;	limit = 0;	readConfig();    }        ~DatebookPluginPrivate()    {	delete datebookAccess;    }        void readConfig()    {	Config config("datebookplugin");	config.setGroup("view");	days = config.readNumEntry("days", 1);	limit = config.readNumEntry("limit", 3);    }    // max is currently unused.    void getTaskList(uint /* max */)    {	events.clear();		DateBookIterator it(*datebookAccess);	QDate date = QDate::currentDate();	QDate before = date;	before = before.addDays( days );	for ( ; it.current(); ++it) {	    PimEvent event( *it.current() );	    //	    // Show events that occur between today and however many	    // days in the future is requested (comes from setup).	    // Take special note of recurring events.	    //	    if ((event.endInCurrentTZ().date() >= date && event.startInCurrentTZ().date() < before) ||		    (event.hasRepeat() && event.nextOccurrence(date) < before)){		ShortDateEvent	e;		e.description = event.description();		e.repeating = event.hasRepeat();		e.start = event.startInCurrentTZ();		e.end = event.endInCurrentTZ();		e.uid = event.uid();		e.allday = event.isAllDay();		if (!e.repeating) {		    events.append( e );		} else {		    //		    // The first occurrence of this repeating event may have		    // happened in the past.  If the event happens today, use		    // the time of the event from the first occurrence.		    //		    if (event.nextOccurrence(date) == date) {			e.start = date;			e.start.setTime(event.startInCurrentTZ().time());			events.append(e);		    }		    //		    // Handle the rest of the recurrences.  Don't have		    // to worry about the time, as we only show the day		    // (if the event's not happening today).  Start checking		    // occurrences from tomorrow, as we've already done		    // today.  Check for post-today events to avoid wrapping.		    //		    QDate today = date.addDays(1);		    bool post = TRUE;		    while (today < before && post) {			if (event.nextOccurrence(today, &post) < before) {			    if (post) {				e.start = event.nextOccurrence(today);				events.append(e);			    }			}			today = event.nextOccurrence(today, &post).addDays(1);		    }		}	    }	}	qHeapSort(events);	if ( !limit )	    limit = events.count();	else if ( limit > events.count() )	    limit = events.count();    }    DateBookAccess *datebookAccess;    QValueList<ShortDateEvent> events;    int days;    uint limit;};DatebookPlugin::DatebookPlugin(QObject *parent, const char *name)	: QObject(parent, name){    d = new DatebookPluginPrivate();    connect( d->datebookAccess, SIGNAL( dateBookUpdated() ), this, SLOT( datebookUpdated() ) );}DatebookPlugin::~DatebookPlugin(){    delete d;}QString DatebookPlugin::name() const{    return tr("Calendar");}QPixmap DatebookPlugin::icon() const{    return Resource::loadPixmap("datebook/DateBook");}// lineHeight is currently unused.QString DatebookPlugin::html(uint charWidth, uint /* lineHeight */) const{    QString status;    uint eventCount = d->limit;    d->getTaskList(eventCount);    if ( d->events.count() == 1 ) {	status = tr("You have 1 event");    } else if ( d->events.count() > 1 ) {	status = tr("You have %1 events").arg( d->events.count() );    } else {	status = tr("You have no events");    }    if ( d->days == 1 ) {	status = tr("%1 today","eg. You have 1 event").arg(status);    } else {	status = tr("%1 over the next %2 days","eg. You have 5 events").arg(status).arg( d->days);    }    QString str;    str = "<table> <tr> <td> <a href=\"raise:datebook\"><img src=\"datebook/DateBook\" alt=\"Calendar\"></a> </td>";    str += "<td> <b> " + status + " </b> </td> </table>";    if ( d->limit ) {	str += " <table> ";	for (uint i = 0; i < d->limit; i++ ) {	    ShortDateEvent t = d->events[i];	    QString when;	    QString startTime = TimeString::localHM(t.start.time());	    QString endTime = TimeString::localHM(t.end.time());	    QDate today = QDate::currentDate();	    QDate tomorrow = today.addDays(1);	    if ( t.start.date() == QDate::currentDate() ) {		if (t.allday) {		    when = tr("All day");		} else {		    // use different strings to keep things translatable		    if ( t.end.date() == today )			when = tr("%1 to %2").arg(startTime).arg(endTime);		    else if ( t.end.date() == tomorrow )			when = tr("%1 to tomorrow, %2").arg(startTime).arg(endTime);		    else {			// within the next week, use the day name			if (t.end.date() < today.addDays(6))			    when = tr("%1 to %2, %3","eg 12pm to mon, 1pm").arg(startTime).arg(t.end.date().dayName(t.end.date().dayOfWeek())).arg(endTime);			else {			    if (today.year() != t.end.date().year())				when = tr("%1 to %2 %3 %4, %5","eg 12pm to 1 feb 2015, 1pm").arg(startTime).arg(t.end.date().day()).arg(t.end.date().monthName(t.end.date().month())).arg(t.end.date().year()).arg(endTime);			    else				when = tr("%1 to %2 %3, %4","eg 12pm to 1 feb, 1pm").arg(startTime).arg(t.end.date().day()).arg(t.end.date().monthName(t.end.date().month())).arg(endTime);			}		    }		}	    } else if (t.repeating) {		when = TimeString::localYMD(t.start.date());	    } else if ( t.end.date() == QDate::currentDate() ) {		when = tr("Ending %1").arg(endTime);	    // this case doesnt seem be included	    } else if ( t.start.date() > QDate::currentDate() ) {		when = TimeString::localYMD( t.start.date() );	    } else {	// Date within bounds		when = tr("Finishes %1","time").arg(TimeString::localYMD( t.end.date() ));	    }	    QString desc = t.description;	    int trunc = charWidth - when.length();	    if ( trunc <= 0 ) {	    	desc = "...";	    } else {		if ( desc.length() > uint(trunc) ) {		    desc.truncate(trunc);		    desc += "...";		}	    }	    	    str += "<tr> <td> <a href=\"qcop:" +		    name() + QString(":%1\">").arg(i) + desc + "</a> "		    "</td> <td> " + when + " </td> </tr> <tr> ";	}	str += " </tr> </table>";    }    return str;}QWidget* DatebookPlugin::widget(QWidget *parent){    return new DatebookPluginOptions(parent, "Datebook plugin");}void DatebookPlugin::accepted(QWidget *w) const{    ( (DatebookPluginOptions *) w)->writeConfig();    d->readConfig();}void DatebookPlugin::itemSelected(const QString &index) const{    QCopEnvelope e( Service::channel("Calendar"), "showEvent(QUuid,QDate)");    e << d->events[ index.toInt() ].uid;    e << d->events[ index.toInt() ].start.date();}void DatebookPlugin::datebookUpdated(){    d->readConfig();	//refresh limit    emit reload();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -