summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/todo/mainwindow.cpp23
1 files changed, 12 insertions, 11 deletions
diff --git a/core/pim/todo/mainwindow.cpp b/core/pim/todo/mainwindow.cpp
index 75da27c..9013522 100644
--- a/core/pim/todo/mainwindow.cpp
+++ b/core/pim/todo/mainwindow.cpp
@@ -1,859 +1,860 @@
1/* 1/*
2 =. This file is part of the OPIE Project 2 =. This file is part of the OPIE Project
3 .=l. Copyright (c) 2002 <> 3 .=l. Copyright (c) 2002 <>
4 .>+-= 4 .>+-=
5_;:, .> :=|. This program is free software; you can 5_;:, .> :=|. This program is free software; you can
6.> <`_, > . <= redistribute it and/or modify it under 6.> <`_, > . <= redistribute it and/or modify it under
7:`=1 )Y*s>-.-- : the terms of the GNU General Public 7:`=1 )Y*s>-.-- : the terms of the GNU General Public
8.="- .-=="i, .._ License as published by the Free Software 8.="- .-=="i, .._ License as published by the Free Software
9- . .-<_> .<> Foundation; either version 2 of the License, 9- . .-<_> .<> Foundation; either version 2 of the License,
10 ._= =} : or (at your option) any later version. 10 ._= =} : or (at your option) any later version.
11 .%`+i> _;_. 11 .%`+i> _;_.
12 .i_,=:_. -<s. This program is distributed in the hope that 12 .i_,=:_. -<s. This program is distributed in the hope that
13 + . -:. = it will be useful, but WITHOUT ANY WARRANTY; 13 + . -:. = it will be useful, but WITHOUT ANY WARRANTY;
14 : .. .:, . . . without even the implied warranty of 14 : .. .:, . . . without even the implied warranty of
15 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A 15 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A
16 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU 16 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
17..}^=.= = ; Library General Public License for more 17..}^=.= = ; Library General Public License for more
18++= -. .` .: details. 18++= -. .` .: details.
19: = ...= . :.=- 19: = ...= . :.=-
20-. .:....=;==+<; You should have received a copy of the GNU 20-. .:....=;==+<; You should have received a copy of the GNU
21 -_. . . )=. = General Public License along with 21 -_. . . )=. = General Public License along with
22 -- :-=` this library; see the file COPYING.LIB. 22 -- :-=` this library; see the file COPYING.LIB.
23 If not, write to the Free Software Foundation, 23 If not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330, 24 Inc., 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA. 25 Boston, MA 02111-1307, USA.
26 26
27*/ 27*/
28 28
29#include <unistd.h> 29#include <unistd.h>
30 30
31#include <opie2/odebug.h> 31#include <opie2/odebug.h>
32#include <opie2/opimrecurrence.h> 32#include <opie2/opimrecurrence.h>
33#include <opie2/opimnotifymanager.h> 33#include <opie2/opimnotifymanager.h>
34#include <opie2/otodoaccessvcal.h> 34#include <opie2/otodoaccessvcal.h>
35#include <opie2/oapplicationfactory.h> 35#include <opie2/oapplicationfactory.h>
36 36
37#include <qpe/applnk.h> 37#include <qpe/applnk.h>
38#include <qpe/config.h> 38#include <qpe/config.h>
39#include <qpe/ir.h> 39#include <qpe/ir.h>
40#include <qpe/resource.h> 40#include <qpe/resource.h>
41#include <qpe/qpemessagebox.h> 41#include <qpe/qpemessagebox.h>
42#include <qpe/alarmserver.h> 42#include <qpe/alarmserver.h>
43#include <qpe/qpeapplication.h> 43#include <qpe/qpeapplication.h>
44 44
45#include <qaction.h> 45#include <qaction.h>
46#include <qlayout.h> 46#include <qlayout.h>
47#include <qmenubar.h> 47#include <qmenubar.h>
48#include <qmessagebox.h> 48#include <qmessagebox.h>
49#include <qpushbutton.h> 49#include <qpushbutton.h>
50#include <qstringlist.h> 50#include <qstringlist.h>
51#include <qtimer.h> 51#include <qtimer.h>
52#include <qwhatsthis.h> 52#include <qwhatsthis.h>
53 53
54#include "quickeditimpl.h" 54#include "quickeditimpl.h"
55#include "todotemplatemanager.h" 55#include "todotemplatemanager.h"
56#include "templatedialogimpl.h" 56#include "templatedialogimpl.h"
57#include "tableview.h" 57#include "tableview.h"
58 58
59#include "textviewshow.h" 59#include "textviewshow.h"
60#include "todoeditor.h" 60#include "todoeditor.h"
61#include "newtaskdlg.h" 61#include "newtaskdlg.h"
62#include "mainwindow.h" 62#include "mainwindow.h"
63 63
64using Opie::Core::OApplicationFactory; 64using Opie::Core::OApplicationFactory;
65OPIE_EXPORT_APP( OApplicationFactory<Todo::MainWindow> ) 65OPIE_EXPORT_APP( OApplicationFactory<Todo::MainWindow> )
66 66
67using namespace Opie; 67using namespace Opie;
68using namespace Todo; 68using namespace Todo;
69 69
70MainWindow::MainWindow( QWidget* parent, 70MainWindow::MainWindow( QWidget* parent,
71 const char* name, WFlags ) 71 const char* name, WFlags )
72 : Opie::OPimMainWindow( "Todolist", tr( "Todo List" ), "Todo List", tr( "Task" ), "todo", 72 : Opie::OPimMainWindow( "Todolist", "Todo List", tr( "Task" ), "todo",
73 parent, name, WType_TopLevel | WStyle_ContextHelp ) 73 parent, name, WType_TopLevel | WStyle_ContextHelp )
74{ 74{
75 setCaption( tr( "Todo List" ) );
75 if (!name) 76 if (!name)
76 setName("todo window"); 77 setName("todo window");
77 78
78 m_syncing = false; 79 m_syncing = false;
79 m_showing = false; 80 m_showing = false;
80 m_counter = 0; 81 m_counter = 0;
81 m_tempManager = new TemplateManager(); 82 m_tempManager = new TemplateManager();
82 m_tempManager->load(); 83 m_tempManager->load();
83 84
84 initConfig(); 85 initConfig();
85 initUI(); 86 initUI();
86 initViews(); 87 initViews();
87 initActions(); 88 initActions();
88 initEditor(); 89 initEditor();
89 initShow(); 90 initShow();
90 91
91 raiseCurrentView(); 92 raiseCurrentView();
92 QTimer::singleShot( 0, this, SLOT(initStuff()) ); 93 QTimer::singleShot( 0, this, SLOT(initStuff()) );
93} 94}
94void MainWindow::initStuff() { 95void MainWindow::initStuff() {
95 m_todoMgr.load(); 96 m_todoMgr.load();
96 setViewCategory( m_curCat ); 97 setViewCategory( m_curCat );
97 setCategory( m_curCat ); 98 setCategory( m_curCat );
98} 99}
99void MainWindow::initActions() { 100void MainWindow::initActions() {
100 // Insert Task menu items 101 // Insert Task menu items
101 QActionGroup *items = new QActionGroup( this, QString::null, false ); 102 QActionGroup *items = new QActionGroup( this, QString::null, false );
102 103
103 m_deleteCompleteAction = new QAction( QString::null, QWidget::tr( "Delete completed" ), 104 m_deleteCompleteAction = new QAction( QString::null, QWidget::tr( "Delete completed" ),
104 0, items, 0 ); 105 0, items, 0 );
105 connect( m_deleteCompleteAction, SIGNAL(activated()), this, SLOT(slotDeleteCompleted()) ); 106 connect( m_deleteCompleteAction, SIGNAL(activated()), this, SLOT(slotDeleteCompleted()) );
106 107
107 insertItemMenuItems( items ); 108 insertItemMenuItems( items );
108 109
109 // Insert View menu items 110 // Insert View menu items
110 items = new QActionGroup( this, QString::null, false ); 111 items = new QActionGroup( this, QString::null, false );
111 112
112 m_completedAction = new QAction( QString::null, QWidget::tr("Show completed tasks"), 113 m_completedAction = new QAction( QString::null, QWidget::tr("Show completed tasks"),
113 0, items, 0, true ); 114 0, items, 0, true );
114 m_completedAction->setOn( showCompleted() ); 115 m_completedAction->setOn( showCompleted() );
115 connect( m_completedAction, SIGNAL(toggled(bool)), this, SLOT(slotShowCompleted(bool)) ); 116 connect( m_completedAction, SIGNAL(toggled(bool)), this, SLOT(slotShowCompleted(bool)) );
116 117
117 QAction *a = new QAction( QString::null, QWidget::tr("Show only over-due tasks"), 118 QAction *a = new QAction( QString::null, QWidget::tr("Show only over-due tasks"),
118 0, items, 0, true ); 119 0, items, 0, true );
119 a->setOn( showOverDue() ); 120 a->setOn( showOverDue() );
120 connect( a, SIGNAL(toggled(bool)), this, SLOT(slotShowDue(bool)) ); 121 connect( a, SIGNAL(toggled(bool)), this, SLOT(slotShowDue(bool)) );
121 122
122 m_showDeadLineAction = new QAction( QString::null, QWidget::tr("Show task deadlines"), 123 m_showDeadLineAction = new QAction( QString::null, QWidget::tr("Show task deadlines"),
123 0, items, 0, true ); 124 0, items, 0, true );
124 m_showDeadLineAction->setOn( showDeadline() ); 125 m_showDeadLineAction->setOn( showDeadline() );
125 connect( m_showDeadLineAction, SIGNAL(toggled(bool)), this, SLOT(slotShowDeadLine(bool)) ); 126 connect( m_showDeadLineAction, SIGNAL(toggled(bool)), this, SLOT(slotShowDeadLine(bool)) );
126 127
127 m_showQuickTaskAction = new QAction( QString::null, QWidget::tr("Show quick task bar"), 128 m_showQuickTaskAction = new QAction( QString::null, QWidget::tr("Show quick task bar"),
128 0, items, 0, true ); 129 0, items, 0, true );
129 m_showQuickTaskAction->setOn( showQuickTask() ); 130 m_showQuickTaskAction->setOn( showQuickTask() );
130 connect( m_showQuickTaskAction, SIGNAL(toggled(bool)), this, SLOT(slotShowQuickTask(bool)) ); 131 connect( m_showQuickTaskAction, SIGNAL(toggled(bool)), this, SLOT(slotShowQuickTask(bool)) );
131 132
132 insertViewMenuItems( items ); 133 insertViewMenuItems( items );
133} 134}
134/* m_curCat from Config */ 135/* m_curCat from Config */
135void MainWindow::initConfig() { 136void MainWindow::initConfig() {
136 Config config( "todo" ); 137 Config config( "todo" );
137 config.setGroup( "View" ); 138 config.setGroup( "View" );
138 m_completed = config.readBoolEntry( "ShowComplete", true ); 139 m_completed = config.readBoolEntry( "ShowComplete", true );
139 m_curCat = config.readEntry( "Category", QString::null ); 140 m_curCat = config.readEntry( "Category", QString::null );
140 m_deadline = config.readBoolEntry( "ShowDeadLine", true); 141 m_deadline = config.readBoolEntry( "ShowDeadLine", true);
141 m_overdue = config.readBoolEntry("ShowOverDue", false ); 142 m_overdue = config.readBoolEntry("ShowOverDue", false );
142 m_quicktask = config.readBoolEntry("ShowQuickTask", true); 143 m_quicktask = config.readBoolEntry("ShowQuickTask", true);
143} 144}
144void MainWindow::initUI() { 145void MainWindow::initUI() {
145 // Create main widget stack 146 // Create main widget stack
146 m_stack = new Opie::Ui::OWidgetStack(this, "main stack"); 147 m_stack = new Opie::Ui::OWidgetStack(this, "main stack");
147 setCentralWidget( m_stack ); 148 setCentralWidget( m_stack );
148 connect( this, SIGNAL(categorySelected(const QString&)), 149 connect( this, SIGNAL(categorySelected(const QString&)),
149 this, SLOT(setCategory(const QString&)) ); 150 this, SLOT(setCategory(const QString&)) );
150 151
151 // Create quick task toolbar 152 // Create quick task toolbar
152 m_curQuick = new QuickEditImpl( this, m_quicktask ); 153 m_curQuick = new QuickEditImpl( this, m_quicktask );
153 addToolBar( (QToolBar *)m_curQuick->widget(), QWidget::tr( "QuickEdit" ), 154 addToolBar( (QToolBar *)m_curQuick->widget(), QWidget::tr( "QuickEdit" ),
154 QMainWindow::Top, true ); 155 QMainWindow::Top, true );
155 m_curQuick->signal()->connect( this, SLOT(slotQuickEntered()) ); 156 m_curQuick->signal()->connect( this, SLOT(slotQuickEntered()) );
156} 157}
157void MainWindow::initViews() { 158void MainWindow::initViews() {
158 159
159 TableView* tableView = new TableView( this, m_stack ); 160 TableView* tableView = new TableView( this, m_stack );
160 QWhatsThis::add( tableView, QWidget::tr( "This is a listing of all current tasks.\n\nThe list displays the following information:\n1. Completed - A green checkmark indicates task is completed. Click here to complete a task.\n2. Priority - a graphical representation of task priority. Double-click here to modify.\n3. Description - description of task. Click here to select the task.\n4. Deadline - shows when task is due. This column can be shown or hidden by selecting Options->'Show task deadlines' from the menu above." ) ); 161 QWhatsThis::add( tableView, QWidget::tr( "This is a listing of all current tasks.\n\nThe list displays the following information:\n1. Completed - A green checkmark indicates task is completed. Click here to complete a task.\n2. Priority - a graphical representation of task priority. Double-click here to modify.\n3. Description - description of task. Click here to select the task.\n4. Deadline - shows when task is due. This column can be shown or hidden by selecting Options->'Show task deadlines' from the menu above." ) );
161 m_stack->addWidget( tableView, m_counter++ ); 162 m_stack->addWidget( tableView, m_counter++ );
162 m_views.append( tableView ); 163 m_views.append( tableView );
163 m_curView = tableView; 164 m_curView = tableView;
164 connectBase( tableView ); 165 connectBase( tableView );
165 /* add QString type + QString configname to 166 /* add QString type + QString configname to
166 * the View menu 167 * the View menu
167 * and subdirs for multiple views 168 * and subdirs for multiple views
168 */ 169 */
169} 170}
170void MainWindow::initEditor() { 171void MainWindow::initEditor() {
171 m_curEdit = new Editor(); 172 m_curEdit = new Editor();
172} 173}
173void MainWindow::initShow() { 174void MainWindow::initShow() {
174 m_curShow = new TextViewShow(this, this); 175 m_curShow = new TextViewShow(this, this);
175 m_stack->addWidget( m_curShow->widget() , m_counter++ ); 176 m_stack->addWidget( m_curShow->widget() , m_counter++ );
176} 177}
177MainWindow::~MainWindow() { 178MainWindow::~MainWindow() {
178 delete templateManager(); 179 delete templateManager();
179} 180}
180void MainWindow::connectBase( ViewBase* ) { 181void MainWindow::connectBase( ViewBase* ) {
181 // once templates and signals mix we'll use it again 182 // once templates and signals mix we'll use it again
182} 183}
183QPopupMenu* MainWindow::contextMenu( int , bool /*recur*/ ) { 184QPopupMenu* MainWindow::contextMenu( int , bool /*recur*/ ) {
184 return itemContextMenu(); 185 return itemContextMenu();
185} 186}
186OPimTodoAccess::List MainWindow::list()const { 187OPimTodoAccess::List MainWindow::list()const {
187 return m_todoMgr.list(); 188 return m_todoMgr.list();
188} 189}
189OPimTodoAccess::List MainWindow::sorted( bool asc, int sortOrder ) { 190OPimTodoAccess::List MainWindow::sorted( bool asc, int sortOrder ) {
190 int cat = 0; 191 int cat = 0;
191 if ( m_curCat != tr( "All" ) ) 192 if ( m_curCat != tr( "All" ) )
192 cat = currentCatId(); 193 cat = currentCatId();
193 if ( m_curCat == tr( "Unfiled" ) ) 194 if ( m_curCat == tr( "Unfiled" ) )
194 cat = -1; 195 cat = -1;
195 196
196 int filter = OPimTodoAccess::FilterCategory; 197 int filter = OPimTodoAccess::FilterCategory;
197 198
198 if (!m_completed ) 199 if (!m_completed )
199 filter |= OPimTodoAccess::DoNotShowCompleted; 200 filter |= OPimTodoAccess::DoNotShowCompleted;
200 if (m_overdue) 201 if (m_overdue)
201 filter |= OPimTodoAccess::OnlyOverDue; 202 filter |= OPimTodoAccess::OnlyOverDue;
202 203
203 return m_todoMgr.sorted( asc, sortOrder, filter, cat ); 204 return m_todoMgr.sorted( asc, sortOrder, filter, cat );
204} 205}
205OPimTodoAccess::List MainWindow::sorted( bool asc, int sortOrder, int addFilter) { 206OPimTodoAccess::List MainWindow::sorted( bool asc, int sortOrder, int addFilter) {
206 int cat = 0; 207 int cat = 0;
207 if ( m_curCat != tr( "All" ) ) 208 if ( m_curCat != tr( "All" ) )
208 cat = currentCatId(); 209 cat = currentCatId();
209 210
210 if ( m_curCat == tr( "Unfiled" ) ) 211 if ( m_curCat == tr( "Unfiled" ) )
211 cat = -1; 212 cat = -1;
212 213
213 return m_todoMgr.sorted(asc, sortOrder, addFilter, cat ); 214 return m_todoMgr.sorted(asc, sortOrder, addFilter, cat );
214} 215}
215OPimTodo MainWindow::event( int uid ) { 216OPimTodo MainWindow::event( int uid ) {
216 return m_todoMgr.event( uid ); 217 return m_todoMgr.event( uid );
217} 218}
218bool MainWindow::isSyncing()const { 219bool MainWindow::isSyncing()const {
219 return m_syncing; 220 return m_syncing;
220} 221}
221TemplateManager* MainWindow::templateManager() { 222TemplateManager* MainWindow::templateManager() {
222 return m_tempManager; 223 return m_tempManager;
223} 224}
224Editor* MainWindow::currentEditor() { 225Editor* MainWindow::currentEditor() {
225 return m_curEdit; 226 return m_curEdit;
226} 227}
227TodoShow* MainWindow::currentShow() { 228TodoShow* MainWindow::currentShow() {
228 return m_curShow; 229 return m_curShow;
229} 230}
230void MainWindow::slotReload() { 231void MainWindow::slotReload() {
231 m_syncing = false; 232 m_syncing = false;
232 m_todoMgr.reload(); 233 m_todoMgr.reload();
233 currentView()->updateView( ); 234 currentView()->updateView( );
234 raiseCurrentView(); 235 raiseCurrentView();
235} 236}
236void MainWindow::closeEvent( QCloseEvent* e ) { 237void MainWindow::closeEvent( QCloseEvent* e ) {
237 if (m_stack->visibleWidget() == currentShow()->widget() ) { 238 if (m_stack->visibleWidget() == currentShow()->widget() ) {
238 m_showing = false; 239 m_showing = false;
239 raiseCurrentView(); 240 raiseCurrentView();
240 e->ignore(); 241 e->ignore();
241 return; 242 return;
242 } 243 }
243 /* 244 /*
244 * we should have flushed and now we're still saving 245 * we should have flushed and now we're still saving
245 * so there is no need to flush 246 * so there is no need to flush
246 */ 247 */
247 if (m_syncing ) { 248 if (m_syncing ) {
248 e->accept(); 249 e->accept();
249 return; 250 return;
250 } 251 }
251 bool quit = false; 252 bool quit = false;
252 if ( m_todoMgr.saveAll() ){ 253 if ( m_todoMgr.saveAll() ){
253 quit = true; 254 quit = true;
254 }else { 255 }else {
255 if ( QMessageBox::critical( this, QWidget::tr("Out of space"), 256 if ( QMessageBox::critical( this, QWidget::tr("Out of space"),
256 QWidget::tr("Todo was unable\n" 257 QWidget::tr("Todo was unable\n"
257 "to save your changes.\n" 258 "to save your changes.\n"
258 "Free up some space\n" 259 "Free up some space\n"
259 "and try again.\n" 260 "and try again.\n"
260 "\nQuit Anyway?"), 261 "\nQuit Anyway?"),
261 QMessageBox::Yes|QMessageBox::Escape, 262 QMessageBox::Yes|QMessageBox::Escape,
262 QMessageBox::No|QMessageBox::Default) 263 QMessageBox::No|QMessageBox::Default)
263 != QMessageBox::No ) { 264 != QMessageBox::No ) {
264 e->accept(); 265 e->accept();
265 quit = true; 266 quit = true;
266 }else 267 }else
267 e->ignore(); 268 e->ignore();
268 269
269 } 270 }
270 271
271 if (quit ) { 272 if (quit ) {
272 Config config( "todo" ); 273 Config config( "todo" );
273 config.setGroup( "View" ); 274 config.setGroup( "View" );
274 config.writeEntry( "ShowComplete", showCompleted() ); 275 config.writeEntry( "ShowComplete", showCompleted() );
275 config.writeEntry( "Category", currentCategory() ); 276 config.writeEntry( "Category", currentCategory() );
276 config.writeEntry( "ShowDeadLine", showDeadline()); 277 config.writeEntry( "ShowDeadLine", showDeadline());
277 config.writeEntry( "ShowOverDue", showOverDue() ); 278 config.writeEntry( "ShowOverDue", showOverDue() );
278 config.writeEntry( "ShowQuickTask", showQuickTask() ); 279 config.writeEntry( "ShowQuickTask", showQuickTask() );
279 /* save templates */ 280 /* save templates */
280 templateManager()->save(); 281 templateManager()->save();
281 e->accept(); 282 e->accept();
282 QTimer::singleShot(0, qApp, SLOT(closeAllWindows()) ); 283 QTimer::singleShot(0, qApp, SLOT(closeAllWindows()) );
283 } 284 }
284} 285}
285void MainWindow::slotItemNew() { 286void MainWindow::slotItemNew() {
286 NewTaskDlg dlg( templateManager()->templates(), this ); 287 NewTaskDlg dlg( templateManager()->templates(), this );
287 if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted ) { 288 if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted ) {
288 QString tempName = dlg.tempSelected(); 289 QString tempName = dlg.tempSelected();
289 if ( tempName.isNull() ) 290 if ( tempName.isNull() )
290 // Create new, blank task 291 // Create new, blank task
291 create(); 292 create();
292 else { 293 else {
293 // Create new task from the template selected 294 // Create new task from the template selected
294 OPimTodo event = templateManager()->templateEvent( tempName ); 295 OPimTodo event = templateManager()->templateEvent( tempName );
295 event = currentEditor()->edit( this, event ); 296 event = currentEditor()->edit( this, event );
296 if ( currentEditor()->accepted() ) { 297 if ( currentEditor()->accepted() ) {
297 event.setUid( 1 ); 298 event.setUid( 1 );
298 handleAlarms( OPimTodo(), event ); 299 handleAlarms( OPimTodo(), event );
299 m_todoMgr.add( event ); 300 m_todoMgr.add( event );
300 currentView()->addEvent( event ); 301 currentView()->addEvent( event );
301 302
302 reloadCategories(); 303 reloadCategories();
303 } 304 }
304 raiseCurrentView(); 305 raiseCurrentView();
305 } 306 }
306 } 307 }
307} 308}
308void MainWindow::slotItemEdit() { 309void MainWindow::slotItemEdit() {
309 slotEdit( currentView()->current() ); 310 slotEdit( currentView()->current() );
310} 311}
311void MainWindow::slotItemDuplicate() { 312void MainWindow::slotItemDuplicate() {
312 if(m_syncing) { 313 if(m_syncing) {
313 QMessageBox::warning(this, QWidget::tr("Todo"), 314 QMessageBox::warning(this, QWidget::tr("Todo"),
314 QWidget::tr("Data can not be edited, currently syncing")); 315 QWidget::tr("Data can not be edited, currently syncing"));
315 return; 316 return;
316 } 317 }
317 OPimTodo ev = m_todoMgr.event( currentView()->current() ); 318 OPimTodo ev = m_todoMgr.event( currentView()->current() );
318 /* let's generate a new uid */ 319 /* let's generate a new uid */
319 ev.setUid(1); 320 ev.setUid(1);
320 m_todoMgr.add( ev ); 321 m_todoMgr.add( ev );
321 322
322 currentView()->addEvent( ev ); 323 currentView()->addEvent( ev );
323 raiseCurrentView(); 324 raiseCurrentView();
324} 325}
325void MainWindow::slotItemDelete() { 326void MainWindow::slotItemDelete() {
326 if (!currentView()->current() ) 327 if (!currentView()->current() )
327 return; 328 return;
328 329
329 if(m_syncing) { 330 if(m_syncing) {
330 QMessageBox::warning(this, QWidget::tr("Todo"), 331 QMessageBox::warning(this, QWidget::tr("Todo"),
331 QWidget::tr("Data can not be edited, currently syncing")); 332 QWidget::tr("Data can not be edited, currently syncing"));
332 return; 333 return;
333 } 334 }
334 QString strName = currentView()->currentRepresentation(); 335 QString strName = currentView()->currentRepresentation();
335 if (!QPEMessageBox::confirmDelete(this, QWidget::tr("Todo"), strName ) ) 336 if (!QPEMessageBox::confirmDelete(this, QWidget::tr("Todo"), strName ) )
336 return; 337 return;
337 338
338 handleAlarms( m_todoMgr.event( currentView()->current() ), OPimTodo() ); 339 handleAlarms( m_todoMgr.event( currentView()->current() ), OPimTodo() );
339 m_todoMgr.remove( currentView()->current() ); 340 m_todoMgr.remove( currentView()->current() );
340 currentView()->removeEvent( currentView()->current() ); 341 currentView()->removeEvent( currentView()->current() );
341 raiseCurrentView(); 342 raiseCurrentView();
342} 343}
343 344
344static const char *beamfile = "/tmp/opie-todo.vcs"; 345static const char *beamfile = "/tmp/opie-todo.vcs";
345void MainWindow::slotItemBeam() { 346void MainWindow::slotItemBeam() {
346 beam( currentView()->current() ); 347 beam( currentView()->current() );
347} 348}
348void MainWindow::slotItemFind() { 349void MainWindow::slotItemFind() {
349} 350}
350void MainWindow::slotConfigure() { 351void MainWindow::slotConfigure() {
351 TemplateDialogImpl dlg( this, m_tempManager ); 352 TemplateDialogImpl dlg( this, m_tempManager );
352 if ( QPEApplication::execDialog( &dlg ) != QDialog::Accepted ) 353 if ( QPEApplication::execDialog( &dlg ) != QDialog::Accepted )
353 m_tempManager->load(); 354 m_tempManager->load();
354} 355}
355void MainWindow::slotDelete(int uid ) { 356void MainWindow::slotDelete(int uid ) {
356 if( uid == 0 ) return; 357 if( uid == 0 ) return;
357 if(m_syncing) { 358 if(m_syncing) {
358 QMessageBox::warning(this, QWidget::tr("Todo"), 359 QMessageBox::warning(this, QWidget::tr("Todo"),
359 QWidget::tr("Data can not be edited, currently syncing")); 360 QWidget::tr("Data can not be edited, currently syncing"));
360 return; 361 return;
361 } 362 }
362 OPimTodo to = m_todoMgr.event(uid); 363 OPimTodo to = m_todoMgr.event(uid);
363 if (!QPEMessageBox::confirmDelete(this, QWidget::tr("Todo"), to.toShortText() ) ) 364 if (!QPEMessageBox::confirmDelete(this, QWidget::tr("Todo"), to.toShortText() ) )
364 return; 365 return;
365 366
366 handleAlarms(to, OPimTodo() ); 367 handleAlarms(to, OPimTodo() );
367 m_todoMgr.remove( to.uid() ); 368 m_todoMgr.remove( to.uid() );
368 currentView()->removeEvent( to.uid() ); 369 currentView()->removeEvent( to.uid() );
369 raiseCurrentView(); 370 raiseCurrentView();
370} 371}
371void MainWindow::slotDeleteAll() { 372void MainWindow::slotDeleteAll() {
372 if(m_syncing) { 373 if(m_syncing) {
373 QMessageBox::warning(this, QWidget::tr("Todo"), 374 QMessageBox::warning(this, QWidget::tr("Todo"),
374 QWidget::tr("Data can not be edited, currently syncing")); 375 QWidget::tr("Data can not be edited, currently syncing"));
375 return; 376 return;
376 } 377 }
377 378
378 379
379 if ( !QPEMessageBox::confirmDelete( this, QWidget::tr( "Todo" ), QWidget::tr("all tasks?") ) ) 380 if ( !QPEMessageBox::confirmDelete( this, QWidget::tr( "Todo" ), QWidget::tr("all tasks?") ) )
380 return; 381 return;
381 382
382 m_todoMgr.removeAll(); 383 m_todoMgr.removeAll();
383 currentView()->clear(); 384 currentView()->clear();
384 385
385 raiseCurrentView(); 386 raiseCurrentView();
386} 387}
387void MainWindow::slotDeleteCompleted() { 388void MainWindow::slotDeleteCompleted() {
388 if(m_syncing) { 389 if(m_syncing) {
389 QMessageBox::warning(this, QWidget::tr("Todo"), 390 QMessageBox::warning(this, QWidget::tr("Todo"),
390 QWidget::tr("Data can not be edited, currently syncing")); 391 QWidget::tr("Data can not be edited, currently syncing"));
391 return; 392 return;
392 } 393 }
393 394
394 if ( !QPEMessageBox::confirmDelete( this, QWidget::tr( "Todo" ), QWidget::tr("all completed tasks?") ) ) 395 if ( !QPEMessageBox::confirmDelete( this, QWidget::tr( "Todo" ), QWidget::tr("all completed tasks?") ) )
395 return; 396 return;
396 397
397 398
398 m_todoMgr.removeCompleted(); 399 m_todoMgr.removeCompleted();
399 currentView()->updateView( ); 400 currentView()->updateView( );
400} 401}
401/* 402/*
402 * set the category 403 * set the category
403 */ 404 */
404void MainWindow::setCategory( const QString &category ) { 405void MainWindow::setCategory( const QString &category ) {
405 m_curCat = category; 406 m_curCat = category;
406 if ( m_curCat == tr( "All" ) ) 407 if ( m_curCat == tr( "All" ) )
407 m_curCat = QString::null; 408 m_curCat = QString::null;
408 409
409 currentView()->setShowCategory( m_curCat ); 410 currentView()->setShowCategory( m_curCat );
410 raiseCurrentView(); 411 raiseCurrentView();
411} 412}
412void MainWindow::slotShowDeadLine( bool dead) { 413void MainWindow::slotShowDeadLine( bool dead) {
413 m_deadline = dead; 414 m_deadline = dead;
414 currentView()->setShowDeadline( dead ); 415 currentView()->setShowDeadline( dead );
415} 416}
416void MainWindow::slotShowCompleted( bool show) { 417void MainWindow::slotShowCompleted( bool show) {
417 m_completed = show; 418 m_completed = show;
418 currentView()->setShowCompleted( m_completed ); 419 currentView()->setShowCompleted( m_completed );
419} 420}
420void MainWindow::slotShowQuickTask( bool show ) { 421void MainWindow::slotShowQuickTask( bool show ) {
421 m_quicktask = show; 422 m_quicktask = show;
422 if ( m_quicktask ) 423 if ( m_quicktask )
423 m_curQuick->widget()->show(); 424 m_curQuick->widget()->show();
424 else 425 else
425 m_curQuick->widget()->hide(); 426 m_curQuick->widget()->hide();
426} 427}
427bool MainWindow::showOverDue()const { 428bool MainWindow::showOverDue()const {
428 return m_overdue; 429 return m_overdue;
429} 430}
430void MainWindow::setDocument( const QString& fi) { 431void MainWindow::setDocument( const QString& fi) {
431 DocLnk doc(fi); 432 DocLnk doc(fi);
432 if (doc.isValid() ) 433 if (doc.isValid() )
433 receiveFile(doc.file() ); 434 receiveFile(doc.file() );
434 else 435 else
435 receiveFile(fi ); 436 receiveFile(fi );
436} 437}
437void MainWindow::beamDone( Ir* ir) { 438void MainWindow::beamDone( Ir* ir) {
438 delete ir; 439 delete ir;
439 ::unlink( beamfile ); 440 ::unlink( beamfile );
440} 441}
441void MainWindow::receiveFile( const QString& filename ) { 442void MainWindow::receiveFile( const QString& filename ) {
442 OPimTodoAccessVCal* cal = new OPimTodoAccessVCal(filename ); 443 OPimTodoAccessVCal* cal = new OPimTodoAccessVCal(filename );
443 444
444 OPimTodoAccess acc( cal ); 445 OPimTodoAccess acc( cal );
445 acc.load(); 446 acc.load();
446 OPimTodoAccess::List list = acc.allRecords(); 447 OPimTodoAccess::List list = acc.allRecords();
447 448
448 if (list.count()){ 449 if (list.count()){
449 450
450 QString message = QWidget::tr("<P>%1 new tasks arrived.<p>Would you like to add them to your Todolist?").arg(list.count() ); 451 QString message = QWidget::tr("<P>%1 new tasks arrived.<p>Would you like to add them to your Todolist?").arg(list.count() );
451 452
452 if ( QMessageBox::information(this, QWidget::tr("New Tasks"), 453 if ( QMessageBox::information(this, QWidget::tr("New Tasks"),
453 message, QMessageBox::Ok, 454 message, QMessageBox::Ok,
454 QMessageBox::Cancel ) == QMessageBox::Ok ) { 455 QMessageBox::Cancel ) == QMessageBox::Ok ) {
455 OPimTodoAccess::List::Iterator it; 456 OPimTodoAccess::List::Iterator it;
456 for ( it = list.begin(); it != list.end(); ++it ) 457 for ( it = list.begin(); it != list.end(); ++it )
457 m_todoMgr.add( (*it) ); 458 m_todoMgr.add( (*it) );
458 459
459 currentView()->updateView(); 460 currentView()->updateView();
460 } 461 }
461 } 462 }
462} 463}
463 464
464void MainWindow::slotFlush() { 465void MainWindow::slotFlush() {
465 m_syncing = true; 466 m_syncing = true;
466 m_todoMgr.save(); 467 m_todoMgr.save();
467} 468}
468void MainWindow::slotShowDetails() { 469void MainWindow::slotShowDetails() {
469 slotShow( currentView()->current() ); 470 slotShow( currentView()->current() );
470} 471}
471bool MainWindow::showCompleted()const { 472bool MainWindow::showCompleted()const {
472 return m_completed; 473 return m_completed;
473} 474}
474bool MainWindow::showDeadline()const { 475bool MainWindow::showDeadline()const {
475 return m_deadline; 476 return m_deadline;
476} 477}
477bool MainWindow::showQuickTask()const { 478bool MainWindow::showQuickTask()const {
478 return m_quicktask; 479 return m_quicktask;
479} 480}
480QString MainWindow::currentCategory()const { 481QString MainWindow::currentCategory()const {
481 return m_curCat; 482 return m_curCat;
482} 483}
483int MainWindow::currentCatId() { 484int MainWindow::currentCatId() {
484 return m_todoMgr.catId( m_curCat ); 485 return m_todoMgr.catId( m_curCat );
485} 486}
486ViewBase* MainWindow::currentView() { 487ViewBase* MainWindow::currentView() {
487 return m_curView; 488 return m_curView;
488} 489}
489void MainWindow::raiseCurrentView() { 490void MainWindow::raiseCurrentView() {
490 // due QPE/Application/todolist show(int) 491 // due QPE/Application/todolist show(int)
491 // we might not have the populateCategories slot called once 492 // we might not have the populateCategories slot called once
492 // we would show the otodo but then imediately switch to the currentView 493 // we would show the otodo but then imediately switch to the currentView
493 // if we're initially showing we shouldn't raise the table 494 // if we're initially showing we shouldn't raise the table
494 // in returnFromView we fix up m_showing 495 // in returnFromView we fix up m_showing
495 if (m_showing ) return; 496 if (m_showing ) return;
496 497
497 m_stack->raiseWidget( m_curView->widget() ); 498 m_stack->raiseWidget( m_curView->widget() );
498} 499}
499void MainWindow::slotShowDue(bool ov) { 500void MainWindow::slotShowDue(bool ov) {
500 m_overdue = ov; 501 m_overdue = ov;
501 currentView()->showOverDue( ov ); 502 currentView()->showOverDue( ov );
502 raiseCurrentView(); 503 raiseCurrentView();
503} 504}
504void MainWindow::slotShow( int uid ) { 505void MainWindow::slotShow( int uid ) {
505 if ( uid == 0 ) return; 506 if ( uid == 0 ) return;
506 507
507 508
508 currentShow()->slotShow( event( uid ) ); 509 currentShow()->slotShow( event( uid ) );
509 m_stack->raiseWidget( currentShow()->widget() ); 510 m_stack->raiseWidget( currentShow()->widget() );
510} 511}
511void MainWindow::slotShowNext() { 512void MainWindow::slotShowNext() {
512 int l = currentView()->next(); 513 int l = currentView()->next();
513 if (l!=0) 514 if (l!=0)
514 slotShow(l); 515 slotShow(l);
515} 516}
516void MainWindow::slotShowPrev() { 517void MainWindow::slotShowPrev() {
517 int l = currentView()->prev(); 518 int l = currentView()->prev();
518 if (l!=0) 519 if (l!=0)
519 slotShow(l); 520 slotShow(l);
520} 521}
521void MainWindow::slotEdit( int uid ) { 522void MainWindow::slotEdit( int uid ) {
522 if (uid == 0 ) return; 523 if (uid == 0 ) return;
523 if(m_syncing) { 524 if(m_syncing) {
524 QMessageBox::warning(this, QWidget::tr("Todo"), 525 QMessageBox::warning(this, QWidget::tr("Todo"),
525 QWidget::tr("Data can't be edited, currently syncing")); 526 QWidget::tr("Data can't be edited, currently syncing"));
526 return; 527 return;
527 } 528 }
528 529
529 OPimTodo old_todo = m_todoMgr.event( uid ); 530 OPimTodo old_todo = m_todoMgr.event( uid );
530 531
531 OPimTodo todo = currentEditor()->edit(this, old_todo ); 532 OPimTodo todo = currentEditor()->edit(this, old_todo );
532 533
533 /* if completed */ 534 /* if completed */
534 if ( currentEditor()->accepted() ) { 535 if ( currentEditor()->accepted() ) {
535 handleAlarms( old_todo, todo ); 536 handleAlarms( old_todo, todo );
536 m_todoMgr.update( todo.uid(), todo ); 537 m_todoMgr.update( todo.uid(), todo );
537 currentView()->replaceEvent( todo ); 538 currentView()->replaceEvent( todo );
538 /* a Category might have changed */ 539 /* a Category might have changed */
539 reloadCategories(); 540 reloadCategories();
540 } 541 }
541 542
542 raiseCurrentView(); 543 raiseCurrentView();
543} 544}
544/* 545/*
545void MainWindow::slotUpdate1( int uid, const SmallTodo& ev) { 546void MainWindow::slotUpdate1( int uid, const SmallTodo& ev) {
546 m_todoMgr.update( uid, ev ); 547 m_todoMgr.update( uid, ev );
547} 548}
548*/ 549*/
549void MainWindow::updateTodo( const OPimTodo& ev) { 550void MainWindow::updateTodo( const OPimTodo& ev) {
550 m_todoMgr.update( ev.uid() , ev ); 551 m_todoMgr.update( ev.uid() , ev );
551} 552}
552/* The view changed it's configuration 553/* The view changed it's configuration
553 * update the view menu 554 * update the view menu
554 */ 555 */
555void MainWindow::slotUpdate3( QWidget* ) { 556void MainWindow::slotUpdate3( QWidget* ) {
556 557
557} 558}
558void MainWindow::updateList() { 559void MainWindow::updateList() {
559 m_todoMgr.updateList(); 560 m_todoMgr.updateList();
560} 561}
561void MainWindow::setReadAhead( uint count ) { 562void MainWindow::setReadAhead( uint count ) {
562 if (m_todoMgr.todoDB() ) 563 if (m_todoMgr.todoDB() )
563 m_todoMgr.todoDB()->setReadAhead( count ); 564 m_todoMgr.todoDB()->setReadAhead( count );
564} 565}
565void MainWindow::slotQuickEntered() { 566void MainWindow::slotQuickEntered() {
566 OPimTodo todo = quickEditor()->todo(); 567 OPimTodo todo = quickEditor()->todo();
567 if (todo.isEmpty() ) 568 if (todo.isEmpty() )
568 return; 569 return;
569 570
570 m_todoMgr.add( todo ); 571 m_todoMgr.add( todo );
571 currentView()->addEvent( todo ); 572 currentView()->addEvent( todo );
572 raiseCurrentView(); 573 raiseCurrentView();
573} 574}
574QuickEditBase* MainWindow::quickEditor() { 575QuickEditBase* MainWindow::quickEditor() {
575 return m_curQuick; 576 return m_curQuick;
576} 577}
577void MainWindow::slotComplete( int uid ) { 578void MainWindow::slotComplete( int uid ) {
578 slotComplete( event(uid) ); 579 slotComplete( event(uid) );
579} 580}
580void MainWindow::slotComplete( const OPimTodo& todo ) { 581void MainWindow::slotComplete( const OPimTodo& todo ) {
581 OPimTodo to = todo; 582 OPimTodo to = todo;
582 to.setCompleted( !to.isCompleted() ); 583 to.setCompleted( !to.isCompleted() );
583 to.setCompletedDate( QDate::currentDate() ); 584 to.setCompletedDate( QDate::currentDate() );
584 585
585 /* 586 /*
586 * if the item does recur 587 * if the item does recur
587 * we need to spin it off 588 * we need to spin it off
588 * and update the items duedate to the next 589 * and update the items duedate to the next
589 * possible recurrance of this item... 590 * possible recurrance of this item...
590 * the spinned off one will loose the 591 * the spinned off one will loose the
591 * recurrence. 592 * recurrence.
592 * We calculate the difference between the old due date and the 593 * We calculate the difference between the old due date and the
593 * new one and add this diff to start, completed and alarm dates 594 * new one and add this diff to start, completed and alarm dates
594 * -zecke 595 * -zecke
595 */ 596 */
596 if ( to.hasRecurrence() && to.isCompleted() ) { 597 if ( to.hasRecurrence() && to.isCompleted() ) {
597 OPimTodo to2( to ); 598 OPimTodo to2( to );
598 599
599 /* the spinned off one won't recur anymore */ 600 /* the spinned off one won't recur anymore */
600 to.setRecurrence( OPimRecurrence() ); 601 to.setRecurrence( OPimRecurrence() );
601 602
602 OPimRecurrence rec = to2.recurrence(); 603 OPimRecurrence rec = to2.recurrence();
603 rec.setStart( to.dueDate() ); 604 rec.setStart( to.dueDate() );
604 to2.setRecurrence( rec ); 605 to2.setRecurrence( rec );
605 /* 606 /*
606 * if there is a next occurence 607 * if there is a next occurence
607 * from the duedate of the last recurrance 608 * from the duedate of the last recurrance
608 */ 609 */
609 QDate date; 610 QDate date;
610 if ( to2.recurrence().nextOcurrence( to2.dueDate().addDays(1), date ) ) { 611 if ( to2.recurrence().nextOcurrence( to2.dueDate().addDays(1), date ) ) {
611 int dayDiff = to.dueDate().daysTo( date ); 612 int dayDiff = to.dueDate().daysTo( date );
612 QDate inval; 613 QDate inval;
613 /* generate a new uid for the old record */ 614 /* generate a new uid for the old record */
614 to.setUid( 1 ); 615 to.setUid( 1 );
615 616
616 /* add the old one cause it has a new UID here cause it was spin off */ 617 /* add the old one cause it has a new UID here cause it was spin off */
617 m_todoMgr.add( to ); 618 m_todoMgr.add( to );
618 619
619 /* 620 /*
620 * update the due date 621 * update the due date
621 * start date 622 * start date
622 * and complete date 623 * and complete date
623 */ 624 */
624 to2.setDueDate( date ); 625 to2.setDueDate( date );
625 rec.setStart( date ); 626 rec.setStart( date );
626 to2.setRecurrence( rec ); // could be Monday, TuesDay, Thursday every week 627 to2.setRecurrence( rec ); // could be Monday, TuesDay, Thursday every week
627 628
628 /* move start date */ 629 /* move start date */
629 if (to2.hasStartDate() ) 630 if (to2.hasStartDate() )
630 to2.setStartDate( to2.startDate().addDays( dayDiff ) ); 631 to2.setStartDate( to2.startDate().addDays( dayDiff ) );
631 632
632 /* now the alarms */ 633 /* now the alarms */
633 if (to2.hasNotifiers() ) { 634 if (to2.hasNotifiers() ) {
634 OPimNotifyManager::Alarms _als = to2.notifiers().alarms(); 635 OPimNotifyManager::Alarms _als = to2.notifiers().alarms();
635 OPimNotifyManager::Alarms als; 636 OPimNotifyManager::Alarms als;
636 637
637 /* for every alarm move the day */ 638 /* for every alarm move the day */
638 for ( OPimNotifyManager::Alarms::Iterator it = _als.begin(); it != _als.end(); ++it ) { 639 for ( OPimNotifyManager::Alarms::Iterator it = _als.begin(); it != _als.end(); ++it ) {
639 OPimAlarm al = (*it); 640 OPimAlarm al = (*it);
640 al.setDateTime( al.dateTime().addDays( dayDiff ) ); 641 al.setDateTime( al.dateTime().addDays( dayDiff ) );
641 als.append( al ); 642 als.append( al );
642 } 643 }
643 to2.notifiers().setAlarms( als ); 644 to2.notifiers().setAlarms( als );
644 handleAlarms( OPimTodo(), todo ); 645 handleAlarms( OPimTodo(), todo );
645 } 646 }
646 to2.setCompletedDate( inval ); 647 to2.setCompletedDate( inval );
647 to2.setCompleted( false ); 648 to2.setCompleted( false );
648 649
649 updateTodo( to2 ); 650 updateTodo( to2 );
650 }else 651 }else
651 updateTodo( to ); 652 updateTodo( to );
652 }else 653 }else
653 updateTodo( to ); 654 updateTodo( to );
654 655
655 currentView()->updateView(); 656 currentView()->updateView();
656 raiseCurrentView(); 657 raiseCurrentView();
657} 658}
658void MainWindow::flush() { 659void MainWindow::flush() {
659 slotFlush(); 660 slotFlush();
660} 661}
661void MainWindow::reload() { 662void MainWindow::reload() {
662 slotReload(); 663 slotReload();
663} 664}
664int MainWindow::create() { 665int MainWindow::create() {
665 int uid = 0; 666 int uid = 0;
666 if(m_syncing) { 667 if(m_syncing) {
667 QMessageBox::warning(this, QWidget::tr("Todo"), 668 QMessageBox::warning(this, QWidget::tr("Todo"),
668 QWidget::tr("Data can not be edited, currently syncing")); 669 QWidget::tr("Data can not be edited, currently syncing"));
669 return uid; 670 return uid;
670 } 671 }
671 m_todoMgr.load(); 672 m_todoMgr.load();
672 673
673 674
674 OPimTodo todo = currentEditor()->newTodo( currentCatId(), 675 OPimTodo todo = currentEditor()->newTodo( currentCatId(),
675 this ); 676 this );
676 677
677 if ( currentEditor()->accepted() ) { 678 if ( currentEditor()->accepted() ) {
678 //todo.assignUid(); 679 //todo.assignUid();
679 uid = todo.uid(); 680 uid = todo.uid();
680 handleAlarms( OPimTodo(), todo ); 681 handleAlarms( OPimTodo(), todo );
681 m_todoMgr.add( todo ); 682 m_todoMgr.add( todo );
682 currentView()->addEvent( todo ); 683 currentView()->addEvent( todo );
683 684
684 685
685 // I'm afraid we must call this every time now, otherwise 686 // I'm afraid we must call this every time now, otherwise
686 // spend expensive time comparing all these strings... 687 // spend expensive time comparing all these strings...
687 // but only call if we changed something -zecke 688 // but only call if we changed something -zecke
688 reloadCategories(); 689 reloadCategories();
689 } 690 }
690 raiseCurrentView( ); 691 raiseCurrentView( );
691 692
692 return uid; 693 return uid;
693} 694}
694/* delete it silently... */ 695/* delete it silently... */
695bool MainWindow::remove( int uid ) { 696bool MainWindow::remove( int uid ) {
696 if (m_syncing) return false; 697 if (m_syncing) return false;
697 698
698 /* argh need to get the whole OEvent... to disable alarms -zecke */ 699 /* argh need to get the whole OEvent... to disable alarms -zecke */
699 handleAlarms( OPimTodo(), m_todoMgr.event( uid ) ); 700 handleAlarms( OPimTodo(), m_todoMgr.event( uid ) );
700 701
701 return m_todoMgr.remove( uid ); 702 return m_todoMgr.remove( uid );
702} 703}
703void MainWindow::beam( int uid) { 704void MainWindow::beam( int uid) {
704 if( uid == 0 ) return; 705 if( uid == 0 ) return;
705 706
706 ::unlink( beamfile ); 707 ::unlink( beamfile );
707 m_todoMgr.load(); 708 m_todoMgr.load();
708 709
709 OPimTodo todo = event( uid ); 710 OPimTodo todo = event( uid );
710 OPimTodoAccessVCal* cal = new OPimTodoAccessVCal(QString::fromLatin1(beamfile) ); 711 OPimTodoAccessVCal* cal = new OPimTodoAccessVCal(QString::fromLatin1(beamfile) );
711 OPimTodoAccess acc( cal ); 712 OPimTodoAccess acc( cal );
712 acc.load(); 713 acc.load();
713 acc.add( todo ); 714 acc.add( todo );
714 acc.save(); 715 acc.save();
715 Ir* ir = new Ir(this ); 716 Ir* ir = new Ir(this );
716 connect(ir, SIGNAL(done(Ir*) ), 717 connect(ir, SIGNAL(done(Ir*) ),
717 this, SLOT(beamDone(Ir*) ) ); 718 this, SLOT(beamDone(Ir*) ) );
718 ir->send(beamfile, todo.summary(), "text/x-vCalendar" ); 719 ir->send(beamfile, todo.summary(), "text/x-vCalendar" );
719} 720}
720void MainWindow::show( int uid ) { 721void MainWindow::show( int uid ) {
721 m_todoMgr.load(); // might not be loaded yet 722 m_todoMgr.load(); // might not be loaded yet
722 m_showing = true; 723 m_showing = true;
723 slotShow( uid ); 724 slotShow( uid );
724 raise(); 725 raise();
725 QPEApplication::setKeepRunning(); 726 QPEApplication::setKeepRunning();
726} 727}
727void MainWindow::edit( int uid ) { 728void MainWindow::edit( int uid ) {
728 m_todoMgr.load(); 729 m_todoMgr.load();
729 slotEdit( uid ); 730 slotEdit( uid );
730} 731}
731void MainWindow::add( const OPimRecord& rec) { 732void MainWindow::add( const OPimRecord& rec) {
732 OPimTodo test; 733 OPimTodo test;
733 if ( rec.rtti() != test.rtti() ) return; 734 if ( rec.rtti() != test.rtti() ) return;
734 m_todoMgr.load(); // might not be loaded 735 m_todoMgr.load(); // might not be loaded
735 736
736 const OPimTodo& todo = static_cast<const OPimTodo&>(rec); 737 const OPimTodo& todo = static_cast<const OPimTodo&>(rec);
737 738
738 m_todoMgr.add(todo ); 739 m_todoMgr.add(todo );
739 currentView()->addEvent( todo ); 740 currentView()->addEvent( todo );
740 741
741 742
742 // I'm afraid we must call this every time now, otherwise 743 // I'm afraid we must call this every time now, otherwise
743 // spend expensive time comparing all these strings... 744 // spend expensive time comparing all these strings...
744 // but only call if we changed something -zecke 745 // but only call if we changed something -zecke
745 reloadCategories(); 746 reloadCategories();
746} 747}
747void MainWindow::slotReturnFromView() { 748void MainWindow::slotReturnFromView() {
748 m_showing = false; 749 m_showing = false;
749 raiseCurrentView(); 750 raiseCurrentView();
750} 751}
751 752
752namespace { 753namespace {
753 OPimNotifyManager::Alarms findNonMatching( const OPimNotifyManager::Alarms& oldAls, 754 OPimNotifyManager::Alarms findNonMatching( const OPimNotifyManager::Alarms& oldAls,
754 const OPimNotifyManager::Alarms& newAls ) { 755 const OPimNotifyManager::Alarms& newAls ) {
755 OPimNotifyManager::Alarms nonMatching; 756 OPimNotifyManager::Alarms nonMatching;
756 OPimNotifyManager::Alarms::ConstIterator oldIt = oldAls.begin(); 757 OPimNotifyManager::Alarms::ConstIterator oldIt = oldAls.begin();
757 OPimNotifyManager::Alarms::ConstIterator newIt; 758 OPimNotifyManager::Alarms::ConstIterator newIt;
758 for ( ; oldIt != oldAls.end(); ++oldIt ) { 759 for ( ; oldIt != oldAls.end(); ++oldIt ) {
759 bool found = false; 760 bool found = false;
760 QDateTime oldDt = (*oldIt).dateTime(); 761 QDateTime oldDt = (*oldIt).dateTime();
761 for (newIt= newAls.begin(); newIt != newAls.end(); ++newIt ) { 762 for (newIt= newAls.begin(); newIt != newAls.end(); ++newIt ) {
762 if ( oldDt == (*newIt).dateTime() ) { 763 if ( oldDt == (*newIt).dateTime() ) {
763 found = true; 764 found = true;
764 break; 765 break;
765 } 766 }
766 } 767 }
767 if (!found) 768 if (!found)
768 nonMatching.append( (*oldIt) ); 769 nonMatching.append( (*oldIt) );
769 } 770 }
770 return nonMatching; 771 return nonMatching;
771 } 772 }
772 void addAlarms( const OPimNotifyManager::Alarms& als, int uid ) { 773 void addAlarms( const OPimNotifyManager::Alarms& als, int uid ) {
773 OPimNotifyManager::Alarms::ConstIterator it; 774 OPimNotifyManager::Alarms::ConstIterator it;
774 for ( it = als.begin(); it != als.end(); ++it ) { 775 for ( it = als.begin(); it != als.end(); ++it ) {
775 AlarmServer::addAlarm( (*it).dateTime(), "QPE/Application/todolist", "alarm(QDateTime,int)", uid ); 776 AlarmServer::addAlarm( (*it).dateTime(), "QPE/Application/todolist", "alarm(QDateTime,int)", uid );
776 } 777 }
777 778
778 } 779 }
779 void removeAlarms( const OPimNotifyManager::Alarms& als, int uid ) { 780 void removeAlarms( const OPimNotifyManager::Alarms& als, int uid ) {
780 OPimNotifyManager::Alarms::ConstIterator it; 781 OPimNotifyManager::Alarms::ConstIterator it;
781 for ( it = als.begin(); it != als.end(); ++it ) { 782 for ( it = als.begin(); it != als.end(); ++it ) {
782 AlarmServer::deleteAlarm( (*it).dateTime(), "QPE/Application/todolist", "alarm(QDateTime,int)", uid ); 783 AlarmServer::deleteAlarm( (*it).dateTime(), "QPE/Application/todolist", "alarm(QDateTime,int)", uid );
783 } 784 }
784 } 785 }
785} 786}
786 787
787void MainWindow::handleAlarms( const OPimTodo& oldTodo, const OPimTodo& newTodo) { 788void MainWindow::handleAlarms( const OPimTodo& oldTodo, const OPimTodo& newTodo) {
788 /* 789 /*
789 * if oldTodo is not empty and has notifiers we need to find the deleted ones 790 * if oldTodo is not empty and has notifiers we need to find the deleted ones
790 */ 791 */
791 if(!oldTodo.isEmpty() && oldTodo.hasNotifiers() ) { 792 if(!oldTodo.isEmpty() && oldTodo.hasNotifiers() ) {
792 OPimNotifyManager::Alarms removed; 793 OPimNotifyManager::Alarms removed;
793 OPimNotifyManager::Alarms oldAls = oldTodo.notifiers().alarms(); 794 OPimNotifyManager::Alarms oldAls = oldTodo.notifiers().alarms();
794 if (!newTodo.hasNotifiers() ) 795 if (!newTodo.hasNotifiers() )
795 removed = oldAls; 796 removed = oldAls;
796 else 797 else
797 removed = findNonMatching( oldAls, newTodo.notifiers().alarms() ); 798 removed = findNonMatching( oldAls, newTodo.notifiers().alarms() );
798 799
799 removeAlarms( removed, oldTodo.uid() ); 800 removeAlarms( removed, oldTodo.uid() );
800 } 801 }
801 if ( newTodo.hasNotifiers() ) { 802 if ( newTodo.hasNotifiers() ) {
802 OPimNotifyManager::Alarms added; 803 OPimNotifyManager::Alarms added;
803 if ( oldTodo.isEmpty() || !oldTodo.hasNotifiers() ) 804 if ( oldTodo.isEmpty() || !oldTodo.hasNotifiers() )
804 added = newTodo.notifiers().alarms(); 805 added = newTodo.notifiers().alarms();
805 else 806 else
806 added = findNonMatching( newTodo.notifiers().alarms(), oldTodo.notifiers().alarms() ); 807 added = findNonMatching( newTodo.notifiers().alarms(), oldTodo.notifiers().alarms() );
807 808
808 addAlarms( added, newTodo.uid() ); 809 addAlarms( added, newTodo.uid() );
809 } 810 }
810} 811}
811/* we might have not loaded the db */ 812/* we might have not loaded the db */
812void MainWindow::doAlarm( const QDateTime& dt, int uid ) { 813void MainWindow::doAlarm( const QDateTime& dt, int uid ) {
813 m_todoMgr.load(); 814 m_todoMgr.load();
814 815
815 OPimTodo todo = m_todoMgr.event( uid ); 816 OPimTodo todo = m_todoMgr.event( uid );
816 if (!todo.hasNotifiers() ) return; 817 if (!todo.hasNotifiers() ) return;
817 818
818 /* 819 /*
819 * let's find the right alarm and find out if silent 820 * let's find the right alarm and find out if silent
820 * then show a richtext widget 821 * then show a richtext widget
821 */ 822 */
822 bool loud = false; 823 bool loud = false;
823 OPimNotifyManager::Alarms als = todo.notifiers().alarms(); 824 OPimNotifyManager::Alarms als = todo.notifiers().alarms();
824 OPimNotifyManager::Alarms::Iterator it; 825 OPimNotifyManager::Alarms::Iterator it;
825 for ( it = als.begin(); it != als.end(); ++it ) { 826 for ( it = als.begin(); it != als.end(); ++it ) {
826 if ( (*it).dateTime() == dt ) { 827 if ( (*it).dateTime() == dt ) {
827 loud = ( (*it).sound() == OPimAlarm::Loud ); 828 loud = ( (*it).sound() == OPimAlarm::Loud );
828 break; 829 break;
829 } 830 }
830 } 831 }
831 if (loud) 832 if (loud)
832 startAlarm(); 833 startAlarm();
833 834
834 QDialog dlg(this, 0, true ); 835 QDialog dlg(this, 0, true );
835 QVBoxLayout* lay = new QVBoxLayout( &dlg ); 836 QVBoxLayout* lay = new QVBoxLayout( &dlg );
836 QTextView* view = new QTextView( &dlg ); 837 QTextView* view = new QTextView( &dlg );
837 lay->addWidget( view ); 838 lay->addWidget( view );
838 QPushButton* btnOk = new QPushButton( tr("Ok"), &dlg ); 839 QPushButton* btnOk = new QPushButton( tr("Ok"), &dlg );
839 connect( btnOk, SIGNAL(clicked() ), &dlg, SLOT(accept() ) ); 840 connect( btnOk, SIGNAL(clicked() ), &dlg, SLOT(accept() ) );
840 lay->addWidget( btnOk ); 841 lay->addWidget( btnOk );
841 842
842 QString text = tr("<h1>Alarm at %1</h1><br>").arg( TimeString::dateString( dt ) ); 843 QString text = tr("<h1>Alarm at %1</h1><br>").arg( TimeString::dateString( dt ) );
843 text += todo.toRichText(); 844 text += todo.toRichText();
844 view->setText( text ); 845 view->setText( text );
845 846
846 bool needToStay = QPEApplication::execDialog( &dlg ); 847 bool needToStay = QPEApplication::execDialog( &dlg );
847 848
848 if (loud) 849 if (loud)
849 killAlarm(); 850 killAlarm();
850 851
851 if (needToStay) { 852 if (needToStay) {
852// showMaximized(); 853// showMaximized();
853// raise(); 854// raise();
854 QPEApplication::setKeepRunning(); 855 QPEApplication::setKeepRunning();
855// setActiveWindow(); 856// setActiveWindow();
856 } 857 }
857 858
858} 859}
859 860