File Coverage

lib/Kephra/Edit/Select.pm
Criterion Covered Total %
statement 6 95 6.3
branch 0 40 0.0
condition 0 27 0.0
subroutine 2 21 9.5
pod 5 17 29.4
total 13 200 6.5


line stmt bran cond sub pod time code
1             package Kephra::Edit::Select;
2             our $VERSION = '0.08';
3            
4 1     1   1098 use strict;
  1         3  
  1         34  
5 1     1   14 use warnings;
  1         5  
  1         1402  
6 0 0   0     sub _ep_ref { Kephra::App::EditPanel::is( shift ) || Kephra::App::EditPanel::_ref() }
7             sub _line_empty {
8 0     0     my $line = shift;
9 0           my $ep = _ep_ref( shift );
10 0 0         $line = $ep->GetCurrentLine() unless defined $line;
11 0           return $ep->PositionFromLine($line) == $ep->GetLineEndPosition($line);
12             }
13             #
14             sub get_block_start {
15 0     0 0   my $pos = shift;
16 0           my $ep = _ep_ref( shift );
17 0 0         $pos = $ep->GetCurrentPos unless defined $pos;
18 0           my $line = $ep->LineFromPosition($pos);
19 0 0         return $pos if _line_empty($line);
20 0 0 0       return $pos if _line_empty($line-1) and $pos == $ep->PositionFromLine($line);
21 0           my $cpos = $ep->GetCurrentPos;
22 0           $ep->SetCurrentPos( $pos );
23 0           $ep->CmdKeyExecute(&Wx::wxSTC_CMD_PARAUP);
24 0           $pos = $ep->GetCurrentPos;
25 0           $ep->SetCurrentPos( $cpos );
26 0           return $pos;
27             }
28            
29             sub get_block_end {
30 0     0 0   my $pos = shift;
31 0           my $ep = _ep_ref( shift );
32 0 0         $pos = $ep->GetCurrentPos unless defined $pos;
33 0           my $line = $ep->LineFromPosition($pos);
34 0 0         return $pos if _line_empty($line);
35 0 0 0       return $pos if _line_empty($line+1) and $pos == $ep->GetLineEndPosition($line);
36 0           my $cpos = $ep->GetCurrentPos;
37 0           $ep->SetCurrentPos( $pos );
38 0           $ep->CmdKeyExecute(&Wx::wxSTC_CMD_PARADOWN);
39 0           $line = $ep->GetCurrentLine();
40 0           $line--;
41 0           $line-- until $ep->PositionFromLine($line)!=$ep->GetLineEndPosition($line);
42 0           $pos = $ep->GetLineEndPosition($line);
43 0           $ep->SetCurrentPos( $cpos );
44 0           return $pos;
45             }
46            
47 0     0 0   sub to_block_begin{ _ep_ref()->CmdKeyExecute(&Wx::wxSTC_CMD_PARAUPEXTEND) }
48 0     0 0   sub to_block_end { _ep_ref()->CmdKeyExecute(&Wx::wxSTC_CMD_PARADOWNEXTEND) }
49             #
50             sub nothing {
51 0     0 1   my $ep = _ep_ref( shift );
52 0           my $pos = $ep->GetCurrentPos;
53 0           $ep->SetSelection( $pos, $pos )
54             }
55            
56             sub word {
57 0     0 1   my $pos = shift;
58 0           my $ep = _ep_ref( shift );
59 0 0         $pos = $ep->GetCurrentPos unless defined $pos;
60 0           $ep->SetSelection($ep->WordStartPosition($pos,1),$ep->WordEndPosition($pos,1));
61             }
62             sub line {
63 0     0 1   my $line = shift;
64 0           my $ep = _ep_ref( shift );
65 0 0         $line = $ep->GetCurrentLine() unless defined $line;
66 0           $ep->SetSelection($ep->PositionFromLine($line),$ep->GetLineEndPosition($line));
67             }
68            
69             sub block {
70 0     0 1   my $pos = shift;
71 0           my $ep = _ep_ref( shift );
72 0 0         $pos = $ep->GetCurrentPos unless defined $pos;
73 0           $ep->SetSelection( get_block_start($pos), get_block_end($pos) );
74             }
75 0     0 0   sub all { &document }
76 0     0 1   sub document { _ep_ref()->SelectAll }
77             sub all_if_non {
78 0     0 0   my $ep = _ep_ref();
79 0 0         $ep->SelectAll if $ep->GetSelectionStart == $ep->GetSelectionEnd;
80 0           my ($start, $end) = $ep->GetSelection;
81 0           return $ep->GetTextRange( $start, $end );
82             }
83            
84             sub toggle_simple { # selects word line block or nothing
85 0     0 0   my $ep = _ep_ref( shift );
86 0           my ($start, $end)= $ep->GetSelection; # initial selection
87 0           my $startline = $ep->LineFromPosition($start);
88 0           my $endline = $ep->LineFromPosition($end);
89            
90 0 0 0       return if _line_empty($startline) and _line_empty($endline);
91            
92             # try select word, if already more selected, do a line
93 0 0         if ($startline == $endline){
94 0           word($start);
95 0           my ($probestart, $probeend) = $ep->GetSelection;
96 0 0 0       return unless $start <= $probestart and $end >= $probeend;
97 0           line();
98 0           ($probestart, $probeend) = $ep->GetSelection;
99 0 0 0       return unless $start == $probestart and $end == $probeend;
100             }
101            
102 0           my $blockstart = get_block_start($start);
103 0           my $blockend = get_block_end($end);
104            
105             # select nothing because block was selected
106 0 0 0       return nothing() if $start == $blockstart and $end == $blockend;
107            
108 0           $ep->SetSelection($blockstart, $blockend);
109             }
110            
111             sub toggle_content { # selects text inside of < > [] {} () '' ""
112 0     0 0   my $ep = _ep_ref( shift );
113 0           my $min = my $max = my $pos = $ep->GetCurrentPos;
114 0           my ($start, $end)= $ep->GetSelection;
115 0           my $startline = $ep->LineFromPosition($start);
116 0           my $endline = $ep->LineFromPosition($end);
117              
118 0           my $style = $ep->GetStyleAt($pos);
119             # select quotetation, styles: 6" 7' re styles 17, 18
120 0 0 0       if ($style == 6 or $style == 7){
121 0           $min-- while $ep->GetStyleAt($min-1) == $style;
122 0           $max++ while $ep->GetStyleAt($max+1) == $style;
123              
124 0 0 0       unless ($start==$min and $end-1==$max) {
125 0 0 0       if ($start-1==$min and $end==$max) {$ep->SetSelection($min, $max+1)}
  0            
  0            
126             else {$ep->SetSelection($min+1, $max)}
127 0           return;
128             }
129             }
130             #my %delimiter = (
131             #'>' => '<', ']'=>'[', '}'=>'{', ')'=>'(',
132             #'/' => '/', '\'' => '\'', '"' => '"'
133             #);
134             #print "$start, $end--\n";
135             #$ep->GetTextRange();
136             #$ep->PositionFromLine($line) $ep->GetLineEndPosition($line);
137             #$ep->BraceMatch($newpos)
138             #my $blockstart = get_block_start($start);
139             #my $blockend = get_block_end($end);
140             #$ep->PositionFromLine($line);
141             #$ep->GetLineEndPosition($line);
142             #$pasttext =~ /([||||||])/
143             #/{|}|\(|\)|\[|\]/
144             #tr/{}()\[\]//;
145             #$`
146             #my $matchpos = $ep->BraceMatch(--$pos);
147            
148             #print '',($ep->GetSelection),"\n";
149             }
150            
151              
152             # expand rectangular selection
153 0     0 0   sub expand_rect_left{}
154 0     0 0   sub expand_rect_right{}
155 0     0 0   sub expand_rect_up{}
156 0     0 0   sub expand_rect_down{}
157              
158             1;
159             __END__