Gtk2-Ex-FormFactory

 view release on metacpan or  search on metacpan

lib/Gtk2/Ex/FormFactory/Layout.pm  view on Meta::CPAN

package Gtk2::Ex::FormFactory::Layout;

use strict;

use Gtk2::SimpleList;
use Gtk2::SimpleMenu;

my $DEFAULT_SPACING = 5;

sub new {
	my $class = shift;
	
	return bless {}, $class;
}

sub build_widget {
	my $self = shift;
	my ($widget) = @_;

	return if $widget->get_type eq 'form_factory';

	if ( $widget->can("build_widget") ) {
		$widget->build_widget;
	} else {
		my $widget_type = $widget->get_type;
		my $method      = "build_$widget_type";
	
		$Gtk2::Ex::FormFactory::DEBUG &&
		    print "build_widget: ".$widget->get_type.
		      "(".$widget->get_name.")\n";

		$self->$method($widget);
	}

	if ( $widget->get_properties ) {
		$widget->get_gtk_properties_widget->set (
		  %{$widget->get_properties}
		);
	}

	if ( $widget->get_width or $widget->get_height ) {
                my $size_method = $widget->get_gtk_widget->isa("Gtk2::Window")
                    ? "set_default_size" : "set_size_request";
		$widget->get_gtk_widget->$size_method (
			($widget->get_width||-1),
			($widget->get_height||-1),
		);
	}

	my $tip = !$widget->isa_container ? $widget->get_tip : "";
	if ( $tip ) {
		$tip .= "." if $tip !~ /\.\s*$/;
		my $gtk_tip = Gtk2::Tooltips->new;
		for ( @{$widget->get_gtk_tip_widgets} ) {
			$gtk_tip->set_tip ($_, $tip, undef);
		}
	}		

	my $scrollbars = $widget->get_scrollbars;
	if ( $scrollbars ) {
		my $sw = Gtk2::ScrolledWindow->new;
		my $can_scroll = eval { 
		    $widget->get_gtk_parent_widget->get("hadjustment")
		};
		if ( $can_scroll ) {
			$sw->add($widget->get_gtk_parent_widget);

lib/Gtk2/Ex/FormFactory/Layout.pm  view on Meta::CPAN

	my ($window) = @_;
	
	my $gtk_window = Gtk2::Window->new;
	$gtk_window->set_title($window->get_title);
	$gtk_window->set_position('center');

	my $vbox = Gtk2::VBox->new(0, 5);
	$vbox->set ( border_width => $DEFAULT_SPACING );
	$gtk_window->add($vbox);
	
	$window->set_gtk_widget($vbox);
	$window->set_gtk_parent_widget($gtk_window);
	$window->set_gtk_properties_widget($gtk_window);
	
	my $closed_hook = $window->get_closed_hook;

	if ( $closed_hook ) {
		$gtk_window->signal_connect (
			delete_event => $closed_hook
		);
	} else {
		if ( $window->get_form_factory->get_content->[0] eq $window ) {
			$gtk_window->signal_connect (
				delete_event => sub {
				    $window->get_form_factory->close;
				    Gtk2->main_quit
				        if $window->get_quit_on_close;
				    1;
				},
			);
		}
	}
	
	if ( $window->get_parent->isa("Gtk2::Ex::FormFactory") ) {
		$gtk_window->signal_connect (
			destroy => sub {
				#-- Close FormFactory. If no FormFactory
				#-- is set, cleanup() was already called.
				$window->get_form_factory->close
					if $window->get_form_factory;
				1;
			},
		);
	}

	if ( $window->get_form_factory->get_parent_ff ) {
		my $gtk_parent_window =
			$window->get_form_factory
			       ->get_parent_ff
			       ->get_form_factory_gtk_window;
		$gtk_window->set_transient_for($gtk_parent_window);
	}

	1;
}

sub build_menu {
	my $self = shift;
	my ($menu) = @_;
	
	my $gtk_menu = Gtk2::SimpleMenu->new (
		menu_tree        => $menu->get_menu_tree,
		default_callback => $menu->get_default_callback,
		user_data	 => $menu->get_user_data,
	);
	
	$menu->set_gtk_widget($gtk_menu->{widget});
	$menu->set_gtk_simple_menu($gtk_menu);
	
	1;
}

sub build_block_widget {
        my $self = shift;
        my ($gtk_widget, $title) = @_;
        
	my $gtk_label = $self->create_bold_label_widget($title);
	my $gtk_frame = Gtk2::Frame->new;
	$gtk_frame->set_label_widget($gtk_label);
	$gtk_frame->add($gtk_widget);

        $gtk_widget->set ( border_width => $DEFAULT_SPACING );

        return $gtk_frame
}

sub build_notebook {
	my $self = shift;
	my ($notebook) = @_;
	
	my $gtk_notebook = Gtk2::Notebook->new;
	my $title        = $notebook->get_title;

	if ( $title ) {
                my $block_widget =
                    $self->build_block_widget($gtk_notebook, $title);
		$notebook->set_gtk_parent_widget($block_widget);
	}

	$notebook->set_gtk_widget($gtk_notebook);

	1;
}

sub build_expander {
	my $self = shift;
	my ($expander) = @_;
	
	my $gtk_expander = Gtk2::Expander->new ($expander->get_label);
	
	$expander->set_gtk_widget($gtk_expander);
	
	1;
}

sub build_form {
	my $self = shift;
	my ($form) = @_;
	
	my $child_cnt = @{$form->get_content};
	my $title     = $form->get_title;

lib/Gtk2/Ex/FormFactory/Layout.pm  view on Meta::CPAN

                Glib::Source->remove($timeout);
                $button_pressed = 0;
                0;
            });
        }
	
	1;
}

