summaryrefslogtreecommitdiff
authorzecke <zecke>2003-02-11 18:42:42 (UTC)
committer zecke <zecke>2003-02-11 18:42:42 (UTC)
commit986afbabdd7c291f2fcbecd865e8c7075623bbf8 (patch) (unidiff)
tree7b00ad1e26a47666c05b7040d2218d134f698007
parentcb85b004afe2750733cef1663961539f6a3968e6 (diff)
downloadopie-986afbabdd7c291f2fcbecd865e8c7075623bbf8.zip
opie-986afbabdd7c291f2fcbecd865e8c7075623bbf8.tar.gz
opie-986afbabdd7c291f2fcbecd865e8c7075623bbf8.tar.bz2
Add switching the views with the ActionKey..
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/todo/mainwindow.cpp9
-rw-r--r--core/pim/todo/mainwindow.h2
-rw-r--r--core/pim/todo/tableview.cpp21
-rw-r--r--core/pim/todo/tableview.h1
-rw-r--r--core/pim/todo/textviewshow.cpp17
-rw-r--r--core/pim/todo/textviewshow.h5
-rw-r--r--core/pim/todo/todoshow.cpp9
-rw-r--r--core/pim/todo/todoshow.h7
8 files changed, 58 insertions, 13 deletions
diff --git a/core/pim/todo/mainwindow.cpp b/core/pim/todo/mainwindow.cpp
index c90166b..d328558 100644
--- a/core/pim/todo/mainwindow.cpp
+++ b/core/pim/todo/mainwindow.cpp
@@ -1,815 +1,818 @@
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 <qmenubar.h> 31#include <qmenubar.h>
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 <qwidgetstack.h> 35#include <qwidgetstack.h>
36#include <qaction.h> 36#include <qaction.h>
37#include <qtimer.h> 37#include <qtimer.h>
38#include <qvbox.h> 38#include <qvbox.h>
39#include <qlineedit.h> 39#include <qlineedit.h>
40#include <qwhatsthis.h> 40#include <qwhatsthis.h>
41 41
42#include <qpe/applnk.h> 42#include <qpe/applnk.h>
43#include <qpe/config.h> 43#include <qpe/config.h>
44#include <qpe/ir.h> 44#include <qpe/ir.h>
45#include <qpe/resource.h> 45#include <qpe/resource.h>
46#include <qpe/qpemessagebox.h> 46#include <qpe/qpemessagebox.h>
47#include <qpe/qpetoolbar.h> 47#include <qpe/qpetoolbar.h>
48 48
49#include <opie/orecur.h> 49#include <opie/orecur.h>
50#include <opie/otodoaccessvcal.h> 50#include <opie/otodoaccessvcal.h>
51 51
52#include "quickeditimpl.h" 52#include "quickeditimpl.h"
53#include "todotemplatemanager.h" 53#include "todotemplatemanager.h"
54#include "templateeditor.h" 54#include "templateeditor.h"
55#include "tableview.h" 55#include "tableview.h"
56 56
57#include "textviewshow.h" 57#include "textviewshow.h"
58#include "todoeditor.h" 58#include "todoeditor.h"
59#include "mainwindow.h" 59#include "mainwindow.h"
60 60
61 61
62using namespace Todo; 62using namespace Todo;
63 63
64MainWindow::MainWindow( QWidget* parent, 64MainWindow::MainWindow( QWidget* parent,
65 const char* name ) 65 const char* name )
66 : OPimMainWindow( "Todolist", parent, name, WType_TopLevel | WStyle_ContextHelp ) 66 : OPimMainWindow( "Todolist", parent, name, WType_TopLevel | WStyle_ContextHelp )
67{ 67{
68 m_syncing = false; 68 m_syncing = false;
69 m_counter = 0; 69 m_counter = 0;
70 m_tempManager = new TemplateManager(); 70 m_tempManager = new TemplateManager();
71 m_tempManager->load(); 71 m_tempManager->load();
72 72
73 initUI(); 73 initUI();
74 initConfig(); 74 initConfig();
75 initViews(); 75 initViews();
76 initActions(); 76 initActions();
77 initEditor(); 77 initEditor();
78 initShow(); 78 initShow();
79 initTemplate(); 79 initTemplate();
80 80
81 populateTemplates(); 81 populateTemplates();
82 raiseCurrentView(); 82 raiseCurrentView();
83 QTimer::singleShot(0, this, SLOT(populateCategories() ) ); 83 QTimer::singleShot(0, this, SLOT(populateCategories() ) );
84} 84}
85void MainWindow::initTemplate() { 85void MainWindow::initTemplate() {
86 m_curTempEd = new TemplateEditor( this, templateManager() ); 86 m_curTempEd = new TemplateEditor( this, templateManager() );
87} 87}
88void MainWindow::initActions() { 88void MainWindow::initActions() {
89 89
90 // Data menu 90 // Data menu
91 m_edit->insertItem(QWidget::tr("New from template"), m_template, 91 m_edit->insertItem(QWidget::tr("New from template"), m_template,
92 -1, 0 ); 92 -1, 0 );
93 93
94 QAction* a = new QAction( QWidget::tr("New Task" ), Resource::loadPixmap( "new" ), 94 QAction* a = new QAction( QWidget::tr("New Task" ), Resource::loadPixmap( "new" ),
95 QString::null, 0, this, 0 ); 95 QString::null, 0, this, 0 );
96 connect(a, SIGNAL( activated() ), 96 connect(a, SIGNAL( activated() ),
97 this, SLOT( slotNew() ) ); 97 this, SLOT( slotNew() ) );
98 a->setWhatsThis( QWidget::tr( "Click here to create a new task." ) ); 98 a->setWhatsThis( QWidget::tr( "Click here to create a new task." ) );
99 a->addTo(m_tool ); 99 a->addTo(m_tool );
100 a->addTo(m_edit ); 100 a->addTo(m_edit );
101 101
102 a = new QAction( QWidget::tr("Edit Task"), Resource::loadIconSet( "edit" ), 102 a = new QAction( QWidget::tr("Edit Task"), Resource::loadIconSet( "edit" ),
103 QString::null, 0, this, 0 ); 103 QString::null, 0, this, 0 );
104 connect(a, SIGNAL(activated() ), 104 connect(a, SIGNAL(activated() ),
105 this, SLOT( slotEdit() ) ); 105 this, SLOT( slotEdit() ) );
106 a->setWhatsThis( QWidget::tr( "Click here to modify the current task." ) ); 106 a->setWhatsThis( QWidget::tr( "Click here to modify the current task." ) );
107 a->addTo( m_tool ); 107 a->addTo( m_tool );
108 a->addTo( m_edit ); 108 a->addTo( m_edit );
109 m_editAction = a; 109 m_editAction = a;
110 110
111 a = new QAction( QString::null, QWidget::tr("View Task"), 0, this, 0 ); 111 a = new QAction( QString::null, QWidget::tr("View Task"), 0, this, 0 );
112 connect(a, SIGNAL( activated() ), 112 connect(a, SIGNAL( activated() ),
113 this, SLOT( slotShowDetails() ) ); 113 this, SLOT( slotShowDetails() ) );
114 a->addTo( m_edit ); 114 a->addTo( m_edit );
115 115
116 m_edit->insertSeparator(); 116 m_edit->insertSeparator();
117 117
118 a = new QAction( QWidget::tr("Delete..."), Resource::loadIconSet( "trash" ), 118 a = new QAction( QWidget::tr("Delete..."), Resource::loadIconSet( "trash" ),
119 QString::null, 0, this, 0 ); 119 QString::null, 0, this, 0 );
120 connect(a, SIGNAL(activated() ), 120 connect(a, SIGNAL(activated() ),
121 this, SLOT(slotDelete() ) ); 121 this, SLOT(slotDelete() ) );
122 a->setWhatsThis( QWidget::tr( "Click here to remove the current task." ) ); 122 a->setWhatsThis( QWidget::tr( "Click here to remove the current task." ) );
123 a->addTo( m_tool ); 123 a->addTo( m_tool );
124 a->addTo( m_edit ); 124 a->addTo( m_edit );
125 m_deleteAction = a; 125 m_deleteAction = a;
126 126
127 a = new QAction( QString::null, QWidget::tr("Delete all..."), 0, this, 0 ); 127 a = new QAction( QString::null, QWidget::tr("Delete all..."), 0, this, 0 );
128 connect(a, SIGNAL( activated() ), 128 connect(a, SIGNAL( activated() ),
129 this, SLOT( slotDeleteAll() ) ); 129 this, SLOT( slotDeleteAll() ) );
130 a->addTo(m_edit ); 130 a->addTo(m_edit );
131 m_deleteAllAction = a; 131 m_deleteAllAction = a;
132 132
133 a = new QAction( QString::null, QWidget::tr("Delete completed"), 133 a = new QAction( QString::null, QWidget::tr("Delete completed"),
134 0, this, 0 ); 134 0, this, 0 );
135 connect(a, SIGNAL( activated() ), 135 connect(a, SIGNAL( activated() ),
136 this, SLOT( slotDeleteCompleted() ) ); 136 this, SLOT( slotDeleteCompleted() ) );
137 a->addTo(m_edit ); 137 a->addTo(m_edit );
138 a->setEnabled( TRUE ); 138 a->setEnabled( TRUE );
139 m_deleteCompleteAction = a; 139 m_deleteCompleteAction = a;
140 140
141 m_edit->insertSeparator(); 141 m_edit->insertSeparator();
142 142
143 a = new QAction( QString::null, QWidget::tr("Duplicate"), 0, this, 0 ); 143 a = new QAction( QString::null, QWidget::tr("Duplicate"), 0, this, 0 );
144 connect(a, SIGNAL( activated() ), 144 connect(a, SIGNAL( activated() ),
145 this, SLOT( slotDuplicate() ) ); 145 this, SLOT( slotDuplicate() ) );
146 a->addTo(m_edit ); 146 a->addTo(m_edit );
147 m_duplicateAction = a; 147 m_duplicateAction = a;
148 148
149 m_edit->insertSeparator(); 149 m_edit->insertSeparator();
150 150
151 if ( Ir::supported() ) { 151 if ( Ir::supported() ) {
152 a = new QAction( QWidget::tr( "Beam" ), Resource::loadPixmap( "beam" ), QString::null, 0, this, 0 ); 152 a = new QAction( QWidget::tr( "Beam" ), Resource::loadPixmap( "beam" ), QString::null, 0, this, 0 );
153 connect( a, SIGNAL( activated() ), this, SLOT( slotBeam() ) ); 153 connect( a, SIGNAL( activated() ), this, SLOT( slotBeam() ) );
154 a->setWhatsThis( QWidget::tr( "Click here to send the current task to another device." ) ); 154 a->setWhatsThis( QWidget::tr( "Click here to send the current task to another device." ) );
155 a->addTo( m_edit ); 155 a->addTo( m_edit );
156 a->addTo( m_tool ); 156 a->addTo( m_tool );
157 } 157 }
158 158
159 // Options menu 159 // Options menu
160 a = new QAction( QWidget::tr("Find"), Resource::loadIconSet( "mag" ), 160 a = new QAction( QWidget::tr("Find"), Resource::loadIconSet( "mag" ),
161 QString::null, 0, this, 0 ); 161 QString::null, 0, this, 0 );
162 connect(a, SIGNAL( activated() ), this, SLOT( slotFind() ) ); 162 connect(a, SIGNAL( activated() ), this, SLOT( slotFind() ) );
163 a->addTo( m_options ); 163 a->addTo( m_options );
164 m_findAction = a; 164 m_findAction = a;
165 165
166 m_options->insertSeparator(); 166 m_options->insertSeparator();
167 167
168 m_completedAction = new QAction( QString::null, QWidget::tr("Show completed tasks"), 168 m_completedAction = new QAction( QString::null, QWidget::tr("Show completed tasks"),
169 0, this, 0, TRUE ); 169 0, this, 0, TRUE );
170 m_completedAction->addTo( m_options ); 170 m_completedAction->addTo( m_options );
171 m_completedAction->setOn( showCompleted() ); 171 m_completedAction->setOn( showCompleted() );
172 connect(m_completedAction, SIGNAL( toggled(bool) ), this, SLOT(slotShowCompleted(bool) ) ); 172 connect(m_completedAction, SIGNAL( toggled(bool) ), this, SLOT(slotShowCompleted(bool) ) );
173 173
174 a = new QAction( QString::null, QWidget::tr("Show only over-due tasks"), 174 a = new QAction( QString::null, QWidget::tr("Show only over-due tasks"),
175 0, this, 0, TRUE ); 175 0, this, 0, TRUE );
176 a->addTo( m_options ); 176 a->addTo( m_options );
177 a->setOn( showOverDue() ); 177 a->setOn( showOverDue() );
178 connect(a, SIGNAL(toggled(bool)), this, SLOT(slotShowDue(bool) ) ); 178 connect(a, SIGNAL(toggled(bool)), this, SLOT(slotShowDue(bool) ) );
179 179
180 m_showDeadLineAction = new QAction( QString::null, QWidget::tr("Show task deadlines"), 180 m_showDeadLineAction = new QAction( QString::null, QWidget::tr("Show task deadlines"),
181 0, this, 0, TRUE ); 181 0, this, 0, TRUE );
182 m_showDeadLineAction->addTo( m_options ); 182 m_showDeadLineAction->addTo( m_options );
183 m_showDeadLineAction->setOn( showDeadline() ); 183 m_showDeadLineAction->setOn( showDeadline() );
184 connect(m_showDeadLineAction, SIGNAL(toggled(bool) ), this, SLOT( slotShowDeadLine( bool ) ) ); 184 connect(m_showDeadLineAction, SIGNAL(toggled(bool) ), this, SLOT( slotShowDeadLine( bool ) ) );
185 185
186 m_showQuickTaskAction = new QAction( QString::null, QWidget::tr("Show quick task bar"), 186 m_showQuickTaskAction = new QAction( QString::null, QWidget::tr("Show quick task bar"),
187 0, this, 0, TRUE ); 187 0, this, 0, TRUE );
188 m_showQuickTaskAction->addTo( m_options ); 188 m_showQuickTaskAction->addTo( m_options );
189 m_showQuickTaskAction->setOn( showQuickTask() ); 189 m_showQuickTaskAction->setOn( showQuickTask() );
190 connect(m_showQuickTaskAction, SIGNAL( toggled(bool) ), this, SLOT(slotShowQuickTask(bool) ) ); 190 connect(m_showQuickTaskAction, SIGNAL( toggled(bool) ), this, SLOT(slotShowQuickTask(bool) ) );
191 191
192 m_options->insertSeparator(); 192 m_options->insertSeparator();
193 193
194 m_bar->insertItem( QWidget::tr("Data") ,m_edit ); 194 m_bar->insertItem( QWidget::tr("Data") ,m_edit );
195 m_bar->insertItem( QWidget::tr("Category"), m_catMenu ); 195 m_bar->insertItem( QWidget::tr("Category"), m_catMenu );
196 m_bar->insertItem( QWidget::tr("Options"), m_options ); 196 m_bar->insertItem( QWidget::tr("Options"), m_options );
197 197
198 m_curQuick = new QuickEditImpl( this, m_quicktask ); 198 m_curQuick = new QuickEditImpl( this, m_quicktask );
199 addToolBar( (QPEToolBar *)m_curQuick->widget(), QWidget::tr( "QuickEdit" ), QMainWindow::Top, TRUE ); 199 addToolBar( (QPEToolBar *)m_curQuick->widget(), QWidget::tr( "QuickEdit" ), QMainWindow::Top, TRUE );
200 m_curQuick->signal()->connect( this, SLOT(slotQuickEntered() ) ); 200 m_curQuick->signal()->connect( this, SLOT(slotQuickEntered() ) );
201 201
202} 202}
203/* m_curCat from Config */ 203/* m_curCat from Config */
204void MainWindow::initConfig() { 204void MainWindow::initConfig() {
205 Config config( "todo" ); 205 Config config( "todo" );
206 config.setGroup( "View" ); 206 config.setGroup( "View" );
207 m_completed = config.readBoolEntry( "ShowComplete", TRUE ); 207 m_completed = config.readBoolEntry( "ShowComplete", TRUE );
208 m_curCat = config.readEntry( "Category", QString::null ); 208 m_curCat = config.readEntry( "Category", QString::null );
209 m_deadline = config.readBoolEntry( "ShowDeadLine", TRUE); 209 m_deadline = config.readBoolEntry( "ShowDeadLine", TRUE);
210 m_overdue = config.readBoolEntry("ShowOverDue", FALSE ); 210 m_overdue = config.readBoolEntry("ShowOverDue", FALSE );
211 m_quicktask = config.readBoolEntry("ShowQuickTask", TRUE); 211 m_quicktask = config.readBoolEntry("ShowQuickTask", TRUE);
212} 212}
213void MainWindow::initUI() { 213void MainWindow::initUI() {
214 m_stack = new QWidgetStack(this, "main stack"); 214 m_stack = new QWidgetStack(this, "main stack");
215 setCentralWidget( m_stack ); 215 setCentralWidget( m_stack );
216 216
217 setToolBarsMovable( FALSE ); 217 setToolBarsMovable( FALSE );
218 218
219 m_tool = new QPEToolBar( this ); 219 m_tool = new QPEToolBar( this );
220 m_tool->setHorizontalStretchable( TRUE ); 220 m_tool->setHorizontalStretchable( TRUE );
221 221
222 m_bar = new QMenuBar( m_tool ); 222 m_bar = new QMenuBar( m_tool );
223 223
224 /** QPopupMenu */ 224 /** QPopupMenu */
225 m_edit = new QPopupMenu( this ); 225 m_edit = new QPopupMenu( this );
226 m_options = new QPopupMenu( this ); 226 m_options = new QPopupMenu( this );
227 m_catMenu = new QPopupMenu( this ); 227 m_catMenu = new QPopupMenu( this );
228 m_template = new QPopupMenu( this ); 228 m_template = new QPopupMenu( this );
229 229
230 m_catMenu->setCheckable( TRUE ); 230 m_catMenu->setCheckable( TRUE );
231 m_template->setCheckable( TRUE ); 231 m_template->setCheckable( TRUE );
232 232
233 connect(m_catMenu, SIGNAL(activated(int) ), 233 connect(m_catMenu, SIGNAL(activated(int) ),
234 this, SLOT(setCategory(int) ) ); 234 this, SLOT(setCategory(int) ) );
235 connect(m_template, SIGNAL(activated(int) ), 235 connect(m_template, SIGNAL(activated(int) ),
236 this, SLOT(slotNewFromTemplate(int) ) ); 236 this, SLOT(slotNewFromTemplate(int) ) );
237} 237}
238void MainWindow::initViews() { 238void MainWindow::initViews() {
239 TableView* tableView = new TableView( this, m_stack ); 239 TableView* tableView = new TableView( this, m_stack );
240 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." ) ); 240 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." ) );
241 m_stack->addWidget( tableView, m_counter++ ); 241 m_stack->addWidget( tableView, m_counter++ );
242 m_views.append( tableView ); 242 m_views.append( tableView );
243 m_curView = tableView; 243 m_curView = tableView;
244 connectBase( tableView ); 244 connectBase( tableView );
245 /* add QString type + QString configname to 245 /* add QString type + QString configname to
246 * the View menu 246 * the View menu
247 * and subdirs for multiple views 247 * and subdirs for multiple views
248 */ 248 */
249} 249}
250void MainWindow::initEditor() { 250void MainWindow::initEditor() {
251 m_curEdit = new Editor(); 251 m_curEdit = new Editor();
252} 252}
253void MainWindow::initShow() { 253void MainWindow::initShow() {
254 m_curShow = new TextViewShow(this); 254 m_curShow = new TextViewShow(this, this);
255 m_stack->addWidget( m_curShow->widget() , m_counter++ ); 255 m_stack->addWidget( m_curShow->widget() , m_counter++ );
256} 256}
257MainWindow::~MainWindow() { 257MainWindow::~MainWindow() {
258 delete templateManager(); 258 delete templateManager();
259} 259}
260void MainWindow::connectBase( ViewBase* ) { 260void MainWindow::connectBase( ViewBase* ) {
261 // once templates and signals mix we'll use it again 261 // once templates and signals mix we'll use it again
262} 262}
263QPopupMenu* MainWindow::contextMenu( int , bool recur ) { 263QPopupMenu* MainWindow::contextMenu( int , bool recur ) {
264 QPopupMenu* menu = new QPopupMenu(); 264 QPopupMenu* menu = new QPopupMenu();
265 265
266 m_editAction->addTo( menu ); 266 m_editAction->addTo( menu );
267 m_deleteAction->addTo( menu ); 267 m_deleteAction->addTo( menu );
268 m_duplicateAction->addTo( menu ); 268 m_duplicateAction->addTo( menu );
269 269
270 menu->insertSeparator(); 270 menu->insertSeparator();
271 271
272 /* 272 /*
273 * if this event recurs we allow 273 * if this event recurs we allow
274 * to detach it. 274 * to detach it.
275 * remove all 275 * remove all
276 */ 276 */
277 if ( recur ) { 277 if ( recur ) {
278 ; // FIXME 278 ; // FIXME
279 } 279 }
280 280
281 return menu; 281 return menu;
282} 282}
283QPopupMenu* MainWindow::options() { 283QPopupMenu* MainWindow::options() {
284 qWarning("Options"); 284 qWarning("Options");
285 return m_options; 285 return m_options;
286} 286}
287QPopupMenu* MainWindow::edit() { 287QPopupMenu* MainWindow::edit() {
288 return m_edit; 288 return m_edit;
289} 289}
290QToolBar* MainWindow::toolbar() { 290QToolBar* MainWindow::toolbar() {
291 return m_tool; 291 return m_tool;
292} 292}
293OTodoAccess::List MainWindow::list()const { 293OTodoAccess::List MainWindow::list()const {
294 return m_todoMgr.list(); 294 return m_todoMgr.list();
295} 295}
296OTodoAccess::List MainWindow::sorted( bool asc, int sortOrder ) { 296OTodoAccess::List MainWindow::sorted( bool asc, int sortOrder ) {
297 int cat = 0; 297 int cat = 0;
298 if ( m_curCat != QWidget::tr("All Categories") ) 298 if ( m_curCat != QWidget::tr("All Categories") )
299 cat = currentCatId(); 299 cat = currentCatId();
300 300
301 int filter = 1; 301 int filter = 1;
302 302
303 if (!m_completed ) 303 if (!m_completed )
304 filter |= 4; 304 filter |= 4;
305 if (m_overdue) 305 if (m_overdue)
306 filter |= 2; 306 filter |= 2;
307 307
308 return m_todoMgr.sorted( asc, sortOrder, filter, cat ); 308 return m_todoMgr.sorted( asc, sortOrder, filter, cat );
309} 309}
310OTodoAccess::List MainWindow::sorted( bool asc, int sortOrder, int addFilter) { 310OTodoAccess::List MainWindow::sorted( bool asc, int sortOrder, int addFilter) {
311 int cat = 0; 311 int cat = 0;
312 if ( m_curCat != QWidget::tr("All Categories") ) 312 if ( m_curCat != QWidget::tr("All Categories") )
313 cat = currentCatId(); 313 cat = currentCatId();
314 314
315 return m_todoMgr.sorted(asc, sortOrder, addFilter, cat ); 315 return m_todoMgr.sorted(asc, sortOrder, addFilter, cat );
316} 316}
317OTodo MainWindow::event( int uid ) { 317OTodo MainWindow::event( int uid ) {
318 return m_todoMgr.event( uid ); 318 return m_todoMgr.event( uid );
319} 319}
320bool MainWindow::isSyncing()const { 320bool MainWindow::isSyncing()const {
321 return m_syncing; 321 return m_syncing;
322} 322}
323TemplateManager* MainWindow::templateManager() { 323TemplateManager* MainWindow::templateManager() {
324 return m_tempManager; 324 return m_tempManager;
325} 325}
326Editor* MainWindow::currentEditor() { 326Editor* MainWindow::currentEditor() {
327 return m_curEdit; 327 return m_curEdit;
328} 328}
329TodoShow* MainWindow::currentShow() { 329TodoShow* MainWindow::currentShow() {
330 return m_curShow; 330 return m_curShow;
331} 331}
332void MainWindow::slotReload() { 332void MainWindow::slotReload() {
333 m_todoMgr.reload(); 333 m_todoMgr.reload();
334 currentView()->updateView( ); 334 currentView()->updateView( );
335 raiseCurrentView(); 335 raiseCurrentView();
336} 336}
337void MainWindow::closeEvent( QCloseEvent* e ) { 337void MainWindow::closeEvent( QCloseEvent* e ) {
338 if (m_stack->visibleWidget() == currentShow()->widget() ) { 338 if (m_stack->visibleWidget() == currentShow()->widget() ) {
339 raiseCurrentView(); 339 raiseCurrentView();
340 e->ignore(); 340 e->ignore();
341 return; 341 return;
342 } 342 }
343 /* 343 /*
344 * we should have flushed and now we're still saving 344 * we should have flushed and now we're still saving
345 * so there is no need to flush 345 * so there is no need to flush
346 */ 346 */
347 if (m_syncing ) { 347 if (m_syncing ) {
348 e->accept(); 348 e->accept();
349 return; 349 return;
350 } 350 }
351 bool quit = false; 351 bool quit = false;
352 if ( m_todoMgr.saveAll() ){ 352 if ( m_todoMgr.saveAll() ){
353 qWarning("saved"); 353 qWarning("saved");
354 quit = true; 354 quit = true;
355 }else { 355 }else {
356 if ( QMessageBox::critical( this, QWidget::tr("Out of space"), 356 if ( QMessageBox::critical( this, QWidget::tr("Out of space"),
357 QWidget::tr("Todo was unable\n" 357 QWidget::tr("Todo was unable\n"
358 "to save your changes.\n" 358 "to save your changes.\n"
359 "Free up some space\n" 359 "Free up some space\n"
360 "and try again.\n" 360 "and try again.\n"
361 "\nQuit Anyway?"), 361 "\nQuit Anyway?"),
362 QMessageBox::Yes|QMessageBox::Escape, 362 QMessageBox::Yes|QMessageBox::Escape,
363 QMessageBox::No|QMessageBox::Default) 363 QMessageBox::No|QMessageBox::Default)
364 != QMessageBox::No ) { 364 != QMessageBox::No ) {
365 e->accept(); 365 e->accept();
366 quit = true; 366 quit = true;
367 }else 367 }else
368 e->ignore(); 368 e->ignore();
369 369
370 } 370 }
371 371
372 if (quit ) { 372 if (quit ) {
373 Config config( "todo" ); 373 Config config( "todo" );
374 config.setGroup( "View" ); 374 config.setGroup( "View" );
375 config.writeEntry( "ShowComplete", showCompleted() ); 375 config.writeEntry( "ShowComplete", showCompleted() );
376 config.writeEntry( "Category", currentCategory() ); 376 config.writeEntry( "Category", currentCategory() );
377 config.writeEntry( "ShowDeadLine", showDeadline()); 377 config.writeEntry( "ShowDeadLine", showDeadline());
378 config.writeEntry( "ShowOverDue", showOverDue() ); 378 config.writeEntry( "ShowOverDue", showOverDue() );
379 config.writeEntry( "ShowQuickTask", showQuickTask() ); 379 config.writeEntry( "ShowQuickTask", showQuickTask() );
380 /* save templates */ 380 /* save templates */
381 templateManager()->save(); 381 templateManager()->save();
382 e->accept(); 382 e->accept();
383 } 383 }
384} 384}
385void MainWindow::populateTemplates() { 385void MainWindow::populateTemplates() {
386 m_template->clear(); 386 m_template->clear();
387 QStringList list = templateManager()->templates(); 387 QStringList list = templateManager()->templates();
388 QStringList::Iterator it; 388 QStringList::Iterator it;
389 for ( it = list.begin(); it != list.end(); ++it ) { 389 for ( it = list.begin(); it != list.end(); ++it ) {
390 m_template->insertItem( (*it) ); 390 m_template->insertItem( (*it) );
391 } 391 }
392} 392}
393/* 393/*
394 * slotNewFromTemplate 394 * slotNewFromTemplate
395 * We use the edit widget to do 395 * We use the edit widget to do
396 * the config but we setUid(-1) 396 * the config but we setUid(-1)
397 * to get a new uid 397 * to get a new uid
398 */ 398 */
399/* 399/*
400 * first we get the name of the template 400 * first we get the name of the template
401 * then we will use the TemplateManager 401 * then we will use the TemplateManager
402 */ 402 */
403void MainWindow::slotNewFromTemplate( int id ) { 403void MainWindow::slotNewFromTemplate( int id ) {
404 QString name = m_template->text( id ); 404 QString name = m_template->text( id );
405 405
406 OTodo event = templateManager()->templateEvent( name ); 406 OTodo event = templateManager()->templateEvent( name );
407 event = currentEditor()->edit(this, 407 event = currentEditor()->edit(this,
408 event ); 408 event );
409 409
410 if ( currentEditor()->accepted() ) { 410 if ( currentEditor()->accepted() ) {
411 /* assign new todo */ 411 /* assign new todo */
412 event.setUid( -1 ); 412 event.setUid( -1 );
413 currentView()->addEvent( event ); 413 currentView()->addEvent( event );
414 m_todoMgr.add( event ); 414 m_todoMgr.add( event );
415 415
416 populateCategories(); 416 populateCategories();
417 } 417 }
418} 418}
419void MainWindow::slotNew() { 419void MainWindow::slotNew() {
420 create(); 420 create();
421} 421}
422void MainWindow::slotDuplicate() { 422void MainWindow::slotDuplicate() {
423 if(m_syncing) { 423 if(m_syncing) {
424 QMessageBox::warning(this, QWidget::tr("Todo"), 424 QMessageBox::warning(this, QWidget::tr("Todo"),
425 QWidget::tr("Can not edit data, currently syncing")); 425 QWidget::tr("Can not edit data, currently syncing"));
426 return; 426 return;
427 } 427 }
428 OTodo ev = m_todoMgr.event( currentView()->current() ); 428 OTodo ev = m_todoMgr.event( currentView()->current() );
429 /* let's generate a new uid */ 429 /* let's generate a new uid */
430 ev.setUid(-1); 430 ev.setUid(-1);
431 m_todoMgr.add( ev ); 431 m_todoMgr.add( ev );
432 432
433 currentView()->addEvent( ev ); 433 currentView()->addEvent( ev );
434 raiseCurrentView(); 434 raiseCurrentView();
435} 435}
436void MainWindow::slotDelete() { 436void MainWindow::slotDelete() {
437 if (!currentView()->current() ) 437 if (!currentView()->current() )
438 return; 438 return;
439 439
440 if(m_syncing) { 440 if(m_syncing) {
441 QMessageBox::warning(this, QWidget::tr("Todo"), 441 QMessageBox::warning(this, QWidget::tr("Todo"),
442 QWidget::tr("Can not edit data, currently syncing")); 442 QWidget::tr("Can not edit data, currently syncing"));
443 return; 443 return;
444 } 444 }
445 QString strName = currentView()->currentRepresentation(); 445 QString strName = currentView()->currentRepresentation();
446 if (!QPEMessageBox::confirmDelete(this, QWidget::tr("Todo"), strName ) ) 446 if (!QPEMessageBox::confirmDelete(this, QWidget::tr("Todo"), strName ) )
447 return; 447 return;
448 448
449 m_todoMgr.remove( currentView()->current() ); 449 m_todoMgr.remove( currentView()->current() );
450 currentView()->removeEvent( currentView()->current() ); 450 currentView()->removeEvent( currentView()->current() );
451 raiseCurrentView(); 451 raiseCurrentView();
452} 452}
453void MainWindow::slotDeleteAll() { 453void MainWindow::slotDeleteAll() {
454 if(m_syncing) { 454 if(m_syncing) {
455 QMessageBox::warning(this, QWidget::tr("Todo"), 455 QMessageBox::warning(this, QWidget::tr("Todo"),
456 QWidget::tr("Can not edit data, currently syncing")); 456 QWidget::tr("Can not edit data, currently syncing"));
457 return; 457 return;
458 } 458 }
459 459
460 460
461 if ( !QPEMessageBox::confirmDelete( this, QWidget::tr( "Todo" ), QWidget::tr("all tasks?") ) ) 461 if ( !QPEMessageBox::confirmDelete( this, QWidget::tr( "Todo" ), QWidget::tr("all tasks?") ) )
462 return; 462 return;
463 463
464 m_todoMgr.removeAll(); 464 m_todoMgr.removeAll();
465 currentView()->clear(); 465 currentView()->clear();
466 466
467 raiseCurrentView(); 467 raiseCurrentView();
468} 468}
469void MainWindow::slotDeleteCompleted() { 469void MainWindow::slotDeleteCompleted() {
470 if(m_syncing) { 470 if(m_syncing) {
471 QMessageBox::warning(this, QWidget::tr("Todo"), 471 QMessageBox::warning(this, QWidget::tr("Todo"),
472 QWidget::tr("Can not edit data, currently syncing")); 472 QWidget::tr("Can not edit data, currently syncing"));
473 return; 473 return;
474 } 474 }
475 475
476 if ( !QPEMessageBox::confirmDelete( this, QWidget::tr( "Todo" ), QWidget::tr("all completed tasks?") ) ) 476 if ( !QPEMessageBox::confirmDelete( this, QWidget::tr( "Todo" ), QWidget::tr("all completed tasks?") ) )
477 return; 477 return;
478 478
479 479
480 m_todoMgr.removeCompleted(); 480 m_todoMgr.removeCompleted();
481 currentView()->updateView( ); 481 currentView()->updateView( );
482} 482}
483void MainWindow::slotFind() { 483void MainWindow::slotFind() {
484 484
485} 485}
486void MainWindow::slotEdit() { 486void MainWindow::slotEdit() {
487 slotEdit( currentView()->current() ); 487 slotEdit( currentView()->current() );
488} 488}
489/* 489/*
490 * set the category 490 * set the category
491 */ 491 */
492void MainWindow::setCategory( int c) { 492void MainWindow::setCategory( int c) {
493 if ( c <= 0 ) return; 493 if ( c <= 0 ) return;
494 494
495 495
496 qWarning("Iterating over cats %d", c ); 496 qWarning("Iterating over cats %d", c );
497 for ( unsigned int i = 1; i < m_catMenu->count(); i++ ) 497 for ( unsigned int i = 1; i < m_catMenu->count(); i++ )
498 m_catMenu->setItemChecked(i, c == (int)i ); 498 m_catMenu->setItemChecked(i, c == (int)i );
499 499
500 if (c == 1 ) { 500 if (c == 1 ) {
501 m_curCat = QString::null; 501 m_curCat = QString::null;
502 setCaption( QWidget::tr("Todo") + " - " + QWidget::tr("All Categories" ) ); 502 setCaption( QWidget::tr("Todo") + " - " + QWidget::tr("All Categories" ) );
503 503
504 }else if ( c == (int)m_catMenu->count() - 1 ) { 504 }else if ( c == (int)m_catMenu->count() - 1 ) {
505 m_curCat = QWidget::tr("Unfiled"); 505 m_curCat = QWidget::tr("Unfiled");
506 setCaption( QWidget::tr("Todo") + " - " + QWidget::tr("Unfiled") ); 506 setCaption( QWidget::tr("Todo") + " - " + QWidget::tr("Unfiled") );
507 }else { 507 }else {
508 m_curCat = m_todoMgr.categories()[c-2]; 508 m_curCat = m_todoMgr.categories()[c-2];
509 setCaption( QWidget::tr("Todo") + " - " + m_curCat ); 509 setCaption( QWidget::tr("Todo") + " - " + m_curCat );
510 } 510 }
511 m_catMenu->setItemChecked( c, true ); 511 m_catMenu->setItemChecked( c, true );
512 512
513 currentView()->setShowCategory( m_curCat ); 513 currentView()->setShowCategory( m_curCat );
514 raiseCurrentView(); 514 raiseCurrentView();
515} 515}
516void MainWindow::slotShowDeadLine( bool dead) { 516void MainWindow::slotShowDeadLine( bool dead) {
517 m_deadline = dead; 517 m_deadline = dead;
518 currentView()->setShowDeadline( dead ); 518 currentView()->setShowDeadline( dead );
519} 519}
520void MainWindow::slotShowCompleted( bool show) { 520void MainWindow::slotShowCompleted( bool show) {
521 m_completed = show; 521 m_completed = show;
522 currentView()->setShowCompleted( m_completed ); 522 currentView()->setShowCompleted( m_completed );
523} 523}
524void MainWindow::slotShowQuickTask( bool show ) { 524void MainWindow::slotShowQuickTask( bool show ) {
525 m_quicktask = show; 525 m_quicktask = show;
526 if ( m_quicktask ) 526 if ( m_quicktask )
527 m_curQuick->widget()->show(); 527 m_curQuick->widget()->show();
528 else 528 else
529 m_curQuick->widget()->hide(); 529 m_curQuick->widget()->hide();
530} 530}
531bool MainWindow::showOverDue()const { 531bool MainWindow::showOverDue()const {
532 return m_overdue; 532 return m_overdue;
533} 533}
534void MainWindow::setDocument( const QString& fi) { 534void MainWindow::setDocument( const QString& fi) {
535 DocLnk doc(fi); 535 DocLnk doc(fi);
536 if (doc.isValid() ) 536 if (doc.isValid() )
537 receiveFile(doc.file() ); 537 receiveFile(doc.file() );
538 else 538 else
539 receiveFile(fi ); 539 receiveFile(fi );
540} 540}
541 541
542static const char *beamfile = "/tmp/opie-todo.vcs"; 542static const char *beamfile = "/tmp/opie-todo.vcs";
543void MainWindow::slotBeam() { 543void MainWindow::slotBeam() {
544 beam( currentView()->current() ); 544 beam( currentView()->current() );
545} 545}
546void MainWindow::beamDone( Ir* ir) { 546void MainWindow::beamDone( Ir* ir) {
547 delete ir; 547 delete ir;
548 ::unlink( beamfile ); 548 ::unlink( beamfile );
549} 549}
550void MainWindow::receiveFile( const QString& filename ) { 550void MainWindow::receiveFile( const QString& filename ) {
551 OTodoAccessVCal* cal = new OTodoAccessVCal(filename ); 551 OTodoAccessVCal* cal = new OTodoAccessVCal(filename );
552 OTodoAccess acc( cal ); 552 OTodoAccess acc( cal );
553 acc.load(); 553 acc.load();
554 OTodoAccess::List list = acc.allRecords(); 554 OTodoAccess::List list = acc.allRecords();
555 555
556 QString message = QWidget::tr("<P>%1 new tasks arrived.<p>Would you like to add them to your Todolist?").arg(list.count() ); 556 QString message = QWidget::tr("<P>%1 new tasks arrived.<p>Would you like to add them to your Todolist?").arg(list.count() );
557 557
558 if ( QMessageBox::information(this, QWidget::tr("New Tasks"), 558 if ( QMessageBox::information(this, QWidget::tr("New Tasks"),
559 message, QMessageBox::Ok, 559 message, QMessageBox::Ok,
560 QMessageBox::Cancel ) == QMessageBox::Ok ) { 560 QMessageBox::Cancel ) == QMessageBox::Ok ) {
561 OTodoAccess::List::Iterator it; 561 OTodoAccess::List::Iterator it;
562 for ( it = list.begin(); it != list.end(); ++it ) 562 for ( it = list.begin(); it != list.end(); ++it )
563 m_todoMgr.add( (*it) ); 563 m_todoMgr.add( (*it) );
564 564
565 currentView()->updateView(); 565 currentView()->updateView();
566 } 566 }
567} 567}
568 568
569void MainWindow::slotFlush() { 569void MainWindow::slotFlush() {
570 m_syncing = FALSE; 570 m_syncing = FALSE;
571 m_todoMgr.save(); 571 m_todoMgr.save();
572} 572}
573void MainWindow::slotShowDetails() { 573void MainWindow::slotShowDetails() {
574 slotShow( currentView()->current() ); 574 slotShow( currentView()->current() );
575} 575}
576/* 576/*
577 * populate the Categories 577 * populate the Categories
578 * Menu 578 * Menu
579 */ 579 */
580void MainWindow::populateCategories() { 580void MainWindow::populateCategories() {
581 m_todoMgr.load(); 581 m_todoMgr.load();
582 582
583 m_catMenu->clear(); 583 m_catMenu->clear();
584 int id, rememberId; 584 int id, rememberId;
585 id = 1; 585 id = 1;
586 rememberId = 1; 586 rememberId = 1;
587 587
588 m_catMenu->insertItem( QWidget::tr( "All Categories" ), id++ ); 588 m_catMenu->insertItem( QWidget::tr( "All Categories" ), id++ );
589 m_catMenu->insertSeparator(); 589 m_catMenu->insertSeparator();
590 QStringList categories = m_todoMgr.categories(); 590 QStringList categories = m_todoMgr.categories();
591 categories.append( QWidget::tr( "Unfiled" ) ); 591 categories.append( QWidget::tr( "Unfiled" ) );
592 for ( QStringList::Iterator it = categories.begin(); 592 for ( QStringList::Iterator it = categories.begin();
593 it != categories.end(); ++it ) { 593 it != categories.end(); ++it ) {
594 m_catMenu->insertItem( *it, id ); 594 m_catMenu->insertItem( *it, id );
595 if ( *it == currentCategory() ) 595 if ( *it == currentCategory() )
596 rememberId = id; 596 rememberId = id;
597 ++id; 597 ++id;
598 } 598 }
599 setCategory( rememberId ); 599 setCategory( rememberId );
600} 600}
601bool MainWindow::showCompleted()const { 601bool MainWindow::showCompleted()const {
602 return m_completed; 602 return m_completed;
603} 603}
604bool MainWindow::showDeadline()const { 604bool MainWindow::showDeadline()const {
605 return m_deadline; 605 return m_deadline;
606} 606}
607bool MainWindow::showQuickTask()const { 607bool MainWindow::showQuickTask()const {
608 return m_quicktask; 608 return m_quicktask;
609} 609}
610QString MainWindow::currentCategory()const { 610QString MainWindow::currentCategory()const {
611 return m_curCat; 611 return m_curCat;
612} 612}
613int MainWindow::currentCatId() { 613int MainWindow::currentCatId() {
614 return m_todoMgr.catId( m_curCat ); 614 return m_todoMgr.catId( m_curCat );
615} 615}
616ViewBase* MainWindow::currentView() { 616ViewBase* MainWindow::currentView() {
617 return m_curView; 617 return m_curView;
618} 618}
619void MainWindow::raiseCurrentView() { 619void MainWindow::raiseCurrentView() {
620 m_stack->raiseWidget( m_curView->widget() ); 620 m_stack->raiseWidget( m_curView->widget() );
621} 621}
622void MainWindow::slotShowDue(bool ov) { 622void MainWindow::slotShowDue(bool ov) {
623 m_overdue = ov; 623 m_overdue = ov;
624 currentView()->showOverDue( ov ); 624 currentView()->showOverDue( ov );
625 raiseCurrentView(); 625 raiseCurrentView();
626} 626}
627void MainWindow::slotShow( int uid ) { 627void MainWindow::slotShow( int uid ) {
628 qWarning("slotShow"); 628 qWarning("slotShow");
629 currentShow()->slotShow( event( uid ) ); 629 currentShow()->slotShow( event( uid ) );
630 m_stack->raiseWidget( currentShow()->widget() ); 630 m_stack->raiseWidget( currentShow()->widget() );
631} 631}
632void MainWindow::slotEdit( int uid ) { 632void MainWindow::slotEdit( int uid ) {
633 if(m_syncing) { 633 if(m_syncing) {
634 QMessageBox::warning(this, QWidget::tr("Todo"), 634 QMessageBox::warning(this, QWidget::tr("Todo"),
635 QWidget::tr("Can not edit data, currently syncing")); 635 QWidget::tr("Can not edit data, currently syncing"));
636 return; 636 return;
637 } 637 }
638 638
639 OTodo todo = m_todoMgr.event( uid ); 639 OTodo todo = m_todoMgr.event( uid );
640 640
641 todo = currentEditor()->edit(this, todo ); 641 todo = currentEditor()->edit(this, todo );
642 642
643 /* if completed */ 643 /* if completed */
644 if ( currentEditor()->accepted() ) { 644 if ( currentEditor()->accepted() ) {
645 qWarning("Replacing now" ); 645 qWarning("Replacing now" );
646 m_todoMgr.update( todo.uid(), todo ); 646 m_todoMgr.update( todo.uid(), todo );
647 currentView()->replaceEvent( todo ); 647 currentView()->replaceEvent( todo );
648 /* a Category might have changed */ 648 /* a Category might have changed */
649 populateCategories(); 649 populateCategories();
650 } 650 }
651 651
652 raiseCurrentView(); 652 raiseCurrentView();
653} 653}
654/* 654/*
655void MainWindow::slotUpdate1( int uid, const SmallTodo& ev) { 655void MainWindow::slotUpdate1( int uid, const SmallTodo& ev) {
656 m_todoMgr.update( uid, ev ); 656 m_todoMgr.update( uid, ev );
657} 657}
658*/ 658*/
659void MainWindow::updateTodo( const OTodo& ev) { 659void MainWindow::updateTodo( const OTodo& ev) {
660 m_todoMgr.update( ev.uid() , ev ); 660 m_todoMgr.update( ev.uid() , ev );
661} 661}
662/* The view changed it's configuration 662/* The view changed it's configuration
663 * update the view menu 663 * update the view menu
664 */ 664 */
665void MainWindow::slotUpdate3( QWidget* ) { 665void MainWindow::slotUpdate3( QWidget* ) {
666 666
667} 667}
668void MainWindow::updateList() { 668void MainWindow::updateList() {
669 m_todoMgr.updateList(); 669 m_todoMgr.updateList();
670} 670}
671void MainWindow::setReadAhead( uint count ) { 671void MainWindow::setReadAhead( uint count ) {
672 if (m_todoMgr.todoDB() ) 672 if (m_todoMgr.todoDB() )
673 m_todoMgr.todoDB()->setReadAhead( count ); 673 m_todoMgr.todoDB()->setReadAhead( count );
674} 674}
675void MainWindow::slotQuickEntered() { 675void MainWindow::slotQuickEntered() {
676 qWarning("entered"); 676 qWarning("entered");
677 OTodo todo = quickEditor()->todo(); 677 OTodo todo = quickEditor()->todo();
678 if (todo.isEmpty() ) 678 if (todo.isEmpty() )
679 return; 679 return;
680 680
681 m_todoMgr.add( todo ); 681 m_todoMgr.add( todo );
682 currentView()->addEvent( todo ); 682 currentView()->addEvent( todo );
683 raiseCurrentView(); 683 raiseCurrentView();
684} 684}
685QuickEditBase* MainWindow::quickEditor() { 685QuickEditBase* MainWindow::quickEditor() {
686 return m_curQuick; 686 return m_curQuick;
687} 687}
688void MainWindow::slotComplete( int uid ) { 688void MainWindow::slotComplete( int uid ) {
689 slotComplete( event(uid) ); 689 slotComplete( event(uid) );
690} 690}
691void MainWindow::slotComplete( const OTodo& todo ) { 691void MainWindow::slotComplete( const OTodo& todo ) {
692 OTodo to = todo; 692 OTodo to = todo;
693 to.setCompleted( !to.isCompleted() ); 693 to.setCompleted( !to.isCompleted() );
694 to.setCompletedDate( QDate::currentDate() ); 694 to.setCompletedDate( QDate::currentDate() );
695 695
696 /* 696 /*
697 * if the item does recur 697 * if the item does recur
698 * we need to spin it off 698 * we need to spin it off
699 * and update the items duedate to the next 699 * and update the items duedate to the next
700 * possible recurrance of this item... 700 * possible recurrance of this item...
701 * the spinned off one will loose the 701 * the spinned off one will loose the
702 */ 702 */
703 if ( to.recurrence().doesRecur() && to.isCompleted() ) { 703 if ( to.recurrence().doesRecur() && to.isCompleted() ) {
704 OTodo to2( to ); 704 OTodo to2( to );
705 705
706 /* the spinned off one won't recur anymore */ 706 /* the spinned off one won't recur anymore */
707 to.setRecurrence( ORecur() ); 707 to.setRecurrence( ORecur() );
708 708
709 ORecur rec = to2.recurrence(); 709 ORecur rec = to2.recurrence();
710 rec.setStart( to.dueDate() ); 710 rec.setStart( to.dueDate() );
711 to2.setRecurrence( rec ); 711 to2.setRecurrence( rec );
712 /* 712 /*
713 * if there is a next occurence 713 * if there is a next occurence
714 * from the duedate of the last recurrance 714 * from the duedate of the last recurrance
715 */ 715 */
716 QDate date; 716 QDate date;
717 if ( to2.recurrence().nextOcurrence( to2.dueDate().addDays(1), date ) ) { 717 if ( to2.recurrence().nextOcurrence( to2.dueDate().addDays(1), date ) ) {
718 QDate inval; 718 QDate inval;
719 /* generate a new uid for the old record */ 719 /* generate a new uid for the old record */
720 to.setUid( 1 ); 720 to.setUid( 1 );
721 721
722 /* add the old one cause it has a new UID here cause it was spin off */ 722 /* add the old one cause it has a new UID here cause it was spin off */
723 m_todoMgr.add( to ); 723 m_todoMgr.add( to );
724 724
725 /* 725 /*
726 * update the due date 726 * update the due date
727 * start date 727 * start date
728 * and complete date 728 * and complete date
729 */ 729 */
730 to2.setDueDate( date ); 730 to2.setDueDate( date );
731 to2.setStartDate( inval ); 731 to2.setStartDate( inval );
732 to2.setCompletedDate( inval ); 732 to2.setCompletedDate( inval );
733 to2.setCompleted( false ); 733 to2.setCompleted( false );
734 updateTodo( to2 ); 734 updateTodo( to2 );
735 }else 735 }else
736 updateTodo( to ); 736 updateTodo( to );
737 }else 737 }else
738 updateTodo( to ); 738 updateTodo( to );
739 739
740 currentView()->updateView(); 740 currentView()->updateView();
741 raiseCurrentView(); 741 raiseCurrentView();
742} 742}
743void MainWindow::flush() { 743void MainWindow::flush() {
744 slotFlush(); 744 slotFlush();
745} 745}
746void MainWindow::reload() { 746void MainWindow::reload() {
747 slotReload(); 747 slotReload();
748} 748}
749int MainWindow::create() { 749int MainWindow::create() {
750 int uid = 0; 750 int uid = 0;
751 if(m_syncing) { 751 if(m_syncing) {
752 QMessageBox::warning(this, QWidget::tr("Todo"), 752 QMessageBox::warning(this, QWidget::tr("Todo"),
753 QWidget::tr("Can not edit data, currently syncing")); 753 QWidget::tr("Can not edit data, currently syncing"));
754 return uid; 754 return uid;
755 } 755 }
756 756
757 757
758 OTodo todo = currentEditor()->newTodo( currentCatId(), 758 OTodo todo = currentEditor()->newTodo( currentCatId(),
759 this ); 759 this );
760 760
761 if ( currentEditor()->accepted() ) { 761 if ( currentEditor()->accepted() ) {
762 //todo.assignUid(); 762 //todo.assignUid();
763 uid = todo.uid(); 763 uid = todo.uid();
764 m_todoMgr.add( todo ); 764 m_todoMgr.add( todo );
765 currentView()->addEvent( todo ); 765 currentView()->addEvent( todo );
766 766
767 767
768 // I'm afraid we must call this every time now, otherwise 768 // I'm afraid we must call this every time now, otherwise
769 // spend expensive time comparing all these strings... 769 // spend expensive time comparing all these strings...
770 // but only call if we changed something -zecke 770 // but only call if we changed something -zecke
771 populateCategories(); 771 populateCategories();
772 } 772 }
773 raiseCurrentView( ); 773 raiseCurrentView( );
774 774
775 return uid; 775 return uid;
776} 776}
777/* delete it silently... */ 777/* delete it silently... */
778bool MainWindow::remove( int uid ) { 778bool MainWindow::remove( int uid ) {
779 if (m_syncing) return false; 779 if (m_syncing) return false;
780 780
781 return m_todoMgr.remove( uid ); 781 return m_todoMgr.remove( uid );
782} 782}
783void MainWindow::beam( int uid, int ) { 783void MainWindow::beam( int uid, int ) {
784 ::unlink( beamfile ); 784 ::unlink( beamfile );
785 OTodo todo = event( uid ); 785 OTodo todo = event( uid );
786 OTodoAccessVCal* cal = new OTodoAccessVCal(QString::fromLatin1(beamfile) ); 786 OTodoAccessVCal* cal = new OTodoAccessVCal(QString::fromLatin1(beamfile) );
787 OTodoAccess acc( cal ); 787 OTodoAccess acc( cal );
788 acc.load(); 788 acc.load();
789 acc.add( todo ); 789 acc.add( todo );
790 acc.save(); 790 acc.save();
791 Ir* ir = new Ir(this ); 791 Ir* ir = new Ir(this );
792 connect(ir, SIGNAL(done(Ir*) ), 792 connect(ir, SIGNAL(done(Ir*) ),
793 this, SLOT(beamDone(Ir*) ) ); 793 this, SLOT(beamDone(Ir*) ) );
794 ir->send( beamfile, todo.summary(), "text/x-vCalendar" ); 794 ir->send( beamfile, todo.summary(), "text/x-vCalendar" );
795} 795}
796void MainWindow::show( int uid ) { 796void MainWindow::show( int uid ) {
797 slotShow( uid ); 797 slotShow( uid );
798} 798}
799void MainWindow::edit( int uid ) { 799void MainWindow::edit( int uid ) {
800 slotEdit( uid ); 800 slotEdit( uid );
801} 801}
802void MainWindow::add( const OPimRecord& rec) { 802void MainWindow::add( const OPimRecord& rec) {
803 if ( rec.rtti() != OTodo::rtti() ) return; 803 if ( rec.rtti() != OTodo::rtti() ) return;
804 804
805 const OTodo& todo = static_cast<const OTodo&>(rec); 805 const OTodo& todo = static_cast<const OTodo&>(rec);
806 806
807 m_todoMgr.add(todo ); 807 m_todoMgr.add(todo );
808 currentView()->addEvent( todo ); 808 currentView()->addEvent( todo );
809 809
810 810
811 // I'm afraid we must call this every time now, otherwise 811 // I'm afraid we must call this every time now, otherwise
812 // spend expensive time comparing all these strings... 812 // spend expensive time comparing all these strings...
813 // but only call if we changed something -zecke 813 // but only call if we changed something -zecke
814 populateCategories(); 814 populateCategories();
815} 815}
816void MainWindow::slotReturnFromView() {
817 raiseCurrentView();
818}
diff --git a/core/pim/todo/mainwindow.h b/core/pim/todo/mainwindow.h
index d756d64..f880505 100644
--- a/core/pim/todo/mainwindow.h
+++ b/core/pim/todo/mainwindow.h
@@ -1,199 +1,201 @@
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 Holger Freyther <zecke@handhelds.org> 3             .=l. Copyright (c) 2002 Holger Freyther <zecke@handhelds.org>
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  -_. . .   )=.  = Library General Public License along with 21  -_. . .   )=.  = Library 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#ifndef TODO_MAIN_WINDOW_H 29#ifndef TODO_MAIN_WINDOW_H
30#define TODO_MAIN_WINDOW_H 30#define TODO_MAIN_WINDOW_H
31 31
32#include <qlist.h> 32#include <qlist.h>
33 33
34#include <opie/otodoaccess.h> 34#include <opie/otodoaccess.h>
35#include <opie/otodo.h> 35#include <opie/otodo.h>
36#include <opie/opimmainwindow.h> 36#include <opie/opimmainwindow.h>
37 37
38#include "smalltodo.h" 38#include "smalltodo.h"
39#include "todoview.h" 39#include "todoview.h"
40#include "quickedit.h" 40#include "quickedit.h"
41#include "todomanager.h" 41#include "todomanager.h"
42 42
43class QPopupMenu; 43class QPopupMenu;
44class QMenuBar; 44class QMenuBar;
45class QToolBar; 45class QToolBar;
46class QAction; 46class QAction;
47class QWidgetStack; 47class QWidgetStack;
48class Ir; 48class Ir;
49class QVBox; 49class QVBox;
50class QLineEdit; 50class QLineEdit;
51 51
52namespace Todo { 52namespace Todo {
53 typedef TodoView View; 53 typedef TodoView View;
54 class TemplateManager; 54 class TemplateManager;
55 class Editor; 55 class Editor;
56 class TodoShow; 56 class TodoShow;
57 class TemplateEditor; 57 class TemplateEditor;
58 struct QuickEditBase; 58 struct QuickEditBase;
59 59
60 class MainWindow : public OPimMainWindow { 60 class MainWindow : public OPimMainWindow {
61 Q_OBJECT 61 Q_OBJECT
62 friend class TodoView; // avoid QObject here.... 62 friend class TodoView; // avoid QObject here....
63 friend class TodoShow; // avoid QObject
63 public: 64 public:
64 MainWindow( QWidget *parent = 0, 65 MainWindow( QWidget *parent = 0,
65 const char* name = 0 ); 66 const char* name = 0 );
66 ~MainWindow(); 67 ~MainWindow();
67 68
68 /** return a context menu for an OTodo */ 69 /** return a context menu for an OTodo */
69 QPopupMenu* contextMenu(int uid, bool doesRecur = FALSE ); 70 QPopupMenu* contextMenu(int uid, bool doesRecur = FALSE );
70 QPopupMenu* options(); 71 QPopupMenu* options();
71 QPopupMenu* edit(); 72 QPopupMenu* edit();
72 QToolBar* toolbar(); 73 QToolBar* toolbar();
73 74
74 75
75 void updateList(); 76 void updateList();
76 OTodoAccess::List list()const; 77 OTodoAccess::List list()const;
77 OTodoAccess::List sorted( bool asc, int sortOrder ); 78 OTodoAccess::List sorted( bool asc, int sortOrder );
78 OTodoAccess::List sorted( bool asc, int sortOrder, int addFilter ); 79 OTodoAccess::List sorted( bool asc, int sortOrder, int addFilter );
79 80
80 OTodo event(int uid ); 81 OTodo event(int uid );
81 82
82 bool isSyncing()const; 83 bool isSyncing()const;
83 bool showCompleted()const; 84 bool showCompleted()const;
84 bool showDeadline()const; 85 bool showDeadline()const;
85 bool showOverDue()const; 86 bool showOverDue()const;
86 bool showQuickTask()const; 87 bool showQuickTask()const;
87 QString currentCategory()const; 88 QString currentCategory()const;
88 int currentCatId(); 89 int currentCatId();
89 TemplateManager* templateManager(); 90 TemplateManager* templateManager();
90 QuickEditBase* quickEditor(); 91 QuickEditBase* quickEditor();
91 92
92 void updateTodo( const OTodo& ); 93 void updateTodo( const OTodo& );
93 void populateTemplates(); 94 void populateTemplates();
94 Editor* currentEditor(); 95 Editor* currentEditor();
95 void setReadAhead(uint count ); 96 void setReadAhead(uint count );
96private slots: 97private slots:
97 void slotQuickEntered(); 98 void slotQuickEntered();
98 void populateCategories(); 99 void populateCategories();
99 void slotReload(); 100 void slotReload();
100 void slotFlush(); 101 void slotFlush();
101 102
102 protected: 103 protected:
103 void closeEvent( QCloseEvent* e ); 104 void closeEvent( QCloseEvent* e );
104 105
105 private: 106 private:
106 void receiveFile( const QString& filename ); 107 void receiveFile( const QString& filename );
107 void connectBase( ViewBase* ); 108 void connectBase( ViewBase* );
108 void initUI(); 109 void initUI();
109 void initActions(); 110 void initActions();
110 void initConfig(); 111 void initConfig();
111 void initViews(); 112 void initViews();
112 void initEditor(); 113 void initEditor();
113 void initShow(); 114 void initShow();
114 void initTemplate(); 115 void initTemplate();
115 void raiseCurrentView(); 116 void raiseCurrentView();
116 ViewBase* currentView(); 117 ViewBase* currentView();
117 ViewBase* m_curView; 118 ViewBase* m_curView;
118 QuickEditBase* m_curQuick; 119 QuickEditBase* m_curQuick;
119 Editor* m_curEdit; 120 Editor* m_curEdit;
120 TodoShow* currentShow(); 121 TodoShow* currentShow();
121 TodoShow* m_curShow; 122 TodoShow* m_curShow;
122 TemplateEditor* currentTemplateEditor(); 123 TemplateEditor* currentTemplateEditor();
123 TemplateEditor* m_curTempEd; 124 TemplateEditor* m_curTempEd;
124 125
125 QMenuBar* m_bar; 126 QMenuBar* m_bar;
126 QToolBar* m_tool; 127 QToolBar* m_tool;
127 QAction* m_editAction, 128 QAction* m_editAction,
128 *m_deleteAction, 129 *m_deleteAction,
129 *m_findAction, 130 *m_findAction,
130 *m_completedAction, 131 *m_completedAction,
131 *m_showDeadLineAction, 132 *m_showDeadLineAction,
132 *m_deleteAllAction, 133 *m_deleteAllAction,
133 *m_deleteCompleteAction, 134 *m_deleteCompleteAction,
134 *m_duplicateAction, 135 *m_duplicateAction,
135 *m_showOverDueAction, 136 *m_showOverDueAction,
136 *m_showQuickTaskAction, 137 *m_showQuickTaskAction,
137 *m_effectiveAction; 138 *m_effectiveAction;
138 QWidgetStack *m_stack; 139 QWidgetStack *m_stack;
139 QPopupMenu* m_catMenu, 140 QPopupMenu* m_catMenu,
140 *m_edit, 141 *m_edit,
141 *m_options, 142 *m_options,
142 *m_template; 143 *m_template;
143 144
144 bool m_syncing:1; 145 bool m_syncing:1;
145 bool m_deadline:1; 146 bool m_deadline:1;
146 bool m_completed:1; 147 bool m_completed:1;
147 bool m_overdue:1; 148 bool m_overdue:1;
148 bool m_quicktask:1; 149 bool m_quicktask:1;
149 TodoManager m_todoMgr; 150 TodoManager m_todoMgr;
150 QString m_curCat; 151 QString m_curCat;
151 QList<ViewBase> m_views; 152 QList<ViewBase> m_views;
152 uint m_counter; 153 uint m_counter;
153 TemplateManager* m_tempManager; 154 TemplateManager* m_tempManager;
154 155
155 156
156 private slots: 157 private slots:
157 void slotShow(int); 158 void slotShow(int);
158 void slotEdit(int); 159 void slotEdit(int);
159 void slotUpdate3( QWidget* ); 160 void slotUpdate3( QWidget* );
160 void slotComplete( int uid ); 161 void slotComplete( int uid );
161 void slotComplete( const OTodo& ev ); 162 void slotComplete( const OTodo& ev );
162 void slotNewFromTemplate(int id ); 163 void slotNewFromTemplate(int id );
163 void slotNew(); 164 void slotNew();
164 void slotDuplicate(); 165 void slotDuplicate();
165 166
166 void slotDelete(); 167 void slotDelete();
167 void slotDeleteAll(); 168 void slotDeleteAll();
168 void slotDeleteCompleted(); 169 void slotDeleteCompleted();
169 170
170 void slotEdit(); 171 void slotEdit();
171 void slotFind(); 172 void slotFind();
172 173
173 void setCategory( int ); 174 void setCategory( int );
174 175
175 void slotShowDeadLine( bool ); 176 void slotShowDeadLine( bool );
176 void slotShowCompleted( bool ); 177 void slotShowCompleted( bool );
177 void slotShowQuickTask( bool ); 178 void slotShowQuickTask( bool );
178 179
179 void setDocument( const QString& ); 180 void setDocument( const QString& );
180 181
181 182
182 void slotBeam(); 183 void slotBeam();
183 void beamDone( Ir* ); 184 void beamDone( Ir* );
184 void slotShowDetails(); 185 void slotShowDetails();
185 void slotShowDue( bool ); 186 void slotShowDue( bool );
187 void slotReturnFromView(); // for TodoShow...
186 /* reimplementation from opimmainwindow */ 188 /* reimplementation from opimmainwindow */
187 protected slots: 189 protected slots:
188 void flush(); 190 void flush();
189 void reload(); 191 void reload();
190 int create(); 192 int create();
191 bool remove( int uid ); 193 bool remove( int uid );
192 void beam(int uid, int transport = IrDa ); 194 void beam(int uid, int transport = IrDa );
193 void show( int uid ); 195 void show( int uid );
194 void edit( int uid ); 196 void edit( int uid );
195 void add( const OPimRecord& ); 197 void add( const OPimRecord& );
196 }; 198 };
197}; 199};
198 200
199#endif 201#endif
diff --git a/core/pim/todo/tableview.cpp b/core/pim/todo/tableview.cpp
index 61d1edd..cec8b5e 100644
--- a/core/pim/todo/tableview.cpp
+++ b/core/pim/todo/tableview.cpp
@@ -1,532 +1,543 @@
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 <zecke> 3             .=l. Copyright (c) 2002 <zecke>
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  -_. . .   )=.  = Library General Public License along with 21  -_. . .   )=.  = Library 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#include <stdlib.h> 28#include <stdlib.h>
29#include <cmath> 29#include <cmath>
30 30
31#include <qcombobox.h> 31#include <qcombobox.h>
32#include <qlineedit.h> 32#include <qlineedit.h>
33#include <qtimer.h> 33#include <qtimer.h>
34#include <qpoint.h> 34#include <qpoint.h>
35#include <qpopupmenu.h> 35#include <qpopupmenu.h>
36 36
37#include <qpe/config.h> 37#include <qpe/config.h>
38#include <qpe/resource.h> 38#include <qpe/resource.h>
39 39
40#include <opie/orecur.h> 40#include <opie/orecur.h>
41 41
42#include "mainwindow.h" 42#include "mainwindow.h"
43//#include "tableitems.h" 43//#include "tableitems.h"
44#include "tableview.h" 44#include "tableview.h"
45 45
46using namespace Todo; 46using namespace Todo;
47 47
48namespace { 48namespace {
49 static const int BoxSize = 14; 49 static const int BoxSize = 14;
50 static const int RowHeight = 20; 50 static const int RowHeight = 20;
51} 51}
52 52
53 53
54void TableView::initConfig() { 54void TableView::initConfig() {
55 Config config( "todo" ); 55 Config config( "todo" );
56 config.setGroup( "Options" ); 56 config.setGroup( "Options" );
57 m_completeStrokeWidth = config.readNumEntry( "CompleteStrokeWidth", 8 ); 57 m_completeStrokeWidth = config.readNumEntry( "CompleteStrokeWidth", 8 );
58} 58}
59 59
60TableView::TableView( MainWindow* window, QWidget* wid ) 60TableView::TableView( MainWindow* window, QWidget* wid )
61 : QTable( wid ), TodoView( window ) { 61 : QTable( wid ), TodoView( window ) {
62 62
63 // Load icons 63 // Load icons
64 // TODO - probably should be done globally somewhere else, 64 // TODO - probably should be done globally somewhere else,
65 // see also quickeditimpl.cpp/h, taskeditoroverview.cpp/h 65 // see also quickeditimpl.cpp/h, taskeditoroverview.cpp/h
66 m_pic_completed = Resource::loadPixmap( "todo/completed" ); 66 m_pic_completed = Resource::loadPixmap( "todo/completed" );
67 QString namestr; 67 QString namestr;
68 for ( unsigned int i = 1; i < 6; i++ ) { 68 for ( unsigned int i = 1; i < 6; i++ ) {
69 namestr = "todo/priority"; 69 namestr = "todo/priority";
70 namestr.append( QString::number( i ) ); 70 namestr.append( QString::number( i ) );
71 m_pic_priority[ i - 1 ] = Resource::loadPixmap( namestr ); 71 m_pic_priority[ i - 1 ] = Resource::loadPixmap( namestr );
72 } 72 }
73 73
74 setUpdatesEnabled( false ); 74 setUpdatesEnabled( false );
75 viewport()->setUpdatesEnabled( false ); 75 viewport()->setUpdatesEnabled( false );
76 m_enablePaint = false; 76 m_enablePaint = false;
77 setNumRows(0); 77 setNumRows(0);
78 setNumCols(4); 78 setNumCols(4);
79 79
80 horizontalHeader()->setLabel( 0, QWidget::tr("C.") ); 80 horizontalHeader()->setLabel( 0, QWidget::tr("C.") );
81 horizontalHeader()->setLabel( 1, QWidget::tr("Priority") ); 81 horizontalHeader()->setLabel( 1, QWidget::tr("Priority") );
82 horizontalHeader()->setLabel( 2, QWidget::tr("Description" ) ); 82 horizontalHeader()->setLabel( 2, QWidget::tr("Description" ) );
83 horizontalHeader()->setLabel( 3, QWidget::tr("Deadline") ); 83 horizontalHeader()->setLabel( 3, QWidget::tr("Deadline") );
84 84
85 setShowDeadline( todoWindow()->showDeadline() ); 85 setShowDeadline( todoWindow()->showDeadline() );
86 86
87 setSorting( TRUE ); 87 setSorting( TRUE );
88 setSelectionMode( NoSelection ); 88 setSelectionMode( NoSelection );
89 89
90 setLeftMargin( 0 ); 90 setLeftMargin( 0 );
91 verticalHeader()->hide(); 91 verticalHeader()->hide();
92 92
93 connect((QTable*)this, SIGNAL( clicked( int, int, int, const QPoint& ) ), 93 connect((QTable*)this, SIGNAL( clicked( int, int, int, const QPoint& ) ),
94 this, SLOT( slotClicked(int, int, int, const QPoint& ) ) ); 94 this, SLOT( slotClicked(int, int, int, const QPoint& ) ) );
95 connect((QTable*)this, SIGNAL( pressed( int, int, int, const QPoint& ) ), 95 connect((QTable*)this, SIGNAL( pressed( int, int, int, const QPoint& ) ),
96 this, SLOT( slotPressed(int, int, int, const QPoint& ) ) ); 96 this, SLOT( slotPressed(int, int, int, const QPoint& ) ) );
97 connect((QTable*)this, SIGNAL(valueChanged(int, int) ), 97 connect((QTable*)this, SIGNAL(valueChanged(int, int) ),
98 this, SLOT( slotValueChanged(int, int) ) ); 98 this, SLOT( slotValueChanged(int, int) ) );
99 connect((QTable*)this, SIGNAL(currentChanged(int, int) ), 99 connect((QTable*)this, SIGNAL(currentChanged(int, int) ),
100 this, SLOT( slotCurrentChanged(int, int) ) ); 100 this, SLOT( slotCurrentChanged(int, int) ) );
101 101
102 m_menuTimer = new QTimer( this ); 102 m_menuTimer = new QTimer( this );
103 connect( m_menuTimer, SIGNAL(timeout()), 103 connect( m_menuTimer, SIGNAL(timeout()),
104 this, SLOT(slotShowMenu()) ); 104 this, SLOT(slotShowMenu()) );
105 105
106 m_enablePaint = true; 106 m_enablePaint = true;
107 setUpdatesEnabled( true ); 107 setUpdatesEnabled( true );
108 viewport()->setUpdatesEnabled( true ); 108 viewport()->setUpdatesEnabled( true );
109 viewport()->update(); 109 viewport()->update();
110 setSortOrder( 0 ); 110 setSortOrder( 0 );
111 setAscending( TRUE ); 111 setAscending( TRUE );
112 m_first = true; 112 m_first = true;
113 113
114 /* now let's init the config */ 114 /* now let's init the config */
115 initConfig(); 115 initConfig();
116} 116}
117/* a new day has started 117/* a new day has started
118 * update the day 118 * update the day
119 */ 119 */
120void TableView::newDay() { 120void TableView::newDay() {
121 clear(); 121 clear();
122 updateView(); 122 updateView();
123} 123}
124TableView::~TableView() { 124TableView::~TableView() {
125 125
126} 126}
127void TableView::slotShowMenu() { 127void TableView::slotShowMenu() {
128 QPopupMenu *menu = todoWindow()->contextMenu( current(), sorted()[currentRow()].recurrence().doesRecur() ); 128 QPopupMenu *menu = todoWindow()->contextMenu( current(), sorted()[currentRow()].recurrence().doesRecur() );
129 menu->exec(QCursor::pos() ); 129 menu->exec(QCursor::pos() );
130 delete menu; 130 delete menu;
131} 131}
132QString TableView::type() const { 132QString TableView::type() const {
133 return QString::fromLatin1( tr("Table View") ); 133 return QString::fromLatin1( tr("Table View") );
134} 134}
135int TableView::current() { 135int TableView::current() {
136 int uid = sorted().uidAt(currentRow() ); 136 int uid = sorted().uidAt(currentRow() );
137 137
138 return uid; 138 return uid;
139} 139}
140QString TableView::currentRepresentation() { 140QString TableView::currentRepresentation() {
141 OTodo to = sorted()[currentRow()]; 141 OTodo to = sorted()[currentRow()];
142 return to.summary().isEmpty() ? to.description().left(20) : to.summary() ; 142 return to.summary().isEmpty() ? to.description().left(20) : to.summary() ;
143} 143}
144/* show overdue */ 144/* show overdue */
145void TableView::showOverDue( bool ) { 145void TableView::showOverDue( bool ) {
146 clear(); 146 clear();
147 updateView(); 147 updateView();
148} 148}
149 149
150void TableView::updateView( ) { 150void TableView::updateView( ) {
151 qWarning("update view"); 151 qWarning("update view");
152 m_row = false; 152 m_row = false;
153 static int id; 153 static int id;
154 id = startTimer(4000 ); 154 id = startTimer(4000 );
155 /* FIXME we want one page to be read! 155 /* FIXME we want one page to be read!
156 * 156 *
157 * Calculate that screensize 157 * Calculate that screensize
158 */ 158 */
159 todoWindow()->setReadAhead( 4 ); 159 todoWindow()->setReadAhead( 4 );
160 sort(); 160 sort();
161 OTodoAccess::List::Iterator it, end; 161 OTodoAccess::List::Iterator it, end;
162 it = sorted().begin(); 162 it = sorted().begin();
163 end = sorted().end(); 163 end = sorted().end();
164 164
165 qWarning("setTodos"); 165 qWarning("setTodos");
166 QTime time; 166 QTime time;
167 time.start(); 167 time.start();
168 m_enablePaint = false; 168 m_enablePaint = false;
169 setUpdatesEnabled( false ); 169 setUpdatesEnabled( false );
170 viewport()->setUpdatesEnabled( false ); 170 viewport()->setUpdatesEnabled( false );
171 171
172 setNumRows( it.count() ); 172 setNumRows( it.count() );
173 if ( it.count() == 0 ) 173 if ( it.count() == 0 )
174 killTimer(id); 174 killTimer(id);
175 175
176// int elc = time.elapsed(); 176// int elc = time.elapsed();
177 setUpdatesEnabled( true ); 177 setUpdatesEnabled( true );
178 viewport()->setUpdatesEnabled( true ); 178 viewport()->setUpdatesEnabled( true );
179 viewport()->update(); 179 viewport()->update();
180 180
181 m_enablePaint = true; 181 m_enablePaint = true;
182// int el = time.elapsed(); 182// int el = time.elapsed();
183} 183}
184void TableView::setTodo( int, const OTodo&) { 184void TableView::setTodo( int, const OTodo&) {
185 sort(); 185 sort();
186 186
187 /* repaint */ 187 /* repaint */
188 repaint(); 188 repaint();
189} 189}
190void TableView::addEvent( const OTodo&) { 190void TableView::addEvent( const OTodo&) {
191 191
192 /* fix problems of not showing the 'Haken' */ 192 /* fix problems of not showing the 'Haken' */
193 updateView(); 193 updateView();
194} 194}
195/* 195/*
196 * find the event 196 * find the event
197 * and then replace the complete row 197 * and then replace the complete row
198 */ 198 */
199void TableView::replaceEvent( const OTodo& ev) { 199void TableView::replaceEvent( const OTodo& ev) {
200 addEvent( ev ); 200 addEvent( ev );
201} 201}
202/* 202/*
203 * re aligning table can be slow too 203 * re aligning table can be slow too
204 * FIXME: look what performs better 204 * FIXME: look what performs better
205 * either this or the old align table 205 * either this or the old align table
206 */ 206 */
207void TableView::removeEvent( int ) { 207void TableView::removeEvent( int ) {
208 updateView(); 208 updateView();
209} 209}
210void TableView::setShowCompleted( bool b) { 210void TableView::setShowCompleted( bool b) {
211 qWarning("Show Completed %d" + b ); 211 qWarning("Show Completed %d" + b );
212 updateView(); 212 updateView();
213} 213}
214void TableView::setShowDeadline( bool b ) { 214void TableView::setShowDeadline( bool b ) {
215 qWarning( "Show DeadLine %d" + b ); 215 qWarning( "Show DeadLine %d" + b );
216 if ( b ) 216 if ( b )
217 showColumn( 3 ); 217 showColumn( 3 );
218 else 218 else
219 hideColumn( 3 ); 219 hideColumn( 3 );
220 220
221 // Try to intelligently size columns 221 // Try to intelligently size columns
222 // TODO - would use width() below, but doesn't have valid value at time of c'tor 222 // TODO - would use width() below, but doesn't have valid value at time of c'tor
223 int col2width = 238; 223 int col2width = 238;
224 int width = m_pic_completed.width(); 224 int width = m_pic_completed.width();
225 setColumnWidth( 0, width ); 225 setColumnWidth( 0, width );
226 col2width -= width; 226 col2width -= width;
227 width = fontMetrics().boundingRect( horizontalHeader()->label( 1 ) ).width() + 8; 227 width = fontMetrics().boundingRect( horizontalHeader()->label( 1 ) ).width() + 8;
228 setColumnWidth( 1, width ); 228 setColumnWidth( 1, width );
229 col2width -= width; 229 col2width -= width;
230 if ( b ) { 230 if ( b ) {
231 width = fontMetrics().boundingRect( horizontalHeader()->label( 3 ) ).width() + 8; 231 width = fontMetrics().boundingRect( horizontalHeader()->label( 3 ) ).width() + 8;
232 setColumnWidth( 3, width ); 232 setColumnWidth( 3, width );
233 col2width -= width; 233 col2width -= width;
234 } 234 }
235 setColumnWidth( 2, col2width ); 235 setColumnWidth( 2, col2width );
236} 236}
237void TableView::setShowCategory( const QString& str) { 237void TableView::setShowCategory( const QString& str) {
238 qWarning("setShowCategory"); 238 qWarning("setShowCategory");
239 if ( str != m_oleCat || m_first ) 239 if ( str != m_oleCat || m_first )
240 updateView(); 240 updateView();
241 241
242 m_oleCat = str; 242 m_oleCat = str;
243 m_first = false; 243 m_first = false;
244 244
245} 245}
246void TableView::clear() { 246void TableView::clear() {
247 setNumRows(0); 247 setNumRows(0);
248} 248}
249void TableView::slotClicked(int row, int col, int, 249void TableView::slotClicked(int row, int col, int,
250 const QPoint& point) { 250 const QPoint& point) {
251 if ( !cellGeometry(row, col ).contains(point ) ) 251 if ( !cellGeometry(row, col ).contains(point ) )
252 return; 252 return;
253 253
254 int ui= sorted().uidAt( row ); 254 int ui= sorted().uidAt( row );
255 255
256 256
257 switch( col ) { 257 switch( col ) {
258 case 0:{ 258 case 0:{
259 int x = point.x() -columnPos( col ); 259 int x = point.x() -columnPos( col );
260 int y = point.y() -rowPos( row ); 260 int y = point.y() -rowPos( row );
261 int w = columnWidth( col ); 261 int w = columnWidth( col );
262 int h = rowHeight( row ); 262 int h = rowHeight( row );
263 if ( x >= ( w - BoxSize ) / 2 && 263 if ( x >= ( w - BoxSize ) / 2 &&
264 x <= ( w - BoxSize ) / 2 + BoxSize && 264 x <= ( w - BoxSize ) / 2 + BoxSize &&
265 y >= ( h - BoxSize ) / 2 && 265 y >= ( h - BoxSize ) / 2 &&
266 y <= ( h - BoxSize ) / 2 + BoxSize ) { 266 y <= ( h - BoxSize ) / 2 + BoxSize ) {
267 TodoView::complete(sorted()[row] ); 267 TodoView::complete(sorted()[row] );
268 } 268 }
269 } 269 }
270 break; 270 break;
271 271
272 case 1: 272 case 1:
273 break; 273 break;
274 274
275 case 2: { 275 case 2: {
276 m_menuTimer->stop(); 276 m_menuTimer->stop();
277 showTodo( ui ); 277 showTodo( ui );
278 break; 278 break;
279 } 279 }
280 case 3: { 280 case 3: {
281 m_menuTimer->stop(); 281 m_menuTimer->stop();
282 TodoView::edit( ui ); 282 TodoView::edit( ui );
283 break; 283 break;
284 } 284 }
285 } 285 }
286 286
287 287
288} 288}
289void TableView::slotPressed(int row, int col, int, 289void TableView::slotPressed(int row, int col, int,
290 const QPoint& point) { 290 const QPoint& point) {
291 291
292 qWarning("pressed row %d col %d x:%d+y:%d", row,col,point.x(),point.y() ); 292 qWarning("pressed row %d col %d x:%d+y:%d", row,col,point.x(),point.y() );
293 m_prevP = point; 293 m_prevP = point;
294 /* TextColumn column */ 294 /* TextColumn column */
295 if ( col == 2 && cellGeometry( row, col ).contains( point ) ) 295 if ( col == 2 && cellGeometry( row, col ).contains( point ) )
296 m_menuTimer->start( 750, TRUE ); 296 m_menuTimer->start( 750, TRUE );
297} 297}
298void TableView::slotValueChanged( int, int ) { 298void TableView::slotValueChanged( int, int ) {
299 qWarning("Value Changed"); 299 qWarning("Value Changed");
300} 300}
301void TableView::slotCurrentChanged(int, int ) { 301void TableView::slotCurrentChanged(int, int ) {
302 m_menuTimer->stop(); 302 m_menuTimer->stop();
303} 303}
304QWidget* TableView::widget() { 304QWidget* TableView::widget() {
305 return this; 305 return this;
306} 306}
307/* 307/*
308 * We need to overwrite sortColumn 308 * We need to overwrite sortColumn
309 * because we want to sort whole row 309 * because we want to sort whole row
310 * based 310 * based
311 * We event want to set the setOrder 311 * We event want to set the setOrder
312 * to a sort() and update() 312 * to a sort() and update()
313 */ 313 */
314void TableView::sortColumn( int col, bool asc, bool ) { 314void TableView::sortColumn( int col, bool asc, bool ) {
315 qWarning("bool %d", asc ); 315 qWarning("bool %d", asc );
316 setSortOrder( col ); 316 setSortOrder( col );
317 setAscending( asc ); 317 setAscending( asc );
318 updateView(); 318 updateView();
319} 319}
320void TableView::viewportPaintEvent( QPaintEvent* e) { 320void TableView::viewportPaintEvent( QPaintEvent* e) {
321 if (m_enablePaint ) 321 if (m_enablePaint )
322 QTable::viewportPaintEvent( e ); 322 QTable::viewportPaintEvent( e );
323} 323}
324/* 324/*
325 * This segment is copyrighted by TT 325 * This segment is copyrighted by TT
326 * it was taken from their todolist 326 * it was taken from their todolist
327 * application this code is GPL 327 * application this code is GPL
328 */ 328 */
329void TableView::paintCell(QPainter* p, int row, int col, const QRect& cr, bool ) { 329void TableView::paintCell(QPainter* p, int row, int col, const QRect& cr, bool ) {
330 const QColorGroup &cg = colorGroup(); 330 const QColorGroup &cg = colorGroup();
331 331
332 p->save(); 332 p->save();
333 333
334 OTodo task = sorted()[row]; 334 OTodo task = sorted()[row];
335 335
336 // TODO - give user option for grid or bars? 336 // TODO - give user option for grid or bars?
337 337
338 // Paint alternating background bars 338 // Paint alternating background bars
339 if ( (row % 2 ) == 0 ) { 339 if ( (row % 2 ) == 0 ) {
340 p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Base ) ); 340 p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Base ) );
341 p->setPen( QPen( cg.text() ) ); 341 p->setPen( QPen( cg.text() ) );
342 } 342 }
343 else { 343 else {
344 p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Background ) ); 344 p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Background ) );
345 p->setPen( QPen( cg.buttonText() ) ); 345 p->setPen( QPen( cg.buttonText() ) );
346 } 346 }
347 347
348 // Paint grid 348 // Paint grid
349 //p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Base ) ); 349 //p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Base ) );
350 //QPen op = p->pen(); 350 //QPen op = p->pen();
351 //p->setPen(cg.mid()); 351 //p->setPen(cg.mid());
352 //p->drawLine( 0, cr.height() - 1, cr.width() - 1, cr.height() - 1 ); 352 //p->drawLine( 0, cr.height() - 1, cr.width() - 1, cr.height() - 1 );
353 //p->drawLine( cr.width() - 1, 0, cr.width() - 1, cr.height() - 1 ); 353 //p->drawLine( cr.width() - 1, 0, cr.width() - 1, cr.height() - 1 );
354 //p->setPen(op); 354 //p->setPen(op);
355 355
356 QFont f = p->font(); 356 QFont f = p->font();
357 QFontMetrics fm(f); 357 QFontMetrics fm(f);
358 358
359 int marg = ( cr.width() - BoxSize ) / 2; 359 int marg = ( cr.width() - BoxSize ) / 2;
360 int x = 0; 360 int x = 0;
361 int y = ( cr.height() - BoxSize ) / 2; 361 int y = ( cr.height() - BoxSize ) / 2;
362 362
363 switch(col) { 363 switch(col) {
364 case 0: // completed field 364 case 0: // completed field
365 { 365 {
366 //p->setPen( QPen( cg.text() ) ); 366 //p->setPen( QPen( cg.text() ) );
367 //p->drawRect( x + marg, y, BoxSize, BoxSize ); 367 //p->drawRect( x + marg, y, BoxSize, BoxSize );
368 //p->drawRect( x + marg+1, y+1, BoxSize-2, BoxSize-2 ); 368 //p->drawRect( x + marg+1, y+1, BoxSize-2, BoxSize-2 );
369 if ( task.isCompleted() ) { 369 if ( task.isCompleted() ) {
370 p->drawPixmap( x + marg, y, m_pic_completed ); 370 p->drawPixmap( x + marg, y, m_pic_completed );
371 } 371 }
372 } 372 }
373 break; 373 break;
374 case 1: // priority field 374 case 1: // priority field
375 { 375 {
376 p->drawPixmap( x + marg, y, m_pic_priority[ task.priority() - 1 ] ); 376 p->drawPixmap( x + marg, y, m_pic_priority[ task.priority() - 1 ] );
377 } 377 }
378 break; 378 break;
379 case 2: // description field 379 case 2: // description field
380 { 380 {
381 QString text = task.summary().isEmpty() ? 381 QString text = task.summary().isEmpty() ?
382 task.description().left(20) : 382 task.description().left(20) :
383 task.summary(); 383 task.summary();
384 p->drawText(2,2 + fm.ascent(), text); 384 p->drawText(2,2 + fm.ascent(), text);
385 } 385 }
386 break; 386 break;
387 case 3: 387 case 3:
388 { 388 {
389 QString text; 389 QString text;
390 if (task.hasDueDate()) { 390 if (task.hasDueDate()) {
391 int off = QDate::currentDate().daysTo( task.dueDate() ); 391 int off = QDate::currentDate().daysTo( task.dueDate() );
392 text = tr( "%1 day(s)").arg(QString::number(off)); 392 text = tr( "%1 day(s)").arg(QString::number(off));
393 /* 393 /*
394 * set color if not completed 394 * set color if not completed
395 */ 395 */
396 if (!task.isCompleted() ) { 396 if (!task.isCompleted() ) {
397 QColor color = Qt::black; 397 QColor color = Qt::black;
398 if ( off < 0 ) 398 if ( off < 0 )
399 color = Qt::red; 399 color = Qt::red;
400 else if ( off == 0 ) 400 else if ( off == 0 )
401 color = Qt::yellow; 401 color = Qt::yellow;
402 else if ( off > 0 ) 402 else if ( off > 0 )
403 color = Qt::green; 403 color = Qt::green;
404 p->setPen(color ); 404 p->setPen(color );
405 } 405 }
406 } else { 406 } else {
407 text = tr("None"); 407 text = tr("None");
408 } 408 }
409 p->drawText(2,2 + fm.ascent(), text); 409 p->drawText(2,2 + fm.ascent(), text);
410 } 410 }
411 break; 411 break;
412 } 412 }
413 p->restore(); 413 p->restore();
414} 414}
415QWidget* TableView::createEditor(int row, int col, bool )const { 415QWidget* TableView::createEditor(int row, int col, bool )const {
416 switch( col ) { 416 switch( col ) {
417 case 1: { 417 case 1: {
418 /* the priority stuff */ 418 /* the priority stuff */
419 QComboBox* combo = new QComboBox( viewport() ); 419 QComboBox* combo = new QComboBox( viewport() );
420 for ( int i = 0; i < 5; i++ ) { 420 for ( int i = 0; i < 5; i++ ) {
421 combo->insertItem( m_pic_priority[ i ] ); 421 combo->insertItem( m_pic_priority[ i ] );
422 } 422 }
423 combo->setCurrentItem( sorted()[row].priority()-1 ); 423 combo->setCurrentItem( sorted()[row].priority()-1 );
424 return combo; 424 return combo;
425 } 425 }
426 /* summary */ 426 /* summary */
427 case 2:{ 427 case 2:{
428 QLineEdit* edit = new QLineEdit( viewport() ); 428 QLineEdit* edit = new QLineEdit( viewport() );
429 edit->setText( sorted()[row].summary() ); 429 edit->setText( sorted()[row].summary() );
430 return edit; 430 return edit;
431 } 431 }
432 case 0: 432 case 0:
433 default: 433 default:
434 return 0l; 434 return 0l;
435 } 435 }
436} 436}
437void TableView::setCellContentFromEditor(int row, int col ) { 437void TableView::setCellContentFromEditor(int row, int col ) {
438 if ( col == 1 ) { 438 if ( col == 1 ) {
439 QWidget* wid = cellWidget(row, 1 ); 439 QWidget* wid = cellWidget(row, 1 );
440 if ( wid->inherits("QComboBox") ) { 440 if ( wid->inherits("QComboBox") ) {
441 int pri = ((QComboBox*)wid)->currentItem() + 1; 441 int pri = ((QComboBox*)wid)->currentItem() + 1;
442 OTodo todo = sorted()[row]; 442 OTodo todo = sorted()[row];
443 if ( todo.priority() != pri ) { 443 if ( todo.priority() != pri ) {
444 todo.setPriority( pri ); 444 todo.setPriority( pri );
445 TodoView::update( todo.uid(), todo ); 445 TodoView::update( todo.uid(), todo );
446 updateView(); 446 updateView();
447 } 447 }
448 } 448 }
449 }else if ( col == 2) { 449 }else if ( col == 2) {
450 QWidget* wid = cellWidget(row, 2); 450 QWidget* wid = cellWidget(row, 2);
451 if ( wid->inherits("QLineEdit") ) { 451 if ( wid->inherits("QLineEdit") ) {
452 QString text = ((QLineEdit*)wid)->text(); 452 QString text = ((QLineEdit*)wid)->text();
453 OTodo todo = sorted()[row]; 453 OTodo todo = sorted()[row];
454 if ( todo.summary() != text ) { 454 if ( todo.summary() != text ) {
455 todo.setSummary( text ); 455 todo.setSummary( text );
456 TodoView::update( todo.uid(), todo ); 456 TodoView::update( todo.uid(), todo );
457 updateView(); 457 updateView();
458 } 458 }
459 } 459 }
460 } 460 }
461} 461}
462void TableView::slotPriority() { 462void TableView::slotPriority() {
463 setCellContentFromEditor( currentRow(), currentColumn() ); 463 setCellContentFromEditor( currentRow(), currentColumn() );
464} 464}
465/* 465/*
466 * We'll use the TimerEvent to read ahead or to keep the cahce always 466 * We'll use the TimerEvent to read ahead or to keep the cahce always
467 * filled enough. 467 * filled enough.
468 * We will try to read ahead 4 items in both ways 468 * We will try to read ahead 4 items in both ways
469 * up and down. On odd or even we will currentRow()+-4 or +-9 469 * up and down. On odd or even we will currentRow()+-4 or +-9
470 * 470 *
471 */ 471 */
472void TableView::timerEvent( QTimerEvent* ev ) { 472void TableView::timerEvent( QTimerEvent* ) {
473// qWarning("sorted %d", sorted().count() ); 473// qWarning("sorted %d", sorted().count() );
474 if (sorted().count() == 0 ) 474 if (sorted().count() == 0 )
475 return; 475 return;
476 476
477 int row = currentRow(); 477 int row = currentRow();
478 if ( m_row ) { 478 if ( m_row ) {
479 int ro = row-4; 479 int ro = row-4;
480 if (ro < 0 ) ro = 0; 480 if (ro < 0 ) ro = 0;
481 sorted()[ro]; 481 sorted()[ro];
482 482
483 ro = row+4; 483 ro = row+4;
484 sorted()[ro]; 484 sorted()[ro];
485 } else { 485 } else {
486 int ro = row + 8; 486 int ro = row + 8;
487 sorted()[ro]; 487 sorted()[ro];
488 488
489 ro = row-8; 489 ro = row-8;
490 if (ro < 0 ) ro = 0; 490 if (ro < 0 ) ro = 0;
491 sorted()[ro]; 491 sorted()[ro];
492 } 492 }
493 493
494 m_row = !m_row; 494 m_row = !m_row;
495} 495}
496 496
497// We want a strike through completed ;) 497// We want a strike through completed ;)
498// durchstreichen to complete 498// durchstreichen to complete
499/* 499/*
500 * MouseTracking is off this mean we only receive 500 * MouseTracking is off this mean we only receive
501 * these events if the mouse button is pressed 501 * these events if the mouse button is pressed
502 * We've the previous point saved 502 * We've the previous point saved
503 * We check if the previous and current Point are 503 * We check if the previous and current Point are
504 * in the same row. 504 * in the same row.
505 * Then we check if they're some pixel horizontal away 505 * Then we check if they're some pixel horizontal away
506 * if the distance between the two points is greater than 506 * if the distance between the two points is greater than
507 * 8 we mark the underlying todo as completed and do a repaint 507 * 8 we mark the underlying todo as completed and do a repaint
508 * 508 *
509 * BUG: When clicking on the Due column and it's scrollable 509 * BUG: When clicking on the Due column and it's scrollable
510 * the todo is marked as completed... 510 * the todo is marked as completed...
511 * REASON: QTable is doing auto scrolling which leads to a move 511 * REASON: QTable is doing auto scrolling which leads to a move
512 * in the x coordinate and this way it's able to pass the 512 * in the x coordinate and this way it's able to pass the
513 * m_completeStrokeWidth criteria 513 * m_completeStrokeWidth criteria
514 * WORKAROUND: strike through needs to strike through the same 514 * WORKAROUND: strike through needs to strike through the same
515 * row and two columns! 515 * row and two columns!
516 */ 516 */
517void TableView::contentsMouseReleaseEvent( QMouseEvent* e) { 517void TableView::contentsMouseReleaseEvent( QMouseEvent* e) {
518 int row = rowAt(m_prevP.y()); 518 int row = rowAt(m_prevP.y());
519 int colOld = columnAt(m_prevP.x() ); 519 int colOld = columnAt(m_prevP.x() );
520 int colNew = columnAt(e->x() ); 520 int colNew = columnAt(e->x() );
521 qWarning("colNew: %d colOld: %d", colNew, colOld ); 521 qWarning("colNew: %d colOld: %d", colNew, colOld );
522 if ( row == rowAt( e->y() ) && row != -1 && 522 if ( row == rowAt( e->y() ) && row != -1 &&
523 colOld != colNew ) { 523 colOld != colNew ) {
524 TodoView::complete( sorted()[row] ); 524 TodoView::complete( sorted()[row] );
525 return; 525 return;
526 } 526 }
527 QTable::contentsMouseReleaseEvent( e ); 527 QTable::contentsMouseReleaseEvent( e );
528} 528}
529void TableView::contentsMouseMoveEvent( QMouseEvent* e ) { 529void TableView::contentsMouseMoveEvent( QMouseEvent* e ) {
530 m_menuTimer->stop(); 530 m_menuTimer->stop();
531 QTable::contentsMouseMoveEvent( e ); 531 QTable::contentsMouseMoveEvent( e );
532} 532}
533void TableView::keyPressEvent( QKeyEvent* event) {
534 switch( event->key() ) {
535 case Qt::Key_F33:
536 case Qt::Key_Enter:
537 case Qt::Key_Return:
538 showTodo( sorted().uidAt( currentRow() ) );
539 break;
540 default:
541 QTable::keyPressEvent( event );
542 }
543}
diff --git a/core/pim/todo/tableview.h b/core/pim/todo/tableview.h
index 2b6ea2b..689c496 100644
--- a/core/pim/todo/tableview.h
+++ b/core/pim/todo/tableview.h
@@ -1,111 +1,112 @@
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  -_. . .   )=.  = Library General Public License along with 21  -_. . .   )=.  = Library 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#ifndef OPIE_TABLE_VIEW_H 29#ifndef OPIE_TABLE_VIEW_H
30#define OPIE_TABLE_VIEW_H 30#define OPIE_TABLE_VIEW_H
31 31
32#include <qtable.h> 32#include <qtable.h>
33#include <qmap.h> 33#include <qmap.h>
34#include <qpixmap.h> 34#include <qpixmap.h>
35 35
36#include "todoview.h" 36#include "todoview.h"
37 37
38class QTimer; 38class QTimer;
39 39
40namespace Todo { 40namespace Todo {
41 class CheckItem; 41 class CheckItem;
42 class DueTextItem; 42 class DueTextItem;
43 class TableView : public QTable, public TodoView { 43 class TableView : public QTable, public TodoView {
44 Q_OBJECT 44 Q_OBJECT
45 public: 45 public:
46 TableView( MainWindow*, QWidget* parent ); 46 TableView( MainWindow*, QWidget* parent );
47 ~TableView(); 47 ~TableView();
48 48
49 49
50 QString type()const; 50 QString type()const;
51 int current(); 51 int current();
52 QString currentRepresentation(); 52 QString currentRepresentation();
53 53
54 void clear(); 54 void clear();
55 void showOverDue( bool ); 55 void showOverDue( bool );
56 void updateView(); 56 void updateView();
57 void setTodo( int uid, const OTodo& ); 57 void setTodo( int uid, const OTodo& );
58 void addEvent( const OTodo& event ); 58 void addEvent( const OTodo& event );
59 void replaceEvent( const OTodo& ); 59 void replaceEvent( const OTodo& );
60 void removeEvent( int uid ); 60 void removeEvent( int uid );
61 void setShowCompleted( bool ); 61 void setShowCompleted( bool );
62 void setShowDeadline( bool ); 62 void setShowDeadline( bool );
63 63
64 void setShowCategory(const QString& =QString::null ); 64 void setShowCategory(const QString& =QString::null );
65 void newDay(); 65 void newDay();
66 QWidget* widget(); 66 QWidget* widget();
67 void sortColumn(int, bool, bool ); 67 void sortColumn(int, bool, bool );
68 68
69 /* 69 /*
70 * we do our drawing ourselves 70 * we do our drawing ourselves
71 * because we don't want to have 71 * because we don't want to have
72 * 40.000 QTableItems for 10.000 72 * 40.000 QTableItems for 10.000
73 * OTodos where we only show 10 at a time! 73 * OTodos where we only show 10 at a time!
74 */ 74 */
75 void paintCell(QPainter* p, int row, int col, const QRect&, bool ); 75 void paintCell(QPainter* p, int row, int col, const QRect&, bool );
76 private: 76 private:
77 /* reimplented for internal reasons */ 77 /* reimplented for internal reasons */
78 void viewportPaintEvent( QPaintEvent* ); 78 void viewportPaintEvent( QPaintEvent* );
79 QTimer *m_menuTimer; 79 QTimer *m_menuTimer;
80 bool m_enablePaint:1; 80 bool m_enablePaint:1;
81 QString m_oleCat; 81 QString m_oleCat;
82 bool m_first : 1; 82 bool m_first : 1;
83 83
84 QPixmap m_pic_completed; 84 QPixmap m_pic_completed;
85 QPixmap m_pic_priority[ 5 ]; 85 QPixmap m_pic_priority[ 5 ];
86 86
87 protected: 87 protected:
88 void keyPressEvent( QKeyEvent* );
88 void contentsMouseReleaseEvent( QMouseEvent* ); 89 void contentsMouseReleaseEvent( QMouseEvent* );
89 void contentsMouseMoveEvent( QMouseEvent* ); 90 void contentsMouseMoveEvent( QMouseEvent* );
90 void timerEvent( QTimerEvent* e ); 91 void timerEvent( QTimerEvent* e );
91 QWidget* createEditor(int row, int col, bool initFromCell )const; 92 QWidget* createEditor(int row, int col, bool initFromCell )const;
92 void setCellContentFromEditor( int row, int col ); 93 void setCellContentFromEditor( int row, int col );
93 94
94private slots: 95private slots:
95 void slotShowMenu(); 96 void slotShowMenu();
96 void slotClicked(int, int, int, 97 void slotClicked(int, int, int,
97 const QPoint& ); 98 const QPoint& );
98 void slotPressed(int, int, int, 99 void slotPressed(int, int, int,
99 const QPoint& ); 100 const QPoint& );
100 void slotValueChanged(int, int); 101 void slotValueChanged(int, int);
101 void slotCurrentChanged(int, int ); 102 void slotCurrentChanged(int, int );
102 void slotPriority(); 103 void slotPriority();
103 private: 104 private:
104 void initConfig(); 105 void initConfig();
105 int m_completeStrokeWidth; 106 int m_completeStrokeWidth;
106 bool m_row : 1; 107 bool m_row : 1;
107 QPoint m_prevP; 108 QPoint m_prevP;
108 }; 109 };
109}; 110};
110 111
111#endif 112#endif
diff --git a/core/pim/todo/textviewshow.cpp b/core/pim/todo/textviewshow.cpp
index 24c8c0e..fe8a9c8 100644
--- a/core/pim/todo/textviewshow.cpp
+++ b/core/pim/todo/textviewshow.cpp
@@ -1,19 +1,32 @@
1#include "mainwindow.h"
1#include "textviewshow.h" 2#include "textviewshow.h"
2 3
3using namespace Todo; 4using namespace Todo;
4 5
5TextViewShow::TextViewShow( QWidget* parent) 6TextViewShow::TextViewShow( QWidget* parent, MainWindow* win)
6 : QTextView( parent ), TodoShow() { 7 : QTextView( parent ), TodoShow(win) {
7 8
8} 9}
9TextViewShow::~TextViewShow() { 10TextViewShow::~TextViewShow() {
10} 11}
11QString TextViewShow::type()const { 12QString TextViewShow::type()const {
12 return QString::fromLatin1("TextViewShow"); 13 return QString::fromLatin1("TextViewShow");
13} 14}
14void TextViewShow::slotShow( const OTodo& ev ) { 15void TextViewShow::slotShow( const OTodo& ev ) {
15 setText( ev.toRichText() ); 16 setText( ev.toRichText() );
16} 17}
17QWidget* TextViewShow::widget() { 18QWidget* TextViewShow::widget() {
18 return this; 19 return this;
19} 20}
21void TextViewShow::keyPressEvent( QKeyEvent* event ) {
22 switch( event->key() ) {
23 case Qt::Key_F33:
24 case Qt::Key_Enter:
25 case Qt::Key_Return:
26 escapeView();
27 break;
28 default:
29 QTextView::keyPressEvent( event );
30 break;
31 }
32}
diff --git a/core/pim/todo/textviewshow.h b/core/pim/todo/textviewshow.h
index f58026b..498de81 100644
--- a/core/pim/todo/textviewshow.h
+++ b/core/pim/todo/textviewshow.h
@@ -1,17 +1,20 @@
1#include <qtextview.h> 1#include <qtextview.h>
2 2
3#include "todoshow.h" 3#include "todoshow.h"
4 4
5namespace Todo { 5namespace Todo {
6 6
7 class TextViewShow : public QTextView, public TodoShow { 7 class TextViewShow : public QTextView, public TodoShow {
8 public: 8 public:
9 TextViewShow( QWidget* parent ); 9 TextViewShow( QWidget* parent, MainWindow* );
10 ~TextViewShow(); 10 ~TextViewShow();
11 11
12 QString type()const; 12 QString type()const;
13 void slotShow( const OTodo& ev ); 13 void slotShow( const OTodo& ev );
14 QWidget* widget(); 14 QWidget* widget();
15 15
16 protected:
17 void keyPressEvent( QKeyEvent* );
18
16 }; 19 };
17}; 20};
diff --git a/core/pim/todo/todoshow.cpp b/core/pim/todo/todoshow.cpp
index c84a08f..4dbc9aa 100644
--- a/core/pim/todo/todoshow.cpp
+++ b/core/pim/todo/todoshow.cpp
@@ -1,9 +1,16 @@
1
2#include "mainwindow.h"
1#include "todoshow.h" 3#include "todoshow.h"
2 4
3using namespace Todo; 5using namespace Todo;
4 6
5TodoShow::TodoShow() { 7TodoShow::TodoShow(MainWindow* win) {
8 m_win = win;
6} 9}
7TodoShow::~TodoShow() { 10TodoShow::~TodoShow() {
8} 11}
12void TodoShow::escapeView() {
13 if (m_win )
14 m_win->slotReturnFromView();
15}
9 16
diff --git a/core/pim/todo/todoshow.h b/core/pim/todo/todoshow.h
index 198e9ae..7267b13 100644
--- a/core/pim/todo/todoshow.h
+++ b/core/pim/todo/todoshow.h
@@ -1,53 +1,58 @@
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  -_. . .   )=.  = Library General Public License along with 21  -_. . .   )=.  = Library 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#ifndef TODO_TODO_SHOW_H 28#ifndef TODO_TODO_SHOW_H
29#define TODO_TODO_SHOW_H 29#define TODO_TODO_SHOW_H
30 30
31#include <qstring.h> 31#include <qstring.h>
32#include <qwidget.h> 32#include <qwidget.h>
33 33
34#include <opie/otodo.h> 34#include <opie/otodo.h>
35 35
36namespace Todo { 36namespace Todo {
37 class MainWindow;
37 /** 38 /**
38 * TodoShow is the baseclass of 39 * TodoShow is the baseclass of
39 * of all TodoShows. 40 * of all TodoShows.
40 * The first implementation is a QTextView 41 * The first implementation is a QTextView
41 * implementation showing the Todo as richtext 42 * implementation showing the Todo as richtext
42 */ 43 */
43 class TodoShow { 44 class TodoShow {
44 public: 45 public:
45 TodoShow(); 46 TodoShow( MainWindow* win);
46 virtual ~TodoShow(); 47 virtual ~TodoShow();
47 virtual QString type()const = 0; 48 virtual QString type()const = 0;
48 virtual void slotShow( const OTodo& ev ) = 0; 49 virtual void slotShow( const OTodo& ev ) = 0;
49 virtual QWidget* widget() = 0; 50 virtual QWidget* widget() = 0;
51 protected:
52 void escapeView();
53 private:
54 MainWindow *m_win;
50 }; 55 };
51}; 56};
52 57
53#endif 58#endif