File Coverage

blib/lib/FBP.pm
Criterion Covered Total %
statement 232 238 97.4
branch 7 12 58.3
condition 4 9 44.4
subroutine 72 72 100.0
pod 4 4 100.0
total 319 335 95.2


line stmt bran cond sub pod time code
1             package FBP;
2              
3             =pod
4              
5             =head1 NAME
6              
7             FBP - Parser and Object Model for wxFormBuilder Project Files (.fpb files)
8              
9             =head1 SYNOPSIS
10              
11             my $object = FBP->new;
12            
13             $object->parse_file( 'MyProject.fbp' );
14              
15             =head1 DESCRIPTION
16              
17             B
18              
19             wxFormBuilder is currently the best and most sophisticated program for
20             designing wxWidgets dialogs, and generating the code for these designs.
21              
22             However, wxFormBuilder does not currently support the generation of Perl code.
23             If we are to produce Perl code for the designs it creates, the code generation
24             must be done independantly, outside of wxFormBuilder itself.
25              
26             B is a SAX-based parser and object model for the XML project files that
27             are created by wxFormBuilder. While it does B do the creation of Perl code
28             itself, it should serve as a solid base for anyone who wishes to produce a code
29             generator for these saved files.
30              
31             =head1 METHODS
32              
33             =head2 new
34              
35             my $fbp = PBP->new;
36              
37             The C constructor takes no arguments and creates a new parser/model object.
38              
39             =cut
40              
41 4     4   105314 use 5.008005;
  4         16  
  4         168  
42 4     4   18146 use Mouse 0.90;
  4         163433  
  4         31  
43 4     4   5770 use Params::Util 1.00 ();
  4         19321  
  4         105  
44 4     4   1976 use FBP::Project ();
  4         11  
  4         99  
45 4     4   2102 use FBP::Dialog ();
  4         11  
  4         113  
46 4     4   2074 use FBP::AnimationCtrl ();
  4         8  
  4         84  
47 4     4   9703 use FBP::BitmapButton ();
  4         10  
  4         95  
48 4     4   2050 use FBP::BoxSizer ();
  4         10  
  4         85  
49 4     4   1804 use FBP::Button ();
  4         9  
  4         90  
50 4     4   1866 use FBP::CalendarCtrl ();
  4         8  
  4         89  
51 4     4   1911 use FBP::CheckBox ();
  4         9  
  4         72  
52 4     4   1817 use FBP::Choice ();
  4         9  
  4         134  
53 4     4   2017 use FBP::Choicebook ();
  4         9  
  4         88  
54 4     4   1874 use FBP::ChoicebookPage ();
  4         10  
  4         84  
55 4     4   1944 use FBP::ComboBox ();
  4         10  
  4         91  
56 4     4   1878 use FBP::ColourPickerCtrl ();
  4         9  
  4         79  
57 4     4   1947 use FBP::CustomControl ();
  4         11  
  4         106  
58 4     4   2103 use FBP::DatePickerCtrl ();
  4         12  
  4         78  
59 4     4   2226 use FBP::DirPickerCtrl ();
  4         10  
  4         94  
60 4     4   2063 use FBP::FilePickerCtrl ();
  4         8  
  4         103  
61 4     4   1940 use FBP::FlexGridSizer ();
  4         9  
  4         92  
62 4     4   1961 use FBP::FontPickerCtrl ();
  4         9  
  4         86  
63 4     4   1881 use FBP::FormPanel ();
  4         11  
  4         87  
64 4     4   2130 use FBP::Frame ();
  4         12  
  4         100  
65 4     4   2008 use FBP::Gauge ();
  4         9  
  4         87  
66 4     4   2082 use FBP::GenericDirCtrl ();
  4         12  
  4         109  
67 4     4   2173 use FBP::Grid ();
  4         11  
  4         155  
68 4     4   2350 use FBP::GridBagSizer ();
  4         12  
  4         93  
69 4     4   2141 use FBP::GridBagSizerItem ();
  4         11  
  4         85  
70 4     4   1963 use FBP::GridSizer ();
  4         11  
  4         78  
71 4     4   2098 use FBP::HtmlWindow ();
  4         11  
  4         87  
72 4     4   2058 use FBP::HyperlinkCtrl ();
  4         9  
  4         85  
73 4     4   1868 use FBP::Listbook ();
  4         10  
  4         83  
74 4     4   1841 use FBP::ListbookPage ();
  4         8  
  4         78  
75 4     4   1856 use FBP::ListBox ();
  4         10  
  4         82  
76 4     4   1816 use FBP::ListCtrl ();
  4         11  
  4         95  
77 4     4   1937 use FBP::Menu ();
  4         8  
  4         78  
78 4     4   1796 use FBP::MenuBar ();
  4         11  
  4         80  
79 4     4   1905 use FBP::MenuItem ();
  4         18  
  4         86  
80 4     4   1867 use FBP::MenuSeparator ();
  4         12  
  4         85  
81 4     4   2063 use FBP::Notebook ();
  4         11  
  4         83  
82 4     4   2177 use FBP::NotebookPage ();
  4         10  
  4         98  
83 4     4   25 use FBP::Panel ();
  4         8  
  4         65  
84 4     4   1840 use FBP::RadioBox ();
  4         11  
  4         80  
85 4     4   2938 use FBP::RadioButton ();
  4         9  
  4         75  
86 4     4   1874 use FBP::RichTextCtrl ();
  4         9  
  4         90  
87 4     4   2164 use FBP::ScrollBar ();
  4         12  
  4         109  
88 4     4   2092 use FBP::ScrolledWindow ();
  4         12  
  4         111  
89 4     4   1998 use FBP::SearchCtrl ();
  4         13  
  4         105  
90 4     4   2235 use FBP::SizerItem ();
  4         13  
  4         91  
