Curses-UI
view release on metacpan or search on metacpan
lib/Curses/UI/TextEditor.pm view on Meta::CPAN
$realxpos
);
}
$this->{-canvasscr}->attroff(A_UNDERLINE) if $this->{-showlines};
$this->{-canvasscr}->attroff(A_REVERSE) if $this->{-reverse};
$this->{-canvasscr}->noutrefresh();
doupdate() unless $no_doupdate;
return $this;
}
sub draw(;$)
{
my $this = shift;
my $no_doupdate = shift || 0;
$this->SUPER::draw(1) or return $this;
$this->layout_content;
$this->draw_text(1);
doupdate() unless $no_doupdate;
return $this;
}
sub event_onblur()
{
my $this = shift;
$this->SUPER::event_onblur;
# Set the cursor position to the startposition
# if -homeonblur is set.
if ($this->{-homeonblur}) {
$this->cursor_to_home;
$this->layout_content;
}
return $this;
}
sub event_keypress ($;)
{
my $this = shift;
my $key = shift;
# Reset the field that tracks if undoinfo has already
# been saved or not.
$this->resetsetundo();
# Pasting more than one char/line is possible. As long
# as you do it at once (no other actions in between are
# allowed).
if (defined $this->{-prevkey} and $this->{-prevkey} ne $key) {
$this->do_new_pastebuffer(1);
} else {
$this->do_new_pastebuffer(0);
}
# Backup, in case illegal input is done.
my %backup = %{$this};
# Process bindings.
my $ret = $this->process_bindings($key);
# Did the widget loose focus, due to the keypress?
return $this unless $this->{-focus};
# To upper or to lower?
if ($this->{-toupper}) {
$this->{-text} = uc $this->{-text};
} elsif ($this->{-tolower}) {
$this->{-text} = lc $this->{-text};
}
# Check for illegal input.
my $is_illegal = 0;
if ($this->{-maxlength}) {
$is_illegal = 1 if length($this->{-text}) > $this->{-maxlength};
}
if (not $is_illegal and defined $this->{-maxlines}) {
my $lines = $this->split_to_lines($this->{-text});
$is_illegal = 1 if @$lines > $this->{-maxlines};
}
if (not $is_illegal and defined $this->{-regexp}) {
my $e = '$is_illegal = (not $this->{-text} =~ ' . $this->{-regexp} . ')';
eval $e;
}
if ($is_illegal) # Illegal input? Then restore and bail out.
{
while (my ($k,$v) = each %backup) {
$this->{$k} = $v;
}
$this->dobeep();
} else { # Legal input? Redraw the text.
$this->run_event('-onchange');
$this->draw(1);
}
# Save the current key.
$this->{-prevkey} = $key;
return $ret;
}
sub add_string($;)
{
my $this = shift;
my $ch = shift;
my @ch = split //, $ch;
$ch = '';
foreach (@ch) {
$ch .= $this->key_to_ascii($_);
}
$this->set_undoinfo;
PASTED: for (;;)
{
my $binding = $this->{-bindings}->{$ch};
$binding = 'add-string' unless defined $binding;
if ($ch eq "-1") {
last PASTED;
} elsif ( $binding eq 'add-string' ) {
substr($this->{-text}, $this->{-pos}, 0) = $ch;
$this->{-pos} += length($ch);
} elsif ( $binding eq 'newline' ) {
$this->process_bindings($ch);
}
# Multiple characters at input? This is probably a
# pasted string. Get it and process it. Don't do
# special bindings, but only add-string and newline.
$ch = $this->get_key(0);
}
$this->layout_content;
$this->set_curxpos;
return $this;
}
sub toggle_showoverflow()
{
my $this = shift;
$this->{-showoverflow} = ! $this->{-showoverflow};
return $this;
}
sub toggle_wrapping()
( run in 4.350 seconds using v1.01-cache-2.11-cpan-df04353d9ac )