summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-bartender/bartender.cpp
Unidiff
Diffstat (limited to 'noncore/apps/opie-bartender/bartender.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/apps/opie-bartender/bartender.cpp447
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
55Bartender::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
128Bartender::~Bartender() {
129}
130
131/*
132this happens right before exit */
133void Bartender::cleanUp() {
134 dbFile.close();
135
136}
137
138void 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
148void 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
167void 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
196void 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
207void 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
238void 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 */
252void 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
276void 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
313void 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 }
334delete searchDlg;
335}
336
337void 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
397void Bartender::clearList() {
398 DrinkView->clear();
399}
400
401void Bartender::doBac() {
402 BacDialog *bacDlg;
403 bacDlg = new BacDialog(this,"BAC",TRUE);
404 bacDlg->showMaximized();
405 bacDlg->exec();
406 delete bacDlg;
407}
408
409void Bartender::openCurrentDrink() {
410 if(DrinkView->currentItem() == NULL) return;
411 showDrink(DrinkView->currentItem());
412}
413
414void 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
435void 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