1
package Padre::Wx::Dialog::Goto;
7
use Padre::Wx::Role::MainChild ();
11
Padre::Wx::Role::MainChild
19
Padre::Wx::Dialog::Goto - a dialog to jump to a user-specified line/position
25
my $goto = Padre::Wx::Dialog::Goto->new($main);
27
Returns a new C<Padre::Wx::Dialog::Goto> instance
35
# Create the Wx dialog
36
my $self = $class->SUPER::new(
40
Wx::wxDefaultPosition,
42
Wx::wxRESIZE_BORDER | Wx::wxSYSTEM_MENU | Wx::wxCAPTION | Wx::wxCLOSE_BOX
46
$self->SetMinSize( [ 330, 180 ] );
48
# create sizer that will host all controls
49
my $sizer = Wx::BoxSizer->new(Wx::wxHORIZONTAL);
52
$self->_create_controls($sizer);
54
# Bind the control events
57
# wrap everything in a vbox to add some padding
58
$self->SetSizer($sizer);
60
$self->CentreOnParent;
66
# Create dialog controls
68
sub _create_controls {
69
my ( $self, $sizer ) = @_;
72
# a label to display current line/position
73
$self->{current} = Wx::StaticText->new( $self, -1, '' );
76
$self->{goto_label} = Wx::StaticText->new( $self, -1, '' );
78
# Text field for the line number/position
79
$self->{goto_text} = Wx::TextCtrl->new( $self, -1, '' );
82
$self->{status_line} = Wx::StaticText->new( $self, -1, '' );
84
# Line or position choice
85
$self->{line_mode} = Wx::RadioBox->new(
86
$self, -1, Wx::gettext('Position type'),
87
Wx::wxDefaultPosition, Wx::wxDefaultSize,
88
[ Wx::gettext('Line number'), Wx::gettext('Character position') ]
91
# OK button (obviously)
92
$self->{button_ok} = Wx::Button->new(
93
$self, Wx::wxID_OK, Wx::gettext('&OK'),
95
$self->{button_ok}->SetDefault;
96
$self->{button_ok}->Enable(0);
98
# Cancel button (obviously)
99
$self->{button_cancel} = Wx::Button->new(
100
$self, Wx::wxID_CANCEL, Wx::gettext('&Cancel'),
106
my $button_sizer = Wx::BoxSizer->new(Wx::wxHORIZONTAL);
107
$button_sizer->Add( $self->{button_ok}, 1, 0, 0 );
108
$button_sizer->Add( $self->{button_cancel}, 1, Wx::wxLEFT, 5 );
109
$button_sizer->AddSpacer(5);
111
# Create the main vertical sizer
112
my $vsizer = Wx::BoxSizer->new(Wx::wxVERTICAL);
113
$vsizer->Add( $self->{line_mode}, 0, Wx::wxALL | Wx::wxEXPAND, 3 );
114
$vsizer->Add( $self->{current}, 0, Wx::wxALL | Wx::wxEXPAND, 3 );
115
$vsizer->Add( $self->{goto_label}, 0, Wx::wxALL | Wx::wxEXPAND, 3 );
116
$vsizer->Add( $self->{goto_text}, 0, Wx::wxALL | Wx::wxEXPAND, 3 );
117
$vsizer->Add( $self->{status_line}, 0, Wx::wxALL | Wx::wxEXPAND, 2 );
118
$vsizer->AddSpacer(5);
119
$vsizer->Add( $button_sizer, 0, Wx::wxALIGN_RIGHT, 5 );
120
$vsizer->AddSpacer(5);
122
# Wrap with a horizontal sizer to get left/right padding
123
$sizer->Add( $vsizer, 1, Wx::wxALL | Wx::wxEXPAND, 5 );
130
# Binds control events
135
Wx::Event::EVT_ACTIVATE(
139
$self->_update_from_editor;
140
$self->_update_label;
155
Wx::Event::EVT_RADIOBOX(
160
$self->_update_label;
166
Wx::Event::EVT_BUTTON(
168
$self->{button_cancel},
175
Wx::Event::EVT_BUTTON(
179
$_[0]->_on_ok_button;
187
# Private method to handle the pressing of the OK button
193
my $line_mode = $self->{line_mode}->GetStringSelection eq Wx::gettext('Line number');
194
my $value = $self->{goto_text}->GetValue;
195
my $editor = $self->current->editor;
198
my $max_value = $line_mode ? $self->{max_line_number} : $self->{max_position};
199
$value = $max_value if $value > $max_value;
205
# And then goto to the line or position
206
# keeping it in the center of the editor
209
$editor->goto_line_centerize($value);
211
$editor->goto_pos_centerize($value);
218
# Private method to update the goto line/position label
222
my $line_mode = $self->{line_mode}->GetStringSelection;
223
if ( $line_mode eq Wx::gettext('Line number') ) {
225
->SetLabel( sprintf( Wx::gettext('&Enter a line number between 1 and %s:'), $self->{max_line_number} ) );
226
$self->{current}->SetLabel( sprintf( Wx::gettext('Current line number: %s'), $self->{current_line_number} ) );
227
} elsif ( $line_mode eq Wx::gettext('Character position') ) {
229
->SetLabel( sprintf( Wx::gettext('&Enter a position between 1 and %s:'), $self->{max_position} ) );
230
$self->{current}->SetLabel( sprintf( Wx::gettext('Current position: %s'), $self->{current_position} ) );
232
warn "Invalid choice value '$line_mode'\n";
237
# Private method to validate user input
242
my $line_mode = $self->{line_mode}->GetStringSelection eq Wx::gettext('Line number');
243
my $value = $self->{goto_text}->GetValue;
245
# If it is empty, do not warn about it but disable it though
246
if ( $value eq '' ) {
247
$self->{status_line}->SetLabel('');
248
$self->{button_ok}->Enable(0);
252
# Should be an integer number
253
if ( $value !~ /^\d+$/ ) {
254
$self->{status_line}->SetLabel( Wx::gettext('Not a positive number!') );
255
$self->{button_ok}->Enable(0);
260
my $editor = $self->current->editor;
261
my $max_value = $line_mode ? $self->{max_line_number} : $self->{max_position};
262
if ( $value == 0 or $value > $max_value ) {
263
$self->{status_line}->SetLabel( Wx::gettext('Out of range!') );
264
$self->{button_ok}->Enable(0);
269
# Not problem, enable everything and clear errors
270
$self->{button_ok}->Enable(1);
271
$self->{status_line}->SetLabel('');
275
# Private method to update statistics from the current editor
277
sub _update_from_editor {
280
# Get the current editor
281
my $editor = $self->current->editor;
287
# Update max line number and position fields
288
$self->{max_line_number} = $editor->GetLineCount;
289
$self->{max_position} = $editor->GetLength + 1;
290
$self->{current_line_number} = $editor->GetCurrentLine + 1;
291
$self->{current_position} = $editor->GetCurrentPos + 1;
303
Show the dialog that the user can use to go to to a line number or character
304
position. Returns C<undef>.
311
# Update current, and max bounds from the current editor
312
return unless $self->_update_from_editor;
315
$self->_update_label;
317
# Select all of the line number/position so the user can overwrite
318
# it quickly if he wants it
319
$self->{goto_text}->SetSelection( -1, -1 );
321
unless ( $self->IsShown ) {
323
# If it is not shown, show the dialog
327
# Win32 tip: Always focus on wxwidgets controls only after
328
# showing the dialog, otherwise you will lose the focus
329
$self->{goto_text}->SetFocus;
338
=head1 COPYRIGHT & LICENSE
340
Copyright 2008-2010 The Padre development team as listed in Padre.pm.
342
This program is free software; you can redistribute
343
it and/or modify it under the same terms as Perl itself.
345
The full text of the license can be found in the
346
LICENSE file included with this module.
350
# Copyright 2008-2010 The Padre development team as listed in Padre.pm.
352
# This program is free software; you can redistribute it and/or
353
# modify it under the same terms as Perl 5 itself.