sub build_list {
	my $self = shift;
	my ($list) = @_;
	
	my $columns    = $list->get_columns;
	my $types      = $list->get_types;
	my $editable   = $list->get_editable;
	my $visible    = $list->get_visible;
	my $no_header  = $list->get_no_header;

	my (@slist, $i);

	foreach my $col ( @{$columns} ) {
		push @slist, $col, ($types->[$i]||"text");
		++$i;
	}

	my $slist = Gtk2::SimpleList->new ( @slist );

	if ( $editable ) {
		$i = 0;
		foreach my $e ( @{$editable} ) {
			$slist->set_column_editable($i, $e);
			++$i;
		}
	}

	if ( $visible ) {
		$i = 0;
		foreach my $v ( @{$visible} ) {
			$slist->get_column($i)->set_visible($v);
			++$i;
		}
	}

	if ( $no_header ) {
		$slist->set_headers_visible(0);
	}

	$slist->get_selection->set_mode ($list->get_selection_mode)
		if $list->get_selection_mode;

	$list->set_gtk_widget($slist);
	
	1;
}

sub build_popup {
	my $self = shift;
	my ($popup) = @_;
	
	my $gtk_popup_menu = Gtk2::Menu->new;
	my $gtk_popup = Gtk2::OptionMenu->new;
	$gtk_popup->set_menu($gtk_popup_menu);

	$popup->set_gtk_widget ( $gtk_popup );

	1;	
}

sub build_progress_bar {
	my $self = shift;
	my ($progress_bar) = @_;
	
	my $gtk_progress_bar = Gtk2::ProgressBar->new;
	
	$progress_bar->set_gtk_widget($gtk_progress_bar);
	
	1;
}

sub build_image {
	my $self = shift;
	my ($image) = @_;

	my $gtk_image = Gtk2::Image->new;
	$gtk_image->set_size_request(undef, undef);
	$image->set_gtk_widget($gtk_image);

	my $bgcolor = $image->get_bgcolor;
	my $gtk_event_box = Gtk2::EventBox->new;
	$gtk_event_box->modify_bg ("normal", Gtk2::Gdk::Color->parse ($bgcolor))
		if defined $bgcolor;
	$gtk_event_box->add($gtk_image);

	$image->set_gtk_event_box($gtk_event_box);

	if ( $image->get_with_frame ) {
		my $gtk_frame = Gtk2::Frame->new;
		$gtk_frame->add($gtk_event_box);
		$image->set_gtk_parent_widget($gtk_frame);
	} else {
		$image->set_gtk_parent_widget($gtk_event_box);
	}

	my $update_timeout;
	if ( $image->get_scale_to_fit or
	     $image->get_max_width or
	     $image->get_max_height ) {
		$gtk_event_box->signal_connect (
		    "size-allocate" => sub {
			return if $image->get_widget_width  == $_[1]->width and
				  $image->get_widget_height == $_[1]->height;
			$image->set_widget_width($_[1]->width);
			$image->set_widget_height($_[1]->height);
			Glib::Source->remove($update_timeout)
				if $update_timeout;
			$update_timeout = Glib::Timeout->add (
				100, sub {
					$image->update;
					$update_timeout = undef;
					0
				}



( run in 0.820 second using v1.01-cache-2.11-cpan-524268b4103 )