/usr/local/CPAN/RT-Client-Console/RT/Client/Console/Session/Root.pm


package RT::Client::Console::Session::Root;

use strict;
use warnings;

use parent qw(RT::Client::Console::Session);

use Params::Validate qw(:all);
use POE;
use relative -to => "RT::Client::Console", 
        -aliased => qw(Connection Session);
use relative -to => "RT::Client::Console::Session", 
        -aliased => qw(Progress Status TabBar Ticket);

use Curses::Forms::Dialog;
use List::MoreUtils qw(any);

# class method

# root session creation
sub create {
    my ($class) = @_;

    $class->SUPER::create(
    'root',
    inline_states => {
        init => sub {
            my ($kernel, $heap) = @_[ KERNEL, HEAP ];
            $class->get_curses_handler()->clear();
            $kernel->yield('create_tab_bar');
#            $kernel->yield('create_status_session');
            $kernel->yield('create_progress_session');

            # the root session is special, it's the only one handling the
            # window size change signal. It takes care of changing it to events
            $kernel->sig(WINCH => 'sig_window_resize');

            $heap->{'pos_x'} = 0;
            $heap->{height} = 1;

        },
        sig_window_resize => sub { 
            my ($kernel, $heap) = @_[ KERNEL, HEAP];
            $class->restart_curses();
			my %sessions = $class->get_sessions();
			my @sessions_names = keys(%sessions);
			# send the window_resize to all sessions (including root)
			foreach my $name (@sessions_names) {
				# window resize signal provided by default (see Session.pm)
				$kernel->call($name, '__window_resize');
			}
        },
        window_resize => sub {
            my ($kernel, $heap, $old_screen_h, $old_screen_w) = @_[ KERNEL, HEAP, ARG0, ARG1 ];
            $heap->{pos_y} = $heap->{screen_h} - 2;
            $heap->{width} = $heap->{screen_w};
        },
        available_keys => sub {
            my @available_list = ();
            my $rt_handler = Connection->get_cnx_data()->{handler};
            push @available_list, ['?', 'help', 'help'];
            push @available_list, ['q', 'quit', 'quit'];
            if (!$rt_handler) {
                push @available_list, ['s', 'connect to RT server', 'connect_server'];
            } else {
                push @available_list, ['d', 'disconnect', 'disconnect_server'];
                push @available_list, ['a', 'add a new ticket', 'add_ticket'];
                push @available_list, ['o', 'open a ticket', 'open_ticket'];
                if (defined Ticket->get_current_id()) {
                    push @available_list, ['c', 'close current tab', 'close_tab'];
                    push @available_list, ['p', 'prev. tab', 'prev_tab'];
                    push @available_list, ['n', 'next tab', 'next_tab'];
                    if (Ticket->get_current_ticket()->has_changed()) {
                        push @available_list, ['s', 'save ticket', 'store_ticket'];
                    }
                }
            }
            return @available_list;
        },
        draw => sub {
            my ($kernel, $heap) = @_[ KERNEL, HEAP ];
            my @keys = $kernel->call(root => 'available_keys');
            $class->draw_keys_label( Y => $heap->{pos_y},
                                     X => $heap->{pos_x},
                                     COLUMNS => $heap->{width},
                                     VALUE => \@keys,
                                     erase_before => 1,
                                   );
        },
        help => sub {
            my ($kernel, $heap) = @_[ KERNEL, HEAP ];
             my %sessions = $class->get_sessions();
            my $text = '';
             while (my ($session_name, $struct) = each %sessions) {
                 $struct->{displayed} or next;
                 my @list = $kernel->call($session_name, 'available_keys');
                 @list > 0 && any { ref && defined $_->[0] } @list or next;
                 $text .= "\n * $session_name\n";
                 foreach (@list) {
                     defined && ref or next;
                     my ($key, $message) = @$_;
                     defined $key or next;
                     $key =~ s/^<//;
                     $key =~ s/>$//;
                     $text .= "    $key: $message \n";
                 }
             }
            $text .= "\n";
            $class->create_choice_modal( title => 'available keys',
                                         text => $text,
                                       );
        },
        quit => sub {
            my ($kernel, $heap) = @_[ KERNEL, HEAP ];
            Session->remove_all();
        },
        create_tab_bar => sub {
            TabBar->create();
        },
        create_status_session => sub {
            Status->create();
        },
        create_progress_session => sub {
            Progress->create();
        },
        connect_server => sub {
            Connection->connect();
        },
        disconnect_server => sub {
            Connection->disconnect();
        },
        open_ticket => sub {
            Ticket->load();
        },
        add_ticket => sub {
            Ticket->create();
        },
        close_tab => sub {
            Ticket->get_current_ticket()->unload();
        },
        next_tab => sub {
            Ticket->next_ticket();
        },
        prev_tab => sub {
            Ticket->prev_ticket();
        },
        store_ticket => sub {
            Ticket->save_current_if_needed();
        }
    }
    );
}

1;