summaryrefslogtreecommitdiff
path: root/examples/simple-pim
Unidiff
Diffstat (limited to 'examples/simple-pim') (more/less context) (ignore whitespace changes)
-rw-r--r--examples/simple-pim/config.in2
-rw-r--r--examples/simple-pim/example.pro2
-rw-r--r--examples/simple-pim/simple.cpp38
3 files changed, 26 insertions, 16 deletions
diff --git a/examples/simple-pim/config.in b/examples/simple-pim/config.in
index aa1a426..9e6adc9 100644
--- a/examples/simple-pim/config.in
+++ b/examples/simple-pim/config.in
@@ -1,4 +1,4 @@
1 config SIMPLE_PIM_EXAMPLE 1 config SIMPLE_PIM_EXAMPLE
2 boolean "Mainwindow with PIM and QCOP usage" 2 boolean "Mainwindow with PIM and QCOP usage"
3 default "y" 3 default "y"
4 depends ( LIBQPE || LIBQPE-X11 ) && EXAMPLES && LIBOPIEPIM2 4 depends ( LIBQPE || LIBQPE-X11 ) && EXAMPLES && LIBOPIE2CORE && LIBOPIE2PIM
diff --git a/examples/simple-pim/example.pro b/examples/simple-pim/example.pro
index ebcdb2b..b8b2c69 100644
--- a/examples/simple-pim/example.pro
+++ b/examples/simple-pim/example.pro
@@ -1,17 +1,17 @@
1CONFIG += qt warn_on quick-app 1CONFIG += qt warn_on quick-app
2 2
3 3
4TARGET = simple-pim 4TARGET = simple-pim
5 5
6HEADERS = simple.h 6HEADERS = simple.h
7SOURCES = simple.cpp 7SOURCES = simple.cpp
8 8
9 9
10INCLUDEPATH += $(OPIEDIR)/include 10INCLUDEPATH += $(OPIEDIR)/include
11DEPENDPATH += $(OPIEDIR)/include 11DEPENDPATH += $(OPIEDIR)/include
12 12
13 13
14# we now also include opie 14# we now also include opie
15LIBS += -lqpe -lopiepim2 -lopieui2 15LIBS += -lqpe -lopiecore2 -lopiepim2 -lopieui2
16 16
17include ( $(OPIEDIR)/include.pro ) 17include ( $(OPIEDIR)/include.pro )
diff --git a/examples/simple-pim/simple.cpp b/examples/simple-pim/simple.cpp
index 50905bf..efd5070 100644
--- a/examples/simple-pim/simple.cpp
+++ b/examples/simple-pim/simple.cpp
@@ -1,446 +1,456 @@
1/* We use a sane order of include files, from the most special to the least special
2 That helps to reduce the number of implicit includes hence increases the reuse */
3
4/* First the local include files */
5#include "simple.h"
6
7/* Then the Ope include files.
8This includes qpe stuff which will eventually be merged with libopie2 */
9#include <opie2/odebug.h> // for odebug streams
10#include <opie2/oapplicationfactory.h> // a template + macro to save the main method and allow quick launching
11#include <opie2/otabwidget.h>
12#include <opie2/owait.h>
13#include <qpe/qpeapplication.h> // the QPEApplication
14#include <qpe/resource.h>
15#include <qpe/sound.h>
16#include <qpe/qcopenvelope_qws.h>
17#include <qpe/datebookmonth.h>
18#include <qpe/timestring.h>
19using namespace Opie::Core;
20
21/* Now the Qt includes */
1#include <qaction.h> // action 22#include <qaction.h> // action
2#include <qmenubar.h> // menubar 23#include <qmenubar.h> // menubar
3#include <qtoolbar.h> // toolbar 24#include <qtoolbar.h> // toolbar
4#include <qlabel.h> // a label 25#include <qlabel.h> // a label
5#include <qpushbutton.h> // the header file for the QPushButton 26#include <qpushbutton.h> // the header file for the QPushButton
6#include <qlayout.h> 27#include <qlayout.h>
7#include <qtimer.h> // we use it for the singleShot 28#include <qtimer.h> // we use it for the singleShot
8#include <qdatetime.h> // for QDate 29#include <qdatetime.h> // for QDate
9#include <qtextview.h> // a rich text widget 30#include <qtextview.h> // a rich text widget
10#include <qdialog.h> 31#include <qdialog.h>
11#include <qwhatsthis.h> // for whats this 32#include <qwhatsthis.h> // for whats this
12 33
13#include <qpe/qpeapplication.h> // the QPEApplication 34/* Add standard includes here if you need some
14#include <qpe/resource.h> 35 Examples are: stdlib.h, socket.h, etc. */
15#include <qpe/sound.h>
16#include <qpe/qcopenvelope_qws.h>
17#include <qpe/datebookmonth.h>
18#include <qpe/timestring.h>
19
20#include <opie2/oapplicationfactory.h> // a template + macro to save the main method and allow quick launching
21#include <opie2/otabwidget.h>
22#include <opie2/owait.h>
23
24#include "simple.h"
25 36
26/* 37/*
27 * implementation of simple 38 * implementation of simple
28 */ 39 */
29 40
30/* 41/*
31 * The factory is used for quicklaunching 42 * The factory is used for quicklaunching
32 * It needs a constructor ( c'tor ) with at least QWidget, const char* and WFlags as parameter and a static QString appName() matching the TARGET of the .pro 43 * It needs a constructor ( c'tor ) with at least QWidget, const char* and WFlags as parameter and a static QString appName() matching the TARGET of the .pro
33 * 44 *
34 * Depending on the global quick launch setting this will create 45 * Depending on the global quick launch setting this will create
35 * either a main method or one for our component plugin system 46 * either a main method or one for our component plugin system
36 */ 47 */
37 48
38using namespace Opie::Core;
39OPIE_EXPORT_APP( OApplicationFactory<MainWindow> ) 49OPIE_EXPORT_APP( OApplicationFactory<MainWindow> )
40 50
41MainWindow::MainWindow(QWidget *parent, const char* name, WFlags fl ) 51MainWindow::MainWindow(QWidget *parent, const char* name, WFlags fl )
42 : QMainWindow( parent, name, fl ) { 52 : QMainWindow( parent, name, fl ) {
43 setCaption(tr("My MainWindow") ); 53 setCaption(tr("My MainWindow") );
44 54
45 m_desktopChannel = 0; 55 m_desktopChannel = 0;
46 m_loading = 0; 56 m_loading = 0;
47 57
48 initUI(); 58 initUI();
49 59
50 60
51 /* 61 /*
52 * Tab widget as central 62 * Tab widget as central
53 */ 63 */
54 m_tab = new Opie::Ui::OTabWidget(this); 64 m_tab = new Opie::Ui::OTabWidget(this);
55 65
56 setCentralWidget( m_tab ); 66 setCentralWidget( m_tab );
57 67
58 m_todoView = new PIMListView(m_tab, "Todo view" ); 68 m_todoView = new PIMListView(m_tab, "Todo view" );
59 m_tab->addTab( m_todoView,"todo/TodoList", tr("Todos") ); 69 m_tab->addTab( m_todoView,"todo/TodoList", tr("Todos") );
60 70
61 m_dateView = new PIMListView(m_tab, "Datebook view" ); 71 m_dateView = new PIMListView(m_tab, "Datebook view" );
62 m_tab->addTab( m_dateView, "datebook/DateBook", tr("Events") ); 72 m_tab->addTab( m_dateView, "datebook/DateBook", tr("Events") );
63 73
64 /* now connect the actions */ 74 /* now connect the actions */
65 /* 75 /*
66 * we connect the activated to our show 76 * we connect the activated to our show
67 * and on activation we will show a detailed 77 * and on activation we will show a detailed
68 * summary of the record 78 * summary of the record
69 */ 79 */
70 connect(m_fire, SIGNAL(activated() ), 80 connect(m_fire, SIGNAL(activated() ),
71 this, SLOT(slotShow() ) ); 81 this, SLOT(slotShow() ) );
72 82
73 /* 83 /*
74 * We will change the date 84 * We will change the date
75 */ 85 */
76 connect(m_dateAction, SIGNAL(activated() ), 86 connect(m_dateAction, SIGNAL(activated() ),
77 this, SLOT(slotDate() ) ); 87 this, SLOT(slotDate() ) );
78 88
79 /* 89 /*
80 * connect the show signal of the PIMListView 90 * connect the show signal of the PIMListView
81 * to a slot to show a dialog 91 * to a slot to show a dialog
82 */ 92 */
83 connect(m_todoView, SIGNAL(showRecord(const OPimRecord&) ), 93 connect(m_todoView, SIGNAL(showRecord(const OPimRecord&) ),
84 this, SLOT(slotShowRecord(const OPimRecord&) ) ); 94 this, SLOT(slotShowRecord(const OPimRecord&) ) );
85 connect(m_dateView, SIGNAL(showRecord(const OPimRecord&) ), 95 connect(m_dateView, SIGNAL(showRecord(const OPimRecord&) ),
86 this, SLOT(slotShowRecord(const OPimRecord&) ) ); 96 this, SLOT(slotShowRecord(const OPimRecord&) ) );
87 97
88 /* 98 /*
89 * Now comes the important lines of code for this example 99 * Now comes the important lines of code for this example
90 * We do not directly call load but delay loading until 100 * We do not directly call load but delay loading until
91 * all Events are dispatches and handled. 101 * all Events are dispatches and handled.
92 * SO we will load once our window is mapped to screen 102 * SO we will load once our window is mapped to screen
93 * to achieve that we use a QTimer::singleShot 103 * to achieve that we use a QTimer::singleShot
94 * After 10 milli seconds the timer fires and on TimerEvent 104 * After 10 milli seconds the timer fires and on TimerEvent
95 * out slot slotLoad will be called 105 * out slot slotLoad will be called
96 * Remember this a Constructor to construct your object and not 106 * Remember this a Constructor to construct your object and not
97 * to load 107 * to load
98 */ 108 */
99 QTimer::singleShot( 10, this, SLOT(slotLoad() ) ); 109 QTimer::singleShot( 10, this, SLOT(slotLoad() ) );
100} 110}
101 111
102MainWindow::~MainWindow() { 112MainWindow::~MainWindow() {
103 // again nothing to delete because Qt takes care 113 // again nothing to delete because Qt takes care
104} 114}
105 115
106 116
107void MainWindow::setDocument( const QString& /*str*/ ) { 117void MainWindow::setDocument( const QString& /*str*/ ) {
108} 118}
109 119
110 120
111void MainWindow::initUI() { 121void MainWindow::initUI() {
112 122
113 setToolBarsMovable( false ); 123 setToolBarsMovable( false );
114 124
115 QToolBar *menuBarHolder = new QToolBar( this ); 125 QToolBar *menuBarHolder = new QToolBar( this );
116 126
117 menuBarHolder->setHorizontalStretchable( true ); 127 menuBarHolder->setHorizontalStretchable( true );
118 QMenuBar *mb = new QMenuBar( menuBarHolder ); 128 QMenuBar *mb = new QMenuBar( menuBarHolder );
119 QToolBar *tb = new QToolBar( this ); 129 QToolBar *tb = new QToolBar( this );
120 130
121 QPopupMenu *fileMenu = new QPopupMenu( this ); 131 QPopupMenu *fileMenu = new QPopupMenu( this );
122 132
123 133
124 QAction *a = new QAction( tr("Quit"), Resource::loadIconSet("quit_icon"), 134 QAction *a = new QAction( tr("Quit"), Resource::loadIconSet("quit_icon"),
125 QString::null, 0, this, "quit_action" ); 135 QString::null, 0, this, "quit_action" );
126 /* 136 /*
127 * Connect quit to the QApplication quit slot 137 * Connect quit to the QApplication quit slot
128 */ 138 */
129 connect(a, SIGNAL(activated() ), 139 connect(a, SIGNAL(activated() ),
130 qApp, SLOT(quit() ) ); 140 qApp, SLOT(quit() ) );
131 a->addTo( fileMenu ); 141 a->addTo( fileMenu );
132 142
133 a = new QAction(tr("View Current"), 143 a = new QAction(tr("View Current"),
134 Resource::loadIconSet("zoom"), 144 Resource::loadIconSet("zoom"),
135 QString::null, 0, this, "view current"); 145 QString::null, 0, this, "view current");
136 /* a simple whats this online explanation of out button */ 146 /* a simple whats this online explanation of out button */
137 a->setWhatsThis(tr("Views the current record") ); 147 a->setWhatsThis(tr("Views the current record") );
138 /* or QWhatsThis::add(widget, "description" ); */ 148 /* or QWhatsThis::add(widget, "description" ); */
139 149
140 /* see the power? */ 150 /* see the power? */
141 a->addTo( fileMenu ); 151 a->addTo( fileMenu );
142 a->addTo( tb ); 152 a->addTo( tb );
143 m_fire = a; 153 m_fire = a;
144 154
145 a = new QAction(tr("Choose Date"), 155 a = new QAction(tr("Choose Date"),
146 Resource::loadIconSet("day"), 156 Resource::loadIconSet("day"),
147 QString::null, 0, this, "choose date" ); 157 QString::null, 0, this, "choose date" );
148 a->addTo( fileMenu ); 158 a->addTo( fileMenu );
149 a->addTo( tb ); 159 a->addTo( tb );
150 m_dateAction = a; 160 m_dateAction = a;
151 161
152 mb->insertItem(tr("File"), fileMenu ); 162 mb->insertItem(tr("File"), fileMenu );
153 163
154} 164}
155 165
156void MainWindow::slotLoad() { 166void MainWindow::slotLoad() {
157 /* 167 /*
158 * There is no real shared access in the PIM API 168 * There is no real shared access in the PIM API
159 * It wasn't finish cause of health problems of one 169 * It wasn't finish cause of health problems of one
160 * of the authors so we do something fancy and use QCOP 170 * of the authors so we do something fancy and use QCOP
161 * the IPC system to get a current copy 171 * the IPC system to get a current copy
162 */ 172 */
163 /* NOTES to QCOP: QCOP operates over channels and use QDataStream 173 /* NOTES to QCOP: QCOP operates over channels and use QDataStream
164 * to send data. You can check if a channel isRegistered or hook 174 * to send data. You can check if a channel isRegistered or hook
165 * yourself to that channel. A Channel is QCString and normally 175 * yourself to that channel. A Channel is QCString and normally
166 * prefix with QPE/ and then the system in example QPE/System, 176 * prefix with QPE/ and then the system in example QPE/System,
167 * QPE/Desktop a special channel is the application channel 177 * QPE/Desktop a special channel is the application channel
168 * it QPE/Application/appname this channel gets created on app 178 * it QPE/Application/appname this channel gets created on app
169 * startup by QPEApplication. QCOP is asynchronous 179 * startup by QPEApplication. QCOP is asynchronous
170 * 180 *
171 * To send you'll use QCopEnevelope 181 * To send you'll use QCopEnevelope
172 * 182 *
173 */ 183 */
174 /* 184 /*
175 * What we will do is first is get to know if either 185 * What we will do is first is get to know if either
176 * datebook or todolist are running if so we will kindly 186 * datebook or todolist are running if so we will kindly
177 * asked to save the data for us. 187 * asked to save the data for us.
178 * If neither are running we can load directly 188 * If neither are running we can load directly
179 */ 189 */
180 if (!QCopChannel::isRegistered("QPE/Application/todolist") && 190 if (!QCopChannel::isRegistered("QPE/Application/todolist") &&
181 !QCopChannel::isRegistered("QPE/Application/datebook") ) { 191 !QCopChannel::isRegistered("QPE/Application/datebook") ) {
182 m_db.load(); 192 m_db.load();
183 m_tb.load(); 193 m_tb.load();
184 return slotLoadForDay( QDate::currentDate() ); 194 return slotLoadForDay( QDate::currentDate() );
185 } 195 }
186 196
187 /* 197 /*
188 * prepare our answer machine the QCopChannel 198 * prepare our answer machine the QCopChannel
189 * QPE/Desktop will send "flushDone(QString)" when 199 * QPE/Desktop will send "flushDone(QString)" when
190 * the flush is done it emits a signal on receive 200 * the flush is done it emits a signal on receive
191 */ 201 */
192 m_desktopChannel = new QCopChannel("QPE/Desktop"); 202 m_desktopChannel = new QCopChannel("QPE/Desktop");
193 connect(m_desktopChannel, SIGNAL(received(const QCString&,const QByteArray&) ), 203 connect(m_desktopChannel, SIGNAL(received(const QCString&,const QByteArray&) ),
194 this, SLOT(slotDesktopReceive(const QCString&,const QByteArray&) ) ); 204 this, SLOT(slotDesktopReceive(const QCString&,const QByteArray&) ) );
195 /* the numberof synced channels will be set to zero */ 205 /* the numberof synced channels will be set to zero */
196 m_synced = 0; 206 m_synced = 0;
197 207
198 /* 208 /*
199 * We use {} around the QCopEnvelope because it sends its 209 * We use {} around the QCopEnvelope because it sends its
200 * data on destruction of QCopEnvelope with 210 * data on destruction of QCopEnvelope with
201 */ 211 */
202 /* check again if not present increment synced*/ 212 /* check again if not present increment synced*/
203 if ( QCopChannel::isRegistered("QPE/Application/todolist") ) { 213 if ( QCopChannel::isRegistered("QPE/Application/todolist") ) {
204 QCopEnvelope env("QPE/Application/todolist", "flush()" ); 214 QCopEnvelope env("QPE/Application/todolist", "flush()" );
205 // env << data; but we do not have any parameters here 215 // env << data; but we do not have any parameters here
206 }else 216 }else
207 m_synced++; 217 m_synced++;
208 218
209 if ( QCopChannel::isRegistered("QPE/Application/datebook") ) { 219 if ( QCopChannel::isRegistered("QPE/Application/datebook") ) {
210 QCopEnvelope env("QPE/Application/datebook", "flush()" ); 220 QCopEnvelope env("QPE/Application/datebook", "flush()" );
211 }else 221 }else
212 m_synced++; 222 m_synced++;
213 223
214 /* we will provide a wait scrren */ 224 /* we will provide a wait scrren */
215 m_loading = new Opie::Ui::OWait(this, "wait screen" ); 225 m_loading = new Opie::Ui::OWait(this, "wait screen" );
216} 226}
217 227
218void MainWindow::slotDesktopReceive(const QCString& cmd, const QByteArray& data ) { 228void MainWindow::slotDesktopReceive(const QCString& cmd, const QByteArray& data ) {
219 /* the bytearray was filled with the QDataStream now 229 /* the bytearray was filled with the QDataStream now
220 * we open it read only to get the value(s) 230 * we open it read only to get the value(s)
221 */ 231 */
222 QDataStream stream(data, IO_ReadOnly ); 232 QDataStream stream(data, IO_ReadOnly );
223 /* 233 /*
224 * we're only interested in the flushDone 234 * we're only interested in the flushDone
225 */ 235 */
226 if ( cmd == "flushDone(QString)" ) { 236 if ( cmd == "flushDone(QString)" ) {
227 QString appname; 237 QString appname;
228 stream >> appname; // get the first argument out of stream 238 stream >> appname; // get the first argument out of stream
229 if (appname == QString::fromLatin1("datebook") || 239 if (appname == QString::fromLatin1("datebook") ||
230 appname == QString::fromLatin1("todolist") ) 240 appname == QString::fromLatin1("todolist") )
231 m_synced++; 241 m_synced++;
232 } 242 }
233 243
234 /* 244 /*
235 * If we synced both we can go ahead 245 * If we synced both we can go ahead
236 * In future this is not needed anymore when we finally 246 * In future this is not needed anymore when we finally
237 * implemented X-Ref and other PIM features 247 * implemented X-Ref and other PIM features
238 */ 248 */
239 if (m_synced >= 2 ) { 249 if (m_synced >= 2 ) {
240 delete m_loading; 250 delete m_loading;
241 delete m_desktopChannel; 251 delete m_desktopChannel;
242 /* now we finally can start doing the actual loading */ 252 /* now we finally can start doing the actual loading */
243 m_tb.load(); 253 m_tb.load();
244 m_db.load(); 254 m_db.load();
245 { 255 {
246 /* tell the applications to reload */ 256 /* tell the applications to reload */
247 QCopEnvelope("QPE/Application/todolist", "reload()"); 257 QCopEnvelope("QPE/Application/todolist", "reload()");
248 QCopEnvelope("QPE/Application/datebook", "reload()"); 258 QCopEnvelope("QPE/Application/datebook", "reload()");
249 } 259 }
250 slotLoadForDay( QDate::currentDate() ); 260 slotLoadForDay( QDate::currentDate() );
251 } 261 }
252 262
253} 263}
254 264
255/* overloaded member for shortcoming of libqpe */ 265/* overloaded member for shortcoming of libqpe */
256void MainWindow::slotLoadForDay(int y, int m, int d) { 266void MainWindow::slotLoadForDay(int y, int m, int d) {
257 /* year,month, day */ 267 /* year,month, day */
258 slotLoadForDay( QDate(y, m, d ) ); 268 slotLoadForDay( QDate(y, m, d ) );
259} 269}
260 270
261void MainWindow::slotLoadForDay(const QDate& date) { 271void MainWindow::slotLoadForDay(const QDate& date) {
262 272
263 273
264 /* all todos for today including the ones without dueDate */ 274 /* all todos for today including the ones without dueDate */
265 m_todoView->set( m_tb.effectiveToDos(date, date ) ); 275 m_todoView->set( m_tb.effectiveToDos(date, date ) );
266 m_dateView->set( m_db.effectiveEvents( date, date ) ); 276 m_dateView->set( m_db.effectiveEvents( date, date ) );
267} 277}
268 278
269/* we want to show the current record */ 279/* we want to show the current record */
270void MainWindow::slotShow() { 280void MainWindow::slotShow() {
271 /* we only added PIMListViews so we can safely cast */ 281 /* we only added PIMListViews so we can safely cast */
272 PIMListView *view = static_cast<PIMListView*>(m_tab->currentWidget() ); 282 PIMListView *view = static_cast<PIMListView*>(m_tab->currentWidget() );
273 283
274 /* ask the view to send a signal */ 284 /* ask the view to send a signal */
275 view->showCurrentRecord(); 285 view->showCurrentRecord();
276 286
277} 287}
278 288
279/* as answer this slot will be called */ 289/* as answer this slot will be called */
280void MainWindow::slotShowRecord( const Opie::OPimRecord& rec) { 290void MainWindow::slotShowRecord( const Opie::OPimRecord& rec) {
281 /* got a parent but still is a toplevel MODAL dialog */ 291 /* got a parent but still is a toplevel MODAL dialog */
282 QDialog* dia = new QDialog(this,"dialog",TRUE ); 292 QDialog* dia = new QDialog(this,"dialog",TRUE );
283 QVBoxLayout *box = new QVBoxLayout( dia ); 293 QVBoxLayout *box = new QVBoxLayout( dia );
284 dia->setCaption( tr("View Record") ); 294 dia->setCaption( tr("View Record") );
285 295
286 296
287 QTextView *view = new QTextView(dia ); 297 QTextView *view = new QTextView(dia );
288 view->setText( rec.toRichText() ); 298 view->setText( rec.toRichText() );
289 box->addWidget( view ); 299 box->addWidget( view );
290 /* 300 /*
291 * execute via QPEApplication 301 * execute via QPEApplication
292 * this allows QPEApplication to make a sane decision 302 * this allows QPEApplication to make a sane decision
293 * on the size 303 * on the size
294 */ 304 */
295 dia->showMaximized(); 305 dia->showMaximized();
296 QPEApplication::execDialog( dia ); 306 QPEApplication::execDialog( dia );
297 delete dia; 307 delete dia;
298} 308}
299 309
300 310
301void MainWindow::slotDate() { 311void MainWindow::slotDate() {
302 /* 312 /*
303 * called by the action we will show a Popup 313 * called by the action we will show a Popup
304 * at the current mouse position with a DateChooser 314 * at the current mouse position with a DateChooser
305 * to select the day 315 * to select the day
306 */ 316 */
307 qWarning("slot Date"); 317 odebug << "slot Date" << oendl;
308 QPopupMenu *menu = new QPopupMenu(); 318 QPopupMenu *menu = new QPopupMenu();
309 /* A Month to select a date from TRUE for auto close */ 319 /* A Month to select a date from TRUE for auto close */
310 DateBookMonth *month = new DateBookMonth(menu, 0, true ); 320 DateBookMonth *month = new DateBookMonth(menu, 0, true );
311 connect(month, SIGNAL(dateClicked(int,int,int) ), 321 connect(month, SIGNAL(dateClicked(int,int,int) ),
312 this, SLOT(slotLoadForDay(int,int,int) ) ); 322 this, SLOT(slotLoadForDay(int,int,int) ) );
313 323
314 menu->insertItem( month ); 324 menu->insertItem( month );
315 325
316 menu->exec( QCursor::pos() ); 326 menu->exec( QCursor::pos() );
317 327
318 /* 328 /*
319 * we do not need to delete month because 329 * we do not need to delete month because
320 * we delete its parent menu 330 * we delete its parent menu
321 */ 331 */
322 332
323 delete menu; 333 delete menu;
324} 334}
325 335
326/* 336/*
327 * An anonymous namespace this symbol is only available here 337 * An anonymous namespace this symbol is only available here
328 * so truely private 338 * so truely private
329 */ 339 */
330namespace { 340namespace {
331 /* not static cause namespace does that what static would do */ 341 /* not static cause namespace does that what static would do */
332 const int RTTI = 5050; 342 const int RTTI = 5050;
333 /* 343 /*
334 * every ListView got Items. we've special pim items 344 * every ListView got Items. we've special pim items
335 * holding ownership and the pointer to a pim record 345 * holding ownership and the pointer to a pim record
336 * it can't hold a pimrecord directly because this 346 * it can't hold a pimrecord directly because this
337 * would introduce slicing... any break 347 * would introduce slicing... any break
338 */ 348 */
339 /* 349 /*
340 * A struct is a special class. Everything is public by 350 * A struct is a special class. Everything is public by
341 * default. 351 * default.
342 */ 352 */
343 struct PIMListViewItem : public QListViewItem { 353 struct PIMListViewItem : public QListViewItem {
344 /* 354 /*
345 *currently no hierachies are planed for the example 355 *currently no hierachies are planed for the example
346 * so only one constructor with a QListView as parent 356 * so only one constructor with a QListView as parent
347 */ 357 */
348 PIMListViewItem( QListView*, Opie::OPimRecord* record ); 358 PIMListViewItem( QListView*, Opie::OPimRecord* record );
349 ~PIMListViewItem(); 359 ~PIMListViewItem();
350 360
351 /* used by the QListViewItem to easily allow identifiying of different 361 /* used by the QListViewItem to easily allow identifiying of different
352 * items. Values greater than 1000 should be used */ 362 * items. Values greater than 1000 should be used */
353 int rtti()const; 363 int rtti()const;
354 Opie::OPimRecord* record()const; 364 Opie::OPimRecord* record()const;
355 365
356 private: 366 private:
357 Opie::OPimRecord* m_record; 367 Opie::OPimRecord* m_record;
358 }; 368 };
359 369
360 PIMListViewItem::PIMListViewItem( QListView *p, Opie::OPimRecord* rec ) 370 PIMListViewItem::PIMListViewItem( QListView *p, Opie::OPimRecord* rec )
361 : QListViewItem(p), m_record( rec ) { 371 : QListViewItem(p), m_record( rec ) {
362 } 372 }
363 373
364 PIMListViewItem::~PIMListViewItem() { 374 PIMListViewItem::~PIMListViewItem() {
365 /* we've the onwership so we need to delete it */ 375 /* we've the onwership so we need to delete it */
366 delete m_record; 376 delete m_record;
367 } 377 }
368 378
369 Opie::OPimRecord* PIMListViewItem::record()const { 379 Opie::OPimRecord* PIMListViewItem::record()const {
370 return m_record; 380 return m_record;
371 } 381 }
372 382
373} 383}
374 384
375 385
376PIMListView::PIMListView( QWidget* widget, const char* name, WFlags fl ) 386PIMListView::PIMListView( QWidget* widget, const char* name, WFlags fl )
377 : QListView(widget, name, fl ) 387 : QListView(widget, name, fl )
378{ 388{
379 addColumn("Summary"); 389 addColumn("Summary");
380} 390}
381 391
382PIMListView::~PIMListView() { 392PIMListView::~PIMListView() {
383 393
384} 394}
385 395
386void PIMListView::set( Opie::OPimTodoAccess::List list ) { 396void PIMListView::set( Opie::OPimTodoAccess::List list ) {
387 /* clear first and then add new items */ 397 /* clear first and then add new items */
388 clear(); 398 clear();
389 399
390 Opie::OPimTodoAccess::List::Iterator it; 400 Opie::OPimTodoAccess::List::Iterator it;
391 for (it = list.begin(); it != list.end(); ++it ) { 401 for (it = list.begin(); it != list.end(); ++it ) {
392 /* 402 /*
393 * make a new item which automatically gets added to the listview 403 * make a new item which automatically gets added to the listview
394 * and call the copy c'tor to create a new OPimTodo 404 * and call the copy c'tor to create a new OPimTodo
395 */ 405 */
396 PIMListViewItem *i = new PIMListViewItem(this, new Opie::OPimTodo( *it ) ); 406 PIMListViewItem *i = new PIMListViewItem(this, new Opie::OPimTodo( *it ) );
397 i->setText(0, (*it).summary() ); 407 i->setText(0, (*it).summary() );
398 } 408 }
399} 409}
400 410
401void PIMListView::set( const Opie::OEffectiveEvent::ValueList& lst ) { 411void PIMListView::set( const Opie::OEffectiveEvent::ValueList& lst ) {
402 /* clear first and then add items */ 412 /* clear first and then add items */
403 clear(); 413 clear();
404 414
405 Opie::OEffectiveEvent::ValueList::ConstIterator it; 415 Opie::OEffectiveEvent::ValueList::ConstIterator it;
406 for ( it = lst.begin(); it != lst.end(); ++it ) { 416 for ( it = lst.begin(); it != lst.end(); ++it ) {
407 PIMListViewItem *i = new PIMListViewItem(this, new Opie::OPimEvent( (*it).event() ) ); 417 PIMListViewItem *i = new PIMListViewItem(this, new Opie::OPimEvent( (*it).event() ) );
408 i->setText( 0, PIMListView::makeString( (*it) ) ); 418 i->setText( 0, PIMListView::makeString( (*it) ) );
409 } 419 }
410 420
411} 421}
412 422
413void PIMListView::showCurrentRecord() { 423void PIMListView::showCurrentRecord() {
414 /* it could be possible that their is no currentItem */ 424 /* it could be possible that their is no currentItem */
415 if (!currentItem() ) 425 if (!currentItem() )
416 return; 426 return;
417 427
418 /* 428 /*
419 * we only add PIMListViewItems so it is save 429 * we only add PIMListViewItems so it is save
420 * to do this case. If this would not be the case 430 * to do this case. If this would not be the case
421 * use rtti() to check in a switch() case 431 * use rtti() to check in a switch() case
422 */ 432 */
423 PIMListViewItem *item = static_cast<PIMListViewItem*>( currentItem() ); 433 PIMListViewItem *item = static_cast<PIMListViewItem*>( currentItem() );
424 434
425 /* finally you see how to emit a signal */ 435 /* finally you see how to emit a signal */
426 emit showRecord( (*item->record() ) ); 436 emit showRecord( (*item->record() ) );
427} 437}
428 438
429QString PIMListView::makeString( const Opie::OEffectiveEvent& ev ) { 439QString PIMListView::makeString( const Opie::OEffectiveEvent& ev ) {
430 QString str; 440 QString str;
431 str += ev.description(); 441 str += ev.description();
432 if ( !ev.event().isAllDay() ) { 442 if ( !ev.event().isAllDay() ) {
433 if ( ev.startDate() != ev.endDate() ) { 443 if ( ev.startDate() != ev.endDate() ) {
434 str += tr("Start ") + TimeString::timeString( ev.event().startDateTime().time() ); 444 str += tr("Start ") + TimeString::timeString( ev.event().startDateTime().time() );
435 str += " - " + TimeString::longDateString( ev.startDate() ); 445 str += " - " + TimeString::longDateString( ev.startDate() );
436 str += tr("End ") + TimeString::timeString( ev.event().endDateTime().time() ); 446 str += tr("End ") + TimeString::timeString( ev.event().endDateTime().time() );
437 str += " - " + TimeString::longDateString( ev.endDate() ); 447 str += " - " + TimeString::longDateString( ev.endDate() );
438 }else{ 448 }else{
439 str += tr("Time ") + TimeString::timeString( ev.startTime() ); 449 str += tr("Time ") + TimeString::timeString( ev.startTime() );
440 str += " - " + TimeString::timeString( ev.endTime() ); 450 str += " - " + TimeString::timeString( ev.endTime() );
441 } 451 }
442 }else 452 }else
443 str += tr(" This is an All-Day Event"); 453 str += tr(" This is an All-Day Event");
444 454
445 return str; 455 return str;
446} 456}