File Coverage

blib/lib/Gtk2/Ex/FormFactory.pm
Criterion Covered Total %
statement 7 9 77.7
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 10 12 83.3


line stmt bran cond sub pod time code
1             package Gtk2::Ex::FormFactory;
2              
3             $VERSION = "0.67";
4              
5 2     2   1627 use strict;
  2         5  
  2         86  
6              
7 2     2   12 use base qw( Gtk2::Ex::FormFactory::Container );
  2         3  
  2         1251  
8              
9 2     2   872 use Gtk2;
  0            
  0            
10             use Gtk2::Ex::FormFactory::Loader;
11             use Scalar::Util;
12              
13             sub get_type { "form_factory" }
14              
15             use Gtk2::Ex::FormFactory::Context;
16             use Gtk2::Ex::FormFactory::Layout;
17             use Gtk2::Ex::FormFactory::Rules;
18              
19             sub get_context { shift->{context} }
20             sub get_sync { shift->{sync} }
21             sub get_layouter { shift->{layouter} }
22             sub get_rule_checker { shift->{rule_checker} }
23             sub get_gtk_size_groups { shift->{gtk_size_groups} }
24             sub get_parent_ff { shift->{parent_ff} }
25             sub get_widgets_by_name { shift->{widgets_by_name} }
26             sub get_buffered { shift->{buffered} }
27              
28             sub set_context { shift->{context} = $_[1] }
29             sub set_sync { shift->{sync} = $_[1] }
30             sub set_layouter { shift->{layouter} = $_[1] }
31             sub set_rule_checker { shift->{rule_checker} = $_[1] }
32             sub set_gtk_size_groups { shift->{gtk_size_groups} = $_[1] }
33             sub set_parent_ff { shift->{parent_ff} = $_[1] }
34             sub set_widgets_by_name { shift->{widgets_by_name} = $_[1] }
35             sub set_buffered { shift->{buffered} = $_[1] }
36              
37             sub get_form_factory { shift }
38              
39             sub new {
40             my $class = shift;
41             my %par = @_;
42             my ($context, $parent_ff, $sync, $layouter, $rule_checker) =
43             @par{'context','parent_ff','sync','layouter','rule_checker'};
44              
45             my $self = $class->SUPER::new(@_);
46              
47             $sync = 1 unless defined $sync;
48             $context ||= Gtk2::Ex::FormFactory::Context->new;
49             $layouter ||= Gtk2::Ex::FormFactory::Layout->new;
50             $rule_checker ||= Gtk2::Ex::FormFactory::Rules->new;
51              
52             $self->set_parent_ff ($parent_ff);
53             $self->set_context ($context);
54             $self->set_sync ($sync);
55             $self->set_layouter ($layouter);
56             $self->set_rule_checker ($rule_checker);
57             $self->set_gtk_size_groups ({});
58             $self->set_widgets_by_name ({});
59             $self->set_buffered (1);
60              
61             return $self;
62             }
63              
64             sub cleanup {
65             my $self = shift;
66            
67             $self->SUPER::cleanup(@_);
68            
69             $self->set_gtk_size_groups({});
70             $self->set_widgets_by_name({});
71              
72             1;
73             }
74              
75             sub open {
76             my $self = shift;
77             my %par = @_;
78             my ($hide) = $par{'hide'};
79              
80             #-- First build all widgets as implemented in the Widget class
81             $self->build();
82            
83             #-- Now show all widgets, if we shouldn't keep the hided
84             $self->show if not $hide;
85            
86             1;
87             }
88              
89             sub build {
90             my $self = shift;
91            
92             return if $self->get_built;
93            
94             #-- first register all widgets of this FormFactory
95             #-- to resolve cross references between Widgets
96             #-- during building.
97             $self->register_all_widgets($self);
98            
99             #-- Now call Container's build
100             $self->SUPER::build();
101            
102             1;
103             }
104              
105             sub show {
106             my $self = shift;
107            
108             #-- Show all widgets
109             foreach my $child ( @{$self->get_content} ) {
110             $child->get_gtk_parent_widget->show_all;
111             }
112            
113             #-- And finally connect the changed signals - this need to be
114             #-- done *after* showing the widgets. For containers ->show()
115             #-- could trigger updates which cause object updates. Since
116             #-- ->update() isn't called yet, this would invalidate the
117             #-- object's state.
118             $self->connect_signals;
119            
120             1;
121             }
122              
123             sub update {
124             my $self = shift;
125             $self->update_all;
126             }
127              
128             sub ok {
129             my $self = shift;
130              
131             $self->apply;
132             $self->close;
133            
134             1;
135             }
136              
137             sub apply {
138             my $self = shift;
139              
140             if ( $self->get_sync ) {
141             $self->commit_proxy_buffers_all;
142             } else {
143             $self->apply_changes_all;
144             }
145              
146             1;
147             }
148              
149             sub cancel {
150             my $self = shift;
151            
152             $self->discard_proxy_buffers_all if $self->get_sync;
153             $self->close;
154            
155             1;
156             }
157              
158             sub close {
159             my $self = shift;
160              
161             $_->get_gtk_parent_widget->destroy for @{$self->get_content};
162              
163             $self->cleanup;
164              
165             1;
166             }
167              
168             sub register_all_widgets {
169             my $self = shift;
170             my ($widget) = @_;
171            
172             if ( $widget->isa("Gtk2::Ex::FormFactory::Container") ) {
173             $self->register_widget($widget);
174             foreach my $child ( @{$widget->get_content} ) {
175             $self->register_all_widgets($child);
176             }
177             } else {
178             $self->register_widget($widget);
179             }
180            
181             1;
182             }
183              
184             sub register_widget {
185             my $self = shift;
186             my ($widget) = @_;
187              
188             $self->get_widgets_by_name->{$widget->get_name} = $widget;
189              
190             $self->set_buffered(0) if $widget->get_object &&
191             !$self->get_context
192             ->get_proxy($widget->get_object)
193             ->get_buffered;
194              
195             1;
196             }
197              
198             sub get_form_factory_gtk_window {
199             my $self = shift;
200            
201             my $gtk_window;
202             foreach my $child ( @{$self->get_content} ) {
203             if ( $child->isa("Gtk2::Ex::FormFactory::Window") ) {
204             $gtk_window = $child->get_gtk_parent_widget;
205             last;
206             }
207             }
208            
209             return $gtk_window;
210             }
211              
212             sub open_confirm_window {
213             my $self = shift;
214             my %par = @_;
215             my ($message, $yes_callback, $no_callback, $position, $with_cancel) =
216             @par{'message','yes_callback','no_callback','position','with_cancel'};
217             my ($yes_label, $no_label) =
218             @par{'yes_label','no_label'};
219              
220             $position ||= "center-on-parent";
221             $yes_label ||= "gtk-yes";
222             $no_label ||= "gtk-no";
223              
224             my $confirm = Gtk2::MessageDialog->new_with_markup (
225             $self->get_form_factory_gtk_window,
226             ["modal","destroy-with-parent"],
227             "question",
228             "none",
229             $message
230             );
231              
232             $confirm->add_buttons ("gtk-cancel", "cancel") if $with_cancel;
233             $confirm->add_buttons ($no_label, "no");
234             $confirm->add_buttons ($yes_label, "yes");
235              
236             $confirm->signal_connect("response", sub {
237             my ($widget, $answer) = @_;
238             if ( $answer eq 'yes' ) {
239             &$yes_callback() if $yes_callback;
240             }
241             if ( $answer eq 'no' ) {
242             &$no_callback() if $no_callback;
243             }
244             $widget->destroy;
245             1;
246             });
247              
248             $confirm->set_position ($position);
249             $confirm->show;
250              
251             1;
252             }
253              
254             sub open_message_window {
255             my $self = shift;
256             my %par = @_;
257             my ($type, $message, $position) =
258             @par{'type','message','position'};
259              
260             $position ||= "center-on-parent";
261             $type ||= "info";
262              
263             my $confirm = Gtk2::MessageDialog->new_with_markup (
264             $self->get_form_factory_gtk_window,
265             ["modal","destroy-with-parent"],
266             $type,
267             "ok",
268             $message
269             );
270              
271             $confirm->signal_connect("response", sub {
272             my ($widget) = @_;
273             $widget->destroy;
274             1;
275             });
276             $confirm->set_position ($position);
277             $confirm->show;
278              
279             1;
280             }
281              
282             sub get_image_path {
283             my $class = shift;
284             my ($filename) = @_;
285            
286             foreach my $dir ( @INC ) {
287             return "$dir/$filename" if -f "$dir/$filename";
288             }
289            
290             return;
291             }
292              
293             sub change_mouse_cursor {
294             my $self = shift;
295             my ($type, $gtk_window) = @_;
296              
297             $gtk_window ||= $self->get_form_factory_gtk_window;
298             return unless $gtk_window;
299            
300             my $cursor = $type ? Gtk2::Gdk::Cursor->new($type) : undef;
301             $gtk_window->window->set_cursor($cursor);
302             Gtk2->main_iteration while Gtk2->events_pending;
303            
304             1;
305             }
306              
307             1;
308              
309             __END__