Gtk2-Ex-Datasheet-DBI

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

        - harmless anyway because we only support automatic renderer selection for MySQL currently
    Updated documentation & cleaned up POD somewhat
    
Version 1.0, ( not released )
    
    Added dump_on_error flag to dump SQL on a DBI error
    Converted more 0s to FALSEs
    
Version 0.9, released 16-Sep-2005
    
    Add some logic to MOFO::CellRendererDate so that popup calendar gets placed completely on-screen
    Added MOFO::CellRendererTime and use when a Time column is encountered
    Dialog question asking user whether to apply if window is closed with unapplied changes to recordset
    Add missing code to process sql_order_by
    Renamed readonly flag to read_only ( for consistency ) and hide status column when read_only
    
Version 0.8, released 15-Aug-2005
    
    Refresh dynamic combos when a toggle that they depend on is edited
    Automatically choose a renderer type based on the database field type of each field ( can be overriden )
    Automatically choose a default value for each column based on the database field definition ( can be overriden )

lib/Gtk2/Ex/Datasheet/DBI.pm  view on Meta::CPAN

                        [qw(readable writable)]
                    )
    ];

use constant x_padding => 2;
use constant y_padding => 3;

use constant arrow_width => 15;
use constant arrow_height => 15;

sub hide_popup {
    
    my ( $cell ) = @_;
    
    Gtk2->grab_remove( $cell->{ _popup } );
    $cell->{ _popup }->hide();
    
}

sub get_today {
    
    my ( $cell ) = @_;
  
    my ( $day, $month, $year ) = (localtime())[3, 4, 5];
    
    $year += 1900;

lib/Gtk2/Ex/Datasheet/DBI.pm  view on Meta::CPAN

    
    my ( $cell, $year, $month, $day ) = @_;
    return ( $year, sprintf("%02d", $month), sprintf("%02d", $day) );
    
}

sub INIT_INSTANCE {
    
    my ( $cell ) = @_;
    
    my $popup = Gtk2::Window->new ('popup');
    my $vbox = Gtk2::VBox->new( 0, 0 );
    
    my $calendar = Gtk2::Calendar->new();
    
    $calendar->modify_font( Gtk2::Pango::FontDescription->from_string( "Arial " . $cell->get( "font" ) ) );
    
    my $hbox = Gtk2::HBox->new( 0, 0 );
    
    my $today = Gtk2::Button->new('Today');
    my $none = Gtk2::Button->new('None');

lib/Gtk2/Ex/Datasheet/DBI.pm  view on Meta::CPAN

    $hbox->pack_start( $today, 1, 1, 0 );
    $hbox->pack_start( $none, 1, 1, 0 );
    
    $vbox->pack_start( $calendar, 1, 1, 0 );
    $vbox->pack_start( $hbox, 0, 0, 0 );
    
    # Find out if the click happended outside of our window.  If so, hide it.
    # Largely copied from Planner (the former MrProject).
    
    # Implement via Gtk2::get_event_widget?
    $popup->signal_connect( button_press_event => sub {
      my ( $popup, $event ) = @_;
    
      if ( $event->button() == 1 ) {
        my ( $x, $y ) = ( $event->x_root(), $event->y_root() );
        my ( $xoffset, $yoffset ) = $popup->window()->get_root_origin();
    
        my $allocation = $popup->allocation();
    
        my $x1 = $xoffset + 2 * $allocation->x();
        my $y1 = $yoffset + 2 * $allocation->y();
        my $x2 = $x1 + $allocation->width();
        my $y2 = $y1 + $allocation->height();
    
        unless ( $x > $x1 && $x < $x2 && $y > $y1 && $y < $y2 ) {
          $cell->hide_popup();
          return 1;
        }
      }
    
      return 0;
    } );
    
    $popup->add( $vbox );
    
    $cell->{ _popup } = $popup;
    $cell->{ _calendar } = $calendar;
}

