arcadia 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +132 -134
- data/bin/arcadia +13 -0
- data/conf/arcadia.conf +196 -3
- data/conf/arcadia.init.rb +27 -6
- data/conf/arcadia.res.rb +10 -0
- data/ext/ae-complete-code/ae-complete-code.rb +76 -82
- data/ext/ae-doc-code/ae-doc-code.rb +295 -291
- data/ext/ae-editor/ae-editor.conf +88 -67
- data/ext/ae-editor/ae-editor.rb +400 -202
- data/ext/ae-editor/langs/conf.lang +16 -5
- data/ext/ae-editor/langs/lang.lang.bind +1 -1
- data/ext/ae-editor/langs/rb.lang +77 -41
- data/ext/ae-editor/langs/rbw.lang.bind +1 -1
- data/ext/ae-event-log/ae-event-log.rb +46 -45
- data/ext/ae-file-history/ae-file-history.conf +1 -1
- data/ext/ae-file-history/ae-file-history.rb +373 -298
- data/ext/ae-output/ae-output.conf +2 -0
- data/ext/ae-output/ae-output.rb +200 -202
- data/ext/ae-rad/ae-rad-inspector.rb +64 -70
- data/ext/ae-rad/ae-rad-palette.rb +14 -14
- data/ext/ae-rad/ae-rad.conf +2 -0
- data/ext/ae-rad/lib/tk/al-tk.rb +2991 -2987
- data/ext/ae-rad/lib/tk/al-tkarcadia.rb +26 -26
- data/ext/ae-ruby-debug/ae-ruby-debug.conf +8 -8
- data/ext/ae-ruby-debug/ae-ruby-debug.rb +1566 -1465
- data/ext/ae-search-in-files/ae-search-in-files.rb +294 -284
- data/ext/ae-shell/ae-shell.rb +20 -11
- data/{base → lib}/a-commons.rb +291 -80
- data/{base → lib}/a-contracts.rb +40 -18
- data/{arcadia.rb → lib/a-core.rb} +238 -148
- data/{base → lib}/a-tkcommons.rb +81 -63
- metadata +64 -65
- data/ext/ae-action-dispatcher/ae-action-dispatcher.conf +0 -6
- data/ext/ae-action-dispatcher/ae-action-dispatcher.rb +0 -22
- data/ext/ae-inspector/ae-inspector.conf +0 -7
- data/ext/ae-inspector/ae-inspector.rb +0 -1519
- data/ext/ae-palette/ae-palette.conf +0 -7
- data/ext/ae-palette/ae-palette.rb +0 -265
@@ -1,284 +1,294 @@
|
|
1
|
-
#
|
2
|
-
# ae-search-in-files.rb - Arcadia Ruby ide
|
3
|
-
# by Antonio Galeone <antonio-galeone@rubyforge.org>
|
4
|
-
#
|
5
|
-
|
6
|
-
class SearchInFilesService < ArcadiaExt
|
7
|
-
|
8
|
-
def on_before_build(_event)
|
9
|
-
Arcadia.
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
|
15
|
-
class SearchInFilesListener
|
16
|
-
def initialize(_service)
|
17
|
-
@service = _service
|
18
|
-
create_find
|
19
|
-
end
|
20
|
-
|
21
|
-
def on_before_search_in_files(_event)
|
22
|
-
if _event.what.nil?
|
23
|
-
@find.show
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
#def on_search_in_files(_event)
|
28
|
-
#Arcadia.new_msg(self, "... ti ho fregato!")
|
29
|
-
#end
|
30
|
-
|
31
|
-
#def on_after_search_in_files(_event)
|
32
|
-
#end
|
33
|
-
|
34
|
-
def create_find
|
35
|
-
@find = FindFrame.new(@service.arcadia.layout.root)
|
36
|
-
@find.on_close=proc{@find.hide}
|
37
|
-
@find.hide
|
38
|
-
@find.b_go.bind('1', proc{Thread.new{do_find}})
|
39
|
-
@find.e_what_entry.bind_append('KeyRelease'){|e|
|
40
|
-
case e.keysym
|
41
|
-
when 'Return'
|
42
|
-
do_find
|
43
|
-
Tk.callback_break
|
44
|
-
end
|
45
|
-
}
|
46
|
-
|
47
|
-
end
|
48
|
-
private :create_find
|
49
|
-
|
50
|
-
def do_find
|
51
|
-
return if @find.e_what.text.strip.length == 0 || @find.e_filter.text.strip.length == 0 || @find.e_dir.text.strip.length == 0
|
52
|
-
@find.hide
|
53
|
-
if !defined?(@search_output)
|
54
|
-
@search_output = SearchOutput.new(@service)
|
55
|
-
else
|
56
|
-
@service.
|
57
|
-
end
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
@
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
#
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
command
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
@
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
@
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
@results
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
@
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
@e_dir.
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
pack('
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
1
|
+
#
|
2
|
+
# ae-search-in-files.rb - Arcadia Ruby ide
|
3
|
+
# by Antonio Galeone <antonio-galeone@rubyforge.org>
|
4
|
+
#
|
5
|
+
|
6
|
+
class SearchInFilesService < ArcadiaExt
|
7
|
+
|
8
|
+
def on_before_build(_event)
|
9
|
+
Arcadia.attach_listener(SearchInFilesListener.new(self),SearchInFilesEvent)
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
class SearchInFilesListener
|
16
|
+
def initialize(_service)
|
17
|
+
@service = _service
|
18
|
+
create_find
|
19
|
+
end
|
20
|
+
|
21
|
+
def on_before_search_in_files(_event)
|
22
|
+
if _event.what.nil?
|
23
|
+
@find.show
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
#def on_search_in_files(_event)
|
28
|
+
#Arcadia.new_msg(self, "... ti ho fregato!")
|
29
|
+
#end
|
30
|
+
|
31
|
+
#def on_after_search_in_files(_event)
|
32
|
+
#end
|
33
|
+
|
34
|
+
def create_find
|
35
|
+
@find = FindFrame.new(@service.arcadia.layout.root)
|
36
|
+
@find.on_close=proc{@find.hide}
|
37
|
+
@find.hide
|
38
|
+
@find.b_go.bind('1', proc{Thread.new{do_find}})
|
39
|
+
@find.e_what_entry.bind_append('KeyRelease'){|e|
|
40
|
+
case e.keysym
|
41
|
+
when 'Return'
|
42
|
+
do_find
|
43
|
+
Tk.callback_break
|
44
|
+
end
|
45
|
+
}
|
46
|
+
|
47
|
+
end
|
48
|
+
private :create_find
|
49
|
+
|
50
|
+
def do_find
|
51
|
+
return if @find.e_what.text.strip.length == 0 || @find.e_filter.text.strip.length == 0 || @find.e_dir.text.strip.length == 0
|
52
|
+
@find.hide
|
53
|
+
if !defined?(@search_output)
|
54
|
+
@search_output = SearchOutput.new(@service)
|
55
|
+
else
|
56
|
+
@service.frame.show
|
57
|
+
end
|
58
|
+
begin
|
59
|
+
_search_title = 'search result for : "'+@find.e_what.text+'" in :"'+@find.e_dir.text+'"'+' ['+@find.e_filter.text+']'
|
60
|
+
_filter = @find.e_dir.text+'/**/'+@find.e_filter.text
|
61
|
+
_files = Dir[_filter]
|
62
|
+
_node = @search_output.new_result(_search_title, _files.length)
|
63
|
+
progress_stop=false
|
64
|
+
@progress_bar = TkProgressframe.new(@service.arcadia.layout.root, _files.length)
|
65
|
+
@progress_bar.title('Searching')
|
66
|
+
@progress_bar.on_cancel=proc{progress_stop=true}
|
67
|
+
#@progress_bar.on_cancel=proc{cancel}
|
68
|
+
pattern = Regexp.new(@find.e_what.text)
|
69
|
+
_files.each do |_filename|
|
70
|
+
File.open(_filename) do |file|
|
71
|
+
file.grep(pattern) do |line|
|
72
|
+
@search_output.add_result(_node, _filename, file.lineno.to_s, line)
|
73
|
+
break if progress_stop
|
74
|
+
end
|
75
|
+
end
|
76
|
+
@progress_bar.progress
|
77
|
+
break if progress_stop
|
78
|
+
end
|
79
|
+
rescue Exception => e
|
80
|
+
Arcadia.console(self, 'msg'=>e.message, 'level'=>'error')
|
81
|
+
#Arcadia.new_error_msg(self, e.message)
|
82
|
+
ensure
|
83
|
+
@progress_bar.destroy
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
class SearchOutput
|
92
|
+
def initialize(_ext)
|
93
|
+
@sequence = 0
|
94
|
+
@ext = _ext
|
95
|
+
left_frame = TkFrame.new(@ext.frame.hinner_frame, Arcadia.style('panel')).place('x' => '0','y' => '0','relheight' => '1','width' => '25')
|
96
|
+
#right_frame = TkFrame.new(@ext.frame).place('x' => '25','y' => '0','relwidth' => '1', 'relheight' => '1', 'width' => '-25')
|
97
|
+
@results = {}
|
98
|
+
_open_file = proc do |tree, sel|
|
99
|
+
n_parent, n = sel.split('@@@')
|
100
|
+
Arcadia.process_event(OpenBufferEvent.new(self,'file'=>@results[n_parent][n][0], 'row'=>@results[n_parent][n][1])) if n && @results[n_parent][n]
|
101
|
+
#EditorContract.instance.open_file(self, 'file'=>@results[n_parent][n][0], 'line'=>@results[n_parent][n][1]) if n && @results[n_parent][n]
|
102
|
+
end
|
103
|
+
|
104
|
+
@tree = Tk::BWidget::Tree.new(@ext.frame.hinner_frame, Arcadia.style('treepanel')){
|
105
|
+
#background '#FFFFFF'
|
106
|
+
#relief 'flat'
|
107
|
+
#showlines true
|
108
|
+
#linesfill '#e7de8f'
|
109
|
+
selectcommand _open_file
|
110
|
+
deltay 15
|
111
|
+
}.place('x' => '25','y' => '0','relwidth' => '1', 'relheight' => '1', 'width' => '-40', 'height'=>'-15')
|
112
|
+
#---- y scrollbar
|
113
|
+
_yscrollcommand = proc{|*args| @tree.yview(*args)}
|
114
|
+
_yscrollbar = TkScrollbar.new(@ext.frame.hinner_frame, Arcadia.style('scrollbar')){|s|
|
115
|
+
#width 8
|
116
|
+
command _yscrollcommand
|
117
|
+
}.pack('side'=>'right', 'fill'=>'y')
|
118
|
+
@tree.yscrollcommand proc{|first,last| _yscrollbar.set(first,last)}
|
119
|
+
#---- x scrollbar
|
120
|
+
_xscrollcommand = proc{|*args| @tree.xview(*args)}
|
121
|
+
_xscrollbar = TkScrollbar.new(@ext.frame.hinner_frame, Arcadia.style('scrollbar')){|s|
|
122
|
+
#width 8
|
123
|
+
orient 'horizontal'
|
124
|
+
command _xscrollcommand
|
125
|
+
}.pack('side'=>'bottom', 'fill'=>'x')
|
126
|
+
@tree.xscrollcommand proc{|first,last| _xscrollbar.set(first,last)}
|
127
|
+
|
128
|
+
_proc_clear = proc{clear_tree}
|
129
|
+
|
130
|
+
@button_u = Tk::BWidget::Button.new(left_frame, Arcadia.style('toolbarbutton')){
|
131
|
+
image TkPhotoImage.new('dat' => CLEAR_GIF)
|
132
|
+
helptext 'Clear'
|
133
|
+
foreground 'blue'
|
134
|
+
command _proc_clear
|
135
|
+
relief 'groove'
|
136
|
+
pack('side' =>'top', 'anchor'=>'n',:padx=>0, :pady=>0)
|
137
|
+
}
|
138
|
+
|
139
|
+
# @found_color='#3f941b'
|
140
|
+
# @not_found_color= 'red'
|
141
|
+
# @item_color='#6fc875'
|
142
|
+
@found_color=Arcadia.conf('hightlight.5.foreground')
|
143
|
+
@not_found_color= Arcadia.conf('hightlight.6.foreground')
|
144
|
+
@item_color=Arcadia.conf('treeitem.fill')
|
145
|
+
end
|
146
|
+
|
147
|
+
def clear_tree
|
148
|
+
@tree.delete(@tree.nodes('root'))
|
149
|
+
@results.clear
|
150
|
+
end
|
151
|
+
|
152
|
+
def new_node_name
|
153
|
+
@sequence = @sequence + 1
|
154
|
+
return 'n'+@sequence.to_s
|
155
|
+
end
|
156
|
+
|
157
|
+
def new_result(_text, _length=0)
|
158
|
+
@results.each_key{|key| @tree.close_tree(key)}
|
159
|
+
_r_node = new_node_name
|
160
|
+
@text_result = _text
|
161
|
+
#_text = _text + ' { '+_length.to_s+' found }'
|
162
|
+
#_length > 0 ? _color='#3f941b':_color = 'red'
|
163
|
+
@tree.insert('end', 'root' ,_r_node, {
|
164
|
+
'fill'=>@not_found_color,
|
165
|
+
'open'=>true,
|
166
|
+
'anchor'=>'w',
|
167
|
+
'font' => "#{Arcadia.conf('treeitem.font')} bold",
|
168
|
+
'text' => _text
|
169
|
+
})
|
170
|
+
Tk.update
|
171
|
+
@results[_r_node]={}
|
172
|
+
@count = 0
|
173
|
+
return _r_node
|
174
|
+
end
|
175
|
+
|
176
|
+
def add_result(_node, _file, _line='', _line_text='')
|
177
|
+
@count = @count+1
|
178
|
+
@tree.itemconfigure(_node, 'fill'=>@found_color, 'text'=>@text_result+' { '+@count.to_s+' found }')
|
179
|
+
_text = _file+':'+_line+' : '+_line_text
|
180
|
+
_node_name = new_node_name
|
181
|
+
@tree.insert('end', _node ,_node+'@@@'+_node_name, {
|
182
|
+
'fill'=>@item_color,
|
183
|
+
'anchor'=>'w',
|
184
|
+
'font' => Arcadia.conf('treeitem.font'),
|
185
|
+
'text' => _text.strip
|
186
|
+
})
|
187
|
+
@results[_node][_node_name]=[_file,_line]
|
188
|
+
Tk.update
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|
192
|
+
|
193
|
+
class FindFrame < TkFloatTitledFrame
|
194
|
+
attr_reader :e_what
|
195
|
+
attr_reader :e_what_entry
|
196
|
+
attr_reader :e_filter
|
197
|
+
attr_reader :e_dir
|
198
|
+
attr_reader :b_go
|
199
|
+
def initialize(_parent)
|
200
|
+
super(_parent)
|
201
|
+
y0 = 10
|
202
|
+
d = 23
|
203
|
+
TkLabel.new(self.frame, Arcadia.style('label')){
|
204
|
+
text 'Find what:'
|
205
|
+
place('x' => 8,'y' => y0,'height' => 19)
|
206
|
+
}
|
207
|
+
y0 = y0 + d
|
208
|
+
@e_what = Tk::BWidget::ComboBox.new(self.frame, Arcadia.style('combobox')){
|
209
|
+
editable true
|
210
|
+
justify 'left'
|
211
|
+
autocomplete 'true'
|
212
|
+
expand 'tab'
|
213
|
+
takefocus 'true'
|
214
|
+
place('relwidth' => 1, 'width'=>-16,'x' => 8,'y' => y0,'height' => 19)
|
215
|
+
}
|
216
|
+
@e_what_entry = TkWinfo.children(@e_what)[0]
|
217
|
+
@e_what_entry.bind_append("1",proc{Arcadia.process_event(InputEnterEvent.new(self,'receiver'=>@e_what_entry))})
|
218
|
+
|
219
|
+
y0 = y0 + d
|
220
|
+
TkLabel.new(self.frame, Arcadia.style('label')){
|
221
|
+
text 'Files filter:'
|
222
|
+
place('x' => 8,'y' => y0,'height' => 19)
|
223
|
+
}
|
224
|
+
y0 = y0 + d
|
225
|
+
|
226
|
+
@e_filter = Tk::BWidget::ComboBox.new(self.frame, Arcadia.style('combobox')){
|
227
|
+
editable true
|
228
|
+
justify 'left'
|
229
|
+
autocomplete 'true'
|
230
|
+
expand 'tab'
|
231
|
+
takefocus 'true'
|
232
|
+
#pack('padx'=>10, 'fill'=>'x')
|
233
|
+
place('relwidth' => 1, 'width'=>-16,'x' => 8,'y' => y0,'height' => 19)
|
234
|
+
}
|
235
|
+
@e_filter_entry = TkWinfo.children(@e_filter)[0]
|
236
|
+
@e_filter_entry.bind_append("1",proc{Arcadia.process_event(InputEnterEvent.new(self,'receiver'=>@e_filter_entry))})
|
237
|
+
|
238
|
+
@e_filter.text('*.rb')
|
239
|
+
y0 = y0 + d
|
240
|
+
|
241
|
+
TkLabel.new(self.frame, Arcadia.style('label')){
|
242
|
+
text 'Directory:'
|
243
|
+
place('x' => 8,'y' => y0,'height' => 19)
|
244
|
+
}
|
245
|
+
y0 = y0 + d
|
246
|
+
|
247
|
+
_h_frame = TkFrame.new(self.frame, Arcadia.style('panel')).place('relwidth' => 1, 'width'=>-16,'x' => 8,'y' => y0,'height' => 19)
|
248
|
+
@e_dir = Tk::BWidget::ComboBox.new(_h_frame, Arcadia.style('combobox')){
|
249
|
+
editable true
|
250
|
+
justify 'left'
|
251
|
+
autocomplete 'true'
|
252
|
+
expand 'tab'
|
253
|
+
takefocus 'true'
|
254
|
+
#pack('side'=>'left','fill'=>'x')
|
255
|
+
pack('fill'=>'x')
|
256
|
+
#place('relwidth' => 1, 'width'=>-16,'x' => 8,'y' => y0,'height' => 19)
|
257
|
+
}
|
258
|
+
@e_dir.text(Dir.pwd)
|
259
|
+
@b_dir = TkButton.new(_h_frame, Arcadia.style('button') ){
|
260
|
+
compound 'none'
|
261
|
+
default 'disabled'
|
262
|
+
text '...'
|
263
|
+
#overrelief 'raised'
|
264
|
+
#justify 'center'
|
265
|
+
pack('side'=>'right','ipadx'=>5, 'padx'=>5)
|
266
|
+
}.bind('1', proc{
|
267
|
+
_d = Tk.chooseDirectory('initialdir'=>@e_dir.text,'mustexist'=>true)
|
268
|
+
if _d && _d.strip.length > 0
|
269
|
+
@e_dir.text(_d)
|
270
|
+
end
|
271
|
+
})
|
272
|
+
|
273
|
+
y0 = y0 + d
|
274
|
+
y0 = y0 + d
|
275
|
+
@buttons_frame = TkFrame.new(self.frame, Arcadia.style('panel')).pack('fill'=>'x', 'side'=>'bottom')
|
276
|
+
|
277
|
+
@b_go = TkButton.new(@buttons_frame, Arcadia.style('button')){|_b_go|
|
278
|
+
compound 'none'
|
279
|
+
default 'disabled'
|
280
|
+
text 'Find'
|
281
|
+
#overrelief 'raised'
|
282
|
+
#justify 'center'
|
283
|
+
pack('side'=>'right','ipadx'=>5, 'padx'=>5)
|
284
|
+
}
|
285
|
+
place('x'=>100,'y'=>100,'height'=> 220,'width'=> 300)
|
286
|
+
end
|
287
|
+
|
288
|
+
def show
|
289
|
+
super
|
290
|
+
self.focus
|
291
|
+
@e_what.focus
|
292
|
+
@e_what_entry.selection_range(0,'end')
|
293
|
+
end
|
294
|
+
end
|