arcadia 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +39 -38
- data/bin/arc +3 -0
- data/bin/arcadia +0 -1
- data/conf/arcadia.conf +54 -35
- data/conf/arcadia.init.rb +26 -3
- data/conf/arcadia.res.rb +56 -4
- data/ext/ae-breakpoints/ae-breakpoints.rb +1 -1
- data/ext/ae-dir-projects/ae-dir-projects.rb +113 -45
- data/ext/ae-editor/ae-editor.conf +6 -2
- data/ext/ae-editor/ae-editor.rb +1009 -616
- data/ext/ae-editor/langs/coderay.tokens +40 -0
- data/ext/ae-editor/langs/conf.lang +12 -10
- data/ext/ae-editor/langs/erb.lang.bind +1 -0
- data/ext/ae-editor/langs/java.lang +4 -0
- data/ext/ae-editor/langs/rb.lang +25 -55
- data/ext/ae-editor/langs/rhtml.lang +4 -0
- data/ext/ae-editor/langs/tokens.lang.bind +1 -0
- data/ext/ae-editor/langs/xml.lang +4 -0
- data/ext/ae-file-history/ae-file-history.rb +140 -32
- data/ext/ae-output/ae-output.rb +267 -262
- data/ext/ae-rad/ae-rad-inspector.rb +1 -1
- data/ext/ae-rad/ae-rad-libs.rb +15 -7
- data/ext/ae-rad/ae-rad.conf +4 -4
- data/ext/ae-rad/lib/tk/al-tk.rb +4 -3
- data/ext/ae-ruby-debug/ae-ruby-debug.conf +4 -2
- data/ext/ae-ruby-debug/ae-ruby-debug.rb +40 -15
- data/ext/ae-search-in-files/ae-search-in-files.rb +70 -14
- data/ext/ae-search-in-files/ext/ack-in-files/ack-in-files.conf +15 -0
- data/ext/ae-search-in-files/ext/ack-in-files/ack-in-files.rb +80 -0
- data/ext/ae-shell/ae-shell.conf +4 -1
- data/ext/ae-shell/ae-shell.rb +78 -43
- data/ext/test-shutdown-after-startup/test-shutdown-after-startup.conf +4 -0
- data/ext/test-shutdown-after-startup/test-shutdown-after-startup.rb +20 -0
- data/lib/a-commons.rb +118 -22
- data/lib/a-contracts.rb +46 -2
- data/lib/a-core.rb +970 -284
- data/lib/a-tkcommons.rb +16 -8
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/ArrowButton.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/BWidget.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/Button.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/ButtonBox.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/ComboBox.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/Dialog.html +20 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/DragSite.html +6 -4
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/DropSite.html +15 -3
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/DynamicHelp.html +8 -5
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/Entry.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/Label.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/LabelEntry.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/LabelFrame.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/ListBox.html +1 -1
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/MainFrame.html +8 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/MessageDlg.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/NoteBook.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/PagesManager.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/PanedWindow.html +21 -5
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/PanelFrame.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/PasswdDlg.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/ProgressBar.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/ProgressDlg.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/ScrollView.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/ScrollableFrame.html +5 -2
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/ScrolledWindow.html +36 -4
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/SelectColor.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/SelectFont.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/Separator.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/SpinBox.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/StatusBar.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/TitleFrame.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/Tree.html +21 -31
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/Widget.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/contents.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/index.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/navtree.html +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/BWman/options.htm +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/CHANGES.txt +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/ChangeLog +289 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/LICENSE.txt +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/README.txt +2 -2
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/arrow.tcl +1 -1
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/bitmap.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/button.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/buttonbox.tcl +23 -12
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/color.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/combobox.tcl +101 -25
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/demo/basic.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/demo/bwidget.xbm +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/demo/demo.tcl +1 -1
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/demo/dnd.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/demo/manager.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/demo/select.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/demo/tmpldlg.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/demo/tree.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/demo/x1.xbm +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/dialog.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/dragsite.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/dropsite.tcl +2 -1
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/dynhelp.tcl +194 -33
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/entry.tcl +8 -5
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/font.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/bold.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/copy.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/cut.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/dragfile.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/dragicon.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/error.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/file.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/folder.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/hourglass.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/info.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/italic.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/minus.xbm +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/new.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/opcopy.xbm +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/open.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/openfold.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/oplink.xbm +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/opmove.xbm +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/overstrike.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/palette.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/passwd.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/paste.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/plus.xbm +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/print.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/question.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/redo.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/save.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/target.xbm +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/underline.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/undo.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/images/warning.gif +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/init.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/label.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/labelentry.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/labelframe.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/lang/da.rc +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/lang/de.rc +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/lang/en.rc +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/lang/es.rc +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/lang/fr.rc +0 -0
- data/tcl/BWidget-1.9.0/lang/hu.rc +52 -0
- data/tcl/BWidget-1.9.0/lang/nl.rc +52 -0
- data/tcl/BWidget-1.9.0/lang/no.rc +52 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/listbox.tcl +89 -34
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/mainframe.tcl +14 -13
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/messagedlg.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/notebook.tcl +3 -1
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/pagesmgr.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/panedw.tcl +22 -18
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/panelframe.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/passwddlg.tcl +7 -3
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/pkgIndex.tcl +2 -2
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/progressbar.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/progressdlg.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/scrollframe.tcl +60 -24
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/scrollview.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/scrollw.tcl +13 -11
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/separator.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/spinbox.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/statusbar.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/tests/entry.test +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/titleframe.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/tree.tcl +51 -41
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/utils.tcl +26 -11
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/widget.tcl +53 -19
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/wizard.tcl +0 -0
- data/tcl/{BWidget-1.8.0 → BWidget-1.9.0}/xpm2image.tcl +0 -0
- metadata +170 -145
@@ -2,11 +2,11 @@
|
|
2
2
|
# ae-dir-projects.rb - Arcadia Ruby ide
|
3
3
|
# by Antonio Galeone <antonio-galeone@rubyforge.org>
|
4
4
|
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
5
|
+
# &require_dir_ref=../..
|
6
|
+
# &require_omissis=conf/arcadia.init
|
7
|
+
# &require_omissis=lib/a-commons
|
8
|
+
# &require_omissis=lib/a-tkcommons
|
9
|
+
# &require_omissis=lib/a-core
|
10
10
|
|
11
11
|
|
12
12
|
|
@@ -102,14 +102,14 @@ class DirProjects < ArcadiaExt
|
|
102
102
|
_sync_val = @sync
|
103
103
|
@sync = false
|
104
104
|
begin
|
105
|
-
|
106
|
-
|
105
|
+
Arcadia.process_event(OpenBufferTransientEvent.new(self,'file'=>node2file(_selected)))
|
106
|
+
ensure
|
107
107
|
@sync = _sync_val
|
108
|
-
|
109
|
-
elsif !_selected.nil? && @htree.open?(_selected)
|
110
|
-
@htree.close_tree(_selected)
|
111
|
-
elsif !_selected.nil?
|
112
|
-
@htree.open_tree(_selected,false)
|
108
|
+
end
|
109
|
+
# elsif !_selected.nil? && @htree.open?(node2file(_selected))
|
110
|
+
# @htree.close_tree(node2file(_selected))
|
111
|
+
# elsif !_selected.nil?
|
112
|
+
# @htree.open_tree(node2file(_selected),false)
|
113
113
|
end
|
114
114
|
else
|
115
115
|
shure_delete_node(_selected)
|
@@ -170,16 +170,29 @@ class DirProjects < ArcadiaExt
|
|
170
170
|
_wrapper.show_v_scroll
|
171
171
|
_wrapper.show_h_scroll
|
172
172
|
self.pop_up_menu_tree
|
173
|
-
@image_kdir = TkPhotoImage.new('dat' =>
|
173
|
+
@image_kdir = TkPhotoImage.new('dat' => ICON_FOLDER_OPEN_GIF)
|
174
174
|
@image_kdir_closed = TkPhotoImage.new('dat' => FOLDER_GIF)
|
175
|
-
@image_kfile_rb = TkPhotoImage.new('dat' => RUBY_DOCUMENT_GIF)
|
176
|
-
@image_kfile = TkPhotoImage.new('dat' => DOCUMENT_GIF)
|
177
175
|
self.load_projects
|
178
|
-
@htree.areabind_append('KeyPress'
|
176
|
+
@htree.areabind_append('KeyPress',proc{|k|
|
177
|
+
key_press(k)
|
178
|
+
},"%K")
|
179
|
+
|
180
|
+
do_double_click = proc{
|
181
|
+
_selected = @htree.selection_get[0]
|
182
|
+
if File.ftype(node2file(_selected)) == 'directory'
|
183
|
+
if !_selected.nil? && @htree.open?(node2file(_selected))
|
184
|
+
@htree.close_tree(node2file(_selected))
|
185
|
+
elsif !_selected.nil?
|
186
|
+
@htree.open_tree(node2file(_selected),false)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
}
|
190
|
+
|
191
|
+
@htree.textbind_append('Double-1',do_double_click)
|
179
192
|
end
|
180
193
|
|
181
|
-
def key_press(
|
182
|
-
case
|
194
|
+
def key_press(_keysym)
|
195
|
+
case _keysym
|
183
196
|
when 'F5'
|
184
197
|
_selected = self.selected
|
185
198
|
do_refresh(_selected)
|
@@ -199,7 +212,7 @@ class DirProjects < ArcadiaExt
|
|
199
212
|
end
|
200
213
|
|
201
214
|
def file2node(_file)
|
202
|
-
if _file.include?("\s")
|
215
|
+
if _file.include?("\s") && _file[0..0]!='{'
|
203
216
|
return "{#{_file}}"
|
204
217
|
else
|
205
218
|
return _file
|
@@ -297,7 +310,6 @@ class DirProjects < ArcadiaExt
|
|
297
310
|
:hidemargin => false,
|
298
311
|
:command=> proc{
|
299
312
|
_selected = self.selected
|
300
|
-
p _selected
|
301
313
|
if _selected
|
302
314
|
do_new_folder(_selected)
|
303
315
|
end
|
@@ -362,6 +374,47 @@ class DirProjects < ArcadiaExt
|
|
362
374
|
)
|
363
375
|
|
364
376
|
|
377
|
+
#-----------------
|
378
|
+
#----- search submenu
|
379
|
+
sub_ref_search = TkMenu.new(
|
380
|
+
:parent=>@pop_up,
|
381
|
+
:tearoff=>0,
|
382
|
+
:title => 'Ref'
|
383
|
+
)
|
384
|
+
sub_ref_search.configure(Arcadia.style('menu'))
|
385
|
+
sub_ref_search.insert('end',
|
386
|
+
:command,
|
387
|
+
:label=>'Find in files...',
|
388
|
+
:hidemargin => false,
|
389
|
+
:command=> proc{
|
390
|
+
_target = self.selected
|
391
|
+
if _target
|
392
|
+
_target = File.dirname(_target) if File.ftype(_target) == 'file'
|
393
|
+
Arcadia.process_event(SearchInFilesEvent.new(self,'dir'=>_target))
|
394
|
+
end
|
395
|
+
}
|
396
|
+
)
|
397
|
+
|
398
|
+
sub_ref_search.insert('end',
|
399
|
+
:command,
|
400
|
+
:label=>'Act in files...',
|
401
|
+
:hidemargin => false,
|
402
|
+
:command=> proc{
|
403
|
+
_target = self.selected
|
404
|
+
if _target
|
405
|
+
_target = File.dirname(_target) if File.ftype(_target) == 'file'
|
406
|
+
Arcadia.process_event(AckInFilesEvent.new(self,'dir'=>_target))
|
407
|
+
end
|
408
|
+
}
|
409
|
+
)
|
410
|
+
@pop_up_tree.insert('end',
|
411
|
+
:cascade,
|
412
|
+
:label=>'Search from here',
|
413
|
+
:menu=>sub_ref_search,
|
414
|
+
:hidemargin => false
|
415
|
+
)
|
416
|
+
|
417
|
+
|
365
418
|
#-----------------
|
366
419
|
|
367
420
|
@pop_up_tree.insert('end',
|
@@ -412,21 +465,28 @@ class DirProjects < ArcadiaExt
|
|
412
465
|
end
|
413
466
|
|
414
467
|
def selected
|
415
|
-
if @htree.selection_get[0]
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
468
|
+
if @htree.selection_get[0]
|
469
|
+
if @htree.selection_get[0].length >0
|
470
|
+
_selected = ""
|
471
|
+
if String.method_defined?(:lines)
|
472
|
+
selection_lines = @htree.selection_get[0].lines
|
473
|
+
else
|
474
|
+
selection_lines = @htree.selection_get[0].split("\n")
|
475
|
+
end
|
476
|
+
selection_lines.each{|_block|
|
477
|
+
_selected = _selected + _block.to_s + "\s"
|
478
|
+
}
|
479
|
+
_selected = _selected.strip
|
480
|
+
else
|
481
|
+
_selected = @htree.selection_get[0]
|
482
|
+
end
|
423
483
|
end
|
424
484
|
return _selected
|
425
485
|
end
|
426
486
|
|
427
487
|
def do_new_project(_parent_folder_node=nil)
|
428
488
|
if _parent_folder_node.nil?
|
429
|
-
_parent_folder_node=Tk.chooseDirectory
|
489
|
+
_parent_folder_node=Tk.chooseDirectory 'initialdir' => MonitorLastUsedDir.get_last_dir
|
430
490
|
end
|
431
491
|
if _parent_folder_node && File.exists?(node2file(_parent_folder_node)) && File.ftype(node2file(_parent_folder_node)) == 'directory'
|
432
492
|
tmp_node_name = "#{node2file(_parent_folder_node)}#{File::SEPARATOR}_new_project_"
|
@@ -444,7 +504,7 @@ class DirProjects < ArcadiaExt
|
|
444
504
|
ensure
|
445
505
|
@htree.delete(file2node(tmp_node_name))
|
446
506
|
end
|
447
|
-
|
507
|
+
_ret
|
448
508
|
}
|
449
509
|
# @htree.textbind('KeyPress', proc{|e|
|
450
510
|
# p 'pippo'})
|
@@ -455,13 +515,13 @@ class DirProjects < ArcadiaExt
|
|
455
515
|
|
456
516
|
def do_open_project(_proj_name=nil)
|
457
517
|
if _proj_name.nil?
|
458
|
-
_proj_name=Tk.chooseDirectory
|
518
|
+
_proj_name=Tk.chooseDirectory 'initialdir' => MonitorLastUsedDir.get_last_dir
|
459
519
|
add_project(_proj_name) if _proj_name && File.exists?(_proj_name)
|
460
520
|
end
|
461
521
|
end
|
462
522
|
|
463
523
|
def do_close_project(_proj_name)
|
464
|
-
if _proj_name
|
524
|
+
if _proj_name && is_project?(_proj_name)
|
465
525
|
del_project(_proj_name)
|
466
526
|
end
|
467
527
|
end
|
@@ -484,7 +544,7 @@ class DirProjects < ArcadiaExt
|
|
484
544
|
@htree.delete(file2node(tmp_node_name))
|
485
545
|
shure_select_node(new_dir_name)
|
486
546
|
end
|
487
|
-
|
547
|
+
_ret
|
488
548
|
}
|
489
549
|
@htree.edit(tmp_node_name, tmp_node_name.split(File::SEPARATOR)[-1], _verify_cmd, 1)
|
490
550
|
end
|
@@ -508,7 +568,7 @@ class DirProjects < ArcadiaExt
|
|
508
568
|
ensure
|
509
569
|
@htree.delete(file2node(tmp_node_name))
|
510
570
|
end
|
511
|
-
|
571
|
+
_ret
|
512
572
|
}
|
513
573
|
@htree.edit(tmp_node_name, tmp_node_name.split(File::SEPARATOR)[-1], _verify_cmd, 1)
|
514
574
|
end
|
@@ -604,12 +664,16 @@ class DirProjects < ArcadiaExt
|
|
604
664
|
shure_delete_node(_source)
|
605
665
|
do_refresh(source_dir)
|
606
666
|
end
|
607
|
-
|
667
|
+
_ret
|
608
668
|
}
|
609
669
|
@htree.edit(_source, _source.split(File::SEPARATOR)[-1], _verify_cmd, 1)
|
610
670
|
end
|
611
671
|
end
|
612
672
|
|
673
|
+
def is_project?(_node)
|
674
|
+
@htree.exist?(_node) && @htree.parent(_node)=='root'
|
675
|
+
end
|
676
|
+
|
613
677
|
def do_delete(_node, _interactive = true)
|
614
678
|
if File.exists?(node2file(_node))
|
615
679
|
type = File.ftype(node2file(_node))
|
@@ -624,7 +688,7 @@ class DirProjects < ArcadiaExt
|
|
624
688
|
entries = Dir.entries(node2file(_node))
|
625
689
|
entries.delete('.')
|
626
690
|
entries.delete('..')
|
627
|
-
is_project = @htree.exist?(_node) && @htree.parent(_node)=='root'
|
691
|
+
#is_project = @htree.exist?(_node) && @htree.parent(_node)=='root'
|
628
692
|
if entries.length > 0
|
629
693
|
_msg2 = "#{_node} isn't empty. Shure to delete all sub entries ?"
|
630
694
|
entries.each{|en|
|
@@ -641,7 +705,7 @@ class DirProjects < ArcadiaExt
|
|
641
705
|
else
|
642
706
|
Dir.delete(node2file(_node))
|
643
707
|
end
|
644
|
-
if is_project && delete_node
|
708
|
+
if is_project?(_node) && delete_node
|
645
709
|
delete_node = false
|
646
710
|
del_project(_node)
|
647
711
|
end
|
@@ -703,8 +767,8 @@ class DirProjects < ArcadiaExt
|
|
703
767
|
end
|
704
768
|
|
705
769
|
def add_project(_dir)
|
706
|
-
add_node('root', _dir, "project")
|
707
770
|
@projects[_dir] = Project.new(_dir)
|
771
|
+
add_node('root', _dir, "project")
|
708
772
|
add_project_to_file(_dir)
|
709
773
|
end
|
710
774
|
|
@@ -713,7 +777,7 @@ class DirProjects < ArcadiaExt
|
|
713
777
|
_sc = @htree.cget('selectcommand')
|
714
778
|
begin
|
715
779
|
@htree.configure('selectcommand'=>nil)
|
716
|
-
@htree.delete(_node)
|
780
|
+
@htree.delete(file2node(_node))
|
717
781
|
ensure
|
718
782
|
@htree.configure('selectcommand'=>_sc)
|
719
783
|
end
|
@@ -834,7 +898,7 @@ class DirProjects < ArcadiaExt
|
|
834
898
|
path = File::SEPARATOR
|
835
899
|
end
|
836
900
|
path = path + steps[j]
|
837
|
-
if @htree.exist?(path)
|
901
|
+
if @htree.exist?(path)
|
838
902
|
@htree.open_tree(path, false)
|
839
903
|
end
|
840
904
|
j=j+1
|
@@ -869,12 +933,16 @@ class DirProjects < ArcadiaExt
|
|
869
933
|
return @image_kdir
|
870
934
|
elsif _kind == 'project'
|
871
935
|
return @image_kdir_closed
|
872
|
-
elsif _kind == 'file'
|
873
|
-
return
|
874
|
-
else
|
875
|
-
return @image_kfile
|
936
|
+
elsif _kind == 'file'
|
937
|
+
return Arcadia.file_icon(_label)
|
876
938
|
end
|
939
|
+
|
940
|
+
# elsif _kind == 'file' && _label.include?('.rb')
|
941
|
+
# return @image_kfile_rb
|
942
|
+
# else
|
943
|
+
# return @image_kfile
|
944
|
+
# end
|
877
945
|
end
|
878
946
|
|
879
947
|
|
880
|
-
end
|
948
|
+
end
|
@@ -2,10 +2,14 @@ name=editor
|
|
2
2
|
frames=0.1,0.2
|
3
3
|
frames.labels=Editor,Outline
|
4
4
|
frames.names=editor,editor_outline
|
5
|
+
# attention : editor_outline name is used in code. Do no change it
|
5
6
|
active=yes
|
6
7
|
require=ext/ae-editor/ae-editor
|
7
8
|
class=AgMultiEditor
|
8
|
-
|
9
|
+
#gems=coderay
|
10
|
+
gems=coderay,rdp-rbeautify
|
11
|
+
gems.rdp-rbeautify.repository=http://gems.github.com
|
12
|
+
gems.rdp-rbeautify.events=PrettifyTextEvent
|
9
13
|
tabs=0.5c left
|
10
14
|
# to use tab key set tab-replace-width-space=0
|
11
15
|
tab-replace-width-space=2
|
@@ -131,4 +135,4 @@ explorer_panel.tabs.side=top
|
|
131
135
|
|
132
136
|
#:::::::::::::::: Editor group ::::::::::::::::::::::<end>
|
133
137
|
popup.bind.shortcut=Button-3
|
134
|
-
arm::popup.bind.shortcut=F4
|
138
|
+
arm::popup.bind.shortcut=F4
|
data/ext/ae-editor/ae-editor.rb
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
# ae-editor.rb - Arcadia Ruby ide
|
3
3
|
# by Antonio Galeone <antonio-galeone@rubyforge.org>
|
4
4
|
#
|
5
|
-
#
|
6
|
-
#
|
5
|
+
# &require_dir_ref=../..
|
6
|
+
# &require_omissis=conf/arcadia.init
|
7
7
|
|
8
8
|
require 'tk'
|
9
9
|
require 'tktext'
|
10
10
|
require 'lib/a-tkcommons'
|
11
|
-
#require 'lib/a-commons'
|
11
|
+
#require 'lib/a-commons'
|
12
12
|
require 'lib/a-core'
|
13
13
|
|
14
14
|
class TreeNode
|
@@ -183,6 +183,19 @@ class SourceStructure
|
|
183
183
|
return _found_node
|
184
184
|
end
|
185
185
|
|
186
|
+
def deep_node_by_line(_from_node, _line, _found_node=nil)
|
187
|
+
_begin = _from_node.rif.to_i
|
188
|
+
_end = _from_node.rif_end.to_i
|
189
|
+
if _line.to_i <= _end && _line.to_i >= _begin
|
190
|
+
_found_node = _from_node
|
191
|
+
end
|
192
|
+
_sons = _from_node.sons
|
193
|
+
for inode in 0.._sons.length - 1
|
194
|
+
_son = _sons[inode]
|
195
|
+
_found_node = deep_node_by_line(_son, _line, _found_node)
|
196
|
+
end
|
197
|
+
return _found_node
|
198
|
+
end
|
186
199
|
|
187
200
|
def class_node_by_line(_line)
|
188
201
|
line_node = node_by_line(@root, _line)
|
@@ -254,7 +267,7 @@ class SafeCompleteCode
|
|
254
267
|
if _dec_line.include?('.new')
|
255
268
|
pre, post = _dec_line.split('.new')
|
256
269
|
dec_line_processed = "#{pre}.new"
|
257
|
-
post.strip!
|
270
|
+
post.strip! if post
|
258
271
|
if post && post[0..0]=='('
|
259
272
|
k=0
|
260
273
|
ch = '('
|
@@ -290,10 +303,13 @@ class SafeCompleteCode
|
|
290
303
|
|
291
304
|
def refresh_words
|
292
305
|
@words.clear
|
293
|
-
_re = /[\s\t\n]#{@filter}[a-zA-Z0-9\-_]*/
|
306
|
+
_re = /[\s\t\n"'(\[\{=><]#{@filter}[a-zA-Z0-9\-_]*/
|
294
307
|
m = _re.match(@source)
|
295
308
|
while m && (_txt=m.post_match)
|
296
309
|
can = m[0].strip
|
310
|
+
if ['"','(','[','{',"'",'=','>','<'].include?(can[0..0])
|
311
|
+
can = can[1..-1]
|
312
|
+
end
|
297
313
|
@words << can if can != @filter
|
298
314
|
m = _re.match(_txt)
|
299
315
|
end
|
@@ -334,18 +350,18 @@ class SafeCompleteCode
|
|
334
350
|
@modified_source = "#{@modified_source}Dir.chdir('#{File.dirname(@file)}')\n" if @file
|
335
351
|
@modified_row = @modified_row+1
|
336
352
|
source_array.each_with_index{|line,j|
|
337
|
-
# 0)
|
353
|
+
# 0) if a comment I do not consider it
|
338
354
|
if line.strip.length > 0 && line.strip[0..0]=='#'
|
339
355
|
@modified_row = @modified_row-1
|
340
|
-
m =
|
356
|
+
m = /&require_dir_ref=[\s]*(.)*/.match(line)
|
341
357
|
if m
|
342
|
-
require_dir_ref=line.split('
|
358
|
+
require_dir_ref=line.split('&require_dir_ref=')[1].strip
|
343
359
|
@modified_source = "#{@modified_source}Dir.chdir('#{require_dir_ref}')\n"
|
344
360
|
@modified_row = @modified_row+1
|
345
361
|
end
|
346
|
-
m =
|
362
|
+
m = /&require_omissis=[\s]*(.)*/.match(line)
|
347
363
|
if m
|
348
|
-
require_omissis=line.split('
|
364
|
+
require_omissis=line.split('&require_omissis=')[1].strip
|
349
365
|
@modified_source = "#{@modified_source}require '#{require_omissis}'\n"
|
350
366
|
@modified_row = @modified_row+1
|
351
367
|
end
|
@@ -439,7 +455,7 @@ class SafeCompleteCode
|
|
439
455
|
@modified_row = @modified_row+1+ss_len
|
440
456
|
end
|
441
457
|
end
|
442
|
-
if @filter.strip.length > 0
|
458
|
+
if @filter.strip.length > 0 && !is_dot?
|
443
459
|
# refresh_words(source_array)
|
444
460
|
refresh_words
|
445
461
|
end
|
@@ -472,18 +488,19 @@ class SafeCompleteCode
|
|
472
488
|
def candidates(_show_error = false)
|
473
489
|
temp_file = create_modified_temp_file(@file)
|
474
490
|
begin
|
475
|
-
|
491
|
+
Arcadia.is_windows??ruby='rubyw':ruby='ruby'
|
492
|
+
_cmp_s = "|#{ruby} '#{temp_file}'"
|
476
493
|
_ret = nil
|
477
494
|
open(_cmp_s,"r") do
|
478
495
|
|f|
|
479
496
|
_ret = f.readlines.collect!{| line |
|
480
497
|
#line.chomp
|
481
|
-
line
|
498
|
+
line.strip
|
482
499
|
}
|
483
500
|
end
|
484
|
-
if @filter.strip.length > 0
|
501
|
+
if @filter.strip.length > 0 && !is_dot?
|
485
502
|
@words.each{|w|
|
486
|
-
if !_ret.include?(w)
|
503
|
+
if !(_ret.include?(w) || _ret.include?("##{w}"))
|
487
504
|
_ret << w
|
488
505
|
end
|
489
506
|
}
|
@@ -608,80 +625,133 @@ class TkTextListBox < TkScrollText
|
|
608
625
|
|
609
626
|
end
|
610
627
|
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
attr_accessor :file
|
615
|
-
attr_reader :read_only
|
616
|
-
attr_reader :page_frame
|
617
|
-
attr_reader :text, :root
|
618
|
-
def initialize(_controller, _page_frame)
|
628
|
+
class AgEditorOutlineToolbar
|
629
|
+
attr_accessor :sync
|
630
|
+
def initialize(_frame, _controller)
|
619
631
|
@controller = _controller
|
620
|
-
@
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
@
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
632
|
+
@cb_sync = TkCheckButton.new(_frame, Arcadia.style('checkbox')){
|
633
|
+
text 'Sync'
|
634
|
+
justify 'left'
|
635
|
+
indicatoron 0
|
636
|
+
offrelief 'raised'
|
637
|
+
image TkPhotoImage.new('dat' => SYNCICON20_GIF)
|
638
|
+
place('x' => 0,'y' => 0,'height' => 26)
|
639
|
+
}
|
640
|
+
Tk::BWidget::DynamicHelp::add(@cb_sync,
|
641
|
+
'text'=>'Link open editors with content in the Navigator')
|
642
|
+
|
643
|
+
do_check = proc {
|
644
|
+
if @cb_sync.cget('onvalue')==@cb_sync.cget('variable').value.to_i
|
645
|
+
sync_on
|
646
|
+
else
|
647
|
+
sync_off
|
648
|
+
end
|
649
|
+
}
|
650
|
+
@sync = false
|
651
|
+
@cb_sync.command(do_check)
|
634
652
|
end
|
635
|
-
|
636
|
-
# def hide_exp
|
637
|
-
# @fm.hide_left if @fm
|
638
|
-
# end
|
639
|
-
|
640
|
-
# def is_exp_hide?
|
641
|
-
# if @fm.nil?
|
642
|
-
# return true
|
643
|
-
# else
|
644
|
-
# @fm.is_left_hide?
|
645
|
-
# end
|
646
|
-
# end
|
647
653
|
|
648
|
-
def
|
649
|
-
@
|
654
|
+
def sync_on
|
655
|
+
@sync = true
|
656
|
+
e = @controller.raised
|
657
|
+
if e
|
658
|
+
e.outline.select_without_event(e.outline.last_row) if e.outline.last_row
|
659
|
+
end
|
650
660
|
end
|
651
|
-
|
652
|
-
def
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
661
|
+
|
662
|
+
def sync_off
|
663
|
+
@sync = false
|
664
|
+
end
|
665
|
+
|
666
|
+
def is_sync_on?
|
667
|
+
@sync
|
668
|
+
end
|
669
|
+
|
670
|
+
end
|
671
|
+
|
672
|
+
class AgEditorOutline
|
673
|
+
attr_reader :last_row
|
674
|
+
attr_reader :tree_exp
|
675
|
+
def initialize(_editor, _frame, _bar)
|
676
|
+
@editor = _editor
|
677
|
+
@frame = _frame
|
678
|
+
@bar = _bar
|
679
|
+
initialize_tree(_frame)
|
680
|
+
end
|
681
|
+
|
682
|
+
def update_row(_row=0)
|
683
|
+
@last_row=_row
|
684
|
+
if @bar.is_sync_on?
|
685
|
+
select_without_event(_row)
|
686
|
+
end
|
660
687
|
end
|
661
688
|
|
662
|
-
|
689
|
+
# I think this is "if synced expand out the outline for the current selection"
|
690
|
+
def shure_select_node(_node)
|
691
|
+
return if @selecting_node
|
692
|
+
#return if @tree_exp.exist?(_node.rif)
|
693
|
+
@selecting_node = true
|
694
|
+
_proc = @tree_exp.selectcommand
|
695
|
+
@tree_exp.selectcommand(nil)
|
696
|
+
begin
|
697
|
+
@tree_exp.selection_clear
|
698
|
+
@tree_exp.selection_add(_node.rif)
|
699
|
+
@opened = false
|
700
|
+
to_open = @last_open_node
|
701
|
+
parent = _node.parent
|
702
|
+
while !parent.nil? && parent.rif != 'root'
|
703
|
+
@tree_exp.open_tree(parent.rif, false)
|
704
|
+
@opened = to_open==parent.rif || @opened
|
705
|
+
@last_open_node=parent.rif
|
706
|
+
parent = parent.parent
|
707
|
+
end
|
708
|
+
|
709
|
+
@tree_exp.close_tree(to_open) if to_open && !@opened
|
710
|
+
|
711
|
+
@tree_exp.see(_node.rif)
|
712
|
+
ensure
|
713
|
+
@tree_exp.selectcommand(_proc)
|
714
|
+
@selecting_node = false
|
715
|
+
end
|
716
|
+
end
|
717
|
+
|
718
|
+
def select_without_event(_line)
|
719
|
+
if @ss
|
720
|
+
_node=@ss.deep_node_by_line(@ss.root, _line)
|
721
|
+
if _node && @tree_exp.exist?(_node.rif) && _node.rif!='root'
|
722
|
+
shure_select_node(_node)
|
723
|
+
end
|
724
|
+
end
|
725
|
+
end
|
726
|
+
|
663
727
|
def initialize_tree(_frame)
|
664
|
-
@classbrowsing = @is_ruby
|
665
728
|
_tree_goto = proc{|_self|
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
_editor_line = @text.get(_index, _index+ ' lineend')
|
670
|
-
if !_editor_line.include?(_hinner_text)
|
671
|
-
Arcadia.console(self, 'msg'=>"... rebuild tree \n")
|
672
|
-
if @tree_thread && @tree_thread.alive?
|
673
|
-
@tree_thread.exit
|
674
|
-
end
|
675
|
-
@tree_thread = Thread.new{
|
676
|
-
build_tree(_line)
|
677
|
-
Tk.update
|
678
|
-
}
|
729
|
+
sync_val = @bar.sync
|
730
|
+
@bar.sync=false
|
731
|
+
begin
|
679
732
|
_line = _self.selection_get[0]
|
680
733
|
_index =_line.to_s+'.0'
|
734
|
+
_hinner_text = @tree_exp.itemcget(_line,'text').strip
|
735
|
+
_editor_line = @editor.text.get(_index, _index+ ' lineend')
|
736
|
+
if !_editor_line.include?(_hinner_text)
|
737
|
+
Arcadia.console(self, 'msg'=>"... rebuild tree \n")
|
738
|
+
if @tree_thread && @tree_thread.alive?
|
739
|
+
@tree_thread.exit # kill the old tree
|
740
|
+
end
|
741
|
+
@tree_thread = Thread.new{
|
742
|
+
build_tree(_line)
|
743
|
+
Tk.update
|
744
|
+
}
|
745
|
+
_line = _self.selection_get[0]
|
746
|
+
_index =_line.to_s+'.0'
|
747
|
+
end
|
748
|
+
@editor.text.set_focus
|
749
|
+
@editor.text.see(_index)
|
750
|
+
@editor.text.tag_remove('selected','1.0','end')
|
751
|
+
@editor.text.tag_add('selected',_line.to_s+'.0',(_line+1).to_s+'.0')
|
752
|
+
ensure
|
753
|
+
@bar.sync = sync_val
|
681
754
|
end
|
682
|
-
@text.see(_index)
|
683
|
-
@text.tag_remove('selected','1.0','end')
|
684
|
-
@text.tag_add('selected',_line.to_s+'.0',(_line+1).to_s+'.0')
|
685
755
|
}
|
686
756
|
@tree_exp = Tk::BWidget::Tree.new(_frame, Arcadia.style('treepanel')){
|
687
757
|
showlines false
|
@@ -690,12 +760,87 @@ class AgEditor
|
|
690
760
|
selectcommand proc{ _tree_goto.call(self) }
|
691
761
|
}
|
692
762
|
@tree_scroll_wrapper = TkScrollWidget.new(@tree_exp)
|
693
|
-
|
763
|
+
self.show
|
694
764
|
@tree_scroll_wrapper.show_v_scroll
|
695
765
|
@tree_scroll_wrapper.show_h_scroll
|
696
766
|
pop_up_menu_tree
|
697
767
|
end
|
698
768
|
|
769
|
+
def destroy
|
770
|
+
@tree_scroll_wrapper.destroy
|
771
|
+
@tree_exp.destroy
|
772
|
+
end
|
773
|
+
|
774
|
+
def show
|
775
|
+
@tree_scroll_wrapper.show(0,26)
|
776
|
+
Tk.update
|
777
|
+
end
|
778
|
+
|
779
|
+
def hide
|
780
|
+
@tree_scroll_wrapper.hide
|
781
|
+
end
|
782
|
+
|
783
|
+
def build_tree_from_node(_node, _label_match=nil)
|
784
|
+
@image_kclass = TkPhotoImage.new('dat' => TREE_NODE_CLASS_GIF)
|
785
|
+
@image_kmodule = TkPhotoImage.new('dat' => TREE_NODE_MODULE_GIF)
|
786
|
+
@image_kdef = TkPhotoImage.new('dat' => TREE_NODE_DEF_GIF)
|
787
|
+
@image_kdefclass = TkPhotoImage.new('dat' => TREE_NODE_DEFCLASS_GIF)
|
788
|
+
|
789
|
+
_sorted_sons = _node.sons.sort
|
790
|
+
for inode in 0.._sorted_sons.length - 1
|
791
|
+
_son = _sorted_sons[inode]
|
792
|
+
if _son.kind == 'KClass'
|
793
|
+
_image = @image_kclass
|
794
|
+
elsif _son.kind == 'KModule'
|
795
|
+
_image = @image_kmodule
|
796
|
+
elsif _son.kind == 'KDef'
|
797
|
+
_image = @image_kdef
|
798
|
+
elsif _son.kind == 'KDefClass'
|
799
|
+
_image = @image_kdefclass
|
800
|
+
end
|
801
|
+
@tree_exp.insert('end', _son.parent.rif ,_son.rif, {
|
802
|
+
'text' => _son.label ,
|
803
|
+
'helptext' => _son.helptext,
|
804
|
+
#'font'=>$arcadia['conf']['editor.explorer_panel.tree.font'],
|
805
|
+
'image'=> _image
|
806
|
+
}.update(Arcadia.style('treeitem'))
|
807
|
+
)
|
808
|
+
if (_label_match) && (_label_match.strip == _son.label.strip)
|
809
|
+
@selected = _son
|
810
|
+
end
|
811
|
+
build_tree_from_node(_son, _label_match) # recursion -- if there are no sons it will do nothing
|
812
|
+
end
|
813
|
+
end
|
814
|
+
|
815
|
+
def build_tree(_sel=nil)
|
816
|
+
#Arcadia.console(self,"msg"=>"build for #{@file}")
|
817
|
+
if _sel
|
818
|
+
_label_sel = @tree_exp.itemcget(_sel,'text')
|
819
|
+
end
|
820
|
+
|
821
|
+
#clear tree
|
822
|
+
begin
|
823
|
+
@tree_exp.delete(@tree_exp.nodes('root'))
|
824
|
+
rescue Exception
|
825
|
+
# workaround on windows
|
826
|
+
@tree_exp.delete(@tree_exp.nodes('root'))
|
827
|
+
end
|
828
|
+
|
829
|
+
|
830
|
+
#(re)build tree
|
831
|
+
_txt = @editor.text.get('1.0','end')
|
832
|
+
#@root = build_tree_from_source(_txt)
|
833
|
+
@ss = SourceStructure.new(_txt)
|
834
|
+
#@root = @ss.root
|
835
|
+
@selected = nil
|
836
|
+
build_tree_from_node(@ss.root, _label_sel)
|
837
|
+
if @selected
|
838
|
+
@tree_exp.selection_add(@selected.rif)
|
839
|
+
@tree_exp.open_tree(@selected.parent.rif)
|
840
|
+
@tree_exp.see(@selected.rif)
|
841
|
+
end
|
842
|
+
end
|
843
|
+
|
699
844
|
def pop_up_menu_tree
|
700
845
|
@pop_up_tree = TkMenu.new(
|
701
846
|
:parent=>@tree_exp,
|
@@ -717,7 +862,48 @@ class AgEditor
|
|
717
862
|
},
|
718
863
|
"%x %y")
|
719
864
|
end
|
865
|
+
|
866
|
+
end
|
720
867
|
|
868
|
+
class AgEditor
|
869
|
+
attr_accessor :file
|
870
|
+
attr_reader :read_only
|
871
|
+
attr_reader :page_frame
|
872
|
+
attr_reader :text, :root
|
873
|
+
attr_reader :outline
|
874
|
+
attr_reader :highlighting
|
875
|
+
def initialize(_controller, _page_frame)
|
876
|
+
@controller = _controller
|
877
|
+
@page_frame = _page_frame
|
878
|
+
@set_mod = false
|
879
|
+
@modified_from_opening=false
|
880
|
+
@font = Arcadia.conf('edit.font')
|
881
|
+
@font_bold = "#{Arcadia.conf('edit.font')} bold"
|
882
|
+
@font_metrics = TkFont.new(@font).metrics
|
883
|
+
@font_metrics_bold = TkFont.new(@font_bold).metrics
|
884
|
+
@highlighting = false
|
885
|
+
@classbrowsing = false
|
886
|
+
@find = @controller.get_find
|
887
|
+
@read_only=false
|
888
|
+
@loading=false
|
889
|
+
@tabs_show = false
|
890
|
+
@spaces_show = false
|
891
|
+
end
|
892
|
+
|
893
|
+
def modified_from_opening?
|
894
|
+
@modified_from_opening
|
895
|
+
end
|
896
|
+
|
897
|
+
def xy_insert
|
898
|
+
_index_now = @text.index('insert')
|
899
|
+
_rx, _ry, _widht, _heigth = @text.bbox(_index_now);
|
900
|
+
_x = _rx + TkWinfo.rootx(@text)
|
901
|
+
_y = _ry + TkWinfo.rooty(@text) + @font_metrics[2][1]
|
902
|
+
_xroot = _x - TkWinfo.rootx(Arcadia.instance.layout.root)
|
903
|
+
_yroot = _y - TkWinfo.rooty(Arcadia.instance.layout.root)
|
904
|
+
return _xroot, _yroot
|
905
|
+
end
|
906
|
+
|
721
907
|
|
722
908
|
def initialize_text(_frame)
|
723
909
|
@text = TkScrollText.new(_frame, Arcadia.style('text')){|j|
|
@@ -733,6 +919,14 @@ class AgEditor
|
|
733
919
|
tabs $arcadia['conf']['editor.tabs']
|
734
920
|
}
|
735
921
|
|
922
|
+
class << @text
|
923
|
+
def tag_adds(tag, *args)
|
924
|
+
tk_send_without_enc('tag', 'add', _get_eval_enc_str(tag),
|
925
|
+
*args.flatten)
|
926
|
+
self
|
927
|
+
end
|
928
|
+
end
|
929
|
+
|
736
930
|
#do_tag_configure_global('debug')
|
737
931
|
@text.tag_configure('eval','foreground' => 'yellow', 'background' =>'red','borderwidth'=>1, 'relief'=>'raised')
|
738
932
|
@text.tag_configure('errline','borderwidth'=>1, 'relief'=>'groove')
|
@@ -749,7 +943,11 @@ class AgEditor
|
|
749
943
|
if @file
|
750
944
|
_file = @file+'~~'
|
751
945
|
else
|
752
|
-
|
946
|
+
n=0
|
947
|
+
while File.exist?(File.join(Arcadia.instance.local_dir,"buffer#{n}~~"))
|
948
|
+
n+=1
|
949
|
+
end
|
950
|
+
_file = File.join(Arcadia.instance.local_dir,"buffer#{n}~~")
|
753
951
|
end
|
754
952
|
f = File.new(_file, "w")
|
755
953
|
begin
|
@@ -1125,6 +1323,9 @@ class AgEditor
|
|
1125
1323
|
|
1126
1324
|
end
|
1127
1325
|
|
1326
|
+
#
|
1327
|
+
# setup all key bindings (normal, +control, etc)
|
1328
|
+
#
|
1128
1329
|
def activate_key_binding
|
1129
1330
|
activate_complete_code_key_binding if @is_ruby
|
1130
1331
|
@text.bind_append("Control-KeyPress"){|e|
|
@@ -1133,20 +1334,25 @@ class AgEditor
|
|
1133
1334
|
# @do_complete = true
|
1134
1335
|
# complete_code.call
|
1135
1336
|
when 'z'
|
1136
|
-
_b = @text.index('insert').split('.')[0].to_i
|
1137
|
-
|
1138
|
-
|
1337
|
+
#_b = @text.index('insert').split('.')[0].to_i
|
1338
|
+
begin
|
1339
|
+
@text.edit_undo
|
1340
|
+
rescue RuntimeError => e
|
1341
|
+
throw e unless e.to_s.include? "nothing to undo" # this is ok--we've done undo back to the beginning
|
1342
|
+
break
|
1343
|
+
end
|
1344
|
+
#_e = @text.index('insert').split('.')[0].to_i
|
1139
1345
|
if @highlighting
|
1140
|
-
|
1141
|
-
|
1142
|
-
|
1346
|
+
_b = @text.index('@0,0').split('.')[0].to_i
|
1347
|
+
_e = @text.index('@0,'+TkWinfo.height(@text).to_s).split('.')[0].to_i + 1
|
1348
|
+
rehighlightlines(_b,_e)
|
1143
1349
|
end
|
1144
1350
|
break
|
1145
1351
|
when 'o'
|
1146
1352
|
if @file
|
1147
1353
|
_dir = File.dirname(@file)
|
1148
1354
|
else
|
1149
|
-
_dir =
|
1355
|
+
_dir = MonitorLastUsedDir.get_last_dir
|
1150
1356
|
end
|
1151
1357
|
Arcadia.process_event(OpenBufferEvent.new(self,'file'=>Tk.getOpenFile('initialdir'=>_dir)))
|
1152
1358
|
break
|
@@ -1161,9 +1367,10 @@ class AgEditor
|
|
1161
1367
|
@text.text_paste
|
1162
1368
|
_e = @text.index('insert').split('.')[0].to_i
|
1163
1369
|
if @highlighting
|
1164
|
-
|
1165
|
-
|
1166
|
-
|
1370
|
+
rehighlightlines(_b,_e)
|
1371
|
+
# for j in _b..._e
|
1372
|
+
# rehighlightline(j)
|
1373
|
+
# end
|
1167
1374
|
end
|
1168
1375
|
break
|
1169
1376
|
end
|
@@ -1176,6 +1383,12 @@ class AgEditor
|
|
1176
1383
|
@text.insert('insert',"{")
|
1177
1384
|
when 'plus'
|
1178
1385
|
@text.insert('insert',"}")
|
1386
|
+
when 'g'
|
1387
|
+
Arcadia.process_event(GoToLineBufferEvent.new(self))
|
1388
|
+
when 'n'
|
1389
|
+
$arcadia['main.action.new_file'] # necessary? Is there an event for this?
|
1390
|
+
when 'w'
|
1391
|
+
Arcadia.process_event(CloseCurrentTabEvent.new(self))
|
1179
1392
|
end
|
1180
1393
|
}
|
1181
1394
|
|
@@ -1222,9 +1435,11 @@ class AgEditor
|
|
1222
1435
|
else
|
1223
1436
|
@text.insert(_row.to_s+'.0',"#")
|
1224
1437
|
end
|
1225
|
-
rehighlightline(_row) if @highlighting
|
1438
|
+
#rehighlightline(_row) if @highlighting
|
1226
1439
|
end
|
1227
|
-
|
1440
|
+
rehighlightlines(_row_begin, _row_end) if @highlighting
|
1441
|
+
when 'F'
|
1442
|
+
Arcadia.process_event(AckInFilesEvent.new(self))
|
1228
1443
|
end
|
1229
1444
|
}
|
1230
1445
|
|
@@ -1235,11 +1450,13 @@ class AgEditor
|
|
1235
1450
|
when 'BackSpace'
|
1236
1451
|
_index = @text.index('insert')
|
1237
1452
|
_row, _col = _index.split('.')
|
1238
|
-
|
1453
|
+
rehighlightlines(_row.to_i,_row.to_i) if @highlighting
|
1454
|
+
# rehighlightline(_row.to_i) if @highlighting
|
1239
1455
|
when 'Delete'
|
1240
1456
|
_index = @text.index('insert')
|
1241
1457
|
_row, _col = _index.split('.')
|
1242
|
-
|
1458
|
+
rehighlightlines(_row.to_i, _row.to_i) if @highlighting
|
1459
|
+
# rehighlightline(_row.to_i) if @highlighting
|
1243
1460
|
when 'F5'
|
1244
1461
|
run_buffer
|
1245
1462
|
when 'F3'
|
@@ -1278,16 +1495,11 @@ class AgEditor
|
|
1278
1495
|
|
1279
1496
|
@text.bind_append("KeyRelease"){|e|
|
1280
1497
|
case e.keysym
|
1281
|
-
|
1282
|
-
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
when 'Control_L','Return', 'Control_V', 'BackSpace', 'Delete'
|
1287
|
-
do_line_update
|
1288
|
-
end
|
1289
|
-
case e.keysym
|
1290
|
-
when 'Return'
|
1498
|
+
when 'Up','Down'
|
1499
|
+
refresh_outline
|
1500
|
+
when 'Left', 'Right'
|
1501
|
+
|
1502
|
+
when 'Return' #,'Control_L', 'Control_V', 'BackSpace', 'Delete'
|
1291
1503
|
_index = @text.index('insert')
|
1292
1504
|
_row, _col = _index.split('.')
|
1293
1505
|
_txt = @text.get((_row.to_i-1).to_s+'.0',_index)
|
@@ -1305,8 +1517,13 @@ class AgEditor
|
|
1305
1517
|
do_line_update
|
1306
1518
|
end
|
1307
1519
|
else
|
1520
|
+
if ['Control_L', 'Control_V', 'BackSpace', 'Delete'].include?(e.keysym)
|
1521
|
+
do_line_update
|
1522
|
+
end
|
1308
1523
|
if @highlighting && /\w/.match(e.keysym)
|
1309
|
-
|
1524
|
+
# rehighlightline(@text.index('insert').split('.')[0].to_i)
|
1525
|
+
row = @text.index('insert').split('.')[0].to_i
|
1526
|
+
rehighlightlines(row, row)
|
1310
1527
|
end
|
1311
1528
|
end
|
1312
1529
|
check_modify
|
@@ -1339,6 +1556,7 @@ class AgEditor
|
|
1339
1556
|
}
|
1340
1557
|
end
|
1341
1558
|
|
1559
|
+
# show the "find in file" dialog
|
1342
1560
|
def find
|
1343
1561
|
_r = @text.tag_ranges('sel')
|
1344
1562
|
if _r.length>0
|
@@ -1362,27 +1580,41 @@ class AgEditor
|
|
1362
1580
|
|
1363
1581
|
end
|
1364
1582
|
|
1583
|
+
def do_enter
|
1584
|
+
check_file_last_access_time
|
1585
|
+
end
|
1586
|
+
|
1365
1587
|
def initialize_text_binding
|
1366
1588
|
@text.add_yscrollcommand(proc{|first,last| self.do_line_update()})
|
1367
1589
|
|
1368
1590
|
@text.tag_bind('selected', 'Enter', proc{@text.tag_remove('selected','1.0','end')})
|
1369
1591
|
|
1370
|
-
@text.bind("Enter", proc{
|
1592
|
+
@text.bind("Enter", proc{do_enter})
|
1371
1593
|
|
1372
1594
|
@text.bind("<Modified>"){|e|
|
1373
1595
|
check_modify
|
1374
1596
|
}
|
1375
1597
|
activate_key_binding
|
1376
|
-
@text.bind_append("1"
|
1598
|
+
@text.bind_append("1"){
|
1599
|
+
Arcadia.process_event(InputEnterEvent.new(self,'receiver'=>@text))
|
1600
|
+
refresh_outline
|
1601
|
+
}
|
1602
|
+
end
|
1603
|
+
|
1604
|
+
def refresh_outline
|
1605
|
+
if @outline
|
1606
|
+
Tk.after(1,proc{ @outline.update_row(self.row)})
|
1607
|
+
end
|
1377
1608
|
end
|
1378
1609
|
|
1379
1610
|
def run_buffer
|
1380
1611
|
if !@file
|
1381
1612
|
_file = create_temp_file
|
1382
1613
|
begin
|
1383
|
-
Arcadia.process_event(RunRubyFileEvent.new(self, 'file'=>_file, 'persistent'=>false))
|
1614
|
+
_event = Arcadia.process_event(RunRubyFileEvent.new(self, 'file'=>_file, 'persistent'=>false))
|
1384
1615
|
ensure
|
1385
|
-
File.delete(_file) if File.exist?(_file)
|
1616
|
+
_event.add_finalize_callback(proc{File.delete(_file) if File.exist?(_file)})
|
1617
|
+
# File.delete(_file) if File.exist?(_file)
|
1386
1618
|
end
|
1387
1619
|
else
|
1388
1620
|
save if !@read_only
|
@@ -1546,19 +1778,40 @@ class AgEditor
|
|
1546
1778
|
|
1547
1779
|
def reset_highlight
|
1548
1780
|
@is_line_bold.clear
|
1549
|
-
@
|
1550
|
-
@highlight_zone.clear
|
1781
|
+
@highlight_zone.clear if @highlighting
|
1551
1782
|
@last_line_begin=0
|
1552
1783
|
@last_line_end=0
|
1553
1784
|
@last_zone_begin=0
|
1554
1785
|
@last_zone_end=0
|
1555
1786
|
end
|
1787
|
+
|
1788
|
+
def change_highlight(_ext)
|
1789
|
+
new_highlight_scanner = @controller.highlight_scanner(_ext)
|
1790
|
+
if new_highlight_scanner != @highlight_scanner
|
1791
|
+
@highlight_scanner.classes.each{|c|
|
1792
|
+
@text.tag_remove(c,'1.0', 'end')
|
1793
|
+
@text.tag_delete(c)
|
1794
|
+
@is_tag_bold.delete(c)
|
1795
|
+
}
|
1796
|
+
@highlight_scanner = new_highlight_scanner
|
1797
|
+
reset_highlight
|
1798
|
+
if @highlight_scanner
|
1799
|
+
@highlight_scanner.classes.each{|c|
|
1800
|
+
do_tag_configure(c)
|
1801
|
+
}
|
1802
|
+
@highlighting = true
|
1803
|
+
else
|
1804
|
+
@highlighting = false
|
1805
|
+
end
|
1806
|
+
end
|
1807
|
+
end
|
1556
1808
|
|
1557
|
-
def initialize_highlight
|
1809
|
+
def initialize_highlight(_ext)
|
1810
|
+
@highlight_scanner = @controller.highlight_scanner(_ext)
|
1558
1811
|
@is_line_bold = Hash.new
|
1559
1812
|
@is_tag_bold = Hash.new
|
1560
1813
|
do_tag_configure_global('debug')
|
1561
|
-
if @lang_hash.nil?
|
1814
|
+
if @lang_hash.nil? || @highlight_scanner.nil?
|
1562
1815
|
@highlighting = false
|
1563
1816
|
return
|
1564
1817
|
end
|
@@ -1570,19 +1823,8 @@ class AgEditor
|
|
1570
1823
|
@last_line_end = 0
|
1571
1824
|
@last_zone_begin=0;
|
1572
1825
|
@last_zone_end=0;
|
1573
|
-
|
1574
|
-
#@is_tag_bold = Hash.new
|
1575
|
-
@h_classes = @lang_hash['classes'].split(',')
|
1576
|
-
@h_re = Hash.new
|
1577
|
-
@op_to_end_line = Array.new
|
1578
|
-
@op_to_end_line.concat(@lang_hash['re_op.to_line_end'].split(',')) if @lang_hash['re_op.to_line_end']
|
1579
|
-
|
1580
|
-
@op_only_first = Array.new
|
1581
|
-
@op_only_first.concat(@lang_hash['re_op.only_first'].split(',')) if @lang_hash['re_op.only_first']
|
1582
|
-
|
1583
|
-
@h_classes.each{|c|
|
1826
|
+
@highlight_scanner.classes.each{|c|
|
1584
1827
|
do_tag_configure(c)
|
1585
|
-
@h_re[c]=Regexp::new(@lang_hash["re.#{c}"].strip) if @lang_hash["re.#{c}"]
|
1586
1828
|
}
|
1587
1829
|
|
1588
1830
|
['sel','selected','tabs','spaces'].each{|_name|
|
@@ -1596,23 +1838,23 @@ class AgEditor
|
|
1596
1838
|
|
1597
1839
|
def do_tag_configure(_name)
|
1598
1840
|
h = Hash.new
|
1599
|
-
if @lang_hash['hightlight.
|
1600
|
-
h['foreground']=@lang_hash['hightlight.
|
1841
|
+
if @lang_hash["#{@lang_hash['scanner']}.hightlight."+_name+'.foreground']
|
1842
|
+
h['foreground']=@lang_hash["#{@lang_hash['scanner']}.hightlight."+_name+'.foreground']
|
1601
1843
|
end
|
1602
|
-
if @lang_hash['hightlight.
|
1603
|
-
h['background']=@lang_hash['hightlight.
|
1844
|
+
if @lang_hash["#{@lang_hash['scanner']}.hightlight."+_name+'.background']
|
1845
|
+
h['background']=@lang_hash["#{@lang_hash['scanner']}.hightlight."+_name+'.background']
|
1604
1846
|
end
|
1605
|
-
if @lang_hash['hightlight.
|
1847
|
+
if @lang_hash["#{@lang_hash['scanner']}.hightlight."+_name+'.style']== 'bold'
|
1606
1848
|
h['font']=@font_bold
|
1607
1849
|
@is_tag_bold[_name]= true
|
1608
1850
|
else
|
1609
1851
|
@is_tag_bold[_name]= false
|
1610
1852
|
end
|
1611
|
-
if @lang_hash['hightlight.
|
1612
|
-
h['relief']=@lang_hash['hightlight.
|
1853
|
+
if @lang_hash["#{@lang_hash['scanner']}.hightlight."+_name+'.relief']
|
1854
|
+
h['relief']=@lang_hash["#{@lang_hash['scanner']}.hightlight."+_name+'.relief']
|
1613
1855
|
end
|
1614
|
-
if @lang_hash['hightlight.
|
1615
|
-
h['borderwidth']=@lang_hash['hightlight.
|
1856
|
+
if @lang_hash["#{@lang_hash['scanner']}.hightlight."+_name+'.borderwidth']
|
1857
|
+
h['borderwidth']=@lang_hash["#{@lang_hash['scanner']}.hightlight."+_name+'.borderwidth']
|
1616
1858
|
end
|
1617
1859
|
@text.tag_configure(_name, h)
|
1618
1860
|
end
|
@@ -1763,8 +2005,8 @@ class AgEditor
|
|
1763
2005
|
:command,
|
1764
2006
|
:label=>'Data image from file',
|
1765
2007
|
:hidemargin => false,
|
1766
|
-
:command=>
|
1767
|
-
file =
|
2008
|
+
:command=> proc{
|
2009
|
+
file = Arcadia.open_file_dialog
|
1768
2010
|
if file
|
1769
2011
|
require 'base64'
|
1770
2012
|
f = File.open(file,"rb")
|
@@ -1990,154 +2232,9 @@ class AgEditor
|
|
1990
2232
|
@text.tag_add('selected',_index +' linestart', _index +' +1 lines linestart')
|
1991
2233
|
end
|
1992
2234
|
|
1993
|
-
|
1994
|
-
|
1995
|
-
|
1996
|
-
# _liv = 0
|
1997
|
-
# _livs = Array.new
|
1998
|
-
# root = TreeNode.new(nil, 'KRoot'){|_node|
|
1999
|
-
# _node.rif= 'root'
|
2000
|
-
# _node.label=''
|
2001
|
-
# }
|
2002
|
-
# _livs[_liv]=root
|
2003
|
-
# _source.each_line{|line|
|
2004
|
-
# line = "\s"+line.split("#")[0]+"\s"
|
2005
|
-
# m = /[\s\n\t\;]+(module|class|def|if|unless|begin|case|for|while|do)[\s\n\t\;]+/.match(line)
|
2006
|
-
# if m
|
2007
|
-
# index = m.post_match.strip.length - 1
|
2008
|
-
# if m.post_match.strip[index,index]=='{'
|
2009
|
-
# _row = _row +1
|
2010
|
-
# next
|
2011
|
-
# end
|
2012
|
-
# _liv>=0? _liv = _liv + 1:_liv=1
|
2013
|
-
# _pliv = _liv
|
2014
|
-
# _parent = nil
|
2015
|
-
# while (_parent == nil && _pliv>=0)
|
2016
|
-
# _pliv = _pliv -1
|
2017
|
-
# _parent = _livs[_pliv]
|
2018
|
-
# end
|
2019
|
-
# if _parent
|
2020
|
-
# _helptext = m.post_match.strip
|
2021
|
-
# _label = _helptext.split('<')[0]
|
2022
|
-
# if _label == nil || _label.strip.length==0
|
2023
|
-
# _label = _helptext
|
2024
|
-
# end
|
2025
|
-
# if (m[0].strip[0..4] == "class" && m.pre_match.strip.length==0)
|
2026
|
-
# _kind = 'KClass'
|
2027
|
-
# elsif (m[0].strip[0..4] == "class" && m.pre_match.strip.length>0)
|
2028
|
-
# _row = _row +1
|
2029
|
-
# _liv = _liv - 1
|
2030
|
-
# next
|
2031
|
-
# elsif (m[0].strip[0..5] == "module" && m.pre_match.strip.length==0)
|
2032
|
-
# _kind = 'KModule'
|
2033
|
-
# elsif (m[0].strip[0..5] == "module" && m.pre_match.strip.length>0)
|
2034
|
-
# _row = _row +1
|
2035
|
-
# _liv = _liv - 1
|
2036
|
-
# next
|
2037
|
-
# elsif ((m[0].strip[0..4] == "begin")||(m[0].strip[0..3] == "case") ||(m[0].strip[0..4] == "while") || (m[0].strip[0..2] == "for") || (m[0].strip[0..1] == "do") || ((m[0].strip[0..1] == "if" || m[0].strip[0..5] == "unless") && m.pre_match.strip.length==0))
|
2038
|
-
# _row = _row +1
|
2039
|
-
# next
|
2040
|
-
# elsif ((m[0].strip[0..1] == "if" || m[0].strip[0..5] == "unless") && m.pre_match.strip.length>0)
|
2041
|
-
# _row = _row +1
|
2042
|
-
# _liv = _liv - 1
|
2043
|
-
# next
|
2044
|
-
# elsif (m[0].strip[0..2] == "def" && m.pre_match.strip.length==0)
|
2045
|
-
# _kind = 'KDef'
|
2046
|
-
# if _label.include?(_parent.label + '.')
|
2047
|
-
# _kind = 'KDefClass'
|
2048
|
-
# end
|
2049
|
-
# # elsif (m[0].strip[0..10] == "attr_reader" && m.pre_match.strip.length==0)
|
2050
|
-
# # _kind = 'KAttr_reader'
|
2051
|
-
# # _liv = _liv - 1
|
2052
|
-
# # _row = _row +1
|
2053
|
-
# end
|
2054
|
-
#
|
2055
|
-
# TreeNode.new(_parent, _kind){|_node|
|
2056
|
-
# _node.label = _label
|
2057
|
-
# _node.helptext = _helptext
|
2058
|
-
# _node.rif = _row.to_s
|
2059
|
-
# _livs[_pliv + 1]=_node
|
2060
|
-
# }
|
2061
|
-
# else
|
2062
|
-
# _row = _row +1
|
2063
|
-
# _liv = _liv - 1
|
2064
|
-
# next
|
2065
|
-
# end
|
2066
|
-
# end
|
2067
|
-
# m_end = /[\s\n\t\;]+end[\s\n\t\;]+/.match(line)
|
2068
|
-
# if m_end
|
2069
|
-
# _liv = _liv - 1
|
2070
|
-
# end
|
2071
|
-
# _row = _row +1
|
2072
|
-
# }
|
2073
|
-
# return root
|
2074
|
-
# end
|
2075
|
-
|
2076
|
-
def build_tree_from_node(_node, _label_match=nil)
|
2077
|
-
|
2078
|
-
@image_kclass = TkPhotoImage.new('dat' => TREE_NODE_CLASS_GIF)
|
2079
|
-
@image_kmodule = TkPhotoImage.new('dat' => TREE_NODE_MODULE_GIF)
|
2080
|
-
@image_kdef = TkPhotoImage.new('dat' => TREE_NODE_DEF_GIF)
|
2081
|
-
@image_kdefclass = TkPhotoImage.new('dat' => TREE_NODE_DEFCLASS_GIF)
|
2082
|
-
|
2083
|
-
_sorted_sons = _node.sons.sort
|
2084
|
-
for inode in 0.._sorted_sons.length - 1
|
2085
|
-
_son = _sorted_sons[inode]
|
2086
|
-
if _son.kind == 'KClass'
|
2087
|
-
_image = @image_kclass
|
2088
|
-
elsif _son.kind == 'KModule'
|
2089
|
-
_image = @image_kmodule
|
2090
|
-
elsif _son.kind == 'KDef'
|
2091
|
-
_image = @image_kdef
|
2092
|
-
elsif _son.kind == 'KDefClass'
|
2093
|
-
_image = @image_kdefclass
|
2094
|
-
end
|
2095
|
-
@tree_exp.insert('end', _son.parent.rif ,_son.rif, {
|
2096
|
-
'text' => _son.label ,
|
2097
|
-
'helptext' => _son.helptext,
|
2098
|
-
#'font'=>$arcadia['conf']['editor.explorer_panel.tree.font'],
|
2099
|
-
'image'=> _image
|
2100
|
-
}.update(Arcadia.style('treeitem'))
|
2101
|
-
)
|
2102
|
-
if (_label_match) && (_label_match.strip == _son.label.strip)
|
2103
|
-
@selected = _son
|
2104
|
-
end
|
2105
|
-
build_tree_from_node(_son, _label_match)
|
2106
|
-
end
|
2107
|
-
end
|
2108
|
-
|
2109
|
-
def build_tree(_sel=nil)
|
2110
|
-
#Arcadia.console(self,"msg"=>"build for #{@file}")
|
2111
|
-
if _sel
|
2112
|
-
_label_sel = @tree_exp.itemcget(_sel,'text')
|
2113
|
-
end
|
2114
|
-
|
2115
|
-
#clear tree
|
2116
|
-
begin
|
2117
|
-
@tree_exp.delete(@tree_exp.nodes('root'))
|
2118
|
-
rescue Exception
|
2119
|
-
# workaround on windows
|
2120
|
-
@tree_exp.delete(@tree_exp.nodes('root'))
|
2121
|
-
end
|
2122
|
-
|
2123
|
-
|
2124
|
-
#(re)build tree
|
2125
|
-
_txt = @text.get('1.0','end')
|
2126
|
-
#@root = build_tree_from_source(_txt)
|
2127
|
-
@root = SourceStructure.new(_txt).root
|
2128
|
-
|
2129
|
-
@selected = nil
|
2130
|
-
build_tree_from_node(@root, _label_sel)
|
2131
|
-
if @selected
|
2132
|
-
@tree_exp.selection_add(@selected.rif)
|
2133
|
-
@tree_exp.open_tree(@selected.parent.rif)
|
2134
|
-
@tree_exp.see(@selected.rif)
|
2135
|
-
end
|
2136
|
-
end
|
2137
|
-
|
2138
|
-
def insert_popup_menu_item(_where, *args)
|
2139
|
-
@pop_up.insert(_where,*args)
|
2140
|
-
end
|
2235
|
+
def insert_popup_menu_item(_where, *args)
|
2236
|
+
@pop_up.insert(_where,*args)
|
2237
|
+
end
|
2141
2238
|
|
2142
2239
|
def text_value
|
2143
2240
|
return @text.value
|
@@ -2180,85 +2277,94 @@ class AgEditor
|
|
2180
2277
|
return (_riga.to_i + _gap_row).to_s + '.'+ (_colonna.to_i + _gap_col).to_s
|
2181
2278
|
end
|
2182
2279
|
|
2183
|
-
def find_and_set_tag_ml(_re, _row, _txt, _tag, _tag_rem = nil)
|
2184
|
-
m = _re.match(_txt)
|
2185
|
-
_offset = 0
|
2186
|
-
_s_txt = _txt
|
2187
|
-
#_old_txt = ''
|
2188
|
-
while m && (_txt=m.post_match)
|
2189
|
-
if !defined?(_old_txt) || _txt != _old_txt
|
2280
|
+
# def find_and_set_tag_ml(_re, _row, _txt, _tag, _tag_rem = nil)
|
2281
|
+
# m = _re.match(_txt)
|
2282
|
+
# _offset = 0
|
2283
|
+
# _s_txt = _txt
|
2284
|
+
# #_old_txt = ''
|
2285
|
+
# while m && (_txt=m.post_match)
|
2286
|
+
# if !defined?(_old_txt) || _txt != _old_txt
|
2287
|
+
#
|
2288
|
+
# apos = pos_to_index(_s_txt, _offset+m.begin(0))
|
2289
|
+
# _offset = _offset + m.end(0)
|
2290
|
+
#
|
2291
|
+
#
|
2292
|
+
# _old_txt = _txt
|
2293
|
+
# _r = _row + apos[0]
|
2294
|
+
# _ibegin = _r.to_s+'.'+apos[1].to_s
|
2295
|
+
# _iend = _r.to_s+'.'+(apos[1]+m.end(0)-m.begin(0)).to_s
|
2296
|
+
# if _tag_rem
|
2297
|
+
# _tag_rem.each {|value|
|
2298
|
+
# @text.tag_remove(value,_ibegin, _iend)
|
2299
|
+
# }
|
2300
|
+
# end
|
2301
|
+
# @text.tag_add(_tag,_ibegin, _iend)
|
2302
|
+
# if @is_tag_bold[_tag]
|
2303
|
+
# @is_line_bold[_r]=true
|
2304
|
+
# end
|
2305
|
+
#
|
2306
|
+
# if @op_only_first.include?(_tag) && _txt
|
2307
|
+
# #eliminino la prima riga a partire dal risultato
|
2308
|
+
# _p = _txt.index("\n")+1
|
2309
|
+
# if _p
|
2310
|
+
# _txt = _txt[_p..-1]
|
2311
|
+
# _offset = _offset + _p
|
2312
|
+
# else
|
2313
|
+
# m = nil
|
2314
|
+
# end
|
2315
|
+
# end
|
2316
|
+
# m = _re.match(_txt)
|
2317
|
+
#
|
2318
|
+
# else
|
2319
|
+
# m = nil
|
2320
|
+
# end
|
2321
|
+
# end
|
2322
|
+
# end
|
2190
2323
|
|
2191
|
-
apos = pos_to_index(_s_txt, _offset+m.begin(0))
|
2192
|
-
_offset = _offset + m.end(0)
|
2193
|
-
|
2194
|
-
|
2195
|
-
_old_txt = _txt
|
2196
|
-
_r = _row + apos[0]
|
2197
|
-
_ibegin = _r.to_s+'.'+apos[1].to_s
|
2198
|
-
_iend = _r.to_s+'.'+(apos[1]+m.end(0)-m.begin(0)).to_s
|
2199
|
-
if _tag_rem
|
2200
|
-
_tag_rem.each {|value|
|
2201
|
-
@text.tag_remove(value,_ibegin, _iend)
|
2202
|
-
}
|
2203
|
-
end
|
2204
|
-
@text.tag_add(_tag,_ibegin, _iend)
|
2205
|
-
if @is_tag_bold[_tag]
|
2206
|
-
@is_line_bold[_r]=true
|
2207
|
-
end
|
2208
2324
|
|
2209
|
-
|
2210
|
-
|
2211
|
-
|
2212
|
-
|
2213
|
-
|
2214
|
-
|
2215
|
-
|
2216
|
-
|
2217
|
-
|
2218
|
-
|
2219
|
-
|
2220
|
-
|
2221
|
-
|
2222
|
-
|
2223
|
-
|
2224
|
-
|
2225
|
-
|
2325
|
+
# def find_and_set_tag(_re, _row, _txt, _tag, _tag_rem = nil)
|
2326
|
+
# m = _re.match(_txt)
|
2327
|
+
# _end = 0
|
2328
|
+
# if m && @is_tag_bold[_tag]
|
2329
|
+
# @is_line_bold[_row]=true
|
2330
|
+
# end
|
2331
|
+
# #_old_txt = ''
|
2332
|
+
# while m && (_txt=m.post_match)
|
2333
|
+
# if !defined?(_old_txt) || _txt != _old_txt
|
2334
|
+
# _old_txt = _txt
|
2335
|
+
# _ibegin = _row.to_s+'.'+(m.begin(0)+_end).to_s
|
2336
|
+
# _end = m.end(0) + _end
|
2337
|
+
# _iend = _row.to_s+'.'+(_end.to_s)
|
2338
|
+
# if _tag_rem
|
2339
|
+
# _tag_rem.each {|value|
|
2340
|
+
# @text.tag_remove(value,_ibegin, _iend)
|
2341
|
+
# }
|
2342
|
+
# end
|
2343
|
+
# @text.tag_add(_tag,_ibegin, _iend)
|
2344
|
+
# if @op_only_first.include?(_tag)
|
2345
|
+
# m = nil
|
2346
|
+
# else
|
2347
|
+
# m = _re.match(_txt)
|
2348
|
+
# end
|
2349
|
+
# else
|
2350
|
+
# m = nil
|
2351
|
+
# end
|
2352
|
+
# end
|
2353
|
+
# end
|
2226
2354
|
|
2227
2355
|
|
2228
|
-
def
|
2229
|
-
|
2230
|
-
|
2231
|
-
|
2232
|
-
@
|
2233
|
-
end
|
2234
|
-
#_old_txt = ''
|
2235
|
-
while m && (_txt=m.post_match)
|
2236
|
-
if !defined?(_old_txt) || _txt != _old_txt
|
2237
|
-
_old_txt = _txt
|
2238
|
-
_ibegin = _row.to_s+'.'+(m.begin(0)+_end).to_s
|
2239
|
-
_end = m.end(0) + _end
|
2240
|
-
_iend = _row.to_s+'.'+(_end.to_s)
|
2241
|
-
if _tag_rem
|
2242
|
-
_tag_rem.each {|value|
|
2243
|
-
@text.tag_remove(value,_ibegin, _iend)
|
2244
|
-
}
|
2245
|
-
end
|
2246
|
-
@text.tag_add(_tag,_ibegin, _iend)
|
2247
|
-
if @op_only_first.include?(_tag)
|
2248
|
-
m = nil
|
2249
|
-
else
|
2250
|
-
m = _re.match(_txt)
|
2251
|
-
end
|
2252
|
-
else
|
2253
|
-
m = nil
|
2254
|
-
end
|
2356
|
+
def text_value_lines
|
2357
|
+
if String.method_defined?(:lines)
|
2358
|
+
return @text.value.lines
|
2359
|
+
else
|
2360
|
+
return @text.value
|
2255
2361
|
end
|
2256
2362
|
end
|
2257
2363
|
|
2258
2364
|
def show_spaces
|
2259
2365
|
@spaces_show = true
|
2260
2366
|
_row = 1
|
2261
|
-
|
2367
|
+
text_value_lines.each{|_line|
|
2262
2368
|
show_chars_line(_row, _line, /[ ^\t]\s*/, 'spaces')
|
2263
2369
|
_row = _row+1
|
2264
2370
|
}
|
@@ -2268,7 +2374,7 @@ class AgEditor
|
|
2268
2374
|
def show_tabs
|
2269
2375
|
@tabs_show = true
|
2270
2376
|
_row = 1
|
2271
|
-
|
2377
|
+
text_value_lines.each{|_line|
|
2272
2378
|
show_chars_line(_row, _line, /\t/, 'tabs')
|
2273
2379
|
_row = _row+1
|
2274
2380
|
}
|
@@ -2290,7 +2396,7 @@ class AgEditor
|
|
2290
2396
|
|
2291
2397
|
def indentation_space_2_tabs(_n_space=2)
|
2292
2398
|
_row = 1
|
2293
|
-
|
2399
|
+
text_value_lines.each{|_line|
|
2294
2400
|
m = /\s*/.match(_line)
|
2295
2401
|
_end = 0
|
2296
2402
|
if m && m.begin(0)==0
|
@@ -2310,7 +2416,7 @@ class AgEditor
|
|
2310
2416
|
|
2311
2417
|
def indentation_tabs_2_space(_n_space=2)
|
2312
2418
|
_row = 1
|
2313
|
-
|
2419
|
+
text_value_lines.each{|_line|
|
2314
2420
|
m = /\t*/.match(_line)
|
2315
2421
|
_end = 0
|
2316
2422
|
if m && m.begin(0)==0
|
@@ -2339,6 +2445,7 @@ class AgEditor
|
|
2339
2445
|
end
|
2340
2446
|
|
2341
2447
|
|
2448
|
+
# modify in this instance means the (...) in the tab header of each file
|
2342
2449
|
def modified?
|
2343
2450
|
return !(@buffer === text_value)
|
2344
2451
|
end
|
@@ -2372,98 +2479,16 @@ class AgEditor
|
|
2372
2479
|
end
|
2373
2480
|
end
|
2374
2481
|
|
2375
|
-
def highlightlines(_row, _lines, _check_mod = false)
|
2376
|
-
if _check_mod
|
2377
|
-
check_modify
|
2378
|
-
end
|
2379
|
-
_txt = _lines
|
2380
|
-
_end = 0
|
2381
|
-
|
2382
|
-
# @op_to_end_line.each{|c|
|
2383
|
-
# if @h_re[c]
|
2384
|
-
# m_c = @h_re[c].match(_txt)
|
2385
|
-
# if m_c then
|
2386
|
-
# _ibegin = _row.to_s+'.'+(m_c.begin(0)).to_s
|
2387
|
-
# _iend = _row.to_s+'.'+(_line.length - 1).to_s
|
2388
|
-
# @text.tag_add(c,_ibegin, _iend)
|
2389
|
-
# _txt = m_c.pre_match
|
2390
|
-
# end
|
2391
|
-
# end
|
2392
|
-
# } if @lang_hash['re_op.to_line_end']
|
2393
|
-
|
2394
|
-
arem = Array.new
|
2395
|
-
|
2396
|
-
|
2397
|
-
@h_classes.each{|c|
|
2398
|
-
if !@op_to_end_line.include?(c) && @h_re[c]
|
2399
|
-
find_and_set_tag_ml(@h_re[c], _row, _txt, c, arem)
|
2400
|
-
arem << c
|
2401
|
-
end
|
2402
|
-
} if _txt.strip.length > 0
|
2403
2482
|
|
2404
|
-
|
2405
|
-
find_and_set_tag_ml(/[ ^\t]\s*/, _row, _txt, 'spaces', arem) if @spaces_show
|
2406
|
-
end
|
2407
|
-
|
2408
|
-
|
2409
|
-
def highlightline(_row, _line, _check_mod = false)
|
2410
|
-
#p "highlightline #{_row} _line=#{_line}"
|
2411
|
-
if _check_mod
|
2412
|
-
check_modify
|
2413
|
-
end
|
2414
|
-
_txt = _line
|
2415
|
-
_end = 0
|
2416
|
-
|
2417
|
-
@op_to_end_line.each{|c|
|
2418
|
-
if @h_re[c]
|
2419
|
-
m_c = @h_re[c].match(_txt)
|
2420
|
-
if m_c then
|
2421
|
-
_ibegin = _row.to_s+'.'+(m_c.begin(0)).to_s
|
2422
|
-
_iend = _row.to_s+'.'+(_line.length - 1).to_s
|
2423
|
-
@text.tag_add(c,_ibegin, _iend)
|
2424
|
-
#p "tag_add found #{c}"
|
2425
|
-
_txt = m_c.pre_match
|
2426
|
-
end
|
2427
|
-
end
|
2428
|
-
} if @lang_hash['re_op.to_line_end']
|
2429
|
-
|
2430
|
-
arem = Array.new
|
2431
|
-
|
2432
|
-
|
2433
|
-
@h_classes.each{|c|
|
2434
|
-
if !@op_to_end_line.include?(c) && @h_re[c]
|
2435
|
-
find_and_set_tag(@h_re[c], _row, _txt, c, arem)
|
2436
|
-
arem << c
|
2437
|
-
end
|
2438
|
-
} if _txt.strip.length > 0
|
2439
|
-
|
2440
|
-
find_and_set_tag(/\t/, _row, _txt, 'tabs', arem) if @tabs_show
|
2441
|
-
find_and_set_tag(/[ ^\t]\s*/, _row, _txt, 'spaces', arem) if @spaces_show
|
2442
|
-
end
|
2443
|
-
|
2444
|
-
def rehighlightline(_row)
|
2445
|
-
_ibegin = _row.to_s+'.0'
|
2446
|
-
_iend = (_row+1).to_s+'.0'
|
2447
|
-
#p "rehighlightline _ibegin=#{_ibegin}"
|
2448
|
-
#p "rehighlightline _iend=#{_iend}"
|
2449
|
-
#p "_line = #{@text.get(_ibegin, _iend)}"
|
2450
|
-
@h_classes.each{|c| @text.tag_remove(c,_ibegin, _iend)}
|
2451
|
-
_line = @text.get(_ibegin, _iend)
|
2452
|
-
highlightline(_row, _line)
|
2453
|
-
end
|
2454
|
-
|
2455
|
-
def rehighlightlines(_row_begin, _row_end)
|
2483
|
+
def rehighlightlines(_row_begin, _row_end, _check_mod=false)
|
2456
2484
|
_ibegin = _row_begin.to_s+'.0'
|
2457
2485
|
_iend = (_row_end+1).to_s+'.0'
|
2458
|
-
@
|
2459
|
-
|
2460
|
-
highlightlines(_row_begin, _lines)
|
2486
|
+
@highlight_scanner.classes.each{|c| @text.tag_remove(c,_ibegin, _iend)}
|
2487
|
+
highlightlines(_row_begin, _row_end, _check_mod)
|
2461
2488
|
end
|
2462
2489
|
|
2463
|
-
|
2464
2490
|
def row(_index='insert')
|
2465
2491
|
_row = @text.index(_index).split('.')[0].to_i
|
2466
|
-
#print "def row(_index='insert')",_row.to_s,"\n"
|
2467
2492
|
return _row
|
2468
2493
|
end
|
2469
2494
|
|
@@ -2473,9 +2498,7 @@ class AgEditor
|
|
2473
2498
|
|
2474
2499
|
def do_line_update
|
2475
2500
|
#re num in @text_line_num the portion of visibled screen of @text
|
2476
|
-
#Arcadia.console(self, 'msg'=>"do_line_update loading ..")
|
2477
2501
|
return if @loading
|
2478
|
-
#Arcadia.console(self, 'msg'=>"do_line_update")
|
2479
2502
|
if @text_line_num
|
2480
2503
|
line_begin_index = @text.index('@0,0')
|
2481
2504
|
line_begin = line_begin_index.split('.')[0].to_i
|
@@ -2487,7 +2510,7 @@ class AgEditor
|
|
2487
2510
|
_zone_begin = ((line_begin) / @highlight_zone_length).to_i + 1
|
2488
2511
|
_zone_end = ((line_end) / @highlight_zone_length).to_i + 1
|
2489
2512
|
#Arcadia.new_msg(self, "for lines #{line_begin}..#{line_end} \n
|
2490
|
-
_zone_begin=#{_zone_begin} ; _zone_end=#{_zone_end}")
|
2513
|
+
#_zone_begin=#{_zone_begin} ; _zone_end=#{_zone_end}")
|
2491
2514
|
(_zone_begin >=@last_zone_begin)?_zone_begin.upto(_zone_end+1){|_zone|
|
2492
2515
|
highlight_zone(_zone)
|
2493
2516
|
}:_zone_end.downto(_zone_begin-1){|_zone|
|
@@ -2498,28 +2521,13 @@ class AgEditor
|
|
2498
2521
|
@last_zone_begin = _zone_begin
|
2499
2522
|
@last_zone_end = _zone_end
|
2500
2523
|
end
|
2501
|
-
|
2502
2524
|
@text_line_num.delete('1.0','end')
|
2525
|
+
|
2503
2526
|
|
2504
2527
|
_rx, _ry, _widht, _heigth = @text.bbox(line_begin_index);
|
2505
|
-
# _rx2, _ry2, _widht2, _heigth2 = @text.bbox(line_begin_index+" +1 lines");
|
2506
|
-
# if _rx2
|
2507
|
-
# _coef = _ry2-_ry-_heigth
|
2508
|
-
# end
|
2509
|
-
# if _ry < 0
|
2510
|
-
# nline = (line_begin + 1).to_s.rjust(line_end.to_s.length+2)
|
2511
|
-
# @text_line_num.tag_configure('start_case', 'spacing1'=>(_heigth+_ry))
|
2512
|
-
# @text_line_num.insert('end', "#{nline}\n",'normal_case','start_case')
|
2513
|
-
# real_line_begin = line_begin + 2
|
2514
|
-
# else
|
2515
|
-
# real_line_begin = line_begin
|
2516
|
-
# end
|
2517
2528
|
|
2518
2529
|
if _ry && _ry < 0
|
2519
2530
|
real_line_end = line_end + 1
|
2520
|
-
# x = (_heigth+_ry)/_heigth
|
2521
|
-
# @text_line_num.yview_scroll(-(_heigth+_ry),"pixels")
|
2522
|
-
|
2523
2531
|
else
|
2524
2532
|
real_line_end = line_end
|
2525
2533
|
end
|
@@ -2549,46 +2557,73 @@ class AgEditor
|
|
2549
2557
|
end
|
2550
2558
|
|
2551
2559
|
@text_line_num.insert(_index, "#{nline}\n",_tags)
|
2552
|
-
# if @highlighting && @is_line_bold[j]
|
2553
|
-
# @text_line_num.insert('end', "#{nline}\n",'bold_case')
|
2554
|
-
# else
|
2555
|
-
# @text_line_num.insert('end', "#{nline}\n",'normal_case')
|
2556
|
-
# end
|
2557
2560
|
if b.include?(j.to_s)
|
2558
2561
|
add_tag_breakpoint(j)
|
2559
|
-
#add_tag_breakpoint(_index)
|
2560
|
-
#p "aggiungo tag break on line #{j} on index ->#{_index}"
|
2561
|
-
#add_tag_breakpoint(_index+' -1 lines')
|
2562
2562
|
end
|
2563
2563
|
end
|
2564
2564
|
if _ry && _ry < 0
|
2565
|
-
|
2566
|
-
#Arcadia.console(self, 'msg'=>"_coef -> #{_coef}")
|
2567
|
-
|
2568
|
-
# @text_line_num.yview_scroll((_heigth+_ry),"pixels")
|
2569
|
-
# @text_line_num.yview_scroll((-_ry+3),"pixels")
|
2570
|
-
@text_line_num.yview_scroll(_ry.abs+3,"pixels")
|
2565
|
+
@text_line_num.yview_scroll(_ry.abs+2,"pixels")
|
2571
2566
|
end
|
2572
2567
|
end
|
2568
|
+
refresh_outline if Tk.focus==@text
|
2569
|
+
# if TkWinfo.mapped?(@text_line_num)
|
2570
|
+
# x,y,w,h = @text.bbox("#{(line_end).to_s}.3");
|
2571
|
+
# @fm1.splitter_frame.go(w,0)
|
2572
|
+
# @fm1.do_resize
|
2573
|
+
# end
|
2573
2574
|
end
|
2574
2575
|
|
2575
|
-
def
|
2576
|
-
if
|
2577
|
-
|
2578
|
-
|
2579
|
-
|
2580
|
-
|
2576
|
+
def highlightlines(_row_begin, _row_end, _check_mod = false)
|
2577
|
+
if _check_mod
|
2578
|
+
check_modify
|
2579
|
+
end
|
2580
|
+
#_row_begin = _row_begin+1
|
2581
|
+
_ibegin = _row_begin.to_s+'.0'
|
2582
|
+
_iend = (_row_end+1).to_s+'.0'
|
2583
|
+
@highlight_scanner.classes.each{|c| @text.tag_remove(c,_ibegin, _iend)}
|
2584
|
+
_lines = @text.get(_ibegin, _iend)
|
2585
|
+
tags_map = @highlight_scanner.highlight_tags(_row_begin,_lines)
|
2586
|
+
tags_map.each do |key,value|
|
2587
|
+
to_tag = Array.new
|
2588
|
+
value.each{|ite|
|
2589
|
+
to_tag.concat(ite)
|
2590
|
+
if @is_tag_bold[key.to_s]
|
2591
|
+
if ite.length==2
|
2592
|
+
row_begin = ite[0].split('.')[0].to_i
|
2593
|
+
row_end = ite[1].split('.')[0].to_i
|
2594
|
+
for row in row_begin..row_end
|
2595
|
+
@is_line_bold[row]=true
|
2596
|
+
end
|
2597
|
+
end
|
2598
|
+
# ite.each{|p|
|
2599
|
+
# row_begin = p[0].split('.')[0].to_i
|
2600
|
+
# row_end = p[1].split('.')[0].to_i
|
2601
|
+
# for row in row_begin...row_end
|
2602
|
+
# @is_line_bold[row]=true
|
2603
|
+
# end
|
2604
|
+
# }
|
2605
|
+
end
|
2606
|
+
}
|
2607
|
+
@text.tag_adds(key.to_s,to_tag)
|
2608
|
+
end
|
2609
|
+
if @tabs_show || @spaces_show
|
2610
|
+
if !defined?(@rescanner)
|
2611
|
+
if @lang_hash['scanner']!='re'
|
2612
|
+
@rescanner = ReHighlightScanner.new(@lang_hash) if !defined?(@rescanner)
|
2613
|
+
else
|
2614
|
+
@rescanner = @highlight_scanner
|
2615
|
+
end
|
2616
|
+
end
|
2617
|
+
@rescanner.highlight_tags(_row_begin,_lines,['tabs']) if @tabs_show
|
2618
|
+
@rescanner.highlight_tags(_row_begin,_lines,['spaces']) if @spaces_show
|
2581
2619
|
end
|
2582
2620
|
end
|
2583
2621
|
|
2584
|
-
|
2585
2622
|
def highlight_zone(_zone, _force_highlight=false)
|
2586
2623
|
if !@highlight_zone[_zone] || _force_highlight
|
2587
|
-
_b = @highlight_zone_length*(_zone - 1)
|
2624
|
+
_b = @highlight_zone_length*(_zone - 1) +1
|
2588
2625
|
_e = @highlight_zone_length*(_zone) #+ 1
|
2589
|
-
|
2590
|
-
rehighlightline(j)
|
2591
|
-
end
|
2626
|
+
rehighlightlines(_b,_e)
|
2592
2627
|
@highlight_zone[_zone] = true
|
2593
2628
|
end
|
2594
2629
|
end
|
@@ -2621,7 +2656,8 @@ class AgEditor
|
|
2621
2656
|
_iend = _row+'.'+(line.length - 1).to_s
|
2622
2657
|
@text.tag_add('comment',_ibegin, _iend)
|
2623
2658
|
else
|
2624
|
-
highlightline(_row.to_i, line, false)
|
2659
|
+
#highlightline(_row.to_i, line, false)
|
2660
|
+
highlightlines(_row.to_i, _row.to_i, false)
|
2625
2661
|
end
|
2626
2662
|
end
|
2627
2663
|
_row = (_row.to_i + 1).to_s
|
@@ -2634,21 +2670,31 @@ class AgEditor
|
|
2634
2670
|
@text.edit_reset
|
2635
2671
|
end
|
2636
2672
|
end
|
2637
|
-
|
2638
|
-
|
2673
|
+
|
2674
|
+
|
2675
|
+
def save ignore_read_only = false
|
2639
2676
|
if !@file
|
2640
2677
|
save_as
|
2641
|
-
elsif @read_only
|
2642
|
-
Arcadia.dialog(self,
|
2643
|
-
|
2644
|
-
|
2645
|
-
|
2646
|
-
|
2678
|
+
elsif @read_only && !ignore_read_only
|
2679
|
+
r=Arcadia.dialog(self,
|
2680
|
+
'type' => 'yes_no_cancel',
|
2681
|
+
'title' =>"#{@file}:read-only",
|
2682
|
+
'msg' =>"The file : #{@file} is read-only! -- save anyway?",
|
2683
|
+
'level' =>'warning')
|
2684
|
+
if r=="yes"
|
2685
|
+
save true
|
2686
|
+
end
|
2647
2687
|
else
|
2648
|
-
f = File.new(@file, "
|
2688
|
+
f = File.new(@file, "wb")
|
2649
2689
|
begin
|
2650
2690
|
if f
|
2651
|
-
|
2691
|
+
to_write = text_value
|
2692
|
+
if @dos_line_endings
|
2693
|
+
# we stripped these out, previously...
|
2694
|
+
# for now assume they want them all this way, no mixing and matching...
|
2695
|
+
to_write = to_write.gsub("\n", "\r\n")
|
2696
|
+
end
|
2697
|
+
f.syswrite(to_write)
|
2652
2698
|
@buffer = text_value
|
2653
2699
|
reset_modify
|
2654
2700
|
end
|
@@ -2660,15 +2706,24 @@ class AgEditor
|
|
2660
2706
|
end
|
2661
2707
|
|
2662
2708
|
def save_as
|
2663
|
-
|
2664
|
-
|
2665
|
-
if
|
2709
|
+
file = Tk.getSaveFile("filetypes"=>[["Ruby Files", [".rb", ".rbw"]],["All Files", [".*"]]])
|
2710
|
+
file = nil if file == "" # cancelled
|
2711
|
+
if file
|
2712
|
+
new_file_name(file)
|
2666
2713
|
save
|
2667
|
-
@controller.change_file_name(@page_frame,
|
2714
|
+
@controller.change_file_name(@page_frame, file)
|
2668
2715
|
#EditorContract.instance.file_created(self, 'file'=>@file)
|
2669
2716
|
end
|
2670
2717
|
end
|
2671
2718
|
|
2719
|
+
def new_file_name(_new_file)
|
2720
|
+
@file =_new_file
|
2721
|
+
base_name= File.basename(_new_file)
|
2722
|
+
if base_name.include?('.')
|
2723
|
+
self.change_highlight(base_name.split('.')[-1])
|
2724
|
+
end
|
2725
|
+
end
|
2726
|
+
|
2672
2727
|
def check_modify
|
2673
2728
|
return if @loading
|
2674
2729
|
if modified?
|
@@ -2679,54 +2734,50 @@ class AgEditor
|
|
2679
2734
|
end
|
2680
2735
|
|
2681
2736
|
def check_file_last_access_time
|
2682
|
-
if @file
|
2683
|
-
|
2684
|
-
|
2685
|
-
|
2686
|
-
|
2737
|
+
if @file
|
2738
|
+
file_exist = File.exist?(@file)
|
2739
|
+
if @file_last_access_time && file_exist
|
2740
|
+
ftime = File.mtime(@file)
|
2741
|
+
if @file_last_access_time != ftime
|
2742
|
+
msg = 'File "'+@file+'" is changed! Reload?'
|
2687
2743
|
if Tk.messageBox('icon' => 'error', 'type' => 'yesno',
|
2688
2744
|
'title' => '(Arcadia) Libs', 'parent' => @text,
|
2689
2745
|
'message' => msg) == 'yes'
|
2690
|
-
|
2691
|
-
|
2692
|
-
load_file(@file)
|
2746
|
+
reload
|
2747
|
+
|
2693
2748
|
else
|
2694
2749
|
@file_last_access_time = ftime
|
2695
2750
|
end
|
2751
|
+
end
|
2752
|
+
elsif !file_exist
|
2753
|
+
msg = 'Appears that file "'+@file+'" was deleted by other process! Do you want to resave it?'
|
2754
|
+
if Tk.messageBox('icon' => 'error', 'type' => 'yesno',
|
2755
|
+
'title' => '(Arcadia) editor', 'parent' => @text,
|
2756
|
+
'message' => msg) == 'yes'
|
2757
|
+
save
|
2758
|
+
else
|
2759
|
+
@file = nil
|
2760
|
+
@buffer = ''
|
2761
|
+
set_modify
|
2762
|
+
end
|
2696
2763
|
end
|
2697
2764
|
end
|
2698
2765
|
end
|
2699
2766
|
|
2700
|
-
def
|
2701
|
-
|
2702
|
-
|
2703
|
-
if
|
2704
|
-
|
2705
|
-
|
2706
|
-
|
2707
|
-
@@langs_hash[_ext] = properties_file2hash(lang_file)
|
2708
|
-
elsif File.exist?(lang_file+'.bind')
|
2709
|
-
b= properties_file2hash(lang_file+'.bind')
|
2710
|
-
if b
|
2711
|
-
if @@langs_hash[b['bind']].nil?
|
2712
|
-
lang_file_bind = File.dirname(__FILE__)+'/langs/'+b['bind']+".lang"
|
2713
|
-
if File.exist?(lang_file_bind)
|
2714
|
-
@@langs_hash[b['bind']]=properties_file2hash(lang_file_bind)
|
2715
|
-
@@langs_hash[_ext]=@@langs_hash[b['bind']]
|
2716
|
-
end
|
2717
|
-
else
|
2718
|
-
@@langs_hash[_ext]=@@langs_hash[b['bind']]
|
2719
|
-
end
|
2720
|
-
end
|
2721
|
-
end
|
2722
|
-
self.resolve_properties_link(@@langs_hash[_ext], Arcadia.instance['conf']) if @@langs_hash[_ext]
|
2723
|
-
end
|
2724
|
-
@@langs_hash[_ext]
|
2767
|
+
def reload
|
2768
|
+
pos_index = @text.index('insert')
|
2769
|
+
@text.delete('1.0','end')
|
2770
|
+
reset_highlight if @highlighting
|
2771
|
+
load_file(@file)
|
2772
|
+
@text.see(pos_index)
|
2773
|
+
@text.set_insert(pos_index)
|
2725
2774
|
end
|
2726
2775
|
|
2727
2776
|
def init_editing(_ext='rb', _w1=150, _w2=60)
|
2728
|
-
@is_ruby = _ext=='rb'||_ext=='rbw'
|
2729
|
-
@
|
2777
|
+
@is_ruby = _ext=='rb'|| _ext=='rbw'
|
2778
|
+
@classbrowsing = @is_ruby
|
2779
|
+
@lang_hash = @controller.languages_hash(_ext)
|
2780
|
+
# @highlight_scanner = @controller.highlight_scanner(_ext)
|
2730
2781
|
# if !_ext.nil? && @is_ruby
|
2731
2782
|
# @fm = AGTkVSplittedFrames.new(@page_frame,_w1)
|
2732
2783
|
# @fm1 = AGTkVSplittedFrames.new(@fm.right_frame,_w2)
|
@@ -2738,22 +2789,27 @@ class AgEditor
|
|
2738
2789
|
@fm1 = AGTkVSplittedFrames.new(@page_frame,@page_frame,_w2)
|
2739
2790
|
@fm1.splitter_frame.configure('relief'=>'flat')
|
2740
2791
|
initialize_text(@fm1.right_frame)
|
2741
|
-
initialize_highlight
|
2792
|
+
initialize_highlight(_ext)
|
2742
2793
|
initialize_line_number(@fm1.left_frame)
|
2743
2794
|
initialize_text_binding
|
2744
2795
|
end
|
2745
2796
|
|
2746
2797
|
def show_outline
|
2747
|
-
if @
|
2748
|
-
@
|
2798
|
+
if @outline
|
2799
|
+
@outline.show
|
2749
2800
|
else
|
2750
|
-
|
2751
|
-
build_tree
|
2801
|
+
@outline=AgEditorOutline.new(self,@controller.frame(1).hinner_frame,@controller.outline_bar)
|
2802
|
+
@outline.build_tree
|
2752
2803
|
end
|
2753
2804
|
end
|
2754
2805
|
|
2755
2806
|
def hide_outline
|
2756
|
-
@
|
2807
|
+
@outline.hide if @outline
|
2808
|
+
end
|
2809
|
+
|
2810
|
+
def destroy_outline
|
2811
|
+
@outline.destroy if @outline
|
2812
|
+
@outline = nil
|
2757
2813
|
end
|
2758
2814
|
|
2759
2815
|
def file_extension(_filename=nil)
|
@@ -2766,14 +2822,18 @@ class AgEditor
|
|
2766
2822
|
def load_file(_filename = nil)
|
2767
2823
|
#if filename is nil then open a new tab
|
2768
2824
|
@loading=true
|
2825
|
+
@dos_line_endings=false
|
2769
2826
|
begin
|
2770
2827
|
@file = _filename
|
2771
2828
|
if _filename
|
2772
2829
|
#init_editing(file_extension(_filename))
|
2773
|
-
File::open(_filename,'
|
2774
|
-
@text.insert('end',file.readlines.collect!{| line | line.chomp
|
2830
|
+
File::open(_filename,'rb'){ |file|
|
2831
|
+
@text.insert('end',file.readlines.collect!{| line | line.chomp}.join("\n"))
|
2775
2832
|
#@text.insert('end',file.read)
|
2776
2833
|
}
|
2834
|
+
File.open(_filename, 'rb') { |file|
|
2835
|
+
@dos_line_endings=true if file.read.include?("\r\n") # pesky windows line endings
|
2836
|
+
}
|
2777
2837
|
end
|
2778
2838
|
set_read_only(!File.stat(_filename).writable?)
|
2779
2839
|
reset
|
@@ -2803,7 +2863,7 @@ class AgEditor
|
|
2803
2863
|
end
|
2804
2864
|
|
2805
2865
|
def refresh
|
2806
|
-
build_tree if @classbrowsing #&& !is_exp_hide?
|
2866
|
+
@outline.build_tree if @outline && @classbrowsing #&& !is_exp_hide?
|
2807
2867
|
end
|
2808
2868
|
end
|
2809
2869
|
|
@@ -2821,15 +2881,179 @@ class AgMultiEditorView
|
|
2821
2881
|
font Arcadia.conf('editor.tabs.font')
|
2822
2882
|
pack('fill'=>'both', :padx=>0, :pady=>0, :expand => 'yes')
|
2823
2883
|
}
|
2884
|
+
refresh_after_map = proc{
|
2885
|
+
if !@enb.pages.empty?
|
2886
|
+
if @enb.raise.nil? || @enb.raise.strip.length == 0
|
2887
|
+
@enb.raise(@enb.pages[0])
|
2888
|
+
@enb.see(@enb.pages[0])
|
2889
|
+
end
|
2890
|
+
end
|
2891
|
+
}
|
2892
|
+
@enb.bind_append("Map",refresh_after_map)
|
2893
|
+
|
2894
|
+
end
|
2895
|
+
|
2896
|
+
end
|
2897
|
+
|
2898
|
+
class HighlightScanner
|
2899
|
+
|
2900
|
+
def initialize(_langs_conf)
|
2901
|
+
@langs_conf = _langs_conf
|
2902
|
+
@lang=@langs_conf['language'].to_sym if @langs_conf['language']
|
2903
|
+
end
|
2904
|
+
|
2905
|
+
def highlight_tags(_row_begin,_code)
|
2906
|
+
end
|
2907
|
+
|
2908
|
+
def classes
|
2909
|
+
if !defined?(@h_classes)
|
2910
|
+
@h_classes = @langs_conf["#{@langs_conf['scanner']}.classes"].split(',')
|
2911
|
+
end
|
2912
|
+
@h_classes
|
2913
|
+
end
|
2914
|
+
end
|
2915
|
+
|
2916
|
+
class ReHighlightScanner < HighlightScanner
|
2917
|
+
def initialize(_langs_conf)
|
2918
|
+
super(_langs_conf)
|
2919
|
+
@h_re = Hash.new
|
2920
|
+
@op_to_end_line = Array.new
|
2921
|
+
@op_to_end_line.concat(@langs_conf['re_op.to_line_end'].split(',')) if @langs_conf['re_op.to_line_end']
|
2922
|
+
|
2923
|
+
@op_only_first = Array.new
|
2924
|
+
@op_only_first.concat(@langs_conf['re_op.only_first'].split(',')) if @langs_conf['re_op.only_first']
|
2925
|
+
|
2926
|
+
self.classes.each{|c|
|
2927
|
+
@h_re[c]=Regexp::new(@langs_conf["re.#{c}"].strip) if @langs_conf["re.#{c}"]
|
2928
|
+
}
|
2929
|
+
end
|
2930
|
+
|
2931
|
+
|
2932
|
+
def find_tag(_tag, _row, _txt)
|
2933
|
+
to_ret = []
|
2934
|
+
_re = @h_re[_tag]
|
2935
|
+
m = _re.match(_txt)
|
2936
|
+
_end = 0
|
2937
|
+
while m && (_txt=m.post_match)
|
2938
|
+
if !defined?(_old_txt) || _txt != _old_txt
|
2939
|
+
_old_txt = _txt
|
2940
|
+
_ibegin = _row.to_s+'.'+(m.begin(0)+_end).to_s
|
2941
|
+
_end = m.end(0) + _end
|
2942
|
+
_iend = _row.to_s+'.'+(_end.to_s)
|
2943
|
+
to_ret << [_ibegin, _iend]
|
2944
|
+
if @op_only_first.include?(_tag)
|
2945
|
+
m = nil
|
2946
|
+
else
|
2947
|
+
m = _re.match(_txt)
|
2948
|
+
end
|
2949
|
+
else
|
2950
|
+
m = nil
|
2951
|
+
end
|
2952
|
+
end
|
2953
|
+
to_ret
|
2954
|
+
end
|
2955
|
+
|
2956
|
+
def highlight_tags(_row_begin,_code,_classes=self.classes)
|
2957
|
+
super(_row_begin,_code)
|
2958
|
+
tags_map = Hash.new
|
2959
|
+
lines = _code.split("\n")
|
2960
|
+
lines.each_with_index{|_line,_i|
|
2961
|
+
_line+="\n"
|
2962
|
+
_row = _row_begin+_i
|
2963
|
+
#p "_row=#{_row}-_line=#{_line}"
|
2964
|
+
_txt = _line
|
2965
|
+
_end = 0
|
2966
|
+
@op_to_end_line.each{|c|
|
2967
|
+
if _classes.include?(c) && @h_re[c]
|
2968
|
+
m_c = @h_re[c].match(_txt)
|
2969
|
+
if m_c then
|
2970
|
+
_ibegin = _row.to_s+'.'+(m_c.begin(0)).to_s
|
2971
|
+
_iend = _row.to_s+'.'+(_line.length - 1).to_s
|
2972
|
+
tags_map[c] = [] if tags_map[c].nil?
|
2973
|
+
tags_map[c] << [_ibegin, _iend]
|
2974
|
+
_txt = m_c.pre_match
|
2975
|
+
end
|
2976
|
+
end
|
2977
|
+
} if @langs_conf['re_op.to_line_end']
|
2978
|
+
|
2979
|
+
_classes.each{|c|
|
2980
|
+
if !@op_to_end_line.include?(c) && @h_re[c]
|
2981
|
+
_tags = find_tag(c, _row, _txt)
|
2982
|
+
if _tags.length >0
|
2983
|
+
tags_map[c] = [] if tags_map[c].nil?
|
2984
|
+
tags_map[c].concat(_tags)
|
2985
|
+
end
|
2986
|
+
end
|
2987
|
+
} if _txt.strip.length > 0
|
2988
|
+
}
|
2989
|
+
tags_map
|
2824
2990
|
end
|
2991
|
+
end
|
2825
2992
|
|
2993
|
+
class CoderayHighlightScanner < HighlightScanner
|
2994
|
+
def initialize(_langs_conf)
|
2995
|
+
super(_langs_conf)
|
2996
|
+
require 'coderay'
|
2997
|
+
end
|
2998
|
+
# def highlight_tags(_row_begin,_code)
|
2999
|
+
# super(_row_begin,_code)
|
3000
|
+
# case @lang
|
3001
|
+
# when :ruby
|
3002
|
+
# _highlight_tags_ruby(_row_begin,_code)
|
3003
|
+
# end
|
3004
|
+
# end
|
3005
|
+
def highlight_tags(_row_begin,_code)
|
3006
|
+
super(_row_begin,_code)
|
3007
|
+
c_scanner = CodeRay::Scanners[@lang].new _code
|
3008
|
+
row=_row_begin
|
3009
|
+
col=0
|
3010
|
+
tags_map = Hash.new
|
3011
|
+
c_scanner.tokens.each{|tok|
|
3012
|
+
#p tok
|
3013
|
+
if tok[1]==:space && tok[0].include?("\n")
|
3014
|
+
row+=tok[0].count("\n")
|
3015
|
+
begin_gap = tok[0].split("\n")[-1]
|
3016
|
+
if begin_gap && tok[0][-1..-1]!="\n"
|
3017
|
+
col = begin_gap.length
|
3018
|
+
else
|
3019
|
+
col = 0
|
3020
|
+
end
|
3021
|
+
elsif !([:open,:close].include?(tok[0])&& tok[1].class==Symbol)
|
3022
|
+
toklength = tok[0].length
|
3023
|
+
t_begin="#{row}.#{col}"
|
3024
|
+
if tok[0].include?("\n")
|
3025
|
+
ar = tok[0].split
|
3026
|
+
row+=tok[0].count("\n")
|
3027
|
+
|
3028
|
+
begin_gap = ar[-1]
|
3029
|
+
if begin_gap && tok[0][-1..-1]!="\n"
|
3030
|
+
col = begin_gap.length
|
3031
|
+
else
|
3032
|
+
col = 0
|
3033
|
+
end
|
3034
|
+
else
|
3035
|
+
col+=toklength
|
3036
|
+
end
|
3037
|
+
t_end="#{row}.#{col}"
|
3038
|
+
if tok[1]!=:space
|
3039
|
+
tags_map[tok[1]] = [] if tags_map[tok[1]].nil?
|
3040
|
+
tags_map[tok[1]] << [t_begin,t_end]
|
3041
|
+
#Arcadia.console(self, 'msg'=>"#{tok[1]}=#{[t_begin,t_end]}", 'level'=>'error')
|
3042
|
+
#p [t_begin,t_end]
|
3043
|
+
end
|
3044
|
+
end
|
3045
|
+
}
|
3046
|
+
tags_map
|
3047
|
+
end
|
2826
3048
|
end
|
2827
3049
|
|
2828
3050
|
|
2829
3051
|
class AgMultiEditor < ArcadiaExt
|
2830
3052
|
include Autils
|
3053
|
+
include Configurable
|
2831
3054
|
attr_reader :breakpoints
|
2832
3055
|
attr_reader :splitted_frame
|
3056
|
+
attr_reader :outline_bar
|
2833
3057
|
def on_before_build(_event)
|
2834
3058
|
@breakpoints =Array.new
|
2835
3059
|
@tabs_file =Hash.new
|
@@ -2837,7 +3061,8 @@ class AgMultiEditor < ArcadiaExt
|
|
2837
3061
|
Arcadia.attach_listener(self, BufferEvent)
|
2838
3062
|
Arcadia.attach_listener(self, DebugEvent)
|
2839
3063
|
Arcadia.attach_listener(self, RunRubyFileEvent)
|
2840
|
-
|
3064
|
+
# Arcadia.attach_listener(self, StartDebugEvent)
|
3065
|
+
Arcadia.attach_listener(self, FocusEvent)
|
2841
3066
|
end
|
2842
3067
|
|
2843
3068
|
|
@@ -2856,18 +3081,20 @@ class AgMultiEditor < ArcadiaExt
|
|
2856
3081
|
end
|
2857
3082
|
end
|
2858
3083
|
|
2859
|
-
def on_before_start_debug(_event)
|
2860
|
-
_filename = _event.file
|
2861
|
-
if _filename.nil?
|
2862
|
-
current_editor = self.raised
|
2863
|
-
_event.file =current_editor.file if current_editor
|
2864
|
-
end
|
2865
|
-
end
|
3084
|
+
# def on_before_start_debug(_event)
|
3085
|
+
# _filename = _event.file
|
3086
|
+
# if _filename.nil?
|
3087
|
+
# current_editor = self.raised
|
3088
|
+
# _event.file =current_editor.file if current_editor
|
3089
|
+
# end
|
3090
|
+
# end
|
2866
3091
|
|
2867
3092
|
def on_build(_event)
|
2868
3093
|
@main_frame = AgMultiEditorView.new(self.frame.hinner_frame)
|
2869
|
-
|
3094
|
+
@outline_bar = AgEditorOutlineToolbar.new(self.frame(1).hinner_frame, self)
|
3095
|
+
create_find # this is the "find within current file" one
|
2870
3096
|
pop_up_menu
|
3097
|
+
|
2871
3098
|
#self.open_last_files
|
2872
3099
|
end
|
2873
3100
|
|
@@ -2875,6 +3102,86 @@ class AgMultiEditor < ArcadiaExt
|
|
2875
3102
|
self.open_last_files
|
2876
3103
|
end
|
2877
3104
|
|
3105
|
+
def on_exit_query(_event)
|
3106
|
+
_event.can_exit=true
|
3107
|
+
@tabs_editor.each_value{|editor|
|
3108
|
+
_event.can_exit = can_close_editor?(editor)
|
3109
|
+
if !_event.can_exit
|
3110
|
+
_event.break
|
3111
|
+
break
|
3112
|
+
end
|
3113
|
+
}
|
3114
|
+
end
|
3115
|
+
|
3116
|
+
def on_after_focus(_event)
|
3117
|
+
if raised && _event.focus_widget == raised.text
|
3118
|
+
if [CutTextEvent, PasteTextEvent].include?(_event.class)
|
3119
|
+
if raised.highlighting
|
3120
|
+
line_begin_index = raised.text.index('@0,0')
|
3121
|
+
line_begin = line_begin_index.split('.')[0].to_i
|
3122
|
+
line_end = raised.text.index('@0,'+TkWinfo.height(raised.text).to_s).split('.')[0].to_i + 1
|
3123
|
+
raised.rehighlightlines(line_begin,line_end,true)
|
3124
|
+
else
|
3125
|
+
raised.check_modify
|
3126
|
+
end
|
3127
|
+
end
|
3128
|
+
end
|
3129
|
+
end
|
3130
|
+
|
3131
|
+
def highlight_scanner(_ext=nil)
|
3132
|
+
return nil if _ext.nil?
|
3133
|
+
scanner = nil
|
3134
|
+
@highlight_scanner_hash = Hash.new if !defined?(@highlight_scanner_hash)
|
3135
|
+
lh = languages_hash(_ext)
|
3136
|
+
if lh && lh['language'] && lh['scanner']
|
3137
|
+
if @highlight_scanner_hash[lh['language']].nil?
|
3138
|
+
case lh['scanner']
|
3139
|
+
when 'coderay'
|
3140
|
+
@highlight_scanner_hash[lh['language']]=CoderayHighlightScanner.new(lh)
|
3141
|
+
when 're'
|
3142
|
+
@highlight_scanner_hash[lh['language']]=ReHighlightScanner.new(lh)
|
3143
|
+
end
|
3144
|
+
end
|
3145
|
+
scanner = @highlight_scanner_hash[lh['language']]
|
3146
|
+
end
|
3147
|
+
scanner
|
3148
|
+
end
|
3149
|
+
|
3150
|
+
def languages_hash(_ext=nil)
|
3151
|
+
@@langs_hash = Hash.new if !defined?(@@langs_hash)
|
3152
|
+
return nil if _ext.nil?
|
3153
|
+
if @@langs_hash[_ext].nil?
|
3154
|
+
#_ext='' if _ext.nil?
|
3155
|
+
lang_file = File.dirname(__FILE__)+'/langs/'+_ext+'.lang'
|
3156
|
+
if File.exist?(lang_file)
|
3157
|
+
@@langs_hash[_ext] = properties_file2hash(lang_file)
|
3158
|
+
elsif File.exist?(lang_file+'.bind')
|
3159
|
+
b= properties_file2hash(lang_file+'.bind')
|
3160
|
+
if b
|
3161
|
+
if @@langs_hash[b['bind']].nil?
|
3162
|
+
lang_file_bind = File.dirname(__FILE__)+'/langs/'+b['bind']+".lang"
|
3163
|
+
if File.exist?(lang_file_bind)
|
3164
|
+
@@langs_hash[b['bind']]=properties_file2hash(lang_file_bind)
|
3165
|
+
@@langs_hash[_ext]=@@langs_hash[b['bind']]
|
3166
|
+
end
|
3167
|
+
else
|
3168
|
+
@@langs_hash[_ext]=@@langs_hash[b['bind']]
|
3169
|
+
end
|
3170
|
+
end
|
3171
|
+
end
|
3172
|
+
if @@langs_hash[_ext] && @@langs_hash[_ext]['@include'] != nil
|
3173
|
+
include_file = "#{File.dirname(__FILE__)}/langs/#{@@langs_hash[_ext]['@include']}"
|
3174
|
+
if File.exist?(include_file)
|
3175
|
+
include_hash = properties_file2hash(include_file)
|
3176
|
+
@@langs_hash[_ext] = include_hash.merge(@@langs_hash[_ext])
|
3177
|
+
end
|
3178
|
+
end
|
3179
|
+
self.resolve_properties_link(@@langs_hash[_ext], Arcadia.instance['conf']) if @@langs_hash[_ext]
|
3180
|
+
end
|
3181
|
+
@@langs_hash[_ext]
|
3182
|
+
end
|
3183
|
+
|
3184
|
+
|
2878
3185
|
def pop_up_menu
|
2879
3186
|
@pop_up = TkMenu.new(
|
2880
3187
|
:parent=>@main_frame.enb,
|
@@ -2883,14 +3190,7 @@ class AgMultiEditor < ArcadiaExt
|
|
2883
3190
|
)
|
2884
3191
|
@pop_up.configure(Arcadia.style('menu'))
|
2885
3192
|
#Arcadia.instance.main_menu.update_style(@pop_up)
|
2886
|
-
|
2887
|
-
:command,
|
2888
|
-
:label=>'...',
|
2889
|
-
:state=>'disabled',
|
2890
|
-
:background=>Arcadia.conf('titlelabel.background'),
|
2891
|
-
:font => "#{Arcadia.conf('menu.font')} bold",
|
2892
|
-
:hidemargin => true
|
2893
|
-
)
|
3193
|
+
|
2894
3194
|
|
2895
3195
|
@c = @pop_up.insert('end',
|
2896
3196
|
:command,
|
@@ -2929,6 +3229,15 @@ class AgMultiEditor < ArcadiaExt
|
|
2929
3229
|
}
|
2930
3230
|
)
|
2931
3231
|
|
3232
|
+
@pop_up.insert('end',
|
3233
|
+
:command,
|
3234
|
+
:label=>'...',
|
3235
|
+
:state=>'disabled',
|
3236
|
+
:background=>Arcadia.conf('titlelabel.background'),
|
3237
|
+
:font => "#{Arcadia.conf('menu.font')} bold",
|
3238
|
+
:hidemargin => false
|
3239
|
+
)
|
3240
|
+
|
2932
3241
|
@main_frame.enb.tabbind("Button-3",
|
2933
3242
|
proc{|*x|
|
2934
3243
|
_x = TkWinfo.pointerx(@main_frame.enb)
|
@@ -2939,10 +3248,11 @@ class AgMultiEditor < ArcadiaExt
|
|
2939
3248
|
@selected_tab_name_from_popup = 'ff'+@selected_tab_name_from_popup
|
2940
3249
|
_index = @main_frame.enb.index(@selected_tab_name_from_popup)
|
2941
3250
|
end
|
3251
|
+
|
2942
3252
|
if _index != -1
|
2943
|
-
_file =
|
2944
|
-
@pop_up.entryconfigure(
|
2945
|
-
@pop_up.popup(_x,_y)
|
3253
|
+
_file = @tabs_file[(@selected_tab_name_from_popup)] # full path of file
|
3254
|
+
@pop_up.entryconfigure(3, 'label'=> _file)
|
3255
|
+
@pop_up.popup(_x,_y+10)
|
2946
3256
|
end
|
2947
3257
|
})
|
2948
3258
|
end
|
@@ -2968,7 +3278,15 @@ class AgMultiEditor < ArcadiaExt
|
|
2968
3278
|
end
|
2969
3279
|
|
2970
3280
|
def on_before_debug(_event)
|
3281
|
+
"on_before_debug #{_event}"
|
2971
3282
|
case _event
|
3283
|
+
when StartDebugEvent
|
3284
|
+
_filename = _event.file
|
3285
|
+
if _filename.nil?
|
3286
|
+
current_editor = self.raised
|
3287
|
+
_event.file=current_editor.file if current_editor
|
3288
|
+
end
|
3289
|
+
self.debug_begin
|
2972
3290
|
when SetBreakpointEvent
|
2973
3291
|
if _event.active == 1
|
2974
3292
|
@breakpoints << {:file=>_event.file,:line=>_event.row}
|
@@ -2988,9 +3306,8 @@ class AgMultiEditor < ArcadiaExt
|
|
2988
3306
|
end
|
2989
3307
|
|
2990
3308
|
def on_after_debug(_event)
|
3309
|
+
"on_after_debug #{_event}"
|
2991
3310
|
case _event
|
2992
|
-
when StartDebugEvent
|
2993
|
-
self.debug_begin
|
2994
3311
|
when StepDebugEvent
|
2995
3312
|
if _event.command == :quit_yes
|
2996
3313
|
self.debug_end
|
@@ -3031,7 +3348,7 @@ class AgMultiEditor < ArcadiaExt
|
|
3031
3348
|
when NewBufferEvent
|
3032
3349
|
self.open_buffer
|
3033
3350
|
when OpenBufferEvent
|
3034
|
-
if _event.file
|
3351
|
+
if _event.file
|
3035
3352
|
if _event.row
|
3036
3353
|
_index = _event.row.to_s+'.0'
|
3037
3354
|
end
|
@@ -3060,7 +3377,7 @@ class AgMultiEditor < ArcadiaExt
|
|
3060
3377
|
#add_reverse_item(_e)
|
3061
3378
|
end
|
3062
3379
|
else
|
3063
|
-
_event.file =
|
3380
|
+
_event.file = Arcadia.open_file_dialog
|
3064
3381
|
self.open_file(_event.file)
|
3065
3382
|
end
|
3066
3383
|
when CloseBufferEvent
|
@@ -3071,8 +3388,9 @@ class AgMultiEditor < ArcadiaExt
|
|
3071
3388
|
if _event.file == nil
|
3072
3389
|
self.raised.save_as
|
3073
3390
|
else
|
3074
|
-
self.save_as_file(_event.file)
|
3391
|
+
self.save_as_file(_event.file)
|
3075
3392
|
end
|
3393
|
+
_event.new_file = self.raised.file
|
3076
3394
|
when SaveBufferEvent
|
3077
3395
|
if _event.file == nil && _event.title == nil
|
3078
3396
|
self.raised.save
|
@@ -3089,6 +3407,14 @@ class AgMultiEditor < ArcadiaExt
|
|
3089
3407
|
if _event.line == nil
|
3090
3408
|
@find.show_go_to_line_dialog
|
3091
3409
|
end
|
3410
|
+
when CloseCurrentTabEvent
|
3411
|
+
close_raised
|
3412
|
+
when PrettifyTextEvent
|
3413
|
+
require 'rbeautify.rb' # gem
|
3414
|
+
self.raised.save # so we can beautify it kludgely here...
|
3415
|
+
path = raised.file
|
3416
|
+
RBeautify.beautify_file(path)
|
3417
|
+
self.raised.reload
|
3092
3418
|
when MoveBufferEvent
|
3093
3419
|
if _event.old_file && _event.new_file && editor_exist?(_event.old_file)
|
3094
3420
|
#close_file(_event.old_file)
|
@@ -3101,9 +3427,8 @@ class AgMultiEditor < ArcadiaExt
|
|
3101
3427
|
@find
|
3102
3428
|
end
|
3103
3429
|
|
3104
|
-
|
3105
3430
|
def create_find
|
3106
|
-
@find =
|
3431
|
+
@find = Finder.new(@arcadia.layout.root, self)
|
3107
3432
|
@find.on_close=proc{@find.hide}
|
3108
3433
|
@find.hide
|
3109
3434
|
end
|
@@ -3116,13 +3441,17 @@ class AgMultiEditor < ArcadiaExt
|
|
3116
3441
|
def on_finalize(_event)
|
3117
3442
|
@batch_files = true
|
3118
3443
|
_files =''
|
3444
|
+
_raised = self.raised
|
3445
|
+
Arcadia.persistent('editor.files.last', _raised.file) if _raised
|
3119
3446
|
@tabs_editor.each_value{|editor|
|
3120
3447
|
if editor.file != nil
|
3448
|
+
#_insert_index = editor.text.index('insert')
|
3449
|
+
_insert_index = editor.text.index('@0,0')
|
3121
3450
|
_files=_files+'|' if _files.strip.length > 0
|
3122
|
-
_files=_files + editor.file
|
3451
|
+
_files=_files + "#{editor.file};#{_insert_index}"
|
3123
3452
|
end
|
3124
3453
|
#p editor.text.dump_tag('0.1',editor.text.index('end'))
|
3125
|
-
close_editor(editor)
|
3454
|
+
close_editor(editor,true)
|
3126
3455
|
}
|
3127
3456
|
Arcadia.persistent('editor.files.open', _files)
|
3128
3457
|
# _breakpoints = '';
|
@@ -3185,20 +3514,27 @@ class AgMultiEditor < ArcadiaExt
|
|
3185
3514
|
|
3186
3515
|
def open_last_files
|
3187
3516
|
@batch_files = true
|
3188
|
-
if
|
3189
|
-
_files_index
|
3517
|
+
if Arcadia.persistent('editor.files.open')
|
3518
|
+
_files_index =Arcadia.persistent('editor.files.open').split("|")
|
3190
3519
|
_files_index.each do |value|
|
3191
3520
|
_file,_index = value.split(';')
|
3192
|
-
if _file
|
3193
|
-
open_file(_file,_index)
|
3521
|
+
if _file && _index
|
3522
|
+
open_file(_file,_index,false)
|
3523
|
+
else
|
3524
|
+
open_file(_file)
|
3194
3525
|
end
|
3195
3526
|
end
|
3196
3527
|
end
|
3197
3528
|
@batch_files = false
|
3198
|
-
|
3199
|
-
if
|
3200
|
-
|
3201
|
-
|
3529
|
+
to_raise_file = Arcadia.persistent('editor.files.last')
|
3530
|
+
if to_raise_file
|
3531
|
+
raise_file(to_raise_file,0)
|
3532
|
+
else
|
3533
|
+
_first_page = @main_frame.enb.pages(0) if @main_frame.enb.pages.length > 0
|
3534
|
+
if _first_page
|
3535
|
+
@main_frame.enb.raise(_first_page) if frame_def_visible?
|
3536
|
+
@main_frame.enb.see(_first_page)
|
3537
|
+
end
|
3202
3538
|
end
|
3203
3539
|
frame(1)
|
3204
3540
|
#@arcadia.layout.add_observer(self)
|
@@ -3304,17 +3640,22 @@ class AgMultiEditor < ArcadiaExt
|
|
3304
3640
|
@main_frame.enb.itemconfigure(page_name(_tab), 'text'=> _new_text)
|
3305
3641
|
end
|
3306
3642
|
|
3643
|
+
def change_tab_icon(_tab, _new_text)
|
3644
|
+
@main_frame.enb.itemconfigure(page_name(_tab), 'image'=> Arcadia.file_icon(_new_text))
|
3645
|
+
end
|
3646
|
+
|
3307
3647
|
def change_file(_old_file, _new_file)
|
3308
3648
|
_tab_name=tab_file_name(_old_file)
|
3309
3649
|
_tab = @main_frame.enb.get_frame(_tab_name)
|
3310
3650
|
e = @tabs_editor[_tab_name]
|
3311
|
-
e.
|
3651
|
+
e.new_file_name(_new_file) if e
|
3312
3652
|
change_file_name(_tab, _new_file)
|
3313
3653
|
end
|
3314
3654
|
|
3315
3655
|
def change_file_name(_tab, _new_file)
|
3316
3656
|
_new_label = File.basename(_new_file)
|
3317
3657
|
change_tab_title(_tab, _new_label)
|
3658
|
+
change_tab_icon(_tab, _new_label)
|
3318
3659
|
@tabs_file[page_name(_tab)] = _new_file
|
3319
3660
|
end
|
3320
3661
|
|
@@ -3415,6 +3756,15 @@ class AgMultiEditor < ArcadiaExt
|
|
3415
3756
|
tab_name(_fstr)
|
3416
3757
|
end
|
3417
3758
|
|
3759
|
+
def raise_file(_filename=nil, _pos=nil)
|
3760
|
+
if _filename && frame_def_visible?
|
3761
|
+
tab_name=self.tab_file_name(_filename)
|
3762
|
+
@main_frame.enb.move(tab_name,_pos) if _pos
|
3763
|
+
@main_frame.enb.raise(tab_name)
|
3764
|
+
@main_frame.enb.see(tab_name)
|
3765
|
+
end
|
3766
|
+
end
|
3767
|
+
|
3418
3768
|
def open_file(_filename = nil, _text_index='1.0', _mark_selected=true, _exp=true)
|
3419
3769
|
return if _filename == nil || !File.exist?(_filename) || File.ftype(_filename) != 'file'
|
3420
3770
|
_basefilename = File.basename(_filename)
|
@@ -3431,7 +3781,7 @@ class AgMultiEditor < ArcadiaExt
|
|
3431
3781
|
else
|
3432
3782
|
open_buffer(_tab_name, _basefilename,0)
|
3433
3783
|
end
|
3434
|
-
|
3784
|
+
@tabs_editor[_tab_name].reset_highlight
|
3435
3785
|
@tabs_editor[_tab_name].load_file(_filename)
|
3436
3786
|
end
|
3437
3787
|
|
@@ -3453,7 +3803,7 @@ class AgMultiEditor < ArcadiaExt
|
|
3453
3803
|
|
3454
3804
|
if _index != -1
|
3455
3805
|
_tab = @main_frame.enb.get_frame(_buffer_name)
|
3456
|
-
@main_frame.enb.raise(_buffer_name)
|
3806
|
+
@main_frame.enb.raise(_buffer_name) if frame_visible?
|
3457
3807
|
else
|
3458
3808
|
_n = 1
|
3459
3809
|
while @main_frame.enb.index(_buffer_name) != -1
|
@@ -3466,6 +3816,7 @@ class AgMultiEditor < ArcadiaExt
|
|
3466
3816
|
end
|
3467
3817
|
_tab = @main_frame.enb.insert('end', _buffer_name ,
|
3468
3818
|
'text'=> _title,
|
3819
|
+
'image'=> Arcadia.file_icon(_title),
|
3469
3820
|
'background'=> Arcadia.style("tabpanel.background"),
|
3470
3821
|
'foreground'=> Arcadia.style("tabpanel.foreground"),
|
3471
3822
|
'raisecmd'=>proc{do_buffer_raise(_buffer_name, _title)}
|
@@ -3479,7 +3830,7 @@ class AgMultiEditor < ArcadiaExt
|
|
3479
3830
|
@tabs_editor[_buffer_name]=_e
|
3480
3831
|
end
|
3481
3832
|
@main_frame.enb.move(_buffer_name, 1)
|
3482
|
-
@main_frame.enb.raise(_buffer_name)
|
3833
|
+
@main_frame.enb.raise(_buffer_name) if frame_visible?
|
3483
3834
|
@main_frame.enb.see(_buffer_name)
|
3484
3835
|
return _tab
|
3485
3836
|
end
|
@@ -3499,24 +3850,54 @@ class AgMultiEditor < ArcadiaExt
|
|
3499
3850
|
end
|
3500
3851
|
@batch_files = false
|
3501
3852
|
end
|
3502
|
-
|
3503
|
-
def
|
3504
|
-
|
3505
|
-
|
3506
|
-
|
3507
|
-
|
3853
|
+
|
3854
|
+
def can_close_editor?(_editor)
|
3855
|
+
ret = true
|
3856
|
+
if _editor.modified?
|
3857
|
+
filename = page_name(_editor.page_frame)
|
3858
|
+
message = @main_frame.enb.itemcget(filename, 'text')+"\n modified. Save?"
|
3859
|
+
r=Arcadia.dialog(self,
|
3860
|
+
'type'=>'yes_no_cancel',
|
3861
|
+
'level'=>'warning',
|
3862
|
+
'title'=> 'Confirm saving',
|
3863
|
+
'msg'=>message)
|
3864
|
+
if r=="yes"
|
3508
3865
|
_editor.save
|
3509
|
-
|
3510
|
-
|
3511
|
-
|
3512
|
-
return
|
3866
|
+
ret = !_editor.modified?
|
3867
|
+
elsif r=="cancel"
|
3868
|
+
ret = false
|
3513
3869
|
end
|
3514
|
-
|
3870
|
+
end
|
3871
|
+
ret
|
3872
|
+
end
|
3873
|
+
|
3874
|
+
def close_editor(_editor, _force=false)
|
3875
|
+
if _force || can_close_editor?(_editor)
|
3876
|
+
_editor.destroy_outline
|
3515
3877
|
close_tab(_editor.page_frame)
|
3878
|
+
else
|
3879
|
+
return
|
3516
3880
|
end
|
3517
|
-
#EditorContract.instance.file_closed(self, 'file'=>_editor.file)
|
3518
3881
|
end
|
3519
3882
|
|
3883
|
+
|
3884
|
+
# def close_editor(_editor, _mod=true)
|
3885
|
+
# if ((_mod)&&(_editor.modified?))
|
3886
|
+
# _message = @main_frame.enb.itemcget(page_name(_editor.page_frame), 'text')+"\n modified. Save?"
|
3887
|
+
# _r = TkDialog2.new('message'=>_message, 'buttons'=>['Ok','No','Cancel']).show()
|
3888
|
+
# if _r == 0
|
3889
|
+
# _editor.save
|
3890
|
+
# elsif _r == 1
|
3891
|
+
# close_tab(_editor.page_frame)
|
3892
|
+
# elsif _r == 2
|
3893
|
+
# return
|
3894
|
+
# end
|
3895
|
+
# else
|
3896
|
+
# close_tab(_editor.page_frame)
|
3897
|
+
# end
|
3898
|
+
# #EditorContract.instance.file_closed(self, 'file'=>_editor.file)
|
3899
|
+
# end
|
3900
|
+
|
3520
3901
|
def close_tab(_page_frame)
|
3521
3902
|
_name = page_name(_page_frame)
|
3522
3903
|
@tabs_editor.delete(_name)
|
@@ -3626,7 +4007,16 @@ class Findview < TkFloatTitledFrame
|
|
3626
4007
|
#pack('side'=>'left', 'anchor'=>'e')
|
3627
4008
|
place('x' => 8,'y' => y0,'height' => 22)
|
3628
4009
|
}
|
4010
|
+
y0 = y0 + d
|
4011
|
+
@cb_ignore_case = TkCheckButton.new(self.frame, Arcadia.style('checkbox')){|_cb_reg|
|
4012
|
+
text 'Ignore case'
|
4013
|
+
justify 'left'
|
4014
|
+
#relief 'flat'
|
4015
|
+
#pack('side'=>'left', 'anchor'=>'e')
|
4016
|
+
place('x' => 8,'y' => y0,'height' => 22)
|
4017
|
+
}
|
3629
4018
|
|
4019
|
+
y0 = y0 + d
|
3630
4020
|
y0 = y0 + d
|
3631
4021
|
y0 = y0 + d
|
3632
4022
|
@buttons_frame = TkFrame.new(self.frame, Arcadia.style('panel')).pack('fill'=>'x', 'side'=>'bottom')
|
@@ -3669,7 +4059,7 @@ class Findview < TkFloatTitledFrame
|
|
3669
4059
|
#place('width' => 50,'x' => 0,'y' => y0,'height' => 23,'bordermode' => 'inside')
|
3670
4060
|
}
|
3671
4061
|
#place('x'=>0,'y'=>0,'relheight'=> 1,'relwidth'=> 1)
|
3672
|
-
place('x'=>100,'y'=>100,'height'=>
|
4062
|
+
place('x'=>100,'y'=>100,'height'=> 240,'width'=> 300)
|
3673
4063
|
|
3674
4064
|
end
|
3675
4065
|
|
@@ -3683,7 +4073,7 @@ class Findview < TkFloatTitledFrame
|
|
3683
4073
|
|
3684
4074
|
end
|
3685
4075
|
|
3686
|
-
class
|
4076
|
+
class Finder < Findview
|
3687
4077
|
attr_reader :e_what
|
3688
4078
|
def initialize(_frame, _controller)
|
3689
4079
|
super(_frame)
|
@@ -3774,15 +4164,18 @@ class Find < Findview
|
|
3774
4164
|
end
|
3775
4165
|
|
3776
4166
|
def show_go_to_line_dialog
|
4167
|
+
use(@controller.raised)
|
3777
4168
|
@goto_line_dialog.show
|
3778
4169
|
end
|
3779
4170
|
|
3780
4171
|
def go_line
|
3781
4172
|
if @goto_line_dialog.e_line.value.length > 0
|
3782
4173
|
_row = @goto_line_dialog.e_line.value
|
3783
|
-
_index = _row+'.1'
|
4174
|
+
_index = _row.strip+'.1'
|
3784
4175
|
self.editor.text.see(_index)
|
3785
|
-
self.editor.text.
|
4176
|
+
self.editor.text.tag_remove('selected','1.0','end')
|
4177
|
+
self.editor.text.tag_add('selected',_index,_index+' lineend')
|
4178
|
+
#self.editor.text.tag_add('sel', _index,_index+' lineend')
|
3786
4179
|
self.editor.text.set_insert(_index)
|
3787
4180
|
@controller.bookmark_add(self.editor.file, _index)
|
3788
4181
|
@goto_line_dialog.hide
|
@@ -3826,20 +4219,20 @@ class Find < Findview
|
|
3826
4219
|
else
|
3827
4220
|
_istart = '1.0'
|
3828
4221
|
end
|
3829
|
-
|
3830
|
-
|
3831
|
-
|
3832
|
-
|
3833
|
-
|
3834
|
-
|
3835
|
-
|
3836
|
-
|
3837
|
-
if @cb_reg.cget('onvalue')==@cb_reg.cget('variable').value.to_i
|
3838
|
-
_index = self.editor.text.tksearch(['regexp','backwards'],@e_what.text,_istart)
|
3839
|
-
else
|
3840
|
-
_index = self.editor.text.tksearch(['backwards'],@e_what.text,_istart)
|
3841
|
-
end
|
4222
|
+
|
4223
|
+
# propagate some search options
|
4224
|
+
options = []
|
4225
|
+
if !@forwards
|
4226
|
+
options << 'backwards'
|
4227
|
+
end
|
4228
|
+
if @cb_reg.cget('onvalue')==@cb_reg.cget('variable').value.to_i
|
4229
|
+
options << 'regexp'
|
3842
4230
|
end
|
4231
|
+
if @cb_ignore_case.cget('onvalue')==@cb_ignore_case.cget('variable').value.to_i
|
4232
|
+
options << 'nocase'
|
4233
|
+
end
|
4234
|
+
_index = self.editor.text.tksearch(options,@e_what.text,_istart)
|
4235
|
+
|
3843
4236
|
if _index && _index.length>0
|
3844
4237
|
self.editor.text.see(_index)
|
3845
4238
|
_row, _col = _index.split('.')
|
@@ -3852,7 +4245,7 @@ class Find < Findview
|
|
3852
4245
|
self.editor.text.tag_add('sel', _index,_index_sel_end)
|
3853
4246
|
self.editor.text.set_insert(_index)
|
3854
4247
|
@idx1 =_index
|
3855
|
-
|
4248
|
+
@idx2 =_index_sel_end
|
3856
4249
|
_found = true
|
3857
4250
|
@controller.bookmark_add(self.editor.file, _index)
|
3858
4251
|
else
|
@@ -3922,4 +4315,4 @@ class GoToLine < TkFloatTitledFrame
|
|
3922
4315
|
@e_line.focus
|
3923
4316
|
@e_line.selection_range(0,'end')
|
3924
4317
|
end
|
3925
|
-
end
|
4318
|
+
end
|