File Coverage

blib/lib/Wx/Perl/PodEditor.pm
Criterion Covered Total %
statement 16 18 88.8
branch n/a
condition n/a
subroutine 6 6 100.0
pod n/a
total 22 24 91.6


line stmt bran cond sub pod time code
1             package Wx::Perl::PodEditor;
2              
3 1     1   21851 use strict;
  1         3  
  1         48  
4 1     1   6 use warnings;
  1         1  
  1         28  
5              
6 1     1   1196 use Data::Dumper;
  1         9813  
  1         86  
7 1     1   10 use File::Basename;
  1         2  
  1         74  
8 1     1   5 use File::Spec;
  1         2  
  1         31  
9              
10 0           use Wx qw(
11             wxVERTICAL wxTOP wxHORIZONTAL
12             wxBITMAP_TYPE_XPM
13             wxNO_BORDER
14             wxDEFAULT
15             wxNORMAL
16             wxRE_MULTILINE wxRICHTEXT_TYPE_XML
17 1     1   379 );
  0            
18              
19             use Wx::Event qw( :everything );
20             use Wx::RichText;
21              
22             use Wx::Perl::PodEditor::FormatActions qw(:all);
23             use Wx::Perl::PodEditor::PodParser;
24             use Wx::Perl::PodEditor::XMLParser;
25              
26             Wx::Perl::PodEditor::FormatActions->define_styles;
27              
28             our $AUTOLOAD;
29              
30             our $VERSION = 0.03;
31              
32             sub create {
33             my ($class, $parent, $size) = @_;
34            
35             my $panel = Wx::Panel->new( $parent, -1, [-1,-1], [-1,-1], 0 );
36            
37             my $self = bless {}, $class;
38             my $sizer = $self->sizer();
39            
40             my $editor = $self->_editor( $panel, $size );
41             $sizer->Add( $editor, 0, wxTOP, 0 );
42            
43             return $self;
44             }
45              
46             sub sizer {
47             my ($self) = @_;
48            
49             unless( $self->{sizer} ){
50             $self->{sizer} = Wx::BoxSizer->new( wxVERTICAL );
51             }
52              
53             $self->{sizer};
54             }
55              
56             sub _editor {
57             my ($self,$panel,$size) = @_;
58            
59             if( @_ == 3 ){
60             $self->{editor} = Wx::RichTextCtrl->new( $panel, -1, '',[-1,-1], $size, wxRE_MULTILINE );
61             my $font = Wx::Font->new( 10, wxDEFAULT, wxNORMAL, wxNORMAL, 0, 'Courier New' );
62            
63             EVT_KEY_DOWN( $self->{editor}, sub{ $self->_handle_key_down(@_) } );
64             }
65              
66             $self->{editor};
67             }
68              
69             sub _handle_key_down {
70             my ($self,$editor,$event) = @_;
71            
72             my $mod = $event->GetModifiers || 0;
73             my $code = $event->GetKeyCode;
74            
75             if( $code == 13 ){ # handle return
76             $event->Skip;
77             if( $self->_is_headline ){
78             $editor->Newline;
79             $self->default;
80             $self->_is_headline( 0 );
81             }
82             }
83             else{
84             $event->Skip;
85             }
86             }
87              
88             sub set_pod {
89             my ($self,$pod) = @_;
90            
91             if( @_ == 2 ){
92             $self->{pod} = $pod;
93             $self->{text} = $self->_pod2text;
94             }
95             }
96              
97             sub _is_headline {
98             my ($self,$bool) = @_;
99            
100             $self->{is_headline} = $bool if @_ == 2;
101             $self->{is_headline};
102             }
103              
104             sub get_pod {
105             my ($self) = @_;
106            
107             $self->_text2pod;
108             }
109              
110             sub _pod2text {
111             my ($self) = @_;
112            
113             my $pod = $self->{pod};
114             my $parser = Wx::Perl::PodEditor::PodParser->new( $self->_editor );
115             $parser->parse_string_document( $pod );
116             }
117              
118             sub _text2pod {
119             my ($self) = @_;
120            
121             my $buffer = $self->_editor->GetBuffer;
122             my $file_handler = Wx::RichTextXMLHandler->new( '', '', wxRICHTEXT_TYPE_XML );
123             $buffer->AddHandler( $file_handler );
124            
125             open my $fh, '>', \my $xml;
126             $file_handler->SaveFile( $buffer, $fh );
127            
128             warn $xml;
129             my $parser = Wx::Perl::PodEditor::XMLParser->new;
130             $parser->parse( $xml );
131             }
132              
133             sub AUTOLOAD {
134             my ($self) = shift;
135             my $name = $AUTOLOAD;
136            
137             $name =~ s/.*:://;
138            
139             return if $name eq 'DESTROY';
140            
141             my $editor = $self->_editor;
142             if( my $sub = $editor->can( $name ) ){
143             $sub->( $editor, @_ )
144             }
145             else{
146             my @info = caller(0);
147             my $package = __PACKAGE__;
148             my $msg = qq~Can't locate object method "$name" via package "$package" at $info[1] line $info[2]~;
149             print STDERR $msg;
150             exit;
151             }
152             }
153              
154             1;
155             __END__