64
64
# Dialog Controls, created in keyboard navigation order
67
$self->{filter_mode} = Wx::RadioBox->new(
69
Wx::gettext('Input/output:'),
72
[ Wx::gettext('$_ for both'),
74
# Wx::gettext('STDIN/STDOUT'),
75
Wx::gettext('wrap in map { }'),
76
Wx::gettext('wrap in grep { }'),
79
$self->{filter_mode_values} = { # Set position of each filter mode
67
87
my $source_label = Wx::StaticText->new( $self, -1, Wx::gettext('&Perl filter source:') );
68
88
$self->{source} = Wx::TextCtrl->new(
69
$self, -1, '', Wx::wxDefaultPosition, Wx::wxDefaultSize,
70
Wx::wxRE_MULTILINE | Wx::wxWANTS_CHARS
89
$self, -1, '', Wx::DefaultPosition, Wx::DefaultSize,
90
Wx::RE_MULTILINE | Wx::WANTS_CHARS
74
94
my $original_label = Wx::StaticText->new( $self, -1, Wx::gettext('Or&iginal text:') );
75
95
$self->{original_text} = Wx::TextCtrl->new(
76
$self, -1, '', Wx::wxDefaultPosition, Wx::wxDefaultSize,
77
Wx::wxTE_MULTILINE | Wx::wxNO_FULL_REPAINT_ON_RESIZE
96
$self, -1, '', Wx::DefaultPosition, Wx::DefaultSize,
97
Wx::TE_MULTILINE | Wx::NO_FULL_REPAINT_ON_RESIZE
80
100
# Matched readonly text field
81
101
my $result_label = Wx::StaticText->new( $self, -1, Wx::gettext('&Output text:') );
82
102
$self->{result_text} = Wx::RichTextCtrl->new(
83
$self, -1, '', Wx::wxDefaultPosition, Wx::wxDefaultSize,
84
Wx::wxRE_MULTILINE | Wx::wxRE_READONLY | Wx::wxWANTS_CHARS # Otherwise arrows will not work on win32
103
$self, -1, '', Wx::DefaultPosition, Wx::DefaultSize,
104
Wx::RE_MULTILINE | Wx::RE_READONLY | Wx::WANTS_CHARS # Otherwise arrows will not work on win32
98
118
$self->{close_button} = Wx::Button->new(
99
$self, Wx::wxID_CANCEL, Wx::gettext('&Close'),
119
$self, Wx::ID_CANCEL, Wx::gettext('&Close'),
102
my $buttons = Wx::BoxSizer->new(Wx::wxHORIZONTAL);
122
my $buttons = Wx::BoxSizer->new(Wx::HORIZONTAL);
103
123
$buttons->AddStretchSpacer;
104
$buttons->Add( $self->{run_button}, 0, Wx::wxALL, 1 );
105
$buttons->Add( $self->{insert_button}, 0, Wx::wxALL, 1 );
106
$buttons->Add( $self->{close_button}, 0, Wx::wxALL, 1 );
124
$buttons->Add( $self->{run_button}, 0, Wx::ALL, 1 );
125
$buttons->Add( $self->{insert_button}, 0, Wx::ALL, 1 );
126
$buttons->Add( $self->{close_button}, 0, Wx::ALL, 1 );
107
127
$buttons->AddStretchSpacer;
111
131
# Vertical layout of the left hand side
112
my $left = Wx::BoxSizer->new(Wx::wxVERTICAL);
114
$left->Add( $source_label, 0, Wx::wxALL | Wx::wxEXPAND, 1 );
115
$left->Add( $self->{source}, 1, Wx::wxALL | Wx::wxEXPAND, 1 );
117
$left->Add( $original_label, 0, Wx::wxALL | Wx::wxEXPAND, 1 );
118
$left->Add( $self->{original_text}, 1, Wx::wxALL | Wx::wxEXPAND, 1 );
119
$left->Add( $result_label, 0, Wx::wxALL | Wx::wxEXPAND, 1 );
120
$left->Add( $self->{result_text}, 1, Wx::wxALL | Wx::wxEXPAND, 1 );
132
my $left = Wx::BoxSizer->new(Wx::VERTICAL);
134
$left->Add( $self->{filter_mode}, 0, Wx::ALL | Wx::EXPAND, 1 );
136
$left->Add( $source_label, 0, Wx::ALL | Wx::EXPAND, 1 );
137
$left->Add( $self->{source}, 1, Wx::ALL | Wx::EXPAND, 1 );
139
$left->Add( $original_label, 0, Wx::ALL | Wx::EXPAND, 1 );
140
$left->Add( $self->{original_text}, 1, Wx::ALL | Wx::EXPAND, 1 );
141
$left->Add( $result_label, 0, Wx::ALL | Wx::EXPAND, 1 );
142
$left->Add( $self->{result_text}, 1, Wx::ALL | Wx::EXPAND, 1 );
121
143
$left->AddSpacer(5);
122
$left->Add( $buttons, 0, Wx::wxALL | Wx::wxEXPAND, 1 );
144
$left->Add( $buttons, 0, Wx::ALL | Wx::EXPAND, 1 );
125
$sizer->Add( $left, 1, Wx::wxALL | Wx::wxEXPAND, 5 );
147
$sizer->Add( $left, 1, Wx::ALL | Wx::EXPAND, 5 );
128
150
sub _bind_events {
266
288
my $source = $self->{source}->GetValue;
267
289
my $original_text = $self->{original_text}->GetValue;
290
my $filter_mode = $self->{filter_mode}->GetSelection;
291
my $document = $self->current->document;
292
my $nl = defined($document) ? $document->newline : "\n"; # Use (bad) default
269
295
$self->{result_text}->Clear;
272
my $result_text = eval $source;
299
my $code = eval "use utf8;package ".__PACKAGE__."::Sandbox;sub{$source\n}";
302
if ( $filter_mode == $self->{filter_mode_values}->{default} ) {
303
$result_text = eval {
304
local $_ = $original_text;
308
} elsif ( $filter_mode == $self->{filter_mode_values}->{std} ) {
310
# TODO: use STDIN/STDOUT
311
# $_ = $original_text;
312
# $result_text = eval $source;
313
} elsif ( $filter_mode == $self->{filter_mode_values}->{map} ) {
314
$result_text = eval { join( $nl, map { $code->() } split( /$nl/, $original_text ) ) };
315
} elsif ( $filter_mode == $self->{filter_mode_values}->{grep} ) {
316
$result_text = eval { join( $nl, grep { $code->() } split( /$nl/, $original_text ) ) };
320
# Common eval error handling
274
$result_text = Wx::gettext('Error') . ":\n" . $@;
277
if ( defined $result_text ) {
322
# TODO: Set text color red
323
$self->{result_text}->SetValue(Wx::gettext("Error:\n") . $@);
324
} elsif ( defined $result_text ) {
278
325
$self->{result_text}->SetValue($result_text);
328
# TODO: Set text color red
329
$self->{result_text}->SetValue('undef');