author | llornkcor <llornkcor> | 2003-09-09 05:50:12 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2003-09-09 05:50:12 (UTC) |
commit | 82c17c8b900e8b4900ed048213934f67ba22f846 (patch) (unidiff) | |
tree | 74b93a0808f5c0c8f0745a85844ae3d75161604d /noncore/apps/opie-bartender/bartender.cpp | |
parent | e485a3bd44b3cc70280e03eb8a7958a5252cdd6a (diff) | |
download | opie-82c17c8b900e8b4900ed048213934f67ba22f846.zip opie-82c17c8b900e8b4900ed048213934f67ba22f846.tar.gz opie-82c17c8b900e8b4900ed048213934f67ba22f846.tar.bz2 |
bartender - for your drunken pleasures
Diffstat (limited to 'noncore/apps/opie-bartender/bartender.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/apps/opie-bartender/bartender.cpp | 447 |
1 files changed, 447 insertions, 0 deletions
diff --git a/noncore/apps/opie-bartender/bartender.cpp b/noncore/apps/opie-bartender/bartender.cpp new file mode 100644 index 0000000..5661ad5 --- a/dev/null +++ b/noncore/apps/opie-bartender/bartender.cpp | |||
@@ -0,0 +1,447 @@ | |||
1 | /**************************************************************************** | ||
2 | ** | ||
3 | ** Created: Sat Jul 20 08:10:53 2002 | ||
4 | ** by: L.J. Potter <ljp@llornkcor.com> | ||
5 | ** copyright : (C) 2002 by ljp | ||
6 | email : ljp@llornkcor.com | ||
7 | * This program is free software; you can redistribute it and/or modify * | ||
8 | * it under the terms of the GNU General Public License as published by * | ||
9 | * the Free Software Foundation; either version 2 of the License, or * | ||
10 | * (at your option) any later version. * | ||
11 | ***************************************************************************/ | ||
12 | |||
13 | #include "bartender.h" | ||
14 | #include "newdrinks.h" | ||
15 | #include "showdrinks.h" | ||
16 | #include "inputDialog.h" | ||
17 | #include "searchresults.h" | ||
18 | #include "bac.h" | ||
19 | |||
20 | #include <qpe/qpetoolbar.h> | ||
21 | #include <qpe/qpemenubar.h> | ||
22 | #include <opie/colorpopupmenu.h> | ||
23 | #include <qpe/qpeapplication.h> | ||
24 | #include <qpe/resource.h> | ||
25 | |||
26 | #include <qcstring.h> | ||
27 | #include <qlineedit.h> | ||
28 | #include <qdir.h> | ||
29 | #include <qpushbutton.h> | ||
30 | #include <qlistbox.h> | ||
31 | #include <qstringlist.h> | ||
32 | #include <qmultilineedit.h> | ||
33 | #include <qmessagebox.h> | ||
34 | #include <qfile.h> | ||
35 | #include <qtextstream.h> | ||
36 | #include <qfile.h> | ||
37 | #include <qaction.h> | ||
38 | #include <qheader.h> | ||
39 | #include <qlistview.h> | ||
40 | #include <qwidget.h> | ||
41 | #include <qlayout.h> | ||
42 | #include <qvariant.h> | ||
43 | #include <qtooltip.h> | ||
44 | #include <qwhatsthis.h> | ||
45 | #include <qimage.h> | ||
46 | #include <qpixmap.h> | ||
47 | |||
48 | #include <fcntl.h> | ||
49 | #include <unistd.h> | ||
50 | #include <stdlib.h> | ||
51 | #include <stdio.h> | ||
52 | #include <errno.h> | ||
53 | |||
54 | |||
55 | Bartender::Bartender( QWidget* parent, const char* name, WFlags fl ) | ||
56 | : QMainWindow( parent, name, fl ) { | ||
57 | if ( !name ) | ||
58 | setName( "Bartender" ); | ||
59 | QGridLayout *layout = new QGridLayout( this ); | ||
60 | layout->setSpacing( 2); | ||
61 | layout->setMargin( 2); | ||
62 | connect( qApp,SIGNAL( aboutToQuit()),SLOT( cleanUp()) ); | ||
63 | |||
64 | setCaption( tr( "Bartender" ) ); | ||
65 | |||
66 | ToolBar1 = new QPEToolBar( this, "ToolBar1" ); | ||
67 | ToolBar1->setFixedHeight(22); | ||
68 | layout->addMultiCellWidget( ToolBar1, 0, 0, 0, 4 ); | ||
69 | |||
70 | QPEMenuBar *menuBar = new QPEMenuBar( ToolBar1 ); | ||
71 | QPopupMenu *fileMenu; | ||
72 | fileMenu = new QPopupMenu( this); | ||
73 | menuBar->insertItem( tr("File"), fileMenu ); | ||
74 | |||
75 | fileMenu->insertItem(tr("New Drink")); | ||
76 | fileMenu->insertItem(tr("Open Drink")); | ||
77 | fileMenu->insertItem(tr("Find by Drink Name")); | ||
78 | fileMenu->insertItem(tr("Find by Alcohol")); | ||
79 | |||
80 | QPopupMenu *editMenu; | ||
81 | editMenu = new QPopupMenu( this); | ||
82 | menuBar->insertItem( tr("Edit"), editMenu ); | ||
83 | editMenu->insertItem(tr("edit")); | ||
84 | |||
85 | connect( fileMenu, SIGNAL( activated(int) ), this, SLOT( fileMenuActivated(int) )); | ||
86 | connect( editMenu, SIGNAL( activated(int) ), this, SLOT( editMenuActivated(int) )); | ||
87 | |||
88 | |||
89 | QAction *a = new QAction( tr( "New" ), Resource::loadPixmap( "new" ), "New", 0, this, 0 ); | ||
90 | connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) ); | ||
91 | a->addTo( ToolBar1 ); | ||
92 | |||
93 | a = new QAction( tr( "Open" ), Resource::loadPixmap( "bartender/bartender_sm" ), "open", 0, this, 0 ); | ||
94 | connect( a, SIGNAL( activated() ), this, SLOT( openCurrentDrink() ) ); | ||
95 | a->addTo( ToolBar1 ); | ||
96 | |||
97 | a = new QAction( tr( "Find" ), Resource::loadPixmap( "find" ), "Find", 0, this, 0 ); | ||
98 | connect( a, SIGNAL( activated() ), this, SLOT( askSearch() ) ); | ||
99 | a->addTo( ToolBar1 ); | ||
100 | |||
101 | a = new QAction( tr( "Edit" ), Resource::loadPixmap( "edit" ),"Edit", 0, this, 0 ); | ||
102 | connect( a, SIGNAL( activated() ), this, SLOT( doEdit() ) ); | ||
103 | a->addTo( ToolBar1 ); | ||
104 | |||
105 | QPushButton *t; | ||
106 | t= new QPushButton( "BAC", ToolBar1, "bacButtin"); | ||
107 | connect( t, SIGNAL( clicked() ), this, SLOT( doBac() ) ); | ||
108 | |||
109 | DrinkView = new QListView( this, "DrinkView" ); | ||
110 | DrinkView->addColumn( tr( "Name of Drink" ) ); | ||
111 | // DrinkView->setRootIsDecorated( TRUE ); | ||
112 | DrinkView->header()->hide(); | ||
113 | |||
114 | QPEApplication::setStylusOperation( DrinkView->viewport(),QPEApplication::RightOnHold); | ||
115 | |||
116 | connect(DrinkView, SIGNAL( doubleClicked(QListViewItem*)),this,SLOT(showDrink( QListViewItem*))); | ||
117 | connect(DrinkView, SIGNAL( mouseButtonPressed( int, QListViewItem *, const QPoint&, int)), | ||
118 | this,SLOT( showDrink(int, QListViewItem *, const QPoint&, int))); | ||
119 | |||
120 | layout->addMultiCellWidget( DrinkView, 1, 2, 0, 4 ); | ||
121 | if(QDir("db").exists()) { | ||
122 | dbFile.setName( "db/drinkdb.txt"); | ||
123 | } else | ||
124 | dbFile.setName( QPEApplication::qpeDir()+"/etc/bartender/drinkdb.txt"); | ||
125 | initDrinkDb(); | ||
126 | } | ||
127 | |||
128 | Bartender::~Bartender() { | ||
129 | } | ||
130 | |||
131 | /* | ||
132 | this happens right before exit */ | ||
133 | void Bartender::cleanUp() { | ||
134 | dbFile.close(); | ||
135 | |||
136 | } | ||
137 | |||
138 | void Bartender::initDrinkDb() { | ||
139 | |||
140 | if(!dbFile.isOpen()) | ||
141 | if ( !dbFile.open( IO_ReadOnly)) { | ||
142 | QMessageBox::message( (tr("Note")), (tr("Drink database not opened sucessfully.\n")) ); | ||
143 | return; | ||
144 | } | ||
145 | fillList(); | ||
146 | } | ||
147 | |||
148 | void Bartender::fillList() { | ||
149 | dbFile.at(1); | ||
150 | DrinkView->clear(); | ||
151 | int i=0; | ||
152 | QListViewItem * item ; | ||
153 | QTextStream t( &dbFile); | ||
154 | QString s; | ||
155 | while ( !t.eof()) { | ||
156 | s = t.readLine(); | ||
157 | if(s.find("#",0,TRUE) != -1) { | ||
158 | // qDebug(s.right(s.length()-2)); | ||
159 | item= new QListViewItem( DrinkView, 0 ); | ||
160 | item->setText( 0, s.right(s.length()-2)); | ||
161 | i++; | ||
162 | } | ||
163 | } | ||
164 | qDebug("there are currently %d of drinks", i); | ||
165 | } | ||
166 | |||
167 | void Bartender::fileNew() { | ||
168 | |||
169 | New_Drink *newDrinks; | ||
170 | newDrinks = new New_Drink(this,"New Drink....", TRUE); | ||
171 | QString newName, newIng; | ||
172 | newDrinks->showMaximized(); | ||
173 | newDrinks->exec(); | ||
174 | newName = newDrinks->LineEdit1->text(); | ||
175 | newIng= newDrinks->MultiLineEdit1->text(); | ||
176 | |||
177 | if(dbFile.isOpen()) | ||
178 | dbFile.close(); | ||
179 | if ( !dbFile.open( IO_WriteOnly| IO_Append)) { | ||
180 | QMessageBox::message( (tr("Note")), (tr("Drink database not opened sucessfully.\n")) ); | ||
181 | return; | ||
182 | } | ||
183 | if(newDrinks ->result() == 1 ) { | ||
184 | QString newDrink="\n# "+newName+"\n"; | ||
185 | newDrink.append(newIng+"\n"); | ||
186 | qDebug("writing "+newDrink); | ||
187 | dbFile.writeBlock( newDrink.latin1(), newDrink.length()); | ||
188 | clearList(); | ||
189 | dbFile.close(); | ||
190 | |||
191 | initDrinkDb(); | ||
192 | } | ||
193 | delete newDrinks; | ||
194 | } | ||
195 | |||
196 | void Bartender::showDrink(int mouse, QListViewItem * item, const QPoint&, int) { | ||
197 | switch (mouse) { | ||
198 | case 1: | ||
199 | // showDrink(item); | ||
200 | break; | ||
201 | case 2: | ||
202 | showDrink(item); | ||
203 | break; | ||
204 | } | ||
205 | } | ||
206 | |||
207 | void Bartender::showDrink( QListViewItem *item) { | ||
208 | if(item==NULL) return; | ||
209 | dbFile.at(0); | ||
210 | Show_Drink *showDrinks; | ||
211 | QString myDrink=item->text(0); | ||
212 | showDrinks = new Show_Drink(this, myDrink, TRUE); | ||
213 | QTextStream t( &dbFile); | ||
214 | |||
215 | QString s, s2; | ||
216 | while ( !t.eof()) { | ||
217 | s = t.readLine(); | ||
218 | if(s.find( myDrink, 0, TRUE) != -1) { | ||
219 | for(int i=0;s2.find( "#", 0, TRUE) == -1;i++) { | ||
220 | s2 = t.readLine(); | ||
221 | if(s2.find("#",0,TRUE) == -1 || dbFile.atEnd() ) { | ||
222 | // qDebug(s2); | ||
223 | showDrinks->MultiLineEdit1->append(s2); | ||
224 | } | ||
225 | if( dbFile.atEnd() ) break; | ||
226 | } | ||
227 | } | ||
228 | } | ||
229 | showDrinks->showMaximized(); | ||
230 | showDrinks->exec(); | ||
231 | |||
232 | if(showDrinks ->result() ==0) { | ||
233 | doEdit(); | ||
234 | } | ||
235 | delete showDrinks; | ||
236 | } | ||
237 | |||
238 | void Bartender::askSearch() { | ||
239 | switch ( QMessageBox::warning(this,tr("Find"),tr("Search by drink name\n")+ | ||
240 | "\nor alcohol ?" | ||
241 | ,tr("Drink Name"),tr("Alcohol"),0,0,1) ) { | ||
242 | case 0: | ||
243 | doSearchByName(); | ||
244 | break; | ||
245 | case 1: | ||
246 | doSearchByDrink(); | ||
247 | break; | ||
248 | }; | ||
249 | } | ||
250 | |||
251 | /* search by name */ | ||
252 | void Bartender::doSearchByName() { | ||
253 | // if( DrinkView->currentItem() == NULL) return; | ||
254 | QStringList searchList; | ||
255 | QString searchForDrinkName; | ||
256 | InputDialog *fileDlg; | ||
257 | fileDlg = new InputDialog(this,tr("Find by Drink Name"),TRUE, 0); | ||
258 | fileDlg->exec(); | ||
259 | if( fileDlg->result() == 1 ) { | ||
260 | searchForDrinkName = fileDlg->LineEdit1->text(); | ||
261 | QListViewItemIterator it( DrinkView ); | ||
262 | for ( ; it.current(); ++it ) { | ||
263 | if ( it.current()->text(0).find( searchForDrinkName, 0, TRUE) != -1 ) { | ||
264 | // qDebug( it.current()->text(0)); | ||
265 | searchList.append(it.current()->text(0)); | ||
266 | } | ||
267 | } | ||
268 | if(searchList.count() >0) | ||
269 | showSearchResult(searchList); | ||
270 | else | ||
271 | QMessageBox::message(tr("Search"),tr("Sorry no results for\n")+searchForDrinkName); | ||
272 | }//end Inputdialog | ||
273 | delete fileDlg; | ||
274 | } | ||
275 | |||
276 | void Bartender::doSearchByDrink() { | ||
277 | // if( DrinkView->currentItem() == NULL) return; | ||
278 | QStringList searchList; | ||
279 | QString searchForDrinkName, lastDrinkName, tempName; | ||
280 | |||
281 | InputDialog *fileDlg; | ||
282 | fileDlg = new InputDialog(this,tr("Find by Alcohol"),TRUE, 0); | ||
283 | fileDlg->exec(); | ||
284 | if( fileDlg->result() == 1 ) { | ||
285 | searchForDrinkName = fileDlg->LineEdit1->text(); | ||
286 | |||
287 | dbFile.at(0); | ||
288 | QTextStream t( &dbFile); | ||
289 | |||
290 | QString s, s2; | ||
291 | while ( !t.eof()) { | ||
292 | s = t.readLine(); | ||
293 | if(s.find("#",0,TRUE) != -1) { | ||
294 | lastDrinkName=s.right(s.length()-2); | ||
295 | // qDebug("last drink name "+lastDrinkName); | ||
296 | } | ||
297 | else if( s.find( searchForDrinkName ,0, FALSE) != -1 && lastDrinkName != tempName ) { | ||
298 | // qDebug("appending "+lastDrinkName); | ||
299 | searchList.append( lastDrinkName); | ||
300 | tempName=lastDrinkName; | ||
301 | } | ||
302 | // if( dbFile.atEnd() ) break; | ||
303 | |||
304 | } //oef | ||
305 | if(searchList.count() >0) | ||
306 | showSearchResult(searchList); | ||
307 | else | ||
308 | QMessageBox::message(tr("Search"),tr("Sorry no results for\n")+ searchForDrinkName); | ||
309 | } | ||
310 | delete fileDlg; | ||
311 | } | ||
312 | |||
313 | void Bartender::showSearchResult(QStringList &searchList) { | ||
314 | QString result; | ||
315 | Search_Results *searchDlg; | ||
316 | |||
317 | searchList.sort(); | ||
318 | |||
319 | searchDlg = new Search_Results(this, "Search Results", TRUE); | ||
320 | searchDlg->showMaximized(); | ||
321 | searchDlg->ListBox1->insertStringList( searchList,-1); | ||
322 | searchDlg->exec(); | ||
323 | |||
324 | if( searchDlg->result() == 1 ) { | ||
325 | result= searchDlg->ListBox1->currentText(); | ||
326 | } | ||
327 | QListViewItemIterator it2( DrinkView ); | ||
328 | for ( ; it2.current(); ++it2 ) { | ||
329 | if ( it2.current()->text(0)== result ) { | ||
330 | // qDebug( it2.current()->text(0)); | ||
331 | showDrink(it2.current()); | ||
332 | } | ||
333 | } | ||
334 | delete searchDlg; | ||
335 | } | ||
336 | |||
337 | void Bartender::doEdit() { | ||
338 | if(DrinkView->currentItem() == NULL) { | ||
339 | fileNew(); | ||
340 | } | ||
341 | |||
342 | QString myDrink; | ||
343 | myDrink= DrinkView->currentItem()->text(0); | ||
344 | dbFile.at(0); | ||
345 | int foundAt=0; | ||
346 | New_Drink *newDrinks; | ||
347 | newDrinks = new New_Drink(this,"Edit Drink....", TRUE); | ||
348 | QString newName, newIng; | ||
349 | newDrinks->showMaximized(); | ||
350 | QTextStream t( &dbFile); | ||
351 | |||
352 | QString s, s2; | ||
353 | while ( !t.eof()) { | ||
354 | s = t.readLine(); | ||
355 | if(s.find( myDrink, 0, TRUE) != -1) { | ||
356 | foundAt = dbFile.at() - (s.length()+1); | ||
357 | for(int i=0;s2.find( "#", 0, TRUE) == -1;i++) { | ||
358 | s2 = t.readLine(); | ||
359 | if(s2.find("#",0,TRUE) == -1 || dbFile.atEnd() ) { | ||
360 | // qDebug(s2); | ||
361 | newDrinks->MultiLineEdit1->append(s2); | ||
362 | newDrinks->LineEdit1->setText(myDrink); | ||
363 | } | ||
364 | if( dbFile.atEnd() ) break; | ||
365 | } | ||
366 | } | ||
367 | } | ||
368 | newDrinks->exec(); | ||
369 | newName = newDrinks->LineEdit1->text(); | ||
370 | newIng= newDrinks->MultiLineEdit1->text(); | ||
371 | |||
372 | if( newDrinks ->result() == 1 ) { | ||
373 | if(dbFile.isOpen()) | ||
374 | dbFile.close(); | ||
375 | if ( !dbFile.open( IO_ReadWrite )) { | ||
376 | QMessageBox::message( (tr("Note")), (tr("Drink database not opened sucessfully.\n")) ); | ||
377 | return; | ||
378 | } | ||
379 | int fd = dbFile.handle(); | ||
380 | lseek( fd, foundAt, SEEK_SET); | ||
381 | |||
382 | // dbFile.at( foundAt); | ||
383 | #warning FIXME problems with editing drinks db | ||
384 | ////////// FIXME write to user file | ||
385 | QString newDrink="# "+newName+"\n"; | ||
386 | newDrink.append(newIng+"\n"); | ||
387 | qDebug("writing "+newDrink); | ||
388 | dbFile.writeBlock( newDrink.latin1(), newDrink.length()); | ||
389 | clearList(); | ||
390 | |||
391 | dbFile.flush(); | ||
392 | |||
393 | initDrinkDb(); | ||
394 | } | ||
395 | } | ||
396 | |||
397 | void Bartender::clearList() { | ||
398 | DrinkView->clear(); | ||
399 | } | ||
400 | |||
401 | void Bartender::doBac() { | ||
402 | BacDialog *bacDlg; | ||
403 | bacDlg = new BacDialog(this,"BAC",TRUE); | ||
404 | bacDlg->showMaximized(); | ||
405 | bacDlg->exec(); | ||
406 | delete bacDlg; | ||
407 | } | ||
408 | |||
409 | void Bartender::openCurrentDrink() { | ||
410 | if(DrinkView->currentItem() == NULL) return; | ||
411 | showDrink(DrinkView->currentItem()); | ||
412 | } | ||
413 | |||
414 | void Bartender::fileMenuActivated( int item) { | ||
415 | qDebug("Item %d", item); | ||
416 | switch(item) { | ||
417 | case -3: // new -3 | ||
418 | fileNew(); | ||
419 | break; | ||
420 | case -4:// open -4 | ||
421 | openCurrentDrink(); | ||
422 | break; | ||
423 | case -5:// drink -5 | ||
424 | doSearchByName(); | ||
425 | |||
426 | break; | ||
427 | case -6:// alcohol -6 | ||
428 | doSearchByDrink(); | ||
429 | |||
430 | break; | ||
431 | |||
432 | } | ||
433 | } | ||
434 | |||
435 | void Bartender::editMenuActivated(int item) { | ||
436 | qDebug("Item %d", item); | ||
437 | /* | ||
438 | edit -8 | ||
439 | */ | ||
440 | switch(item) { | ||
441 | case -8: | ||
442 | doEdit() ; | ||
443 | break; | ||
444 | |||
445 | } | ||
446 | } | ||
447 | |||