-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 @@ -5,7 +5,5 @@ TODO for today: * 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,4 +1,8 @@ +0.5 + +* now fully plugin based + 0.3.4 * "fill our business card now a clickable label" * Several bugfixes regarding todo section. 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,11 +1,12 @@ 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. 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,12 +1,9 @@ /* - * 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 * */ /*************************************************************************** * * @@ -16,622 +13,293 @@ * (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,12 +1,9 @@ /* * 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 * */ /*************************************************************************** * * @@ -20,99 +17,65 @@ #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,7 +1,7 @@ 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 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,11 +1,9 @@ /* - * 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 * */ /*************************************************************************** * * @@ -19,193 +17,91 @@ #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,27 +1,33 @@ -/**************************************************************************** -** 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 @@ -29,27 +35,19 @@ class TodayBase : public QWidget 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,12 +1,9 @@ /* * 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 * */ /*************************************************************************** * * @@ -18,134 +15,206 @@ ***************************************************************************/ #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,12 +1,9 @@ /* * 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 * */ /*************************************************************************** * * @@ -15,52 +12,58 @@ * 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 |