author | alwin <alwin> | 2005-03-16 13:14:26 (UTC) |
---|---|---|
committer | alwin <alwin> | 2005-03-16 13:14:26 (UTC) |
commit | 3d43b9e40e562957e1a3fcbe9268634db45951ce (patch) (side-by-side diff) | |
tree | 637f67a6768f6a90e7834b96100f6c70bb66950b | |
parent | 4fef85eb55dbef5f8546caee084e4f0ce51081d3 (diff) | |
download | opie-3d43b9e40e562957e1a3fcbe9268634db45951ce.zip opie-3d43b9e40e562957e1a3fcbe9268634db45951ce.tar.gz opie-3d43b9e40e562957e1a3fcbe9268634db45951ce.tar.bz2 |
ho.
in dayview a holiday will displayed (if plugin found)
generated a straight forward dummy-holiday-plugin for testing the
stuff.
-rw-r--r-- | core/pim/datebook/datebook.cpp | 1258 | ||||
-rw-r--r-- | core/pim/datebook/datebook.h | 87 | ||||
-rw-r--r-- | core/pim/datebook/datebookday.cpp | 1084 | ||||
-rw-r--r-- | core/pim/datebook/datebookday.h | 60 | ||||
-rw-r--r-- | core/pim/datebook/datebookdayallday.cpp | 47 | ||||
-rw-r--r-- | core/pim/datebook/datebookdayallday.h | 4 | ||||
-rw-r--r-- | core/pim/datebook/holiday/dummy/config.in | 8 | ||||
-rw-r--r-- | core/pim/datebook/holiday/dummy/dummy.pro | 20 | ||||
-rw-r--r-- | core/pim/datebook/holiday/dummy/dummyholiday.cpp | 20 | ||||
-rw-r--r-- | core/pim/datebook/holiday/dummy/dummyholiday.h | 19 |
10 files changed, 1416 insertions, 1191 deletions
diff --git a/core/pim/datebook/datebook.cpp b/core/pim/datebook/datebook.cpp index a18a5b4..f6aab0c 100644 --- a/core/pim/datebook/datebook.cpp +++ b/core/pim/datebook/datebook.cpp @@ -1,1075 +1,1151 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** ** $Id$ ** **********************************************************************/ #define QTOPIA_INTERNAL_FD #include "datebook.h" #include "datebookday.h" #include "datebooksettings.h" #include "datebookweek.h" #include "datebookweeklst.h" #include "dateentryimpl.h" #include <opie2/odebug.h> +#include <opie2/oholidaypluginif.h> +#include <opie2/oholidayplugin.h> #include <qpe/datebookmonth.h> #include <qpe/qpeapplication.h> #include <qpe/config.h> #include <qpe/finddialog.h> #include <qpe/ir.h> #include <qpe/qpemessagebox.h> #include <qpe/resource.h> #include <qpe/sound.h> #include <qpe/tzselect.h> #include <qaction.h> #include <qcopchannel_qws.h> #include <qlayout.h> #include <qmessagebox.h> #include <qtimer.h> #include <qtl.h> #include <qtoolbar.h> #include <qwidgetstack.h> +#include <qdir.h> +#include <qtopia/qlibrary.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> DateBook::DateBook( QWidget *parent, const char *, WFlags f ) : QMainWindow( parent, "datebook", f ), aPreset( FALSE ), presetTime( -1 ), startTime( 8 ), // an acceptable default rowStyle( 0 ), bJumpToCurTime(FALSE), syncing(FALSE), inSearch(FALSE), alarmCounter(0) { - bool needEvilHack= false; // if we need an Evil Hack - QTime t; - t.start(); - db = new DateBookDBHack; - odebug << "loading db t=" << t.elapsed() << oendl; - loadSettings(); - setCaption( tr("Calendar") ); - setIcon( Resource::loadPixmap( "datebook_icon" ) ); + bool needEvilHack= false; // if we need an Evil Hack + QTime t; + t.start(); + db = new DateBookDBHack; + odebug << "loading db t=" << t.elapsed() << oendl; + db_holiday = new DateBookHoliday(); - setToolBarsMovable( FALSE ); + loadSettings(); + setCaption( tr("Calendar") ); + setIcon( Resource::loadPixmap( "datebook_icon" ) ); - views = new QWidgetStack( this ); - setCentralWidget( views ); + setToolBarsMovable( FALSE ); - dayView = 0; - weekView = 0; - weekLstView = 0; - monthView = 0; + views = new QWidgetStack( this ); + setCentralWidget( views ); + + dayView = 0; + weekView = 0; + weekLstView = 0; + monthView = 0; // QToolBar *bar = new QToolBar( this ); // bar->setHorizontalStretchable( TRUE ); // QMenuBar *mb = new QMenuBar( bar ); // mb->setMargin( 0 ); // QPopupMenu *view = new QPopupMenu( this ); // mb->insertItem( tr( "View" ), view ); - QToolBar *sub_bar = new QToolBar(this); - sub_bar->setHorizontalStretchable(TRUE); + QToolBar *sub_bar = new QToolBar(this); + sub_bar->setHorizontalStretchable(TRUE); - QActionGroup *g = new QActionGroup( this ); - g->setExclusive( TRUE ); + QActionGroup *g = new QActionGroup( this ); + g->setExclusive( TRUE ); - QAction *a = new QAction( tr( "New" ), Resource::loadPixmap( "new" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) ); - a->addTo( sub_bar ); + QAction *a = new QAction( tr( "New" ), Resource::loadPixmap( "new" ), QString::null, 0, this, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) ); + a->addTo( sub_bar ); - sub_bar->addSeparator(); + sub_bar->addSeparator(); - a = new QAction( tr( "Today" ), Resource::loadPixmap( "datebook/to_day" ), QString::null, 0, g, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( slotToday() ) ); - a->addTo( sub_bar ); -// a->addTo( view ); + a = new QAction( tr( "Today" ), Resource::loadPixmap( "datebook/to_day" ), QString::null, 0, g, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( slotToday() ) ); + a->addTo( sub_bar ); +// a->addTo( view ); - sub_bar->addSeparator(); + sub_bar->addSeparator(); - a = new QAction( tr( "Day" ), Resource::loadPixmap( "day" ), QString::null, 0, g, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( viewDay() ) ); - a->addTo( sub_bar ); + a = new QAction( tr( "Day" ), Resource::loadPixmap( "day" ), QString::null, 0, g, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( viewDay() ) ); + a->addTo( sub_bar ); // a->addTo( view ); - a->setToggleAction( TRUE ); - a->setOn( TRUE ); - dayAction = a; + a->setToggleAction( TRUE ); + a->setOn( TRUE ); + dayAction = a; - a = new QAction( tr( "Week" ), Resource::loadPixmap( "week" ), QString::null, 0, g, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( viewWeek() ) ); - a->addTo( sub_bar ); + a = new QAction( tr( "Week" ), Resource::loadPixmap( "week" ), QString::null, 0, g, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( viewWeek() ) ); + a->addTo( sub_bar ); // a->addTo( view ); - a->setToggleAction( TRUE ); - weekAction = a; + a->setToggleAction( TRUE ); + weekAction = a; - a = new QAction( tr( "WeekLst" ), Resource::loadPixmap( "datebook/weeklst" ), QString::null, 0, g, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( viewWeekLst() ) ); - a->addTo( sub_bar ); + a = new QAction( tr( "WeekLst" ), Resource::loadPixmap( "datebook/weeklst" ), QString::null, 0, g, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( viewWeekLst() ) ); + a->addTo( sub_bar ); // a->addTo( view ); - a->setToggleAction( TRUE ); - weekLstAction = a; + a->setToggleAction( TRUE ); + weekLstAction = a; - a = new QAction( tr( "Month" ), Resource::loadPixmap( "month" ), QString::null, 0, g, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( viewMonth() ) ); - a->addTo( sub_bar ); + a = new QAction( tr( "Month" ), Resource::loadPixmap( "month" ), QString::null, 0, g, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( viewMonth() ) ); + a->addTo( sub_bar ); // a->addTo( view ); - a->setToggleAction( TRUE ); - monthAction = a; + a->setToggleAction( TRUE ); + monthAction = a; - sub_bar->addSeparator(); + sub_bar->addSeparator(); - a = new QAction( tr( "Find" ), Resource::loadPixmap( "mag" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL(activated()), this, SLOT(slotFind()) ); - a->addTo( sub_bar ); + a = new QAction( tr( "Find" ), Resource::loadPixmap( "mag" ), QString::null, 0, this, 0 ); + connect( a, SIGNAL(activated()), this, SLOT(slotFind()) ); + a->addTo( sub_bar ); - a = new QAction( tr( "Edit..." ), Resource::loadPixmap("SettingsIcon"), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( slotSettings() ) ); - a->addTo( sub_bar ); + a = new QAction( tr( "Edit..." ), Resource::loadPixmap("SettingsIcon"), QString::null, 0, this, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( slotSettings() ) ); + a->addTo( sub_bar ); - if(defaultView==DAY) viewDay(); - if(defaultView==WEEK) needEvilHack=true; // viewWeek(); - if(defaultView==WEEKLST) viewWeekLst(); - if(defaultView==MONTH) viewMonth(); + if(defaultView==DAY) viewDay(); + if(defaultView==WEEK) needEvilHack=true; // viewWeek(); + if(defaultView==WEEKLST) viewWeekLst(); + if(defaultView==MONTH) viewMonth(); - connect( qApp, SIGNAL(clockChanged(bool)), this, SLOT(changeClock(bool)) ); - connect( qApp, SIGNAL(weekChanged(bool)), this, SLOT(changeWeek(bool)) ); + connect( qApp, SIGNAL(clockChanged(bool)), this, SLOT(changeClock(bool)) ); + connect( qApp, SIGNAL(weekChanged(bool)), this, SLOT(changeWeek(bool)) ); #if defined(Q_WS_QWS) && !defined(QT_NO_COP) - connect( qApp, SIGNAL(appMessage(const QCString&,const QByteArray&)), this, SLOT(appMessage(const QCString&,const QByteArray&)) ); + connect( qApp, SIGNAL(appMessage(const QCString&,const QByteArray&)), this, SLOT(appMessage(const QCString&,const QByteArray&)) ); #endif // listen on QPE/System #if defined(Q_WS_QWS) #if !defined(QT_NO_COP) - QCopChannel *channel = new QCopChannel( "QPE/System", this ); - connect( channel, SIGNAL(received(const QCString&,const QByteArray&)), this, SLOT(receive(const QCString&,const QByteArray&)) ); - channel = new QCopChannel( "QPE/Datebook", this ); - connect( channel, SIGNAL(received(const QCString&,const QByteArray&)), this, SLOT(receive(const QCString&,const QByteArray&)) ); + QCopChannel *channel = new QCopChannel( "QPE/System", this ); + connect( channel, SIGNAL(received(const QCString&,const QByteArray&)), this, SLOT(receive(const QCString&,const QByteArray&)) ); + channel = new QCopChannel( "QPE/Datebook", this ); + connect( channel, SIGNAL(received(const QCString&,const QByteArray&)), this, SLOT(receive(const QCString&,const QByteArray&)) ); #endif #endif - odebug << "done t=" << t.elapsed() << oendl; + odebug << "done t=" << t.elapsed() << oendl; connect( qApp, SIGNAL( flush() ), this, SLOT( flush() ) ); connect( qApp, SIGNAL( reload()), this, SLOT( reload() ) ); /* * Here is a problem description: * When Weekview is the default view * a DateBookWeekView get's created * redraw() get's called. So what? * Remember that we're still in the c'tor * and no final layout has happened? Ok * now all Events get arranged. Their x * position get's determined by a QHeader * position. But the QHeader isn't layouted or * at the right position. redraw() is a slot * so we'll call it then via a singleShot * from view() */ - if( needEvilHack ){ - QTimer::singleShot( 500, this, SLOT(viewWeek()) ); - } + if( needEvilHack ){ + QTimer::singleShot( 500, this, SLOT(viewWeek()) ); + } } void DateBook::receive( const QCString &msg, const QByteArray &data ) { QDataStream stream( data, IO_ReadOnly ); if ( msg == "timeChange(QString)" ) { - // update active view! - if ( dayAction->isOn() ) - viewDay(); - else if ( weekAction->isOn() ) - viewWeek(); - else if ( monthAction->isOn() ) - viewMonth(); + // update active view! + if ( dayAction->isOn() ) + viewDay(); + else if ( weekAction->isOn() ) + viewWeek(); + else if ( monthAction->isOn() ) + viewMonth(); } else if (msg == "editEvent(int)") { - int uid; - stream >> uid; - Event e=db->eventByUID(uid); - editEvent(e); + int uid; + stream >> uid; + Event e=db->eventByUID(uid); + editEvent(e); }else if (msg == "viewDefault(QDate)"){ QDate day; stream >> day; viewDefault(day); } } DateBook::~DateBook() { + delete db_holiday; } void DateBook::slotSettings() { - DateBookSettings frmSettings( ampm, this ); - frmSettings.setStartTime( startTime ); - frmSettings.setAlarmPreset( aPreset, presetTime ); - frmSettings.setJumpToCurTime( bJumpToCurTime ); - frmSettings.setRowStyle( rowStyle ); - frmSettings.comboDefaultView->setCurrentItem(defaultView-1); - frmSettings.comboWeekListView->setCurrentItem(weeklistviewconfig); - - bool found=false; - for (int i=0; i<(frmSettings.comboLocation->count()); i++) { - if ( frmSettings.comboLocation->text(i) == defaultLocation ) { - frmSettings.comboLocation->setCurrentItem(i); - found=true; - break; - } - } - if(!found) { - frmSettings.comboLocation->insertItem(defaultLocation); - frmSettings.comboLocation->setCurrentItem(frmSettings.comboLocation->count()-1); - } - frmSettings.comboCategory->setCategories(defaultCategories,"Calendar", tr("Calendar")); - - if ( QPEApplication::execDialog( &frmSettings ) ) { - aPreset = frmSettings.alarmPreset(); - presetTime = frmSettings.presetTime(); - startTime = frmSettings.startTime(); - bJumpToCurTime = frmSettings.jumpToCurTime(); - rowStyle = frmSettings.rowStyle(); - defaultView=frmSettings.comboDefaultView->currentItem()+1; - weeklistviewconfig=frmSettings.comboWeekListView->currentItem(); - defaultLocation=frmSettings.comboLocation->currentText(); - defaultCategories=frmSettings.comboCategory->currentCategories(); - - if ( dayView ) { - dayView->setStartViewTime( startTime ); - dayView->setJumpToCurTime( bJumpToCurTime ); - dayView->setRowStyle( rowStyle ); - } - if ( weekView ) { - weekView->setStartViewTime( startTime ); - } - saveSettings(); - - // make the change obvious - if ( views->visibleWidget() ) { - if ( views->visibleWidget() == dayView ) - dayView->redraw(); - else if ( views->visibleWidget() == weekView ) - weekView->redraw(); - else if ( views->visibleWidget() == weekLstView ) - weekLstView->redraw(); - } - } + DateBookSettings frmSettings( ampm, this ); + frmSettings.setStartTime( startTime ); + frmSettings.setAlarmPreset( aPreset, presetTime ); + frmSettings.setJumpToCurTime( bJumpToCurTime ); + frmSettings.setRowStyle( rowStyle ); + frmSettings.comboDefaultView->setCurrentItem(defaultView-1); + frmSettings.comboWeekListView->setCurrentItem(weeklistviewconfig); + + bool found=false; + for (int i=0; i<(frmSettings.comboLocation->count()); i++) { + if ( frmSettings.comboLocation->text(i) == defaultLocation ) { + frmSettings.comboLocation->setCurrentItem(i); + found=true; + break; + } + } + if(!found) { + frmSettings.comboLocation->insertItem(defaultLocation); + frmSettings.comboLocation->setCurrentItem(frmSettings.comboLocation->count()-1); + } + frmSettings.comboCategory->setCategories(defaultCategories,"Calendar", tr("Calendar")); + + if ( QPEApplication::execDialog( &frmSettings ) ) { + aPreset = frmSettings.alarmPreset(); + presetTime = frmSettings.presetTime(); + startTime = frmSettings.startTime(); + bJumpToCurTime = frmSettings.jumpToCurTime(); + rowStyle = frmSettings.rowStyle(); + defaultView=frmSettings.comboDefaultView->currentItem()+1; + weeklistviewconfig=frmSettings.comboWeekListView->currentItem(); + defaultLocation=frmSettings.comboLocation->currentText(); + defaultCategories=frmSettings.comboCategory->currentCategories(); + + if ( dayView ) { + dayView->setStartViewTime( startTime ); + dayView->setJumpToCurTime( bJumpToCurTime ); + dayView->setRowStyle( rowStyle ); + } + if ( weekView ) { + weekView->setStartViewTime( startTime ); + } + saveSettings(); + + // make the change obvious + if ( views->visibleWidget() ) { + if ( views->visibleWidget() == dayView ) + dayView->redraw(); + else if ( views->visibleWidget() == weekView ) + weekView->redraw(); + else if ( views->visibleWidget() == weekLstView ) + weekLstView->redraw(); + } + } } void DateBook::fileNew() { slotNewEventFromKey(""); } QString DateBook::checkEvent(const Event &e) { /* check if overlaps with itself */ bool checkFailed = FALSE; /* check the next 12 repeats. should catch most problems */ QDate current_date = e.start().date(); Event previous = e; for(int i = 0; i < 12; i++) { - QDateTime next; - if (!nextOccurance(previous, current_date.addDays(1), next)) { - break; // no more repeats - } - if(next < previous.end()) { - checkFailed = TRUE; - break; - } - current_date = next.date(); + QDateTime next; + if (!nextOccurance(previous, current_date.addDays(1), next)) { + break; // no more repeats + } + if(next < previous.end()) { + checkFailed = TRUE; + break; + } + current_date = next.date(); } if(checkFailed) - return tr("Event duration is potentially longer\n" - "than interval between repeats."); + return tr("Event duration is potentially longer\n" + "than interval between repeats."); return QString::null; } QDate DateBook::currentDate() { QDate d = QDate::currentDate(); if ( dayView && views->visibleWidget() == dayView ) { - d = dayView->date(); + d = dayView->date(); } else if ( weekView && views->visibleWidget() == weekView ) { d = weekView->date(); } else if ( weekLstView && views->visibleWidget() == weekLstView ) { d = weekLstView->date(); } else if ( monthView && views->visibleWidget() == monthView ) { - d = monthView->selectedDate(); + d = monthView->selectedDate(); } return d; } void DateBook::view(int v, const QDate &d) { - if (v==DAY) { - initDay(); - dayAction->setOn( TRUE ); - dayView->setDate( d ); - views->raiseWidget( dayView ); - dayView->redraw(); - } else if (v==WEEK) { - initWeek(); - weekAction->setOn( TRUE ); - weekView->setDate( d ); - views->raiseWidget( weekView ); - weekView->redraw(); - } else if (v==WEEKLST) { - initWeekLst(); - weekLstAction->setOn( TRUE ); - weekLstView->setDate(d); - views->raiseWidget( weekLstView ); - weekLstView->redraw(); - } else if (v==MONTH) { - initMonth(); - monthAction->setOn( TRUE ); - monthView->setDate( d.year(), d.month(), d.day() ); - views->raiseWidget( monthView ); - monthView->redraw(); - } + if (v==DAY) { + initDay(); + dayAction->setOn( TRUE ); + dayView->setDate( d ); + views->raiseWidget( dayView ); + dayView->redraw(); + } else if (v==WEEK) { + initWeek(); + weekAction->setOn( TRUE ); + weekView->setDate( d ); + views->raiseWidget( weekView ); + weekView->redraw(); + } else if (v==WEEKLST) { + initWeekLst(); + weekLstAction->setOn( TRUE ); + weekLstView->setDate(d); + views->raiseWidget( weekLstView ); + weekLstView->redraw(); + } else if (v==MONTH) { + initMonth(); + monthAction->setOn( TRUE ); + monthView->setDate( d.year(), d.month(), d.day() ); + views->raiseWidget( monthView ); + monthView->redraw(); + } } void DateBook::viewDefault(const QDate &d) { - view(defaultView,d); + view(defaultView,d); } void DateBook::viewDay() { - view(DAY,currentDate()); + view(DAY,currentDate()); } void DateBook::viewWeek() { - view(WEEK,currentDate()); + view(WEEK,currentDate()); } void DateBook::viewWeekLst() { - view(WEEKLST,currentDate()); + view(WEEKLST,currentDate()); } void DateBook::viewMonth() { - view(MONTH,currentDate()); + view(MONTH,currentDate()); } void DateBook::insertEvent( const Event &e ) { - Event dupEvent=e; - if(!dupEvent.isValidUid() ) // tkcRom seems to be different - dupEvent.assignUid(); - dupEvent.setLocation(defaultLocation); - dupEvent.setCategories(defaultCategories); - db->addEvent(dupEvent); - emit newEvent(); + Event dupEvent=e; + if(!dupEvent.isValidUid() ) // tkcRom seems to be different + dupEvent.assignUid(); + dupEvent.setLocation(defaultLocation); + dupEvent.setCategories(defaultCategories); + db->addEvent(dupEvent); + emit newEvent(); } void DateBook::duplicateEvent( const Event &e ) { // Alot of code duplication, as this is almost like editEvent(); - if (syncing) { - QMessageBox::warning( this, tr("Calendar"), tr( "Can not edit data, currently syncing") ); - return; + if (syncing) { + QMessageBox::warning( this, tr("Calendar"), tr( "Can not edit data, currently syncing") ); + return; } - Event dupevent(e); // Make a duplicate. - - // workaround added for text input. - QDialog editDlg( this, 0, TRUE ); - DateEntry *entry; - editDlg.setCaption( tr("Duplicate Event") ); - QVBoxLayout *vb = new QVBoxLayout( &editDlg ); - QScrollView *sv = new QScrollView( &editDlg, "scrollview" ); - sv->setResizePolicy( QScrollView::AutoOneFit ); - // KLUDGE!!! - sv->setHScrollBarMode( QScrollView::AlwaysOff ); - vb->addWidget( sv ); - entry = new DateEntry( onMonday, dupevent, ampm, &editDlg, "editor" ); - entry->timezone->setEnabled( FALSE ); - sv->addChild( entry ); - - while ( QPEApplication::execDialog( &editDlg ) ) { - Event newEv = entry->event(); - QString error = checkEvent(newEv); - if (!error.isNull()) { - if (QMessageBox::warning(this, tr("error box"), error, tr("Fix it"), tr("Continue"), 0, 0, 1) == 0) - continue; - } + Event dupevent(e); // Make a duplicate. + + // workaround added for text input. + QDialog editDlg( this, 0, TRUE ); + DateEntry *entry; + editDlg.setCaption( tr("Duplicate Event") ); + QVBoxLayout *vb = new QVBoxLayout( &editDlg ); + QScrollView *sv = new QScrollView( &editDlg, "scrollview" ); + sv->setResizePolicy( QScrollView::AutoOneFit ); + // KLUDGE!!! + sv->setHScrollBarMode( QScrollView::AlwaysOff ); + vb->addWidget( sv ); + entry = new DateEntry( onMonday, dupevent, ampm, &editDlg, "editor" ); + entry->timezone->setEnabled( FALSE ); + sv->addChild( entry ); + + while ( QPEApplication::execDialog( &editDlg ) ) { + Event newEv = entry->event(); + QString error = checkEvent(newEv); + if (!error.isNull()) { + if (QMessageBox::warning(this, tr("error box"), error, tr("Fix it"), tr("Continue"), 0, 0, 1) == 0) + continue; + } /* * The problem: * DateBookDB does remove repeating events not by uid but by the time * the recurrence was created * so we need to update that time as well */ Event::RepeatPattern rp = newEv.repeatPattern(); rp.createTime = ::time( NULL ); newEv.setRepeat( TRUE, rp ); // has repeat and repeatPattern... - if( newEv.uid() == e.uid() || !newEv.isValidUid() ) - newEv.assignUid(); + if( newEv.uid() == e.uid() || !newEv.isValidUid() ) + newEv.assignUid(); - db->addEvent(newEv); - emit newEvent(); - break; - } + db->addEvent(newEv); + emit newEvent(); + break; + } } void DateBook::editEvent( const Event &e ) { - if (syncing) { - QMessageBox::warning( this, tr("Calendar"), tr( "Can not edit data, currently syncing") ); - return; - } - - // workaround added for text input. - QDialog editDlg( this, 0, TRUE ); - DateEntry *entry; - editDlg.setCaption( tr("Edit Event") ); - QVBoxLayout *vb = new QVBoxLayout( &editDlg ); - QScrollView *sv = new QScrollView( &editDlg, "scrollview" ); - sv->setResizePolicy( QScrollView::AutoOneFit ); - // KLUDGE!!! - sv->setHScrollBarMode( QScrollView::AlwaysOff ); - vb->addWidget( sv ); - entry = new DateEntry( onMonday, e, ampm, &editDlg, "editor" ); - entry->timezone->setEnabled( FALSE ); - sv->addChild( entry ); - - while ( QPEApplication::execDialog( &editDlg ) ) { - Event newEv = entry->event(); - if(newEv.description().isEmpty() && newEv.notes().isEmpty() ) - break; - newEv.setUid(e.uid()); // FIXME: Hack not to clear uid - QString error = checkEvent(newEv); - if (!error.isNull()) { - if (QMessageBox::warning(this, tr("error box"), error, tr("Fix it"), tr("Continue"), 0, 0, 1) == 0) continue; - } - db->editEvent(e, newEv); - emit newEvent(); - break; - } + if (syncing) { + QMessageBox::warning( this, tr("Calendar"), tr( "Can not edit data, currently syncing") ); + return; + } + + // workaround added for text input. + QDialog editDlg( this, 0, TRUE ); + DateEntry *entry; + editDlg.setCaption( tr("Edit Event") ); + QVBoxLayout *vb = new QVBoxLayout( &editDlg ); + QScrollView *sv = new QScrollView( &editDlg, "scrollview" ); + sv->setResizePolicy( QScrollView::AutoOneFit ); + // KLUDGE!!! + sv->setHScrollBarMode( QScrollView::AlwaysOff ); + vb->addWidget( sv ); + entry = new DateEntry( onMonday, e, ampm, &editDlg, "editor" ); + entry->timezone->setEnabled( FALSE ); + sv->addChild( entry ); + + while ( QPEApplication::execDialog( &editDlg ) ) { + Event newEv = entry->event(); + if(newEv.description().isEmpty() && newEv.notes().isEmpty() ) + break; + newEv.setUid(e.uid()); // FIXME: Hack not to clear uid + QString error = checkEvent(newEv); + if (!error.isNull()) { + if (QMessageBox::warning(this, tr("error box"), error, tr("Fix it"), tr("Continue"), 0, 0, 1) == 0) continue; + } + db->editEvent(e, newEv); + emit newEvent(); + break; + } } void DateBook::removeEvent( const Event &e ) { - if (syncing) { - QMessageBox::warning( this, tr("Calendar"), tr( "Can not edit data, currently syncing") ); - return; - } + if (syncing) { + QMessageBox::warning( this, tr("Calendar"), tr( "Can not edit data, currently syncing") ); + return; + } QString strName = e.description(); if ( !QPEMessageBox::confirmDelete( this, tr( "Calendar" ),strName ) ) - return; + return; db->removeEvent( e ); if ( views->visibleWidget() == dayView && dayView ) dayView->redraw(); } void DateBook::addEvent( const Event &e ) { QDate d = e.start().date(); initDay(); dayView->setDate( d ); } void DateBook::showDay( int year, int month, int day ) { QDate d(year, month, day); view(DAY,d); } void DateBook::initDay() { - if ( !dayView ) { - dayView = new DateBookDay( ampm, onMonday, db, views, "day view" ); - views->addWidget( dayView, DAY ); + if ( !dayView ) { + dayView = new DateBookDay( ampm, onMonday, db, db_holiday, views, "day view" ); + views->addWidget( dayView, DAY ); dayView->setJumpToCurTime( bJumpToCurTime ); - dayView->setStartViewTime( startTime ); - dayView->setRowStyle( rowStyle ); - connect( this, SIGNAL( newEvent() ), dayView, SLOT( redraw() ) ); - connect( dayView, SIGNAL( newEvent() ), this, SLOT( fileNew() ) ); - connect( dayView, SIGNAL( removeEvent(const Event&) ), this, SLOT( removeEvent(const Event&) ) ); - connect( dayView, SIGNAL( editEvent(const Event&) ), this, SLOT( editEvent(const Event&) ) ); - connect( dayView, SIGNAL( duplicateEvent(const Event&) ), this, SLOT( duplicateEvent(const Event&) ) ); - connect( dayView, SIGNAL( beamEvent(const Event&) ), this, SLOT( beamEvent(const Event&) ) ); - connect( dayView, SIGNAL(sigNewEvent(const QString&)), this, SLOT(slotNewEventFromKey(const QString&)) ); - } + dayView->setStartViewTime( startTime ); + dayView->setRowStyle( rowStyle ); + connect( this, SIGNAL( newEvent() ), dayView, SLOT( redraw() ) ); + connect( dayView, SIGNAL( newEvent() ), this, SLOT( fileNew() ) ); + connect( dayView, SIGNAL( removeEvent(const Event&) ), this, SLOT( removeEvent(const Event&) ) ); + connect( dayView, SIGNAL( editEvent(const Event&) ), this, SLOT( editEvent(const Event&) ) ); + connect( dayView, SIGNAL( duplicateEvent(const Event&) ), this, SLOT( duplicateEvent(const Event&) ) ); + connect( dayView, SIGNAL( beamEvent(const Event&) ), this, SLOT( beamEvent(const Event&) ) ); + connect( dayView, SIGNAL(sigNewEvent(const QString&)), this, SLOT(slotNewEventFromKey(const QString&)) ); + } } void DateBook::initWeek() { - if ( !weekView ) { - weekView = new DateBookWeek( ampm, onMonday, db, views, "week view" ); - weekView->setStartViewTime( startTime ); - views->addWidget( weekView, WEEK ); - connect( weekView, SIGNAL( showDate(int,int,int) ), this, SLOT( showDay(int,int,int) ) ); - connect( this, SIGNAL( newEvent() ), weekView, SLOT( redraw() ) ); - } - - //But also get it right: the year that we display can be different - //from the year of the current date. So, first find the year - //number of the current week. - int yearNumber, totWeeks; - calcWeek( currentDate(), totWeeks, yearNumber, onMonday ); - - QDate d = QDate( yearNumber, 12, 31 ); - calcWeek( d, totWeeks, yearNumber, onMonday ); - - while ( totWeeks == 1 ) { - d = d.addDays( -1 ); - calcWeek( d, totWeeks, yearNumber, onMonday ); - } + if ( !weekView ) { + weekView = new DateBookWeek( ampm, onMonday, db, views, "week view" ); + weekView->setStartViewTime( startTime ); + views->addWidget( weekView, WEEK ); + connect( weekView, SIGNAL( showDate(int,int,int) ), this, SLOT( showDay(int,int,int) ) ); + connect( this, SIGNAL( newEvent() ), weekView, SLOT( redraw() ) ); + } + + //But also get it right: the year that we display can be different + //from the year of the current date. So, first find the year + //number of the current week. + int yearNumber, totWeeks; + calcWeek( currentDate(), totWeeks, yearNumber, onMonday ); + + QDate d = QDate( yearNumber, 12, 31 ); + calcWeek( d, totWeeks, yearNumber, onMonday ); + + while ( totWeeks == 1 ) { + d = d.addDays( -1 ); + calcWeek( d, totWeeks, yearNumber, onMonday ); + } } void DateBook::initWeekLst() { - if ( !weekLstView ) { - weekLstView = new DateBookWeekLst( ampm, onMonday, db, views, "weeklst view" ); - views->addWidget( weekLstView, WEEKLST ); - - //weekLstView->setStartViewTime( startTime ); - connect( weekLstView, SIGNAL( showDate(int,int,int) ), this, SLOT( showDay(int,int,int) ) ); - connect( weekLstView, SIGNAL( addEvent(const QDateTime&,const QDateTime&,const QString&, const QString&) ), - this, SLOT( slotNewEntry(const QDateTime&,const QDateTime&,const QString&, const QString&) ) ); - connect( this, SIGNAL( newEvent() ), weekLstView, SLOT( redraw() ) ); - connect( weekLstView, SIGNAL( editEvent(const Event&) ), this, SLOT( editEvent(const Event&) ) ); - connect( weekLstView, SIGNAL( duplicateEvent( const Event & ) ), this, SLOT( duplicateEvent( const Event & ) ) ); - connect( weekLstView, SIGNAL( beamEvent(const Event&) ), this, SLOT( beamEvent(const Event&) ) ); - connect( weekLstView, SIGNAL( removeEvent( const Event & ) ), this, SLOT( removeEvent( const Event & ) ) ); - } + if ( !weekLstView ) { + weekLstView = new DateBookWeekLst( ampm, onMonday, db, views, "weeklst view" ); + views->addWidget( weekLstView, WEEKLST ); + + //weekLstView->setStartViewTime( startTime ); + connect( weekLstView, SIGNAL( showDate(int,int,int) ), this, SLOT( showDay(int,int,int) ) ); + connect( weekLstView, SIGNAL( addEvent(const QDateTime&,const QDateTime&,const QString&, const QString&) ), + this, SLOT( slotNewEntry(const QDateTime&,const QDateTime&,const QString&, const QString&) ) ); + connect( this, SIGNAL( newEvent() ), weekLstView, SLOT( redraw() ) ); + connect( weekLstView, SIGNAL( editEvent(const Event&) ), this, SLOT( editEvent(const Event&) ) ); + connect( weekLstView, SIGNAL( duplicateEvent( const Event & ) ), this, SLOT( duplicateEvent( const Event & ) ) ); + connect( weekLstView, SIGNAL( beamEvent(const Event&) ), this, SLOT( beamEvent(const Event&) ) ); + connect( weekLstView, SIGNAL( removeEvent( const Event & ) ), this, SLOT( removeEvent( const Event & ) ) ); + } } void DateBook::initMonth() { - if ( !monthView ) { - monthView = new DateBookMonth( views, "month view", FALSE, db ); - views->addWidget( monthView, MONTH ); - connect( monthView, SIGNAL( dateClicked(int,int,int) ), this, SLOT( showDay(int,int,int) ) ); - connect( this, SIGNAL( newEvent() ), monthView, SLOT( redraw() ) ); - qApp->processEvents(); - } + if ( !monthView ) { + monthView = new DateBookMonth( views, "month view", FALSE, db ); + views->addWidget( monthView, MONTH ); + connect( monthView, SIGNAL( dateClicked(int,int,int) ), this, SLOT( showDay(int,int,int) ) ); + connect( this, SIGNAL( newEvent() ), monthView, SLOT( redraw() ) ); + qApp->processEvents(); + } } void DateBook::loadSettings() { - Config qpeconfig( "qpe" ); - qpeconfig.setGroup("Time"); - ampm = qpeconfig.readBoolEntry( "AMPM", TRUE ); - onMonday = qpeconfig.readBoolEntry( "MONDAY" ); - - Config config("DateBook"); - config.setGroup("Main"); - startTime = config.readNumEntry("startviewtime", 8); - aPreset = config.readBoolEntry("alarmpreset"); - presetTime = config.readNumEntry("presettime"); - bJumpToCurTime = config.readBoolEntry("jumptocurtime"); - rowStyle = config.readNumEntry("rowstyle"); - defaultView = config.readNumEntry("defaultview",DAY); - weeklistviewconfig = config.readNumEntry("weeklistviewconfig",NORMAL); - - defaultLocation=config.readEntry("defaultLocation"); - QString tmpString=config.readEntry("defaultCategories"); - QStringList tmpStringList=QStringList::split(",",tmpString); - defaultCategories.truncate(0); - - for( QStringList::Iterator i=tmpStringList.begin(); i!=tmpStringList.end(); i++) { - defaultCategories.resize(defaultCategories.count()+1); - defaultCategories[defaultCategories.count()-1]=(*i).toInt(); - } + Config qpeconfig( "qpe" ); + qpeconfig.setGroup("Time"); + ampm = qpeconfig.readBoolEntry( "AMPM", TRUE ); + onMonday = qpeconfig.readBoolEntry( "MONDAY" ); + + Config config("DateBook"); + config.setGroup("Main"); + startTime = config.readNumEntry("startviewtime", 8); + aPreset = config.readBoolEntry("alarmpreset"); + presetTime = config.readNumEntry("presettime"); + bJumpToCurTime = config.readBoolEntry("jumptocurtime"); + rowStyle = config.readNumEntry("rowstyle"); + defaultView = config.readNumEntry("defaultview",DAY); + weeklistviewconfig = config.readNumEntry("weeklistviewconfig",NORMAL); + + defaultLocation=config.readEntry("defaultLocation"); + QString tmpString=config.readEntry("defaultCategories"); + QStringList tmpStringList=QStringList::split(",",tmpString); + defaultCategories.truncate(0); + + for( QStringList::Iterator i=tmpStringList.begin(); i!=tmpStringList.end(); i++) { + defaultCategories.resize(defaultCategories.count()+1); + defaultCategories[defaultCategories.count()-1]=(*i).toInt(); + } } void DateBook::saveSettings() { - Config config( "qpe" ); - Config configDB( "DateBook" ); - configDB.setGroup( "Main" ); - configDB.writeEntry("startviewtime",startTime); - configDB.writeEntry("alarmpreset",aPreset); - configDB.writeEntry("presettime",presetTime); - configDB.writeEntry("jumptocurtime", bJumpToCurTime); - configDB.writeEntry("rowstyle", rowStyle); - configDB.writeEntry("defaultview",defaultView); - configDB.writeEntry("weeklistviewconfig",weeklistviewconfig); - - configDB.writeEntry("defaultLocation",defaultLocation); - QStringList tmpStringList; - for( uint i=0; i<defaultCategories.count(); i++) { - tmpStringList << QString::number(defaultCategories[i]); - } - configDB.writeEntry("defaultCategories",tmpStringList.join(",")); + Config config( "qpe" ); + Config configDB( "DateBook" ); + configDB.setGroup( "Main" ); + configDB.writeEntry("startviewtime",startTime); + configDB.writeEntry("alarmpreset",aPreset); + configDB.writeEntry("presettime",presetTime); + configDB.writeEntry("jumptocurtime", bJumpToCurTime); + configDB.writeEntry("rowstyle", rowStyle); + configDB.writeEntry("defaultview",defaultView); + configDB.writeEntry("weeklistviewconfig",weeklistviewconfig); + + configDB.writeEntry("defaultLocation",defaultLocation); + QStringList tmpStringList; + for( uint i=0; i<defaultCategories.count(); i++) { + tmpStringList << QString::number(defaultCategories[i]); + } + configDB.writeEntry("defaultCategories",tmpStringList.join(",")); } void DateBook::appMessage(const QCString& msg, const QByteArray& data) { - bool needShow = FALSE; - if ( msg == "alarm(QDateTime,int)" ) { - QDataStream ds(data,IO_ReadOnly); - QDateTime when; int warn; - ds >> when >> warn; - - // check to make it's okay to continue, - // this is the case that the time was set ahead, and - // we are forced given a stale alarm... - QDateTime current = QDateTime::currentDateTime(); - if ( current.time().hour() != when.time().hour() && current.time().minute() != when.time().minute() ) - return; - - QValueList<EffectiveEvent> list = db->getEffectiveEvents(when.addSecs(warn*60)); - if ( list.count() > 0 ) { - QString msg; - bool bSound = FALSE; - int stopTimer = 0; - bool found = FALSE; - for ( QValueList<EffectiveEvent>::ConstIterator it=list.begin(); it!=list.end(); ++it ) { - if ( (*it).event().hasAlarm() ) { - found = TRUE; - msg += "<CENTER><B>" + (*it).description() + "</B>" - + "<BR>" + (*it).location() + "<BR>" - + TimeString::dateString((*it).event().start(),ampm) - + (warn - ? tr(" (in " + QString::number(warn) - + tr(" minutes)")) - : QString("")) - + "<BR>" - + (*it).notes() + "</CENTER>"; - if ( (*it).event().alarmSound() != Event::Silent ) { - bSound = TRUE; - } - } - } - if ( found ) { - if ( bSound ) { - Sound::soundAlarm(); - alarmCounter = 0; - stopTimer = startTimer( 5000 ); - } - QDialog dlg( this, 0, TRUE ); - QVBoxLayout *vb = new QVBoxLayout( &dlg ); - QScrollView *view = new QScrollView( &dlg, "scrollView"); - view->setResizePolicy( QScrollView::AutoOneFit ); - vb->addWidget( view ); - QLabel *lblMsg = new QLabel( msg, &dlg ); - view->addChild( lblMsg ); - QPushButton *cmdOk = new QPushButton( tr("OK"), &dlg ); - connect( cmdOk, SIGNAL(clicked()), &dlg, SLOT(accept()) ); - vb->addWidget( cmdOk ); - - needShow = QPEApplication::execDialog( &dlg ); - - if ( bSound ) - killTimer( stopTimer ); - } - } - } else if ( msg == "nextView()" ) { + bool needShow = FALSE; + if ( msg == "alarm(QDateTime,int)" ) { + QDataStream ds(data,IO_ReadOnly); + QDateTime when; int warn; + ds >> when >> warn; + + // check to make it's okay to continue, + // this is the case that the time was set ahead, and + // we are forced given a stale alarm... + QDateTime current = QDateTime::currentDateTime(); + if ( current.time().hour() != when.time().hour() && current.time().minute() != when.time().minute() ) + return; + + QValueList<EffectiveEvent> list = db->getEffectiveEvents(when.addSecs(warn*60)); + if ( list.count() > 0 ) { + QString msg; + bool bSound = FALSE; + int stopTimer = 0; + bool found = FALSE; + for ( QValueList<EffectiveEvent>::ConstIterator it=list.begin(); it!=list.end(); ++it ) { + if ( (*it).event().hasAlarm() ) { + found = TRUE; + msg += "<CENTER><B>" + (*it).description() + "</B>" + + "<BR>" + (*it).location() + "<BR>" + + TimeString::dateString((*it).event().start(),ampm) + + (warn + ? tr(" (in " + QString::number(warn) + + tr(" minutes)")) + : QString("")) + + "<BR>" + + (*it).notes() + "</CENTER>"; + if ( (*it).event().alarmSound() != Event::Silent ) { + bSound = TRUE; + } + } + } + if ( found ) { + if ( bSound ) { + Sound::soundAlarm(); + alarmCounter = 0; + stopTimer = startTimer( 5000 ); + } + QDialog dlg( this, 0, TRUE ); + QVBoxLayout *vb = new QVBoxLayout( &dlg ); + QScrollView *view = new QScrollView( &dlg, "scrollView"); + view->setResizePolicy( QScrollView::AutoOneFit ); + vb->addWidget( view ); + QLabel *lblMsg = new QLabel( msg, &dlg ); + view->addChild( lblMsg ); + QPushButton *cmdOk = new QPushButton( tr("OK"), &dlg ); + connect( cmdOk, SIGNAL(clicked()), &dlg, SLOT(accept()) ); + vb->addWidget( cmdOk ); + + needShow = QPEApplication::execDialog( &dlg ); + + if ( bSound ) + killTimer( stopTimer ); + } + } + } else if ( msg == "nextView()" ) { needShow = true; - if ( !qApp-> activeWindow ( )) { - needShow = TRUE; - } else { - QWidget* cur = views->visibleWidget(); - if ( cur ) { - if ( cur == dayView ) - viewWeek(); - else if ( cur == weekView ) - viewWeekLst(); - else if ( cur == weekLstView ) - viewMonth(); - else if ( cur == monthView ) - viewDay(); - needShow = TRUE; - } - } + if ( !qApp-> activeWindow ( )) { + needShow = TRUE; + } else { + QWidget* cur = views->visibleWidget(); + if ( cur ) { + if ( cur == dayView ) + viewWeek(); + else if ( cur == weekView ) + viewWeekLst(); + else if ( cur == weekLstView ) + viewMonth(); + else if ( cur == monthView ) + viewDay(); + needShow = TRUE; + } + } } else if (msg == "editEvent(int)") { /* simple copy from receive */ QDataStream stream(data,IO_ReadOnly); - int uid; - stream >> uid; - Event e=db->eventByUID(uid); - editEvent(e); + int uid; + stream >> uid; + Event e=db->eventByUID(uid); + editEvent(e); } else if (msg == "viewDefault(QDate)"){ /* simple copy from receive */ QDataStream stream(data,IO_ReadOnly); QDate day; stream >> day; viewDefault(day); needShow = true; } if ( needShow ) { #if defined(Q_WS_QWS) || defined(_WS_QWS_) -// showMaximized(); +// showMaximized(); #else -// show(); +// show(); #endif -// raise(); - QPEApplication::setKeepRunning(); -// setActiveWindow(); - } +// raise(); + QPEApplication::setKeepRunning(); +// setActiveWindow(); + } } void DateBook::reload() { - db->reload(); - if ( dayAction->isOn() ) viewDay(); - else if ( weekAction->isOn() ) viewWeek(); - else if ( monthAction->isOn() ) viewMonth(); - syncing = FALSE; + db->reload(); + if ( dayAction->isOn() ) viewDay(); + else if ( weekAction->isOn() ) viewWeek(); + else if ( monthAction->isOn() ) viewMonth(); + syncing = FALSE; } void DateBook::flush() { - syncing = TRUE; - db->save(); + syncing = TRUE; + db->save(); } void DateBook::timerEvent( QTimerEvent *e ) { - if ( alarmCounter < 10 ) { - alarmCounter++; - Sound::soundAlarm(); - } else { - killTimer( e->timerId() ); - } + if ( alarmCounter < 10 ) { + alarmCounter++; + Sound::soundAlarm(); + } else { + killTimer( e->timerId() ); + } } void DateBook::changeClock( bool newClock ) { - ampm = newClock; - // repaint the affected objects... - if (dayView) dayView->redraw(); - if (weekView) weekView->redraw(); - if (weekLstView) weekLstView->redraw(); + ampm = newClock; + // repaint the affected objects... + if (dayView) dayView->redraw(); + if (weekView) weekView->redraw(); + if (weekLstView) weekLstView->redraw(); } void DateBook::changeWeek( bool m ) { - /* no need to redraw, each widget catches. Do need to - store though for widgets we haven't made yet */ - onMonday = m; + /* no need to redraw, each widget catches. Do need to + store though for widgets we haven't made yet */ + onMonday = m; } void DateBook::slotToday() { - // we need to view today using default view - view(defaultView,QDate::currentDate()); + // we need to view today using default view + view(defaultView,QDate::currentDate()); } void DateBook::closeEvent( QCloseEvent *e ) { - if(syncing) { - /* no need to save, did that at flush */ - e->accept(); - return; - } - - // save settings will generate it's own error messages, no - // need to do checking ourselves. - saveSettings(); - if ( db->save() ) { - e->accept(); - } else { - if ( QMessageBox::critical( this, tr( "Out of space" ), - tr("Calendar was unable to save\n" - "your changes.\n" - "Free up some space and try again.\n" - "\nQuit anyway?"), - QMessageBox::Yes|QMessageBox::Escape, - QMessageBox::No|QMessageBox::Default ) - != QMessageBox::No ) - e->accept(); - else - e->ignore(); + if(syncing) { + /* no need to save, did that at flush */ + e->accept(); + return; + } + + // save settings will generate it's own error messages, no + // need to do checking ourselves. + saveSettings(); + if ( db->save() ) { + e->accept(); + } else { + if ( QMessageBox::critical( this, tr( "Out of space" ), + tr("Calendar was unable to save\n" + "your changes.\n" + "Free up some space and try again.\n" + "\nQuit anyway?"), + QMessageBox::Yes|QMessageBox::Escape, + QMessageBox::No|QMessageBox::Default ) + != QMessageBox::No ) + e->accept(); + else + e->ignore(); } } // Entering directly from the "keyboard" void DateBook::slotNewEventFromKey( const QString &str ) { if (syncing) { - QMessageBox::warning( this, tr("Calendar"), - tr( "Can not edit data, currently syncing") ); - return; + QMessageBox::warning( this, tr("Calendar"), + tr( "Can not edit data, currently syncing") ); + return; } // We get to here from a key pressed in the Day View // So we can assume some things. We want the string // passed in to be part of the description. QDateTime start, end; if ( views->visibleWidget() == dayView ) { - dayView->selectedDates( start, end ); + dayView->selectedDates( start, end ); } else if ( views->visibleWidget() == monthView ) { - QDate d = monthView->selectedDate(); - start = end = d; - start.setTime( QTime( 10, 0 ) ); - end.setTime( QTime( 12, 0 ) ); + QDate d = monthView->selectedDate(); + start = end = d; + start.setTime( QTime( 10, 0 ) ); + end.setTime( QTime( 12, 0 ) ); } else if ( views->visibleWidget() == weekView ) { - QDate d = weekView->date(); - start = end = d; - start.setTime( QTime( 10, 0 ) ); - end.setTime( QTime( 12, 0 ) ); + QDate d = weekView->date(); + start = end = d; + start.setTime( QTime( 10, 0 ) ); + end.setTime( QTime( 12, 0 ) ); } else if ( views->visibleWidget() == weekLstView ) { - QDate d = weekLstView->date(); - start = end = d; - start.setTime( QTime( 10, 0 ) ); - end.setTime( QTime( 12, 0 ) ); - } + QDate d = weekLstView->date(); + start = end = d; + start.setTime( QTime( 10, 0 ) ); + end.setTime( QTime( 12, 0 ) ); + } slotNewEntry(start, end, str); } void DateBook::slotNewEntry(const QDateTime &start, const QDateTime &end, const QString &str, const QString &location) { - // argh! This really needs to be encapsulated in a class - // or function. - QDialog newDlg( this, 0, TRUE ); - newDlg.setCaption( DateEntryBase::tr("New Event") ); - DateEntry *e; - QVBoxLayout *vb = new QVBoxLayout( &newDlg ); - QScrollView *sv = new QScrollView( &newDlg ); - sv->setResizePolicy( QScrollView::AutoOneFit ); - sv->setFrameStyle( QFrame::NoFrame ); - sv->setHScrollBarMode( QScrollView::AlwaysOff ); - vb->addWidget( sv ); - - Event ev; - ev.setDescription( str ); - // When the new gui comes in, change this... - if(location==0) { - if(defaultLocation.isEmpty()) { - ev.setLocation(tr("(Unknown)")); - } else { - ev.setLocation( defaultLocation ); - } - } else { - ev.setLocation(location); - } - ev.setCategories(defaultCategories); - ev.setStart( start ); - ev.setEnd( end ); - - e = new DateEntry( onMonday, ev, ampm, &newDlg ); - e->setAlarmEnabled( aPreset, presetTime, Event::Loud ); - sv->addChild( e ); - while ( QPEApplication::execDialog( &newDlg ) ) { - ev = e->event(); - ev.assignUid(); - QString error = checkEvent( ev ); - if ( !error.isNull() ) { - if ( QMessageBox::warning( this, tr("Error!"), error, tr("Fix it"), tr("Continue"), 0, 0, 1 ) == 0 ) - continue; - } - db->addEvent( ev ); - emit newEvent(); - break; - } + // argh! This really needs to be encapsulated in a class + // or function. + QDialog newDlg( this, 0, TRUE ); + newDlg.setCaption( DateEntryBase::tr("New Event") ); + DateEntry *e; + QVBoxLayout *vb = new QVBoxLayout( &newDlg ); + QScrollView *sv = new QScrollView( &newDlg ); + sv->setResizePolicy( QScrollView::AutoOneFit ); + sv->setFrameStyle( QFrame::NoFrame ); + sv->setHScrollBarMode( QScrollView::AlwaysOff ); + vb->addWidget( sv ); + + Event ev; + ev.setDescription( str ); + // When the new gui comes in, change this... + if(location==0) { + if(defaultLocation.isEmpty()) { + ev.setLocation(tr("(Unknown)")); + } else { + ev.setLocation( defaultLocation ); + } + } else { + ev.setLocation(location); + } + ev.setCategories(defaultCategories); + ev.setStart( start ); + ev.setEnd( end ); + + e = new DateEntry( onMonday, ev, ampm, &newDlg ); + e->setAlarmEnabled( aPreset, presetTime, Event::Loud ); + sv->addChild( e ); + while ( QPEApplication::execDialog( &newDlg ) ) { + ev = e->event(); + ev.assignUid(); + QString error = checkEvent( ev ); + if ( !error.isNull() ) { + if ( QMessageBox::warning( this, tr("Error!"), error, tr("Fix it"), tr("Continue"), 0, 0, 1 ) == 0 ) + continue; + } + db->addEvent( ev ); + emit newEvent(); + break; + } } void DateBook::setDocument( const QString &filename ) { if ( filename.find(".vcs") != int(filename.length()) - 4 ) return; QValueList<Event> tl = Event::readVCalendar( filename ); for( QValueList<Event>::Iterator it = tl.begin(); it != tl.end(); ++it ) { - db->addEvent( *it ); + db->addEvent( *it ); } } static const char * beamfile = "/tmp/obex/event.vcs"; void DateBook::beamEvent( const Event &e ) { - odebug << "trying to beam" << oendl; + odebug << "trying to beam" << oendl; unlink( beamfile ); // delete if exists mkdir("/tmp/obex/", 0755); Event::writeVCalendar( beamfile, e ); Ir *ir = new Ir( this ); connect( ir, SIGNAL( done(Ir*) ), this, SLOT( beamDone(Ir*) ) ); QString description = e.description(); ir->send( beamfile, description, "text/x-vCalendar" ); } void DateBook::beamDone( Ir *ir ) { delete ir; unlink( beamfile ); } void DateBook::slotFind() { // move it to the day view... viewDay(); FindDialog frmFind( "Calendar", this ); // no tr needed frmFind.setUseDate( true ); frmFind.setDate( currentDate() ); QObject::connect( &frmFind, SIGNAL(signalFindClicked(const QString&,const QDate&,bool,bool,int)), - this, - SLOT(slotDoFind(const QString&,const QDate&,bool,bool,int)) ); + this, + SLOT(slotDoFind(const QString&,const QDate&,bool,bool,int)) ); QObject::connect( this, - SIGNAL(signalNotFound()), - &frmFind, - SLOT(slotNotFound()) ); + SIGNAL(signalNotFound()), + &frmFind, + SLOT(slotNotFound()) ); QObject::connect( this, - SIGNAL(signalWrapAround()), - &frmFind, - SLOT(slotWrapAround()) ); - frmFind.move(0,0); + SIGNAL(signalWrapAround()), + &frmFind, + SLOT(slotWrapAround()) ); + frmFind.move(0,0); frmFind.exec(); inSearch = false; } bool catComp( QArray<int> cats, int category ) { bool returnMe; int i, - count; + count; count = int(cats.count()); returnMe = false; if ( (category == -1 && count == 0) || category == -2 ) - returnMe = true; + returnMe = true; else { - for ( i = 0; i < count; i++ ) { - if ( category == cats[i] ) { - returnMe = true; - break; - } - } + for ( i = 0; i < count; i++ ) { + if ( category == cats[i] ) { + returnMe = true; + break; + } + } } return returnMe; } void DateBook::slotDoFind( const QString& txt, const QDate &dt, - bool caseSensitive, bool /*backwards*/, - int category ) + bool caseSensitive, bool /*backwards*/, + int category ) { QDateTime dtEnd( QDate(3001, 1, 1), QTime(0, 0, 0) ), - next; + next; QRegExp r( txt ); r.setCaseSensitive( caseSensitive ); static Event rev, nonrev; if ( !inSearch ) { - rev.setStart( QDateTime(QDate(1960, 1, 1), QTime(0, 0, 0)) ); - nonrev.setStart( rev.start() ); - inSearch = true; + rev.setStart( QDateTime(QDate(1960, 1, 1), QTime(0, 0, 0)) ); + nonrev.setStart( rev.start() ); + inSearch = true; } static QDate searchDate = dt; // if true at the end we will start at the begin again and afterwards // we will emit string not found static bool wrapAround = true; bool candidtate; candidtate = false; QValueList<Event> repeats = db->getRawRepeats(); // find the candidate for the first repeat that matches... // first check if there can ever be a match and then compute // the next occurence from start. See if this event is closer // to the beginning (start. next < dtEnd) and not smaller then the last // result. If we find a canditate we set the dtEnd to the time // of the ocurrence and rev to this occurence. // set wrap around to true because there might be more events coming // and we're not at the end. QValueListConstIterator<Event> it; QDate start = dt; for ( it = repeats.begin(); it != repeats.end(); ++it ) { - if ( catComp( (*it).categories(), category ) ) { + if ( catComp( (*it).categories(), category ) ) { if ( (*it).match( r ) ) { if ( nextOccurance( *it, start, next ) ) { if ( next < dtEnd && !(next <= rev.start() ) ) { rev = *it; dtEnd = next; rev.setStart( next ); candidtate = true; wrapAround = true; } } } } } // now the for first non repeat... // dtEnd is set by the previous iteration of repeatingEvents // check if we find a closer item. Also set dtEnd to find even // more close occurrence QValueList<Event> nonRepeats = db->getNonRepeatingEvents( dt, dtEnd.date() ); qHeapSort( nonRepeats.begin(), nonRepeats.end() ); for ( it = nonRepeats.begin(); it != nonRepeats.end(); ++it ) { - if ( catComp( (*it).categories(), category ) ) { - if ( (*it).start() < dtEnd ) { - if ( (*it).match( r ) && !(*it <= nonrev) ) { - nonrev = *it; - dtEnd = nonrev.start(); - candidtate = true; - wrapAround = true; - break; - } - } - } + if ( catComp( (*it).categories(), category ) ) { + if ( (*it).start() < dtEnd ) { + if ( (*it).match( r ) && !(*it <= nonrev) ) { + nonrev = *it; + dtEnd = nonrev.start(); + candidtate = true; + wrapAround = true; + break; + } + } + } } if ( candidtate ) { - dayView->setStartViewTime( dtEnd.time().hour() ); - dayView->setDate( dtEnd.date().year(), dtEnd.date().month(), - dtEnd.date().day() ); + dayView->setStartViewTime( dtEnd.time().hour() ); + dayView->setDate( dtEnd.date().year(), dtEnd.date().month(), + dtEnd.date().day() ); } else { - if ( wrapAround ) { - emit signalWrapAround(); - rev.setStart( QDateTime(QDate(1960, 1, 1), QTime(0, 0, 0)) ); - nonrev.setStart( rev.start() ); - } else - emit signalNotFound(); - wrapAround = !wrapAround; + if ( wrapAround ) { + emit signalWrapAround(); + rev.setStart( QDateTime(QDate(1960, 1, 1), QTime(0, 0, 0)) ); + nonrev.setStart( rev.start() ); + } else + emit signalNotFound(); + wrapAround = !wrapAround; } } Event DateBookDBHack::eventByUID(int uid) { // FIXME: Dirty Hacks to get hold of the private event lists QDate start; QDate end=start.addDays(-1); QValueList<Event> myEventList=getNonRepeatingEvents(start,end); QValueList<Event> myRepeatEvents=getRawRepeats(); QValueList<Event>::ConstIterator it; for (it = myEventList.begin(); it != myEventList.end(); it++) { - if ((*it).uid() == uid) return *it; + if ((*it).uid() == uid) return *it; } for (it = myRepeatEvents.begin(); it != myRepeatEvents.end(); it++) { - if ((*it).uid() == uid) return *it; + if ((*it).uid() == uid) return *it; } Event ev; return ev; // return at least } + +DateBookHoliday::DateBookHoliday() +{ + _pluginlist.clear(); + init(); +} + +DateBookHoliday::~DateBookHoliday() +{ + deinit(); +} + +void DateBookHoliday::deinit() +{ + QValueList<HPlugin*>::Iterator it; + for (it=_pluginlist.begin();it!=_pluginlist.end();++it) { + HPlugin*_pl = *it; + // destructs itself? + _pl->_if->release(); + _pl->_lib->unload(); + delete _pl->_lib; + delete _pl; + } + _pluginlist.clear(); +} + +void DateBookHoliday::init() +{ + deinit(); + QString path = QPEApplication::qpeDir() + "plugins/datebook/holiday"; + QDir dir( path, "lib*.so" ); + QStringList list = dir.entryList(); + QStringList::Iterator it; + for (it=list.begin();it!=list.end();++it) { + Opie::Datebook::HolidayPluginIf*hif = 0; + QLibrary*lib=new QLibrary(path+"/"+*it); + if ((lib->queryInterface(IID_HOLIDAY_PLUGIN,(QUnknownInterface**)&hif) == QS_OK) && hif) { + Opie::Datebook::HolidayPlugin*pl = hif->plugin(); + if (pl) { + HPlugin*_pl=new HPlugin; + _pl->_plugin = pl; + odebug << "Found holiday " << pl->description()<<oendl; + _pl->_lib = lib; + _pl->_if = hif; + _pluginlist.append(_pl); + } else { + } + } else { + delete lib; + } + } +} + +QStringList DateBookHoliday::holidaylist(const QDate&aDate) +{ + QStringList ret; + QValueList<HPlugin*>::Iterator it; + for (it=_pluginlist.begin();it!=_pluginlist.end();++it) { + HPlugin*_pl = *it; + ret+=_pl->_plugin->entries(aDate); + } + return ret; +} + +QStringList DateBookHoliday::holidaylist(unsigned year, unsigned month, unsigned day) +{ + return holidaylist(QDate(year,month,day)); +} + diff --git a/core/pim/datebook/datebook.h b/core/pim/datebook/datebook.h index d7cfb33..54ffcfb 100644 --- a/core/pim/datebook/datebook.h +++ b/core/pim/datebook/datebook.h @@ -1,139 +1,168 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef DATEBOOK_H #define DATEBOOK_H #include <qpe/datebookdb.h> #include <qmainwindow.h> -enum { DAY=1,WEEK,WEEKLST,MONTH }; // defaultView values -enum { NONE=0,NORMAL,EXTENDED }; // WeekLstView's modes. +enum { DAY=1,WEEK,WEEKLST,MONTH }; // defaultView values +enum { NONE=0,NORMAL,EXTENDED }; // WeekLstView's modes. class QAction; class QWidgetStack; class DateBookDay; class DateBookWeek; class DateBookWeekLst; class DateBookMonth; class Event; class QDate; class Ir; +class QLibrary; + +namespace Opie { +namespace Datebook { + class HolidayPlugin; + class HolidayPluginIf; +} +} class DateBookDBHack : public DateBookDB { public: Event eventByUID(int id); }; +class DateBookHoliday +{ +public: + DateBookHoliday(); + virtual ~DateBookHoliday(); + + QStringList holidaylist(const QDate&); + QStringList holidaylist(unsigned year, unsigned month, unsigned day); +protected: + void init(); + void deinit(); + + struct HPlugin { + Opie::Datebook::HolidayPlugin*_plugin; + QLibrary*_lib; + Opie::Datebook::HolidayPluginIf*_if; + }; + QValueList<HPlugin*>_pluginlist; +}; + class DateBook : public QMainWindow { Q_OBJECT public: - static QString appName() { return QString::fromLatin1("datebook"); } + static QString appName() { return QString::fromLatin1("datebook"); } DateBook( QWidget *parent = 0, const char *name = 0, WFlags f = 0 ); ~DateBook(); signals: void newEvent(); void signalNotFound(); void signalWrapAround(); protected: QDate currentDate(); void timerEvent( QTimerEvent *e ); void closeEvent( QCloseEvent *e ); void view(int v, const QDate &d); public slots: void flush(); void reload(); private slots: void fileNew(); void slotNewEntry(const QDateTime &start, const QDateTime &end, const QString &str, const QString &location=0); void slotSettings(); - void slotToday(); // view today + void slotToday(); // view today void changeClock( bool newClock ); void changeWeek( bool newDay ); void appMessage(const QCString& msg, const QByteArray& data); // handle key events in the day view... void slotNewEventFromKey( const QString &str ); void slotFind(); void slotDoFind( const QString &, const QDate &, bool, bool, int ); void viewDefault(const QDate &d); void viewDay(); void viewWeek(); void viewWeekLst(); void viewMonth(); void showDay( int y, int m, int d ); - void insertEvent( const Event &e ); - void editEvent( const Event &e ); + void insertEvent( const Event &e ); + void editEvent( const Event &e ); void duplicateEvent( const Event &e ); void removeEvent( const Event &e ); void receive( const QCString &msg, const QByteArray &data ); void setDocument( const QString & ); void beamEvent( const Event &e ); void beamDone( Ir *ir ); private: void addEvent( const Event &e ); void initDay(); void initWeek(); void initWeekLst(); void initMonth(); void loadSettings(); void saveSettings(); private: - DateBookDBHack *db; - QWidgetStack *views; - DateBookDay *dayView; - DateBookWeek *weekView; - DateBookMonth *monthView; - DateBookWeekLst *weekLstView; - QAction *dayAction, *weekAction, *weekLstAction, *monthAction; - int weeklistviewconfig; - bool aPreset; // have everything set to alarm? - int presetTime; // the standard time for the alarm - int startTime; - int rowStyle; - int defaultView; - QArray<int> defaultCategories; - QString defaultLocation; - bool bJumpToCurTime; //should jump to current time in dayview? - bool ampm; - bool onMonday; - - bool syncing; - bool inSearch; - - int alarmCounter; + DateBookDBHack *db; + DateBookHoliday*db_holiday; + QWidgetStack *views; + DateBookDay *dayView; + DateBookWeek *weekView; + DateBookMonth *monthView; + DateBookWeekLst *weekLstView; + QAction *dayAction, *weekAction, *weekLstAction, *monthAction; + int weeklistviewconfig; + bool aPreset; // have everything set to alarm? + int presetTime; // the standard time for the alarm + int startTime; + int rowStyle; + int defaultView; + QArray<int> defaultCategories; + QString defaultLocation; + bool bJumpToCurTime; //should jump to current time in dayview? + bool ampm; + bool onMonday; + + bool syncing; + bool inSearch; + + int alarmCounter; QString checkEvent(const Event &); }; #endif diff --git a/core/pim/datebook/datebookday.cpp b/core/pim/datebook/datebookday.cpp index ca63dc5..dfe39e5 100644 --- a/core/pim/datebook/datebookday.cpp +++ b/core/pim/datebook/datebookday.cpp @@ -1,935 +1,945 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include "datebookday.h" #include "datebookdayheaderimpl.h" #include "datebookdayallday.h" +#include <opie2/oholidayplugin.h> #include <qpe/resource.h> #include <qpe/qpeapplication.h> #include <qpe/ir.h> #include <qsimplerichtext.h> #include <qpopupmenu.h> #include <qtimer.h> DateBookDayView::DateBookDayView( bool whichClock, QWidget *parent, const char *name ) : QTable( 24, 1, parent, name ), ampm( whichClock ), currDate( QDate::currentDate() ) { - enableClipper(TRUE); - setTopMargin( 0 ); - horizontalHeader()->hide(); - setLeftMargin(38); - setColumnStretchable( 0, TRUE ); - setHScrollBarMode( QScrollView::AlwaysOff ); - verticalHeader()->setPalette(white); - verticalHeader()->setResizeEnabled(FALSE); - setSelectionMode( Single ); - - // get rid of being able to edit things... - QTableItem *tmp; - int row; - for ( row = 0; row < numRows(); row++ ) { - tmp = new QTableItem( this, QTableItem::Never, QString::null); - setItem( row, 0, tmp ); - //setRowHeight( row, 40); - } - - initHeader(); - QObject::connect( qApp, SIGNAL(clockChanged(bool)), this, SLOT(slotChangeClock(bool)) ); + enableClipper(TRUE); + setTopMargin( 0 ); + horizontalHeader()->hide(); + setLeftMargin(38); + setColumnStretchable( 0, TRUE ); + setHScrollBarMode( QScrollView::AlwaysOff ); + verticalHeader()->setPalette(white); + verticalHeader()->setResizeEnabled(FALSE); + setSelectionMode( Single ); + + // get rid of being able to edit things... + QTableItem *tmp; + int row; + for ( row = 0; row < numRows(); row++ ) { + tmp = new QTableItem( this, QTableItem::Never, QString::null); + setItem( row, 0, tmp ); + //setRowHeight( row, 40); + } + + initHeader(); + QObject::connect( qApp, SIGNAL(clockChanged(bool)), this, SLOT(slotChangeClock(bool)) ); } void DateBookDayView::initHeader() { - QString strTmp; - int preferredWidth = 0; - for ( int i = 0; i < 24; ++i ) { - if ( ampm ) { - if ( i == 0 ) - strTmp = QString::number(12) + ":00"; - else if ( i == 12 ) - strTmp = QString::number(12) + tr(":00p"); - else if ( i > 12 ) - strTmp = QString::number( i - 12 ) + tr(":00p"); - else - strTmp = QString::number(i) + ":00"; - } else { - if ( i < 10 ) - strTmp = "0" + QString::number(i) + ":00"; - else - strTmp = QString::number(i) + ":00"; - } - strTmp = strTmp.rightJustify( 6, ' ' ); - verticalHeader()->setLabel( i, strTmp ); - - // Compute correct width for current Font (Add some space right) - int actWidth = QFontMetrics( QFont::defaultFont() ).width( strTmp + QString(" ") ); - if ( preferredWidth < actWidth ) - preferredWidth = actWidth; - setRowStretchable( i, FALSE ); - } - - // It seems as if the header has a bug. It does not resize - // correct horizontally if it is used vertical.. - // Thus, we do it manually.. - setLeftMargin( preferredWidth ); + QString strTmp; + int preferredWidth = 0; + for ( int i = 0; i < 24; ++i ) { + if ( ampm ) { + if ( i == 0 ) + strTmp = QString::number(12) + ":00"; + else if ( i == 12 ) + strTmp = QString::number(12) + tr(":00p"); + else if ( i > 12 ) + strTmp = QString::number( i - 12 ) + tr(":00p"); + else + strTmp = QString::number(i) + ":00"; + } else { + if ( i < 10 ) + strTmp = "0" + QString::number(i) + ":00"; + else + strTmp = QString::number(i) + ":00"; + } + strTmp = strTmp.rightJustify( 6, ' ' ); + verticalHeader()->setLabel( i, strTmp ); + + // Compute correct width for current Font (Add some space right) + int actWidth = QFontMetrics( QFont::defaultFont() ).width( strTmp + QString(" ") ); + if ( preferredWidth < actWidth ) + preferredWidth = actWidth; + setRowStretchable( i, FALSE ); + } + + // It seems as if the header has a bug. It does not resize + // correct horizontally if it is used vertical.. + // Thus, we do it manually.. + setLeftMargin( preferredWidth ); } void DateBookDayView::slotDateChanged( int y, int m, int d ) { - currDate.setYMD(y,m,d); + currDate.setYMD(y,m,d); } void DateBookDayView::slotChangeClock( bool newClock ) { - ampm = newClock; - initHeader(); + ampm = newClock; + initHeader(); } bool DateBookDayView::whichClock() const { - return ampm; + return ampm; } void DateBookDayView::moveUp() { - scrollBy(0, -20); + scrollBy(0, -20); } void DateBookDayView::moveDown() { - scrollBy(0, 20); + scrollBy(0, 20); } void DateBookDayView::paintCell( QPainter *p, int, int, const QRect &cr, bool ) { - int w = cr.width(); - int h = cr.height(); - p->fillRect( 0, 0, w, h, colorGroup().brush( QColorGroup::Base ) ); - if ( showGrid() ) { - // Draw our lines - int x2 = w - 1; - int y2 = h - 1; - QPen pen( p->pen() ); - p->setPen( colorGroup().dark() ); - p->drawLine( x2, 0, x2, y2 ); - p->drawLine( 0, y2, x2, y2 ); - - p->setPen( colorGroup().midlight() ); - p->drawLine( 0, y2 - h/2, x2, y2 - h/2); - - p->setPen( pen ); + int w = cr.width(); + int h = cr.height(); + p->fillRect( 0, 0, w, h, colorGroup().brush( QColorGroup::Base ) ); + if ( showGrid() ) { + // Draw our lines + int x2 = w - 1; + int y2 = h - 1; + QPen pen( p->pen() ); + p->setPen( colorGroup().dark() ); + p->drawLine( x2, 0, x2, y2 ); + p->drawLine( 0, y2, x2, y2 ); + + p->setPen( colorGroup().midlight() ); + p->drawLine( 0, y2 - h/2, x2, y2 - h/2); + + p->setPen( pen ); } } void DateBookDayView::paintFocus( QPainter *, const QRect & ) { } void DateBookDayView::resizeEvent( QResizeEvent *e ) { - QTable::resizeEvent( e ); - columnWidthChanged( 0 ); - emit sigColWidthChanged(); + QTable::resizeEvent( e ); + columnWidthChanged( 0 ); + emit sigColWidthChanged(); } void DateBookDayView::keyPressEvent( QKeyEvent *e ) { - QString txt = e->text(); - if ( !txt.isNull() && txt[0] > ' ' && e->key() < 0x1000 ) { - // we this is some sort of thing we know about... - e->accept(); - emit sigCapturedKey( txt ); + QString txt = e->text(); + if ( !txt.isNull() && txt[0] > ' ' && e->key() < 0x1000 ) { + // we this is some sort of thing we know about... + e->accept(); + emit sigCapturedKey( txt ); } else { - // I don't know what this key is, do you? - e->ignore(); - } + // I don't know what this key is, do you? + e->ignore(); + } } void DateBookDayView::setRowStyle( int style ) { - if (style<0) style = 0; + if (style<0) style = 0; - for (int i=0; i<numRows(); i++) - setRowHeight(i, style*10+20); + for (int i=0; i<numRows(); i++) + setRowHeight(i, style*10+20); } void DateBookDayView::contentsMouseReleaseEvent( QMouseEvent* /* e */ ) { - int sh=99,eh=-1; + int sh=99,eh=-1; - for(int i=0;i<this->numSelections();i++) { - QTableSelection sel = this->selection( i ); - sh = QMIN(sh,sel.topRow()); - eh = QMAX(sh,sel.bottomRow()+1); - } - if (sh > 23 || eh < 1) { - sh=8; - eh=9; - } + for(int i=0;i<this->numSelections();i++) { + QTableSelection sel = this->selection( i ); + sh = QMIN(sh,sel.topRow()); + eh = QMAX(sh,sel.bottomRow()+1); + } + if (sh > 23 || eh < 1) { + sh=8; + eh=9; + } - quickLineEdit=new DateBookDayViewQuickLineEdit(QDateTime(currDate,QTime(sh,0,0,0)),QDateTime(currDate,QTime(eh,0,0,0)),this->viewport(),"quickedit"); - quickLineEdit->setGeometry(0,0,this->columnWidth(0)-1,this->rowHeight(0)); - this->moveChild(quickLineEdit,0,sh*this->rowHeight(0)); - quickLineEdit->setFocus(); - quickLineEdit->show(); + quickLineEdit=new DateBookDayViewQuickLineEdit(QDateTime(currDate,QTime(sh,0,0,0)),QDateTime(currDate,QTime(eh,0,0,0)),this->viewport(),"quickedit"); + quickLineEdit->setGeometry(0,0,this->columnWidth(0)-1,this->rowHeight(0)); + this->moveChild(quickLineEdit,0,sh*this->rowHeight(0)); + quickLineEdit->setFocus(); + quickLineEdit->show(); } //=========================================================================== DateBookDayViewQuickLineEdit::DateBookDayViewQuickLineEdit(const QDateTime &start, const QDateTime &end,QWidget * parent, const char *name) : QLineEdit(parent,name) { - active=1; - quickEvent.setStart(start); - quickEvent.setEnd(end); - connect(this,SIGNAL(returnPressed()),this,SLOT(slotReturnPressed())); + active=1; + quickEvent.setStart(start); + quickEvent.setEnd(end); + connect(this,SIGNAL(returnPressed()),this,SLOT(slotReturnPressed())); } void DateBookDayViewQuickLineEdit::slotReturnPressed() { - if(active && (!this->text().isEmpty())) { // Fix to avoid having this event beeing added multiple times. - quickEvent.setDescription(this->text()); - connect(this,SIGNAL(insertEvent(const Event&)),this->topLevelWidget(),SLOT(insertEvent(const Event&))); - emit(insertEvent(quickEvent)); - active=0; - } + if(active && (!this->text().isEmpty())) { // Fix to avoid having this event beeing added multiple times. + quickEvent.setDescription(this->text()); + connect(this,SIGNAL(insertEvent(const Event&)),this->topLevelWidget(),SLOT(insertEvent(const Event&))); + emit(insertEvent(quickEvent)); + active=0; + } /* we need to return to this object.. */ - QTimer::singleShot(500, this, SLOT(finallyCallClose()) ); // Close and also delete this widget + QTimer::singleShot(500, this, SLOT(finallyCallClose()) ); // Close and also delete this widget } void DateBookDayViewQuickLineEdit::finallyCallClose() { close(true); // also deletes this widget... } void DateBookDayViewQuickLineEdit::focusOutEvent ( QFocusEvent* /* e */) { - slotReturnPressed(); // Reuse code to add event and close this widget. + slotReturnPressed(); // Reuse code to add event and close this widget. } //=========================================================================== -DateBookDay::DateBookDay( bool ampm, bool startOnMonday, DateBookDB *newDb, QWidget *parent, const char *name ) +DateBookDay::DateBookDay( bool ampm, bool startOnMonday, DateBookDB *newDb, DateBookHoliday*newHdb, QWidget *parent, const char *name ) : QVBox( parent, name ), currDate( QDate::currentDate() ), db( newDb ), startTime( 0 ) { - widgetList.setAutoDelete( true ); - header = new DateBookDayHeader( startOnMonday, this, "day header" ); - header->setDate( currDate.year(), currDate.month(), currDate.day() ); + widgetList.setAutoDelete( true ); + _holiday_db = newHdb; + header = new DateBookDayHeader( startOnMonday, this, "day header" ); + header->setDate( currDate.year(), currDate.month(), currDate.day() ); - m_allDays = new DatebookdayAllday(newDb, this, "all day event list" ); - m_allDays->hide(); + m_allDays = new DatebookdayAllday(newDb, this, "all day event list" ); + m_allDays->hide(); - view = new DateBookDayView( ampm, this, "day view" ); + view = new DateBookDayView( ampm, this, "day view" ); - connect( header, SIGNAL( dateChanged(int,int,int) ), this, SLOT( dateChanged(int,int,int) ) ); - connect( header, SIGNAL( dateChanged(int,int,int) ), view, SLOT( slotDateChanged(int,int,int) ) ); - connect( view, SIGNAL( sigColWidthChanged() ), this, SLOT( slotColWidthChanged() ) ); - connect( qApp, SIGNAL(weekChanged(bool)), this, SLOT(slotWeekChanged(bool)) ); - connect( view, SIGNAL(sigCapturedKey(const QString&)), this, SIGNAL(sigNewEvent(const QString&)) ); + connect( header, SIGNAL( dateChanged(int,int,int) ), this, SLOT( dateChanged(int,int,int) ) ); + connect( header, SIGNAL( dateChanged(int,int,int) ), view, SLOT( slotDateChanged(int,int,int) ) ); + connect( view, SIGNAL( sigColWidthChanged() ), this, SLOT( slotColWidthChanged() ) ); + connect( qApp, SIGNAL(weekChanged(bool)), this, SLOT(slotWeekChanged(bool)) ); + connect( view, SIGNAL(sigCapturedKey(const QString&)), this, SIGNAL(sigNewEvent(const QString&)) ); - QTimer *timer = new QTimer( this ); + QTimer *timer = new QTimer( this ); - connect( timer, SIGNAL(timeout()), this, SLOT(updateView()) ); //connect timer for updating timeMarker & daywidgetcolors - timer->start( 1000*60*5, FALSE ); //update every 5min + connect( timer, SIGNAL(timeout()), this, SLOT(updateView()) ); //connect timer for updating timeMarker & daywidgetcolors + timer->start( 1000*60*5, FALSE ); //update every 5min - selectedWidget = 0; + selectedWidget = 0; - timeMarker = new DateBookDayTimeMarker( this ); - timeMarker->setTime( QTime::currentTime() ); - rowStyle = -1; // initialize with bogus values + timeMarker = new DateBookDayTimeMarker( this ); + timeMarker->setTime( QTime::currentTime() ); + rowStyle = -1; // initialize with bogus values jumpToCurTime = false; } void DateBookDay::setJumpToCurTime( bool bJump ) { - jumpToCurTime = bJump; + jumpToCurTime = bJump; } void DateBookDay::setRowStyle( int style ) { - if (rowStyle != style) view->setRowStyle( style ); - rowStyle = style; + if (rowStyle != style) view->setRowStyle( style ); + rowStyle = style; } void DateBookDay::updateView( void ) { - timeMarker->setTime( QTime::currentTime() ); - //need to find a way to update all DateBookDayWidgets + timeMarker->setTime( QTime::currentTime() ); + //need to find a way to update all DateBookDayWidgets } void DateBookDay::setSelectedWidget( DateBookDayWidget *w ) { - selectedWidget = w; + selectedWidget = w; } DateBookDayWidget * DateBookDay::getSelectedWidget( void ) { - return selectedWidget; + return selectedWidget; } void DateBookDay::selectedDates( QDateTime &start, QDateTime &end ) { - start.setDate( currDate ); - end.setDate( currDate ); + start.setDate( currDate ); + end.setDate( currDate ); - int sh=99,eh=-1; + int sh=99,eh=-1; - int n = dayView()->numSelections(); + int n = dayView()->numSelections(); - for (int i=0; i<n; i++) { - QTableSelection sel = dayView()->selection( i ); - sh = QMIN(sh,sel.topRow()); - eh = QMAX(sh,sel.bottomRow()+1); - } + for (int i=0; i<n; i++) { + QTableSelection sel = dayView()->selection( i ); + sh = QMIN(sh,sel.topRow()); + eh = QMAX(sh,sel.bottomRow()+1); + } - if (sh > 23 || eh < 1) { - sh=8; - eh=9; - } + if (sh > 23 || eh < 1) { + sh=8; + eh=9; + } - start.setTime( QTime( sh, 0, 0 ) ); - end.setTime( QTime( eh, 0, 0 ) ); + start.setTime( QTime( sh, 0, 0 ) ); + end.setTime( QTime( eh, 0, 0 ) ); } void DateBookDay::setDate( int y, int m, int d ) { - header->setDate( y, m, d ); - selectedWidget = 0; + header->setDate( y, m, d ); + selectedWidget = 0; } void DateBookDay::setDate( QDate d) { - header->setDate( d.year(), d.month(), d.day() ); - selectedWidget = 0; + header->setDate( d.year(), d.month(), d.day() ); + selectedWidget = 0; } void DateBookDay::dateChanged( int y, int m, int d ) { - QDate date( y, m, d ); - if ( currDate == date ) - return; - currDate.setYMD( y, m, d ); - relayoutPage(); - dayView()->clearSelection(); - QTableSelection ts; - - if (jumpToCurTime && this->date() == QDate::currentDate()) - { - ts.init( QTime::currentTime().hour(), 0); - ts.expandTo( QTime::currentTime().hour(), 0); - } else { - ts.init( startTime, 0 ); - ts.expandTo( startTime, 0 ); - } + QDate date( y, m, d ); + if ( currDate == date ) + return; + currDate.setYMD( y, m, d ); + relayoutPage(); + dayView()->clearSelection(); + QTableSelection ts; + + if (jumpToCurTime && this->date() == QDate::currentDate()) + { + ts.init( QTime::currentTime().hour(), 0); + ts.expandTo( QTime::currentTime().hour(), 0); + } else { + ts.init( startTime, 0 ); + ts.expandTo( startTime, 0 ); + } - dayView()->addSelection( ts ); - selectedWidget = 0; + dayView()->addSelection( ts ); + selectedWidget = 0; } void DateBookDay::redraw() { - if ( isUpdatesEnabled() ) - relayoutPage(); + if ( isUpdatesEnabled() ) + relayoutPage(); } void DateBookDay::getEvents() { - widgetList.clear(); + widgetList.clear(); /* clear the AllDay List */ m_allDays->hide(); // just in case m_allDays->removeAllEvents(); - QValueList<EffectiveEvent> eventList = db->getEffectiveEvents( currDate, currDate ); - QValueListIterator<EffectiveEvent> it; - QObject* object = 0; - for ( it = eventList.begin(); it != eventList.end(); ++it ) { - EffectiveEvent ev=*it; - if(!((ev.end().hour()==0) && (ev.end().minute()==0) && (ev.startDate()!=ev.date()))) { // Skip events ending at 00:00 starting at another day. + QStringList hdays = _holiday_db->holidaylist(currDate); + QStringList::Iterator sit; + QObject* object = 0; + for (sit=hdays.begin();sit!=hdays.end();++sit) { + object = m_allDays->addHoliday(*sit); + if (!object) continue; + /* not to do something with it */ + } + QValueList<EffectiveEvent> eventList = db->getEffectiveEvents( currDate, currDate ); + QValueListIterator<EffectiveEvent> it; + + for ( it = eventList.begin(); it != eventList.end(); ++it ) { + EffectiveEvent ev=*it; + if(!((ev.end().hour()==0) && (ev.end().minute()==0) && (ev.startDate()!=ev.date()))) { // Skip events ending at 00:00 starting at another day. if (ev.event().type() == Event::AllDay ) { object = m_allDays->addEvent( ev ); if (!object) continue; }else { - DateBookDayWidget* w = new DateBookDayWidget( *it, this ); + DateBookDayWidget* w = new DateBookDayWidget( *it, this ); widgetList.append( w ); object = w; } connect( object, SIGNAL( deleteMe(const Event&) ), this, SIGNAL( removeEvent(const Event&) ) ); connect( object, SIGNAL( duplicateMe(const Event&) ), this, SIGNAL( duplicateEvent(const Event&) ) ); connect( object, SIGNAL( editMe(const Event&) ), this, SIGNAL( editEvent(const Event&) ) ); connect( object, SIGNAL( beamMe(const Event&) ), this, SIGNAL( beamEvent(const Event&) ) ); - } - } + } + } } static int place( const DateBookDayWidget *item, bool *used, int maxn ) { - int place = 0; - int start = item->event().start().hour(); - QTime e = item->event().end(); - int end = e.hour(); - if ( e.minute() < 5 ) - end--; - if ( end < start ) - end = start; - while ( place < maxn ) { - bool free = TRUE; - int s = start; - while( s <= end ) { - if ( used[10*s+place] ) { - free = FALSE; - break; - } - s++; - } - if ( free ) - break; - place++; - } - if ( place == maxn ) { - return -1; - } - while( start <= end ) { - used[10*start+place] = TRUE; - start++; - } - return place; + int place = 0; + int start = item->event().start().hour(); + QTime e = item->event().end(); + int end = e.hour(); + if ( e.minute() < 5 ) + end--; + if ( end < start ) + end = start; + while ( place < maxn ) { + bool free = TRUE; + int s = start; + while( s <= end ) { + if ( used[10*s+place] ) { + free = FALSE; + break; + } + s++; + } + if ( free ) + break; + place++; + } + if ( place == maxn ) { + return -1; + } + while( start <= end ) { + used[10*start+place] = TRUE; + start++; + } + return place; } void DateBookDay::relayoutPage( bool fromResize ) { - setUpdatesEnabled( FALSE ); - if ( !fromResize ) { - getEvents(); // no need we already have them! + setUpdatesEnabled( FALSE ); + if ( !fromResize ) { + getEvents(); // no need we already have them! if (m_allDays->items() > 0 ) m_allDays->show(); /* * else if ( m_allDays->items() == 0 ) already hide in getEvents */ } - widgetList.sort(); - //sorts the widgetList by the heights of the widget so that the tallest widgets are at the beginning - //this is needed for the simple algo below to work correctly, otherwise some widgets would be drawn outside the view - - int wCount = widgetList.count(); - int wid = view->columnWidth(0)-1; - int wd; - int n = 1; - - QArray<int> anzIntersect(wCount); //this stores the number of maximal intersections of each widget - - for (int i = 0; i<wCount; anzIntersect[i] = 1, i++); - - if ( wCount < 20 ) { - - QArray<QRect> geometries(wCount); - for (int i = 0; i < wCount; geometries[i] = widgetList.at(i)->geometry(), i++); //stores geometry for each widget in vector - - for ( int i = 0; i < wCount; i++) { - QValueList<int> intersectedWidgets; - - //find all widgets intersecting with widgetList.at(i) - for ( int j = 0; j < wCount; j++) { - if (i != j) - if (geometries[j].intersects(geometries[i])) - intersectedWidgets.append(j); - } - - //for each of these intersecting widgets find out how many widgets are they intersecting with - for ( uint j = 0; j < intersectedWidgets.count(); j++) - { - QArray<int> inter(wCount); - inter[j]=1; - - if (intersectedWidgets[j] != -1) - for ( uint k = j; k < intersectedWidgets.count(); k++) { - if (j != k && intersectedWidgets[k] != -1) - if (geometries[intersectedWidgets[k]].intersects(geometries[intersectedWidgets[j]])) { - inter[j]++; - intersectedWidgets[k] = -1; - } - if (inter[j] > anzIntersect[i]) anzIntersect[i] = inter[j] + 1; - } - } - if (anzIntersect[i] == 1 && intersectedWidgets.count()) anzIntersect[i]++; - } - - - for ( int i = 0; i < wCount; i++) { - DateBookDayWidget *w = widgetList.at(i); - QRect geom = w->geometry(); - geom.setX( 0 ); - wd = (view->columnWidth(0)-1) / anzIntersect[i] - (anzIntersect[i]>1?2:0); - geom.setWidth( wd ); - while ( intersects( w, geom ) ) { - geom.moveBy( wd + 2 + 1, 0 ); - } - w->setGeometry( geom ); - } - - if (jumpToCurTime && this->date() == QDate::currentDate()) { - view->setContentsPos( 0, QTime::currentTime().hour() * view->rowHeight(0) ); //set listview to current hour - } else { - view->setContentsPos( 0, startTime * view->rowHeight(0) ); - } - } else { - int hours[24]; - memset( hours, 0, 24*sizeof( int ) ); - bool overFlow = FALSE; - for ( int i = 0; i < wCount; i++ ) { - DateBookDayWidget *w = widgetList.at(i); - int start = w->event().start().hour(); - QTime e = w->event().end(); - int end = e.hour(); - if ( e.minute() < 5 ) - end--; - if ( end < start ) - end = start; - while( start <= end ) { - hours[start]++; - if ( hours[start] >= 10 ) - overFlow = TRUE; - ++start; - } - if ( overFlow ) - break; - } - for ( int i = 0; i < 24; i++ ) { - n = QMAX( n, hours[i] ); - } - wid = ( view->columnWidth(0)-1 ) / n; - - bool used[24*10]; - memset( used, FALSE, 24*10*sizeof( bool ) ); - - for ( int i = 0; i < wCount; i++ ) { - DateBookDayWidget *w = widgetList.at(i); - int xp = place( w, used, n ); - if ( xp != -1 ) { - QRect geom = w->geometry(); - geom.setX( xp*(wid+2) ); - geom.setWidth( wid ); - w->setGeometry( geom ); - } - } - - if (jumpToCurTime && this->date() == QDate::currentDate()) { - view->setContentsPos( 0, QTime::currentTime().hour() * view->rowHeight(0) ); //set listview to current hour - } else { - view->setContentsPos( 0, startTime * view->rowHeight(0) ); - } - } - - timeMarker->setTime( QTime::currentTime() ); //display timeMarker - timeMarker->raise(); //on top of all widgets - if (this->date() == QDate::currentDate()) { //only show timeMarker on current day - timeMarker->show(); - } else { - timeMarker->hide(); - } - setUpdatesEnabled( TRUE ); - return; + widgetList.sort(); + //sorts the widgetList by the heights of the widget so that the tallest widgets are at the beginning + //this is needed for the simple algo below to work correctly, otherwise some widgets would be drawn outside the view + + int wCount = widgetList.count(); + int wid = view->columnWidth(0)-1; + int wd; + int n = 1; + + QArray<int> anzIntersect(wCount); //this stores the number of maximal intersections of each widget + + for (int i = 0; i<wCount; anzIntersect[i] = 1, i++); + + if ( wCount < 20 ) { + + QArray<QRect> geometries(wCount); + for (int i = 0; i < wCount; geometries[i] = widgetList.at(i)->geometry(), i++); //stores geometry for each widget in vector + + for ( int i = 0; i < wCount; i++) { + QValueList<int> intersectedWidgets; + + //find all widgets intersecting with widgetList.at(i) + for ( int j = 0; j < wCount; j++) { + if (i != j) + if (geometries[j].intersects(geometries[i])) + intersectedWidgets.append(j); + } + + //for each of these intersecting widgets find out how many widgets are they intersecting with + for ( uint j = 0; j < intersectedWidgets.count(); j++) + { + QArray<int> inter(wCount); + inter[j]=1; + + if (intersectedWidgets[j] != -1) + for ( uint k = j; k < intersectedWidgets.count(); k++) { + if (j != k && intersectedWidgets[k] != -1) + if (geometries[intersectedWidgets[k]].intersects(geometries[intersectedWidgets[j]])) { + inter[j]++; + intersectedWidgets[k] = -1; + } + if (inter[j] > anzIntersect[i]) anzIntersect[i] = inter[j] + 1; + } + } + if (anzIntersect[i] == 1 && intersectedWidgets.count()) anzIntersect[i]++; + } + + + for ( int i = 0; i < wCount; i++) { + DateBookDayWidget *w = widgetList.at(i); + QRect geom = w->geometry(); + geom.setX( 0 ); + wd = (view->columnWidth(0)-1) / anzIntersect[i] - (anzIntersect[i]>1?2:0); + geom.setWidth( wd ); + while ( intersects( w, geom ) ) { + geom.moveBy( wd + 2 + 1, 0 ); + } + w->setGeometry( geom ); + } + + if (jumpToCurTime && this->date() == QDate::currentDate()) { + view->setContentsPos( 0, QTime::currentTime().hour() * view->rowHeight(0) ); //set listview to current hour + } else { + view->setContentsPos( 0, startTime * view->rowHeight(0) ); + } + } else { + int hours[24]; + memset( hours, 0, 24*sizeof( int ) ); + bool overFlow = FALSE; + for ( int i = 0; i < wCount; i++ ) { + DateBookDayWidget *w = widgetList.at(i); + int start = w->event().start().hour(); + QTime e = w->event().end(); + int end = e.hour(); + if ( e.minute() < 5 ) + end--; + if ( end < start ) + end = start; + while( start <= end ) { + hours[start]++; + if ( hours[start] >= 10 ) + overFlow = TRUE; + ++start; + } + if ( overFlow ) + break; + } + for ( int i = 0; i < 24; i++ ) { + n = QMAX( n, hours[i] ); + } + wid = ( view->columnWidth(0)-1 ) / n; + + bool used[24*10]; + memset( used, FALSE, 24*10*sizeof( bool ) ); + + for ( int i = 0; i < wCount; i++ ) { + DateBookDayWidget *w = widgetList.at(i); + int xp = place( w, used, n ); + if ( xp != -1 ) { + QRect geom = w->geometry(); + geom.setX( xp*(wid+2) ); + geom.setWidth( wid ); + w->setGeometry( geom ); + } + } + + if (jumpToCurTime && this->date() == QDate::currentDate()) { + view->setContentsPos( 0, QTime::currentTime().hour() * view->rowHeight(0) ); //set listview to current hour + } else { + view->setContentsPos( 0, startTime * view->rowHeight(0) ); + } + } + + timeMarker->setTime( QTime::currentTime() ); //display timeMarker + timeMarker->raise(); //on top of all widgets + if (this->date() == QDate::currentDate()) { //only show timeMarker on current day + timeMarker->show(); + } else { + timeMarker->hide(); + } + setUpdatesEnabled( TRUE ); + return; } DateBookDayWidget *DateBookDay::intersects( const DateBookDayWidget *item, const QRect &geom ) { - int i = 0; - DateBookDayWidget *w = widgetList.at(i); - int wCount = widgetList.count(); - while ( i < wCount && w != item ) { - if ( w->geometry().intersects( geom ) ) { - return w; - } - w = widgetList.at(++i); - } + int i = 0; + DateBookDayWidget *w = widgetList.at(i); + int wCount = widgetList.count(); + while ( i < wCount && w != item ) { + if ( w->geometry().intersects( geom ) ) { + return w; + } + w = widgetList.at(++i); + } - return 0; + return 0; } QDate DateBookDay::date() const { - return currDate; + return currDate; } void DateBookDay::setStartViewTime( int startHere ) { - startTime = startHere; - dayView()->clearSelection(); - QTableSelection ts; + startTime = startHere; + dayView()->clearSelection(); + QTableSelection ts; - if (jumpToCurTime && this->date() == QDate::currentDate()) { //this should probably be in datebook.cpp where it's called? - ts.init( QTime::currentTime().hour(), 0); - ts.expandTo( QTime::currentTime().hour(), 0); + if (jumpToCurTime && this->date() == QDate::currentDate()) { //this should probably be in datebook.cpp where it's called? + ts.init( QTime::currentTime().hour(), 0); + ts.expandTo( QTime::currentTime().hour(), 0); } else { - ts.init( startTime, 0 ); - ts.expandTo( startTime, 0 ); - } + ts.init( startTime, 0 ); + ts.expandTo( startTime, 0 ); + } - dayView()->addSelection( ts ); + dayView()->addSelection( ts ); } int DateBookDay::startViewTime() const { - return startTime; + return startTime; } void DateBookDay::slotWeekChanged( bool bStartOnMonday ) { - header->setStartOfWeek( bStartOnMonday ); -// redraw(); + header->setStartOfWeek( bStartOnMonday ); +// redraw(); } void DateBookDay::keyPressEvent(QKeyEvent *e) { - switch(e->key()) { - case Key_Up: - view->moveUp(); - break; - case Key_Down: - view->moveDown(); - break; - case Key_Left: - setDate(QDate(currDate).addDays(-1)); - break; - case Key_Right: - setDate(QDate(currDate).addDays(1)); - break; - default: - e->ignore(); - } + switch(e->key()) { + case Key_Up: + view->moveUp(); + break; + case Key_Down: + view->moveDown(); + break; + case Key_Left: + setDate(QDate(currDate).addDays(-1)); + break; + case Key_Right: + setDate(QDate(currDate).addDays(1)); + break; + default: + e->ignore(); + } } //=========================================================================== DateBookDayWidget::DateBookDayWidget( const EffectiveEvent &e, DateBookDay *db ) - : QWidget( db->dayView()->viewport() ), ev( e ), dateBook( db ) + : QWidget( db->dayView()->viewport() ), ev( e ), dateBook( db ) { // why would someone use "<"? Oh well, fix it up... // I wonder what other things may be messed up... - QString strDesc = ev.description(); - int where = strDesc.find( "<" ); - while ( where != -1 ) { - strDesc.remove( where, 1 ); - strDesc.insert( where, "<" ); - where = strDesc.find( "<", where ); - } - - QString strCat; + QString strDesc = ev.description(); + int where = strDesc.find( "<" ); + while ( where != -1 ) { + strDesc.remove( where, 1 ); + strDesc.insert( where, "<" ); + where = strDesc.find( "<", where ); + } + + QString strCat; // ### Fix later... // QString strCat = ev.category(); // where = strCat.find( "<" ); // while ( where != -1 ) { -// strCat.remove( where, 1 ); -// strCat.insert( where, "<" ); -// where = strCat.find( "<", where ); +// strCat.remove( where, 1 ); +// strCat.insert( where, "<" ); +// where = strCat.find( "<", where ); // } - QString strNote = ev.notes(); - where = strNote.find( "<" ); - while ( where != -1 ) { - strNote.remove( where, 1 ); - strNote.insert( where, "<" ); - where = strNote.find( "<", where ); - } - - text = "<b>" + strDesc + "</b><br>" + "<i>"; - if ( !strCat.isEmpty() ) { - text += strCat + "</i><br>"; - } - if (ev.event().type() == Event::Normal ) { - setEventText( text ); - } else { - setAllDayText( text ); - } - - text += "<br><br>" + strNote; - - setBackgroundMode( PaletteBase ); - - QTime start = ev.start(); - QTime end = ev.end(); - int y = start.hour()*60+start.minute(); - int h = end.hour()*60+end.minute()-y; - int rh = dateBook->dayView()->rowHeight(0); - y = y*rh/60; - h = h*rh/60; - - if ( h < 12 ) h = 12; // Make sure the widget is no smaller than 12 pixels high, so that it's possible to read atleast the first line. - if ( y > ((24*rh)-12) ) y=(24*rh)-12; // Make sure the widget fits inside the dayview. - geom.setY( y ); - geom.setHeight( h ); - geom.setX( 0 ); - geom.setWidth(dateBook->dayView()->columnWidth(0)-1); + QString strNote = ev.notes(); + where = strNote.find( "<" ); + while ( where != -1 ) { + strNote.remove( where, 1 ); + strNote.insert( where, "<" ); + where = strNote.find( "<", where ); + } + + text = "<b>" + strDesc + "</b><br>" + "<i>"; + if ( !strCat.isEmpty() ) { + text += strCat + "</i><br>"; + } + if (ev.event().type() == Event::Normal ) { + setEventText( text ); + } else { + setAllDayText( text ); + } + + text += "<br><br>" + strNote; + + setBackgroundMode( PaletteBase ); + + QTime start = ev.start(); + QTime end = ev.end(); + int y = start.hour()*60+start.minute(); + int h = end.hour()*60+end.minute()-y; + int rh = dateBook->dayView()->rowHeight(0); + y = y*rh/60; + h = h*rh/60; + + if ( h < 12 ) h = 12; // Make sure the widget is no smaller than 12 pixels high, so that it's possible to read atleast the first line. + if ( y > ((24*rh)-12) ) y=(24*rh)-12; // Make sure the widget fits inside the dayview. + geom.setY( y ); + geom.setHeight( h ); + geom.setX( 0 ); + geom.setWidth(dateBook->dayView()->columnWidth(0)-1); } void DateBookDayWidget::setAllDayText( QString &text ) { - text += "<b>" + tr("This is an all day event.") + "</b>"; + text += "<b>" + tr("This is an all day event.") + "</b>"; } void DateBookDayWidget::setEventText( QString& text ) { - bool whichClock = dateBook->dayView()->whichClock(); - if ( ev.startDate() != ev.endDate() ) { - text += "<b>" + tr("Start") + "</b>: "; - text += TimeString::timeString( ev.event().start().time(), whichClock, FALSE ); - text += " - " + TimeString::longDateString( ev.startDate() ) + "<br>"; - text += "<b>" + tr("End") + "</b>: "; - text += TimeString::timeString( ev.event().end().time(), whichClock, FALSE ); - text += " - " + TimeString::longDateString( ev.endDate() ); - } else { - text += "<b>" + tr("Time") + "</b>: "; - text += TimeString::timeString( ev.start(), whichClock, FALSE ); - text += "<b>" + tr(" - ") + "</b>"; - text += TimeString::timeString( ev.end(), whichClock, FALSE ); - } + bool whichClock = dateBook->dayView()->whichClock(); + if ( ev.startDate() != ev.endDate() ) { + text += "<b>" + tr("Start") + "</b>: "; + text += TimeString::timeString( ev.event().start().time(), whichClock, FALSE ); + text += " - " + TimeString::longDateString( ev.startDate() ) + "<br>"; + text += "<b>" + tr("End") + "</b>: "; + text += TimeString::timeString( ev.event().end().time(), whichClock, FALSE ); + text += " - " + TimeString::longDateString( ev.endDate() ); + } else { + text += "<b>" + tr("Time") + "</b>: "; + text += TimeString::timeString( ev.start(), whichClock, FALSE ); + text += "<b>" + tr(" - ") + "</b>"; + text += TimeString::timeString( ev.end(), whichClock, FALSE ); + } } DateBookDayWidget::~DateBookDayWidget() { } void DateBookDayWidget::paintEvent( QPaintEvent *e ) { - QPainter p( this ); - - if (dateBook->getSelectedWidget() == this) { - p.setBrush( QColor( 155, 240, 230 ) ); // selected item - } else { - if (dateBook->date() == QDate::currentDate()) { - QTime curTime = QTime::currentTime(); - if (ev.end() < curTime) { - p.setBrush( QColor( 180, 180, 180 ) ); // grey, inactive - } else { - //change color in dependence of the time till the event starts - int duration = curTime.secsTo(ev.start()); - if (duration < 0) duration = 0; - int colChange = duration*160/86400; //86400: secs per day, 160: max color shift - p.setBrush( QColor( 200-colChange, 200-colChange, 255 ) ); //blue - } - } else { - p.setBrush( QColor( 220, 220, 220 ) ); //light grey, inactive (not current date) - //perhaps make a distinction between future/past dates - } - } - - p.setPen( QColor(100, 100, 100) ); - p.drawRect(rect()); + QPainter p( this ); + + if (dateBook->getSelectedWidget() == this) { + p.setBrush( QColor( 155, 240, 230 ) ); // selected item + } else { + if (dateBook->date() == QDate::currentDate()) { + QTime curTime = QTime::currentTime(); + if (ev.end() < curTime) { + p.setBrush( QColor( 180, 180, 180 ) ); // grey, inactive + } else { + //change color in dependence of the time till the event starts + int duration = curTime.secsTo(ev.start()); + if (duration < 0) duration = 0; + int colChange = duration*160/86400; //86400: secs per day, 160: max color shift + p.setBrush( QColor( 200-colChange, 200-colChange, 255 ) ); //blue + } + } else { + p.setBrush( QColor( 220, 220, 220 ) ); //light grey, inactive (not current date) + //perhaps make a distinction between future/past dates + } + } + + p.setPen( QColor(100, 100, 100) ); + p.drawRect(rect()); // p.drawRect(0,0, 5, height()); - int y = 0; - int d = 0; + int y = 0; + int d = 0; - if ( ev.event().hasAlarm() ) { - p.drawPixmap( width() - 16, 0, Resource::loadPixmap( "bell" ) ); - y = 20; - d = 20; - } + if ( ev.event().hasAlarm() ) { + p.drawPixmap( width() - 16, 0, Resource::loadPixmap( "bell" ) ); + y = 20; + d = 20; + } - if ( ev.event().hasRepeat() ) { - p.drawPixmap( width() - 16, y, Resource::loadPixmap( "repeat" ) ); - d = 20; - y += 20; - } + if ( ev.event().hasRepeat() ) { + p.drawPixmap( width() - 16, y, Resource::loadPixmap( "repeat" ) ); + d = 20; + y += 20; + } - QSimpleRichText rt( text, font() ); - rt.setWidth( geom.width() - d - 6 ); - rt.draw( &p, 7, 0, e->region(), colorGroup() ); + QSimpleRichText rt( text, font() ); + rt.setWidth( geom.width() - d - 6 ); + rt.draw( &p, 7, 0, e->region(), colorGroup() ); } /* * we need to find the real start date for a uid * we need to check from one day to another... */ QDate DateBookDay::findRealStart( int uid, const QDate& isIncluded , DateBookDB* db) { QDate dt( isIncluded ); QDate fnd = dt; bool doAgain = true; do{ dt = dt.addDays( -1 ); QValueList<EffectiveEvent> events = db->getEffectiveEvents( dt, dt ); for (QValueList<EffectiveEvent>::Iterator it = events.begin(); it != events.end(); ++it ) { EffectiveEvent ev = (*it); if ( uid == ev.event().uid() && ev.start() != QTime(0, 0, 0 ) ) return ev.date(); } }while (doAgain ); return fnd; } void DateBookDayWidget::mousePressEvent( QMouseEvent *e ) { - DateBookDayWidget *item; + DateBookDayWidget *item; - item = dateBook->getSelectedWidget(); - if (item) - item->update(); + item = dateBook->getSelectedWidget(); + if (item) + item->update(); - dateBook->setSelectedWidget(this); - update(); - dateBook->repaint(); + dateBook->setSelectedWidget(this); + update(); + dateBook->repaint(); Event eve = ev.event(); - QPopupMenu m; - m.insertItem( tr( "Edit" ), 1 ); - m.insertItem( tr( "Duplicate" ), 4 ); - m.insertItem( tr( "Delete" ), 2 ); - if(Ir::supported()) m.insertItem( tr( "Beam" ), 3 ); + QPopupMenu m; + m.insertItem( tr( "Edit" ), 1 ); + m.insertItem( tr( "Duplicate" ), 4 ); + m.insertItem( tr( "Delete" ), 2 ); + if(Ir::supported()) m.insertItem( tr( "Beam" ), 3 ); if(Ir::supported() && ev.event().doRepeat() ) m.insertItem( tr( "Beam this occurence"), 5 ); - int r = m.exec( e->globalPos() ); - if ( r == 1 ) { - emit editMe( eve ); - } else if ( r == 2 ) { - emit deleteMe( eve ); - } else if ( r == 3 ) { - emit beamMe( eve ); - } else if ( r == 4 ) { - emit duplicateMe( eve ); - } else if ( r == 5 ) { + int r = m.exec( e->globalPos() ); + if ( r == 1 ) { + emit editMe( eve ); + } else if ( r == 2 ) { + emit deleteMe( eve ); + } else if ( r == 3 ) { + emit beamMe( eve ); + } else if ( r == 4 ) { + emit duplicateMe( eve ); + } else if ( r == 5 ) { // create an Event and beam it... /* * Start with the easy stuff. If start and end date is the same we can just use * the values of effective events * If it is a multi day event we need to find the real start and end date... */ if ( ev.event().start().date() == ev.event().end().date() ) { Event event( ev.event() ); QDateTime dt( ev.date(), ev.start() ); event.setStart( dt ); dt.setTime( ev.end() ); event.setEnd( dt ); emit beamMe( event ); }else { /* * at least the the Times are right now */ QDateTime start( ev.event().start() ); QDateTime end ( ev.event().end () ); /* * ok we know the start date or we need to find it */ if ( ev.start() != QTime( 0, 0, 0 ) ) { start.setDate( ev.date() ); }else { QDate dt = DateBookDay::findRealStart( ev.event().uid(), ev.date(), dateBook->db ); start.setDate( dt ); } /* * ok we know now the end date... * else * get to know the offset btw the real start and real end * and then add it to the new start date... */ if ( ev.end() != QTime(23, 59, 59 ) ) { end.setDate( ev.date() ); }else{ int days = ev.event().start().date().daysTo( ev.event().end().date() ); end.setDate( start.date().addDays( days ) ); } Event event( ev.event() ); event.setStart( start ); event.setEnd ( end ); emit beamMe( event ); } } } void DateBookDayWidget::setGeometry( const QRect &r ) { - geom = r; - setFixedSize( r.width()+1, r.height()+1 ); - dateBook->dayView()->moveChild( this, r.x(), r.y()-1 ); - show(); + geom = r; + setFixedSize( r.width()+1, r.height()+1 ); + dateBook->dayView()->moveChild( this, r.x(), r.y()-1 ); + show(); } //--------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------- DateBookDayTimeMarker::DateBookDayTimeMarker( DateBookDay *db ) - : QWidget( db->dayView()->viewport() ), dateBook( db ) + : QWidget( db->dayView()->viewport() ), dateBook( db ) { - setBackgroundMode( PaletteBase ); + setBackgroundMode( PaletteBase ); } DateBookDayTimeMarker::~DateBookDayTimeMarker() { } void DateBookDayTimeMarker::paintEvent( QPaintEvent */*e*/ ) { - QPainter p( this ); - p.setBrush( QColor( 255, 0, 0 ) ); + QPainter p( this ); + p.setBrush( QColor( 255, 0, 0 ) ); - QPen pen; - pen.setStyle(NoPen); + QPen pen; + pen.setStyle(NoPen); - p.setPen( pen ); - p.drawRect(rect()); + p.setPen( pen ); + p.drawRect(rect()); } void DateBookDayTimeMarker::setTime( const QTime &t ) { - int y = t.hour()*60+t.minute(); - int rh = dateBook->dayView()->rowHeight(0); - y = y*rh/60; + int y = t.hour()*60+t.minute(); + int rh = dateBook->dayView()->rowHeight(0); + y = y*rh/60; - geom.setX( 0 ); + geom.setX( 0 ); - int x = dateBook->dayView()->columnWidth(0)-1; - geom.setWidth( x ); + int x = dateBook->dayView()->columnWidth(0)-1; + geom.setWidth( x ); - geom.setY( y ); - geom.setHeight( 1 ); + geom.setY( y ); + geom.setHeight( 1 ); - setGeometry( geom ); + setGeometry( geom ); - time = t; + time = t; } void DateBookDayTimeMarker::setGeometry( const QRect &r ) { - geom = r; - setFixedSize( r.width()+1, r.height()+1 ); - dateBook->dayView()->moveChild( this, r.x(), r.y()-1 ); - show(); + geom = r; + setFixedSize( r.width()+1, r.height()+1 ); + dateBook->dayView()->moveChild( this, r.x(), r.y()-1 ); + show(); } diff --git a/core/pim/datebook/datebookday.h b/core/pim/datebook/datebookday.h index c8cb26b..3e44364 100644 --- a/core/pim/datebook/datebookday.h +++ b/core/pim/datebook/datebookday.h @@ -1,236 +1,238 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef DATEBOOKDAY_H #define DATEBOOKDAY_H #include <qpe/event.h> #include <qdatetime.h> #include <qtable.h> #include <qvbox.h> #include <qlist.h> #include "datebook.h" #include <qlineedit.h> class DateBookDayHeader; class DateBookDB; class DatebookdayAllday; class QDateTime; class QMouseEvent; class QPaintEvent; class QResizeEvent; class DateBookDayViewQuickLineEdit : public QLineEdit { - Q_OBJECT + Q_OBJECT public: - DateBookDayViewQuickLineEdit(const QDateTime &start, const QDateTime &end,QWidget * parent, const char *name=0); + DateBookDayViewQuickLineEdit(const QDateTime &start, const QDateTime &end,QWidget * parent, const char *name=0); protected: - Event quickEvent; - int active; - void focusOutEvent( QFocusEvent *e ); + Event quickEvent; + int active; + void focusOutEvent( QFocusEvent *e ); protected slots: - void slotReturnPressed(void); + void slotReturnPressed(void); void finallyCallClose(); signals: - void insertEvent(const Event &e); + void insertEvent(const Event &e); }; class DateBookDayView : public QTable { Q_OBJECT public: DateBookDayView( bool hourClock, QWidget *parent, const char *name ); bool whichClock() const; void setRowStyle( int style ); public slots: void moveUp(); void moveDown(); - void slotDateChanged( int year, int month, int day ); + void slotDateChanged( int year, int month, int day ); signals: void sigColWidthChanged(); void sigCapturedKey( const QString &txt ); protected slots: - void slotChangeClock( bool ); + void slotChangeClock( bool ); protected: virtual void paintCell( QPainter *p, int row, int col, const QRect &cr, bool selected ); virtual void paintFocus( QPainter *p, const QRect &cr ); virtual void resizeEvent( QResizeEvent *e ); void keyPressEvent( QKeyEvent *e ); void contentsMouseReleaseEvent( QMouseEvent *e ); void initHeader(); private: bool ampm; - QDate currDate; - DateBookDayViewQuickLineEdit *quickLineEdit; + QDate currDate; + DateBookDayViewQuickLineEdit *quickLineEdit; }; class DateBookDay; class DateBookDayWidget : public QWidget { Q_OBJECT public: DateBookDayWidget( const EffectiveEvent &e, DateBookDay *db ); ~DateBookDayWidget(); const QRect &geometry() { return geom; } void setGeometry( const QRect &r ); const EffectiveEvent &event() const { return ev; } signals: void deleteMe( const Event &e ); void duplicateMe( const Event &e ); void editMe( const Event &e ); void beamMe( const Event &e ); protected: void paintEvent( QPaintEvent *e ); void mousePressEvent( QMouseEvent *e ); private: /** * Sets the text for an all day Event * All day events have no time associated */ void setAllDayText( QString& text ); /** * Sets the EventText * it got a start and an end Time */ void setEventText( QString& text ); EffectiveEvent ev; DateBookDay *dateBook; QString text; QRect geom; }; //Marker for current time in the dayview class DateBookDayTimeMarker : public QWidget { Q_OBJECT public: DateBookDayTimeMarker( DateBookDay *db ); ~DateBookDayTimeMarker(); const QRect &geometry() { return geom; } void setGeometry( const QRect &r ); void setTime( const QTime &t ); signals: protected: void paintEvent( QPaintEvent *e ); private: QRect geom; QTime time; DateBookDay *dateBook; }; //reimplemented the compareItems function so that it sorts DayWidgets by geometry heights class WidgetListClass : public QList<DateBookDayWidget> { - private: + private: - int compareItems( QCollection::Item s1, QCollection::Item s2 ) - { - //hmm, don't punish me for that ;) - if (reinterpret_cast<DateBookDayWidget*>(s1)->geometry().height() > reinterpret_cast<DateBookDayWidget*>(s2)->geometry().height()) - { - return -1; - } else - { - return 1; - } - } + int compareItems( QCollection::Item s1, QCollection::Item s2 ) + { + //hmm, don't punish me for that ;) + if (reinterpret_cast<DateBookDayWidget*>(s1)->geometry().height() > reinterpret_cast<DateBookDayWidget*>(s2)->geometry().height()) + { + return -1; + } else + { + return 1; + } + } }; class DateBookDay : public QVBox { Q_OBJECT friend class DateBookDayWidget; // for beam this occurence and access to DateBookDB public: - DateBookDay( bool ampm, bool startOnMonday, DateBookDB *newDb, - QWidget *parent, const char *name ); + DateBookDay( bool ampm, bool startOnMonday, DateBookDB *newDb,DateBookHoliday*newHdb, + QWidget *parent, const char *name ); void selectedDates( QDateTime &start, QDateTime &end ); + QDate date() const; DateBookDayView *dayView() const { return view; } void setStartViewTime( int startHere ); int startViewTime() const; void setSelectedWidget( DateBookDayWidget * ); DateBookDayWidget * getSelectedWidget( void ); void setJumpToCurTime( bool bJump ); void setRowStyle( int style ); static QDate findRealStart( int uid, const QDate& isIncluded, DateBookDB* ); public slots: void setDate( int y, int m, int d ); void setDate( QDate ); void redraw(); void slotWeekChanged( bool bStartOnMonday ); - void updateView(); //updates TimeMarker and DayWidget-colors + void updateView(); //updates TimeMarker and DayWidget-colors signals: void removeEvent( const Event& ); void editEvent( const Event& ); void duplicateEvent( const Event& ); void beamEvent( const Event& ); void newEvent(); void sigNewEvent( const QString & ); protected slots: void keyPressEvent(QKeyEvent *); private slots: void dateChanged( int y, int m, int d ); void slotColWidthChanged() { relayoutPage(); }; private: void getEvents(); void relayoutPage( bool fromResize = false ); DateBookDayWidget *intersects( const DateBookDayWidget *item, const QRect &geom ); QDate currDate; DateBookDayView *view; DateBookDayHeader *header; DatebookdayAllday *m_allDays; DateBookDB *db; - WidgetListClass widgetList; //reimplemented QList for sorting widgets by height + WidgetListClass widgetList; //reimplemented QList for sorting widgets by height int startTime; - bool jumpToCurTime; //should we jump to current time in dayview? + bool jumpToCurTime; //should we jump to current time in dayview? int rowStyle; DateBookDayWidget *selectedWidget; //actual selected widget (obviously) - DateBookDayTimeMarker *timeMarker; //marker for current time + DateBookDayTimeMarker *timeMarker; //marker for current time + DateBookHoliday*_holiday_db; }; #endif diff --git a/core/pim/datebook/datebookdayallday.cpp b/core/pim/datebook/datebookdayallday.cpp index a0aefd3..3c3f482 100644 --- a/core/pim/datebook/datebookdayallday.cpp +++ b/core/pim/datebook/datebookdayallday.cpp @@ -1,226 +1,263 @@ /**************************************************************************** ** GPL by Rajko Albrecht ** ** ** ** ** ****************************************************************************/ #include "datebookdayallday.h" #include <qlayout.h> #include <qpe/ir.h> #include <qpopupmenu.h> #include <qtimer.h> #include "datebookday.h" /* * Constructs a DatebookdayAllday which is a child of 'parent', with the * name 'name' and widget flags set to 'f' */ DatebookdayAllday::DatebookdayAllday(DateBookDB* db, QWidget* parent, const char* name, WFlags ) : QScrollView( parent, name ),item_count(0),dateBook(db) { if ( !name ) setName( "DatebookdayAllday" ); setMinimumSize( QSize( 0, 0 ) ); setMaximumHeight(3* (QFontMetrics(font()).height()+4) ); m_MainFrame = new QFrame(viewport()); m_MainFrame->setFrameStyle(QFrame::NoFrame|QFrame::Plain); setFrameStyle(QFrame::NoFrame|QFrame::Plain); setResizePolicy( QScrollView::Default ); setHScrollBarMode( AlwaysOff ); addChild(m_MainFrame); datebookdayalldayLayout = new QVBoxLayout( m_MainFrame ); datebookdayalldayLayout->setSpacing( 0 ); datebookdayalldayLayout->setMargin( 0 ); lblDesc = new DatebookEventDesc(parent->parentWidget(),""); lblDesc->setBackgroundColor(Qt::yellow); lblDesc->hide(); subWidgets.setAutoDelete(true); } /* * Destroys the object and frees any allocated resources */ DatebookdayAllday::~DatebookdayAllday() { // no need to delete child widgets, Qt does it all for us } DatebookAlldayDisp* DatebookdayAllday::addEvent(const EffectiveEvent&ev) { DatebookAlldayDisp * lb; lb = new DatebookAlldayDisp(dateBook,ev,m_MainFrame,NULL); lb->show(); datebookdayalldayLayout->addWidget(lb); subWidgets.append(lb); connect(lb,SIGNAL(displayMe(const Event&)),lblDesc,SLOT(disp_event(const Event&))); ++item_count; return lb; } +DatebookAlldayDisp* DatebookdayAllday::addHoliday(const QString&e) +{ + DatebookAlldayDisp * lb; + lb = new DatebookAlldayDisp(e,m_MainFrame,NULL); + lb->show(); + datebookdayalldayLayout->addWidget(lb); + subWidgets.append(lb); + + connect(lb,SIGNAL(displayMe(const Event&)),lblDesc,SLOT(disp_event(const Event&))); + ++item_count; + + return lb; +} + void DatebookdayAllday::removeAllEvents() { subWidgets.clear(); item_count = 0; } DatebookAlldayDisp::DatebookAlldayDisp(DateBookDB *db,const EffectiveEvent& ev, QWidget* parent,const char* name,WFlags f) : QLabel(parent,name,f),m_Ev(ev),dateBook(db) { QString strDesc = m_Ev.description(); strDesc = strDesc.replace(QRegExp("<"),"<"); setBackgroundColor(yellow); setText(strDesc); setFrameStyle(QFrame::Raised|QFrame::Panel); int s = QFontMetrics(font()).height()+4; setMaximumHeight( s ); setMinimumSize( QSize( 0, s ) ); + m_holiday = false; +} + +DatebookAlldayDisp::DatebookAlldayDisp(const QString&aholiday,QWidget* parent,const char* name, WFlags fl) + : QLabel(parent,name,fl),m_Ev(),dateBook(0) +{ + QString strDesc = aholiday; + strDesc = strDesc.replace(QRegExp("<"),"<"); + Event ev; + ev.setDescription(strDesc); + ev.setAllDay(true); + m_Ev.setEvent(ev); + setBackgroundColor(yellow); + setText(strDesc); + setFrameStyle(QFrame::Raised|QFrame::Panel); + + int s = QFontMetrics(font()).height()+4; + setMaximumHeight( s ); + setMinimumSize( QSize( 0, s ) ); + m_holiday = true; } DatebookAlldayDisp::~DatebookAlldayDisp() { } void DatebookAlldayDisp::beam_single_event() { + if (m_holiday) return; // create an Event and beam it... /* * Start with the easy stuff. If start and end date is the same we can just use * the values of effective m_Events * If it is a multi day m_Event we need to find the real start and end date... */ if ( m_Ev.event().start().date() == m_Ev.event().end().date() ) { Event m_Event( m_Ev.event() ); QDateTime dt( m_Ev.date(), m_Ev.start() ); m_Event.setStart( dt ); dt.setTime( m_Ev.end() ); m_Event.setEnd( dt ); emit beamMe( m_Event ); }else { /* * at least the the Times are right now */ QDateTime start( m_Ev.event().start() ); QDateTime end ( m_Ev.event().end () ); /* * ok we know the start date or we need to find it */ if ( m_Ev.start() != QTime( 0, 0, 0 ) ) { start.setDate( m_Ev.date() ); }else { QDate dt = DateBookDay::findRealStart( m_Ev.event().uid(), m_Ev.date(), dateBook ); start.setDate( dt ); } /* * ok we know now the end date... * else * get to know the offset btw the real start and real end * and then add it to the new start date... */ if ( m_Ev.end() != QTime(23, 59, 59 ) ) { end.setDate( m_Ev.date() ); }else{ int days = m_Ev.event().start().date().daysTo( m_Ev.event().end().date() ); end.setDate( start.date().addDays( days ) ); } Event m_Event( m_Ev.event() ); m_Event.setStart( start ); m_Event.setEnd ( end ); emit beamMe( m_Event ); } } void DatebookAlldayDisp::mousePressEvent(QMouseEvent*e) { Event ev = m_Ev.event(); QColor b = backgroundColor(); setBackgroundColor(green); update(); QPopupMenu m; - m.insertItem( DateBookDayWidget::tr( "Edit" ), 1 ); - m.insertItem( DateBookDayWidget::tr( "Duplicate" ), 4 ); - m.insertItem( DateBookDayWidget::tr( "Delete" ), 2 ); - if(Ir::supported()) m.insertItem( DateBookDayWidget::tr( "Beam" ), 3 ); - if(Ir::supported() && m_Ev.event().doRepeat() ) m.insertItem( DateBookDayWidget::tr( "Beam this occurence"), 5 ); + if (!m_holiday) { + m.insertItem( DateBookDayWidget::tr( "Edit" ), 1 ); + m.insertItem( DateBookDayWidget::tr( "Duplicate" ), 4 ); + m.insertItem( DateBookDayWidget::tr( "Delete" ), 2 ); + if(Ir::supported()) m.insertItem( DateBookDayWidget::tr( "Beam" ), 3 ); + if(Ir::supported() && m_Ev.event().doRepeat() ) m.insertItem( DateBookDayWidget::tr( "Beam this occurence"), 5 ); + } m.insertItem( tr( "Info"),6); int r = m.exec( e->globalPos() ); setBackgroundColor(b); update(); switch (r) { case 1: emit editMe( ev ); break; case 2: emit deleteMe( ev ); break; case 3: emit beamMe( ev ); break; case 4: emit duplicateMe( ev ); break; case 5: beam_single_event(); break; case 6: emit displayMe( ev ); break; default: break; } } DatebookEventDesc::DatebookEventDesc(QWidget*parent,const char*name) :QLabel(parent,name) { m_Timer=new QTimer(this); connect(m_Timer,SIGNAL(timeout()),this,SLOT(hide())); setFrameStyle(QFrame::Sunken|QFrame::Panel); setTextFormat(RichText); } DatebookEventDesc::~DatebookEventDesc() { } void DatebookEventDesc::mousePressEvent(QMouseEvent*) { hide(); if (m_Timer->isActive()) m_Timer->stop(); } void DatebookEventDesc::disp_event(const Event&e) { if (m_Timer->isActive()) m_Timer->stop(); QString text; text = "<b><i>"+e.description()+"</i></b><br>"; if (e.notes().length()>0) { text+="<b>"+e.notes()+"</b><br>"; } if (e.location().length()>0) { text+="<i>"+e.location()+"</i><br>"; } text = text.replace(QRegExp("\n"),"<br>"); setText(text); QSize s = sizeHint(); s+=QSize(10,10); resize(s); move( QMAX(0,(parentWidget()->width()-width()) / 2), (parentWidget()->height()-height())/2 ); show(); m_Timer->start(2000,true); } diff --git a/core/pim/datebook/datebookdayallday.h b/core/pim/datebook/datebookdayallday.h index f5867e5..4f5cffa 100644 --- a/core/pim/datebook/datebookdayallday.h +++ b/core/pim/datebook/datebookdayallday.h @@ -1,82 +1,86 @@ #ifndef DATEBOOKDAYALLDAYBASE_H #define DATEBOOKDAYALLDAYBASE_H #include <qvariant.h> #include <qframe.h> #include <qscrollview.h> #include <qlabel.h> #include <qlist.h> #include <qpe/event.h> class QVBoxLayout; class QHBoxLayout; class QGridLayout; class DatebookAlldayDisp; class DatebookEventDesc; class DateBookDB; class DatebookdayAllday : public QScrollView { Q_OBJECT public: DatebookdayAllday(DateBookDB* db, QWidget* parent = 0, const char* name = 0, WFlags fl = 0); ~DatebookdayAllday(); DatebookAlldayDisp* addEvent(const EffectiveEvent&e); + DatebookAlldayDisp* addHoliday(const QString&e); const unsigned int items()const{return item_count;} public slots: void removeAllEvents(); protected: QFrame * m_MainFrame; QVBoxLayout* datebookdayalldayLayout; DatebookEventDesc * lblDesc; unsigned int item_count; QList<DatebookAlldayDisp> subWidgets; DateBookDB *dateBook; }; class DatebookAlldayDisp : public QLabel { Q_OBJECT public: DatebookAlldayDisp(DateBookDB* db,const EffectiveEvent& e, QWidget* parent=0,const char* name = 0, WFlags fl=0); + DatebookAlldayDisp(const QString&aholiday, + QWidget* parent=0,const char* name = 0, WFlags fl=0); virtual ~DatebookAlldayDisp(); signals: void deleteMe( const Event &e ); void duplicateMe( const Event &e ); void editMe( const Event &e ); void beamMe( const Event &e ); void displayMe(const Event &e); public slots: protected: EffectiveEvent m_Ev; DateBookDB* dateBook; void mousePressEvent( QMouseEvent *e ); void beam_single_event(); + bool m_holiday:1; }; class DatebookEventDesc: public QLabel { Q_OBJECT public: DatebookEventDesc(QWidget* Parent=0,const char* name = 0); virtual ~DatebookEventDesc(); public slots: void disp_event(const Event&e); protected: void mousePressEvent(QMouseEvent*e); QTimer* m_Timer; }; #endif // DATEBOOKDAYALLDAYBASE_H diff --git a/core/pim/datebook/holiday/dummy/config.in b/core/pim/datebook/holiday/dummy/config.in new file mode 100644 index 0000000..caa90bc --- a/dev/null +++ b/core/pim/datebook/holiday/dummy/config.in @@ -0,0 +1,8 @@ + config DATEBOOK_DUMMY_HOLIDAY + boolean "opie-datebook-dummyholidayplugin" + default "n" + depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBOPIE2UI && LIBOPIE2PIM + + comment "opie-datebook-dummyholidayplugin requires libopie2core, libopie2ui, libopie2pim" + depends !( ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBOPIE2UI && LIBOPIE2PIM ) + diff --git a/core/pim/datebook/holiday/dummy/dummy.pro b/core/pim/datebook/holiday/dummy/dummy.pro new file mode 100644 index 0000000..768bb77 --- a/dev/null +++ b/core/pim/datebook/holiday/dummy/dummy.pro @@ -0,0 +1,20 @@ +TEMPLATE = lib +CONFIG -= moc +CONFIG += qt plugin + +# Input +HEADERS = dummyholiday.h +SOURCES = dummyholiday.cpp +INTERFACES= + +INCLUDEPATH += $(OPIEDIR)/include \ + ../ ../library +DEPENDPATH += $(OPIEDIR)/include \ + ../ ../library + +LIBS+= -lqpe -lopiecore2 -lopieui2 + +DESTDIR = $(OPIEDIR)/plugins/datebook/holiday +TARGET = dummyholidayplugin + +include( $(OPIEDIR)/include.pro ) diff --git a/core/pim/datebook/holiday/dummy/dummyholiday.cpp b/core/pim/datebook/holiday/dummy/dummyholiday.cpp new file mode 100644 index 0000000..dd00b9b --- a/dev/null +++ b/core/pim/datebook/holiday/dummy/dummyholiday.cpp @@ -0,0 +1,20 @@ +#include "dummyholiday.h"
+
+#include <qobject.h>
+
+QString DummyHoliday::description()
+{
+ return QObject::tr("Test holiday plugin","dummyholiday");
+}
+
+QStringList DummyHoliday::entries(const QDate&aDate)
+{
+ return entries(0,0,aDate.day());
+}
+
+QStringList DummyHoliday::entries(unsigned year, unsigned month, unsigned day)
+{
+ QStringList ret;
+ if (day%2==0) ret.append(QObject::tr("You have a holiday!","dummyholiday"));
+ return ret;
+}
diff --git a/core/pim/datebook/holiday/dummy/dummyholiday.h b/core/pim/datebook/holiday/dummy/dummyholiday.h new file mode 100644 index 0000000..9b28f24 --- a/dev/null +++ b/core/pim/datebook/holiday/dummy/dummyholiday.h @@ -0,0 +1,19 @@ +#ifndef __DUMMY_HOLIDAY_H
+#define __DUMMY_HOLIDAY_H
+
+#include <opie2/oholidayplugin.h>
+#include <opie2/oholidaypluginif.h>
+
+class DummyHoliday:public Opie::Datebook::HolidayPlugin
+{
+public:
+ DummyHoliday():Opie::Datebook::HolidayPlugin(){}
+ virtual ~DummyHoliday(){}
+
+ virtual QString description();
+ virtual QStringList entries(const QDate&);
+ virtual QStringList entries(unsigned year, unsigned month, unsigned day);
+};
+
+EXPORT_HOLIDAY_PLUGIN(DummyHoliday);
+#endif
|