1# ----------------------------------------------------------------------
2# Curses::UI::Dialog::Calendar
3#
4# (c) 2001-2002 by Maurice Makaay. All rights reserved.
5# This file is part of Curses::UI. Curses::UI is free software.
6# You can redistribute it and/or modify it under the same terms
7# as perl itself.
8#
9# Currently maintained by Marcus Thiesen
10# e-mail: marcus@cpan.thiesenweb.de
11# ----------------------------------------------------------------------
12
13package Curses::UI::Dialog::Calendar;
14
15use strict;
16use Curses;
17use Curses::UI::Window;
18use Curses::UI::Common;
19use Curses::UI::Widget;
20
21use vars qw(
22    $VERSION
23    @ISA
24);
25
26@ISA = qw(
27    Curses::UI::Window
28    Curses::UI::Common
29);
30
31$VERSION = '1.10';
32
33sub new ()
34{
35    my $class = shift;
36
37        my %userargs = @_;
38        keys_to_lowercase(\%userargs);
39
40    my %args = (
41        -title          => undef,
42        -date           => undef,
43        -fg             => -1,
44        -bg             => -1,
45
46        %userargs,
47
48        -selected_date  => undef,
49        -border         => 1,
50        -centered       => 1,
51        -titleinverse   => 0,
52        -ipad           => 1,
53    );
54
55    my $this = $class->SUPER::new(%args);
56
57    my $l = $this->root->lang;
58
59    my $buttons = $this->add(
60        'buttons', 'Buttonbox',
61        -y               => -1,
62        -x               => 0,
63        -width           => undef,
64        -buttonalignment => 'right',
65        -buttons         => [ 'ok', 'cancel' ],
66        -bg              => $this->{-bg},
67        -fg              => $this->{-fg},
68    );
69
70    # Let the window in which the buttons are loose focus
71    # if a button is pressed.
72    $buttons->set_routine( 'press-button', \&press_button_callback );
73
74    my $calendar = $this->add(
75        'calendar', 'Calendar',
76        -border          => 0,
77        -padbottom       => 1,
78        -date            => $this->{-date},
79        -bg              => $this->{-bg},
80        -fg              => $this->{-fg},
81    )->focus;
82
83    # Selecting a date may bring the focus to the OK button.
84    $calendar->set_routine('date-select', sub{
85        my $cal = shift;
86	$cal->date_select;
87	$cal->parent->getobj('buttons')->{-selected} = 0;
88	$cal->loose_focus;
89    });
90
91    # Doubleclick on calendar may close the dialog.
92    if ( $Curses::UI::ncurses_mouse ) {
93	$calendar->set_mouse_binding(sub {
94	    my $buttons = shift();
95	    my @extra = @_;
96	    my $this = $buttons->parent;
97	    $buttons->do_routine('mouse-button', @extra);
98	    $this->{-selected_date} = $this->getobj('calendar')->get;
99	    $this->loose_focus;
100	}, BUTTON1_DOUBLE_CLICKED());
101    }
102
103    # Escape should close the dialog, without setting a date.
104    $this->set_binding(sub {
105        my $this = shift;
106	$this->{-selected_date} = undef;
107	$this->loose_focus;
108    }, CUI_ESCAPE());
109
110    $this->layout();
111
112    return bless $this, $class;
113}
114
115sub layout()
116{
117    my $this = shift;
118
119        my $cal = $this->getobj('calendar');
120        if ($cal) {
121        $this->{-width} = width_by_windowscrwidth(
122                    $this->getobj('calendar')->{-width}, %$this);
123        $this->{-height} = height_by_windowscrheight(
124                    $this->getobj('calendar')->{-height}, %$this);
125    }
126
127    $this->SUPER::layout() or return;
128
129    return $this;
130}
131
132sub get()
133{
134    my $this = shift;
135    return $this->{-selected_date};
136}
137
138sub press_button_callback()
139{
140    my $buttons = shift;
141    my $this = $buttons->parent;
142
143    my $ok_pressed = $buttons->get;
144    if ($ok_pressed)
145    {
146        $this->{-selected_date} = $this->getobj('calendar')->get;
147    } else {
148        $this->{-selected_date} = undef;
149    }
150
151    $this->loose_focus;
152}
153
1541;
155
156
157=pod
158
159=head1 NAME
160
161Curses::UI::Dialog::Calendar - Create and manipulate calendar dialogs
162
163=head1 CLASS HIERARCHY
164
165 Curses::UI::Widget
166    |
167    +----Curses::UI::Container
168            |
169            +----Curses::UI::Window
170                    |
171                    +----Curses::UI::Dialog::Calendar
172
173
174
175=head1 SYNOPSIS
176
177    use Curses::UI;
178    my $cui = new Curses::UI;
179    my $win = $cui->add('window_id', 'Window');
180
181    # The hard way.
182    # -------------
183    my $dialog = $win->add(
184        'mydialog', 'Dialog::Calendar'
185    );
186    $dialog->modalfocus;
187    $win->delete('mydialog');
188    my $date = $dialog->get();
189
190    # The easy way (see Curses::UI documentation).
191    # --------------------------------------------
192    $date = $cui->calendardialog();
193
194
195
196
197=head1 DESCRIPTION
198
199Curses::UI::Dialog::Calendar is a calendar dialog.
200This type of dialog can be used to select a date.
201
202See exampes/demo-widgets in the distribution for a short demo.
203
204
205
206=head1 OPTIONS
207
208=over 4
209
210=item * B<-title> < TEXT >
211
212Set the title of the dialog window to TEXT.
213
214=item * B<-date> < DATE >
215
216Set the date to start with to DATE. If -date is
217not defined, today will be used as the startdate.
218
219=back
220
221
222
223
224=head1 METHODS
225
226=over 4
227
228=item * B<new> ( OPTIONS )
229
230=item * B<layout> ( )
231
232=item * B<draw> ( BOOLEAN )
233
234=item * B<focus> ( )
235
236=item * B<modalfocus> ( )
237
238These are standard methods. See L<Curses::UI::Container|Curses::UI::Container>
239for an explanation of these.
240
241=item * B<get> ( )
242
243This method will return the date that was selected or
244undef if no date was selected.
245
246=back
247
248
249
250=head1 SPECIAL BINDINGS
251
252=over 4
253
254=item * B<escape>
255
256This will invoke the cancel button, so the calendar dialog
257returns without selecting any date.
258
259=back
260
261
262
263=head1 SEE ALSO
264
265L<Curses::UI|Curses::UI>,
266L<Curses::UI::Container|Curses::UI::Container>,
267L<Curses::UI::Buttonbox|Curses::UI::Buttonbox>
268
269
270
271
272=head1 AUTHOR
273
274Copyright (c) 2001-2002 Maurice Makaay. All rights reserved.
275
276Maintained by Marcus Thiesen (marcus@cpan.thiesenweb.de)
277
278
279This package is free software and is provided "as is" without express
280or implied warranty. It may be used, redistributed and/or modified
281under the same terms as perl itself.
282
283