void DisplayFlagWidget::findChildren(Q3CheckListItem *item, std::vector<Q3CheckListItem* > &children)
{
    Q3CheckListItem * child = (Q3CheckListItem * )item->firstChild();
    while(child)
    {
        children.push_back(child);
        findChildren(child,children);
        child = (Q3CheckListItem * )child->nextSibling();
    }
}
void RecipeImportDialog::loadListView()
{
    CustomCheckListItem * head_item = new CustomCheckListItem( kListView, i18nc( "@item:inlistbox All items", "All (%1)", list_copy.count() ), Q3CheckListItem::CheckBox );
    head_item->setOpen( true );

    //get all categories
    QStringList 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 ) == false )
                categoryList << ( *cat_it ).name;
        }
    }

    //create all category check list items
    Q3Dict<CustomCheckListItem> all_categories;

    QStringList::iterator it;
    for ( it = categoryList.begin(); it != categoryList.end(); ++it ) {
        CustomCheckListItem *category_item = new CustomCheckListItem( head_item, *it, Q3CheckListItem::CheckBox );
        //category_item->setOpen(true);

        all_categories.insert( *it, category_item );
    }

    //add recipes to category check list items
    recipe_items = new QMap<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, i18nc( "@item", "Uncategorized" ), Q3CheckListItem::CheckBox );
                all_categories.insert( i18nc( "@item", "Uncategorized" ), category_item );
            }
            CustomCheckListItem *item = new CustomCheckListItem( category_item, ( *recipe_it ).title, Q3CheckListItem::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, Q3CheckListItem::CheckBox );
                recipe_items->insert( item, recipe_it );
            }
        }
    }

    //append the number of recipes in each category to the check list item text
    Q3DictIterator<CustomCheckListItem> categories_it( all_categories );
    for ( ; categories_it.current(); ++categories_it ) {
        int count = 0;
        for ( Q3CheckListItem * it = static_cast<Q3CheckListItem*>( categories_it.current() ->firstChild() ); it; it = static_cast<Q3CheckListItem*>( it->nextSibling() ) ) {
            count++;
        }
        categories_it.current() ->setText( 0, categories_it.current() ->text( 0 ) + QString( " (%1)" ).arg( count ) );
    }

    head_item->setOn( true ); //this will check all recipes
}
void CustomCheckListItem::stateChange( bool on )
{
    if ( !m_locked ) {
        for ( Q3CheckListItem * it = static_cast<Q3CheckListItem*>( firstChild() ); it; it = static_cast<Q3CheckListItem*>( it->nextSibling() ) ) {
            it->setOn( on );
        }
    }

    if ( !on ) {
        Q3ListViewItem * parent = this->parent();
        if ( parent && ( parent->rtti() == 1 ) ) {
            CustomCheckListItem * item = static_cast<CustomCheckListItem*>( parent );
            item->setLocked( true );
            item->setOn( on );
            item->setLocked( false );
        }
    }

    QString thisText = text(0);
    Q3ListViewItemIterator 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;
    }
}