package Kephra::Edit::Select; our $VERSION = '0.08'; use strict; use warnings; sub _ep_ref { Kephra::App::EditPanel::is( shift ) || Kephra::App::EditPanel::_ref() } sub _line_empty { my $line = shift; my $ep = _ep_ref( shift ); $line = $ep->GetCurrentLine() unless defined $line; return $ep->PositionFromLine($line) == $ep->GetLineEndPosition($line); } # sub get_block_start { my $pos = shift; my $ep = _ep_ref( shift ); $pos = $ep->GetCurrentPos unless defined $pos; my $line = $ep->LineFromPosition($pos); return $pos if _line_empty($line); return $pos if _line_empty($line-1) and $pos == $ep->PositionFromLine($line); my $cpos = $ep->GetCurrentPos; $ep->SetCurrentPos( $pos ); $ep->CmdKeyExecute(&Wx::wxSTC_CMD_PARAUP); $pos = $ep->GetCurrentPos; $ep->SetCurrentPos( $cpos ); return $pos; } sub get_block_end { my $pos = shift; my $ep = _ep_ref( shift ); $pos = $ep->GetCurrentPos unless defined $pos; my $line = $ep->LineFromPosition($pos); return $pos if _line_empty($line); return $pos if _line_empty($line+1) and $pos == $ep->GetLineEndPosition($line); my $cpos = $ep->GetCurrentPos; $ep->SetCurrentPos( $pos ); $ep->CmdKeyExecute(&Wx::wxSTC_CMD_PARADOWN); $line = $ep->GetCurrentLine(); $line--; $line-- until $ep->PositionFromLine($line)!=$ep->GetLineEndPosition($line); $pos = $ep->GetLineEndPosition($line); $ep->SetCurrentPos( $cpos ); return $pos; } sub to_block_begin{ _ep_ref()->CmdKeyExecute(&Wx::wxSTC_CMD_PARAUPEXTEND) } sub to_block_end { _ep_ref()->CmdKeyExecute(&Wx::wxSTC_CMD_PARADOWNEXTEND) } # sub nothing { my $ep = _ep_ref( shift ); my $pos = $ep->GetCurrentPos; $ep->SetSelection( $pos, $pos ) } sub word { my $pos = shift; my $ep = _ep_ref( shift ); $pos = $ep->GetCurrentPos unless defined $pos; $ep->SetSelection($ep->WordStartPosition($pos,1),$ep->WordEndPosition($pos,1)); } sub line { my $line = shift; my $ep = _ep_ref( shift ); $line = $ep->GetCurrentLine() unless defined $line; $ep->SetSelection($ep->PositionFromLine($line),$ep->GetLineEndPosition($line)); } sub block { my $pos = shift; my $ep = _ep_ref( shift ); $pos = $ep->GetCurrentPos unless defined $pos; $ep->SetSelection( get_block_start($pos), get_block_end($pos) ); } sub all { &document } sub document { _ep_ref()->SelectAll } sub all_if_non { my $ep = _ep_ref(); $ep->SelectAll if $ep->GetSelectionStart == $ep->GetSelectionEnd; my ($start, $end) = $ep->GetSelection; return $ep->GetTextRange( $start, $end ); } sub toggle_simple { # selects word line block or nothing my $ep = _ep_ref( shift ); my ($start, $end)= $ep->GetSelection; # initial selection my $startline = $ep->LineFromPosition($start); my $endline = $ep->LineFromPosition($end); return if _line_empty($startline) and _line_empty($endline); # try select word, if already more selected, do a line if ($startline == $endline){ word($start); my ($probestart, $probeend) = $ep->GetSelection; return unless $start <= $probestart and $end >= $probeend; line(); ($probestart, $probeend) = $ep->GetSelection; return unless $start == $probestart and $end == $probeend; } my $blockstart = get_block_start($start); my $blockend = get_block_end($end); # select nothing because block was selected return nothing() if $start == $blockstart and $end == $blockend; $ep->SetSelection($blockstart, $blockend); } sub toggle_content { # selects text inside of < > [] {} () '' "" my $ep = _ep_ref( shift ); my $min = my $max = my $pos = $ep->GetCurrentPos; my ($start, $end)= $ep->GetSelection; my $startline = $ep->LineFromPosition($start); my $endline = $ep->LineFromPosition($end); my $style = $ep->GetStyleAt($pos); # select quotetation, styles: 6" 7' re styles 17, 18 if ($style == 6 or $style == 7){ $min-- while $ep->GetStyleAt($min-1) == $style; $max++ while $ep->GetStyleAt($max+1) == $style; unless ($start==$min and $end-1==$max) { if ($start-1==$min and $end==$max) {$ep->SetSelection($min, $max+1)} else {$ep->SetSelection($min+1, $max)} return; } } #my %delimiter = ( #'>' => '<', ']'=>'[', '}'=>'{', ')'=>'(', #'/' => '/', '\'' => '\'', '"' => '"' #); #print "$start, $end--\n"; #$ep->GetTextRange(); #$ep->PositionFromLine($line) $ep->GetLineEndPosition($line); #$ep->BraceMatch($newpos) #my $blockstart = get_block_start($start); #my $blockend = get_block_end($end); #$ep->PositionFromLine($line); #$ep->GetLineEndPosition($line); #$pasttext =~ /([||||||])/ #/{|}|\(|\)|\[|\]/ #tr/{}()\[\]//; #$` #my $matchpos = $ep->BraceMatch(--$pos); #print '',($ep->GetSelection),"\n"; } # expand rectangular selection sub expand_rect_left{} sub expand_rect_right{} sub expand_rect_up{} sub expand_rect_down{} 1; __END__ =head1 NAME Kephra::Edit::Select - calls to select different text parts =head1 DESCRIPTION =over 4 =item nothing =item word =item line =item block =item document =back