sub START_EDITING {
    
    my ( $cell, $event, $view, $path, $background_area, $cell_area, $flags ) = @_;
    
    my $popup = $cell -> { _popup };
    my $calendar = $cell->{ _calendar };
    
    # Specify the callbacks.  Will be called by the signal handlers set up in
    # INIT_INSTANCE.
    $cell->{ _today_clicked_callback } = sub {
        
        my ($button) = @_;
        my ($year, $month, $day) = $cell -> get_today();
        
        $cell->signal_emit( edited=>$path, join( "-", $cell->add_padding( $year, $month, $day ) ) );
        $cell->hide_popup();
        
    };
    
    $cell->{ _none_clicked_callback } = sub {
        
        my ( $button ) = @_;
      
        $cell->signal_emit( edited=>$path, "" );
        $cell->hide_popup();
        
    };
    
    $cell->{ _day_selected_double_click_callback } = sub {
        
        my ( $calendar ) = @_;
        my ( $year, $month, $day ) = $calendar->get_date();
        
        $cell->signal_emit( edited => $path, join( "-", $cell -> add_padding( $year, ++$month, $day ) ) );
        $cell->hide_popup();
        
    };
    
    $cell->{ _month_changed } = sub {
        
        my ( $calendar ) = @_;
        
        my ( $selected_year, $selected_month ) = $calendar->get_date();
        my ( $current_year, $current_month, $current_day ) = $cell->get_today();
        

lib/Gtk2/Ex/Datasheet/DBI.pm  view on Meta::CPAN

            $calendar->unmark_day( $current_day );
        }
        
    };
    
    my ( $year, $month, $day ) = $cell->get_date();
    
    $calendar->select_month( $month - 1, $year );
    $calendar->select_day( $day );
    
    # Necessary to get the correct allocation of the popup.
    $popup->move( -500, -500 );
    $popup->show_all();
    
    # Figure out where to put the popup - ie don't put it offscreen,
    # as it's not movable ( by the user )
    my $screen_height = $popup->get_screen->get_height;
    my $requisition = $popup->size_request();
    my $popup_width = $requisition->width;
    my $popup_height = $requisition->height;
    my ( $x_origin, $y_origin ) = $view->get_bin_window()->get_origin();
    my ( $popup_x, $popup_y );
    
    $popup_x = $x_origin + $cell_area->x() + $cell_area->width() - $popup_width;
    $popup_x = 0 if $popup_x < 0;
    
    $popup_y = $y_origin + $cell_area->y() + $cell_area->height();
    
    if ( $popup_y + $popup_height > $screen_height ) {
      $popup_y = $y_origin + $cell_area->y() - $popup_height;
    }
    
    $popup->move( $popup_x, $popup_y );
    
    # Grab the focus and the pointer.
    Gtk2->grab_add( $popup );
    $popup->grab_focus();
    
    Gtk2::Gdk -> pointer_grab(
                                $popup -> window(),
                                1,
                                [ qw( button-press-mask button-release-mask pointer-motion-mask ) ],
                                undef,
                                undef,
                                0
                             );
    
    return;
    
}

lib/Gtk2/Ex/Datasheet/DBI.pm  view on Meta::CPAN

    Glib::ParamSpec -> string("time", "Time", "What's the time again?", "", [qw(readable writable)]),
  ]
;

use constant x_padding => 2;
use constant y_padding => 3;

use constant arrow_width => 15;
use constant arrow_height => 15;

sub hide_popup {
    
    my $cell = shift;
    
    Gtk2->grab_remove( $cell->{ _popup } );
    $cell->{ _popup }->hide();
    
}

sub get_time {
    
    my $cell = shift;
    
    my $text = $cell->get("time");
    my ( $h, $m, $s ) = split( /:/, $text );
    

lib/Gtk2/Ex/Datasheet/DBI.pm  view on Meta::CPAN

    my ( $cell, $h, $m, $s ) = @_;
    
    return ( sprintf("%02d",$h), sprintf("%02d", $m), sprintf("%02d", $s) );
    
}

