Curses-UI

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

		  a language module of your own, please send it to 
		  me. I'll then include it in the distribution.

                - Changed all year 2001 occurrances in the Changelog
		  to 2002. Thanks to Mark Overmeer (mr. Mail::Box) for
		  noticing that I was one year off ;-)

                - Made sure that upon deleting a widget from a
                  container, its subwindows are deleted.

                - Created calendar dialog (request made by Ravi Pina).
		  Also added a little demo to demo-widgets for this
		  new dialog type. The dialog is accessable via
		  Curses::UI ($cui->calendardialog).

		- Changed the unpacking of mouse events a little
		  (thanks to William Setzer for the hint on
		  unpack("sx2i3l", $MEVENT) instead of
		  unpack("i5", $MEVENT)). 

Version 0.70
============

2002-01-31      - After a lot of hacking on the resize code

Changes  view on Meta::CPAN

                  documentation of each Curses::UI class.

                - All focusable objects now have the following 
                  event callbacks:
                  -onfocus / onFocus()
                  -onblur  / onBlur()

                - The Curses::UI::Calendar widget now fully
                  supports the years 0 - 9999, including the
                  transition from the Julian to the Gregorian
                  calendar (september 1752). This beats the
                  use of timelocal/localtime (which would 
                  currently only support 1900 - 2038 IIRC).

                - Added intellidraw() method to Curses::UI::Widget.
                  If this method is called, the widget is redrawn, but
                  only if it's visible (not hidden and in topwindow)
                  and if intellidraw is enabled (-intellidraw data 
                  member has a true value).

                  This routine can be used to be able to redraw 

Changes  view on Meta::CPAN

                  - Curses::UI::Listbox (+ descendants)
                  - Curses::UI::Checkbox
                  - Curses::UI::Popupbox
                  - Curses::UI::Progressbar
                  - Curses::UI::TextEditor (+ descendants)
                  - Curses::UI::SearchEntry

                - Added a little example application to demonstrate
                  the new intellidraw feature: examples/demo-intellidraw 

2002-01-15:     - Changed the displaying of the calendar widget
                  a little. The topbar showing a date is only 
                  highlighted if the cursor is on the selected date.
	
                - Renamed some widgets (now we still can). I think
                  there are too many capitals in them...
                  - Curses::UI::ListBox renamed to
                    Curses::UI::Listbox
                  - Curses::UI::CheckBox renamed to
                    Curses::UI::Checkbox
                  - Curses::UI::MenuBar renamed to

examples/demo-widgets  view on Meta::CPAN


$w{7}->onFocus( sub{$cui->enable_timer  ('progressbar_demo')} );
$w{7}->onBlur(  sub{$cui->disable_timer ('progressbar_demo')} );

# ----------------------------------------------------------------------
# Calendar
# ----------------------------------------------------------------------

$w{8}->add(
    undef, 'Label',
    -text => "The calendar can be used to select a date, somewhere between\n"
           . "the years 0 and 9999. It honours the transition from the\n"
	   . "Julian- to the Gregorian calender in 1752."
);

$w{8}->add(
    undef, 'Label',
    -y => 5, -x => 27,
    -text => "Use your cursor keys (or <H>, <J>, <K> and <L>)\n"
           . "to walk through the calender. Press <ENTER>\n"
	   . "or <SPACE> to select a date. Press <SHIFT+J> to\n"
	   . "go one month forward and <SHIFT+K> to go one\n"
	   . "month backward. Press <SHIFT+L> or <N> to go one\n"
	   . "year forward and <SHIFT+H> or <P> to go one year\n"
	   . "backward. Press <T> to go to today's date. Press\n"
	   . "<C> to go to the currently selected date."
);

$w{8}->add(
    'calendarlabel', 'Label',
    -y => 14, -x => 27,
    -bold => 1,
    -width => -1,
    -text => 'Select a date please...'
);

$w{8}->add(
    'calendar', 'Calendar',
    -y => 4, -x => 0,
    -border => 1,
    -onchange => sub {
        my $cal = shift;
	my $label = $cal->parent->getobj('calendarlabel'); 
	$label->text("You selected the date: " . $cal->get);
    },
);

