/***************************************************************************
* $Id$
**
* Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
**
* This file is part of an example program for Qt.  This example
* program may be used, distributed and modified without limitation.
**
****************************************************************************/
import org.kde.qt.*;
import java.util.*;

class CheckLists  extends QWidget
{

protected QListView lv1, lv2;
protected QLabel label;

/*
  Constructor
 *
  Create all child widgets of the CheckList Widget
 */

CheckLists( )
{
	this(null, null);
}

CheckLists( QWidget parent, String name )
{
    super( parent, name );
    QHBoxLayout lay = new QHBoxLayout( this );
    lay.setMargin( 5 );

    // create a widget which layouts its childs in a column
    QVBoxLayout vbox1 = new QVBoxLayout( lay );
    vbox1.setMargin( 5 );

    // First child: a Label
    vbox1.addWidget( new QLabel( "Check some items!", this ) );

    // Second child: the ListView
    lv1 = new QListView( this );
    vbox1.addWidget( lv1 );
    lv1.addColumn( "Items" );
    lv1.setRootIsDecorated( true );

    // create a list with 4 ListViewItems which will be parent items of other ListViewItems
    ArrayList parentList = new ArrayList();

    parentList.add( new QListViewItem( lv1, "Parent Item 1" ) );
    parentList.add( new QListViewItem( lv1, "Parent Item 2" ) );
    parentList.add( new QListViewItem( lv1, "Parent Item 3" ) );
    parentList.add( new QListViewItem( lv1, "Parent Item 4" ) );

    QListViewItem item = null;
    int num = 1;
    // go through the list of parent items...
    for ( Iterator it = parentList.iterator(); it.hasNext(); num++ ) {
	item = (QListViewItem) it.next();
	item.setOpen( true );
	// ...and create 5 checkable child ListViewItems for each parent item
	for ( int i = 1; i <= 5; i++ )
	    new QCheckListItem( item, i + ". Child of Parent " + num, QCheckListItem.CheckBox );
    }

    // Create another widget for layouting
    QVBoxLayout tmp = new QVBoxLayout( lay );
    tmp.setMargin( 5 );

    // create a pushbutton
    QPushButton copy1 = new QPushButton( "  ->  ", this );
    tmp.addWidget( copy1 );
    copy1.setMaximumWidth( copy1.sizeHint().width() );
    // connect the SIGNAL clicked() of the pushbutton with the SLOT copy1to2()
    connect( copy1, SIGNAL(" clicked()"), this, SLOT(" copy1to2()") );

    // another widget for layouting
    QVBoxLayout vbox2 = new QVBoxLayout( lay );
    vbox2.setMargin( 5 );

    // and another label
    vbox2.addWidget( new QLabel( "Check one item!", this ) );

    // create the second listview
    lv2 = new QListView( this );
    vbox2.addWidget( lv2 );
    lv2.addColumn( "Items" );
    lv2.setRootIsDecorated( true );

    // another widget needed for layouting only
    tmp = new QVBoxLayout( lay );
    tmp.setMargin( 5 );

    // create another pushbutton...
    QPushButton copy2 = new QPushButton( "  ->  ", this );
    lay.addWidget( copy2 );
    copy2.setMaximumWidth( copy2.sizeHint().width() );
    // ...and connect its clicked() SIGNAL to the copy2to3() SLOT
    connect( copy2, SIGNAL(" clicked()"), this, SLOT(" copy2to3()") );

    tmp = new QVBoxLayout( lay );
    tmp.setMargin( 5 );

    // and create a label which will be at the right of the window
    label = new QLabel( "No Item yet...", this );
    tmp.addWidget( label );
}

/*
  SLOT copy1to2()
 *
  Copies all checked ListViewItems from the first ListView to
  the second one, and inserts them as Radio-ListViewItem.
 */

public void copy1to2()
{
    // create an iterator which operates on the first ListView
    Iterator it = lv1.itemList().iterator();

    lv2.clear();

    // Insert first a controller Item into the second ListView. Always if Radio-ListViewItems
    // are inserted into a Listview, the parent item of these MUST be a controller Item!
    QCheckListItem item = new QCheckListItem( lv2, "Controller", QCheckListItem.Controller );
    item.setOpen( true );

    // iterate through the first ListView...
    while ( it.hasNext() ) {
		QListViewItem current = (QListViewItem) it.next();
	// ...check state of childs, and...
	if ( current.parent() != null )
	    // ...if the item is checked...
	    if ( ( (QCheckListItem) current ).isOn() )
		// ...insert a Radio-ListViewItem with the same text into the second ListView
		new QCheckListItem( item, current.text( 0 ), QCheckListItem.RadioButton );

	}
    if ( item.firstChild() != null )
	( ( QCheckListItem )item.firstChild() ).setOn( true );
}

/*
  SLOT copy2to3()
 *
  Copies the checked item of the second ListView into the
  Label at the right.
 */

public void copy2to3()
{
    // create an iterator which operates on the second ListView
    Iterator it = lv2.itemList().iterator();

    label.setText( "No Item checked" );

    // iterate through the second ListView...
    while ( it.hasNext() ) {
		QListViewItem current = (QListViewItem) it.next();
	// ...check state of childs, and...
	if ( current.parent() != null )
	    // ...if the item is checked...
	    if ( ( (QCheckListItem) current ).isOn() )
		// ...set the text of the item to the label
		label.setText( current.text( 0 ) );
	}
}
}

