/*************************************************************************** * Copyright (C) 2004 by * * Jason Kivlighn (jkivlighn@gmail.com) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * ***************************************************************************/ #include "ingredientlistview.h" #include #include #include #include #include #include #include "backends/recipedb.h" #include "dialogs/createelementdialog.h" #include "dialogs/dependanciesdialog.h" IngredientCheckListItem::IngredientCheckListItem( IngredientCheckListView* qlv, const Element &ing ) : TQCheckListItem( qlv, TQString::null, TQCheckListItem::CheckBox ), m_listview(qlv) { // Initialize the ingredient data with the the property data ingStored = new Element(); ingStored->id = ing.id; ingStored->name = ing.name; } IngredientCheckListItem::IngredientCheckListItem( IngredientCheckListView* qlv, TQListViewItem *after, const Element &ing ) : TQCheckListItem( qlv, after, TQString::null, TQCheckListItem::CheckBox ), m_listview(qlv) { // Initialize the ingredient data with the the property data ingStored = new Element(); ingStored->id = ing.id; ingStored->name = ing.name; } IngredientCheckListItem::~IngredientCheckListItem( void ) { delete ingStored; } int IngredientCheckListItem::id( void ) const { return ingStored->id; } TQString IngredientCheckListItem::name( void ) const { return ingStored->name; } Element IngredientCheckListItem::ingredient() const { return *ingStored; } TQString IngredientCheckListItem::text( int column ) const { switch ( column ) { case 0: return ( ingStored->name ); case 1: return ( TQString::number( ingStored->id ) ); default: return TQString::null; } } void IngredientCheckListItem::stateChange( bool on ) { m_listview->stateChange(this,on); } IngredientListView::IngredientListView( TQWidget *parent, RecipeDB *db ) : DBListViewBase( parent,db, db->ingredientCount() ) { setAllColumnsShowFocus( true ); setDefaultRenameAction( TQListView::Reject ); } void IngredientListView::init() { connect( database, TQ_SIGNAL( ingredientCreated( const Element & ) ), TQ_SLOT( checkCreateIngredient( const Element & ) ) ); connect( database, TQ_SIGNAL( ingredientRemoved( int ) ), TQ_SLOT( removeIngredient( int ) ) ); } void IngredientListView::load( int limit, int offset ) { ElementList ingredientList; database->loadIngredients( &ingredientList, limit, offset ); setTotalItems(ingredientList.count()); for ( ElementList::const_iterator ing_it = ingredientList.begin(); ing_it != ingredientList.end(); ++ing_it ) createIngredient( *ing_it ); } void IngredientListView::checkCreateIngredient( const Element &el ) { if ( handleElement(el.name) ) { //only create this ingredient if the base class okays it createIngredient(el); } } StdIngredientListView::StdIngredientListView( TQWidget *parent, RecipeDB *db, bool editable ) : IngredientListView( parent, db ) { addColumn( i18n( "Ingredient" ) ); TDEConfig * config = TDEGlobal::config(); config->setGroup( "Advanced" ); bool show_id = config->readBoolEntry( "ShowID", false ); addColumn( i18n( "Id" ), show_id ? -1 : 0 ); if ( editable ) { setRenameable( 0, true ); TDEIconLoader *il = new TDEIconLoader; kpop = new TDEPopupMenu( this ); kpop->insertItem( il->loadIcon( "document-new", TDEIcon::NoGroup, 16 ), i18n( "&Create" ), this, TQ_SLOT( createNew() ), CTRL + Key_C ); kpop->insertItem( il->loadIcon( "edit-delete", TDEIcon::NoGroup, 16 ), i18n( "&Delete" ), this, TQ_SLOT( remove () ), Key_Delete ); kpop->insertItem( il->loadIcon( "edit", TDEIcon::NoGroup, 16 ), i18n( "&Rename" ), this, TQ_SLOT( rename() ), CTRL + Key_R ); kpop->polish(); delete il; connect( this, TQ_SIGNAL( contextMenu( TDEListView *, TQListViewItem *, const TQPoint & ) ), TQ_SLOT( showPopup( TDEListView *, TQListViewItem *, const TQPoint & ) ) ); connect( this, TQ_SIGNAL( doubleClicked( TQListViewItem* ) ), this, TQ_SLOT( modIngredient( TQListViewItem* ) ) ); connect( this, TQ_SIGNAL( itemRenamed( TQListViewItem* ) ), this, TQ_SLOT( saveIngredient( TQListViewItem* ) ) ); } } void StdIngredientListView::showPopup( TDEListView * /*l*/, TQListViewItem *i, const TQPoint &p ) { if ( i ) kpop->exec( p ); } void StdIngredientListView::createNew() { CreateElementDialog * elementDialog = new CreateElementDialog( this, i18n( "New Ingredient" ) ); if ( elementDialog->exec() == TQDialog::Accepted ) { TQString result = elementDialog->newElementName(); if ( checkBounds( result ) ) database->createNewIngredient( result ); // Create the new author in the database } } void StdIngredientListView::remove () { TQListViewItem * it = currentItem(); if ( it ) { int ingredientID = it->text( 1 ).toInt(); ElementList dependingRecipes; database->findIngredientDependancies( ingredientID, &dependingRecipes ); if ( dependingRecipes.isEmpty() ) database->removeIngredient( ingredientID ); else { // Need Warning! ListInfo list; list.list = dependingRecipes; list.name = i18n( "Recipes" ); DependanciesDialog warnDialog( this, list ); warnDialog.setCustomWarning( i18n("You are about to permanantly delete recipes from your database.") ); if ( warnDialog.exec() == TQDialog::Accepted ) database->removeIngredient( ingredientID ); } } } void StdIngredientListView::rename() { TQListViewItem * item = currentItem(); if ( item ) IngredientListView::rename( item, 0 ); } void StdIngredientListView::createIngredient( const Element &ing ) { createElement(new TQListViewItem( this, ing.name, TQString::number( ing.id ) )); } void StdIngredientListView::removeIngredient( int id ) { TQListViewItem * item = findItem( TQString::number( id ), 1 ); removeElement(item); } void StdIngredientListView::modIngredient( TQListViewItem* i ) { if ( i ) IngredientListView::rename( i, 0); } void StdIngredientListView::saveIngredient( TQListViewItem* i ) { if ( !checkBounds( i->text( 0 ) ) ) { reload(ForceReload); //reset the changed text return ; } int existing_id = database->findExistingIngredientByName( i->text( 0 ) ); int ing_id = i->text( 1 ).toInt(); if ( existing_id != -1 && existing_id != ing_id ) //category already exists with this label... merge the two { switch ( KMessageBox::warningContinueCancel( this, i18n( "This ingredient already exists. Continuing will merge these two ingredients into one. Are you sure?" ) ) ) { case KMessageBox::Continue: { database->mergeIngredients( existing_id, ing_id ); break; } default: reload(ForceReload); break; //we have to reload because the ingredient was renamed, and we need to reset it } } else { database->modIngredient( ( i->text( 1 ) ).toInt(), i->text( 0 ) ); } } bool StdIngredientListView::checkBounds( const TQString &name ) { if ( name.length() > uint(database->maxIngredientNameLength()) ) { KMessageBox::error( this, TQString( i18n( "Ingredient name cannot be longer than %1 characters." ) ).arg( database->maxIngredientNameLength() ) ); return false; } return true; } IngredientCheckListView::IngredientCheckListView( TQWidget *parent, RecipeDB *db ) : IngredientListView( parent, db ) { addColumn( i18n( "Ingredient" ) ); TDEConfig *config = TDEGlobal::config(); config->setGroup( "Advanced" ); bool show_id = config->readBoolEntry( "ShowID", false ); addColumn( i18n( "Id" ), show_id ? -1 : 0 ); } void IngredientCheckListView::createIngredient( const Element &ing ) { createElement(new IngredientCheckListItem( this, ing )); } void IngredientCheckListView::removeIngredient( int id ) { TQListViewItem * item = findItem( TQString::number( id ), 1 ); removeElement(item); } void IngredientCheckListView::load( int limit, int offset ) { IngredientListView::load(limit,offset); for ( TQValueList::const_iterator ing_it = m_selections.begin(); ing_it != m_selections.end(); ++ing_it ) { TQCheckListItem * item = ( TQCheckListItem* ) findItem( TQString::number( (*ing_it).id ), 1 ); if ( item ) { item->setOn(true); } } } void IngredientCheckListView::stateChange(IngredientCheckListItem *it,bool on) { if ( !reloading() ) { if ( on ) m_selections.append(it->ingredient()); else m_selections.remove(it->ingredient()); } } #include "ingredientlistview.moc"