# ----------------------------------------------------------------------
# Dialog::Basic
# ----------------------------------------------------------------------

$w{9}->add(
    undef, 'Label',

examples/demo-widgets  view on Meta::CPAN

    ]
);

# ----------------------------------------------------------------------
# Dialog::Calendar
# ----------------------------------------------------------------------

$w{14}->add(
    undef, 'Label',
    -text => "Curses::UI has a number of ready-to-use dialog windows.\n"
           . "The calendar dialog is one of them. Using this dialog\n"
	   . "it is possible to select a date."
);

$w{14}->add( undef,  'Label', -y => 7, -text => 'Date:' );
$w{14}->add( 
    'datelabel', 'Label', 
    -width => 10, 
    -y => 7, 
    -x => 6, 
    -text => 'none',

examples/demo-widgets  view on Meta::CPAN

    -y => 7,    
    -x => 17,
    -buttons => [
         { 
	   -label => "< Set date >",
	   -onpress => sub { 
	       my $label = shift()->parent->getobj('datelabel');
	       my $date = $label->get;
	       print STDERR "$date\n";
	       $date = undef if $date eq 'none';
	       my $return = $cui->calendardialog(-date => $date);
	       $label->text($return) if defined $return;
	   }
         },{
	   -label => "< Clear date >",
	   -onpress => sub {
	       my $label = shift()->parent->getobj('datelabel');
	       $label->text('none');
	   }
	 }
    ]

lib/Curses/UI.pm  view on Meta::CPAN

    $self->tempdialog('Dialog::Basic', %args);
}

sub question()
{
    my $self = shift;
    my %args = $self->process_args('-question', @_);
    $self->tempdialog('Dialog::Question', %args);
}

sub calendardialog()
{
    my $self = shift;
    my %args = $self->process_args('-title', @_);
    $self->tempdialog('Dialog::Calendar', %args);
}

sub filebrowser()
{
    my $self = shift;
    my %args = $self->process_args('-title', @_);

lib/Curses/UI/Calendar.pm  view on Meta::CPAN

    return @month;
}

1;


=pod

=head1 NAME

Curses::UI::Calendar - Create and manipulate calendar widgets

=head1 CLASS HIERARCHY

 Curses::UI::Widget
    |
    +----Curses::UI::Calendar


=head1 SYNOPSIS

    use Curses::UI;
    my $cui = new Curses::UI;
    my $win = $cui->add('window_id', 'Window');

    my $calendar = $win->add(
        'mycalendar', 'Calendar',
    -date    => '2002-1-14'
    );

    $calendar->focus();
    my $date = $calendar->get();


=head1 DESCRIPTION

Curses::UI::Calendar is a widget that can be used to create 
a calendar in which the user can select a date. The calendar
widget looks like this:

  +----------------------+
  | mmm dd          yyyy | 
  +----------------------+
  | su mo tu we th fr sa |
  |                      |
  |       01 02 03 04 05 |
  | 06 07 08 09 10 11 12 |
  | 13 14 15 16 17 18 19 |

lib/Curses/UI/Calendar.pm  view on Meta::CPAN

* B<YYYY/M/D> (e.g. 2002/1/10 or 2002/01/10))

* B<YYYYMMDD> (e.g. 20020110)

* B<D-M-YYYY> (e.g. 10-1-2002 or 10/01/2002)

* B<D/M/YYYY> (e.g. 10/1/2002 or 10/01/2002)

=item * B<-onchange> < CODEREF >

This sets the onChange event handler for the calendar widget.
If a new date is selected, the code in CODEREF will be executed.
It will get the widget reference as its argument.

=item * B<-drawline> < CODEREF >

This option specifies whether or not a line should be drawn under
the calendar.

=back




=head1 METHODS

=over 4

lib/Curses/UI/Calendar.pm  view on Meta::CPAN


=item * B<setdate> ( DATE, [BOOLEAN] )

Set the selected date of the widget to DATE. See B<-date> above for
the possible formats. The widget will redraw itself, unless BOOLEAN
has a true value.

=item * B<onChange> ( CODEREF )