91 4     4   2289 use FBP::Slider ();
  4         12  
  4         154  
92 4     4   1953 use FBP::Spacer ();
  4         9  
  4         76  
93 4     4   1800 use FBP::SpinButton ();
  4         11  
  4         86  
94 4     4   2025 use FBP::SpinCtrl ();
  4         12  
  4         113  
95 4     4   2236 use FBP::SplitterItem ();
  4         10  
  4         80  
96 4     4   2026 use FBP::SplitterWindow ();
  4         14  
  4         119  
97 4     4   2167 use FBP::StaticBitmap ();
  4         10  
  4         158  
98 4     4   2534 use FBP::StaticBoxSizer ();
  4         10  
  4         87  
99 4     4   2055 use FBP::StaticText ();
  4         10  
  4         84  
100 4     4   2252 use FBP::StaticLine ();
  4         10  
  4         80  
101 4     4   2133 use FBP::StatusBar ();
  4         10  
  4         81  
102 4     4   2134 use FBP::StdDialogButtonSizer ();
  4         13  
  4         107  
103 4     4   2285 use FBP::TextCtrl ();
  4         10  
  4         111  
104 4     4   2061 use FBP::ToggleButton ();
  4         180  
  4         899  
105 4     4   1905 use FBP::Tool ();
  4         13  
  4         116  
106 4     4   2230 use FBP::ToolBar ();
  4         12  
  4         94  
107 4     4   2252 use FBP::ToolSeparator ();
  4         10  
  4         73  
108 4     4   2084 use FBP::TreeCtrl ();
  4         13  
  4         2337  
109              
110             our $VERSION = '0.41';
111              
112             extends 'FBP::Object';
113             with 'FBP::Children';
114              
115              
116              
117              
118              
119             ######################################################################
120             # Search Methods
121              
122             =pod
123              
124             =head2 project
125              
126             my $project = $FBP->project;
127              
128             Finds and returns the L object for the FBP file, of which there
129             should only be one. Throws an exception if the file does not contains a project.
130              
131             =cut
132              
133             sub project {
134 5     5 1 962 my $self = shift;
135 5         28 my $project = $self->children->[0];
136 5 50       63 unless ( Params::Util::_INSTANCE($project, 'FBP::Project') ) {
137 0         0 die("FBP file does not contain a project");
138             }
139 5         26 return $project;
140             }
141              
142             =pod
143              
144             =head2 form
145              
146             my $form = $FBP->form('MyDialog1');
147              
148             Convenience method which finds and returns the root L object for
149             a specific named dialog, frame, panel, menu or toolbar in the object model.
150              
151             =cut
152              
153             sub form {
154 3     3 1 25024 my $self = shift;
155 3         7 my $name = shift;
156              
157             # Scan downwards under the project to find it
158 3         10 foreach my $form ( $self->project->forms ) {
159 6 100 66     141 if ( $form->name and $form->name eq $name ) {
160 3         10 return $form;
161             }
162             }
163              
164 0         0 return undef;
165             }
166              
167             =pod
168              
169             =head2 dialog
170              
171             my $dialog = $fbp->dialog('MyDialog1');
172              
173             Convenience method which finds and returns the root L object
174             for a specific named dialog box in the object model.
175              
176             =cut
177              
178             sub dialog {
179 1     1 1 2225 my $self = shift;
180 1         4 my $name = shift;
181              
182             # Scan downwards under the project to find it
183 1         4 foreach my $dialog ( $self->project->dialogs ) {
184 1 50 33     22 if ( $dialog->name and $dialog->name eq $name ) {
185 1         5 return $dialog;
186             }
187             }
188              
189 0         0 return undef;
190             }
191              
192              
193              
194              
195              
196             ######################################################################
197             # Parsing Code
198              
199             =pod
200              
201             =head2 parse_file
202              
203             my $ok = $fbp->parse_file('foo/bar.fbp');
204              
205             The C method takes a named fbp project file, and parses it to
206             produce an object model.
207              
208             Returns true if the parsing run succeeds, or throws an exception on error.
209              
210             =cut
211              
212             sub parse_file {
213 5     5 1 2896 my $self = shift;
214 5         17 my $file = shift;
215 5 50 33     183 unless ( -f $file and -r $file ) {
216 0         0 die("Missing or unreadable file '$file'");
217             }
218              
219             # Open the file
220 5         3348 require IO::File;
221 5         35413 my $fh = IO::File->new( $file );
222 5 50       620 unless ( $fh ) {
223 0         0 die("Failed to open file '$file'");
224             }
225              
226             # Create the parser and parse the file
227 5         2674 require FBP::Parser;
228 5         3287 require XML::SAX;
229 5         10971 eval {
230 5         49 my $handler = FBP::Parser->new($self);
231 5         43 my $parser = XML::SAX::ParserFactory->parser(
232             Handler => $handler,
233             );
234 5         224987 $parser->parse_file($fh);
235             };
236 5 50       1727 if ( $@ ) {
237 0         0 die("Error while parsing '$file': $@");
238             }
239              
240 5         310 return 1;
241             }
242              
243             1;
244              
245             =pod
246              
247             =head1 SUPPORT
248              
249             Bugs should be reported via the CPAN bug tracker at
250              
251             L
252              
253             For other issues, or commercial enhancement or support, contact the author.
254              
255             =head1 AUTHOR
256              
257             Adam Kennedy Eadamk@cpan.orgE
258              
259             =head1 COPYRIGHT
260              
261             Copyright 2009 - 2012 Adam Kennedy.
262              
263             This program is free software; you can redistribute
264             it and/or modify it under the same terms as Perl itself.
265              
266             The full text of the license can be found in the
267             LICENSE file included with this module.
268              
269             =cut