#
#  Copyright (c) 1997-2002 The Protein Laboratory, University of Copenhagen
#  All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions
#  are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
#  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
#  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
#  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
#  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
#  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
#  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
#  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
#  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
#  SUCH DAMAGE.
#
#  $Id$
#
#  Example of listbox extended usage
#

=pod 
=item NAME

Prima listbox, combobox and widget example

=item FEATURES

Demonstrates the usage of Prima::Edit, Prima::ComboBox
and Prima::ListBox widgets. 

=cut

use strict;
use Prima qw( ComboBox Edit Application );


package TestWindow;
use vars qw(@ISA);
@ISA = qw(Prima::MainWindow);

sub create_menu
{
	return [
		[ "~ListBox" => [
			["~Add text" => "AddItem"],
			["~Delete current" => sub{$_[0]-> ListBox1-> delete_items( $_[0]-> ListBox1-> focusedItem);}],
			["Delete a~ll" => sub{$_[0]-> ListBox1-> delete_items(0..$_[0]-> ListBox1-> count )}],
			[],
			["~Print all" => "PrintAll"],
			["Print ~selected" => sub{foreach (@{$_[0]-> ListBox1-> selectedItems}){print "$_\n"};}],
			["Print ~focused" => sub{ print $_[0]-> ListBox1-> focusedItem."\n";}],
			[],
			["Toggle ~extended selection"=> sub{$_[0]-> ListBox1-> extendedSelect(!$_[0]-> ListBox1-> extendedSelect)}],
			["Toggle ~multiple selection"=> sub{$_[0]-> ListBox1-> multiSelect(!$_[0]-> ListBox1-> multiSelect)}],
			["~Increase item height"=>sub{$_[0]-> ListBox1-> itemHeight($_[0]-> ListBox1-> itemHeight+2)}],
			["~Decrease item height"=>sub{$_[0]-> ListBox1-> itemHeight($_[0]-> ListBox1-> itemHeight-2)}],
			[],
			["Add~itional"=> sub {
				my $box  = $_[0]-> ListBox1;
				$box-> add_items( 'Hello', 'user', 'from', 'Perl');
			}]
		]],
	[
		"~Edit" => [
			["~VScroll" => sub{$_[0]-> Edit1-> vScroll(!$_[0]-> Edit1-> vScroll)}],
			["~HScroll" => sub{$_[0]-> Edit1-> hScroll(!$_[0]-> Edit1-> hScroll)}],
			["B~oth" => sub{
				$_[0]-> Edit1-> set( hScroll => !$_[0]-> Edit1-> hScroll,
										vScroll => !$_[0]-> Edit1-> vScroll)
			}],
			["~Border" => sub{$_[0]-> Edit1-> borderWidth(!$_[0]-> Edit1-> borderWidth)}],
	]],
	[ "~ComboBox" => [
			["~Add text" => "AddItemC"],
			["Delete a~ll" => sub{$_[0]-> ComboBox1-> List-> delete_items( 0..$_[0]-> ComboBox1-> List-> count) }],
			["Print ~text" => sub{ print $_[0]-> ComboBox1-> text."\n";}],
			[],
			["~Set style" => [
				[ "~Simple" => sub {$_[0]-> ComboBox1-> style(cs::Simple)}],
				[ "~Drop down" => sub {$_[0]-> ComboBox1-> style(cs::DropDown)}],
				[ "Drop down ~list" => sub {$_[0]-> ComboBox1-> style(cs::DropDownList)}],
			]],
			[],
			["Add~itional"=> sub{
				my $box  = $_[0]-> ComboBox1-> List;
				$box-> add_items( 'Hello', 'user', 'from', 'Perl');
			}]
		]],
	];
}


sub AddItem
{
	my $self = shift;
	$self-> ListBox1-> add_items( $self-> InputLine1-> text);
}

sub AddItemC
{
	my $self = shift;
	$self-> ComboBox1-> List-> add_items( $self-> InputLine1-> text);
}


sub PrintAll
{
	my $self = shift;
	print( "$_\n") for @{$self-> ListBox1-> items};
}


my $w = TestWindow-> create(
	name    =>  "Window1",
	origin  => [ 100, 100],
	size    => [ 600, 230],
	text => "List & edit boxes example",
	menuItems => TestWindow::create_menu,
);

$w-> insert("InputLine", pack => {side => 'bottom', fill => 'x', padx => 20, pady => 20 });

$w-> insert( "ListBox",
	hScroll        => 1,
	multiSelect    => 0,
	extendedSelect => 1,
	dragable        => 1,
	name            => 'ListBox1',
	font            => { size => 24},
	items           => ['Items', 'created', 'indirect'],
	pack            => { side => 'left', expand => 1, fill => 'both', padx => 20, pady => 20},
);
$w-> insert( "Edit",
	maxLen         => 200,
	name           => 'Edit1',
	hScroll        => 1,
	vScroll        => 1,
	wantReturns    => 0,
	pack            => { side => 'left', expand => 1, fill => 'both', padx => 20, pady => 20},
);
$w-> insert( "ComboBox",
	name           => 'ComboBox1',
	items          => ['Combo', 'box', 'salutes', 'you!'],
	pack            => { side => 'left', expand => 1, fill => 'both', padx => 20, pady => 20},
);

run Prima;
