#!/usr/bin/perl -w # # Copyright (C) 1998 Cesar Miquel, Shawn T. Amundson, Mattias Grönlund # Copyright (C) 2000 Tony Gale # # Copyright (C) 2003 by the gtk2-perl team (see the file AUTHORS for the full # list) # # This library is free software; you can redistribute it and/or modify it under # the terms of the GNU Library General Public License as published by the Free # Software Foundation; either version 2.1 of the License, or (at your option) # any later version. # # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for # more details. # # You should have received a copy of the GNU Library General Public License # along with this library; if not, write to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA. # # $Id: calendar.pl 2054 2008-10-05 12:49:36Z tsch $ # # this was originally gtk-2.2.1/examples/calendar/calendar.c # ported to gtk2-perl (and perl-ized) by rm use strict; use Gtk2; use Glib ':constants'; use constant DEF_PAD => 10; use constant DEF_PAD_SMALL => 5; use constant TM_YEAR_BASE => 1900; sub calendar_select_font { my $calendar = shift; my $fsd = Gtk2::FontSelectionDialog->new ('Font Selection Dialog'); $fsd->set_position('mouse'); $fsd->set_font_name ($calendar->get_style->font_desc->to_string); $fsd->signal_connect ('response' => sub { my (undef, $response) = @_; if ($response eq 'ok') { my $font_name = $fsd->get_font_name; return unless $font_name; $calendar->modify_font (Gtk2::Pango::FontDescription->from_string ($font_name)); } $fsd->destroy; }); $fsd->show; } sub calendar_set_signal_strings { my $sig_ref = shift; my $new_sig = shift; $sig_ref->{prev2}->set_text($sig_ref->{prev}->get_text); $sig_ref->{prev}->set_text($sig_ref->{curr}->get_text); $sig_ref->{curr}->set_text($new_sig); } sub create_calendar { my $window; my $vbox; my $vbox2; my $vbox3; my $hbox; my $hbbox; my $calendar; my @toggles; my $button; my $frame; my $separator; my $label; my $bbox; my $i; my %signals = (); $window = Gtk2::Window->new("toplevel"); $window->set_title('GtkCalendar Example'); $window->set_border_width(5); $window->signal_connect( 'destroy' => sub { Gtk2->main_quit; } ); $window->set_resizable(FALSE); $vbox = Gtk2::VBox->new(FALSE, DEF_PAD); $window->add($vbox); # # The top part of the window, Calendar, flags and fontsel. # $hbox = Gtk2::HBox->new(FALSE, DEF_PAD); $vbox->pack_start($hbox, TRUE, TRUE, DEF_PAD); $hbbox = Gtk2::HButtonBox->new; $hbox->pack_start($hbbox, FALSE, FALSE, DEF_PAD); $hbbox->set_layout('spread'); $hbbox->set_spacing(5); # Calendar widget $frame = Gtk2::Frame->new('Calendar'); $hbbox->pack_start($frame, FALSE, TRUE, DEF_PAD); $calendar = Gtk2::Calendar->new; $calendar->mark_day(19); $frame->add($calendar); $calendar->display_options([]); $calendar->signal_connect( 'month_changed' => sub { my ($year, $month, $day) = $calendar->get_date; calendar_set_signal_strings($_[1], 'month changed: '. sprintf("%02d/%d/%d", $month+1, $day, $year) ); }, \%signals ); $calendar->signal_connect( 'day_selected' => sub { my ($year, $month, $day) = $calendar->get_date; calendar_set_signal_strings($_[1], 'day selected: '. sprintf("%02d/%d/%d", $month+1, $day, $year) ); }, \%signals ); $calendar->signal_connect( 'day_selected_double_click' => sub { my ($year, $month, $day) = $calendar->get_date; calendar_set_signal_strings($_[1], 'day selected double click: '. sprintf("%02d/%d/%d", $month+1, $day, $year) ); }, \%signals ); $calendar->signal_connect( 'prev_month' => sub { my ($year, $month, $day) = $calendar->get_date; calendar_set_signal_strings($_[1], 'prev month: '. sprintf("%02d/%d/%d", $month+1, $day, $year) ); }, \%signals ); $calendar->signal_connect( 'next_month' => sub { my ($year, $month, $day) = $calendar->get_date; calendar_set_signal_strings($_[1], 'next month: '. sprintf("%02d/%d/%d", $month+1, $day, $year) ); }, \%signals ); $calendar->signal_connect( 'prev_year' => sub { my ($year, $month, $day) = $calendar->get_date; calendar_set_signal_strings($_[1], 'prev year: '. sprintf("%02d/%d/%d", $month+1, $day, $year) ); }, \%signals ); $calendar->signal_connect( 'next_year' => sub { my ($year, $month, $day) = $calendar->get_date; calendar_set_signal_strings($_[1], 'next year: '. sprintf("%02d/%d/%d", $month+1, $day, $year) ); }, \%signals ); $separator = Gtk2::VSeparator->new; $hbox->pack_start($separator, FALSE, TRUE, 0); $vbox2 = Gtk2::VBox->new(FALSE, DEF_PAD); $hbox->pack_start($vbox2, FALSE, FALSE, DEF_PAD); # Build the Right frame with the flags in $frame = Gtk2::Frame->new('Flags'); $vbox2->pack_start($frame, TRUE, TRUE, DEF_PAD); $vbox3= Gtk2::VBox->new(TRUE, DEF_PAD_SMALL); $frame->add($vbox3); my @flags = ( 'Show Heading', 'Show Day Names', 'No Month Change', 'Show Week Numbers', 'Week Start Monday', ); for( $i = 0; $i < 5; $i++ ) { $toggles[$i] = Gtk2::CheckButton->new($flags[$i]); $toggles[$i]->signal_connect( 'toggled' => sub { my $j; my $opts = []; for($j = 0; $j < scalar(@flags); $j++ ) { if( $toggles[$j]->get_active ) { push @$opts, $flags[$j]; } } $calendar->display_options($opts); }); $vbox3->pack_start($toggles[$i], TRUE, TRUE, 0); } foreach (@flags) { $_ =~ s/\s/-/g; $_ = lc($_); } # Build the right font-button $button = Gtk2::Button->new('Font...'); $button->signal_connect( 'clicked' => sub { calendar_select_font($_[1]); }, $calendar ); $vbox2->pack_start($button, FALSE, FALSE, 0); # # Build the Signal-event part. # $frame = Gtk2::Frame->new('Signal events'); $vbox->pack_start($frame, TRUE, TRUE, DEF_PAD); $vbox2 = Gtk2::VBox->new(TRUE, DEF_PAD_SMALL); $frame->add($vbox2); $hbox = Gtk2::HBox->new(FALSE, 3); $vbox2->pack_start($hbox, FALSE, TRUE, 0); $label = Gtk2::Label->new('Signal:'); $hbox->pack_start($label, FALSE, TRUE, 0); $signals{curr} = Gtk2::Label->new(''); $hbox->pack_start($signals{curr}, FALSE, TRUE, 0); $hbox = Gtk2::HBox->new(FALSE, 3); $vbox2->pack_start($hbox, FALSE, TRUE, 0); $label = Gtk2::Label->new('Previous Signal:'); $hbox->pack_start($label, FALSE, TRUE, 0); $signals{prev} = Gtk2::Label->new(''); $hbox->pack_start($signals{prev}, FALSE, TRUE, 0); $hbox = Gtk2::HBox->new(FALSE, 3); $vbox2->pack_start($hbox, FALSE, TRUE, 0); $label = Gtk2::Label->new('Second Previous Signal:'); $hbox->pack_start($label, FALSE, TRUE, 0); $signals{prev2} = Gtk2::Label->new(''); $hbox->pack_start($signals{prev2}, FALSE, TRUE, 0); $bbox = Gtk2::HButtonBox->new; $vbox->pack_start($bbox, FALSE, FALSE, 0); $bbox->set_layout('end'); $button = Gtk2::Button->new('Close'); $button->signal_connect( 'clicked' => sub { Gtk2->main_quit; } ); $bbox->add($button); $button->set_flags('can-default'); $button->grab_default; $window->show_all; } Gtk2->init; create_calendar; Gtk2->main; exit 0;