summaryrefslogtreecommitdiffstats
path: root/src/dialogs/recipeimportdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/dialogs/recipeimportdialog.cpp')
-rw-r--r--src/dialogs/recipeimportdialog.cpp185
1 files changed, 185 insertions, 0 deletions
diff --git a/src/dialogs/recipeimportdialog.cpp b/src/dialogs/recipeimportdialog.cpp
new file mode 100644
index 0000000..cbc3dcf
--- /dev/null
+++ b/src/dialogs/recipeimportdialog.cpp
@@ -0,0 +1,185 @@
+/***************************************************************************
+* Copyright (C) 2003 by *
+* Unai Garro ([email protected]) *
+* Cyril Bosselut ([email protected]) *
+* Jason Kivlighn ([email protected]) *
+* *
+* 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 "recipeimportdialog.h"
+
+#include <tdelocale.h>
+#include <kpushbutton.h>
+#include <tdelistview.h>
+#include <kdebug.h>
+
+#include <tqvbox.h>
+#include <tqlayout.h>
+#include <tqheader.h>
+#include <tqvariant.h>
+#include <tqdict.h>
+
+#include "datablocks/recipe.h"
+
+RecipeImportDialog::RecipeImportDialog( const RecipeList &list, TQWidget *parent )
+ : KDialogBase( parent, "RecipeImportDialog", true, i18n( "Import Recipes" ),
+ KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok ),
+ list_copy( list )
+{
+ setButtonBoxOrientation( Vertical );
+
+ TQVBox *page = makeVBoxMainWidget();
+
+ kListView = new TDEListView( page );
+ kListView->addColumn( i18n( "Recipes" ) );
+ kListView->setProperty( "selectionMode", "NoSelection" );
+ kListView->setRootIsDecorated( true );
+ kListView->setAllColumnsShowFocus( true );
+
+ languageChange();
+
+ setInitialSize( TQSize( 600, 480 ).expandedTo( minimumSizeHint() ) );
+
+ loadListView();
+}
+
+RecipeImportDialog::~RecipeImportDialog()
+{
+ delete recipe_items;
+}
+
+void RecipeImportDialog::languageChange()
+{
+}
+
+void RecipeImportDialog::loadListView()
+{
+ CustomCheckListItem * head_item = new CustomCheckListItem( kListView, TQString( i18n( "All (%1)" ) ).arg( list_copy.count() ), TQCheckListItem::CheckBox );
+ head_item->setOpen( true );
+
+ //get all categories
+ TQStringList categoryList;
+
+ RecipeList::const_iterator recipe_it;
+ for ( recipe_it = list_copy.begin(); recipe_it != list_copy.end(); ++recipe_it ) {
+ for ( ElementList::const_iterator cat_it = ( *recipe_it ).categoryList.begin(); cat_it != ( *recipe_it ).categoryList.end(); ++cat_it ) {
+ if ( categoryList.contains( ( *cat_it ).name ) < 1 )
+ categoryList << ( *cat_it ).name;
+ }
+ }
+
+ //create all category check list items
+ TQDict<CustomCheckListItem> all_categories;
+
+ TQStringList::iterator it;
+ for ( it = categoryList.begin(); it != categoryList.end(); ++it ) {
+ CustomCheckListItem *category_item = new CustomCheckListItem( head_item, *it, TQCheckListItem::CheckBox );
+ //category_item->setOpen(true);
+
+ all_categories.insert( *it, category_item );
+ }
+
+ //add recipes to category check list items
+ recipe_items = new TQMap<CustomCheckListItem*, RecipeList::const_iterator>; //we won't be able to identify a recipe later if we just put a value in here. The iterator will be unique so we'll use it. This is safe since the list is constant (iterators won't become invlalid).
+
+ CustomCheckListItem *item = 0;
+ CustomCheckListItem *category_item = 0;
+
+ for ( recipe_it = list_copy.begin(); recipe_it != list_copy.end(); ++recipe_it ) {
+ if ( ( *recipe_it ).categoryList.count() == 0 ) {
+ if ( !category_item ) //don't create this until there are recipes to put in it
+ {
+ category_item = new CustomCheckListItem( head_item, i18n( "Uncategorized" ), TQCheckListItem::CheckBox );
+ all_categories.insert( i18n( "Uncategorized" ), category_item );
+ }
+ CustomCheckListItem *item = new CustomCheckListItem( category_item, ( *recipe_it ).title, TQCheckListItem::CheckBox );
+ recipe_items->insert( item, recipe_it );
+ }
+ else {
+ for ( ElementList::const_iterator cat_it = ( *recipe_it ).categoryList.begin(); cat_it != ( *recipe_it ).categoryList.end(); ++cat_it ) {
+
+ CustomCheckListItem *category_item = all_categories[ ( *cat_it ).name ];
+
+ item = new CustomCheckListItem( category_item, item, ( *recipe_it ).title, TQCheckListItem::CheckBox );
+ recipe_items->insert( item, recipe_it );
+ }
+ }
+ }
+
+ //append the number of recipes in each category to the check list item text
+ TQDictIterator<CustomCheckListItem> categories_it( all_categories );
+ for ( ; categories_it.current(); ++categories_it ) {
+ int count = 0;
+ for ( TQCheckListItem * it = static_cast<TQCheckListItem*>( categories_it.current() ->firstChild() ); it; it = static_cast<TQCheckListItem*>( it->nextSibling() ) ) {
+ count++;
+ }
+ categories_it.current() ->setText( 0, categories_it.current() ->text( 0 ) + TQString( " (%1)" ).arg( count ) );
+ }
+
+ head_item->setOn( true ); //this will check all recipes
+}
+
+RecipeList RecipeImportDialog::getSelectedRecipes()
+{
+ RecipeList selected_recipes;
+
+ TQValueList<RecipeList::const_iterator> already_included_recipes;
+
+ TQMap<CustomCheckListItem*, RecipeList::const_iterator>::const_iterator it;
+ for ( it = recipe_items->begin(); it != recipe_items->end(); ++it ) {
+ if ( static_cast<CustomCheckListItem*>( it.key() ) ->isOn() &&
+ ( already_included_recipes.contains( it.data() ) == 0 ) ) //make sure it isn't already in the list
+ {
+ already_included_recipes.prepend( it.data() );
+ selected_recipes.prepend( *it.data() );
+ }
+ }
+
+ return selected_recipes;
+}
+
+CustomCheckListItem::CustomCheckListItem( TQListView *parent, const TQString & s, Type t )
+ : TQCheckListItem( parent, s, t ), m_locked( false )
+{}
+
+CustomCheckListItem::CustomCheckListItem( CustomCheckListItem *parent, const TQString & s, Type t )
+ : TQCheckListItem( parent, s, t ), m_locked( false )
+{}
+
+CustomCheckListItem::CustomCheckListItem( TQCheckListItem *parent, TQCheckListItem *after, const TQString & s, Type t )
+ : TQCheckListItem( parent, after, s, t ), m_locked( false )
+{}
+
+void CustomCheckListItem::stateChange( bool on )
+{
+ if ( !m_locked ) {
+ for ( TQCheckListItem * it = static_cast<TQCheckListItem*>( firstChild() ); it; it = static_cast<TQCheckListItem*>( it->nextSibling() ) ) {
+ it->setOn( on );
+ }
+ }
+
+ if ( !on ) {
+ TQListViewItem * parent = this->parent();
+ if ( parent && ( parent->rtti() == 1 ) ) {
+ CustomCheckListItem * item = static_cast<CustomCheckListItem*>( parent );
+ item->setLocked( true );
+ item->setOn( on );
+ item->setLocked( false );
+ }
+ }
+
+ TQString thisText = text(0);
+ TQListViewItemIterator it( listView() );
+ while ( it.current() ) {
+ if ( it.current()->rtti() == 1 && it.current()->text(0) == thisText ) {
+ CustomCheckListItem * item = static_cast<CustomCheckListItem*>( it.current() );
+ item->setOn( on );
+ }
+ ++it;
+ }
+}
+