-rw-r--r-- | core/pim/today/TODO | 2 | ||||
-rw-r--r-- | core/pim/today/changelog | 4 | ||||
-rw-r--r-- | core/pim/today/configwidget.h | 17 | ||||
-rw-r--r-- | core/pim/today/opie-today.control | 7 | ||||
-rw-r--r-- | core/pim/today/today.cpp | 708 | ||||
-rw-r--r-- | core/pim/today/today.h | 97 | ||||
-rw-r--r-- | core/pim/today/today.pro | 4 | ||||
-rw-r--r-- | core/pim/today/todaybase.cpp | 190 | ||||
-rw-r--r-- | core/pim/today/todaybase.h | 48 | ||||
-rw-r--r-- | core/pim/today/todayconfig.cpp | 315 | ||||
-rw-r--r-- | core/pim/today/todayconfig.h | 55 | ||||
-rw-r--r-- | core/pim/today/todayplugininterface.h | 82 |
12 files changed, 614 insertions, 915 deletions
diff --git a/core/pim/today/TODO b/core/pim/today/TODO index 30a8bab..1326f88 100644 --- a/core/pim/today/TODO +++ b/core/pim/today/TODO @@ -1,11 +1,9 @@ TODO for today: * show "upcoming appointents the next days .. one or too" * show alarm icons on alarm events (partly done) * qcop integration for updating events? -* make Opiezilla a clickable label wich is allway on the far right side of -the screen , klick will open credits ,) diff --git a/core/pim/today/changelog b/core/pim/today/changelog index 73de50d..5fd3284 100644 --- a/core/pim/today/changelog +++ b/core/pim/today/changelog @@ -1,64 +1,68 @@ +0.5 + +* now fully plugin based + 0.3.4 * "fill our business card now a clickable label" * Several bugfixes regarding todo section. 0.3.3 * Changed the logo so it better scales to bigger display and also made the "Today" string translatable. * some am/pm fixes * clickable labels now in libopie 0.3.2 * Autostart is now more configurable. You can decide how long the ipaq has to has been suspended, before autostart is triggered.(Opie only) * am/pm time optinal (autodetect) 0.3.1 * fixed the wrong color of the buttons * better translation (thanks carsten and others) * fixes memory leaks * bugfixes in calendar part, now location and note are working again. 0.3.0 * today uses now tododb from libopie. So major changes in the todo part: - overdue items on top - then sorted by date, then by priority * some cleanups * speed optimisations 0.2.9 * Many bugfixes. * Today now apparently sorts the dates _allways_ right, i would assume it to be a qt bug 0.2.8 * Appointments are now clickable (connection to datebook still missing) * autostart support (opie only) 0.2.7 * check if todolist.xml was changed before parsing it * check only every 30 sec for changes. * some visual stuff * as usual many little improvements .-) 0.2.6 * added scrollbars to dates and todo * all day detection * some smaller bugfixes 0.2.5 * some other minor fixes regarding autoupdate * fixed segfault with todolist > 7 entries * fixed the "ugly grey border around buttons" issue * fixed the "empty calendar field" "bug" diff --git a/core/pim/today/configwidget.h b/core/pim/today/configwidget.h new file mode 100644 index 0000000..f449db4 --- a/dev/null +++ b/core/pim/today/configwidget.h @@ -0,0 +1,17 @@ + +#ifndef CONFIG_WIDGET_H +#define CONFIG_WIDGET_H + + + +class ConfigWidget : public QWidget { + +public: + + ConfigWidget( QWidget *parent, const char *name ) : QWidget( parent, name ) {}; + virtual ~ConfigWidget() {}; + + virtual void writeConfig() = 0; +}; + +#endif diff --git a/core/pim/today/opie-today.control b/core/pim/today/opie-today.control index b8e2e02..bcac439 100644 --- a/core/pim/today/opie-today.control +++ b/core/pim/today/opie-today.control @@ -1,16 +1,17 @@ Files: bin/today apps/1Pim/today.desktop pics/today/* Priority: optional Section: opie/applications -Maintainer: Maximilian Reiß <max.reiss@gmx.de> +Maintainer: Maximilian Reiß <harlekin@handhelds.org> Architecture: arm -Version: 0.3.4-$SUB_VERSION -Depends: opie-base ($QPE_VERSION), libopie ($QPE_VERSION) +Version: 0.5-$SUB_VERSION +Depends: opie-base ($QPE_VERSION), libopie ($QPE_VERSION), +opie-today-datebookplugin, opie-today-todolistplugin License: GPL Description: today screen This today screen app gives an overview of appointments and todos. It also shows incoming and outgoing mails from opiemail. When using Opie (opie.handhelds.org) today can be autostarted on resume. It is highly configurable. diff --git a/core/pim/today/today.cpp b/core/pim/today/today.cpp index 62becb0..09540bd 100644 --- a/core/pim/today/today.cpp +++ b/core/pim/today/today.cpp @@ -1,637 +1,305 @@ /* - * today.cpp : main class + * today.cpp * - * --------------------- - * - * begin : Sun 10 17:20:00 CEST 2002 * copyright : (c) 2002 by Maximilian Reiß - * email : max.reiss@gmx.de + * email : harlekin@handhelds.org * */ /*************************************************************************** * * * 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. * * * ***************************************************************************/ + #include "today.h" +#include "configwidget.h" -#include <qpe/timestring.h> #include <qpe/config.h> #include <qpe/qcopenvelope_qws.h> #include <qpe/resource.h> -#include <qpe/contact.h> #include <qpe/global.h> #include <qpe/qpeapplication.h> +#include <qpe/contact.h> #include <qdir.h> #include <qfile.h> -#include <qdatetime.h> -#include <qtextstream.h> -#include <qcheckbox.h> -#include <qspinbox.h> #include <qpushbutton.h> #include <qlabel.h> #include <qtimer.h> #include <qpixmap.h> #include <qlayout.h> -#include <qtl.h> - +#include <qtabwidget.h> +#include <qdialog.h> -#include <unistd.h> -#include <stdlib.h> -int MAX_LINES_TASK; -int MAX_CHAR_CLIP; -int MAX_LINES_MEET; -int SHOW_LOCATION; -int SHOW_NOTES; -// show only later dates -int ONLY_LATER; -int AUTOSTART; -int NEW_START=1; -QString AUTOSTART_TIMER; -int NEXTDAYS=1; +static QValueList<TodayPlugin> pluginList; - -/* Constructs a Example which is a child of 'parent', with the - * name 'name' and widget flags set to 'f' - */ Today::Today( QWidget* parent, const char* name, WFlags fl ) - : TodayBase( parent, name, fl ), AllDateBookEvents(NULL) { - QObject::connect( (QObject*)PushButton1, SIGNAL( clicked() ), this, SLOT(startConfig() ) ); - QObject::connect( (QObject*)TodoButton, SIGNAL( clicked() ), this, SLOT(startTodo() ) ); - QObject::connect( (QObject*)DatesButton, SIGNAL( clicked() ), this, SLOT(startDatebook() ) ); - QObject::connect( (QObject*)MailButton, SIGNAL( clicked() ), this, SLOT(startMail() ) ); - QObject::connect( (QObject*)OwnerField, SIGNAL( clicked() ), this, SLOT(editCard() ) ); + : TodayBase( parent, name, fl ) { + + QObject::connect( (QObject*)ConfigButton, SIGNAL( clicked() ), this, SLOT( startConfig() ) ); + QObject::connect( (QObject*)OwnerField, SIGNAL( clicked() ), this, SLOT( editCard() ) ); #if defined(Q_WS_QWS) #if !defined(QT_NO_COP) - QCopChannel *todayChannel = new QCopChannel("QPE/Today" , this ); - connect (todayChannel, SIGNAL( received(const QCString &, const QByteArray &)), - this, SLOT ( channelReceived(const QCString &, const QByteArray &)) ); + QCopChannel *todayChannel = new QCopChannel( "QPE/Today" , this ); + connect ( todayChannel, SIGNAL( received( const QCString &, const QByteArray &) ), + this, SLOT ( channelReceived( const QCString &, const QByteArray &) ) ); #endif #endif + pluginLayout = 0l; - - db = NULL; - setOwnerField(); - todo = new ToDoDB; - draw(); - getTodo(); - autoStart(); + setOwnerField(); + init(); + refresh(); + showMaximized(); } -/* +/** * Qcop receive method. */ -void Today::channelReceived(const QCString &msg, const QByteArray & data) { - QDataStream stream(data, IO_ReadOnly ); +void Today::channelReceived( const QCString &msg, const QByteArray & data ) { + QDataStream stream( data, IO_ReadOnly ); if ( msg == "message(QString)" ) { - QString message; - stream >> message; - setOwnerField(message); + QString message; + stream >> message; + setOwnerField( message ); } - } -/* +/** * Initialises the owner field with the default value, the username */ void Today::setOwnerField() { - QString file = Global::applicationFileName("addressbook", "businesscard.vcf"); - if (QFile::exists(file)) { - Contact cont = Contact::readVCard(file)[0]; + QString file = Global::applicationFileName( "addressbook", "businesscard.vcf" ); + if ( QFile::exists( file ) ) { + Contact cont = Contact::readVCard( file )[0]; QString returnString = cont.fullName(); - OwnerField->setText( "<b>" +tr ("Owned by ") + returnString + "</b>"); + OwnerField->setText( "<b>" + tr ( "Owned by " ) + returnString + "</b>" ); } else { - OwnerField->setText( "<b>" + tr ("Please fill out the business card")+" </b>"); + OwnerField->setText( "<b>" + tr ( "Please fill out the business card" ) + " </b>" ); } } -/* +/** * Set the owner field with a given QString, for example per qcop. */ -void Today::setOwnerField(QString &message) { - if (!message.isEmpty()) { - OwnerField->setText("<b>" + message + "</b>"); - } -} - -/* - * Autostart, uses the new (opie only) autostart method in the launcher code. - * If registered against that today ist started on each resume. - */ -void Today::autoStart() { - Config cfg("today"); - cfg.setGroup("Autostart"); - int AUTOSTART = cfg.readNumEntry("autostart",1); -// qDebug(QString("%1").arg(AUTOSTART)); - if (AUTOSTART) { - QCopEnvelope e("QPE/System", "autoStart(QString,QString,QString)"); - e << QString("add"); - e << QString("today"); - e << AUTOSTART_TIMER; - } else { - qDebug("Nun in else bei autostart"); - QCopEnvelope e("QPE/System", "autoStart(QString,QString)"); - e << QString("remove"); - e << QString("today"); +void Today::setOwnerField( QString &message ) { + if ( !message.isEmpty() ) { + OwnerField->setText( "<b>" + message + "</b>" ); } } -/* - * Repaint method. Reread all fields. - */ -void Today::draw() { - init(); - getDates(); - getMail(); - - // if the todolist.xml file was not modified in between, do not parse it. - if (checkIfModified() || NEW_START==1) { - if (todo) delete todo; - todo = new ToDoDB; - getTodo(); - } - - // how often refresh - QTimer::singleShot( 20*1000, this, SLOT(draw() ) ); -} -/* - * Check if the todolist.xml was modified (if there are new entries. - * Returns true if it was modified. +/** + * Init stuff needed for today. Reads the config file. */ -bool Today::checkIfModified() { +void Today::init() { - QDir dir; - QString homedir = dir.homeDirPath (); - QString time; + QDate date = QDate::currentDate(); + QString time = ( tr( date.toString() ) ); - Config cfg("today"); - cfg.setGroup("Files"); - time = cfg.readEntry("todolisttimestamp", ""); + DateLabel->setText( QString( "<font color=#FFFFFF>" + time + "</font>" ) ); - QFileInfo file = (homedir +"/Applications/todolist/todolist.xml"); - QDateTime fileTime = file.lastModified(); - if (time.compare(fileTime.toString()) == 0) { - return false; - } else { - cfg.writeEntry("todolisttimestamp", fileTime.toString() ); - cfg.write(); - return true; - } + // read config + Config cfg( "today" ); + + cfg.setGroup( "Applets" ); + m_excludeApplets = cfg.readListEntry( "ExcludeApplets", ',' ); } -/* - * Init stuff needed for today. Reads the config file. +/** + * Load the plugins */ -void Today::init() { - QDate date = QDate::currentDate(); - QString time = (tr( date.toString()) ); - - TextLabel1->setText(QString("<font color=#FFFFFF>" + time + "</font>")); - - // read config - Config cfg("today"); - cfg.setGroup("BaseConfig"); - - // -- config file section -- - // how many lines should be showed in the task section - MAX_LINES_TASK = cfg.readNumEntry("maxlinestask",5); - // after how many chars should the be cut off on tasks and notes - MAX_CHAR_CLIP = cfg.readNumEntry("maxcharclip",40); - // how many lines should be showed in the datebook section - MAX_LINES_MEET = cfg.readNumEntry("maxlinesmeet",5); - // If location is to be showed too, 1 to activate it. - SHOW_LOCATION = cfg.readNumEntry("showlocation",1); - // if notes should be shown - SHOW_NOTES = cfg.readNumEntry("shownotes",0); - // should only later appointments be shown or all for the current day. - ONLY_LATER = cfg.readNumEntry("onlylater",1); - - cfg.setGroup("Autostart"); - AUTOSTART = cfg.readNumEntry("autostart",1); - AUTOSTART_TIMER = cfg.readEntry("autostartdelay", "0"); - - //db = new DateBookDB; -} +void Today::loadPlugins() { -/* - * The method for the configuration dialog. - */ -void Today::startConfig() { + QValueList<TodayPlugin>::Iterator tit; + for ( tit = pluginList.begin(); tit != pluginList.end(); ++tit ) { + (*tit).library->unload(); + delete (*tit).library; + } - conf = new todayconfig ( this, "", true ); - // read the config - Config cfg("today"); - cfg.setGroup("BaseConfig"); - - //init(); - - conf->SpinBox1->setValue(MAX_LINES_MEET); - // location show box - conf->CheckBox1->setChecked(SHOW_LOCATION); - // notes show box - conf->CheckBox2->setChecked(SHOW_NOTES); - // task lines - conf->SpinBox2->setValue(MAX_LINES_TASK); - // clip when? - conf->SpinBox7->setValue(MAX_CHAR_CLIP); - // only later - conf->CheckBox3->setChecked(ONLY_LATER); - // if today should be autostarted - conf->CheckBoxAuto->setChecked(AUTOSTART); - // autostart only if device has been suspended for X minutes - conf->SpinBoxTime->setValue( AUTOSTART_TIMER.toInt() ); - - conf->exec(); - - int maxlinestask = conf->SpinBox2->value(); - int maxmeet = conf->SpinBox1->value(); - int location = conf->CheckBox1->isChecked(); - int notes = conf->CheckBox2->isChecked(); - int maxcharclip = conf->SpinBox7->value(); - int onlylater = conf->CheckBox3->isChecked(); - int autostart = conf->CheckBoxAuto->isChecked(); - int autostartdelay = conf->SpinBoxTime->value(); - - - cfg.writeEntry("maxlinestask",maxlinestask); - cfg.writeEntry("maxcharclip", maxcharclip); - cfg.writeEntry("maxlinesmeet",maxmeet); - cfg.writeEntry("showlocation",location); - cfg.writeEntry("shownotes", notes); - cfg.writeEntry("onlylater", onlylater); - cfg.setGroup("Autostart"); - cfg.writeEntry("autostart", autostart); - cfg.writeEntry("autostartdelay", autostartdelay); - - // sync it to "disk" - cfg.write(); - NEW_START=1; - draw(); - AUTOSTART=autostart; - autoStart(); + QString path = QPEApplication::qpeDir() + "/plugins/today"; + QDir dir( path, "lib*.so" ); + + QStringList list = dir.entryList(); + QStringList::Iterator it; + + uint count = 0; + for ( it = list.begin(); it != list.end(); ++it ) { + TodayPluginInterface *iface = 0; + QLibrary *lib = new QLibrary( path + "/" + *it ); + + qDebug( "querying: %s", QString( path + "/" + *it ).latin1() ); + if ( lib->queryInterface( IID_TodayPluginInterface, (QUnknownInterface**)&iface ) == QS_OK ) { + qDebug( "loading: %s", QString( path + "/" + *it ).latin1() ); + qDebug( QString(*it).latin1() ); + TodayPlugin plugin; + plugin.library = lib; + plugin.iface = iface; + plugin.name = QString(*it).latin1(); + + if ( m_excludeApplets.grep( *it ).isEmpty() ) { + plugin.active = true; + } else { + plugin.active = false; + } + plugin.guiPart = plugin.iface->guiPart(); + pluginList.append( plugin ); + count++; + } else { + qDebug( "could not recognize %s", QString( path + "/" + *it ).latin1() ); + delete lib; + } + } } -/* - * Get all events that are in the datebook xml file for today +/** + * Repaint method. Reread all fields. */ -void Today::getDates() { - QDate date = QDate::currentDate(); - - if (AllDateBookEvents) delete AllDateBookEvents; - AllDateBookEvents = new QWidget( ); - QVBoxLayout* layoutDates = new QVBoxLayout(AllDateBookEvents); - - if (db) { - delete db; - } - db = new DateBookDB; - - QValueList<EffectiveEvent> list = db->getEffectiveEvents(date, date); - - qBubbleSort(list); - // printf("Get dates\n"); - - Config config( "qpe" ); - // if 24 h format - //bool ampm = config.readBoolEntry( "AMPM", TRUE ); - - int count=0; - - if ( list.count() > 0 ) { - - for ( QValueList<EffectiveEvent>::ConstIterator it=list.begin(); - it!=list.end(); ++it ) { - - - if ( count <= MAX_LINES_MEET ) { +void Today::draw() { - QTime time = QTime::currentTime(); + if ( pluginLayout ) { + delete pluginLayout; + } + pluginLayout = new QVBoxLayout( layout ); - if (!ONLY_LATER) { - count++; - DateBookEvent *l=new DateBookEvent(*it, AllDateBookEvents, SHOW_LOCATION, SHOW_NOTES); - layoutDates->addWidget(l); - connect (l, SIGNAL(editEvent(const Event &)), - this, SLOT(editEvent(const Event &))); - } else if ((time.toString() <= TimeString::dateString((*it).event().end())) ) { - count++; + if ( pluginList.count() == 0 ) { + QLabel *noPlugins = new QLabel( this ); + noPlugins->setText( tr( "No plugins found" ) ); + layout->addWidget( noPlugins ); + return; + } - // show only later appointments - DateBookEventLater *l=new DateBookEventLater(*it, AllDateBookEvents, SHOW_LOCATION, SHOW_NOTES); - layoutDates->addWidget(l); - connect (l, SIGNAL(editEvent(const Event &)), - this, SLOT(editEvent(const Event &))); + uint count = 0; + TodayPlugin plugin; + for ( uint i = 0; i < pluginList.count(); i++ ) { + plugin = pluginList[i]; + + if ( plugin.active ) { + QHBoxLayout* plugLayout = new QHBoxLayout( this ); + QPixmap plugPix; + plugPix.convertFromImage( Resource::loadImage( plugin.guiPart->pixmapNameWidget() ).smoothScale( 18, 18 ), 0 ); + OClickableLabel* plugIcon = new OClickableLabel( this ); + plugIcon->setPixmap( plugPix ); + QScrollView* sv = new QScrollView( this ); + QWidget* plugWidget = plugin.guiPart->widget( sv->viewport() ); + // plugWidget->reparent( sv->viewport(), QPoint( 0, 0 ) ); + sv->setMinimumHeight( plugin.guiPart->minHeight() ); + //sv->setMaximumHeight( plugin.guiPart->maxHeight() ); + + sv->setResizePolicy( QScrollView::AutoOneFit ); + sv->setHScrollBarMode( QScrollView::AlwaysOff ); + sv->setFrameShape( QFrame::NoFrame ); + sv->addChild( plugWidget ); + + plugLayout->addWidget( plugIcon, 0, AlignTop ); + plugLayout->addWidget( sv, 0, AlignTop ); + plugLayout->setStretchFactor( plugIcon, 1 ); + plugLayout->setStretchFactor( sv, 9 ); + pluginLayout->addLayout( plugLayout ); + count++; } - } } - if (ONLY_LATER && count==0) { - QLabel* noMoreEvents = new QLabel(AllDateBookEvents); - noMoreEvents->setText(tr("No more appointments today")); - layoutDates->addWidget(noMoreEvents); - } - } else { - QLabel* noEvents = new QLabel(AllDateBookEvents); - noEvents->setText(tr("No appointments today")); - layoutDates->addWidget(noEvents); - } - layoutDates->addItem(new QSpacerItem(1,1, QSizePolicy::Minimum, QSizePolicy::Expanding)); - sv1->addChild(AllDateBookEvents); - AllDateBookEvents->show(); -} + if ( count == 0 ) { + QLabel *noPluginsActive = new QLabel( this ); + noPluginsActive->setText( tr( "No plugins activated" ) ); + layout->addWidget( noPluginsActive ); + } + layout->addItem( new QSpacerItem( 1,1, QSizePolicy::Minimum, QSizePolicy::Expanding ) ); -void Today::getMail() { - Config cfg("opiemail"); - cfg.setGroup("today"); - // how many lines should be showed in the task section - int NEW_MAILS = cfg.readNumEntry("newmails",0); - int OUTGOING = cfg.readNumEntry("outgoing",0); + // how often refresh - later have qcop update calls in *db + // QTimer::singleShot( 20*1000, this, SLOT( draw() ) ); +} - QString output = tr("<b>%1</b> new mail(s), <b>%2</b> outgoing").arg(NEW_MAILS).arg(OUTGOING); - MailField->setText(output); +void Today::refresh() { + loadPlugins(); + draw(); + qDebug( "redraw" ); +// QTimer::singleShot( 30*1000, this, SLOT( refresh() ) ); } -/* - * Get the todos +/** + * The method for the configuration dialog. */ -void Today::getTodo() { - - QString output; - QString tmpout; - int count = 0; - int ammount = 0; - - // get overdue todos first - QValueList<ToDoEvent> overDueList = todo->overDue(); - qBubbleSort(overDueList); - for ( QValueList<ToDoEvent>::Iterator it=overDueList.begin(); - it!=overDueList.end(); ++it ) { - if (!(*it).isCompleted() && ( ammount < MAX_LINES_TASK) ) { - QString desc = (*it).summary(); - if( desc.isEmpty() ) { - desc = (*it).description(); - } - tmpout += "<font color=#e00000><b>-" + desc.mid(0, MAX_CHAR_CLIP) + "</b></font><br>"; - - ammount++; - } - } +void Today::startConfig() { + conf = new TodayConfig ( this, "", true ); + + uint count = 0; + TodayPlugin plugin; + + QList<ConfigWidget> configWidgetList; + for ( uint i = 0; i < pluginList.count(); i++ ) { + plugin = pluginList[i]; - // get total number of still open todos - QValueList<ToDoEvent> openTodo = todo->rawToDos(); - qBubbleSort(openTodo); - for ( QValueList<ToDoEvent>::Iterator it=openTodo.begin(); - it!=openTodo.end(); ++it ) { - if (!(*it).isCompleted()){ - count +=1; - // not the overdues, we allready got them, and not if we are - // over the maxlines - if (!(*it).isOverdue() && ( ammount < MAX_LINES_TASK) ) { - QString desc = (*it).summary(); - if( desc.isEmpty() ) { - desc = (*it).description(); - } - tmpout += "<b>-</b>" + desc.mid(0, MAX_CHAR_CLIP) + "<br>"; - ammount++; - } + // load the config widgets in the tabs + if ( plugin.guiPart->configWidget( this ) != 0l ) { + ConfigWidget* widget = plugin.guiPart->configWidget( this ); + widget->reparent( conf , QPoint( 0,0 ) ); + configWidgetList.append( widget ); + conf->TabWidget3->insertTab( widget, plugin.guiPart->appName() ); } + // set the order/activate tab + conf->pluginManagement( plugin.name, plugin.guiPart->pluginName(), + Resource::loadPixmap( plugin.guiPart->pixmapNameWidget() ) ); + count++; } + conf->showMaximized(); - if (count > 0) { - if( count == 1 ) { - output = tr("There is <b> 1</b> active task: <br>" ); - } else { - output = tr("There are <b> %1</b> active tasks: <br>").arg(count); - } - output += tmpout; - } else { - output = tr("No active tasks"); - } + if ( conf->exec() == QDialog::Accepted ) { + ConfigWidget *confWidget; + for ( confWidget=configWidgetList.first(); confWidget != 0; + confWidget = configWidgetList.next() ) { + confWidget->writeConfig(); + } + conf->writeConfig(); - TodoField->setText(tr(output)); + init(); + loadPlugins(); + draw(); + } + delete conf; } void Today::startAddressbook() { - QCopEnvelope e("QPE/System", "execute(QString)"); - e << QString("addressbook"); + QCopEnvelope e( "QPE/System", "execute(QString)" ); + e << QString( "addressbook" ); } -extern QPEApplication *todayApp; -/* +/** * launch addressbook (personal card) */ void Today::editCard() { - startAddressbook(); - - while( !QCopChannel::isRegistered("QPE/Addressbook")) todayApp->processEvents(); - QCopEnvelope v("QPE/Addressbook", "editPersonalAndClose()"); -} - -/* - * launches datebook - */ -void Today::startDatebook() { - QCopEnvelope e("QPE/System", "execute(QString)"); - e << QString("datebook"); -} - -/* - * starts the edit dialog as known from datebook - */ -void Today::editEvent(const Event &e) { - startDatebook(); - - while(!QCopChannel::isRegistered("QPE/Datebook")) todayApp->processEvents(); - QCopEnvelope env("QPE/Datebook", "editEvent(int)"); - env << e.uid(); -} - -/* - * launches todolist - */ -void Today::startTodo() { - QCopEnvelope e("QPE/System", "execute(QString)"); - e << QString("todolist"); + while( !QCopChannel::isRegistered( "QPE/Addressbook" ) ) { + qApp->processEvents(); + } + QCopEnvelope v( "QPE/Addressbook", "editPersonalAndClose()" ); } /* - * launch opiemail + * launches an App */ -void Today::startMail() { - QCopEnvelope e("QPE/System", "execute(QString)"); - e << QString("opiemail"); -//Right now start both, maybe decide which to rum via config file .. - QCopEnvelope f("QPE/System", "execute(QString)"); - f << QString("qtmail"); +void Today::launchApp( QString appName ) { + QCopEnvelope e( "QPE/System", "execute(QString)" ); + e << QString( appName ); } - Today::~Today() { } -/* - * Gets the events for the current day, if it should get all dates - */ -DateBookEvent::DateBookEvent(const EffectiveEvent &ev, - QWidget* parent, - int SHOW_LOCATION, - int SHOW_NOTES, - const char* name, - WFlags fl) : - OClickableLabel(parent,name,fl), event(ev) { - - QString msg; - //QTime time = QTime::currentTime(); - - Config config( "qpe" ); - config.setGroup( "Time" ); - // if 24 h format - ampm = config.readBoolEntry( "AMPM", TRUE ); - - - if (!ONLY_LATER) { - msg += "<B>" + (ev).description() + "</B>"; - if ( (ev).event().hasAlarm() ) { - msg += " <b>[with alarm]</b>"; - } - // include location or not - if (SHOW_LOCATION == 1) { - msg += "<BR><i>" + (ev).location() + "</i>"; - } - - if ( (TimeString::timeString(QTime((ev).event().start().time()) ) == "00:00") && (TimeString::timeString(QTime((ev).event().end().time()) ) == "23:59") ) { - msg += "<br>All day"; - } else { - // start time of event - msg += "<br>" + ampmTime(QTime((ev).event().start().time()) ) - // end time of event - + "<b> - </b>" + ampmTime(QTime((ev).event().end().time()) ); - } - - // include possible note or not - if (SHOW_NOTES == 1) { - msg += "<br> <i>note</i>:" +((ev).notes()).mid(0, MAX_CHAR_CLIP); - } - } - setText(msg); - connect(this, SIGNAL(clicked()), this, SLOT(editMe())); - setAlignment( int( QLabel::WordBreak | QLabel::AlignLeft ) ); -} - - -QString DateBookEvent::ampmTime(QTime tm) { - - QString s; - if( ampm ) { - int hour = tm.hour(); - if (hour == 0) - hour = 12; - if (hour > 12) - hour -= 12; - s.sprintf( "%2d:%02d %s", hour, tm.minute(), - (tm.hour() >= 12) ? "PM" : "AM" ); - return s; - } else { - s.sprintf( "%2d:%02d", tm.hour(), tm.minute() ); - return s; - } - -} - - -DateBookEventLater::DateBookEventLater(const EffectiveEvent &ev, - QWidget* parent, - int SHOW_LOCATION, - int SHOW_NOTES, - const char* name, - WFlags fl) : - OClickableLabel(parent,name,fl), event(ev) { - - QString msg; - QTime time = QTime::currentTime(); - - Config config( "qpe" ); - config.setGroup( "Time" ); - // if 24 h format - ampm = config.readBoolEntry( "AMPM", TRUE ); - - - if ((time.toString() <= TimeString::dateString((ev).event().end())) ) { - // show only later appointments - msg += "<B>" + (ev).description() + "</B>"; - if ( (ev).event().hasAlarm() ) { - msg += " <b>[with alarm]</b>"; - } - // include location or not - if (SHOW_LOCATION == 1) { - msg += "<BR><i>" + (ev).location() + "</i>"; - } - - if ( (TimeString::timeString(QTime((ev).event().start().time()) ) == "00:00") && (TimeString::timeString(QTime((ev).event().end().time()) ) == "23:59") ) { - msg += "<br>All day"; - } else { - // start time of event - msg += "<br>" + ampmTime(QTime((ev).event().start().time()) ) - // end time of event - + "<b> - </b>" + ampmTime(QTime((ev).event().end().time()) ); - } - // include possible note or not - if (SHOW_NOTES == 1) { - msg += "<br> <i>note</i>:" +((ev).notes()).mid(0, MAX_CHAR_CLIP); - } - } - - setText(msg); - connect(this, SIGNAL(clicked()), this, SLOT(editMe())); - setAlignment( int( QLabel::WordBreak | QLabel::AlignLeft ) ); -} - - -QString DateBookEventLater::ampmTime(QTime tm) { - - QString s; - if( ampm ) { - int hour = tm.hour(); - if (hour == 0) - hour = 12; - if (hour > 12) - hour -= 12; - s.sprintf( "%2d:%02d %s", hour, tm.minute(), - (tm.hour() >= 12) ? "PM" : "AM" ); - return s; - } else { - s.sprintf( "%2d:%02d", tm.hour(), tm.minute() ); - return s; - } - -} - - -void DateBookEvent::editMe() { - emit editEvent(event.event()); -} - -void DateBookEventLater::editMe() { - emit editEvent(event.event()); -} - - diff --git a/core/pim/today/today.h b/core/pim/today/today.h index f28c029..ca17020 100644 --- a/core/pim/today/today.h +++ b/core/pim/today/today.h @@ -1,118 +1,81 @@ /* * today.h * - * --------------------- - * - * begin : Sun 10 17:20:00 CEST 2002 * copyright : (c) 2002 by Maximilian Reiß - * email : max.reiss@gmx.de + * email : harlekin@handhelds.org * */ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef TODAY_H #define TODAY_H -#include <qpe/datebookdb.h> -#include <qpe/event.h> - #include <opie/tododb.h> -#include <opie/oclickablelabel.h> #include <qdatetime.h> #include <qlist.h> +#include <qpe/qlibrary.h> +#include <qpe/event.h> + #include "todayconfig.h" #include "todaybase.h" +#include "todayplugininterface.h" class QVBoxLayout; +struct TodayPlugin { + QLibrary *library; + TodayPluginInterface *iface; + TodayPluginObject *guiPart; + QString name; + bool active; + int pos; +}; + class Today : public TodayBase { + Q_OBJECT public: Today( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); ~Today(); private slots: void startConfig(); - void startTodo(); - void startDatebook(); void startAddressbook(); - void startMail(); + void launchApp( QString appName ); void editCard(); void draw(); - void editEvent(const Event &e); - private: + void refresh(); + +private: void init(); - void getDates(); - void getTodo(); - void getMail(); - void autoStart(); - bool checkIfModified(); void setOwnerField(); void setOwnerField(QString &string); - private slots: + void loadPlugins(); + +private slots: void channelReceived(const QCString &msg, const QByteArray & data); private: - DateBookDB *db; - ToDoDB *todo; - todayconfig *conf; - QWidget* AllDateBookEvents; - //Config cfg; - int MAX_LINES_TASK; - int MAX_CHAR_CLIP; - int MAX_LINES_MEET; - int SHOW_LOCATION; - int SHOW_NOTES; -}; + TodayConfig *conf; + QStringList m_excludeApplets; -class DateBookEvent: public OClickableLabel { - Q_OBJECT -public: - DateBookEvent(const EffectiveEvent &ev, - QWidget* parent = 0, - int SHOW_LOCATION = 0, - int SHOW_NOTES = 0, - const char* name = 0, - WFlags fl = 0); -signals: - void editEvent(const Event &e); -private slots: - void editMe(); -private: - QString ampmTime(QTime); - const EffectiveEvent event; - bool ampm; -}; + QVBoxLayout *pluginLayout; -class DateBookEventLater: public OClickableLabel { - Q_OBJECT -public: - DateBookEventLater(const EffectiveEvent &ev, - QWidget* parent = 0, - int SHOW_LOCATION = 0, - int SHOW_NOTES = 0, - const char* name = 0, - WFlags fl = 0); -signals: - void editEvent(const Event &e); -private slots: - void editMe(); -private: - QString ampmTime(QTime); - const EffectiveEvent event; - bool ampm; + // QString m_autoStartTimer; + int m_newStart; + // int m_autoStart; + int m_maxCharClip; }; -#endif // TODAY_H - +#endif diff --git a/core/pim/today/today.pro b/core/pim/today/today.pro index 46e5d2a..8596da3 100644 --- a/core/pim/today/today.pro +++ b/core/pim/today/today.pro @@ -1,27 +1,27 @@ TEMPLATE = app -#CONFIG = qt warn_on debug -CONFIG = qt warn_on release +CONFIG = qt warn_on debug +#CONFIG = qt warn_on release HEADERS = today.h todaybase.h todayconfig.h SOURCES = main.cpp today.cpp todaybase.cpp todayconfig.cpp INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe -lopie INTERFACES = TARGET = today DESTDIR = $(OPIEDIR)/bin TRANSLATIONS = ../../../i18n/de/today.ts \ ../../../i18n/en/today.ts \ ../../../i18n/es/today.ts \ ../../../i18n/fr/today.ts \ ../../../i18n/hu/today.ts \ ../../../i18n/ja/today.ts \ ../../../i18n/ko/today.ts \ ../../../i18n/no/today.ts \ ../../../i18n/pl/today.ts \ ../../../i18n/pt/today.ts \ ../../../i18n/pt_BR/today.ts \ ../../../i18n/sl/today.ts \ ../../../i18n/zh_CN/today.ts \ ../../../i18n/zh_TW/today.ts \ ../../../i18n/it/today.ts
\ No newline at end of file diff --git a/core/pim/today/todaybase.cpp b/core/pim/today/todaybase.cpp index bc1651d..74f4fa0 100644 --- a/core/pim/today/todaybase.cpp +++ b/core/pim/today/todaybase.cpp @@ -1,211 +1,107 @@ /* - * todaybase.cpp * - * --------------------- + * todaybase.cpp * - * begin : Sun 10 17:20:00 CEST 2002 * copyright : (c) 2002 by Maximilian Reiß - * email : max.reiss@gmx.de + * email : harlekin@handhelds.org * */ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "todaybase.h" #include <qframe.h> #include <qlabel.h> -#include <qpushbutton.h> -#include <qlayout.h> -#include <qvariant.h> -#include <qwhatsthis.h> #include <qimage.h> #include <qpixmap.h> -#include <qscrollview.h> -#include <qvbox.h> #include <qapplication.h> #include <qpe/resource.h> -/* - * Constructs a TodayBase which is a child of 'parent', with the - * name 'name' and widget flags set to 'f' - */ + TodayBase::TodayBase( QWidget* parent, const char* name, WFlags fl ) - : QWidget( parent, name, fl ) -{ + : QWidget( parent, name, fl ) { + QPixmap logo = Resource::loadPixmap( "today/today_logo"); // logo - QPixmap datebook = Resource::loadPixmap("DateBook"); // datebook - QPixmap todo = Resource::loadPixmap( "TodoList" ); // todo - QPixmap config = Resource::loadPixmap( "today/config" ); // config icon - QPixmap mail = Resource::loadPixmap( "today/mail" ); // mail icon QPixmap opiezilla = Resource::loadPixmap("today/opiezilla" ); //the opiezilla + QPixmap config = Resource::loadPixmap( "today/config" ); // config icon - QWidget *d = QApplication::desktop(); - int w=d->width(); - int h=d->height(); - resize( w , h ); - - // hehe, qt is ... - getridoffuckingstrippeldlinesbutton = new QPushButton (this, "asdfsad" ); - getridoffuckingstrippeldlinesbutton->setGeometry( QRect( -5, 10, 0, 0 ) ); - - QVBoxLayout * layout = new QVBoxLayout(this); + layout = new QVBoxLayout( this ); QPalette pal = this->palette(); - QColor col = pal.color(QPalette::Active, QColorGroup::Background); - pal.setColor(QPalette::Active, QColorGroup::Button, col); - pal.setColor(QPalette::Inactive, QColorGroup::Button, col); - pal.setColor(QPalette::Normal, QColorGroup::Button, col); - pal.setColor(QPalette::Disabled, QColorGroup::Button, col); - this->setPalette(pal); + QColor col = pal.color( QPalette::Active, QColorGroup::Background ); + pal.setColor( QPalette::Active, QColorGroup::Button, col ); + pal.setColor( QPalette::Inactive, QColorGroup::Button, col ); + pal.setColor( QPalette::Normal, QColorGroup::Button, col ); + pal.setColor( QPalette::Disabled, QColorGroup::Button, col ); + this->setPalette( pal ); // --- logo Section --- QPalette pal2; QColorGroup cg; cg.setColor( QColorGroup::Text, white ); - cg.setBrush( QColorGroup::Background, QBrush( QColor( 238, 238, 230), logo ) ); + cg.setBrush( QColorGroup::Background, QBrush( QColor( 238, 238, 230 ), logo ) ); pal2.setActive( cg ); // today logo Frame = new QLabel( this, "Frame" ); Frame->setPalette( pal2 ); Frame->setFrameShape( QFrame::StyledPanel ); Frame->setFrameShadow( QFrame::Raised ); Frame->setLineWidth( 0 ); - Frame->setMaximumHeight(50); - Frame->setMinimumHeight(50); + Frame->setMaximumHeight( 50 ); + Frame->setMinimumHeight( 50 ); - // Today text + // Today text QLabel* TodayLabel = new QLabel( Frame, "TodayText" ); TodayLabel->setGeometry( QRect( 10, 0, 168, 40 ) ); QFont TodayLabel_font( TodayLabel->font() ); TodayLabel_font.setBold( TRUE ); - TodayLabel_font.setPointSize(40); + TodayLabel_font.setPointSize( 40 ); TodayLabel->setFont( TodayLabel_font ); TodayLabel->setBackgroundOrigin( QLabel::ParentOrigin ); - TodayLabel->setText("<font color=#FFFFFF>" + tr("Today") +"</font>"); + TodayLabel->setText( "<font color=#FFFFFF>" + tr("Today²") +"</font>" ); + + // date + DateLabel = new QLabel( Frame, "TextLabel1" ); + DateLabel->setGeometry( QRect( 10, 35, 168, 12 ) ); + QFont DateLabel_font( DateLabel->font() ); + DateLabel_font.setBold( TRUE ); + DateLabel->setFont( DateLabel_font ); + DateLabel->setBackgroundOrigin( QLabel::ParentOrigin ); + DateLabel->setTextFormat( RichText ); // Opiezilla QLabel* Opiezilla = new QLabel( Frame, "OpieZilla"); Opiezilla->setPixmap( opiezilla ); - Opiezilla->setGeometry( this->width()-50 ,1, 45, 47); + Opiezilla->setGeometry( QApplication::desktop()->width()-50 ,1, 45, 47); Opiezilla->setBackgroundOrigin( QLabel::ParentOrigin ); - // date - TextLabel1 = new QLabel( Frame, "TextLabel1" ); - TextLabel1->setGeometry( QRect( 10, 35, 168, 12 ) ); - QFont TextLabel1_font( TextLabel1->font() ); - TextLabel1_font.setBold( TRUE ); - TextLabel1->setFont( TextLabel1_font ); - TextLabel1->setBackgroundOrigin( QLabel::ParentOrigin ); - TextLabel1->setTextFormat( RichText ); - - OwnerField = new OClickableLabel(this , "Owner" ); - OwnerField->setGeometry(QRect(0,0, this->width(), 12 )); - OwnerField->setAlignment(int (QLabel::AlignTop | QLabel::AlignLeft ) ); + // Ownerfield + OwnerField = new OClickableLabel( this , "Owner" ); + OwnerField->setGeometry( QRect( 0,0, this->width(), 12 )); + OwnerField->setAlignment( int (QLabel::AlignTop | QLabel::AlignLeft ) ); OwnerField->setMaximumHeight(12); - // --- dates section --- - Frame4 = new QFrame( this, "Frame4" ); -// Frame4->setPalette( pal ); - Frame4->setFrameShape( QScrollView::StyledPanel ); - Frame4->setFrameShadow( QScrollView::Sunken ); - Frame4->setBackgroundOrigin( QScrollView::ParentOrigin ); - Frame4->setFrameStyle( QFrame::NoFrame ); - Frame4->setGeometry (QRect( 0, 8, this->width() , this->height()) ); - - sv1 = new QScrollView( Frame4 ); - sv1->setResizePolicy(QScrollView::AutoOneFit); - sv1->setHScrollBarMode( QScrollView::AlwaysOff ); - // need to find a better way!!! - sv1->setGeometry (QRect( 40, 2, Frame4->width()-40 , (Frame4->height()/3)+20 ) ); - sv1->setFrameShape(QFrame::NoFrame); - - DatesButton = new QPushButton (Frame4, "DatesButton" ); - DatesButton->setGeometry( QRect( 2, 4, 36, 32 ) ); - DatesButton->setBackgroundOrigin( QPushButton::WidgetOrigin ); - DatesButton->setPalette( pal ); - DatesButton->setPixmap( datebook ); - DatesButton->setFlat( TRUE ); - - // --- mail section ---) - MailFrame = new QFrame( this ,"MailFrame" ); - MailFrame->setBackgroundOrigin( QScrollView::ParentOrigin ); - MailFrame->setGeometry (QRect( 0, 0, this->width() , 15) ); - MailFrame->setFrameStyle( QFrame::NoFrame ); - - QFrame* Line1 = new QFrame( MailFrame); - Line1->setGeometry( QRect( -5, 0, MailFrame->width()+5, 5 ) ); - Line1->setFrameStyle( QFrame::HLine | QFrame::Sunken ); - - MailButton = new QPushButton (MailFrame, "MailButton" ); - MailButton->setGeometry( QRect( 2, 3, 36, 19 ) ); - MailButton->setPalette( pal ); - MailButton->setPixmap( mail ); - MailButton->setFlat( TRUE ); - - MailField = new QLabel( MailFrame, "MailField" ); - MailField->setGeometry( QRect( 40, 4, MailFrame->width(), 12) ); - MailField->setText( tr( "Opiemail not installed" ) ); - MailField->setAlignment( int( QLabel::AlignTop | QLabel::AlignLeft ) ); - MailField->setMaximumHeight(40); - MailField->setMinimumHeight(15); - - // --- todo section -- - Frame15 = new QFrame( this, "Frame15" ); - Frame15->setFrameStyle( QFrame::NoFrame ); - Frame15->setGeometry (QRect( 40, 3, this->width() , this->height()) ); - - QFrame* Line2 = new QFrame( Frame15); - Line2->setGeometry( QRect( -5, 0, MailFrame->width()+5, 5 ) ); - Line2->setFrameStyle( QFrame::HLine | QFrame::Sunken ); - - TodoButton = new QPushButton (Frame15, "TodoButton" ); - TodoButton->setGeometry( QRect( 2, 4, 36, 32 ) ); - TodoButton->setPalette( pal ); - TodoButton->setPixmap( todo ); - TodoButton->setFlat( TRUE ); - - QScrollView* sv2 = new QScrollView( Frame15 ); - sv2->setResizePolicy(QScrollView::AutoOneFit); - sv2->setHScrollBarMode( QScrollView::AlwaysOff ); - sv2->setGeometry (QRect( 40, 3, Frame15->width()-40 , (Frame15->height()/3) ) ); - sv2->setFrameShape(QFrame::NoFrame); - - TodoField = new QLabel( sv2->viewport(), "TodoField" ); - sv2->addChild(TodoField); - TodoField->setFrameShadow( QLabel::Plain ); - //TodoField->setText( tr( "No current todos" ) ); - TodoField->setAlignment( int( QLabel::AlignTop | QLabel::AlignLeft ) ); - - PushButton1 = new QPushButton (Frame15, "PushButton1" ); - PushButton1->setGeometry( QRect( 2, 68, 25, 21 ) ); - PushButton1->setPixmap( config ); - PushButton1->setPalette( pal ); - PushButton1->setAutoDefault( TRUE ); - PushButton1->setFlat( TRUE ); + // config + ConfigButton = new OClickableLabel ( Frame, "PushButton1" ); + ConfigButton->setGeometry( QRect( QApplication::desktop()->width()-80, 30, 25, 21 ) ); + ConfigButton->setPixmap( config ); + ConfigButton->setBackgroundOrigin( QLabel::ParentOrigin ); // -- layout -- - layout->addWidget(Frame); - layout->addWidget(OwnerField); - layout->addWidget(Frame4); - layout->addWidget(MailFrame); - layout->addWidget(Frame15); - - layout->setStretchFactor(Frame4,5); - layout->setStretchFactor(MailFrame,1); - layout->setStretchFactor(Frame15,4); + layout->addWidget( Frame ); + layout->addWidget( OwnerField ); } -/* - * Destroys the object and frees any allocated resources +/** + * D' tor */ -TodayBase::~TodayBase() -{ +TodayBase::~TodayBase() { } diff --git a/core/pim/today/todaybase.h b/core/pim/today/todaybase.h index ec06281..7c50f32 100644 --- a/core/pim/today/todaybase.h +++ b/core/pim/today/todaybase.h @@ -1,55 +1,53 @@ -/**************************************************************************** -** Form interface generated from reading ui file 'todaybase.ui' -** -** Created: Wed Feb 13 19:36:45 2002 -** by: The User Interface Compiler (uic) -** -** WARNING! All changes made in this file will be lost! -****************************************************************************/ +/* + * todaybase.h + * + * copyright : (c) 2002 by Maximilian Reiß + * email : harlekin@handhelds.org + * + */ +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + #ifndef TODAYBASE_H #define TODAYBASE_H -#include <qvariant.h> -#include <qwidget.h> -#include <qscrollview.h> -#include <qsplitter.h> +#include <qlayout.h> #include <opie/oclickablelabel.h> class QVBox; -class QHBoxLayout; class QGridLayout; class QFrame; class QLabel; class QPushButton; +class QBoxLayout; + class TodayBase : public QWidget { Q_OBJECT public: TodayBase( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); ~TodayBase(); - //QScrollView* Frame4; QFrame* Frame4; QPushButton* DatesButton; + QVBoxLayout* layout; OClickableLabel* OwnerField; QLabel* Frame; - QFrame* MailFrame; - QLabel* TextLabel1; - QScrollView* sv1; - QVBox* DatesField; + QLabel* DateLabel; QFrame* Frame15; - QLabel* TodoField; - QLabel* MailField; - QPushButton* PushButton1; - QPushButton* TodoButton; - QPushButton* MailButton; - QPushButton* getridoffuckingstrippeldlinesbutton; + OClickableLabel* ConfigButton; protected: }; -#endif // TODAYBASE_H +#endif diff --git a/core/pim/today/todayconfig.cpp b/core/pim/today/todayconfig.cpp index 905ec4b..08e59c0 100644 --- a/core/pim/today/todayconfig.cpp +++ b/core/pim/today/todayconfig.cpp @@ -1,151 +1,220 @@ /* * todayconfig.cpp * - * --------------------- - * - * begin : Sun 10 17:20:00 CEST 2002 * copyright : (c) 2002 by Maximilian Reiß - * email : max.reiss@gmx.de + * email : harlekin@handhelds.org * */ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "todayconfig.h" +#include <qpe/config.h> +#include <qpe/resource.h> +#include <qpe/qcopenvelope_qws.h> + #include <qcheckbox.h> -#include <qframe.h> #include <qlabel.h> #include <qspinbox.h> #include <qtabwidget.h> -#include <qwidget.h> #include <qlayout.h> -#include <qvariant.h> -//#include <qwhatsthis.h> - -todayconfig::todayconfig( QWidget* parent, const char* name, bool modal, WFlags fl ) +#include <qheader.h> +#include <qhbox.h> +#include <qvbox.h> +#include <qtoolbutton.h> + +// for getenv +#include <stdlib.h> + +class ToolButton : public QToolButton { +public: + ToolButton( QWidget *parent, const char *name, const QString& icon, QObject *handler, const QString& slot, bool t = FALSE ) + : QToolButton( parent, name ) { + setTextLabel( name ); + setPixmap( Resource::loadPixmap( icon ) ); + setAutoRaise( TRUE ); + setFocusPolicy( QWidget::NoFocus ); + setToggleButton( t ); + connect( this, t ? SIGNAL( toggled(bool) ) : SIGNAL( clicked() ), handler, slot ); + } +}; + + +/** + * The class has currently quite some duplicate code. + * By that way it would be real easy to have it as seperate app in settings tab + * + */ +TodayConfig::TodayConfig( QWidget* parent, const char* name, bool modal, WFlags fl ) : QDialog( parent, name, modal, fl ) { - if ( !name ) - setName( "todayconfig" ); - resize( 175, 232 ); - setCaption( tr( "Today config" ) ); - - TabWidget3 = new QTabWidget( this, "TabWidget3" ); - TabWidget3->setGeometry( QRect( 0, 0, 220, 320 ) ); - TabWidget3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, TabWidget3->sizePolicy().hasHeightForWidth() ) ); - TabWidget3->setAutoMask( FALSE ); - TabWidget3->setTabShape( QTabWidget::Rounded ); - - tab = new QWidget( TabWidget3, "tab" ); - - Frame8 = new QFrame( tab, "Frame8" ); - Frame8->setGeometry( QRect( -5, 0, 200, 300 ) ); - Frame8->setFrameShape( QFrame::StyledPanel ); - Frame8->setFrameShadow( QFrame::Raised ); - - TextLabel4 = new QLabel( Frame8, "TextLabel4" ); - TextLabel4->setGeometry( QRect( 20, 65, 100, 60 ) ); - TextLabel4->setText( tr( "Should the \n" - "location \n" - "be shown?" ) ); - - TextLabel5 = new QLabel( Frame8, "TextLabel5" ); - TextLabel5->setGeometry( QRect( 20, 160, 120, 40 ) ); - TextLabel5->setText( tr( "Should the notes \n" - "be shown?" ) ); - - CheckBox2 = new QCheckBox( Frame8, "CheckBox2" ); - CheckBox2->setGeometry( QRect( 158, 170, 27, 21 ) ); - //CheckBox2->setText( tr( "" ) ); - - CheckBox1 = new QCheckBox( Frame8, "CheckBox1" ); - CheckBox1->setGeometry( QRect( 158, 65, 27, 50 ) ); - //CheckBox1->setText( tr( "" ) ); - - CheckBox3 = new QCheckBox (Frame8, "CheckBox3" ); - CheckBox3->setGeometry( QRect( 158, 125, 27, 21 ) ); - - TextLabel6 = new QLabel( Frame8, "All Day"); - TextLabel6->setGeometry( QRect( 20, 120, 100, 30 ) ); - TextLabel6->setText( tr( "Show only later\n" - "appointments") ); - - SpinBox1 = new QSpinBox( Frame8, "SpinBox1" ); - SpinBox1->setGeometry( QRect( 115, 20, 58, 25 ) ); - SpinBox1->setMaxValue( 10 ); - SpinBox1->setValue( 5 ); - - TextLabel3 = new QLabel( Frame8, "TextLabel3" ); - TextLabel3->setGeometry( QRect( 20, 10, 90, 60 ) ); - TextLabel3->setText( tr( "How many \n" - "appointment\n" - "should\n" - "be shown?" ) ); - TabWidget3->insertTab( tab, tr( "Calendar" ) ); - - tab_2 = new QWidget( TabWidget3, "tab_2" ); - - Frame9 = new QFrame( tab_2, "Frame9" ); - Frame9->setGeometry( QRect( -5, 0, 230, 310 ) ); - Frame9->setFrameShape( QFrame::StyledPanel ); - Frame9->setFrameShadow( QFrame::Raised ); - - TextLabel6 = new QLabel( Frame9, "TextLabel6" ); - TextLabel6->setGeometry( QRect( 20, 10, 100, 60 ) ); - TextLabel6->setText( tr( "How many\n" - "tasks should \n" - "be shown?" ) ); - - SpinBox2 = new QSpinBox( Frame9, "SpinBox2" ); - SpinBox2->setGeometry( QRect( 115, 20, 58, 25 ) ); - SpinBox2->setMaxValue( 20 ); - SpinBox2->setValue( 5 ); - TabWidget3->insertTab( tab_2, tr( "Tasks" ) ); - - tab_3 = new QWidget( TabWidget3, "tab_3" ); - - Frame14 = new QFrame( tab_3, "Frame14" ); - Frame14->setGeometry( QRect( -5, 0, 200, 220 ) ); - Frame14->setFrameShape( QFrame::StyledPanel ); - Frame14->setFrameShadow( QFrame::Raised ); - - TextLabel1 = new QLabel( Frame14, "TextLabel1" ); - TextLabel1->setGeometry( QRect( 20, 20, 100, 30 ) ); - TextLabel1->setText( tr( "Clip after how\n" - "many letters" ) ); - - SpinBox7 = new QSpinBox( Frame14, "SpinBox7" ); - SpinBox7->setGeometry( QRect( 115, 20, 58, 25 ) ); - SpinBox7->setMaxValue( 80 ); - - TextLabel2 = new QLabel( Frame14, "AutoStart" ); - TextLabel2->setGeometry( QRect( 20, 60, 100, 45 ) ); - TextLabel2->setText( tr( "Should today be\n" - "autostarted on\n" - "resume?" - " (Opie only)" ) ); - - CheckBoxAuto = new QCheckBox (Frame14, "CheckBoxAuto" ); - CheckBoxAuto->setGeometry( QRect( 158, 60, 27, 21 ) ); - - TimeLabel = new QLabel( Frame14, "TimeLabel" ); - TimeLabel->setGeometry( QRect ( 20, 120, 120, 45 ) ); - TimeLabel->setText( tr( "Activate the \n" - "autostart after how\n" - "many minutes?" ) ); - SpinBoxTime = new QSpinBox( Frame14, "TimeSpinner"); - SpinBoxTime->setGeometry( QRect( 115, 120, 58, 25 ) ); - - TabWidget3->insertTab( tab_3, tr( "Misc" ) ); + if ( !name ) { + setName( "todayconfig" ); + } + setCaption( tr( "Today config" ) ); + + QVBoxLayout *layout = new QVBoxLayout( this ); + TabWidget3 = new QTabWidget( this, "TabWidget3" ); + TabWidget3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, TabWidget3->sizePolicy().hasHeightForWidth() ) ); + TabWidget3->setAutoMask( FALSE ); + TabWidget3->setTabShape( QTabWidget::Rounded ); + layout->addWidget( TabWidget3 ); + + tab_2 = new QWidget( TabWidget3, "tab_2" ); + QVBoxLayout *tab2Layout = new QVBoxLayout( tab_2, 4 ,4 ); + QLabel *l = new QLabel( tr( "Load which plugins in what order:" ), tab_2 ); + tab2Layout->addWidget( l ); + QHBox *hbox1 = new QHBox( tab_2 ); + m_appletListView = new QListView( hbox1 ); + m_appletListView->addColumn( "PluginList" ); + m_appletListView->header()->hide(); + QVBox *vbox1 = new QVBox( hbox1 ); + new ToolButton( vbox1, tr( "Move Up" ), "opieplayer/up", this , SLOT( moveSelectedUp() ) ); + new ToolButton( vbox1, tr( "Move Down" ),"opieplayer/down", this , SLOT( moveSelectedDown() ) ); + tab2Layout->addWidget( hbox1 ); + + TabWidget3->insertTab( tab_2, tr( "active/order" ) ); + tab_3 = new QWidget( TabWidget3, "tab_3" ); + QVBoxLayout *tab3Layout = new QVBoxLayout( tab_3 ); + QHBox *hbox_clip = new QHBox( tab_3 ); + TextLabel1 = new QLabel( hbox_clip, "TextLabel1" ); + TextLabel1->setText( tr( "Clip after how\n" + "many letters" ) ); + SpinBox7 = new QSpinBox( hbox_clip, "SpinBox7" ); + SpinBox7->setMaxValue( 80 ); + QHBox *hbox_auto = new QHBox( tab_3 ); + TextLabel2 = new QLabel( hbox_auto, "AutoStart" ); + TextLabel2->setText( tr( "autostart on \nresume? (Opie only)" ) ); + CheckBoxAuto = new QCheckBox( hbox_auto, "CheckBoxAuto" ); + QHBox *hbox_inactive = new QHBox( tab_3 ); + TimeLabel = new QLabel( hbox_inactive , "TimeLabel" ); + TimeLabel->setText( tr( "minutes inactive" ) ); + SpinBoxTime = new QSpinBox( hbox_inactive, "TimeSpinner"); + tab3Layout->addWidget( hbox_clip ); + tab3Layout->addWidget( hbox_auto ); + tab3Layout->addWidget( hbox_inactive ); + TabWidget3->insertTab( tab_3, tr( "Misc" ) ); + + m_applets_changed = false; + + connect ( m_appletListView , SIGNAL( clicked ( QListViewItem * ) ), this, SLOT( appletChanged ( ) ) ); + + readConfig(); +} + + +/** + * Autostart, uses the new (opie only) autostart method in the launcher code. + * If registered against that today ist started on each resume. + */ +void TodayConfig::setAutoStart() { + Config cfg( "today" ); + cfg.setGroup( "Autostart" ); + int autostart = cfg.readNumEntry( "autostart", 1); + if ( autostart ) { + QCopEnvelope e( "QPE/System", "autoStart(QString,QString,QString)" ); + e << QString( "add" ); + e << QString( "today" ); + e << m_autoStartTimer; + } else { + QCopEnvelope e( "QPE/System", "autoStart(QString,QString)" ); + e << QString( "remove"); + e << QString( "today" ); + } +} + +/** + * Read the config part + */ +void TodayConfig::readConfig() { + Config cfg( "today" ); + cfg.setGroup( "Autostart" ); + m_autoStart = cfg.readNumEntry( "autostart", 1 ); + CheckBoxAuto->setChecked( m_autoStart ); + m_autoStartTimer = cfg.readEntry( "autostartdelay", "0" ); + SpinBoxTime->setValue( m_autoStartTimer.toInt() ); + + cfg.setGroup( "Applets" ); + m_excludeApplets = cfg.readListEntry( "ExcludeApplets", ',' ); +} + +/** + * Write the config part + */ +void TodayConfig::writeConfig() { + Config cfg( "today" ); + cfg. setGroup ( "Applets" ); + if ( m_applets_changed ) { + QStringList exclude; + QStringList include; + QMap <QString, QCheckListItem *>::Iterator it; + for ( it = m_applets.begin(); it != m_applets. end (); ++it ) { + if ( !(*it)-> isOn () ) { + exclude << it.key(); + } else { + include << it.key(); + } + } + cfg.writeEntry( "ExcludeApplets", exclude, ',' ); + cfg.writeEntry( "IncludeApplets", include, ',' ); + } + + cfg.setGroup( "Autostart" ); + m_autoStart = CheckBoxAuto->isChecked(); + cfg.writeEntry( "autostart", m_autoStart ); + m_autoStartTimer = SpinBoxTime->value(); + cfg.readEntry( "autostartdelay", m_autoStartTimer ); +} + + +void TodayConfig::moveSelectedUp() { + QListViewItem *item = m_appletListView->selectedItem(); + if ( item && item->itemAbove() ) { + item->itemAbove()->moveItem( item ); + } +} + + +void TodayConfig::moveSelectedDown() { + QListViewItem *item = m_appletListView->selectedItem(); + if ( item && item->itemBelow() ) { + item->moveItem( item->itemBelow() ); + } +} + + +/** + * Set up the + */ +void TodayConfig::pluginManagement( QString libName, QString name, QPixmap icon ) { + + QCheckListItem *item; + item = new QCheckListItem( m_appletListView, name, QCheckListItem::CheckBox ); + + if ( !icon.isNull() ) { + item->setPixmap( 0, icon ); + } + + qDebug (" SUCHNAME: " + name ); + if ( m_excludeApplets.find( libName ) == m_excludeApplets.end() ) { + item->setOn( TRUE ); + } + m_applets[libName] = item; } -todayconfig::~todayconfig() { + +void TodayConfig::appletChanged() { + m_applets_changed = true; +} + + +TodayConfig::~TodayConfig() { } diff --git a/core/pim/today/todayconfig.h b/core/pim/today/todayconfig.h index 2986c4c..d5bdb4b 100644 --- a/core/pim/today/todayconfig.h +++ b/core/pim/today/todayconfig.h @@ -1,66 +1,69 @@ /* * todayconfig.h * - * --------------------- - * - * begin : Sun 10 17:20:00 CEST 2002 * copyright : (c) 2002 by Maximilian Reiß - * email : max.reiss@gmx.de + * email : harlekin@handhelds.org * */ /*************************************************************************** * * * 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. * * * ***************************************************************************/ + #ifndef TODAYCONFIG_H #define TODAYCONFIG_H #include <qvariant.h> #include <qdialog.h> -//class QVBoxLayout; -class QHBoxLayout; -class QGridLayout; +#include <qlistview.h> + class QCheckBox; -class QFrame; class QLabel; class QSpinBox; class QTabWidget; -class QWidget; -class todayconfig : public QDialog { +class TodayConfig : public QDialog { + Q_OBJECT public: - todayconfig( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); - ~todayconfig(); + TodayConfig( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~TodayConfig(); QTabWidget* TabWidget3; - QWidget* tab; - QFrame* Frame8; - QLabel* TextLabel4; - QLabel* TextLabel5; + + void writeConfig(); + void pluginManagement( QString libName, QString name, QPixmap icon ); + +protected slots: + void appletChanged(); + void moveSelectedUp(); + void moveSelectedDown(); + +private: + void setAutoStart(); + void readConfig(); + + QListView* m_appletListView; + QMap<QString,QCheckListItem*> m_applets; + + int m_autoStart; + QString m_autoStartTimer; + QStringList m_excludeApplets; + bool m_applets_changed; + QLabel* TextLabel2; - QCheckBox* CheckBox3; - QCheckBox* CheckBox2; - QCheckBox* CheckBox1; QCheckBox* CheckBoxAuto; - QSpinBox* SpinBox1; - QLabel* TextLabel3; QWidget* tab_2; - QFrame* Frame9; - QLabel* TextLabel6; - QSpinBox* SpinBox2; QWidget* tab_3; - QFrame* Frame14; QLabel* TextLabel1; QSpinBox* SpinBox7; QLabel* TimeLabel; QSpinBox* SpinBoxTime; - }; #endif diff --git a/core/pim/today/todayplugininterface.h b/core/pim/today/todayplugininterface.h new file mode 100644 index 0000000..01e7d58 --- a/dev/null +++ b/core/pim/today/todayplugininterface.h @@ -0,0 +1,82 @@ + +#ifndef TODAY_PLUGIN_INTERFACE +#define TODAY_PLUGIN_INTERFACE + +#include <qpe/qcom.h> +#include "configwidget.h" + +class QString; +class QWidget; + +#ifndef IID_TodayPluginInterface +#define IID_TodayPluginInterface QUuid( 0x70481804, 0x2b50, 0x4fba, 0x80, 0xbb, 0x0b, 0xf8, 0xdc, 0x72, 0x04, 0x14) +#endif + +/** + * + * + * + */ +class TodayPluginObject { + + Q_OBJECT + +public: + + virtual ~TodayPluginObject() {}; + + /** + * The name if the plugin + */ + virtual QString pluginName() const = 0; + + /** + * Version numbering + */ + virtual double versionNumber() const = 0; + + /** + * the path and name of the identifer icon that should be shown + * in "Resource" notation, that means only subdir/picname form $QPEDIR/pics + */ + virtual QString pixmapNameWidget() const = 0; + + /** widget for the today view + * It _needs_ a parent here. + */ + virtual QWidget* widget( QWidget * ) = 0; + + /** + * Pixmap used in the config widget + */ + virtual QString pixmapNameConfig() const = 0; + + /** + * Config plugin widget - optional + * If the plugin has a config widget, it _needs_ a parent here. + */ + virtual ConfigWidget* configWidget( QWidget * ) = 0; + + /** + * The application that should be assigned to the button (pixmap) + */ + virtual QString appName() const = 0; + + /** + * minimum height the plugin at least should have + */ + virtual int minHeight() const = 0; + + /** + * maximum height that should be used before starting scrolling + */ + virtual int maxHeight() const = 0; + +}; + + +struct TodayPluginInterface : public QUnknownInterface { + virtual TodayPluginObject *guiPart() = 0; +}; + +#endif |