This method can be used to set the B<-onchange> event handler
(see above) after initialization of the calendar. 

=back




=head1 DEFAULT BINDINGS

=over 4

lib/Curses/UI/Dialog/Calendar.pm  view on Meta::CPAN

        -buttonalignment => 'right',
        -buttons         => [ 'ok', 'cancel' ],
        -bg              => $this->{-bg},
        -fg              => $this->{-fg},
    );

    # Let the window in which the buttons are loose focus
    # if a button is pressed.
    $buttons->set_routine( 'press-button', \&press_button_callback );

    my $calendar = $this->add(
        'calendar', 'Calendar',
        -border          => 0,
        -padbottom       => 1,
        -date            => $this->{-date},
        -bg              => $this->{-bg},
        -fg              => $this->{-fg},
    )->focus;    

    # Selecting a date may bring the focus to the OK button.
    $calendar->set_routine('date-select', sub{
        my $cal = shift;
	$cal->date_select;
	$cal->parent->getobj('buttons')->{-selected} = 0;
	$cal->loose_focus;
    });

    # Doubleclick on calendar may close the dialog.
    if ( $Curses::UI::ncurses_mouse ) {
	$calendar->set_mouse_binding(sub {
	    my $buttons = shift();
	    my @extra = @_;
	    my $this = $buttons->parent;
	    $buttons->do_routine('mouse-button', @extra);
	    $this->{-selected_date} = $this->getobj('calendar')->get;
	    $this->loose_focus;
	}, BUTTON1_DOUBLE_CLICKED());
    }

    # Escape should close the dialog, without setting a date.
    $this->set_binding(sub {
        my $this = shift;
	$this->{-selected_date} = undef;
	$this->loose_focus;
    }, CUI_ESCAPE());

    $this->layout();

    return bless $this, $class;
}

sub layout()
{
    my $this = shift;

        my $cal = $this->getobj('calendar');
        if ($cal) {
        $this->{-width} = width_by_windowscrwidth(
                    $this->getobj('calendar')->{-width}, %$this);
        $this->{-height} = height_by_windowscrheight(
                    $this->getobj('calendar')->{-height}, %$this);
    }

    $this->SUPER::layout() or return;

    return $this;
}

sub get()
{
    my $this = shift;

lib/Curses/UI/Dialog/Calendar.pm  view on Meta::CPAN

}

sub press_button_callback()
{
    my $buttons = shift;
    my $this = $buttons->parent;

    my $ok_pressed = $buttons->get;
    if ($ok_pressed)
    {
        $this->{-selected_date} = $this->getobj('calendar')->get;
    } else {
        $this->{-selected_date} = undef;
    }

    $this->loose_focus;
}

1;


=pod

=head1 NAME

Curses::UI::Dialog::Calendar - Create and manipulate calendar dialogs

=head1 CLASS HIERARCHY

 Curses::UI::Widget
    |
    +----Curses::UI::Container
            |
            +----Curses::UI::Window
                    |
                    +----Curses::UI::Dialog::Calendar

lib/Curses/UI/Dialog/Calendar.pm  view on Meta::CPAN

    # -------------
    my $dialog = $win->add(
        'mydialog', 'Dialog::Calendar'
    );
    $dialog->modalfocus;
    $win->delete('mydialog');
    my $date = $dialog->get();

    # The easy way (see Curses::UI documentation).
    # --------------------------------------------
    $date = $cui->calendardialog();




=head1 DESCRIPTION

Curses::UI::Dialog::Calendar is a calendar dialog. 
This type of dialog can be used to select a date.

See exampes/demo-widgets in the distribution for a short demo.



=head1 OPTIONS

=over 4

lib/Curses/UI/Dialog/Calendar.pm  view on Meta::CPAN

=back



=head1 SPECIAL BINDINGS

=over 4

=item * B<escape>

This will invoke the cancel button, so the calendar dialog
returns without selecting any date.

=back



=head1 SEE ALSO

L<Curses::UI|Curses::UI>, 
L<Curses::UI::Container|Curses::UI::Container>, 



( run in 0.631 second using v1.01-cache-2.11-cpan-5dc5da66d9d )