summaryrefslogtreecommitdiff
authorumopapisdn <umopapisdn>2003-04-12 00:22:57 (UTC)
committer umopapisdn <umopapisdn>2003-04-12 00:22:57 (UTC)
commit59e2de381eebb33238ee1b257736a9ae0afdbb7e (patch) (unidiff)
treeb86025f2f75318aba65534048105cec36d4b7766
parentd37f3eac6b876285eb7a03ab01194ea261458ea5 (diff)
downloadopie-59e2de381eebb33238ee1b257736a9ae0afdbb7e.zip
opie-59e2de381eebb33238ee1b257736a9ae0afdbb7e.tar.gz
opie-59e2de381eebb33238ee1b257736a9ae0afdbb7e.tar.bz2
Bugfix: (bug #0000833) Duplicating an event should also duplicate the category.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/datebook/datebook.cpp137
1 files changed, 58 insertions, 79 deletions
diff --git a/core/pim/datebook/datebook.cpp b/core/pim/datebook/datebook.cpp
index 3e18374..1bc82a5 100644
--- a/core/pim/datebook/datebook.cpp
+++ b/core/pim/datebook/datebook.cpp
@@ -1,1023 +1,1002 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19** $Id$ 19** $Id$
20** 20**
21**********************************************************************/ 21**********************************************************************/
22 22
23#define QTOPIA_INTERNAL_FD 23#define QTOPIA_INTERNAL_FD
24 24
25#include "datebook.h" 25#include "datebook.h"
26#include "datebookday.h" 26#include "datebookday.h"
27#include "datebooksettings.h" 27#include "datebooksettings.h"
28#include "datebookweek.h" 28#include "datebookweek.h"
29#include "datebookweeklst.h" 29#include "datebookweeklst.h"
30#include "dateentryimpl.h" 30#include "dateentryimpl.h"
31 31
32#include <qpe/datebookmonth.h> 32#include <qpe/datebookmonth.h>
33#include <qpe/qpeapplication.h> 33#include <qpe/qpeapplication.h>
34#include <qpe/config.h> 34#include <qpe/config.h>
35#include <qpe/qpedebug.h> 35#include <qpe/qpedebug.h>
36#include <qpe/event.h> 36#include <qpe/event.h>
37#include <qpe/finddialog.h> 37#include <qpe/finddialog.h>
38#include <qpe/ir.h> 38#include <qpe/ir.h>
39#include <qpe/qpemenubar.h> 39#include <qpe/qpemenubar.h>
40#include <qpe/qpemessagebox.h> 40#include <qpe/qpemessagebox.h>
41#include <qpe/resource.h> 41#include <qpe/resource.h>
42#include <qpe/sound.h> 42#include <qpe/sound.h>
43#include <qpe/timestring.h> 43#include <qpe/timestring.h>
44#include <qpe/qpetoolbar.h> 44#include <qpe/qpetoolbar.h>
45#include <qpe/tzselect.h> 45#include <qpe/tzselect.h>
46#include <qpe/xmlreader.h> 46#include <qpe/xmlreader.h>
47 47
48#include <qaction.h> 48#include <qaction.h>
49#include <qcopchannel_qws.h> 49#include <qcopchannel_qws.h>
50#include <qdatetime.h> 50#include <qdatetime.h>
51#include <qdialog.h> 51#include <qdialog.h>
52#include <qfile.h> 52#include <qfile.h>
53#include <qlabel.h> 53#include <qlabel.h>
54#include <qlayout.h> 54#include <qlayout.h>
55#include <qmessagebox.h> 55#include <qmessagebox.h>
56#include <qpopupmenu.h> 56#include <qpopupmenu.h>
57#include <qpushbutton.h> 57#include <qpushbutton.h>
58#include <qregexp.h> 58#include <qregexp.h>
59#include <qtextcodec.h> 59#include <qtextcodec.h>
60#include <qtextstream.h> 60#include <qtextstream.h>
61#include <qtimer.h> 61#include <qtimer.h>
62#include <qtl.h> 62#include <qtl.h>
63#include <qwidgetstack.h> 63#include <qwidgetstack.h>
64#include <qwindowsystem_qws.h> 64#include <qwindowsystem_qws.h>
65 65
66#include <sys/stat.h> 66#include <sys/stat.h>
67#include <sys/types.h> 67#include <sys/types.h>
68#include <fcntl.h> 68#include <fcntl.h>
69#include <unistd.h> 69#include <unistd.h>
70 70
71#include <stdlib.h> 71#include <stdlib.h>
72 72
73#define DAY 1 73#define DAY 1
74#define WEEK 2 74#define WEEK 2
75#define WEEKLST 4 75#define WEEKLST 4
76#define MONTH 3 76#define MONTH 3
77 77
78 78
79DateBook::DateBook( QWidget *parent, const char *, WFlags f ) 79DateBook::DateBook( QWidget *parent, const char *, WFlags f )
80 : QMainWindow( parent, "datebook", f ), 80 : QMainWindow( parent, "datebook", f ),
81 aPreset( FALSE ), 81 aPreset( FALSE ),
82 presetTime( -1 ), 82 presetTime( -1 ),
83 startTime( 8 ), // an acceptable default 83 startTime( 8 ), // an acceptable default
84 rowStyle( 0 ), 84 rowStyle( 0 ),
85 bJumpToCurTime(FALSE), 85 bJumpToCurTime(FALSE),
86 syncing(FALSE), 86 syncing(FALSE),
87 inSearch(FALSE), 87 inSearch(FALSE),
88 alarmCounter(0) 88 alarmCounter(0)
89{ 89{
90 bool needEvilHack= false; // if we need an Evil Hack 90 bool needEvilHack= false; // if we need an Evil Hack
91 QTime t; 91 QTime t;
92 t.start(); 92 t.start();
93 db = new DateBookDBHack; 93 db = new DateBookDBHack;
94 qDebug("loading db t=%d", t.elapsed() ); 94 qDebug("loading db t=%d", t.elapsed() );
95 loadSettings(); 95 loadSettings();
96 setCaption( tr("Calendar") ); 96 setCaption( tr("Calendar") );
97 setIcon( Resource::loadPixmap( "datebook_icon" ) ); 97 setIcon( Resource::loadPixmap( "datebook_icon" ) );
98 98
99 setToolBarsMovable( FALSE ); 99 setToolBarsMovable( FALSE );
100 100
101 views = new QWidgetStack( this ); 101 views = new QWidgetStack( this );
102 setCentralWidget( views ); 102 setCentralWidget( views );
103 103
104 dayView = 0; 104 dayView = 0;
105 weekView = 0; 105 weekView = 0;
106 weekLstView = 0; 106 weekLstView = 0;
107 monthView = 0; 107 monthView = 0;
108 108
109 QPEToolBar *bar = new QPEToolBar( this ); 109 QPEToolBar *bar = new QPEToolBar( this );
110 bar->setHorizontalStretchable( TRUE ); 110 bar->setHorizontalStretchable( TRUE );
111 111
112 QPEMenuBar *mb = new QPEMenuBar( bar ); 112 QPEMenuBar *mb = new QPEMenuBar( bar );
113 mb->setMargin( 0 ); 113 mb->setMargin( 0 );
114 114
115 QPEToolBar *sub_bar = new QPEToolBar(this); 115 QPEToolBar *sub_bar = new QPEToolBar(this);
116 116
117 QPopupMenu *view = new QPopupMenu( this ); 117 QPopupMenu *view = new QPopupMenu( this );
118 QPopupMenu *settings = new QPopupMenu( this ); 118 QPopupMenu *settings = new QPopupMenu( this );
119 119
120 mb->insertItem( tr( "View" ), view ); 120 mb->insertItem( tr( "View" ), view );
121 mb->insertItem( tr( "Settings" ), settings ); 121 mb->insertItem( tr( "Settings" ), settings );
122 122
123 QActionGroup *g = new QActionGroup( this ); 123 QActionGroup *g = new QActionGroup( this );
124 g->setExclusive( TRUE ); 124 g->setExclusive( TRUE );
125 125
126 QAction *a = new QAction( tr( "New" ), Resource::loadPixmap( "new" ), 126 QAction *a = new QAction( tr( "New" ), Resource::loadPixmap( "new" ),
127 QString::null, 0, this, 0 ); 127 QString::null, 0, this, 0 );
128 connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) ); 128 connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) );
129 a->addTo( sub_bar ); 129 a->addTo( sub_bar );
130 130
131 a = new QAction( tr( "Today" ), Resource::loadPixmap( "datebook/to_day" ), QString::null, 0, g, 0 ); 131 a = new QAction( tr( "Today" ), Resource::loadPixmap( "datebook/to_day" ), QString::null, 0, g, 0 );
132 connect( a, SIGNAL( activated() ), this, SLOT( slotToday() ) ); 132 connect( a, SIGNAL( activated() ), this, SLOT( slotToday() ) );
133 a->addTo( sub_bar ); 133 a->addTo( sub_bar );
134 a->addTo( view ); 134 a->addTo( view );
135 135
136 a = new QAction( tr( "Day" ), Resource::loadPixmap( "day" ), QString::null, 0, g, 0 ); 136 a = new QAction( tr( "Day" ), Resource::loadPixmap( "day" ), QString::null, 0, g, 0 );
137 connect( a, SIGNAL( activated() ), this, SLOT( viewDay() ) ); 137 connect( a, SIGNAL( activated() ), this, SLOT( viewDay() ) );
138 a->addTo( sub_bar ); 138 a->addTo( sub_bar );
139 a->addTo( view ); 139 a->addTo( view );
140 a->setToggleAction( TRUE ); 140 a->setToggleAction( TRUE );
141 a->setOn( TRUE ); 141 a->setOn( TRUE );
142 dayAction = a; 142 dayAction = a;
143 143
144 a = new QAction( tr( "Week" ), Resource::loadPixmap( "week" ), QString::null, 0, g, 0 ); 144 a = new QAction( tr( "Week" ), Resource::loadPixmap( "week" ), QString::null, 0, g, 0 );
145 connect( a, SIGNAL( activated() ), this, SLOT( viewWeek() ) ); 145 connect( a, SIGNAL( activated() ), this, SLOT( viewWeek() ) );
146 a->addTo( sub_bar ); 146 a->addTo( sub_bar );
147 a->addTo( view ); 147 a->addTo( view );
148 a->setToggleAction( TRUE ); 148 a->setToggleAction( TRUE );
149 weekAction = a; 149 weekAction = a;
150 150
151 a = new QAction( tr( "WeekLst" ), Resource::loadPixmap( "datebook/weeklst" ), QString::null, 0, g, 0 ); 151 a = new QAction( tr( "WeekLst" ), Resource::loadPixmap( "datebook/weeklst" ), QString::null, 0, g, 0 );
152 connect( a, SIGNAL( activated() ), this, SLOT( viewWeekLst() ) ); 152 connect( a, SIGNAL( activated() ), this, SLOT( viewWeekLst() ) );
153 a->addTo( sub_bar ); 153 a->addTo( sub_bar );
154 a->addTo( view ); 154 a->addTo( view );
155 a->setToggleAction( TRUE ); 155 a->setToggleAction( TRUE );
156 weekLstAction = a; 156 weekLstAction = a;
157 157
158 a = new QAction( tr( "Month" ), Resource::loadPixmap( "month" ), QString::null, 0, g, 0 ); 158 a = new QAction( tr( "Month" ), Resource::loadPixmap( "month" ), QString::null, 0, g, 0 );
159 connect( a, SIGNAL( activated() ), this, SLOT( viewMonth() ) ); 159 connect( a, SIGNAL( activated() ), this, SLOT( viewMonth() ) );
160 a->addTo( sub_bar ); 160 a->addTo( sub_bar );
161 a->addTo( view ); 161 a->addTo( view );
162 a->setToggleAction( TRUE ); 162 a->setToggleAction( TRUE );
163 monthAction = a; 163 monthAction = a;
164 164
165 a = new QAction( tr( "Find" ), Resource::loadPixmap( "mag" ), QString::null, 0, g, 0 ); 165 a = new QAction( tr( "Find" ), Resource::loadPixmap( "mag" ), QString::null, 0, g, 0 );
166 connect( a, SIGNAL(activated()), this, SLOT(slotFind()) ); 166 connect( a, SIGNAL(activated()), this, SLOT(slotFind()) );
167 a->addTo( sub_bar ); 167 a->addTo( sub_bar );
168 168
169 a = new QAction( tr( "Alarm and Start Time..." ), QString::null, 0, 0 ); 169 a = new QAction( tr( "Alarm and Start Time..." ), QString::null, 0, 0 );
170 connect( a, SIGNAL( activated() ), this, SLOT( slotSettings() ) ); 170 connect( a, SIGNAL( activated() ), this, SLOT( slotSettings() ) );
171 a->addTo( settings ); 171 a->addTo( settings );
172 172
173 QPopupMenu *default_view = new QPopupMenu(this); 173 QPopupMenu *default_view = new QPopupMenu(this);
174 settings->insertItem( tr( "Default View" ),default_view ); 174 settings->insertItem( tr( "Default View" ),default_view );
175 default_view->setCheckable(TRUE); 175 default_view->setCheckable(TRUE);
176 176
177 Config config("DateBook"); 177 Config config("DateBook");
178 config.setGroup("Main"); 178 config.setGroup("Main");
179 int current=config.readNumEntry("defaultview", DAY); 179 int current=config.readNumEntry("defaultview", DAY);
180 180
181 QActionGroup *ag = new QActionGroup(this); 181 QActionGroup *ag = new QActionGroup(this);
182 a = new QAction( tr( "Day" ), QString::null, 0, 0, 0, true ); 182 a = new QAction( tr( "Day" ), QString::null, 0, 0, 0, true );
183 if (current==DAY) a->setOn(true), viewDay(); 183 if (current==DAY) a->setOn(true), viewDay();
184 ag->insert(a); 184 ag->insert(a);
185 a = new QAction( tr( "Week" ), QString::null, 0, 0, 0, true ); 185 a = new QAction( tr( "Week" ), QString::null, 0, 0, 0, true );
186 if (current==WEEK) a->setOn(true), /*viewWeek(),*/ needEvilHack = true; 186 if (current==WEEK) a->setOn(true), /*viewWeek(),*/ needEvilHack = true;
187 ag->insert(a); 187 ag->insert(a);
188 a = new QAction( tr( "WeekLst" ), QString::null, 0, 0, 0, true ); 188 a = new QAction( tr( "WeekLst" ), QString::null, 0, 0, 0, true );
189 if (current==WEEKLST) a->setOn(true), viewWeekLst(); 189 if (current==WEEKLST) a->setOn(true), viewWeekLst();
190 ag->insert(a); 190 ag->insert(a);
191 a = new QAction( tr( "Month" ), QString::null, 0, 0, 0, true ); 191 a = new QAction( tr( "Month" ), QString::null, 0, 0, 0, true );
192 if (current==MONTH) a->setOn(true), viewMonth(); 192 if (current==MONTH) a->setOn(true), viewMonth();
193 ag->insert(a); 193 ag->insert(a);
194 194
195 ag->addTo(default_view); 195 ag->addTo(default_view);
196 connect(ag, SIGNAL( selected ( QAction * ) ), 196 connect(ag, SIGNAL( selected ( QAction * ) ),
197 this, SLOT( newDefaultView(QAction *) ) 197 this, SLOT( newDefaultView(QAction *) )
198 ); 198 );
199 199
200 connect( qApp, SIGNAL(clockChanged(bool)), 200 connect( qApp, SIGNAL(clockChanged(bool)),
201 this, SLOT(changeClock(bool)) ); 201 this, SLOT(changeClock(bool)) );
202 connect( qApp, SIGNAL(weekChanged(bool)), 202 connect( qApp, SIGNAL(weekChanged(bool)),
203 this, SLOT(changeWeek(bool)) ); 203 this, SLOT(changeWeek(bool)) );
204 204
205#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 205#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
206 connect( qApp, SIGNAL(appMessage(const QCString&, const QByteArray&)), 206 connect( qApp, SIGNAL(appMessage(const QCString&, const QByteArray&)),
207 this, SLOT(appMessage(const QCString&, const QByteArray&)) ); 207 this, SLOT(appMessage(const QCString&, const QByteArray&)) );
208#endif 208#endif
209 209
210 // listen on QPE/System 210 // listen on QPE/System
211#if defined(Q_WS_QWS) 211#if defined(Q_WS_QWS)
212#if !defined(QT_NO_COP) 212#if !defined(QT_NO_COP)
213 QCopChannel *channel = new QCopChannel( "QPE/System", this ); 213 QCopChannel *channel = new QCopChannel( "QPE/System", this );
214 connect( channel, SIGNAL(received(const QCString&, const QByteArray&)), 214 connect( channel, SIGNAL(received(const QCString&, const QByteArray&)),
215 this, SLOT(receive(const QCString&, const QByteArray&)) ); 215 this, SLOT(receive(const QCString&, const QByteArray&)) );
216 channel = new QCopChannel( "QPE/Datebook", this ); 216 channel = new QCopChannel( "QPE/Datebook", this );
217 connect( channel, SIGNAL(received(const QCString&, const QByteArray&)), 217 connect( channel, SIGNAL(received(const QCString&, const QByteArray&)),
218 this, SLOT(receive(const QCString&, const QByteArray&)) ); 218 this, SLOT(receive(const QCString&, const QByteArray&)) );
219 qDebug("olle\n"); 219 qDebug("olle\n");
220#endif 220#endif
221#endif 221#endif
222 222
223 qDebug("done t=%d", t.elapsed() ); 223 qDebug("done t=%d", t.elapsed() );
224 224
225 /* 225 /*
226 * Here is a problem description: 226 * Here is a problem description:
227 * When Weekview is the default view 227 * When Weekview is the default view
228 * a DateBookWeekView get's created 228 * a DateBookWeekView get's created
229 * redraw() get's called. So what? 229 * redraw() get's called. So what?
230 * Remember that we're still in the c'tor 230 * Remember that we're still in the c'tor
231 * and no final layout has happened? Ok 231 * and no final layout has happened? Ok
232 * now all Events get arranged. Their x 232 * now all Events get arranged. Their x
233 * position get's determined by a QHeader 233 * position get's determined by a QHeader
234 * position. But the QHeader isn't layouted or 234 * position. But the QHeader isn't layouted or
235 * at the right position. redraw() is a slot 235 * at the right position. redraw() is a slot
236 * so we'll call it then via a singleShot 236 * so we'll call it then via a singleShot
237 * from view() 237 * from view()
238 */ 238 */
239 if( needEvilHack ){ 239 if( needEvilHack ){
240 QTimer::singleShot( 500, this, SLOT(viewWeek()) ); 240 QTimer::singleShot( 500, this, SLOT(viewWeek()) );
241 } 241 }
242} 242}
243 243
244void DateBook::receive( const QCString &msg, const QByteArray &data ) 244void DateBook::receive( const QCString &msg, const QByteArray &data )
245{ 245{
246 QDataStream stream( data, IO_ReadOnly ); 246 QDataStream stream( data, IO_ReadOnly );
247 if ( msg == "timeChange(QString)" ) { 247 if ( msg == "timeChange(QString)" ) {
248 // update active view! 248 // update active view!
249 if ( dayAction->isOn() ) 249 if ( dayAction->isOn() )
250 viewDay(); 250 viewDay();
251 else if ( weekAction->isOn() ) 251 else if ( weekAction->isOn() )
252 viewWeek(); 252 viewWeek();
253 else if ( monthAction->isOn() ) 253 else if ( monthAction->isOn() )
254 viewMonth(); 254 viewMonth();
255 } 255 }
256 else if (msg == "editEvent(int)") { 256 else if (msg == "editEvent(int)") {
257 int uid; 257 int uid;
258 stream >> uid; 258 stream >> uid;
259 Event e=db->eventByUID(uid); 259 Event e=db->eventByUID(uid);
260 editEvent(e); 260 editEvent(e);
261 } 261 }
262} 262}
263 263
264DateBook::~DateBook() 264DateBook::~DateBook()
265{ 265{
266} 266}
267 267
268void DateBook::slotSettings() 268void DateBook::slotSettings()
269{ 269{
270 DateBookSettings frmSettings( ampm, this ); 270 DateBookSettings frmSettings( ampm, this );
271 frmSettings.setStartTime( startTime ); 271 frmSettings.setStartTime( startTime );
272 frmSettings.setAlarmPreset( aPreset, presetTime ); 272 frmSettings.setAlarmPreset( aPreset, presetTime );
273 frmSettings.setJumpToCurTime( bJumpToCurTime ); 273 frmSettings.setJumpToCurTime( bJumpToCurTime );
274 frmSettings.setRowStyle( rowStyle ); 274 frmSettings.setRowStyle( rowStyle );
275#if defined (Q_WS_QWS) || defined(_WS_QWS_) 275#if defined (Q_WS_QWS) || defined(_WS_QWS_)
276 frmSettings.showMaximized(); 276 frmSettings.showMaximized();
277#endif 277#endif
278 278
279 if ( frmSettings.exec() ) { 279 if ( frmSettings.exec() ) {
280 aPreset = frmSettings.alarmPreset(); 280 aPreset = frmSettings.alarmPreset();
281 presetTime = frmSettings.presetTime(); 281 presetTime = frmSettings.presetTime();
282 startTime = frmSettings.startTime(); 282 startTime = frmSettings.startTime();
283 bJumpToCurTime = frmSettings.jumpToCurTime(); 283 bJumpToCurTime = frmSettings.jumpToCurTime();
284 rowStyle = frmSettings.rowStyle(); 284 rowStyle = frmSettings.rowStyle();
285 if ( dayView ) 285 if ( dayView )
286 dayView->setStartViewTime( startTime ); 286 dayView->setStartViewTime( startTime );
287 dayView->setJumpToCurTime( bJumpToCurTime ); 287 dayView->setJumpToCurTime( bJumpToCurTime );
288 dayView->setRowStyle( rowStyle ); 288 dayView->setRowStyle( rowStyle );
289 if ( weekView ) 289 if ( weekView )
290 weekView->setStartViewTime( startTime ); 290 weekView->setStartViewTime( startTime );
291 saveSettings(); 291 saveSettings();
292 292
293 // make the change obvious 293 // make the change obvious
294 if ( views->visibleWidget() ) { 294 if ( views->visibleWidget() ) {
295 if ( views->visibleWidget() == dayView ) 295 if ( views->visibleWidget() == dayView )
296 dayView->redraw(); 296 dayView->redraw();
297 else if ( views->visibleWidget() == weekView ) 297 else if ( views->visibleWidget() == weekView )
298 weekView->redraw(); 298 weekView->redraw();
299 } 299 }
300 } 300 }
301} 301}
302 302
303void DateBook::fileNew() 303void DateBook::fileNew()
304{ 304{
305 slotNewEventFromKey(""); 305 slotNewEventFromKey("");
306} 306}
307 307
308QString DateBook::checkEvent(const Event &e) 308QString DateBook::checkEvent(const Event &e)
309{ 309{
310 /* check if overlaps with itself */ 310 /* check if overlaps with itself */
311 bool checkFailed = FALSE; 311 bool checkFailed = FALSE;
312 312
313 /* check the next 12 repeats. should catch most problems */ 313 /* check the next 12 repeats. should catch most problems */
314 QDate current_date = e.start().date(); 314 QDate current_date = e.start().date();
315 Event previous = e; 315 Event previous = e;
316 for(int i = 0; i < 12; i++) 316 for(int i = 0; i < 12; i++)
317 { 317 {
318 QDateTime next; 318 QDateTime next;
319 if (!nextOccurance(previous, current_date.addDays(1), next)) { 319 if (!nextOccurance(previous, current_date.addDays(1), next)) {
320 break; // no more repeats 320 break; // no more repeats
321 } 321 }
322 if(next < previous.end()) { 322 if(next < previous.end()) {
323 checkFailed = TRUE; 323 checkFailed = TRUE;
324 break; 324 break;
325 } 325 }
326 current_date = next.date(); 326 current_date = next.date();
327 } 327 }
328 328
329 if(checkFailed) 329 if(checkFailed)
330 return tr("Event duration is potentially longer\n" 330 return tr("Event duration is potentially longer\n"
331 "than interval between repeats."); 331 "than interval between repeats.");
332 332
333 return QString::null; 333 return QString::null;
334} 334}
335 335
336QDate DateBook::currentDate() 336QDate DateBook::currentDate()
337{ 337{
338 QDate d = QDate::currentDate(); 338 QDate d = QDate::currentDate();
339 339
340 if ( dayView && views->visibleWidget() == dayView ) { 340 if ( dayView && views->visibleWidget() == dayView ) {
341 d = dayView->date(); 341 d = dayView->date();
342 } else if ( weekView && views->visibleWidget() == weekView ) { 342 } else if ( weekView && views->visibleWidget() == weekView ) {
343 d = weekView->date(); 343 d = weekView->date();
344 } else if ( weekLstView && views->visibleWidget() == weekLstView ) { 344 } else if ( weekLstView && views->visibleWidget() == weekLstView ) {
345 d = weekLstView->date(); 345 d = weekLstView->date();
346 } else if ( monthView && views->visibleWidget() == monthView ) { 346 } else if ( monthView && views->visibleWidget() == monthView ) {
347 d = monthView->selectedDate(); 347 d = monthView->selectedDate();
348 } 348 }
349 349
350 return d; 350 return d;
351} 351}
352 352
353void DateBook::view(int v, const QDate &d) { 353void DateBook::view(int v, const QDate &d) {
354 if (v==DAY) { 354 if (v==DAY) {
355 initDay(); 355 initDay();
356 dayAction->setOn( TRUE ); 356 dayAction->setOn( TRUE );
357 dayView->setDate( d ); 357 dayView->setDate( d );
358 views->raiseWidget( dayView ); 358 views->raiseWidget( dayView );
359 dayView->redraw(); 359 dayView->redraw();
360 } else if (v==WEEK) { 360 } else if (v==WEEK) {
361 initWeek(); 361 initWeek();
362 weekAction->setOn( TRUE ); 362 weekAction->setOn( TRUE );
363 weekView->setDate( d ); 363 weekView->setDate( d );
364 views->raiseWidget( weekView ); 364 views->raiseWidget( weekView );
365 weekView->redraw(); 365 weekView->redraw();
366 } else if (v==WEEKLST) { 366 } else if (v==WEEKLST) {
367 initWeekLst(); 367 initWeekLst();
368 weekLstAction->setOn( TRUE ); 368 weekLstAction->setOn( TRUE );
369 weekLstView->setDate(d); 369 weekLstView->setDate(d);
370 views->raiseWidget( weekLstView ); 370 views->raiseWidget( weekLstView );
371 weekLstView->redraw(); 371 weekLstView->redraw();
372 } else if (v==MONTH) { 372 } else if (v==MONTH) {
373 initMonth(); 373 initMonth();
374 monthAction->setOn( TRUE ); 374 monthAction->setOn( TRUE );
375 monthView->setDate( d.year(), d.month(), d.day() ); 375 monthView->setDate( d.year(), d.month(), d.day() );
376 views->raiseWidget( monthView ); 376 views->raiseWidget( monthView );
377 monthView->redraw(); 377 monthView->redraw();
378 } 378 }
379} 379}
380 380
381void DateBook::viewDefault(const QDate &d) { 381void DateBook::viewDefault(const QDate &d) {
382 Config config("DateBook"); 382 Config config("DateBook");
383 config.setGroup("Main"); 383 config.setGroup("Main");
384 int current=config.readNumEntry("defaultview", DAY); 384 int current=config.readNumEntry("defaultview", DAY);
385 385
386 view(current,d); 386 view(current,d);
387} 387}
388 388
389void DateBook::viewDay() { 389void DateBook::viewDay() {
390 view(DAY,currentDate()); 390 view(DAY,currentDate());
391} 391}
392 392
393void DateBook::viewWeek() { 393void DateBook::viewWeek() {
394 view(WEEK,currentDate()); 394 view(WEEK,currentDate());
395} 395}
396 396
397void DateBook::viewWeekLst() { 397void DateBook::viewWeekLst() {
398 view(WEEKLST,currentDate()); 398 view(WEEKLST,currentDate());
399} 399}
400 400
401void DateBook::viewMonth() { 401void DateBook::viewMonth() {
402 view(MONTH,currentDate()); 402 view(MONTH,currentDate());
403} 403}
404 404
405void DateBook::duplicateEvent( const Event &e ) 405void DateBook::duplicateEvent( const Event &e )
406{ 406{
407 qWarning("Hmmm..."); 407 qWarning("Hmmm...");
408 // Alot of code duplication, as this is almost like editEvent(); 408 // Alot of code duplication, as this is almost like editEvent();
409 if (syncing) { 409 if (syncing) {
410 QMessageBox::warning( this, tr("Calendar"), 410 QMessageBox::warning( this, tr("Calendar"), tr( "Can not edit data, currently syncing") );
411 tr( "Can not edit data, currently syncing") ); 411 return;
412 return;
413 } 412 }
414 413
415 Event dupevent; 414 Event dupevent(e);// Make a duplicate.
416 dupevent.setStart(e.start()); 415
417 dupevent.setEnd(e.end());
418 dupevent.setDescription(e.description());
419 dupevent.setLocation(e.location());
420 // dupevent.setCategory(e.category());// how is this done??
421 dupevent.setNotes(e.notes());
422 dupevent.setAllDay(e.isAllDay());
423 dupevent.setTimeZone(e.timeZone());
424 if(e.hasAlarm()) dupevent.setAlarm(e.alarmDelay(),e.alarmSound());
425 if(e.hasRepeat()) dupevent.setRepeat(e.repeatPattern());
426
427 // workaround added for text input. 416 // workaround added for text input.
428 QDialog editDlg( this, 0, TRUE ); 417 QDialog editDlg( this, 0, TRUE );
429 DateEntry *entry; 418 DateEntry *entry;
430 editDlg.setCaption( tr("Duplicate Event") ); 419 editDlg.setCaption( tr("Duplicate Event") );
431 QVBoxLayout *vb = new QVBoxLayout( &editDlg ); 420 QVBoxLayout *vb = new QVBoxLayout( &editDlg );
432 QScrollView *sv = new QScrollView( &editDlg, "scrollview" ); 421 QScrollView *sv = new QScrollView( &editDlg, "scrollview" );
433 sv->setResizePolicy( QScrollView::AutoOneFit ); 422 sv->setResizePolicy( QScrollView::AutoOneFit );
434 // KLUDGE!!! 423 // KLUDGE!!!
435 sv->setHScrollBarMode( QScrollView::AlwaysOff ); 424 sv->setHScrollBarMode( QScrollView::AlwaysOff );
436 vb->addWidget( sv ); 425 vb->addWidget( sv );
437 entry = new DateEntry( onMonday, dupevent, ampm, &editDlg, "editor" ); 426 entry = new DateEntry( onMonday, dupevent, ampm, &editDlg, "editor" );
438 entry->timezone->setEnabled( FALSE ); 427 entry->timezone->setEnabled( FALSE );
439 sv->addChild( entry ); 428 sv->addChild( entry );
440 429
441#if defined(Q_WS_QWS) || defined(_WS_QWS_) 430#if defined(Q_WS_QWS) || defined(_WS_QWS_)
442 editDlg.showMaximized(); 431 editDlg.showMaximized();
443#endif 432#endif
444 while (editDlg.exec() ) { 433 while (editDlg.exec() ) {
445 Event newEv = entry->event(); 434 Event newEv = entry->event();
446 if(newEv.description().isEmpty() && newEv.notes().isEmpty() ) 435 QString error = checkEvent(newEv);
447 break; 436 if (!error.isNull()) {
448 newEv.setUid(e.uid()); // FIXME: Hack not to clear uid 437 if (QMessageBox::warning(this, "error box", error, "Fix it", "Continue", 0, 0, 1) == 0)
449 QString error = checkEvent(newEv); 438 continue;
450 if (!error.isNull()) { 439 }
451 if (QMessageBox::warning(this, "error box", 440 db->addEvent(newEv);
452 error, "Fix it", "Continue", 441 emit newEvent();
453 0, 0, 1) == 0) 442 break;
454 continue;
455 } 443 }
456 db->addEvent(newEv);
457 emit newEvent();
458 break;
459 }
460} 444}
461 445
462void DateBook::editEvent( const Event &e ) 446void DateBook::editEvent( const Event &e )
463{ 447{
464 if (syncing) { 448 if (syncing) {
465 QMessageBox::warning( this, tr("Calendar"), 449 QMessageBox::warning( this, tr("Calendar"), tr( "Can not edit data, currently syncing") );
466 tr( "Can not edit data, currently syncing") ); 450 return;
467 return; 451 }
468 }
469 452
470 // workaround added for text input. 453 // workaround added for text input.
471 QDialog editDlg( this, 0, TRUE ); 454 QDialog editDlg( this, 0, TRUE );
472 DateEntry *entry; 455 DateEntry *entry;
473 editDlg.setCaption( tr("Edit Event") ); 456 editDlg.setCaption( tr("Edit Event") );
474 QVBoxLayout *vb = new QVBoxLayout( &editDlg ); 457 QVBoxLayout *vb = new QVBoxLayout( &editDlg );
475 QScrollView *sv = new QScrollView( &editDlg, "scrollview" ); 458 QScrollView *sv = new QScrollView( &editDlg, "scrollview" );
476 sv->setResizePolicy( QScrollView::AutoOneFit ); 459 sv->setResizePolicy( QScrollView::AutoOneFit );
477 // KLUDGE!!! 460 // KLUDGE!!!
478 sv->setHScrollBarMode( QScrollView::AlwaysOff ); 461 sv->setHScrollBarMode( QScrollView::AlwaysOff );
479 vb->addWidget( sv ); 462 vb->addWidget( sv );
480 entry = new DateEntry( onMonday, e, ampm, &editDlg, "editor" ); 463 entry = new DateEntry( onMonday, e, ampm, &editDlg, "editor" );
481 entry->timezone->setEnabled( FALSE ); 464 entry->timezone->setEnabled( FALSE );
482 sv->addChild( entry ); 465 sv->addChild( entry );
483 466
484#if defined(Q_WS_QWS) || defined(_WS_QWS_) 467#if defined(Q_WS_QWS) || defined(_WS_QWS_)
485 editDlg.showMaximized(); 468 editDlg.showMaximized();
486#endif 469#endif
487 while (editDlg.exec() ) { 470 while (editDlg.exec() ) {
488 Event newEv = entry->event(); 471 Event newEv = entry->event();
489 if(newEv.description().isEmpty() && newEv.notes().isEmpty() ) 472 if(newEv.description().isEmpty() && newEv.notes().isEmpty() )
490 break; 473 break;
491 newEv.setUid(e.uid()); // FIXME: Hack not to clear uid 474 newEv.setUid(e.uid()); // FIXME: Hack not to clear uid
492 QString error = checkEvent(newEv); 475 QString error = checkEvent(newEv);
493 if (!error.isNull()) { 476 if (!error.isNull()) {
494 if (QMessageBox::warning(this, "error box", 477 if (QMessageBox::warning(this, "error box", error, "Fix it", "Continue", 0, 0, 1) == 0) continue;
495 error, "Fix it", "Continue",
496 0, 0, 1) == 0)
497 continue;
498 } 478 }
499 db->editEvent(e, newEv); 479 db->editEvent(e, newEv);
500 emit newEvent(); 480 emit newEvent();
501 break; 481 break;
502 } 482 }
503} 483}
504 484
505void DateBook::removeEvent( const Event &e ) 485void DateBook::removeEvent( const Event &e )
506{ 486{
507 if (syncing) { 487 if (syncing) {
508 QMessageBox::warning( this, tr("Calendar"), 488 QMessageBox::warning( this, tr("Calendar"), tr( "Can not edit data, currently syncing") );
509 tr( "Can not edit data, currently syncing") ); 489 return;
510 return; 490 }
511 }
512 491
513 QString strName = e.description(); 492 QString strName = e.description();
514 493
515 if ( !QPEMessageBox::confirmDelete( this, tr( "Calendar" ),strName ) ) 494 if ( !QPEMessageBox::confirmDelete( this, tr( "Calendar" ),strName ) )
516 return; 495 return;
517 496
518 db->removeEvent( e ); 497 db->removeEvent( e );
519 if ( views->visibleWidget() == dayView && dayView ) 498 if ( views->visibleWidget() == dayView && dayView )
520 dayView->redraw(); 499 dayView->redraw();
521} 500}
522 501
523void DateBook::addEvent( const Event &e ) 502void DateBook::addEvent( const Event &e )
524{ 503{
525 QDate d = e.start().date(); 504 QDate d = e.start().date();
526 initDay(); 505 initDay();
527 dayView->setDate( d ); 506 dayView->setDate( d );
528} 507}
529 508
530void DateBook::showDay( int year, int month, int day ) 509void DateBook::showDay( int year, int month, int day )
531{ 510{
532 QDate d(year, month, day); 511 QDate d(year, month, day);
533 view(DAY,d); 512 view(DAY,d);
534} 513}
535 514
536void DateBook::initDay() 515void DateBook::initDay()
537{ 516{
538 if ( !dayView ) { 517 if ( !dayView ) {
539 dayView = new DateBookDay( ampm, onMonday, db, views, "day view" ); 518 dayView = new DateBookDay( ampm, onMonday, db, views, "day view" );
540 views->addWidget( dayView, DAY ); 519 views->addWidget( dayView, DAY );
541 dayView->setStartViewTime( startTime ); 520 dayView->setStartViewTime( startTime );
542 dayView->setJumpToCurTime( bJumpToCurTime ); 521 dayView->setJumpToCurTime( bJumpToCurTime );
543 dayView->setRowStyle( rowStyle ); 522 dayView->setRowStyle( rowStyle );
544 connect( this, SIGNAL( newEvent() ), 523 connect( this, SIGNAL( newEvent() ),
545 dayView, SLOT( redraw() ) ); 524 dayView, SLOT( redraw() ) );
546 connect( dayView, SIGNAL( newEvent() ), 525 connect( dayView, SIGNAL( newEvent() ),
547 this, SLOT( fileNew() ) ); 526 this, SLOT( fileNew() ) );
548 connect( dayView, SIGNAL( removeEvent( const Event & ) ), 527 connect( dayView, SIGNAL( removeEvent( const Event & ) ),
549 this, SLOT( removeEvent( const Event & ) ) ); 528 this, SLOT( removeEvent( const Event & ) ) );
550 connect( dayView, SIGNAL( editEvent( const Event & ) ), 529 connect( dayView, SIGNAL( editEvent( const Event & ) ),
551 this, SLOT( editEvent( const Event & ) ) ); 530 this, SLOT( editEvent( const Event & ) ) );
552 connect( dayView, SIGNAL( duplicateEvent( const Event & ) ), 531 connect( dayView, SIGNAL( duplicateEvent( const Event & ) ),
553 this, SLOT( duplicateEvent( const Event & ) ) ); 532 this, SLOT( duplicateEvent( const Event & ) ) );
554 connect( dayView, SIGNAL( beamEvent( const Event & ) ), 533 connect( dayView, SIGNAL( beamEvent( const Event & ) ),
555 this, SLOT( beamEvent( const Event & ) ) ); 534 this, SLOT( beamEvent( const Event & ) ) );
556 connect( dayView, SIGNAL(sigNewEvent(const QString &)), 535 connect( dayView, SIGNAL(sigNewEvent(const QString &)),
557 this, SLOT(slotNewEventFromKey(const QString &)) ); 536 this, SLOT(slotNewEventFromKey(const QString &)) );
558 } 537 }
559} 538}
560 539
561void DateBook::initWeek() 540void DateBook::initWeek()
562{ 541{
563 if ( !weekView ) { 542 if ( !weekView ) {
564 weekView = new DateBookWeek( ampm, onMonday, db, views, "week view" ); 543 weekView = new DateBookWeek( ampm, onMonday, db, views, "week view" );
565 weekView->setStartViewTime( startTime ); 544 weekView->setStartViewTime( startTime );
566 views->addWidget( weekView, WEEK ); 545 views->addWidget( weekView, WEEK );
567 connect( weekView, SIGNAL( showDate( int, int, int ) ), 546 connect( weekView, SIGNAL( showDate( int, int, int ) ),
568 this, SLOT( showDay( int, int, int ) ) ); 547 this, SLOT( showDay( int, int, int ) ) );
569 connect( this, SIGNAL( newEvent() ), 548 connect( this, SIGNAL( newEvent() ),
570 weekView, SLOT( redraw() ) ); 549 weekView, SLOT( redraw() ) );
571 } 550 }
572 //But also get it right: the year that we display can be different 551 //But also get it right: the year that we display can be different
573 //from the year of the current date. So, first find the year 552 //from the year of the current date. So, first find the year
574 //number of the current week. 553 //number of the current week.
575 554
576 int yearNumber, totWeeks; 555 int yearNumber, totWeeks;
577 calcWeek( currentDate(), totWeeks, yearNumber, onMonday ); 556 calcWeek( currentDate(), totWeeks, yearNumber, onMonday );
578 557
579 QDate d = QDate( yearNumber, 12, 31 ); 558 QDate d = QDate( yearNumber, 12, 31 );
580 calcWeek( d, totWeeks, yearNumber, onMonday ); 559 calcWeek( d, totWeeks, yearNumber, onMonday );
581 560
582 while ( totWeeks == 1 ) { 561 while ( totWeeks == 1 ) {
583 d = d.addDays( -1 ); 562 d = d.addDays( -1 );
584 calcWeek( d, totWeeks, yearNumber, onMonday ); 563 calcWeek( d, totWeeks, yearNumber, onMonday );
585 } 564 }
586 if ( totWeeks != weekView->totalWeeks() ) 565 if ( totWeeks != weekView->totalWeeks() )
587 weekView->setTotalWeeks( totWeeks ); 566 weekView->setTotalWeeks( totWeeks );
588} 567}
589void DateBook::initWeekLst() { 568void DateBook::initWeekLst() {
590 if ( !weekLstView ) { 569 if ( !weekLstView ) {
591 weekLstView = new DateBookWeekLst( ampm, onMonday, db, 570 weekLstView = new DateBookWeekLst( ampm, onMonday, db,
592 views, "weeklst view" ); 571 views, "weeklst view" );
593 views->addWidget( weekLstView, WEEKLST ); 572 views->addWidget( weekLstView, WEEKLST );
594 573
595 //weekLstView->setStartViewTime( startTime ); 574 //weekLstView->setStartViewTime( startTime );
596 connect( weekLstView, SIGNAL( showDate( int, int, int ) ), 575 connect( weekLstView, SIGNAL( showDate( int, int, int ) ),
597 this, SLOT( showDay( int, int, int ) ) ); 576 this, SLOT( showDay( int, int, int ) ) );
598 connect( weekLstView, SIGNAL( addEvent( const QDateTime &, 577 connect( weekLstView, SIGNAL( addEvent( const QDateTime &,
599 const QDateTime &, 578 const QDateTime &,
600 const QString & , const QString &) ), 579 const QString & , const QString &) ),
601 this, SLOT( slotNewEntry( const QDateTime &, 580 this, SLOT( slotNewEntry( const QDateTime &,
602 const QDateTime &, 581 const QDateTime &,
603 const QString & , const QString &) ) ); 582 const QString & , const QString &) ) );
604 connect( this, SIGNAL( newEvent() ), 583 connect( this, SIGNAL( newEvent() ),
605 weekLstView, SLOT( redraw() ) ); 584 weekLstView, SLOT( redraw() ) );
606 connect( weekLstView, SIGNAL( editEvent( const Event & ) ), 585 connect( weekLstView, SIGNAL( editEvent( const Event & ) ),
607 this, SLOT( editEvent( const Event & ) ) ); 586 this, SLOT( editEvent( const Event & ) ) );
608 } 587 }
609} 588}
610 589
611 590
612void DateBook::initMonth() 591void DateBook::initMonth()
613{ 592{
614 if ( !monthView ) { 593 if ( !monthView ) {
615 monthView = new DateBookMonth( views, "month view", FALSE, db ); 594 monthView = new DateBookMonth( views, "month view", FALSE, db );
616 views->addWidget( monthView, MONTH ); 595 views->addWidget( monthView, MONTH );
617 connect( monthView, SIGNAL( dateClicked( int, int, int ) ), 596 connect( monthView, SIGNAL( dateClicked( int, int, int ) ),
618 this, SLOT( showDay( int, int, int ) ) ); 597 this, SLOT( showDay( int, int, int ) ) );
619 connect( this, SIGNAL( newEvent() ), 598 connect( this, SIGNAL( newEvent() ),
620 monthView, SLOT( redraw() ) ); 599 monthView, SLOT( redraw() ) );
621 qApp->processEvents(); 600 qApp->processEvents();
622 } 601 }
623} 602}
624 603
625void DateBook::loadSettings() 604void DateBook::loadSettings()
626{ 605{
627 { 606 {
628 Config config( "qpe" ); 607 Config config( "qpe" );
629 config.setGroup("Time"); 608 config.setGroup("Time");
630 ampm = config.readBoolEntry( "AMPM", TRUE ); 609 ampm = config.readBoolEntry( "AMPM", TRUE );
631 onMonday = config.readBoolEntry( "MONDAY" ); 610 onMonday = config.readBoolEntry( "MONDAY" );
632 } 611 }
633 612
634 { 613 {
635 Config config("DateBook"); 614 Config config("DateBook");
636 config.setGroup("Main"); 615 config.setGroup("Main");
637 startTime = config.readNumEntry("startviewtime", 8); 616 startTime = config.readNumEntry("startviewtime", 8);
638 aPreset = config.readBoolEntry("alarmpreset"); 617 aPreset = config.readBoolEntry("alarmpreset");
639 presetTime = config.readNumEntry("presettime"); 618 presetTime = config.readNumEntry("presettime");
640 bJumpToCurTime = config.readBoolEntry("jumptocurtime"); 619 bJumpToCurTime = config.readBoolEntry("jumptocurtime");
641 rowStyle = config.readNumEntry("rowstyle"); 620 rowStyle = config.readNumEntry("rowstyle");
642 } 621 }
643} 622}
644 623
645void DateBook::saveSettings() 624void DateBook::saveSettings()
646{ 625{
647 Config config( "qpe" ); 626 Config config( "qpe" );
648 Config configDB( "DateBook" ); 627 Config configDB( "DateBook" );
649 configDB.setGroup( "Main" ); 628 configDB.setGroup( "Main" );
650 configDB.writeEntry("startviewtime",startTime); 629 configDB.writeEntry("startviewtime",startTime);
651 configDB.writeEntry("alarmpreset",aPreset); 630 configDB.writeEntry("alarmpreset",aPreset);
652 configDB.writeEntry("presettime",presetTime); 631 configDB.writeEntry("presettime",presetTime);
653 configDB.writeEntry("jumptocurtime", bJumpToCurTime); 632 configDB.writeEntry("jumptocurtime", bJumpToCurTime);
654 configDB.writeEntry("rowstyle", rowStyle); 633 configDB.writeEntry("rowstyle", rowStyle);
655} 634}
656 635
657void DateBook::newDefaultView(QAction *a) { 636void DateBook::newDefaultView(QAction *a) {
658 int val=DAY; 637 int val=DAY;
659 if (a->text() == "Day") val=DAY; 638 if (a->text() == "Day") val=DAY;
660 if (a->text() == "Week") val=WEEK; 639 if (a->text() == "Week") val=WEEK;
661 if (a->text() == "WeekLst") val=WEEKLST; 640 if (a->text() == "WeekLst") val=WEEKLST;
662 if (a->text() == "Month") val=MONTH; 641 if (a->text() == "Month") val=MONTH;
663 642
664 Config configDB( "DateBook" ); 643 Config configDB( "DateBook" );
665 configDB.setGroup( "Main" ); 644 configDB.setGroup( "Main" );
666 configDB.writeEntry("defaultview",val); 645 configDB.writeEntry("defaultview",val);
667} 646}
668 647
669void DateBook::appMessage(const QCString& msg, const QByteArray& data) 648void DateBook::appMessage(const QCString& msg, const QByteArray& data)
670{ 649{
671 bool needShow = FALSE; 650 bool needShow = FALSE;
672 if ( msg == "alarm(QDateTime,int)" ) { 651 if ( msg == "alarm(QDateTime,int)" ) {
673 QDataStream ds(data,IO_ReadOnly); 652 QDataStream ds(data,IO_ReadOnly);
674 QDateTime when; int warn; 653 QDateTime when; int warn;
675 ds >> when >> warn; 654 ds >> when >> warn;
676 655
677 // check to make it's okay to continue, 656 // check to make it's okay to continue,
678 // this is the case that the time was set ahead, and 657 // this is the case that the time was set ahead, and
679 // we are forced given a stale alarm... 658 // we are forced given a stale alarm...
680 QDateTime current = QDateTime::currentDateTime(); 659 QDateTime current = QDateTime::currentDateTime();
681 if ( current.time().hour() != when.time().hour() 660 if ( current.time().hour() != when.time().hour()
682 && current.time().minute() != when.time().minute() ) 661 && current.time().minute() != when.time().minute() )
683 return; 662 return;
684 663
685 QValueList<EffectiveEvent> list = db->getEffectiveEvents(when.addSecs(warn*60)); 664 QValueList<EffectiveEvent> list = db->getEffectiveEvents(when.addSecs(warn*60));
686 if ( list.count() > 0 ) { 665 if ( list.count() > 0 ) {
687 QString msg; 666 QString msg;
688 bool bSound = FALSE; 667 bool bSound = FALSE;
689 int stopTimer = 0; 668 int stopTimer = 0;
690 bool found = FALSE; 669 bool found = FALSE;
691 for ( QValueList<EffectiveEvent>::ConstIterator it=list.begin(); 670 for ( QValueList<EffectiveEvent>::ConstIterator it=list.begin();
692 it!=list.end(); ++it ) { 671 it!=list.end(); ++it ) {
693 if ( (*it).event().hasAlarm() ) { 672 if ( (*it).event().hasAlarm() ) {
694 found = TRUE; 673 found = TRUE;
695 msg += "<CENTER><B>" + (*it).description() + "</B>" 674 msg += "<CENTER><B>" + (*it).description() + "</B>"
696 + "<BR>" + (*it).location() + "<BR>" 675 + "<BR>" + (*it).location() + "<BR>"
697 + TimeString::dateString((*it).event().start(),ampm) 676 + TimeString::dateString((*it).event().start(),ampm)
698 + (warn 677 + (warn
699 ? tr(" (in " + QString::number(warn) 678 ? tr(" (in " + QString::number(warn)
700 + tr(" minutes)")) 679 + tr(" minutes)"))
701 : QString("")) 680 : QString(""))
702 + "<BR>" 681 + "<BR>"
703 + (*it).notes() + "</CENTER>"; 682 + (*it).notes() + "</CENTER>";
704 if ( (*it).event().alarmSound() != Event::Silent ) { 683 if ( (*it).event().alarmSound() != Event::Silent ) {
705 bSound = TRUE; 684 bSound = TRUE;
706 } 685 }
707 } 686 }
708 } 687 }
709 if ( found ) { 688 if ( found ) {
710 if ( bSound ) { 689 if ( bSound ) {
711 Sound::soundAlarm(); 690 Sound::soundAlarm();
712 alarmCounter = 0; 691 alarmCounter = 0;
713 stopTimer = startTimer( 5000 ); 692 stopTimer = startTimer( 5000 );
714 } 693 }
715 694
716 QDialog dlg( this, 0, TRUE ); 695 QDialog dlg( this, 0, TRUE );
717 QVBoxLayout *vb = new QVBoxLayout( &dlg ); 696 QVBoxLayout *vb = new QVBoxLayout( &dlg );
718 QScrollView *view = new QScrollView( &dlg, "scrollView"); 697 QScrollView *view = new QScrollView( &dlg, "scrollView");
719 view->setResizePolicy( QScrollView::AutoOneFit ); 698 view->setResizePolicy( QScrollView::AutoOneFit );
720 vb->addWidget( view ); 699 vb->addWidget( view );
721 QLabel *lblMsg = new QLabel( msg, &dlg ); 700 QLabel *lblMsg = new QLabel( msg, &dlg );
722 view->addChild( lblMsg ); 701 view->addChild( lblMsg );
723 QPushButton *cmdOk = new QPushButton( tr("OK"), &dlg ); 702 QPushButton *cmdOk = new QPushButton( tr("OK"), &dlg );
724 connect( cmdOk, SIGNAL(clicked()), &dlg, SLOT(accept()) ); 703 connect( cmdOk, SIGNAL(clicked()), &dlg, SLOT(accept()) );
725 vb->addWidget( cmdOk ); 704 vb->addWidget( cmdOk );
726 705
727#if defined(Q_WS_QWS) || defined(_WS_QWS_) 706#if defined(Q_WS_QWS) || defined(_WS_QWS_)
728 dlg.showMaximized(); 707 dlg.showMaximized();
729#endif 708#endif
730 needShow = dlg.exec(); 709 needShow = dlg.exec();
731 710
732 if ( bSound ) 711 if ( bSound )
733 killTimer( stopTimer ); 712 killTimer( stopTimer );
734 } 713 }
735 } 714 }
736 } else if ( msg == "nextView()" ) { 715 } else if ( msg == "nextView()" ) {
737 if ( !qApp-> activeWindow ( )) { 716 if ( !qApp-> activeWindow ( )) {
738 needShow = TRUE; 717 needShow = TRUE;
739 } 718 }
740 else { 719 else {
741 QWidget* cur = views->visibleWidget(); 720 QWidget* cur = views->visibleWidget();
742 if ( cur ) { 721 if ( cur ) {
743 if ( cur == dayView ) 722 if ( cur == dayView )
744 viewWeek(); 723 viewWeek();
745 else if ( cur == weekView ) 724 else if ( cur == weekView )
746 viewWeekLst(); 725 viewWeekLst();
747 else if ( cur == weekLstView ) 726 else if ( cur == weekLstView )
748 viewMonth(); 727 viewMonth();
749 else if ( cur == monthView ) 728 else if ( cur == monthView )
750 viewDay(); 729 viewDay();
751 needShow = TRUE; 730 needShow = TRUE;
752 } 731 }
753 } 732 }
754 } 733 }
755 if ( needShow ) { 734 if ( needShow ) {
756#if defined(Q_WS_QWS) || defined(_WS_QWS_) 735#if defined(Q_WS_QWS) || defined(_WS_QWS_)
757 showMaximized(); 736 showMaximized();
758#else 737#else
759 show(); 738 show();
760#endif 739#endif
761 raise(); 740 raise();
762 QPEApplication::setKeepRunning(); 741 QPEApplication::setKeepRunning();
763 setActiveWindow(); 742 setActiveWindow();
764 } 743 }
765} 744}
766 745
767void DateBook::reload() 746void DateBook::reload()
768{ 747{
769 db->reload(); 748 db->reload();
770 if ( dayAction->isOn() ) 749 if ( dayAction->isOn() )
771 viewDay(); 750 viewDay();
772 else if ( weekAction->isOn() ) 751 else if ( weekAction->isOn() )
773 viewWeek(); 752 viewWeek();
774 else if ( monthAction->isOn() ) 753 else if ( monthAction->isOn() )
775 viewMonth(); 754 viewMonth();
776 syncing = FALSE; 755 syncing = FALSE;
777} 756}
778 757
779void DateBook::flush() 758void DateBook::flush()
780{ 759{
781 syncing = TRUE; 760 syncing = TRUE;
782 db->save(); 761 db->save();
783} 762}
784 763
785void DateBook::timerEvent( QTimerEvent *e ) 764void DateBook::timerEvent( QTimerEvent *e )
786{ 765{
787 if ( alarmCounter < 10 ) { 766 if ( alarmCounter < 10 ) {
788 alarmCounter++; 767 alarmCounter++;
789 Sound::soundAlarm(); 768 Sound::soundAlarm();
790 } 769 }
791 else 770 else
792 killTimer( e->timerId() ); 771 killTimer( e->timerId() );
793} 772}
794 773
795void DateBook::changeClock( bool newClock ) 774void DateBook::changeClock( bool newClock )
796{ 775{
797 ampm = newClock; 776 ampm = newClock;
798 // repaint the affected objects... 777 // repaint the affected objects...
799 if (dayView) dayView->redraw(); 778 if (dayView) dayView->redraw();
800 if (weekView) weekView->redraw(); 779 if (weekView) weekView->redraw();
801 if (weekLstView) weekLstView->redraw(); 780 if (weekLstView) weekLstView->redraw();
802} 781}
803 782
804void DateBook::changeWeek( bool m ) 783void DateBook::changeWeek( bool m )
805{ 784{
806 /* no need to redraw, each widget catches. Do need to 785 /* no need to redraw, each widget catches. Do need to
807 store though for widgets we haven't made yet */ 786 store though for widgets we haven't made yet */
808 onMonday = m; 787 onMonday = m;
809} 788}
810 789
811void DateBook::slotToday() 790void DateBook::slotToday()
812{ 791{
813 // we need to view today using default view 792 // we need to view today using default view
814 viewDefault(QDate::currentDate()); 793 viewDefault(QDate::currentDate());
815} 794}
816 795
817void DateBook::closeEvent( QCloseEvent *e ) 796void DateBook::closeEvent( QCloseEvent *e )
818{ 797{
819 if(syncing) { 798 if(syncing) {
820 /* no need to save, did that at flush */ 799 /* no need to save, did that at flush */
821 e->accept(); 800 e->accept();
822 return; 801 return;
823 } 802 }
824 803
825 // save settings will generate it's own error messages, no 804 // save settings will generate it's own error messages, no
826 // need to do checking ourselves. 805 // need to do checking ourselves.
827 saveSettings(); 806 saveSettings();
828 if ( db->save() ) 807 if ( db->save() )
829 e->accept(); 808 e->accept();
830 else { 809 else {
831 if ( QMessageBox::critical( this, tr( "Out of space" ), 810 if ( QMessageBox::critical( this, tr( "Out of space" ),
832 tr("Calendar was unable to save\n" 811 tr("Calendar was unable to save\n"
833 "your changes.\n" 812 "your changes.\n"
834 "Free up some space and try again.\n" 813 "Free up some space and try again.\n"
835 "\nQuit anyway?"), 814 "\nQuit anyway?"),
836 QMessageBox::Yes|QMessageBox::Escape, 815 QMessageBox::Yes|QMessageBox::Escape,
837 QMessageBox::No|QMessageBox::Default ) 816 QMessageBox::No|QMessageBox::Default )
838 != QMessageBox::No ) 817 != QMessageBox::No )
839 e->accept(); 818 e->accept();
840 else 819 else
841 e->ignore(); 820 e->ignore();
842 } 821 }
843} 822}
844 823
845// Entering directly from the "keyboard" 824// Entering directly from the "keyboard"
846void DateBook::slotNewEventFromKey( const QString &str ) 825void DateBook::slotNewEventFromKey( const QString &str )
847{ 826{
848 if (syncing) { 827 if (syncing) {
849 QMessageBox::warning( this, tr("Calendar"), 828 QMessageBox::warning( this, tr("Calendar"),
850 tr( "Can not edit data, currently syncing") ); 829 tr( "Can not edit data, currently syncing") );
851 return; 830 return;
852 } 831 }
853 832
854 // We get to here from a key pressed in the Day View 833 // We get to here from a key pressed in the Day View
855 // So we can assume some things. We want the string 834 // So we can assume some things. We want the string
856 // passed in to be part of the description. 835 // passed in to be part of the description.
857 QDateTime start, end; 836 QDateTime start, end;
858 if ( views->visibleWidget() == dayView ) { 837 if ( views->visibleWidget() == dayView ) {
859 dayView->selectedDates( start, end ); 838 dayView->selectedDates( start, end );
860 } else if ( views->visibleWidget() == monthView ) { 839 } else if ( views->visibleWidget() == monthView ) {
861 QDate d = monthView->selectedDate(); 840 QDate d = monthView->selectedDate();
862 start = end = d; 841 start = end = d;
863 start.setTime( QTime( 10, 0 ) ); 842 start.setTime( QTime( 10, 0 ) );
864 end.setTime( QTime( 12, 0 ) ); 843 end.setTime( QTime( 12, 0 ) );
865 } else if ( views->visibleWidget() == weekView ) { 844 } else if ( views->visibleWidget() == weekView ) {
866 QDate d = weekView->date(); 845 QDate d = weekView->date();
867 start = end = d; 846 start = end = d;
868 start.setTime( QTime( 10, 0 ) ); 847 start.setTime( QTime( 10, 0 ) );
869 end.setTime( QTime( 12, 0 ) ); 848 end.setTime( QTime( 12, 0 ) );
870 } else if ( views->visibleWidget() == weekLstView ) { 849 } else if ( views->visibleWidget() == weekLstView ) {
871 QDate d = weekLstView->date(); 850 QDate d = weekLstView->date();
872 start = end = d; 851 start = end = d;
873 start.setTime( QTime( 10, 0 ) ); 852 start.setTime( QTime( 10, 0 ) );
874 end.setTime( QTime( 12, 0 ) ); 853 end.setTime( QTime( 12, 0 ) );
875 } 854 }
876 slotNewEntry(start, end, str); 855 slotNewEntry(start, end, str);
877} 856}
878void DateBook::slotNewEntry(const QDateTime &start, const QDateTime &end, const QString &str, const QString &location) { 857void DateBook::slotNewEntry(const QDateTime &start, const QDateTime &end, const QString &str, const QString &location) {
879 // argh! This really needs to be encapsulated in a class 858 // argh! This really needs to be encapsulated in a class
880 // or function. 859 // or function.
881 QDialog newDlg( this, 0, TRUE ); 860 QDialog newDlg( this, 0, TRUE );
882 newDlg.setCaption( DateEntryBase::tr("New Event") ); 861 newDlg.setCaption( DateEntryBase::tr("New Event") );
883 DateEntry *e; 862 DateEntry *e;
884 QVBoxLayout *vb = new QVBoxLayout( &newDlg ); 863 QVBoxLayout *vb = new QVBoxLayout( &newDlg );
885 QScrollView *sv = new QScrollView( &newDlg ); 864 QScrollView *sv = new QScrollView( &newDlg );
886 sv->setResizePolicy( QScrollView::AutoOneFit ); 865 sv->setResizePolicy( QScrollView::AutoOneFit );
887 sv->setFrameStyle( QFrame::NoFrame ); 866 sv->setFrameStyle( QFrame::NoFrame );
888 sv->setHScrollBarMode( QScrollView::AlwaysOff ); 867 sv->setHScrollBarMode( QScrollView::AlwaysOff );
889 vb->addWidget( sv ); 868 vb->addWidget( sv );
890 869
891 Event ev; 870 Event ev;
892 ev.setDescription( str ); 871 ev.setDescription( str );
893 // When the new gui comes in, change this... 872 // When the new gui comes in, change this...
894 if(location==0) { 873 if(location==0) {
895 ev.setLocation( tr("(Unknown)") ); 874 ev.setLocation( tr("(Unknown)") );
896 } else { 875 } else {
897 ev.setLocation(location); 876 ev.setLocation(location);
898 } 877 }
899 ev.setStart( start ); 878 ev.setStart( start );
900 ev.setEnd( end ); 879 ev.setEnd( end );
901 880
902 e = new DateEntry( onMonday, ev, ampm, &newDlg ); 881 e = new DateEntry( onMonday, ev, ampm, &newDlg );
903 e->setAlarmEnabled( aPreset, presetTime, Event::Loud ); 882 e->setAlarmEnabled( aPreset, presetTime, Event::Loud );
904 sv->addChild( e ); 883 sv->addChild( e );
905#if defined(Q_WS_QWS) || defined(_WS_QWS_) 884#if defined(Q_WS_QWS) || defined(_WS_QWS_)
906 newDlg.showMaximized(); 885 newDlg.showMaximized();
907#endif 886#endif
908 while (newDlg.exec()) { 887 while (newDlg.exec()) {
909 ev = e->event(); 888 ev = e->event();
910 ev.assignUid(); 889 ev.assignUid();
911 QString error = checkEvent( ev ); 890 QString error = checkEvent( ev );
912 if ( !error.isNull() ) { 891 if ( !error.isNull() ) {
913 if ( QMessageBox::warning( this, tr("Error!"), 892 if ( QMessageBox::warning( this, tr("Error!"),
914 error, tr("Fix it"), tr("Continue"), 0, 0, 1 ) == 0 ) 893 error, tr("Fix it"), tr("Continue"), 0, 0, 1 ) == 0 )
915 continue; 894 continue;
916 } 895 }
917 db->addEvent( ev ); 896 db->addEvent( ev );
918 emit newEvent(); 897 emit newEvent();
919 break; 898 break;
920 } 899 }
921} 900}
922 901
923void DateBook::setDocument( const QString &filename ) 902void DateBook::setDocument( const QString &filename )
924{ 903{
925 if ( filename.find(".vcs") != int(filename.length()) - 4 ) return; 904 if ( filename.find(".vcs") != int(filename.length()) - 4 ) return;
926 905
927 QValueList<Event> tl = Event::readVCalendar( filename ); 906 QValueList<Event> tl = Event::readVCalendar( filename );
928 for( QValueList<Event>::Iterator it = tl.begin(); it != tl.end(); ++it ) { 907 for( QValueList<Event>::Iterator it = tl.begin(); it != tl.end(); ++it ) {
929 db->addEvent( *it ); 908 db->addEvent( *it );
930 } 909 }
931} 910}
932 911
933static const char * beamfile = "/tmp/obex/event.vcs"; 912static const char * beamfile = "/tmp/obex/event.vcs";
934 913
935void DateBook::beamEvent( const Event &e ) 914void DateBook::beamEvent( const Event &e )
936{ 915{
937 qDebug("trying to beamn"); 916 qDebug("trying to beamn");
938 unlink( beamfile ); // delete if exists 917 unlink( beamfile ); // delete if exists
939 mkdir("/tmp/obex/", 0755); 918 mkdir("/tmp/obex/", 0755);
940 Event::writeVCalendar( beamfile, e ); 919 Event::writeVCalendar( beamfile, e );
941 Ir *ir = new Ir( this ); 920 Ir *ir = new Ir( this );
942 connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) ); 921 connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) );
943 QString description = e.description(); 922 QString description = e.description();
944 ir->send( beamfile, description, "text/x-vCalendar" ); 923 ir->send( beamfile, description, "text/x-vCalendar" );
945} 924}
946 925
947void DateBook::beamDone( Ir *ir ) 926void DateBook::beamDone( Ir *ir )
948{ 927{
949 delete ir; 928 delete ir;
950 unlink( beamfile ); 929 unlink( beamfile );
951} 930}
952 931
953void DateBook::slotFind() 932void DateBook::slotFind()
954{ 933{
955 // move it to the day view... 934 // move it to the day view...
956 viewDay(); 935 viewDay();
957 FindDialog frmFind( "Calendar", this ); 936 FindDialog frmFind( "Calendar", this );
958 frmFind.setUseDate( true ); 937 frmFind.setUseDate( true );
959 frmFind.setDate( currentDate() ); 938 frmFind.setDate( currentDate() );
960 QObject::connect( &frmFind, 939 QObject::connect( &frmFind,
961 SIGNAL(signalFindClicked(const QString&, const QDate&, 940 SIGNAL(signalFindClicked(const QString&, const QDate&,
962 bool, bool, int)), 941 bool, bool, int)),
963 this, 942 this,
964 SLOT(slotDoFind(const QString&, const QDate&, 943 SLOT(slotDoFind(const QString&, const QDate&,
965 bool, bool, int)) ); 944 bool, bool, int)) );
966 QObject::connect( this, 945 QObject::connect( this,
967 SIGNAL(signalNotFound()), 946 SIGNAL(signalNotFound()),
968 &frmFind, 947 &frmFind,
969 SLOT(slotNotFound()) ); 948 SLOT(slotNotFound()) );
970 QObject::connect( this, 949 QObject::connect( this,
971 SIGNAL(signalWrapAround()), 950 SIGNAL(signalWrapAround()),
972 &frmFind, 951 &frmFind,
973 SLOT(slotWrapAround()) ); 952 SLOT(slotWrapAround()) );
974 frmFind.move(0,0); 953 frmFind.move(0,0);
975 frmFind.exec(); 954 frmFind.exec();
976 inSearch = false; 955 inSearch = false;
977} 956}
978 957
979bool catComp( QArray<int> cats, int category ) 958bool catComp( QArray<int> cats, int category )
980{ 959{
981 bool returnMe; 960 bool returnMe;
982 int i, 961 int i,
983 count; 962 count;
984 963
985 count = int(cats.count()); 964 count = int(cats.count());
986 returnMe = false; 965 returnMe = false;
987 if ( (category == -1 && count == 0) || category == -2 ) 966 if ( (category == -1 && count == 0) || category == -2 )
988 returnMe = true; 967 returnMe = true;
989 else { 968 else {
990 for ( i = 0; i < count; i++ ) { 969 for ( i = 0; i < count; i++ ) {
991 if ( category == cats[i] ) { 970 if ( category == cats[i] ) {
992 returnMe = true; 971 returnMe = true;
993 break; 972 break;
994 } 973 }
995 } 974 }
996 } 975 }
997 return returnMe; 976 return returnMe;
998} 977}
999 978
1000 979
1001void DateBook::slotDoFind( const QString& txt, const QDate &dt, 980void DateBook::slotDoFind( const QString& txt, const QDate &dt,
1002 bool caseSensitive, bool /*backwards*/, 981 bool caseSensitive, bool /*backwards*/,
1003 int category ) 982 int category )
1004{ 983{
1005 QDateTime dtEnd( QDate(3001, 1, 1), QTime(0, 0, 0) ), 984 QDateTime dtEnd( QDate(3001, 1, 1), QTime(0, 0, 0) ),
1006 next; 985 next;
1007 986
1008 QRegExp r( txt ); 987 QRegExp r( txt );
1009 r.setCaseSensitive( caseSensitive ); 988 r.setCaseSensitive( caseSensitive );
1010 989
1011 990
1012 static Event rev, 991 static Event rev,
1013 nonrev; 992 nonrev;
1014 if ( !inSearch ) { 993 if ( !inSearch ) {
1015 rev.setStart( QDateTime(QDate(1960, 1, 1), QTime(0, 0, 0)) ); 994 rev.setStart( QDateTime(QDate(1960, 1, 1), QTime(0, 0, 0)) );
1016 nonrev.setStart( rev.start() ); 995 nonrev.setStart( rev.start() );
1017 inSearch = true; 996 inSearch = true;
1018 } 997 }
1019 static QDate searchDate = dt; 998 static QDate searchDate = dt;
1020 static bool wrapAround = true; 999 static bool wrapAround = true;
1021 bool candidtate; 1000 bool candidtate;
1022 candidtate = false; 1001 candidtate = false;
1023 1002