sub INIT_INSTANCE {
    
    my $cell = shift;
    
    my $popup = Gtk2::Window -> new ('popup');
    my $vbox = Gtk2::VBox -> new( 0, 0 );
    
    my $h_spinbutton = Gtk2::SpinButton -> new_with_range( 0, 23, 1 );
    my $m_spinbutton = Gtk2::SpinButton -> new_with_range( 0, 59, 1 );
    my $s_spinbutton = Gtk2::SpinButton -> new_with_range( 0, 59, 1 );
    my $colon_1 = Gtk2::Label->new(":");
    my $colon_2 = Gtk2::Label->new(":");
    
    my $spin_hbox = Gtk2::HBox -> new( 0, 0 );
    my $buttons_hbox = Gtk2::HBox->new( 0, 0 );

lib/Gtk2/Ex/Datasheet/DBI.pm  view on Meta::CPAN

                            clicked => sub {
                                                $cell -> { _ok_clicked_callback } -> (@_)
                                                        if ( exists( $cell -> { _ok_clicked_callback } ) );
                            }
                         );
      
    # Find out if the click happended outside of our window.  If so, hide it.
    # Largely copied from Planner (the former MrProject).
    
    # Implement via Gtk2::get_event_widget?
    $popup -> signal_connect(button_press_event => sub {
      my ($popup, $event) = @_;
    
      if ($event -> button() == 1) {
        my ($x, $y) = ($event -> x_root(), $event -> y_root());
        my ($xoffset, $yoffset) = $popup -> window() -> get_root_origin();
    
        my $allocation = $popup -> allocation();
    
        my $x1 = $xoffset + 2 * $allocation -> x();
        my $y1 = $yoffset + 2 * $allocation -> y();
        my $x2 = $x1 + $allocation -> width();
        my $y2 = $y1 + $allocation -> height();
    
        unless ($x > $x1 && $x < $x2 && $y > $y1 && $y < $y2) {
          $cell -> hide_popup();
          return 1;
        }
      }
    
      return 0;
    });
    
    $popup -> add($vbox);
    
    $cell -> { _popup } = $popup;
    $cell -> { _h_spinbutton } = $h_spinbutton;
    $cell -> { _m_spinbutton } = $m_spinbutton;
    $cell -> { _s_spinbutton } = $s_spinbutton;
    
}

sub START_EDITING {
    
    my ( $cell, $event, $view, $path, $background_area, $cell_area, $flags ) = @_;
    
    my $popup = $cell -> { _popup };
    my $h_spinbutton = $cell -> { _h_spinbutton };
    my $m_spinbutton = $cell -> { _m_spinbutton };
    my $s_spinbutton = $cell -> { _s_spinbutton };
    
    my ( $h, $m, $s ) = $cell -> get_time();
    
    $h_spinbutton->set_text( $h );
    $m_spinbutton->set_text( $m );
    $s_spinbutton->set_text( $s );
    

lib/Gtk2/Ex/Datasheet/DBI.pm  view on Meta::CPAN

      
      my ( $button ) = @_;
      my $h = $h_spinbutton->get_text;
      my $m = $m_spinbutton->get_text;
      my $s = $s_spinbutton->get_text;
      
      $cell -> signal_emit(
                                  edited => $path,
                                  join( ":", $cell -> add_padding($h, $m, $s ) )
                          );
          $cell -> hide_popup();
    };
    
    # Necessary to get the correct allocation of the popup.
    $popup -> move(-500, -500);
    $popup -> show_all();
    
    # Figure out where to put the popup - ie don't put it offscreen,
    # as it's not movable ( by the user )
    my $screen_height = $popup->get_screen->get_height;
    my $requisition = $popup->size_request();
    my $popup_width = $requisition->width;
    my $popup_height = $requisition->height;
    my ( $x_origin, $y_origin ) =  $view -> get_bin_window() -> get_origin();
    my ( $popup_x, $popup_y );
    
    $popup_x = $x_origin + $cell_area->x() + $cell_area->width() - $popup_width;
    $popup_x = 0 if $popup_x < 0;
    
    $popup_y = $y_origin + $cell_area -> y() + $cell_area -> height();
    
    if ( $popup_y + $popup_height > $screen_height ) {
        $popup_y = $y_origin + $cell_area -> y() - $popup_height;
    }
    
    $popup -> move( $popup_x, $popup_y );
    
    # Grab the focus and the pointer.
    Gtk2 -> grab_add($popup);
    $popup -> grab_focus();
    
    Gtk2::Gdk->pointer_grab(
                                $popup->window(),
                                1,
                                [ qw( button-press-mask button-release-mask pointer-motion-mask ) ],
                                undef,
                                undef,
                                0
                           );
    
    return;
    
}



( run in 1.292 second using v1.01-cache-2.11-cpan-364913b4093 )