arcadia 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +40 -11
- data/conf/arcadia.conf +43 -3
- data/conf/arcadia.res.rb +201 -0
- data/ext/ae-dir-projects/ae-dir-projects.conf +18 -0
- data/ext/ae-dir-projects/ae-dir-projects.rb +880 -0
- data/ext/ae-editor/ae-editor.conf +3 -1
- data/ext/ae-editor/ae-editor.rb +380 -296
- data/ext/ae-file-history/ae-file-history.conf +2 -2
- data/ext/ae-file-history/ae-file-history.rb +20 -39
- data/ext/ae-search-in-files/ae-search-in-files.rb +2 -1
- data/lib/a-commons.rb +4 -0
- data/lib/a-contracts.rb +8 -0
- data/lib/a-core.rb +56 -28
- data/lib/a-tkcommons.rb +127 -88
- metadata +138 -144
@@ -1,5 +1,5 @@
|
|
1
1
|
name=editor
|
2
|
-
frames=0.1,0.
|
2
|
+
frames=0.1,0.2
|
3
3
|
frames.labels=Editor,Outline
|
4
4
|
frames.names=editor,editor_outline
|
5
5
|
active=yes
|
@@ -17,6 +17,8 @@ tab-replace-width-space=2
|
|
17
17
|
##tabs.side=bottom
|
18
18
|
tabs.side=top
|
19
19
|
complete-code=yes
|
20
|
+
close-last-if-not-modified=yes
|
21
|
+
max-file-open=3 #todo
|
20
22
|
# editor
|
21
23
|
#font=courier 11
|
22
24
|
#font.bold=courier 11 bold
|
data/ext/ae-editor/ae-editor.rb
CHANGED
@@ -68,6 +68,11 @@ class SourceStructure
|
|
68
68
|
end
|
69
69
|
if (m[0].strip[0..4] == "class" && m.pre_match.strip.length==0)
|
70
70
|
_kind = 'KClass'
|
71
|
+
if m.post_match.strip[0..1]=='<<'
|
72
|
+
hinner_class = true
|
73
|
+
else
|
74
|
+
hinner_class = false
|
75
|
+
end
|
71
76
|
elsif (m[0].strip[0..4] == "class" && m.pre_match.strip.length>0)
|
72
77
|
_row = _row +1
|
73
78
|
_liv = _liv - 1
|
@@ -96,21 +101,13 @@ class SourceStructure
|
|
96
101
|
# _row = _row +1
|
97
102
|
end
|
98
103
|
|
99
|
-
if _livs[_liv-1] && _livs[_liv-1].kind != 'KDef'
|
104
|
+
if _livs[_liv-1] && (_livs[_liv-1].kind != 'KDef' || (_livs[_liv-1].kind == 'KDef' && _kind == 'KClass' && hinner_class))
|
100
105
|
TreeNode.new(_parent, _kind){|_node|
|
101
106
|
_node.label = _label
|
102
107
|
_node.helptext = _helptext
|
103
108
|
_node.rif = _row.to_s
|
104
109
|
_livs[_pliv + 1]=_node
|
105
110
|
}
|
106
|
-
# elsif _kind == 'KDef' && _parent == @root
|
107
|
-
# TreeNode.new(_livs[_liv+1], _kind){|_node|
|
108
|
-
# _node.label = _label
|
109
|
-
# _node.helptext = _helptext
|
110
|
-
# _node.rif = _row.to_s
|
111
|
-
# _livs[_pliv+2]=_node
|
112
|
-
# }
|
113
|
-
# _liv = _liv + 2
|
114
111
|
else
|
115
112
|
TreeNode.new(_livs[_liv-3], _kind){|_node|
|
116
113
|
_node.label = _label
|
@@ -216,27 +213,12 @@ class SafeCompleteCode
|
|
216
213
|
@col = _col.to_i
|
217
214
|
@ss = SourceStructure.new(_source)
|
218
215
|
@filter=''
|
219
|
-
|
216
|
+
@words = Array.new
|
220
217
|
process_source
|
221
218
|
end
|
222
219
|
|
223
|
-
# def dot_trip(_var_name)
|
224
|
-
# ret = "_candidates << #{_var_name}.class.to_s.sub('#{self.class.to_s}::','')\n"
|
225
|
-
# ret = ret + "#{_var_name}.class.instance_methods.each{|m|\n"
|
226
|
-
# ret = ret + "meth = #{_var_name}.method(m)\n"
|
227
|
-
# ret = ret + "_candidates << meth.owner.to_s.sub('#{self.class.to_s}::','')+'#'+m+'#'+meth.arity.to_s\n"
|
228
|
-
# ret = ret + "}\n"
|
229
|
-
# #ret = ret + "exit\n"
|
230
|
-
# ret
|
231
|
-
# end
|
232
|
-
|
233
220
|
def dot_trip(_var_name)
|
234
221
|
ret = "_class=#{_var_name}.class.name\n"
|
235
|
-
# ret = ret +"if _class=='Class'\n"
|
236
|
-
# ret = ret +" _methods=#{_var_name}.singleton_methods\n"
|
237
|
-
# ret = ret +"else\n"
|
238
|
-
# ret = ret +" _methods=#{_var_name}.class.instance_methods\n"
|
239
|
-
# ret = ret +"end\n"
|
240
222
|
ret = ret +" _methods=#{_var_name}.methods\n"
|
241
223
|
ret = ret +"owner_on = Method.instance_methods.include?('owner')\n"
|
242
224
|
ret = ret + "_methods.each{|m|\n"
|
@@ -306,6 +288,17 @@ class SafeCompleteCode
|
|
306
288
|
@is_dot
|
307
289
|
end
|
308
290
|
|
291
|
+
def refresh_words
|
292
|
+
@words.clear
|
293
|
+
_re = /[\s\t\n]#{@filter}[a-zA-Z0-9\-_]*/
|
294
|
+
m = _re.match(@source)
|
295
|
+
while m && (_txt=m.post_match)
|
296
|
+
can = m[0].strip
|
297
|
+
@words << can if can != @filter
|
298
|
+
m = _re.match(_txt)
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
309
302
|
def process_source
|
310
303
|
@modified_source = ""
|
311
304
|
@modified_row = @row
|
@@ -329,7 +322,7 @@ class SafeCompleteCode
|
|
329
322
|
end
|
330
323
|
focus_segment = focus_segment+seg
|
331
324
|
}
|
332
|
-
@filter = focus_segment_array[-1].strip
|
325
|
+
@filter = focus_word(focus_segment_array[-1].strip)
|
333
326
|
else
|
334
327
|
focus_segment = ''
|
335
328
|
@filter = focus_word(focus_line[0..@col-1].strip)
|
@@ -446,6 +439,10 @@ class SafeCompleteCode
|
|
446
439
|
@modified_row = @modified_row+1+ss_len
|
447
440
|
end
|
448
441
|
end
|
442
|
+
if @filter.strip.length > 0
|
443
|
+
# refresh_words(source_array)
|
444
|
+
refresh_words
|
445
|
+
end
|
449
446
|
|
450
447
|
# Arcadia.console(self, 'msg'=>@modified_source)
|
451
448
|
# Arcadia.console(self, 'msg'=>"@modified_row=#{@modified_row}")
|
@@ -458,26 +455,22 @@ class SafeCompleteCode
|
|
458
455
|
|
459
456
|
def focus_word(focus_segment)
|
460
457
|
focus_world = ''
|
458
|
+
char = focus_segment[-1..-1]
|
459
|
+
while [")","]","}"].include?(char)
|
460
|
+
char=focus_segment[-2..-2]
|
461
|
+
focus_segment = focus_segment[0..-2]
|
462
|
+
end
|
461
463
|
j = focus_segment.length - 1
|
462
|
-
char
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
j=j-1
|
467
|
-
char = focus_segment[j..j]
|
468
|
-
end
|
469
|
-
else
|
470
|
-
while !["\s","\t",";"].include?(char) && j >= 0
|
471
|
-
focus_world = "#{char}#{focus_world}"
|
472
|
-
j=j-1
|
473
|
-
char = focus_segment[j..j]
|
474
|
-
end
|
464
|
+
while !["\s","\t",";",",","(","[","{",">"].include?(char) && j >= 0
|
465
|
+
focus_world = "#{char}#{focus_world}"
|
466
|
+
j=j-1
|
467
|
+
char = focus_segment[j..j]
|
475
468
|
end
|
476
469
|
focus_world
|
477
470
|
end
|
478
471
|
|
479
472
|
def candidates(_show_error = false)
|
480
|
-
temp_file =
|
473
|
+
temp_file = create_modified_temp_file(@file)
|
481
474
|
begin
|
482
475
|
_cmp_s = "|ruby '#{temp_file}'"
|
483
476
|
_ret = nil
|
@@ -488,27 +481,22 @@ class SafeCompleteCode
|
|
488
481
|
line
|
489
482
|
}
|
490
483
|
end
|
491
|
-
|
492
|
-
|
493
|
-
#
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
# if _error != nil && _error.length > 0
|
499
|
-
# Arcadia.console(self, 'msg'=>_error.to_s, 'level'=>'error')
|
500
|
-
# end
|
501
|
-
# end
|
484
|
+
if @filter.strip.length > 0
|
485
|
+
@words.each{|w|
|
486
|
+
if !_ret.include?(w) # && w[0..@filter.length-1] == @filter
|
487
|
+
_ret << w
|
488
|
+
end
|
489
|
+
}
|
490
|
+
end
|
502
491
|
_ret.sort
|
503
492
|
rescue Exception => e
|
504
|
-
#
|
493
|
+
#Arcadia.console(self, 'msg'=>e.to_s, 'level'=>'error')
|
505
494
|
ensure
|
506
495
|
File.delete(temp_file) if File.exist?(temp_file)
|
507
496
|
end
|
508
497
|
end
|
509
|
-
|
510
498
|
|
511
|
-
def
|
499
|
+
def create_modified_temp_file(_base_file=nil)
|
512
500
|
if _base_file
|
513
501
|
_file = _base_file+'~~'
|
514
502
|
else
|
@@ -623,7 +611,7 @@ end
|
|
623
611
|
|
624
612
|
class AgEditor
|
625
613
|
include Configurable
|
626
|
-
|
614
|
+
attr_accessor :file
|
627
615
|
attr_reader :read_only
|
628
616
|
attr_reader :page_frame
|
629
617
|
attr_reader :text, :root
|
@@ -631,6 +619,7 @@ class AgEditor
|
|
631
619
|
@controller = _controller
|
632
620
|
@page_frame = _page_frame
|
633
621
|
@set_mod = false
|
622
|
+
@modified_from_opening=false
|
634
623
|
# @font = @controller.conf('font')
|
635
624
|
# @font_bold = @controller.conf('font.bold')
|
636
625
|
@font = Arcadia.conf('edit.font')
|
@@ -655,6 +644,10 @@ class AgEditor
|
|
655
644
|
# @fm.is_left_hide?
|
656
645
|
# end
|
657
646
|
# end
|
647
|
+
|
648
|
+
def modified_from_opening?
|
649
|
+
@modified_from_opening
|
650
|
+
end
|
658
651
|
|
659
652
|
def xy_insert
|
660
653
|
_index_now = @text.index('insert')
|
@@ -727,38 +720,18 @@ class AgEditor
|
|
727
720
|
|
728
721
|
|
729
722
|
def initialize_text(_frame)
|
730
|
-
|
731
|
-
# 'orient'=>'vertical'}.update(Arcadia.style('scrollbar'))
|
732
|
-
# ).pack('side' => 'right', 'fill' => 'y')
|
733
|
-
@text = TkScrollText.new(_frame, Arcadia.style('edit')){|j|
|
723
|
+
@text = TkScrollText.new(_frame, Arcadia.style('text')){|j|
|
734
724
|
wrap 'none'
|
735
725
|
undo true
|
736
|
-
insertofftime 200
|
737
|
-
insertontime 200
|
738
|
-
highlightthickness 0
|
739
|
-
insertwidth 3
|
726
|
+
# insertofftime 200
|
727
|
+
# insertontime 200
|
728
|
+
# highlightthickness 0
|
729
|
+
# insertwidth 3
|
740
730
|
exportselection true
|
741
731
|
autoseparators true
|
742
732
|
padx 0
|
743
733
|
tabs $arcadia['conf']['editor.tabs']
|
744
|
-
# place(
|
745
|
-
# 'x'=>0,
|
746
|
-
# 'y'=>0,
|
747
|
-
# 'width' => -15,
|
748
|
-
# 'relheight'=>1,
|
749
|
-
# 'relwidth'=>1,
|
750
|
-
# 'bordermode'=>'outside'
|
751
|
-
# )
|
752
734
|
}
|
753
|
-
|
754
|
-
# class << @text
|
755
|
-
# def do_yscrollcommand(first,last)
|
756
|
-
# super
|
757
|
-
# do_line_update()
|
758
|
-
# end
|
759
|
-
# end
|
760
|
-
|
761
|
-
# @text.configure('font', @font);
|
762
735
|
|
763
736
|
#do_tag_configure_global('debug')
|
764
737
|
@text.tag_configure('eval','foreground' => 'yellow', 'background' =>'red','borderwidth'=>1, 'relief'=>'raised')
|
@@ -770,7 +743,6 @@ class AgEditor
|
|
770
743
|
@text.show_v_scroll
|
771
744
|
@text.show_h_scroll
|
772
745
|
@text_cursor = @text.cget('cursor')
|
773
|
-
|
774
746
|
end
|
775
747
|
|
776
748
|
def create_temp_file
|
@@ -874,7 +846,6 @@ class AgEditor
|
|
874
846
|
|
875
847
|
def raise_complete_code(_candidates, _row, _col, _filter='')
|
876
848
|
@raised_listbox_frame.destroy if @raised_listbox_frame != nil
|
877
|
-
#@raised_listbox.destroy if @raised_listbox != nil
|
878
849
|
_index_call = _row+'.'+_col
|
879
850
|
_index_now = @text.index('insert')
|
880
851
|
if _index_call == _index_now
|
@@ -882,227 +853,233 @@ class AgEditor
|
|
882
853
|
if _target.strip == '('
|
883
854
|
_target = @text.get('insert - 2 chars wordstart','insert')
|
884
855
|
end
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
end
|
931
|
-
end
|
932
|
-
|
933
|
-
if _key && _class && _key.strip.length > 0 && _class.strip.length > 0
|
934
|
-
_item = "#{_key.strip} - #{_class.strip}"
|
935
|
-
elsif _key && _key.strip.length > 0
|
936
|
-
_item = "#{_key.strip}"
|
937
|
-
else
|
938
|
-
_key = "#{_doc.strip}"
|
939
|
-
_item = "#{_doc.strip}"
|
940
|
-
end
|
941
|
-
if _in.nil? || _in.strip.length == 0 || _item[0.._in.length-1] == _in
|
942
|
-
#|| _item[0.._in.length-1].downcase == _in
|
943
|
-
_docs_entries[_item]= _doc
|
944
|
-
# @raised_listbox.insert('end', _item)
|
945
|
-
@raised_listbox.add(_item)
|
946
|
-
_temp_length = _item.length
|
947
|
-
_length = _temp_length if _temp_length > _length
|
948
|
-
_item_num = _item_num+1
|
949
|
-
_last_valid_key = _key
|
856
|
+
if _target.strip.length > 0 && _target != '.'
|
857
|
+
extra_len = _target.length.+@
|
858
|
+
_begin_index = _index_now<<' - '<<extra_len.to_s<<' chars'
|
859
|
+
@text.tag_add('sel', _begin_index, _index_now)
|
860
|
+
else
|
861
|
+
_begin_index = _index_now
|
862
|
+
extra_len = 0
|
863
|
+
end
|
864
|
+
if _candidates.length >= 1
|
865
|
+
_rx, _ry, _widht, heigth = @text.bbox(_begin_index);
|
866
|
+
_x = _rx + TkWinfo.rootx(@text)
|
867
|
+
_y = _ry + TkWinfo.rooty(@text) + @font_metrics[2][1]
|
868
|
+
_xroot = _x - TkWinfo.rootx(Arcadia.instance.layout.root)
|
869
|
+
_yroot = _y - TkWinfo.rooty(Arcadia.instance.layout.root)
|
870
|
+
|
871
|
+
_max_height = TkWinfo.screenheight(Arcadia.instance.layout.root) - _y - 5
|
872
|
+
self.complete_code_begin
|
873
|
+
|
874
|
+
# @raised_listbox_frame = TkResizingTitledFrame.new(Arcadia.instance.layout.root)
|
875
|
+
@raised_listbox_frame = TkFrame.new(Arcadia.instance.layout.root, {
|
876
|
+
:padx=>"1",
|
877
|
+
:pady=>"1",
|
878
|
+
:background=> Arcadia.conf("foreground")
|
879
|
+
})
|
880
|
+
|
881
|
+
@raised_listbox = TkTextListBox.new(@raised_listbox_frame, {
|
882
|
+
:takefocus=>true,
|
883
|
+
:selectbackground=>Arcadia.conf('hightlight.1.background'),
|
884
|
+
:selectforeground=>Arcadia.conf('hightlight.1.foreground')}.update(Arcadia.style('listbox'))
|
885
|
+
)
|
886
|
+
_char_height = @font_metrics[2][1]
|
887
|
+
_width = 0
|
888
|
+
_docs_entries = Hash.new
|
889
|
+
_item_num = 0
|
890
|
+
_update_list = proc{|_in|
|
891
|
+
_in.strip!
|
892
|
+
@raised_listbox.clear
|
893
|
+
_length = 0
|
894
|
+
_candidates.each{|value|
|
895
|
+
_doc = value.strip
|
896
|
+
_class, _key, _arity = _doc.split('#')
|
897
|
+
if _key && _arity
|
898
|
+
args = arity_to_str(_arity.to_i)
|
899
|
+
if args.length > 0
|
900
|
+
_key = "#{_key}(#{args})"
|
950
901
|
end
|
951
|
-
|
952
|
-
_width = _length*8
|
953
|
-
@raised_listbox.select(1)
|
954
|
-
# p "_update_list end-->#{Time.new}"
|
955
|
-
|
956
|
-
Tk.event_generate(@raised_listbox, "1") if TkWinfo.mapped?(@raised_listbox)
|
957
|
-
}
|
958
|
-
|
959
|
-
_insert_selected_value = proc{
|
960
|
-
#_value = @raised_listbox.get('active').split('-')[0].strip
|
961
|
-
if @raised_listbox.selected_line && @raised_listbox.selected_line.strip.length>0
|
962
|
-
_value = @raised_listbox.selected_line.split('-')[0].strip
|
963
|
-
@raised_listbox_frame.grab("release")
|
964
|
-
@raised_listbox_frame.destroy
|
965
|
-
#_menu.destroy
|
966
|
-
@text.focus
|
967
|
-
@text.delete(_begin_index,'insert')
|
968
|
-
@text.insert('insert',_value.strip)
|
969
|
-
complete_code_end
|
902
|
+
end
|
970
903
|
|
971
|
-
|
972
|
-
|
973
|
-
|
974
|
-
|
975
|
-
|
904
|
+
if _key && _class && _key.strip.length > 0 && _class.strip.length > 0
|
905
|
+
_item = "#{_key.strip} - #{_class.strip}"
|
906
|
+
elsif _key && _key.strip.length > 0
|
907
|
+
_item = "#{_key.strip}"
|
908
|
+
else
|
909
|
+
_key = "#{_doc.strip}"
|
910
|
+
_item = "#{_doc.strip}"
|
976
911
|
end
|
977
|
-
if
|
978
|
-
|
979
|
-
|
980
|
-
|
981
|
-
|
982
|
-
|
983
|
-
|
912
|
+
if _in.nil? || _in.strip.length == 0 || _item[0.._in.length-1] == _in
|
913
|
+
#|| _item[0.._in.length-1].downcase == _in
|
914
|
+
_docs_entries[_item]= _doc
|
915
|
+
# @raised_listbox.insert('end', _item)
|
916
|
+
@raised_listbox.add(_item)
|
917
|
+
_temp_length = _item.length
|
918
|
+
_length = _temp_length if _temp_length > _length
|
919
|
+
_item_num = _item_num+1
|
920
|
+
_last_valid_key = _key
|
984
921
|
end
|
922
|
+
}
|
923
|
+
_width = _length*8
|
924
|
+
@raised_listbox.select(1)
|
925
|
+
# p "_update_list end-->#{Time.new}"
|
926
|
+
|
927
|
+
Tk.event_generate(@raised_listbox, "1") if TkWinfo.mapped?(@raised_listbox)
|
928
|
+
}
|
929
|
+
|
930
|
+
_insert_selected_value = proc{
|
931
|
+
#_value = @raised_listbox.get('active').split('-')[0].strip
|
932
|
+
if @raised_listbox.selected_line && @raised_listbox.selected_line.strip.length>0
|
933
|
+
_value = @raised_listbox.selected_line.split('-')[0].strip
|
934
|
+
@raised_listbox_frame.grab("release")
|
935
|
+
@raised_listbox_frame.destroy
|
936
|
+
#_menu.destroy
|
937
|
+
@text.focus
|
938
|
+
@text.delete(_begin_index,'insert')
|
939
|
+
|
940
|
+
# workaround for @ char
|
941
|
+
_value = _value.strip
|
942
|
+
if _value[0..0] !=_target[0..0] && _value[1..1] == _target[0..0]
|
943
|
+
_value = _value[1..-1]
|
985
944
|
end
|
945
|
+
@text.insert('insert',_value)
|
946
|
+
complete_code_end
|
986
947
|
|
987
|
-
|
988
|
-
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
995
|
-
|
996
|
-
|
948
|
+
_to_search = 'arg1'
|
949
|
+
_argindex = @text.search(_to_search,_begin_index)
|
950
|
+
if !(_argindex && _argindex.length>0)
|
951
|
+
_to_search = '*'
|
952
|
+
_argindex = @text.search(_to_search,_begin_index)
|
953
|
+
end
|
954
|
+
if _argindex && _argindex.length>0
|
955
|
+
_argrow, _argcol = _argindex.split('.')
|
956
|
+
if _argrow.to_i == _row.to_i
|
957
|
+
_argindex_sel_end = _argrow.to_i.to_s+'.'+(_argcol.to_i+_to_search.length).to_i.to_s
|
958
|
+
@text.tag_add('sel', _argindex,_argindex_sel_end)
|
959
|
+
@text.set_insert(_argindex)
|
960
|
+
end
|
961
|
+
end
|
997
962
|
end
|
998
|
-
_width = _width + 10
|
999
|
-
#_height = (candidates.length+1)*_char_height
|
1000
|
-
_height = 15*_char_height
|
1001
|
-
_height = _max_height if _height > _max_height
|
1002
963
|
|
1003
|
-
|
1004
|
-
|
1005
|
-
|
1006
|
-
|
1007
|
-
@
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
1011
|
-
|
1012
|
-
|
1013
|
-
|
1014
|
-
|
1015
|
-
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1019
|
-
|
1020
|
-
|
1021
|
-
|
1022
|
-
|
1023
|
-
|
1024
|
-
|
1025
|
-
|
1026
|
-
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
1030
|
-
|
1031
|
-
|
1032
|
-
|
1033
|
-
|
1034
|
-
|
1035
|
-
|
1036
|
-
|
1037
|
-
|
1038
|
-
|
1039
|
-
|
1040
|
-
|
1041
|
-
|
1042
|
-
|
1043
|
-
|
1044
|
-
|
1045
|
-
|
964
|
+
Tk.callback_break
|
965
|
+
}
|
966
|
+
_update_list.call(_filter)
|
967
|
+
if _item_num == 0
|
968
|
+
@raised_listbox_frame.destroy
|
969
|
+
self.complete_code_end
|
970
|
+
return
|
971
|
+
elsif _item_num == 1
|
972
|
+
_insert_selected_value.call
|
973
|
+
return
|
974
|
+
end
|
975
|
+
_width = _width + 30
|
976
|
+
#_height = (candidates.length+1)*_char_height
|
977
|
+
_height = 15*_char_height
|
978
|
+
_height = _max_height if _height > _max_height
|
979
|
+
|
980
|
+
_buffer = @text.get(_begin_index, 'insert')
|
981
|
+
_buffer_ini_length = _buffer.length
|
982
|
+
@raised_listbox_frame.place('x'=>_xroot,'y'=>_yroot, 'width'=>_width, 'height'=>_height)
|
983
|
+
@raised_listbox.show(0,0,'inside')
|
984
|
+
@raised_listbox.show_v_scroll
|
985
|
+
@raised_listbox.focus
|
986
|
+
#@raised_listbox.activate(0)
|
987
|
+
@raised_listbox.select(1)
|
988
|
+
@raised_listbox_frame.grab("set")
|
989
|
+
# Tk.event_generate(@raised_listbox, "1")
|
990
|
+
|
991
|
+
|
992
|
+
@raised_listbox.bind_append("Double-ButtonPress-1",
|
993
|
+
proc{|x,y|
|
994
|
+
_index = @raised_listbox.index("@#{x},#{y}")
|
995
|
+
_line = _index.split('.')[0].to_i
|
996
|
+
@raised_listbox.select(_line)
|
997
|
+
_insert_selected_value.call
|
998
|
+
}, "%x %y")
|
999
|
+
@raised_listbox.bind_append('Shift-KeyPress'){|e|
|
1000
|
+
# todo
|
1001
|
+
case e.keysym
|
1002
|
+
when 'parenleft'
|
1003
|
+
@text.insert('insert','(')
|
1004
|
+
_buffer = _buffer + '('
|
1005
|
+
_item_num = 0
|
1006
|
+
_update_list.call(_buffer)
|
1007
|
+
if _item_num == 1
|
1008
|
+
_insert_selected_value.call
|
1009
|
+
end
|
1010
|
+
Tk.callback_break
|
1011
|
+
when 'A'..'Z','equal','greater'
|
1012
|
+
if e.keysym == 'equal'
|
1013
|
+
ch = '='
|
1014
|
+
elsif e.keysym == 'greater'
|
1015
|
+
ch = '>'
|
1046
1016
|
else
|
1047
|
-
|
1048
|
-
|
1049
|
-
|
1050
|
-
|
1051
|
-
|
1052
|
-
|
1053
|
-
|
1054
|
-
|
1055
|
-
|
1056
|
-
@raised_listbox.grab("release")
|
1057
|
-
@raised_listbox_frame.destroy
|
1058
|
-
complete_code_end
|
1059
|
-
@text.focus
|
1060
|
-
#_menu.destroy
|
1017
|
+
ch = e.keysym
|
1018
|
+
end
|
1019
|
+
@text.insert('insert',ch)
|
1020
|
+
_buffer = _buffer + ch
|
1021
|
+
_update_list.call(_buffer)
|
1022
|
+
Tk.callback_break
|
1023
|
+
else
|
1024
|
+
if e.keysym.length > 1
|
1025
|
+
p ">#{e.keysym}<"
|
1061
1026
|
Tk.callback_break
|
1027
|
+
end
|
1028
|
+
end
|
1029
|
+
}
|
1030
|
+
@raised_listbox.bind_append('KeyPress'){|e|
|
1031
|
+
case e.keysym
|
1032
|
+
when 'Escape'
|
1033
|
+
@raised_listbox.grab("release")
|
1034
|
+
@raised_listbox_frame.destroy
|
1035
|
+
complete_code_end
|
1036
|
+
@text.focus
|
1037
|
+
#_menu.destroy
|
1038
|
+
Tk.callback_break
|
1062
1039
|
# when 'Return'
|
1063
1040
|
# _insert_selected_value.call
|
1064
|
-
|
1065
|
-
|
1066
|
-
|
1067
|
-
|
1068
|
-
|
1069
|
-
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
else
|
1075
|
-
ch = e.keysym
|
1076
|
-
end
|
1077
|
-
@text.insert('insert',ch)
|
1078
|
-
_buffer = _buffer + ch
|
1079
|
-
_update_list.call(_buffer)
|
1080
|
-
Tk.callback_break
|
1081
|
-
when 'BackSpace'
|
1082
|
-
if _buffer.length > _buffer_ini_length
|
1083
|
-
@text.delete("#{_begin_index} + #{_buffer.length-1} chars" ,'insert')
|
1084
|
-
_buffer = _buffer[0..-2]
|
1085
|
-
Tk.update
|
1086
|
-
_update_list.call(_buffer)
|
1087
|
-
Tk.callback_break
|
1088
|
-
end
|
1089
|
-
when 'Next', 'Prior'
|
1041
|
+
when 'F1'
|
1042
|
+
_key = @raised_listbox.selected_line.split('-')[0].strip
|
1043
|
+
_x, _y = xy_insert
|
1044
|
+
Arcadia.process_event(DocCodeEvent.new(self, 'doc_entry'=>_docs_entries[_key], 'xdoc'=>_x, 'ydoc'=>_y))
|
1045
|
+
#EditorContract.instance.doc_code(self, 'doc_entry'=>_docs_entries[_key], 'xdoc'=>_x, 'ydoc'=>_y)
|
1046
|
+
when 'a'..'z','less','space'
|
1047
|
+
if e.keysym == 'less'
|
1048
|
+
ch = '<'
|
1049
|
+
elsif e.keysym == 'space'
|
1050
|
+
ch = ''
|
1090
1051
|
else
|
1052
|
+
ch = e.keysym
|
1053
|
+
end
|
1054
|
+
@text.insert('insert',ch)
|
1055
|
+
_buffer = _buffer + ch
|
1056
|
+
_update_list.call(_buffer)
|
1057
|
+
Tk.callback_break
|
1058
|
+
when 'BackSpace'
|
1059
|
+
if _buffer.length > _buffer_ini_length
|
1060
|
+
@text.delete("#{_begin_index} + #{_buffer.length-1} chars" ,'insert')
|
1061
|
+
_buffer = _buffer[0..-2]
|
1062
|
+
Tk.update
|
1063
|
+
_update_list.call(_buffer)
|
1091
1064
|
Tk.callback_break
|
1092
|
-
|
1093
|
-
|
1094
|
-
|
1095
|
-
|
1096
|
-
|
1097
|
-
|
1098
|
-
|
1099
|
-
|
1100
|
-
|
1101
|
-
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
1105
|
-
|
1065
|
+
end
|
1066
|
+
when 'Next', 'Prior'
|
1067
|
+
else
|
1068
|
+
Tk.callback_break
|
1069
|
+
end
|
1070
|
+
}
|
1071
|
+
@raised_listbox.bind_append('KeyRelease'){|e|
|
1072
|
+
case e.keysym
|
1073
|
+
when 'Return'
|
1074
|
+
_insert_selected_value.call
|
1075
|
+
end
|
1076
|
+
}
|
1077
|
+
elsif _candidates.length == 1 && _candidates[0].length>0
|
1078
|
+
@text.delete(_begin_index,'insert');
|
1079
|
+
@text.insert('insert',_candidates[0].split[0])
|
1080
|
+
complete_code_end
|
1081
|
+
end
|
1082
|
+
end
|
1106
1083
|
end
|
1107
1084
|
|
1108
1085
|
|
@@ -1120,7 +1097,14 @@ class AgEditor
|
|
1120
1097
|
}
|
1121
1098
|
|
1122
1099
|
@text.bind_append("KeyPress"){|e|
|
1123
|
-
|
1100
|
+
if e.keysym == "Escape"
|
1101
|
+
if @n_complete_task == 0
|
1102
|
+
@do_complete = true
|
1103
|
+
complete_code
|
1104
|
+
end
|
1105
|
+
else
|
1106
|
+
@do_complete = false
|
1107
|
+
end
|
1124
1108
|
}
|
1125
1109
|
|
1126
1110
|
@text.bind_append("KeyRelease"){|e|
|
@@ -1158,6 +1142,14 @@ class AgEditor
|
|
1158
1142
|
end
|
1159
1143
|
end
|
1160
1144
|
break
|
1145
|
+
when 'o'
|
1146
|
+
if @file
|
1147
|
+
_dir = File.dirname(@file)
|
1148
|
+
else
|
1149
|
+
_dir = Dir.pwd
|
1150
|
+
end
|
1151
|
+
Arcadia.process_event(OpenBufferEvent.new(self,'file'=>Tk.getOpenFile('initialdir'=>_dir)))
|
1152
|
+
break
|
1161
1153
|
when 'c'
|
1162
1154
|
@text.text_copy
|
1163
1155
|
break
|
@@ -1769,7 +1761,7 @@ class AgEditor
|
|
1769
1761
|
|
1770
1762
|
@pop_up.insert('end',
|
1771
1763
|
:command,
|
1772
|
-
:label=>'Data image',
|
1764
|
+
:label=>'Data image from file',
|
1773
1765
|
:hidemargin => false,
|
1774
1766
|
:command=> proc{
|
1775
1767
|
file = Tk.getOpenFile
|
@@ -1795,7 +1787,6 @@ class AgEditor
|
|
1795
1787
|
if _r.length>0
|
1796
1788
|
_data=@text.get(_r[0][0],_r[0][1])
|
1797
1789
|
if _data.length > 0
|
1798
|
-
|
1799
1790
|
_b = TkButton.new(@text,
|
1800
1791
|
'command'=>proc{_b.destroy},
|
1801
1792
|
'image'=> TkPhotoImage.new('data' => _data),
|
@@ -1806,6 +1797,33 @@ class AgEditor
|
|
1806
1797
|
}
|
1807
1798
|
)
|
1808
1799
|
|
1800
|
+
@pop_up.insert('end',
|
1801
|
+
:command,
|
1802
|
+
:label=>'Data image to file',
|
1803
|
+
:hidemargin => false,
|
1804
|
+
:command=> proc{
|
1805
|
+
_r = @text.tag_ranges('sel')
|
1806
|
+
if _r.length>0
|
1807
|
+
_data=@text.get(_r[0][0],_r[0][1])
|
1808
|
+
if _data.length > 0
|
1809
|
+
file = Tk.getSaveFile("filetypes"=>[["Image", [".gif"]],["All Files", [".*"]]])
|
1810
|
+
if file
|
1811
|
+
require 'base64'
|
1812
|
+
decoded = Base64.decode64(_data)
|
1813
|
+
f = File.new(file, "w")
|
1814
|
+
begin
|
1815
|
+
if f
|
1816
|
+
f.syswrite(decoded)
|
1817
|
+
end
|
1818
|
+
ensure
|
1819
|
+
f.close unless f.nil?
|
1820
|
+
end
|
1821
|
+
end
|
1822
|
+
end
|
1823
|
+
end
|
1824
|
+
}
|
1825
|
+
)
|
1826
|
+
|
1809
1827
|
@pop_up.insert('end', :separator)
|
1810
1828
|
|
1811
1829
|
#---- debug menu
|
@@ -1860,6 +1878,40 @@ class AgEditor
|
|
1860
1878
|
:command=> proc{@text.configure('wrap'=>'none');@text.show_h_scroll}
|
1861
1879
|
)
|
1862
1880
|
|
1881
|
+
_sub_code.insert('end',
|
1882
|
+
:command,
|
1883
|
+
:label=>'Selection to uppercase',
|
1884
|
+
:hidemargin => false,
|
1885
|
+
:command=> proc{
|
1886
|
+
_r = @text.tag_ranges('sel')
|
1887
|
+
if _r.length>0
|
1888
|
+
_text=@text.get(_r[0][0],_r[0][1])
|
1889
|
+
if _text.length > 0
|
1890
|
+
@text.delete(_r[0][0],_r[0][1])
|
1891
|
+
@text.insert(_r[0][0],_text.upcase)
|
1892
|
+
end
|
1893
|
+
end
|
1894
|
+
}
|
1895
|
+
)
|
1896
|
+
|
1897
|
+
_sub_code.insert('end',
|
1898
|
+
:command,
|
1899
|
+
:label=>'Selection to downcase',
|
1900
|
+
:hidemargin => false,
|
1901
|
+
:command=> proc{
|
1902
|
+
_r = @text.tag_ranges('sel')
|
1903
|
+
if _r.length>0
|
1904
|
+
_text=@text.get(_r[0][0],_r[0][1])
|
1905
|
+
if _text.length > 0
|
1906
|
+
@text.delete(_r[0][0],_r[0][1])
|
1907
|
+
@text.insert(_r[0][0],_text.downcase)
|
1908
|
+
end
|
1909
|
+
end
|
1910
|
+
}
|
1911
|
+
)
|
1912
|
+
|
1913
|
+
|
1914
|
+
|
1863
1915
|
_sub_code.insert('end',
|
1864
1916
|
:command,
|
1865
1917
|
:label=>'Show tabs',
|
@@ -2294,6 +2346,7 @@ class AgEditor
|
|
2294
2346
|
def set_modify
|
2295
2347
|
if !@set_mod
|
2296
2348
|
@set_mod = true
|
2349
|
+
@modified_from_opening = true
|
2297
2350
|
@controller.change_tab_set_modify(@page_frame)
|
2298
2351
|
end
|
2299
2352
|
end
|
@@ -2617,6 +2670,7 @@ class AgEditor
|
|
2617
2670
|
end
|
2618
2671
|
|
2619
2672
|
def check_modify
|
2673
|
+
return if @loading
|
2620
2674
|
if modified?
|
2621
2675
|
set_modify if !@set_mod
|
2622
2676
|
else
|
@@ -2634,7 +2688,7 @@ class AgEditor
|
|
2634
2688
|
'title' => '(Arcadia) Libs', 'parent' => @text,
|
2635
2689
|
'message' => msg) == 'yes'
|
2636
2690
|
@text.delete('1.0','end')
|
2637
|
-
reset_highlight
|
2691
|
+
reset_highlight if @highlighting
|
2638
2692
|
load_file(@file)
|
2639
2693
|
else
|
2640
2694
|
@file_last_access_time = ftime
|
@@ -2846,7 +2900,7 @@ class AgMultiEditor < ArcadiaExt
|
|
2846
2900
|
:command=> proc{
|
2847
2901
|
if @selected_tab_name_from_popup != nil
|
2848
2902
|
_e = @tabs_editor[@selected_tab_name_from_popup]
|
2849
|
-
self.close_editor(_e)
|
2903
|
+
self.close_editor(_e) if _e
|
2850
2904
|
end
|
2851
2905
|
}
|
2852
2906
|
)
|
@@ -2981,6 +3035,19 @@ class AgMultiEditor < ArcadiaExt
|
|
2981
3035
|
if _event.row
|
2982
3036
|
_index = _event.row.to_s+'.0'
|
2983
3037
|
end
|
3038
|
+
if _event.kind_of?(OpenBufferTransientEvent) && conf('close-last-if-not-modified')=="yes"
|
3039
|
+
if defined?(@last_transient_file) && !@last_transient_file.nil? && @last_transient_file != _event.file
|
3040
|
+
_e = @tabs_editor[tab_name(@last_transient_file)]
|
3041
|
+
if _e && !_e.modified_from_opening?
|
3042
|
+
close_editor(_e)
|
3043
|
+
end
|
3044
|
+
end
|
3045
|
+
if !editor_exist?(_event.file)
|
3046
|
+
@last_transient_file = _event.file
|
3047
|
+
else
|
3048
|
+
@last_transient_file = nil
|
3049
|
+
end
|
3050
|
+
end
|
2984
3051
|
self.open_file(_event.file, _index)
|
2985
3052
|
elsif _event.text
|
2986
3053
|
if _event.title
|
@@ -3022,6 +3089,11 @@ class AgMultiEditor < ArcadiaExt
|
|
3022
3089
|
if _event.line == nil
|
3023
3090
|
@find.show_go_to_line_dialog
|
3024
3091
|
end
|
3092
|
+
when MoveBufferEvent
|
3093
|
+
if _event.old_file && _event.new_file && editor_exist?(_event.old_file)
|
3094
|
+
#close_file(_event.old_file)
|
3095
|
+
change_file(_event.old_file, _event.new_file)
|
3096
|
+
end
|
3025
3097
|
end
|
3026
3098
|
end
|
3027
3099
|
|
@@ -3049,6 +3121,7 @@ class AgMultiEditor < ArcadiaExt
|
|
3049
3121
|
_files=_files+'|' if _files.strip.length > 0
|
3050
3122
|
_files=_files + editor.file
|
3051
3123
|
end
|
3124
|
+
#p editor.text.dump_tag('0.1',editor.text.index('end'))
|
3052
3125
|
close_editor(editor)
|
3053
3126
|
}
|
3054
3127
|
Arcadia.persistent('editor.files.open', _files)
|
@@ -3069,7 +3142,8 @@ class AgMultiEditor < ArcadiaExt
|
|
3069
3142
|
end
|
3070
3143
|
|
3071
3144
|
def close_raised
|
3072
|
-
|
3145
|
+
_e = @tabs_editor[@main_frame.enb.raise]
|
3146
|
+
close_editor(_e) if _e
|
3073
3147
|
|
3074
3148
|
#_page = @main_frame.enb.raise
|
3075
3149
|
#_editor = @tabs_editor[_page]
|
@@ -3230,6 +3304,14 @@ class AgMultiEditor < ArcadiaExt
|
|
3230
3304
|
@main_frame.enb.itemconfigure(page_name(_tab), 'text'=> _new_text)
|
3231
3305
|
end
|
3232
3306
|
|
3307
|
+
def change_file(_old_file, _new_file)
|
3308
|
+
_tab_name=tab_file_name(_old_file)
|
3309
|
+
_tab = @main_frame.enb.get_frame(_tab_name)
|
3310
|
+
e = @tabs_editor[_tab_name]
|
3311
|
+
e.file =_new_file if e
|
3312
|
+
change_file_name(_tab, _new_file)
|
3313
|
+
end
|
3314
|
+
|
3233
3315
|
def change_file_name(_tab, _new_file)
|
3234
3316
|
_new_label = File.basename(_new_file)
|
3235
3317
|
change_tab_title(_tab, _new_label)
|
@@ -3392,6 +3474,7 @@ class AgMultiEditor < ArcadiaExt
|
|
3392
3474
|
ext = _e.file_extension(_title)
|
3393
3475
|
ext='rb' if ext.nil?
|
3394
3476
|
_e.init_editing(ext, w1)
|
3477
|
+
_e.text.set_focus
|
3395
3478
|
#@tabs_file[_buffer_name]= nil
|
3396
3479
|
@tabs_editor[_buffer_name]=_e
|
3397
3480
|
end
|
@@ -3447,7 +3530,8 @@ class AgMultiEditor < ArcadiaExt
|
|
3447
3530
|
end
|
3448
3531
|
|
3449
3532
|
def close_file(_filename)
|
3450
|
-
|
3533
|
+
_e = @tabs_editor[tab_name(_filename)]
|
3534
|
+
close_editor(_e) if _e
|
3451
3535
|
end
|
3452
3536
|
|
3453
3537
|
def save_file(_filename)
|