Diffstat (limited to 'core/pim/todo/mainwindow.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | core/pim/todo/mainwindow.cpp | 133 |
1 files changed, 131 insertions, 2 deletions
diff --git a/core/pim/todo/mainwindow.cpp b/core/pim/todo/mainwindow.cpp index c5cedc6..5119ae0 100644 --- a/core/pim/todo/mainwindow.cpp +++ b/core/pim/todo/mainwindow.cpp | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <qmessagebox.h> | 32 | #include <qmessagebox.h> |
33 | #include <qtoolbar.h> | 33 | #include <qtoolbar.h> |
34 | #include <qpopupmenu.h> | 34 | #include <qpopupmenu.h> |
35 | #include <qpushbutton.h> | ||
35 | #include <qwidgetstack.h> | 36 | #include <qwidgetstack.h> |
36 | #include <qaction.h> | 37 | #include <qaction.h> |
37 | #include <qtimer.h> | 38 | #include <qtimer.h> |
@@ -45,8 +46,12 @@ | |||
45 | #include <qpe/ir.h> | 46 | #include <qpe/ir.h> |
46 | #include <qpe/resource.h> | 47 | #include <qpe/resource.h> |
47 | #include <qpe/qpemessagebox.h> | 48 | #include <qpe/qpemessagebox.h> |
49 | #include <qpe/alarmserver.h> | ||
50 | #include <qpe/timestring.h> | ||
51 | #include <qpe/qpeapplication.h> | ||
48 | 52 | ||
49 | #include <opie/orecur.h> | 53 | #include <opie/orecur.h> |
54 | #include <opie/opimnotifymanager.h> | ||
50 | #include <opie/otodoaccessvcal.h> | 55 | #include <opie/otodoaccessvcal.h> |
51 | 56 | ||
52 | #include "quickeditimpl.h" | 57 | #include "quickeditimpl.h" |
@@ -301,6 +306,10 @@ OTodoAccess::List MainWindow::sorted( bool asc, int sortOrder ) { | |||
301 | int cat = 0; | 306 | int cat = 0; |
302 | if ( m_curCat != QWidget::tr("All Categories") ) | 307 | if ( m_curCat != QWidget::tr("All Categories") ) |
303 | cat = currentCatId(); | 308 | cat = currentCatId(); |
309 | if ( m_curCat == QWidget::tr("Unfiled") ) | ||
310 | cat = -1; | ||
311 | |||
312 | qWarning(" Category %d %s", cat, m_curCat.latin1() ); | ||
304 | 313 | ||
305 | int filter = 1; | 314 | int filter = 1; |
306 | 315 | ||
@@ -316,6 +325,9 @@ OTodoAccess::List MainWindow::sorted( bool asc, int sortOrder, int addFilter) { | |||
316 | if ( m_curCat != QWidget::tr("All Categories") ) | 325 | if ( m_curCat != QWidget::tr("All Categories") ) |
317 | cat = currentCatId(); | 326 | cat = currentCatId(); |
318 | 327 | ||
328 | if ( m_curCat == QWidget::tr("Unfiled") ) | ||
329 | cat = -1; | ||
330 | |||
319 | return m_todoMgr.sorted(asc, sortOrder, addFilter, cat ); | 331 | return m_todoMgr.sorted(asc, sortOrder, addFilter, cat ); |
320 | } | 332 | } |
321 | OTodo MainWindow::event( int uid ) { | 333 | OTodo MainWindow::event( int uid ) { |
@@ -450,6 +462,7 @@ void MainWindow::slotDelete() { | |||
450 | if (!QPEMessageBox::confirmDelete(this, QWidget::tr("Todo"), strName ) ) | 462 | if (!QPEMessageBox::confirmDelete(this, QWidget::tr("Todo"), strName ) ) |
451 | return; | 463 | return; |
452 | 464 | ||
465 | handleAlarms( OTodo(), m_todoMgr.event( currentView()->current() ) ); | ||
453 | m_todoMgr.remove( currentView()->current() ); | 466 | m_todoMgr.remove( currentView()->current() ); |
454 | currentView()->removeEvent( currentView()->current() ); | 467 | currentView()->removeEvent( currentView()->current() ); |
455 | raiseCurrentView(); | 468 | raiseCurrentView(); |
@@ -641,13 +654,14 @@ void MainWindow::slotEdit( int uid ) { | |||
641 | return; | 654 | return; |
642 | } | 655 | } |
643 | 656 | ||
644 | OTodo todo = m_todoMgr.event( uid ); | 657 | OTodo old_todo = m_todoMgr.event( uid ); |
645 | 658 | ||
646 | todo = currentEditor()->edit(this, todo ); | 659 | OTodo todo = currentEditor()->edit(this, old_todo ); |
647 | 660 | ||
648 | /* if completed */ | 661 | /* if completed */ |
649 | if ( currentEditor()->accepted() ) { | 662 | if ( currentEditor()->accepted() ) { |
650 | qWarning("Replacing now" ); | 663 | qWarning("Replacing now" ); |
664 | handleAlarms( old_todo, todo ); | ||
651 | m_todoMgr.update( todo.uid(), todo ); | 665 | m_todoMgr.update( todo.uid(), todo ); |
652 | currentView()->replaceEvent( todo ); | 666 | currentView()->replaceEvent( todo ); |
653 | /* a Category might have changed */ | 667 | /* a Category might have changed */ |
@@ -766,6 +780,7 @@ int MainWindow::create() { | |||
766 | if ( currentEditor()->accepted() ) { | 780 | if ( currentEditor()->accepted() ) { |
767 | //todo.assignUid(); | 781 | //todo.assignUid(); |
768 | uid = todo.uid(); | 782 | uid = todo.uid(); |
783 | handleAlarms( OTodo(), todo ); | ||
769 | m_todoMgr.add( todo ); | 784 | m_todoMgr.add( todo ); |
770 | currentView()->addEvent( todo ); | 785 | currentView()->addEvent( todo ); |
771 | 786 | ||
@@ -783,6 +798,9 @@ int MainWindow::create() { | |||
783 | bool MainWindow::remove( int uid ) { | 798 | bool MainWindow::remove( int uid ) { |
784 | if (m_syncing) return false; | 799 | if (m_syncing) return false; |
785 | 800 | ||
801 | /* argh need to get the whole OEvent... to disable alarms -zecke */ | ||
802 | handleAlarms( OTodo(), m_todoMgr.event( uid ) ); | ||
803 | |||
786 | return m_todoMgr.remove( uid ); | 804 | return m_todoMgr.remove( uid ); |
787 | } | 805 | } |
788 | void MainWindow::beam( int uid) { | 806 | void MainWindow::beam( int uid) { |
@@ -821,3 +839,114 @@ void MainWindow::add( const OPimRecord& rec) { | |||
821 | void MainWindow::slotReturnFromView() { | 839 | void MainWindow::slotReturnFromView() { |
822 | raiseCurrentView(); | 840 | raiseCurrentView(); |
823 | } | 841 | } |
842 | |||
843 | namespace { | ||
844 | OPimNotifyManager::Alarms findNonMatching( const OPimNotifyManager::Alarms& oldAls, | ||
845 | const OPimNotifyManager::Alarms& newAls ) { | ||
846 | OPimNotifyManager::Alarms nonMatching; | ||
847 | OPimNotifyManager::Alarms::ConstIterator oldIt = oldAls.begin(); | ||
848 | OPimNotifyManager::Alarms::ConstIterator newIt; | ||
849 | for ( ; oldIt != oldAls.end(); ++oldIt ) { | ||
850 | bool found = false; | ||
851 | QDateTime oldDt = (*oldIt).dateTime(); | ||
852 | for (newIt= newAls.begin(); newIt != newAls.end(); ++newIt ) { | ||
853 | if ( oldDt == (*newIt).dateTime() ) { | ||
854 | found = true; | ||
855 | break; | ||
856 | } | ||
857 | } | ||
858 | if (!found) | ||
859 | nonMatching.append( (*oldIt) ); | ||
860 | } | ||
861 | return nonMatching; | ||
862 | } | ||
863 | void addAlarms( const OPimNotifyManager::Alarms& als, int uid ) { | ||
864 | OPimNotifyManager::Alarms::ConstIterator it; | ||
865 | for ( it = als.begin(); it != als.end(); ++it ) { | ||
866 | qWarning("Adding alarm for %s", (*it).dateTime().toString().latin1() ); | ||
867 | AlarmServer::addAlarm( (*it).dateTime(), "QPE/Application/todolist", "alarm(QDateTime,int)", uid ); | ||
868 | } | ||
869 | |||
870 | } | ||
871 | void removeAlarms( const OPimNotifyManager::Alarms& als, int uid ) { | ||
872 | OPimNotifyManager::Alarms::ConstIterator it; | ||
873 | for ( it = als.begin(); it != als.end(); ++it ) { | ||
874 | qWarning("Removinf alarm for %s", (*it).dateTime().toString().latin1() ); | ||
875 | AlarmServer::deleteAlarm( (*it).dateTime(), "QPE/Application/todolist", "alarm(QDateTime,int)", uid ); | ||
876 | } | ||
877 | } | ||
878 | } | ||
879 | |||
880 | void MainWindow::handleAlarms( const OTodo& oldTodo, const OTodo& newTodo) { | ||
881 | /* | ||
882 | * if oldTodo is not empty and has notifiers we need to find the deleted ones | ||
883 | */ | ||
884 | if(!oldTodo.isEmpty() && oldTodo.hasNotifiers() ) { | ||
885 | OPimNotifyManager::Alarms removed; | ||
886 | OPimNotifyManager::Alarms oldAls = oldTodo.notifiers().alarms(); | ||
887 | if (!newTodo.hasNotifiers() ) | ||
888 | removed = oldAls; | ||
889 | else | ||
890 | removed = findNonMatching( oldAls, newTodo.notifiers().alarms() ); | ||
891 | |||
892 | removeAlarms( removed, oldTodo.uid() ); | ||
893 | } | ||
894 | if ( newTodo.hasNotifiers() ) { | ||
895 | OPimNotifyManager::Alarms added; | ||
896 | if ( oldTodo.isEmpty() || !oldTodo.hasNotifiers() ) | ||
897 | added = newTodo.notifiers().alarms(); | ||
898 | else | ||
899 | added = findNonMatching( newTodo.notifiers().alarms(), oldTodo.notifiers().alarms() ); | ||
900 | |||
901 | addAlarms( added, newTodo.uid() ); | ||
902 | } | ||
903 | } | ||
904 | /* we might have not loaded the db */ | ||
905 | void MainWindow::doAlarm( const QDateTime& dt, int uid ) { | ||
906 | m_todoMgr.load(); | ||
907 | |||
908 | OTodo todo = m_todoMgr.event( uid ); | ||
909 | if (!todo.hasNotifiers() ) return; | ||
910 | |||
911 | /* | ||
912 | * let's find the right alarm and find out if silent | ||
913 | * then show a richtext widget | ||
914 | */ | ||
915 | bool loud = false; | ||
916 | OPimNotifyManager::Alarms als = todo.notifiers().alarms(); | ||
917 | OPimNotifyManager::Alarms::Iterator it; | ||
918 | for ( it = als.begin(); it != als.end(); ++it ) { | ||
919 | if ( (*it).dateTime() == dt ) { | ||
920 | loud = ( (*it).sound() == OPimAlarm::Loud ); | ||
921 | break; | ||
922 | } | ||
923 | } | ||
924 | if (loud) | ||
925 | startAlarm(); | ||
926 | |||
927 | QDialog dlg(this, 0, TRUE ); | ||
928 | QVBoxLayout* lay = new QVBoxLayout( &dlg ); | ||
929 | QTextView* view = new QTextView( &dlg ); | ||
930 | lay->addWidget( view ); | ||
931 | QPushButton* btnOk = new QPushButton( tr("Ok"), &dlg ); | ||
932 | connect( btnOk, SIGNAL(clicked() ), &dlg, SLOT(accept() ) ); | ||
933 | lay->addWidget( btnOk ); | ||
934 | |||
935 | QString text = tr("<h1>Alarm at %0</h1><br>").arg( TimeString::dateString( dt ) ); | ||
936 | text += todo.toRichText(); | ||
937 | view->setText( text ); | ||
938 | |||
939 | dlg.showMaximized(); | ||
940 | bool needToStay = dlg.exec(); | ||
941 | |||
942 | if (loud) | ||
943 | killAlarm(); | ||
944 | |||
945 | if (needToStay) { | ||
946 | showMaximized(); | ||
947 | raise(); | ||
948 | QPEApplication::setKeepRunning(); | ||
949 | setActiveWindow(); | ||
950 | } | ||
951 | |||
952 | } | ||