line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Kephra::App::EditPanel; |
2
|
|
|
|
|
|
|
our $VERSION = '0.14'; |
3
|
|
|
|
|
|
|
|
4
|
1
|
|
|
1
|
|
1244
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
39
|
|
5
|
1
|
|
|
1
|
|
6
|
use warnings; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
4506
|
|
6
|
|
|
|
|
|
|
# |
7
|
|
|
|
|
|
|
# internal API to config und app pointer |
8
|
|
|
|
|
|
|
# |
9
|
|
|
|
|
|
|
my $ref; |
10
|
|
|
|
|
|
|
my %mouse_commands; |
11
|
0
|
|
|
0
|
|
|
sub _ref { $ref } |
12
|
0
|
0
|
|
0
|
|
|
sub _set_ref { $ref = $_[0] if is($_[0]) } |
13
|
0
|
|
|
0
|
|
|
sub _all_ref { Kephra::Document::Data::get_all_ep() } |
14
|
0
|
0
|
|
0
|
0
|
|
sub is { 1 if ref $_[0] eq 'Wx::StyledTextCtrl'} |
15
|
0
|
|
|
0
|
|
|
sub _config { Kephra::API::settings()->{editpanel} } |
16
|
|
|
|
|
|
|
# splitter_pos |
17
|
|
|
|
|
|
|
sub new { |
18
|
0
|
|
|
0
|
0
|
|
my $ep = Wx::StyledTextCtrl->new( Kephra::App::Window::_ref() ); |
19
|
0
|
0
|
|
|
|
|
$ep->DragAcceptFiles(1) if Wx::wxMSW(); |
20
|
0
|
|
|
|
|
|
return $ep; |
21
|
|
|
|
|
|
|
} |
22
|
0
|
0
|
|
0
|
0
|
|
sub gets_focus { Wx::Window::SetFocus( _ref() ) if is( _ref() ) } |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
# general settings |
25
|
|
|
|
|
|
|
sub apply_settings_here { |
26
|
0
|
|
0
|
0
|
0
|
|
my $ep = shift || _ref() || _create(); |
27
|
0
|
0
|
|
|
|
|
return unless is($ep); |
28
|
0
|
|
|
|
|
|
my $conf = _config(); |
29
|
|
|
|
|
|
|
|
30
|
0
|
|
|
|
|
|
load_font($ep); |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
# indicators: caret, selection, whitespaces... |
33
|
0
|
|
|
|
|
|
Kephra::App::EditPanel::Indicator::apply_all_here($ep); |
34
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
# Margins on left side |
36
|
0
|
|
|
|
|
|
Kephra::App::EditPanel::Margin::apply_settings_here($ep); |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
#misc: scroll width, codepage, wordchars |
39
|
0
|
|
|
|
|
|
apply_autowrap_settings_here($ep); |
40
|
|
|
|
|
|
|
|
41
|
0
|
0
|
|
|
|
|
$ep->SetScrollWidth($conf->{scroll_width}) |
42
|
|
|
|
|
|
|
unless $conf->{scroll_width} eq 'auto'; |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
#wxSTC_CP_UTF8 Wx::wxUNICODE() |
45
|
0
|
|
|
|
|
|
$ep->SetCodePage(65001);# |
46
|
0
|
|
|
|
|
|
set_word_chars_here($ep); |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
# internal |
49
|
0
|
|
|
|
|
|
$ep->SetLayoutCache(&Wx::wxSTC_CACHE_PAGE); |
50
|
0
|
|
|
|
|
|
$ep->SetBufferedDraw(1); |
51
|
0
|
0
|
|
|
|
|
$conf->{contextmenu}{visible} eq 'default' ? $ep->UsePopUp(1) : $ep->UsePopUp(0); |
52
|
|
|
|
|
|
|
|
53
|
0
|
|
|
|
|
|
Kephra::Edit::eval_newline_sub(); |
54
|
0
|
|
|
|
|
|
Kephra::Edit::Marker::define_marker($ep); |
55
|
0
|
|
|
|
|
|
connect_events($ep); |
56
|
|
|
|
|
|
|
Kephra::EventTable::add_call ( 'editpanel.focus', 'editpanel', sub { |
57
|
0
|
0
|
|
0
|
|
|
Wx::Window::SetFocus( _ref() ) unless $Kephra::temp{dialog}{active}; |
58
|
0
|
0
|
|
|
|
|
}, __PACKAGE__ ) if $conf->{auto}{focus}; |
59
|
|
|
|
|
|
|
Kephra::EventTable::add_call( 'document.text.change', 'update_edit_pos', sub { |
60
|
0
|
|
|
0
|
|
|
Kephra::Document::Data::attr('edit_pos', _ref()->GetCurrentPos()); |
61
|
0
|
|
|
|
|
|
}, __PACKAGE__); |
62
|
|
|
|
|
|
|
} |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
sub connect_events { |
65
|
0
|
|
0
|
0
|
0
|
|
my $ep = shift || _ref(); |
66
|
0
|
|
|
|
|
|
my $trigger = \&Kephra::EventTable::trigger; |
67
|
0
|
|
|
|
|
|
my $config = _config(); |
68
|
0
|
|
|
|
|
|
my $selection; |
69
|
|
|
|
|
|
|
my $rectangular_mode; |
70
|
0
|
|
|
|
|
|
my ($dragpos,$droppos); |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
# override sci presets |
73
|
0
|
|
|
|
|
|
Wx::Event::EVT_DROP_FILES ($ep, \&Kephra::File::add_dropped); |
74
|
|
|
|
|
|
|
Wx::Event::EVT_STC_START_DRAG ($ep, -1, sub { |
75
|
0
|
|
|
0
|
|
|
my ( $ep, $event) = @_; |
76
|
0
|
|
|
|
|
|
$dragpos = $ep->GetCurrentPos(); |
77
|
0
|
|
|
|
|
|
$selection = $ep->GetSelectedText(); |
78
|
0
|
|
|
|
|
|
$rectangular_mode = $ep->SelectionIsRectangle(); |
79
|
0
|
|
|
|
|
|
$event->Skip; |
80
|
0
|
|
|
|
|
|
}); |
81
|
0
|
|
|
0
|
|
|
Wx::Event::EVT_STC_DRAG_OVER ($ep, -1, sub { $droppos = $_[1]->GetPosition }); |
|
0
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
Wx::Event::EVT_STC_DO_DROP ($ep, -1, sub { |
83
|
0
|
|
|
0
|
|
|
my ( $ep, $event) = @_; |
84
|
0
|
0
|
|
|
|
|
$rectangular_mode |
85
|
|
|
|
|
|
|
? Kephra::Edit::paste_rectangular($selection, $ep, $dragpos, $droppos) |
86
|
|
|
|
|
|
|
: $event->Skip; |
87
|
0
|
|
|
|
|
|
}); |
88
|
|
|
|
|
|
|
|
89
|
0
|
|
|
0
|
|
|
Wx::Event::EVT_ENTER_WINDOW ($ep, sub { &$trigger('editpanel.focus')} ); |
|
0
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
Wx::Event::EVT_LEFT_DOWN ($ep, sub { |
91
|
0
|
|
|
0
|
|
|
my ($ep, $event) = @_; |
92
|
0
|
|
|
|
|
|
my $nr = Kephra::App::EditPanel::Margin::in_nr( $event->GetX, $ep ); |
93
|
0
|
0
|
|
|
|
|
if ($nr == -1) { Kephra::Edit::copy() if clicked_on_selection($event) } |
|
0
|
0
|
|
|
|
|
|
94
|
0
|
|
|
|
|
|
else { Kephra::App::EditPanel::Margin::on_left_click($ep, $event, $nr) } |
95
|
|
|
|
|
|
|
|
96
|
0
|
|
|
|
|
|
$event->Skip; |
97
|
0
|
|
|
|
|
|
}); |
98
|
|
|
|
|
|
|
Wx::Event::EVT_MIDDLE_DOWN ($ep, sub { |
99
|
0
|
|
|
0
|
|
|
my ($ep, $event) = @_; |
100
|
0
|
|
|
|
|
|
my $nr = Kephra::App::EditPanel::Margin::in_nr( $event->GetX, $ep ); |
101
|
|
|
|
|
|
|
# click is above text area |
102
|
0
|
0
|
|
|
|
|
if ($nr == -1) { |
103
|
0
|
0
|
|
|
|
|
if ($event->LeftIsDown){ |
104
|
0
|
|
|
|
|
|
Kephra::Edit::paste(); |
105
|
0
|
|
|
|
|
|
set_caret_on_cursor($event); |
106
|
|
|
|
|
|
|
} |
107
|
|
|
|
|
|
|
# just middle clicked |
108
|
|
|
|
|
|
|
else { |
109
|
0
|
0
|
|
|
|
|
if ($ep->GetSelectedText){ |
110
|
0
|
0
|
|
|
|
|
if (clicked_on_selection($event, $ep)) { |
111
|
0
|
|
|
|
|
|
Kephra::Edit::Search::set_selection_as_find_item(); |
112
|
0
|
|
|
|
|
|
Kephra::Edit::Search::find_next(); |
113
|
|
|
|
|
|
|
} |
114
|
0
|
|
|
|
|
|
else { insert_selection_at_cursor($event, $ep) } |
115
|
|
|
|
|
|
|
} |
116
|
0
|
|
|
|
|
|
else { Kephra::Edit::Goto::last_edit() } |
117
|
|
|
|
|
|
|
} |
118
|
|
|
|
|
|
|
} |
119
|
0
|
|
|
|
|
|
else { Kephra::App::EditPanel::Margin::on_middle_click($ep, $event, $nr) } |
120
|
0
|
|
|
|
|
|
}); |
121
|
|
|
|
|
|
|
Wx::Event::EVT_RIGHT_DOWN ($ep, sub { |
122
|
0
|
|
|
0
|
|
|
my ($ep, $event) = @_; |
123
|
0
|
|
|
|
|
|
my $nr = Kephra::App::EditPanel::Margin::in_nr( $event->GetX, $ep ); |
124
|
0
|
0
|
|
|
|
|
if ($nr == -1) { |
|
0
|
|
|
|
|
|
|
125
|
0
|
0
|
|
|
|
|
if ($event->LeftIsDown){ |
126
|
0
|
0
|
|
|
|
|
Kephra::Edit::_selection_left_to_right($ep) |
127
|
|
|
|
|
|
|
? Kephra::Edit::cut() |
128
|
|
|
|
|
|
|
: Kephra::Edit::clear(); |
129
|
0
|
|
|
|
|
|
set_caret_on_cursor($event); |
130
|
|
|
|
|
|
|
} else { |
131
|
0
|
|
|
|
|
|
my $mconf = $config->{contextmenu}; |
132
|
0
|
0
|
|
|
|
|
if ($mconf->{visible} eq 'custom'){ |
133
|
0
|
0
|
|
|
|
|
my $menu_id = $ep->GetSelectedText |
134
|
|
|
|
|
|
|
? $mconf->{ID_selection} : $mconf->{ID_normal}; |
135
|
0
|
|
|
|
|
|
my $menu = Kephra::App::ContextMenu::get($menu_id); |
136
|
0
|
0
|
|
|
|
|
$ep->PopupMenu($menu, $event->GetX, $event->GetY) if $menu; |
137
|
|
|
|
|
|
|
} |
138
|
|
|
|
|
|
|
} |
139
|
|
|
|
|
|
|
} else {Kephra::App::EditPanel::Margin::on_right_click($ep, $event, $nr)} |
140
|
0
|
|
|
|
|
|
}); |
141
|
|
|
|
|
|
|
#Wx::EVT_SET_FOCUS ($ep, sub {}); |
142
|
0
|
|
|
|
|
|
Wx::Event::EVT_STC_SAVEPOINTREACHED($ep, -1, \&Kephra::File::savepoint_reached); |
143
|
0
|
|
|
|
|
|
Wx::Event::EVT_STC_SAVEPOINTLEFT($ep, -1, \&Kephra::File::savepoint_left); |
144
|
|
|
|
|
|
|
# -DEP |
145
|
|
|
|
|
|
|
#Wx::Event::EVT_STC_MARGINCLICK ($ep, -1, \&Kephra::App::EditPanel::Margin::on_left_click); |
146
|
0
|
|
|
0
|
|
|
Wx::Event::EVT_STC_CHANGE ($ep, -1, sub {&$trigger('document.text.change')} ); |
|
0
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
Wx::Event::EVT_STC_UPDATEUI ($ep, -1, sub { |
148
|
0
|
|
|
0
|
|
|
my ( $ep, $event) = @_; |
149
|
0
|
|
|
|
|
|
my ( $sel_beg, $sel_end ) = $ep->GetSelection; |
150
|
0
|
|
|
|
|
|
my $is_sel = $sel_beg != $sel_end; |
151
|
0
|
|
|
|
|
|
my $was_sel = Kephra::Document::Data::attr('text_selected'); |
152
|
0
|
|
|
|
|
|
Kephra::Document::Data::attr('text_selected', $is_sel); |
153
|
0
|
0
|
0
|
|
|
|
&$trigger('document.text.select') if $is_sel xor $was_sel; |
154
|
0
|
|
|
|
|
|
&$trigger('caret.move'); |
155
|
0
|
|
|
|
|
|
}); |
156
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
Wx::Event::EVT_KEY_DOWN ($ep, sub { |
158
|
0
|
|
|
0
|
|
|
my ($ep, $event) = @_; |
159
|
|
|
|
|
|
|
#$ep = _ref(); |
160
|
0
|
|
|
|
|
|
my $key = $event->GetKeyCode + |
161
|
|
|
|
|
|
|
1000 * ($event->ShiftDown + $event->ControlDown*2 + $event->AltDown*4); |
162
|
|
|
|
|
|
|
# reacting on shortkeys that are defined in the Commanlist |
163
|
|
|
|
|
|
|
#print "$key\n"; |
164
|
0
|
0
|
|
|
|
|
return if Kephra::CommandList::run_cmd_by_keycode($key); |
165
|
|
|
|
|
|
|
# reacting on Enter |
166
|
0
|
0
|
|
|
|
|
if ($key == &Wx::WXK_RETURN) { |
167
|
0
|
0
|
|
|
|
|
if ($config->{auto}{brace}{indention}) { |
168
|
0
|
|
|
|
|
|
my $pos = $ep->GetCurrentPos - 1; |
169
|
0
|
|
|
|
|
|
my $char = $ep->GetCharAt($pos); |
170
|
0
|
0
|
|
|
|
|
if ($char == 123) { |
|
|
0
|
|
|
|
|
|
171
|
0
|
|
|
|
|
|
return Kephra::Edit::Format::blockindent_open($pos); |
172
|
|
|
|
|
|
|
} elsif ($char == 125) { |
173
|
0
|
|
|
|
|
|
return Kephra::Edit::Format::blockindent_close($pos); |
174
|
|
|
|
|
|
|
} |
175
|
|
|
|
|
|
|
} |
176
|
0
|
0
|
|
|
|
|
$config->{auto}{indention} |
177
|
|
|
|
|
|
|
? Kephra::Edit::Format::autoindent() |
178
|
|
|
|
|
|
|
: $ep->CmdKeyExecute(&Wx::wxSTC_CMD_NEWLINE) ; |
179
|
|
|
|
|
|
|
} |
180
|
|
|
|
|
|
|
# scintilla handles the rest of the shortkeys |
181
|
0
|
|
|
|
|
|
else { $event->Skip } |
182
|
|
|
|
|
|
|
#SCI_SETSELECTIONMODE |
183
|
|
|
|
|
|
|
#($key == 350){use Kephra::Ext::Perl::Syntax; Kephra::Ext::Perl::Syntax::check()}; |
184
|
0
|
|
|
|
|
|
}); |
185
|
|
|
|
|
|
|
} |
186
|
|
|
|
|
|
|
sub create_mouse_binding { |
187
|
0
|
|
|
0
|
0
|
|
my @cmd = qw(left-middle left-right left-selection |
188
|
|
|
|
|
|
|
middle middle-selected middle-selection |
189
|
|
|
|
|
|
|
); |
190
|
|
|
|
|
|
|
|
191
|
0
|
0
|
|
|
|
|
if (_config()->{control}{use_mouse_function}) { |
192
|
0
|
|
|
|
|
|
my $config = _config()->{control}{mouse_function}; |
193
|
|
|
|
|
|
|
$mouse_commands{$_} = Kephra::Macro::create_from_cmd_list($config->{$_}) |
194
|
0
|
|
|
|
|
|
for @cmd |
195
|
|
|
|
|
|
|
} |
196
|
0
|
|
|
0
|
|
|
else { $mouse_commands{$_} = sub {} for @cmd } |
|
0
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
} |
198
|
|
|
|
|
|
|
sub set_caret_on_cursor { |
199
|
0
|
|
|
0
|
0
|
|
my $event = shift; |
200
|
0
|
|
0
|
|
|
|
my $ep = shift || _ref(); |
201
|
0
|
0
|
0
|
|
|
|
return unless ref $event eq 'Wx::MouseEvent' and is($ep); |
202
|
0
|
|
|
|
|
|
my $pos = cursor_2_caret_pos($event, $ep); |
203
|
0
|
0
|
|
|
|
|
$pos = $ep->GetCurrentPos() if $pos == -1; |
204
|
0
|
|
|
|
|
|
$ep->SetSelection( $pos, $pos ); |
205
|
|
|
|
|
|
|
} |
206
|
|
|
|
|
|
|
sub clicked_on_selection { |
207
|
0
|
|
|
0
|
0
|
|
my $event = shift; |
208
|
0
|
|
0
|
|
|
|
my $ep = shift || _ref(); |
209
|
0
|
0
|
0
|
|
|
|
return unless ref $event eq 'Wx::MouseEvent' and is($ep); |
210
|
0
|
|
|
|
|
|
my ($start, $end) = $ep->GetSelection(); |
211
|
0
|
|
|
|
|
|
my $pos = cursor_2_caret_pos($event, $ep); |
212
|
0
|
0
|
0
|
|
|
|
return 1 if $start != $end and $pos >= $start and $pos <= $end; |
|
|
|
0
|
|
|
|
|
213
|
|
|
|
|
|
|
} |
214
|
|
|
|
|
|
|
sub insert_selection_at_cursor { |
215
|
0
|
|
|
0
|
0
|
|
my $event = shift; |
216
|
0
|
|
0
|
|
|
|
my $ep = shift || _ref(); |
217
|
0
|
|
|
|
|
|
my $pos = cursor_2_caret_pos($event, $ep); |
218
|
0
|
0
|
|
|
|
|
Kephra::Edit::insert_text($ep->GetSelectedText(), $pos) if $pos > -1; |
219
|
|
|
|
|
|
|
} |
220
|
|
|
|
|
|
|
sub cursor_2_caret_pos { |
221
|
0
|
|
|
0
|
0
|
|
my $event = shift; |
222
|
0
|
|
0
|
|
|
|
my $ep = shift || _ref(); |
223
|
0
|
0
|
0
|
|
|
|
return -1 unless ref $event eq 'Wx::MouseEvent' and is($ep); |
224
|
0
|
|
|
|
|
|
my $pos = $ep->PositionFromPointClose($event->GetX, $event->GetY); |
225
|
0
|
0
|
|
|
|
|
if ($pos == -1) { |
226
|
0
|
|
|
|
|
|
my $width = Kephra::App::EditPanel::Margin::width($ep) |
227
|
|
|
|
|
|
|
+ Kephra::App::EditPanel::Margin::get_text_width(); |
228
|
0
|
|
|
|
|
|
my $y = $event->GetY; |
229
|
0
|
|
|
|
|
|
my $line = $ep->LineFromPosition( $ep->PositionFromPointClose($width, $y) ); |
230
|
0
|
|
|
|
|
|
$pos = $ep->GetLineEndPosition ($line); |
231
|
0
|
|
|
|
|
|
my $font_size = _config()->{font}{size}; |
232
|
0
|
0
|
0
|
|
|
|
if ($line == 0 and $y > $font_size + 12) { |
233
|
0
|
|
|
|
|
|
my $lcc = 0; |
234
|
0
|
|
|
|
|
|
$pos = $ep->PositionFromPointClose($width-1, $y); |
235
|
0
|
|
0
|
|
|
|
while ($pos == -1 and $lcc < $ep->GetLineCount() ){ |
236
|
0
|
|
|
|
|
|
$lcc++; # line counter |
237
|
0
|
|
|
|
|
|
$y += $font_size; |
238
|
0
|
|
|
|
|
|
$pos = $ep->PositionFromPointClose($width, $y); |
239
|
|
|
|
|
|
|
} |
240
|
0
|
0
|
|
|
|
|
return -1 if $pos == -1; |
241
|
0
|
|
|
|
|
|
return $ep->PositionFromLine( $ep->LineFromPosition($pos) - $lcc ); |
242
|
|
|
|
|
|
|
} |
243
|
|
|
|
|
|
|
} |
244
|
0
|
|
|
|
|
|
$pos; |
245
|
|
|
|
|
|
|
} |
246
|
|
|
|
|
|
|
|
247
|
|
|
|
|
|
|
sub disconnect_events { |
248
|
0
|
|
0
|
0
|
0
|
|
my $ep = shift || _ref(); |
249
|
0
|
|
|
0
|
|
|
Wx::Event::EVT_STC_CHANGE ($ep, -1, sub {}); |
|
0
|
|
|
|
|
|
|
250
|
0
|
|
|
0
|
|
|
Wx::Event::EVT_STC_UPDATEUI($ep, -1, sub {}); |
|
0
|
|
|
|
|
|
|
251
|
|
|
|
|
|
|
} |
252
|
|
|
|
|
|
|
|
253
|
0
|
|
|
0
|
0
|
|
sub set_contextmenu_custom { set_contextmenu('custom') } |
254
|
0
|
|
|
0
|
0
|
|
sub set_contextmenu_default { set_contextmenu('default')} |
255
|
0
|
|
|
0
|
0
|
|
sub set_contextmenu_none { set_contextmenu('none') } |
256
|
|
|
|
|
|
|
sub set_contextmenu { |
257
|
0
|
|
|
0
|
0
|
|
my $mode = shift; |
258
|
0
|
0
|
|
|
|
|
$mode = 'custom' unless $mode; |
259
|
0
|
|
|
|
|
|
my $ep = _ref(); |
260
|
0
|
0
|
|
|
|
|
$mode eq 'default' ? $ep->UsePopUp(1) : $ep->UsePopUp(0); |
261
|
0
|
|
|
|
|
|
_config()->{contextmenu}{visible} = $mode; |
262
|
|
|
|
|
|
|
} |
263
|
0
|
|
|
0
|
0
|
|
sub get_contextmenu { _config()->{contextmenu}{visible} } |
264
|
|
|
|
|
|
|
# |
265
|
0
|
|
|
0
|
0
|
|
sub set_word_chars { set_word_chars_here($_) for @{_all_ref()} } |
|
0
|
|
|
|
|
|
|
266
|
|
|
|
|
|
|
sub set_word_chars_here { |
267
|
0
|
|
0
|
0
|
0
|
|
my $ep = shift || _ref(); |
268
|
0
|
|
|
|
|
|
my $conf = _config(); |
269
|
0
|
0
|
|
|
|
|
if ( $conf->{word_chars} ) { |
270
|
0
|
|
|
|
|
|
$ep->SetWordChars( $conf->{word_chars} ); |
271
|
|
|
|
|
|
|
} else { |
272
|
0
|
|
|
|
|
|
$ep->SetWordChars( '$%&-@_abcdefghijklmnopqrstuvwxyzäöüßABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ0123456789' ); |
273
|
|
|
|
|
|
|
} |
274
|
|
|
|
|
|
|
} |
275
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
|
277
|
|
|
|
|
|
|
# line wrap |
278
|
0
|
|
|
0
|
0
|
|
sub apply_autowrap_settings { apply_autowrap_settings_here($_) for @{_all_ref()} } |
|
0
|
|
|
|
|
|
|
279
|
|
|
|
|
|
|
sub apply_autowrap_settings_here { |
280
|
0
|
|
0
|
0
|
0
|
|
my $ep = shift || _ref(); |
281
|
0
|
|
|
|
|
|
$ep->SetWrapMode( _config()->{line_wrap} ); |
282
|
0
|
|
|
|
|
|
Kephra::EventTable::trigger('editpanel.autowrap'); |
283
|
|
|
|
|
|
|
} |
284
|
|
|
|
|
|
|
|
285
|
0
|
|
|
0
|
0
|
|
sub get_autowrap_mode { _config()->{line_wrap} == &Wx::wxSTC_WRAP_WORD} |
286
|
|
|
|
|
|
|
sub switch_autowrap_mode { |
287
|
0
|
0
|
|
0
|
0
|
|
_config()->{line_wrap} = get_autowrap_mode() |
288
|
|
|
|
|
|
|
? &Wx::wxSTC_WRAP_NONE |
289
|
|
|
|
|
|
|
: &Wx::wxSTC_WRAP_WORD; |
290
|
0
|
|
|
|
|
|
apply_autowrap_settings(); |
291
|
|
|
|
|
|
|
} |
292
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
# font settings |
294
|
|
|
|
|
|
|
sub load_font { |
295
|
0
|
|
0
|
0
|
0
|
|
my $ep = shift || _ref(); |
296
|
0
|
|
|
|
|
|
my ( $fontweight, $fontstyle ) = ( &Wx::wxNORMAL, &Wx::wxNORMAL ); |
297
|
0
|
|
|
|
|
|
my $font = _config()->{font}; |
298
|
0
|
0
|
|
|
|
|
$fontweight = &Wx::wxLIGHT if $font->{weight} eq 'light'; |
299
|
0
|
0
|
|
|
|
|
$fontweight = &Wx::wxBOLD if $font->{weight} eq 'bold'; |
300
|
0
|
0
|
|
|
|
|
$fontstyle = &Wx::wxSLANT if $font->{style} eq 'slant'; |
301
|
0
|
0
|
|
|
|
|
$fontstyle = &Wx::wxITALIC if $font->{style} eq 'italic'; |
302
|
0
|
|
|
|
|
|
my $wx_font = Wx::Font->new( $font->{size}, &Wx::wxDEFAULT, |
303
|
|
|
|
|
|
|
$fontstyle, $fontweight, 0, $font->{family} ); |
304
|
0
|
0
|
|
|
|
|
$ep->StyleSetFont( &Wx::wxSTC_STYLE_DEFAULT, $wx_font ) if $wx_font->Ok > 0; |
305
|
|
|
|
|
|
|
} |
306
|
|
|
|
|
|
|
sub change_font { |
307
|
0
|
|
|
0
|
0
|
|
my ( $fontweight, $fontstyle ) = ( &Wx::wxNORMAL, &Wx::wxNORMAL ); |
308
|
0
|
|
|
|
|
|
my $font_config = _config()->{font}; |
309
|
0
|
0
|
|
|
|
|
$fontweight = &Wx::wxLIGHT if ( $$font_config{weight} eq 'light' ); |
310
|
0
|
0
|
|
|
|
|
$fontweight = &Wx::wxBOLD if ( $$font_config{weight} eq 'bold' ); |
311
|
0
|
0
|
|
|
|
|
$fontstyle = &Wx::wxSLANT if ( $$font_config{style} eq 'slant' ); |
312
|
0
|
0
|
|
|
|
|
$fontstyle = &Wx::wxITALIC if ( $$font_config{style} eq 'italic' ); |
313
|
0
|
|
|
|
|
|
my $oldfont = Wx::Font->new( $$font_config{size}, &Wx::wxDEFAULT, $fontstyle, |
314
|
|
|
|
|
|
|
$fontweight, 0, $$font_config{family} ); |
315
|
0
|
|
|
|
|
|
my $newfont = Kephra::Dialog::get_font( $oldfont ); |
316
|
|
|
|
|
|
|
|
317
|
0
|
0
|
|
|
|
|
if ( $newfont->Ok > 0 ) { |
318
|
0
|
|
|
|
|
|
($fontweight, $fontstyle) = ($newfont->GetWeight, $newfont->GetStyle); |
319
|
0
|
|
|
|
|
|
$$font_config{size} = $newfont->GetPointSize; |
320
|
0
|
|
|
|
|
|
$$font_config{family} = $newfont->GetFaceName; |
321
|
0
|
|
|
|
|
|
$$font_config{weight} = 'normal'; |
322
|
0
|
0
|
|
|
|
|
$$font_config{weight} = 'light' if $fontweight == &Wx::wxLIGHT; |
323
|
0
|
0
|
|
|
|
|
$$font_config{weight} = 'bold' if $fontweight == &Wx::wxBOLD; |
324
|
0
|
|
|
|
|
|
$$font_config{style} = 'normal'; |
325
|
0
|
0
|
|
|
|
|
$$font_config{style} = 'slant' if $fontstyle == &Wx::wxSLANT; |
326
|
0
|
0
|
|
|
|
|
$$font_config{style} = 'italic' if $fontstyle == &Wx::wxITALIC; |
327
|
0
|
|
|
|
|
|
Kephra::Document::SyntaxMode::reload($_) for @{Kephra::Document::Data::all_nr()}; |
|
0
|
|
|
|
|
|
|
328
|
0
|
|
|
|
|
|
Kephra::App::EditPanel::Margin::apply_line_number_width(); |
329
|
|
|
|
|
|
|
} |
330
|
|
|
|
|
|
|
} |
331
|
|
|
|
|
|
|
# |
332
|
|
|
|
|
|
|
sub zoom_in { |
333
|
0
|
|
0
|
0
|
0
|
|
my $ep = shift || _ref(); |
334
|
0
|
0
|
|
|
|
|
$ep->SetZoom( $ep->GetZoom()+1 ) if $ep->GetZoom() < 45; |
335
|
|
|
|
|
|
|
} |
336
|
|
|
|
|
|
|
sub zoom_out { |
337
|
0
|
|
0
|
0
|
0
|
|
my $ep = shift || _ref(); |
338
|
0
|
0
|
|
|
|
|
$ep->SetZoom( $ep->GetZoom()-1 ) if $ep->GetZoom() > -10; |
339
|
|
|
|
|
|
|
} |
340
|
|
|
|
|
|
|
sub zoom_normal { |
341
|
0
|
|
0
|
0
|
0
|
|
my $ep = shift || _ref(); |
342
|
0
|
|
|
|
|
|
$ep->SetZoom( 0 ) ; |
343
|
|
|
|
|
|
|
} |
344
|
|
|
|
|
|
|
# |
345
|
|
|
|
|
|
|
# auto indention |
346
|
0
|
|
|
0
|
0
|
|
sub get_autoindention { Kephra::App::EditPanel::_config()->{auto}{indention} } |
347
|
|
|
|
|
|
|
sub set_autoindention { |
348
|
0
|
|
|
0
|
0
|
|
Kephra::App::EditPanel::_config()->{auto}{indention} = shift; |
349
|
0
|
|
|
|
|
|
Kephra::Edit::eval_newline_sub(); |
350
|
|
|
|
|
|
|
} |
351
|
0
|
|
|
0
|
0
|
|
sub switch_autoindention { set_autoindention( get_autoindention() ^ 1 ) } |
352
|
0
|
|
|
0
|
0
|
|
sub set_autoindent_on { set_autoindention( 1 ) } |
353
|
0
|
|
|
0
|
0
|
|
sub set_autoindent_off { set_autoindention( 0 ) } |
354
|
|
|
|
|
|
|
# |
355
|
|
|
|
|
|
|
# brace indention |
356
|
0
|
|
|
0
|
0
|
|
sub get_braceindention { Kephra::App::EditPanel::_config()->{auto}{brace}{indention}} |
357
|
|
|
|
|
|
|
sub set_braceindention { |
358
|
0
|
|
|
0
|
0
|
|
Kephra::App::EditPanel::_config()->{auto}{brace}{indention} = shift; |
359
|
0
|
|
|
|
|
|
Kephra::Edit::eval_newline_sub(); |
360
|
|
|
|
|
|
|
} |
361
|
0
|
|
|
0
|
0
|
|
sub switch_braceindention { set_braceindention( get_braceindention() ^ 1 ) } |
362
|
0
|
|
|
0
|
0
|
|
sub set_braceindent_on { set_braceindention( 1 ) } |
363
|
0
|
|
|
0
|
0
|
|
sub set_braceindent_off { set_braceindention( 0 ) } |
364
|
|
|
|
|
|
|
# |
365
|
|
|
|
|
|
|
# |
366
|
0
|
|
|
0
|
0
|
|
sub get_bracecompletion { Kephra::App::EditPanel::_config()->{auto}{brace}{make} } |
367
|
|
|
|
|
|
|
sub set_bracecompletion { |
368
|
0
|
|
|
0
|
0
|
|
Kephra::App::EditPanel::_config()->{auto}{brace}{make} = shift; |
369
|
|
|
|
|
|
|
} |
370
|
0
|
|
|
0
|
0
|
|
sub switch_bracecompletion{ set_bracecompletion( get_bracecompletion() ^ 1 ) } |
371
|
|
|
|
|
|
|
1; |
372
|
|
|
|
|
|
|
#EVT_STC_CHARADDED EVT_STC_MODIFIED |
373
|
|
|
|
|
|
|
#wxSTC_CP_UTF8 wxSTC_CP_UTF16 Wx::wxUNICODE() |
374
|
|
|
|
|
|
|
#wxSTC_WS_INVISIBLE wxSTC_WS_VISIBLEALWAYS |
375
|
|
|
|
|
|
|
#$ep->StyleSetForeground (wxSTC_STYLE_CONTROLCHAR, Wx::Colour->new(0x55, 0x55, 0x55)); |
376
|
|
|
|
|
|
|
#$ep->CallTipShow(3,"testtooltip\n next line"); #tips |
377
|
|
|
|
|
|
|
#SetSelectionMode(wxSTC_SEL_RECTANGLE); |