00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "bartender.h"
00014 #include "showdrinks.h"
00015 #include "inputDialog.h"
00016 #include "searchresults.h"
00017 #include "bac.h"
00018 #include "drinkdata.h"
00019
00020
00021 #include <opie2/odebug.h>
00022 #include <opie2/oresource.h>
00023 #include <qpe/qpeapplication.h>
00024 using namespace Opie::Core;
00025
00026
00027 #include <qlineedit.h>
00028 #include <qdir.h>
00029 #include <qpushbutton.h>
00030 #include <qlistbox.h>
00031 #include <qmultilineedit.h>
00032 #include <qmessagebox.h>
00033 #include <qtextstream.h>
00034 #include <qaction.h>
00035 #include <qheader.h>
00036 #include <qlistview.h>
00037 #include <qlayout.h>
00038 #include <qtoolbar.h>
00039 #include <qmenubar.h>
00040
00041
00042 #include <fcntl.h>
00043 #include <unistd.h>
00044 #include <stdlib.h>
00045 #include <stdio.h>
00046 #include <errno.h>
00047
00048 Bartender::Bartender( QWidget* parent, const char* name, WFlags fl )
00049 : QMainWindow( parent, name, fl ) {
00050 if ( !name )
00051 setName( "Bartender" );
00052
00053 connect( qApp,SIGNAL( aboutToQuit()),SLOT( cleanUp()) );
00054
00055 setCaption( tr( "Bartender" ) );
00056
00057 setToolBarsMovable( false );
00058 QToolBar *dock = new QToolBar( this );
00059 dock->setHorizontalStretchable( true );
00060
00061 QMenuBar *menuBar = new QMenuBar( dock );
00062 menuBar->setMargin( 0 );
00063 QPopupMenu *fileMenu;
00064 fileMenu = new QPopupMenu( this);
00065 menuBar->insertItem( tr("File"), fileMenu );
00066
00067 fileMenu->insertItem(tr("New Drink"));
00068 fileMenu->insertItem(tr("Open Drink"));
00069 fileMenu->insertItem(tr("Find by Drink Name"));
00070 fileMenu->insertItem(tr("Find by Ingredient"));
00071
00072 QPopupMenu *editMenu;
00073 editMenu = new QPopupMenu( this);
00074 menuBar->insertItem( tr("Edit"), editMenu );
00075 editMenu->insertItem(tr("Edit Drink"));
00076
00077 connect( fileMenu, SIGNAL( activated(int) ), this, SLOT( fileMenuActivated(int) ));
00078 connect( editMenu, SIGNAL( activated(int) ), this, SLOT( editMenuActivated(int) ));
00079
00080 ToolBar1 = new QToolBar( this );
00081
00082 QAction *a = new QAction( tr( "New" ), Opie::Core::OResource::loadPixmap( "new", Opie::Core::OResource::SmallIcon ),
00083 "New", 0, this, 0 );
00084 connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) );
00085 a->addTo( ToolBar1 );
00086
00087 a = new QAction( tr( "Open" ), Opie::Core::OResource::loadPixmap( "bartender/bartender_sm", Opie::Core::OResource::SmallIcon ),
00088 "open", 0, this, 0 );
00089 connect( a, SIGNAL( activated() ), this, SLOT( openCurrentDrink() ) );
00090 a->addTo( ToolBar1 );
00091
00092 a = new QAction( tr( "Find" ), Opie::Core::OResource::loadPixmap( "find", Opie::Core::OResource::SmallIcon ),
00093 "Find", 0, this, 0 );
00094 connect( a, SIGNAL( activated() ), this, SLOT( askSearch() ) );
00095 a->addTo( ToolBar1 );
00096
00097 a = new QAction( tr( "Edit" ), Opie::Core::OResource::loadPixmap( "edit", Opie::Core::OResource::SmallIcon ),
00098 "Edit", 0, this, 0 );
00099 connect( a, SIGNAL( activated() ), this, SLOT( doEdit() ) );
00100 a->addTo( ToolBar1 );
00101
00102 QPushButton *t;
00103 t= new QPushButton( "BAC", ToolBar1, "bacButtin");
00104 connect( t, SIGNAL( clicked() ), this, SLOT( doBac() ) );
00105
00106 DrinkView = new QListView( this, "DrinkView" );
00107 DrinkView->addColumn( tr( "Name of Drink" ) );
00108 DrinkView->header()->hide();
00109
00110 QPEApplication::setStylusOperation( DrinkView->viewport(),QPEApplication::RightOnHold);
00111
00112 connect(DrinkView, SIGNAL( doubleClicked(QListViewItem*)),this,SLOT(showDrink(QListViewItem*)));
00113 connect(DrinkView, SIGNAL( mouseButtonPressed(int,QListViewItem*,const QPoint&,int)),
00114 this,SLOT( showDrink(int,QListViewItem*,const QPoint&,int)));
00115
00116 if(QDir("db").exists())
00117 drinkDB.setFile("db/drinkdb.txt");
00118 else
00119 drinkDB.setFile(QPEApplication::qpeDir()+"etc/bartender/drinkdb.txt");
00120
00121 initDrinkDb();
00122
00123 DrinkView->setFocus();
00124
00125 setCentralWidget( DrinkView );
00126 }
00127
00128 Bartender::~Bartender() {
00129 }
00130
00131
00132
00133 void Bartender::cleanUp() {
00134
00135 }
00136
00137 void Bartender::initDrinkDb() {
00138 if(drinkDB.read())
00139 fillList();
00140 else
00141 QMessageBox::message( (tr("Note")), (tr("Drink database not opened sucessfully.\n")) );
00142 }
00143
00144 void Bartender::fillList() {
00145 QString lastName;
00146 if( DrinkView->currentItem() != NULL )
00147 lastName = DrinkView->currentItem()->text(0);
00148 else
00149 lastName = "";
00150
00151 DrinkView->clear();
00152 int i=0;
00153 QListViewItem * item ;
00154 QString s;
00155
00156 DrinkList::Iterator it = drinkDB.getBegin();
00157 while ( it != drinkDB.getEnd() ) {
00158 item= new QListViewItem( DrinkView, 0 );
00159 item->setText( 0, (*it).getName());
00160 i++;
00161 ++it;
00162 }
00163
00164 if( lastName != "" ) {
00165 QListViewItemIterator it( DrinkView );
00166 for ( ; it.current(); ++it ) {
00167 if ( it.current()->text(0) == lastName ) {
00168 DrinkView->setCurrentItem(it.current());
00169 break;
00170 }
00171 }
00172 }
00173 else if( DrinkView->childCount() > 0)
00174 DrinkView->setCurrentItem(DrinkView->firstChild());
00175
00176 odebug << "there are currently " << i << " of drinks" << oendl;
00177 }
00178
00179 void Bartender::fileNew() {
00180
00181 New_Drink *newDrinks;
00182 newDrinks = new New_Drink(this,"New Drink", TRUE);
00183 QString newName, newIng;
00184 QPEApplication::execDialog( newDrinks );
00185 newName = newDrinks->LineEdit1->text();
00186 newIng= newDrinks->MultiLineEdit1->text();
00187
00188 if(newDrinks ->result() == 1 ) {
00189 drinkDB.addDrink(newName, newIng);
00190 if(!drinkDB.writeChanges()) {
00191 QMessageBox::message( (tr("Note")), (tr("Failed to write to drink database!\n")) );
00192 }
00193 fillList();
00194 }
00195 delete newDrinks;
00196 }
00197
00198 void Bartender::showDrink(int mouse, QListViewItem * item, const QPoint&, int) {
00199 switch (mouse) {
00200 case 1:
00201
00202 break;
00203 case 2:
00204 showDrink(item);
00205 break;
00206 }
00207 }
00208
00209 void Bartender::showDrink( QListViewItem *item) {
00210 if(item==NULL) return;
00211 Show_Drink *showDrinks;
00212 QString myDrink=item->text(0);
00213 showDrinks = new Show_Drink(this, myDrink, TRUE);
00214
00215 DrinkList::Iterator it = drinkDB.findDrink(myDrink);
00216 if(it != drinkDB.getEnd()) {
00217 showDrinks->MultiLineEdit1->setText((*it).getIngredients());
00218
00219 connect(showDrinks->editDrinkButton, SIGNAL(clicked()), this, SLOT(doEdit()));
00220 QPEApplication::execDialog( showDrinks );
00221 }
00222
00223 delete showDrinks;
00224 }
00225
00226 void Bartender::askSearch() {
00227 switch ( QMessageBox::warning(this,tr("Find"),tr("Search by drink name\n")+
00228 "\nor ingredient ?"
00229 ,tr("Drink Name"),tr("Ingredient"),0,0,1) ) {
00230 case 0:
00231 doSearchByName();
00232 break;
00233 case 1:
00234 doSearchByIngredient();
00235 break;
00236 };
00237 }
00238
00239
00240 void Bartender::doSearchByName() {
00241
00242 QStringList searchList;
00243 QString searchForDrinkName;
00244 InputDialog *fileDlg;
00245 fileDlg = new InputDialog(this,tr("Find by Drink Name"),TRUE, 0);
00246 fileDlg->exec();
00247 if( fileDlg->result() == 1 ) {
00248 searchForDrinkName = fileDlg->LineEdit1->text();
00249 QListViewItemIterator it( DrinkView );
00250 for ( ; it.current(); ++it ) {
00251 if ( it.current()->text(0).find( searchForDrinkName, 0, FALSE) != -1 ) {
00252
00253 searchList.append(it.current()->text(0));
00254 }
00255 }
00256 if(searchList.count() >0)
00257 showSearchResult(searchList);
00258 else
00259 QMessageBox::message(tr("Search"),tr("Sorry no results for\n")+searchForDrinkName);
00260 }
00261 delete fileDlg;
00262 }
00263
00264 void Bartender::doSearchByIngredient() {
00265
00266 QStringList searchList;
00267 QString searchForIngredient, lastDrinkName, lastDrinkIngredients;
00268
00269 InputDialog *fileDlg;
00270 fileDlg = new InputDialog(this,tr("Find by Ingredient"),TRUE, 0);
00271 fileDlg->exec();
00272 if( fileDlg->result() == 1 ) {
00273 searchForIngredient = fileDlg->LineEdit1->text();
00274
00275 DrinkList::Iterator it = drinkDB.getBegin();
00276 while ( it != drinkDB.getEnd() ) {
00277 lastDrinkName = (*it).getName();
00278 lastDrinkIngredients = (*it).getIngredients();
00279
00280 if( lastDrinkIngredients.find( searchForIngredient ,0, FALSE) != -1 )
00281 searchList.append( lastDrinkName );
00282
00283 ++it;
00284 }
00285
00286 if(searchList.count() >0)
00287 showSearchResult(searchList);
00288 else
00289 QMessageBox::message(tr("Search"),tr("Sorry no results for\n")+ searchForIngredient);
00290 }
00291 delete fileDlg;
00292 }
00293
00294 void Bartender::showSearchResult(QStringList &searchList) {
00295 QString result;
00296 Search_Results *searchDlg;
00297
00298 searchList.sort();
00299
00300 searchDlg = new Search_Results(this, "Search Results", TRUE);
00301 searchDlg->ListBox1->insertStringList( searchList,-1);
00302 QPEApplication::execDialog( searchDlg );
00303
00304 if( searchDlg->result() == 1 ) {
00305 result= searchDlg->ListBox1->currentText();
00306 }
00307 QListViewItemIterator it2( DrinkView );
00308 for ( ; it2.current(); ++it2 ) {
00309 if ( it2.current()->text(0)== result ) {
00310
00311 showDrink(it2.current());
00312 }
00313 }
00314 delete searchDlg;
00315 }
00316
00317 void Bartender::doEdit() {
00318 if(DrinkView->currentItem() == NULL) {
00319 fileNew();
00320 return;
00321 }
00322
00323 QString myDrink;
00324 myDrink= DrinkView->currentItem()->text(0);
00325
00326 New_Drink *newDrinks;
00327 newDrinks = new New_Drink(this,"Edit Drink", TRUE);
00328 QString newName, newIng;
00329 QPEApplication::showDialog( newDrinks );
00330
00331 DrinkList::Iterator drinkItem = drinkDB.findDrink(myDrink);
00332 if(drinkItem != drinkDB.getEnd()) {
00333 newDrinks->LineEdit1->setText((*drinkItem).getName());
00334 newDrinks->MultiLineEdit1->setText((*drinkItem).getIngredients());
00335
00336 newDrinks->exec();
00337 newName = newDrinks->LineEdit1->text();
00338 newIng= newDrinks->MultiLineEdit1->text();
00339
00340 if( newDrinks ->result() == 1 ) {
00341 (*drinkItem).setName(newName);
00342 (*drinkItem).setIngredients(newIng);
00343 if(!drinkDB.writeChanges()) {
00344 QMessageBox::message( (tr("Note")), (tr("Failed to write to drink database!\n")) );
00345 }
00346 fillList();
00347 }
00348 }
00349
00350 delete newDrinks;
00351 }
00352
00353 void Bartender::clearList() {
00354 DrinkView->clear();
00355 }
00356
00357 void Bartender::doBac() {
00358 BacDialog *bacDlg;
00359 bacDlg = new BacDialog(this,"BAC",TRUE);
00360 QPEApplication::execDialog( bacDlg );
00361 delete bacDlg;
00362 }
00363
00364 void Bartender::openCurrentDrink() {
00365 if(DrinkView->currentItem() == NULL) return;
00366 showDrink(DrinkView->currentItem());
00367 }
00368
00369 void Bartender::fileMenuActivated( int item) {
00370 odebug << "Item " << item << "" << oendl;
00371 switch(item) {
00372 case -3:
00373 fileNew();
00374 break;
00375 case -4:
00376 openCurrentDrink();
00377 break;
00378 case -5:
00379 doSearchByName();
00380
00381 break;
00382 case -6:
00383 doSearchByIngredient();
00384
00385 break;
00386
00387 }
00388 }
00389
00390 void Bartender::editMenuActivated(int item) {
00391 odebug << "Item " << item << "" << oendl;
00392
00393
00394
00395 switch(item) {
00396 case -8:
00397 doEdit() ;
00398 break;
00399
00400 }
00401 }
00402