arcadia 0.4.0 → 0.5.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.
Files changed (179) hide show
  1. data/README +8 -10
  2. data/bin/arcadia +13 -13
  3. data/bin/arcadia.bat +0 -0
  4. data/conf/arcadia.conf +35 -18
  5. data/conf/arcadia.init.rb +0 -0
  6. data/conf/arcadia.res.rb +10 -0
  7. data/ext/ae-breakpoints/ae-breakpoints.conf +0 -0
  8. data/ext/ae-breakpoints/ae-breakpoints.rb +368 -349
  9. data/ext/ae-editor/ae-editor.conf +2 -2
  10. data/ext/ae-editor/ae-editor.rb +1248 -445
  11. data/ext/ae-editor/langs/conf.lang +0 -0
  12. data/ext/ae-editor/langs/lang.lang.bind +0 -0
  13. data/ext/ae-editor/langs/rb.lang +0 -0
  14. data/ext/ae-editor/langs/rbw.lang.bind +0 -0
  15. data/ext/ae-file-history/ae-file-history.conf +1 -1
  16. data/ext/ae-file-history/ae-file-history.rb +23 -17
  17. data/ext/ae-output/ae-output.conf +0 -0
  18. data/ext/ae-output/ae-output.rb +262 -200
  19. data/ext/ae-rad/ae-rad-inspector.rb +34 -26
  20. data/ext/ae-rad/ae-rad-libs.rb +0 -0
  21. data/ext/ae-rad/ae-rad-palette.rb +0 -0
  22. data/ext/ae-rad/ae-rad.conf +0 -0
  23. data/ext/ae-rad/ae-rad.rb +0 -0
  24. data/ext/ae-rad/lib/tk/al-tk.rb +6 -2
  25. data/ext/ae-rad/lib/tk/al-tk.res.rb +0 -0
  26. data/ext/ae-rad/lib/tk/al-tkarcadia.rb +0 -0
  27. data/ext/ae-rad/lib/tk/al-tkcustom.rb +0 -0
  28. data/ext/ae-rad/lib/tkext/al-bwidget.rb +0 -0
  29. data/ext/ae-rad/lib/tkext/al-iwidgets.rb +0 -0
  30. data/ext/ae-rad/lib/tkext/al-tile.rb +0 -0
  31. data/ext/ae-rad/lib/tkext/al-tktable.rb +0 -0
  32. data/ext/ae-ruby-debug/ae-ruby-debug.conf +0 -0
  33. data/ext/ae-ruby-debug/ae-ruby-debug.rb +1 -0
  34. data/ext/ae-search-in-files/ae-search-in-files.conf +0 -0
  35. data/ext/ae-search-in-files/ae-search-in-files.rb +14 -10
  36. data/ext/ae-shell/ae-shell.conf +0 -0
  37. data/ext/ae-shell/ae-shell.rb +1 -1
  38. data/ext/ae-shell/sh.rb +0 -0
  39. data/lib/a-commons.rb +5 -1
  40. data/lib/a-contracts.rb +1 -0
  41. data/lib/a-core.rb +40 -9
  42. data/lib/a-tkcommons.rb +229 -1
  43. data/tcl/BWidget-1.8.0/BWman/ArrowButton.html +0 -0
  44. data/tcl/BWidget-1.8.0/BWman/BWidget.html +0 -0
  45. data/tcl/BWidget-1.8.0/BWman/Button.html +0 -0
  46. data/tcl/BWidget-1.8.0/BWman/ButtonBox.html +0 -0
  47. data/tcl/BWidget-1.8.0/BWman/ComboBox.html +0 -0
  48. data/tcl/BWidget-1.8.0/BWman/Dialog.html +0 -0
  49. data/tcl/BWidget-1.8.0/BWman/DragSite.html +0 -0
  50. data/tcl/BWidget-1.8.0/BWman/DropSite.html +0 -0
  51. data/tcl/BWidget-1.8.0/BWman/DynamicHelp.html +0 -0
  52. data/tcl/BWidget-1.8.0/BWman/Entry.html +0 -0
  53. data/tcl/BWidget-1.8.0/BWman/Label.html +0 -0
  54. data/tcl/BWidget-1.8.0/BWman/LabelEntry.html +0 -0
  55. data/tcl/BWidget-1.8.0/BWman/LabelFrame.html +0 -0
  56. data/tcl/BWidget-1.8.0/BWman/ListBox.html +0 -0
  57. data/tcl/BWidget-1.8.0/BWman/MainFrame.html +0 -0
  58. data/tcl/BWidget-1.8.0/BWman/MessageDlg.html +0 -0
  59. data/tcl/BWidget-1.8.0/BWman/NoteBook.html +0 -0
  60. data/tcl/BWidget-1.8.0/BWman/PagesManager.html +0 -0
  61. data/tcl/BWidget-1.8.0/BWman/PanedWindow.html +0 -0
  62. data/tcl/BWidget-1.8.0/BWman/PanelFrame.html +0 -0
  63. data/tcl/BWidget-1.8.0/BWman/PasswdDlg.html +0 -0
  64. data/tcl/BWidget-1.8.0/BWman/ProgressBar.html +0 -0
  65. data/tcl/BWidget-1.8.0/BWman/ProgressDlg.html +0 -0
  66. data/tcl/BWidget-1.8.0/BWman/ScrollView.html +0 -0
  67. data/tcl/BWidget-1.8.0/BWman/ScrollableFrame.html +0 -0
  68. data/tcl/BWidget-1.8.0/BWman/ScrolledWindow.html +0 -0
  69. data/tcl/BWidget-1.8.0/BWman/SelectColor.html +0 -0
  70. data/tcl/BWidget-1.8.0/BWman/SelectFont.html +0 -0
  71. data/tcl/BWidget-1.8.0/BWman/Separator.html +0 -0
  72. data/tcl/BWidget-1.8.0/BWman/SpinBox.html +0 -0
  73. data/tcl/BWidget-1.8.0/BWman/StatusBar.html +0 -0
  74. data/tcl/BWidget-1.8.0/BWman/TitleFrame.html +0 -0
  75. data/tcl/BWidget-1.8.0/BWman/Tree.html +0 -0
  76. data/tcl/BWidget-1.8.0/BWman/Widget.html +0 -0
  77. data/tcl/BWidget-1.8.0/BWman/contents.html +0 -0
  78. data/tcl/BWidget-1.8.0/BWman/index.html +0 -0
  79. data/tcl/BWidget-1.8.0/BWman/navtree.html +0 -0
  80. data/tcl/BWidget-1.8.0/BWman/options.htm +0 -0
  81. data/tcl/BWidget-1.8.0/CHANGES.txt +0 -0
  82. data/tcl/BWidget-1.8.0/ChangeLog +0 -0
  83. data/tcl/BWidget-1.8.0/LICENSE.txt +0 -0
  84. data/tcl/BWidget-1.8.0/README.txt +0 -0
  85. data/tcl/BWidget-1.8.0/arrow.tcl +0 -0
  86. data/tcl/BWidget-1.8.0/bitmap.tcl +0 -0
  87. data/tcl/BWidget-1.8.0/button.tcl +0 -0
  88. data/tcl/BWidget-1.8.0/buttonbox.tcl +0 -0
  89. data/tcl/BWidget-1.8.0/color.tcl +0 -0
  90. data/tcl/BWidget-1.8.0/combobox.tcl +0 -0
  91. data/tcl/BWidget-1.8.0/demo/basic.tcl +0 -0
  92. data/tcl/BWidget-1.8.0/demo/bwidget.xbm +0 -0
  93. data/tcl/BWidget-1.8.0/demo/demo.tcl +0 -0
  94. data/tcl/BWidget-1.8.0/demo/dnd.tcl +0 -0
  95. data/tcl/BWidget-1.8.0/demo/manager.tcl +0 -0
  96. data/tcl/BWidget-1.8.0/demo/select.tcl +0 -0
  97. data/tcl/BWidget-1.8.0/demo/tmpldlg.tcl +0 -0
  98. data/tcl/BWidget-1.8.0/demo/tree.tcl +0 -0
  99. data/tcl/BWidget-1.8.0/demo/x1.xbm +0 -0
  100. data/tcl/BWidget-1.8.0/dialog.tcl +0 -0
  101. data/tcl/BWidget-1.8.0/dragsite.tcl +0 -0
  102. data/tcl/BWidget-1.8.0/dropsite.tcl +0 -0
  103. data/tcl/BWidget-1.8.0/dynhelp.tcl +0 -0
  104. data/tcl/BWidget-1.8.0/entry.tcl +0 -0
  105. data/tcl/BWidget-1.8.0/font.tcl +0 -0
  106. data/tcl/BWidget-1.8.0/images/bold.gif +0 -0
  107. data/tcl/BWidget-1.8.0/images/copy.gif +0 -0
  108. data/tcl/BWidget-1.8.0/images/cut.gif +0 -0
  109. data/tcl/BWidget-1.8.0/images/dragfile.gif +0 -0
  110. data/tcl/BWidget-1.8.0/images/dragicon.gif +0 -0
  111. data/tcl/BWidget-1.8.0/images/error.gif +0 -0
  112. data/tcl/BWidget-1.8.0/images/file.gif +0 -0
  113. data/tcl/BWidget-1.8.0/images/folder.gif +0 -0
  114. data/tcl/BWidget-1.8.0/images/hourglass.gif +0 -0
  115. data/tcl/BWidget-1.8.0/images/info.gif +0 -0
  116. data/tcl/BWidget-1.8.0/images/italic.gif +0 -0
  117. data/tcl/BWidget-1.8.0/images/minus.xbm +0 -0
  118. data/tcl/BWidget-1.8.0/images/new.gif +0 -0
  119. data/tcl/BWidget-1.8.0/images/opcopy.xbm +0 -0
  120. data/tcl/BWidget-1.8.0/images/open.gif +0 -0
  121. data/tcl/BWidget-1.8.0/images/openfold.gif +0 -0
  122. data/tcl/BWidget-1.8.0/images/oplink.xbm +0 -0
  123. data/tcl/BWidget-1.8.0/images/opmove.xbm +0 -0
  124. data/tcl/BWidget-1.8.0/images/overstrike.gif +0 -0
  125. data/tcl/BWidget-1.8.0/images/palette.gif +0 -0
  126. data/tcl/BWidget-1.8.0/images/passwd.gif +0 -0
  127. data/tcl/BWidget-1.8.0/images/paste.gif +0 -0
  128. data/tcl/BWidget-1.8.0/images/plus.xbm +0 -0
  129. data/tcl/BWidget-1.8.0/images/print.gif +0 -0
  130. data/tcl/BWidget-1.8.0/images/question.gif +0 -0
  131. data/tcl/BWidget-1.8.0/images/redo.gif +0 -0
  132. data/tcl/BWidget-1.8.0/images/save.gif +0 -0
  133. data/tcl/BWidget-1.8.0/images/target.xbm +0 -0
  134. data/tcl/BWidget-1.8.0/images/underline.gif +0 -0
  135. data/tcl/BWidget-1.8.0/images/undo.gif +0 -0
  136. data/tcl/BWidget-1.8.0/images/warning.gif +0 -0
  137. data/tcl/BWidget-1.8.0/init.tcl +0 -0
  138. data/tcl/BWidget-1.8.0/label.tcl +0 -0
  139. data/tcl/BWidget-1.8.0/labelentry.tcl +0 -0
  140. data/tcl/BWidget-1.8.0/labelframe.tcl +0 -0
  141. data/tcl/BWidget-1.8.0/lang/da.rc +0 -0
  142. data/tcl/BWidget-1.8.0/lang/de.rc +0 -0
  143. data/tcl/BWidget-1.8.0/lang/en.rc +0 -0
  144. data/tcl/BWidget-1.8.0/lang/es.rc +0 -0
  145. data/tcl/BWidget-1.8.0/lang/fr.rc +0 -0
  146. data/tcl/BWidget-1.8.0/listbox.tcl +0 -0
  147. data/tcl/BWidget-1.8.0/mainframe.tcl +0 -0
  148. data/tcl/BWidget-1.8.0/messagedlg.tcl +0 -0
  149. data/tcl/BWidget-1.8.0/notebook.tcl +0 -0
  150. data/tcl/BWidget-1.8.0/pagesmgr.tcl +0 -0
  151. data/tcl/BWidget-1.8.0/panedw.tcl +0 -0
  152. data/tcl/BWidget-1.8.0/panelframe.tcl +0 -0
  153. data/tcl/BWidget-1.8.0/passwddlg.tcl +0 -0
  154. data/tcl/BWidget-1.8.0/pkgIndex.tcl +0 -0
  155. data/tcl/BWidget-1.8.0/progressbar.tcl +0 -0
  156. data/tcl/BWidget-1.8.0/progressdlg.tcl +0 -0
  157. data/tcl/BWidget-1.8.0/scrollframe.tcl +0 -0
  158. data/tcl/BWidget-1.8.0/scrollview.tcl +0 -0
  159. data/tcl/BWidget-1.8.0/scrollw.tcl +0 -0
  160. data/tcl/BWidget-1.8.0/separator.tcl +0 -0
  161. data/tcl/BWidget-1.8.0/spinbox.tcl +0 -0
  162. data/tcl/BWidget-1.8.0/statusbar.tcl +0 -0
  163. data/tcl/BWidget-1.8.0/tests/entry.test +0 -0
  164. data/tcl/BWidget-1.8.0/titleframe.tcl +0 -0
  165. data/tcl/BWidget-1.8.0/tree.tcl +0 -0
  166. data/tcl/BWidget-1.8.0/utils.tcl +0 -0
  167. data/tcl/BWidget-1.8.0/widget.tcl +0 -0
  168. data/tcl/BWidget-1.8.0/wizard.tcl +0 -0
  169. data/tcl/BWidget-1.8.0/xpm2image.tcl +0 -0
  170. metadata +2 -25
  171. data/ext/ae-complete-code/ae-complete-code.conf +0 -6
  172. data/ext/ae-complete-code/ae-complete-code.rb +0 -74
  173. data/ext/ae-doc-code/ae-doc-code.conf +0 -15
  174. data/ext/ae-doc-code/ae-doc-code.rb +0 -300
  175. data/ext/ae-event-log/ae-event-log.conf +0 -5
  176. data/ext/ae-event-log/ae-event-log.rb +0 -46
  177. data/ext/ae-flag/ae-flag.conf +0 -6
  178. data/ext/ae-flag/ae-flag.rb +0 -12
  179. data/ext/ae-output-event/ae-output-event.conf +0 -15
@@ -1,6 +1,6 @@
1
1
  name=editor
2
- labels=Editor
3
- frames=0.1
2
+ labels=Editor,Outline
3
+ frames=0.1,0.0
4
4
  active=yes
5
5
  require=ext/ae-editor/ae-editor
6
6
  class=AgMultiEditor
@@ -2,17 +2,21 @@
2
2
  # ae-editor.rb - Arcadia Ruby ide
3
3
  # by Antonio Galeone <antonio-galeone@rubyforge.org>
4
4
  #
5
+ # §require_dir_ref=../..
6
+ # §require_omissis=conf/arcadia.init
5
7
 
6
8
  require 'tk'
7
9
  require 'tktext'
8
10
  require 'lib/a-tkcommons'
11
+ #require 'lib/a-commons'
12
+ require 'lib/a-core'
9
13
 
10
14
  class TreeNode
11
15
  attr_reader :sons
12
16
  attr_reader :parent
13
17
  attr_reader :kind
14
- attr_reader :rif, :label, :helptext
15
- attr_writer :rif, :label, :helptext
18
+ attr_reader :rif, :rif_end, :label, :helptext
19
+ attr_writer :rif, :rif_end, :label, :helptext
16
20
  def initialize(parent=nil, kind='KClass')
17
21
  @sons = Array.new
18
22
  @parent = parent
@@ -28,6 +32,502 @@ class TreeNode
28
32
  end
29
33
  end
30
34
 
35
+ class SourceStructure
36
+ attr_reader :root
37
+ attr_reader :injected_row
38
+ def initialize(_source)
39
+ _row = 1
40
+ _liv = 0
41
+ _livs = Array.new
42
+ @root = TreeNode.new(nil, 'KRoot'){|_node|
43
+ _node.rif= 'root'
44
+ _node.label=''
45
+ }
46
+ _livs[_liv]=@root
47
+ _source.each_line{|line|
48
+ line = "\s"+line.split("#")[0]+"\s"
49
+ m = /[\s\n\t\;]+(module|class|def|if|unless|begin|case|for|while|do)[\s\n\t\;]+/.match("\s#{line}")
50
+ if m
51
+ index = m.post_match.strip.length - 1
52
+ if m.post_match.strip[index,index]=='{'
53
+ _row = _row +1
54
+ next
55
+ end
56
+ _liv>=0? _liv = _liv + 1:_liv=1
57
+ _pliv = _liv
58
+ _parent = nil
59
+ while (_parent == nil && _pliv>=0)
60
+ _pliv = _pliv -1
61
+ _parent = _livs[_pliv]
62
+ end
63
+ if _parent
64
+ _helptext = m.post_match.strip
65
+ _label = _helptext.split('<')[0]
66
+ if _label == nil || _label.strip.length==0
67
+ _label = _helptext
68
+ end
69
+ if (m[0].strip[0..4] == "class" && m.pre_match.strip.length==0)
70
+ _kind = 'KClass'
71
+ elsif (m[0].strip[0..4] == "class" && m.pre_match.strip.length>0)
72
+ _row = _row +1
73
+ _liv = _liv - 1
74
+ next
75
+ elsif (m[0].strip[0..5] == "module" && m.pre_match.strip.length==0)
76
+ _kind = 'KModule'
77
+ elsif (m[0].strip[0..5] == "module" && m.pre_match.strip.length>0)
78
+ _row = _row +1
79
+ _liv = _liv - 1
80
+ next
81
+ 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))
82
+ _row = _row +1
83
+ next
84
+ elsif ((m[0].strip[0..1] == "if" || m[0].strip[0..5] == "unless") && m.pre_match.strip.length>0)
85
+ _row = _row +1
86
+ _liv = _liv - 1
87
+ next
88
+ elsif (m[0].strip[0..2] == "def" && m.pre_match.strip.length==0)
89
+ _kind = 'KDef'
90
+ if _label.include?(_parent.label + '.')
91
+ _kind = 'KDefClass'
92
+ end
93
+ # elsif (m[0].strip[0..10] == "attr_reader" && m.pre_match.strip.length==0)
94
+ # _kind = 'KAttr_reader'
95
+ # _liv = _liv - 1
96
+ # _row = _row +1
97
+ end
98
+
99
+ if _livs[_liv-1] && _livs[_liv-1].kind != 'KDef'
100
+ TreeNode.new(_parent, _kind){|_node|
101
+ _node.label = _label
102
+ _node.helptext = _helptext
103
+ _node.rif = _row.to_s
104
+ _livs[_pliv + 1]=_node
105
+ }
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
+ else
115
+ TreeNode.new(_livs[_liv-3], _kind){|_node|
116
+ _node.label = _label
117
+ _node.helptext = _helptext
118
+ _node.rif = _row.to_s
119
+ _livs[_pliv-1]=_node
120
+ }
121
+ _liv = _liv - 2
122
+ end
123
+ else
124
+ _row = _row +1
125
+ _liv = _liv - 1
126
+ next
127
+ end
128
+ end
129
+ m_end = /[\s\n\t\;]+end[\s\n\t\;]+/.match(line)
130
+ if m_end
131
+ if _livs[_liv]
132
+ _livs[_liv].rif_end = _row
133
+ #p "#{_livs[_liv].helptext} rif_end = #{_livs[_liv].rif_end}"
134
+ end
135
+ _liv = _liv - 1
136
+ end
137
+ _row = _row +1
138
+ }
139
+ end
140
+
141
+ def scheletor_from_node(_node, _source='', _injected_source='', _injected_class='')
142
+ _hinner_source = ''
143
+ #_sons = _node.sons.sort
144
+ _sons = _node.sons
145
+ for inode in 0.._sons.length - 1
146
+ _son = _sons[inode]
147
+ if _son.kind == 'KClass'
148
+ _hinner_source = "#{_hinner_source}class #{_son.helptext}\n"
149
+ elsif _son.kind == 'KModule'
150
+ _hinner_source = "#{_hinner_source}module #{_son.helptext}\n"
151
+ elsif _son.kind == 'KDef' && _son.helptext != 'initialize'
152
+
153
+ _hinner_source = "#{_hinner_source} def #{_son.helptext}\n"
154
+ _hinner_source = "#{_hinner_source} end\n"
155
+ elsif _son.kind == 'KDefClass'
156
+ _hinner_source = "#{_hinner_source} def #{_son.helptext}\n"
157
+ _hinner_source = "#{_hinner_source} end\n"
158
+ end
159
+ _hinner_source= scheletor_from_node(_son, _hinner_source, _injected_source, _injected_class)
160
+ end
161
+ _source = "#{_source}#{_hinner_source}" if _hinner_source.strip.length>0
162
+ if _node.kind == 'KClass' && _node.label == _injected_class
163
+ _source = "#{_source} def initialize\n #{_injected_source} end\n"
164
+ @injected_row = _source.split("\n").length-2
165
+ end
166
+ _source = "#{_source}end\n" if _node.kind == 'KClass' || _node.kind == 'KModule'
167
+ _source
168
+ end
169
+
170
+
171
+
172
+ def node_by_line(_from_node, _line)
173
+ _found_node = nil
174
+ _begin = _from_node.rif.to_i
175
+ _end = _from_node.rif_end.to_i
176
+ if _line.to_i <= _end && _line.to_i >= _begin
177
+ _found_node = _from_node
178
+ else
179
+ _sons = _from_node.sons
180
+ for inode in 0.._sons.length - 1
181
+ _son = _sons[inode]
182
+ _found_node = node_by_line(_son, _line)
183
+ break if _found_node
184
+ end
185
+ end
186
+ return _found_node
187
+ end
188
+
189
+
190
+ def class_node_by_line(_line)
191
+ line_node = node_by_line(@root, _line)
192
+ class_node = line_node
193
+ while class_node != nil && class_node.kind != "KClass"
194
+ class_node = class_node.parent
195
+ end
196
+ return class_node
197
+ end
198
+
199
+ def classies
200
+ end
201
+ def modules
202
+ end
203
+ def class_methods(_class)
204
+ end
205
+
206
+
207
+ end
208
+
209
+ class SafeCompleteCode
210
+ attr_reader :modified_row, :modified_col
211
+ attr_reader :filter
212
+ def initialize(_source, _row, _col, _file=nil)
213
+ @source = _source
214
+ @file = _file
215
+ @row = _row.to_i
216
+ @col = _col.to_i
217
+ @ss = SourceStructure.new(_source)
218
+ @filter=''
219
+ #@candidates = Array.new
220
+ process_source
221
+ end
222
+
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
+ def dot_trip(_var_name)
234
+ 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
+ ret = ret +" _methods=#{_var_name}.methods\n"
241
+ ret = ret +"owner_on = Method.instance_methods.include?('owner')\n"
242
+ ret = ret + "_methods.each{|m|\n"
243
+ ret = ret + "meth = #{_var_name}.method(m)\n"
244
+ ret = ret +"if owner_on\n"
245
+ ret = ret +"_owner=meth.owner.name\n"
246
+ ret = ret +"else\n"
247
+ ret = ret +"meth_insp = meth.inspect\n"
248
+ ret = ret +"to_sub ='#<Method:\s'+_class\n"
249
+ ret = ret +"_owner=meth_insp.sub(to_sub,'').split('#')[0].strip.sub('(','').sub(')','')\n"
250
+ ret = ret +"_owner=_class if _owner.strip.length==0\n"
251
+ ret = ret +"end\n"
252
+ ret = ret + "if _owner != _class\n"
253
+ ret = ret + "print _owner+'#'+m+'#'+meth.arity.to_s+'\n'\n"
254
+ ret = ret +"else\n"
255
+ ret = ret + "print ''+'#'+m+'#'+meth.arity.to_s+'\n'\n"
256
+ ret = ret +"end\n"
257
+ ret = ret + "}\n"
258
+ ret = ret + "exit\n"
259
+ ret
260
+ end
261
+
262
+ def scope_trip
263
+ ret = "ObjectSpace.each_object(Class){|o|\n"
264
+ ret = ret + " o_name = o.name\n"
265
+ ret = ret + " print '#'+o_name+'\n' if o_name && o_name.strip.length>0 \n"
266
+ ret = ret + "}\n"
267
+ ret = ret + dot_trip('self')
268
+ ret
269
+ end
270
+
271
+ def declaration(_dec_line='')
272
+ if _dec_line.include?('.new')
273
+ pre, post = _dec_line.split('.new')
274
+ dec_line_processed = "#{pre}.new"
275
+ post.strip!
276
+ if post && post[0..0]=='('
277
+ k=0
278
+ ch = '('
279
+ while k < post.length && ch != ')'
280
+ k = k+1
281
+ ch=post[k..k]
282
+ end
283
+ if ch == ')'
284
+ args = post[1..k-1]
285
+ args_array = args.split(',')
286
+ n_args = args_array.length
287
+ if n_args > 0
288
+ new_args = ''
289
+ 1.upto( n_args ){
290
+ if new_args.length > 0
291
+ new_args = "#{new_args},"
292
+ end
293
+ new_args = "#{new_args}nil"
294
+ }
295
+ dec_line_processed = "#{dec_line_processed}(#{new_args})"
296
+ end
297
+ end
298
+ end
299
+ else
300
+ dec_line_processed = _dec_line
301
+ end
302
+ dec_line_processed
303
+ end
304
+
305
+ def is_dot?
306
+ @is_dot
307
+ end
308
+
309
+ def process_source
310
+ @modified_source = ""
311
+ @modified_row = @row
312
+ @modified_col = @col
313
+ source_array = @source.split("\n")
314
+ #---------------------------------
315
+ focus_line = source_array[@row-1]
316
+ focus_line = '' if focus_line.nil?
317
+ focus_world = ''
318
+ if focus_line && focus_line.strip.length > 0
319
+ if focus_line[@col-1..@col-1] == '.'
320
+ @is_dot=true
321
+ focus_segment = focus_line[0..@col-2]
322
+ elsif focus_line.include?('.')
323
+ @is_dot=true
324
+ focus_segment_array = focus_line.split('.')
325
+ focus_segment = ''
326
+ focus_segment_array[0..-2].each{|seg|
327
+ if focus_segment.strip.length > 0
328
+ focus_segment = focus_segment+'.'
329
+ end
330
+ focus_segment = focus_segment+seg
331
+ }
332
+ @filter = focus_segment_array[-1].strip
333
+ else
334
+ focus_segment = ''
335
+ @filter = focus_word(focus_line[0..@col-1].strip)
336
+ end
337
+ focus_world= focus_word(focus_segment)
338
+ end
339
+ @class_node = @ss.class_node_by_line(@row)
340
+ #---------------------------------
341
+ @modified_source = "#{@modified_source}Dir.chdir('#{File.dirname(@file)}')\n" if @file
342
+ @modified_row = @modified_row+1
343
+ source_array.each_with_index{|line,j|
344
+ # 0) se è un commento non lo prendo in considerazione
345
+ if line.strip.length > 0 && line.strip[0..0]=='#'
346
+ @modified_row = @modified_row-1
347
+ m = /§require_dir_ref=[\s]*(.)*/.match(line)
348
+ if m
349
+ require_dir_ref=line.split('§require_dir_ref=')[1].strip
350
+ @modified_source = "#{@modified_source}Dir.chdir('#{require_dir_ref}')\n"
351
+ @modified_row = @modified_row+1
352
+ end
353
+ m = /§require_omissis=[\s]*(.)*/.match(line)
354
+ if m
355
+ require_omissis=line.split('§require_omissis=')[1].strip
356
+ @modified_source = "#{@modified_source}require '#{require_omissis}'\n"
357
+ @modified_row = @modified_row+1
358
+ end
359
+
360
+
361
+ # 1) includiano i require
362
+ elsif line.strip.length>7 && (line.strip[0..7]=="require " || line.strip[0..7]=="require(")
363
+ @modified_source = "#{@modified_source}#{line}\n"
364
+ #@modified_row = @modified_row+1
365
+ #Arcadia.console(self, 'msg'=>"per require @modified_row=#{@modified_row}")
366
+ # 2) includiano la riga da evaluare con un $SAFE 3
367
+ elsif j.to_i == @row-1
368
+ focus_line = line
369
+ break
370
+ # 3) eliminiamo la riga
371
+ else
372
+ @modified_row = @modified_row-1
373
+ end
374
+ break if j.to_i >= @row - 1
375
+ }
376
+ if focus_line
377
+ # ricerchiamo una eventuale dichiarazione
378
+ if focus_world && focus_world.strip.length > 0
379
+ begin
380
+ re = Regexp::new('[\s\n\t\;]('+focus_world.strip+')[\s\t]*=(.)*')
381
+ source_array.each_with_index do |line,j|
382
+ #m = /[\s\n\t\;](#{focus_world})[\s\t]*=(.)*/.match(line)
383
+
384
+ m = re.match("\s#{line}")
385
+ if m
386
+ @dec_line = line
387
+ @class_dec_line_node = @ss.class_node_by_line(j+1)
388
+ break
389
+ end
390
+ end
391
+ rescue Exception => e
392
+ # Arcadia.console(self, 'msg'=>e.inspect, 'level'=>'error')
393
+ end
394
+
395
+ end
396
+
397
+ if @class_node
398
+ to_iniect = "$SAFE = 3\n"
399
+ if @class_dec_line_node && @class_dec_line_node.label == @class_node.label
400
+ to_iniect = "#{to_iniect}#{declaration(@dec_line)}\n"
401
+ end
402
+ if focus_world.length > 0
403
+ to_iniect = "#{to_iniect}#{dot_trip(focus_world)}\n"
404
+ else
405
+ to_iniect = "#{to_iniect}#{scope_trip}\n"
406
+ end
407
+ #to_iniect = "#{to_iniect}#{focus_line}\n"
408
+ to_iniect_class = @class_node.label
409
+ else
410
+ to_iniect = ''
411
+ to_iniect_class = ''
412
+ end
413
+
414
+ ss_source = @ss.scheletor_from_node(@ss.root,'',to_iniect, to_iniect_class)
415
+ ss_source_array = ss_source.split("\n")
416
+ ss_len = ss_source_array.length
417
+ if ss_len>0 && ss_source_array[0].strip != focus_line.strip
418
+ @modified_source = "#{@modified_source}#{ss_source}"
419
+ if @class_node
420
+ @modified_source = "#{@modified_source}#{@class_node.label.downcase} = #{@class_node.label}.new\n"
421
+ end
422
+ else
423
+ ss_len = 0
424
+ @class_node = nil
425
+ end
426
+ if @class_node
427
+ @modified_row = @modified_row + @ss.injected_row
428
+ else
429
+ @modified_source = "#{@modified_source}$SAFE = 3\n"
430
+ if @dec_line
431
+
432
+
433
+ @modified_source = "#{@modified_source}#{declaration(@dec_line)}\n"
434
+ @modified_row = @modified_row+1
435
+ end
436
+ #@modified_source = "#{@modified_source}_candidates=@candidates\n"
437
+ if focus_world.length > 0
438
+ @modified_source = "#{@modified_source}#{dot_trip(focus_world)}\n"
439
+ else
440
+ @modified_source = "#{@modified_source}#{scope_trip}\n"
441
+ end
442
+ #@modified_source = "#{@modified_source}@candidates=_candidates\n"
443
+
444
+
445
+ #@modified_source = "#{@modified_source}#{focus_line}\n"
446
+ @modified_row = @modified_row+1+ss_len
447
+ end
448
+ end
449
+
450
+ # Arcadia.console(self, 'msg'=>@modified_source)
451
+ # Arcadia.console(self, 'msg'=>"@modified_row=#{@modified_row}")
452
+ # Arcadia.console(self, 'msg'=>"focus_line=#{focus_line}") if focus_line
453
+ # Arcadia.console(self, 'msg'=>"focus_world=#{focus_world}") if focus_world
454
+ # Arcadia.console(self, 'msg'=>"@filter=#{@filter}") if @filter
455
+ # Arcadia.console(self, 'msg'=>"@dec_line=#{@dec_line}") if @dec_line
456
+ # Arcadia.console(self, 'msg'=>"declaration(@dec_line)=#{declaration(@dec_line)}") if @dec_line
457
+ end
458
+
459
+ def focus_word(focus_segment)
460
+ focus_world = ''
461
+ j = focus_segment.length - 1
462
+ char = focus_segment[j..j]
463
+ if char != ')'
464
+ while !["\s","\t",";",",","(","[","{",">"].include?(char) && j >= 0
465
+ focus_world = "#{char}#{focus_world}"
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
475
+ end
476
+ focus_world
477
+ end
478
+
479
+ def candidates(_show_error = false)
480
+ temp_file = create_temp_file(@file)
481
+ begin
482
+ _cmp_s = "|ruby #{temp_file}"
483
+ _ret = nil
484
+ open(_cmp_s,"r") do
485
+ |f|
486
+ _ret = f.readlines.collect!{| line |
487
+ #line.chomp
488
+ line
489
+ }
490
+ end
491
+ # if _ret.length == 0 && _show_error
492
+ # _cmp_s_d = _cmp_s+" 2>&1"
493
+ # _error = nil
494
+ # open(_cmp_s_d,"r") do
495
+ # |f|
496
+ # _error = f.readlines.collect!{| line | line.chomp}
497
+ # end
498
+ # if _error != nil && _error.length > 0
499
+ # Arcadia.console(self, 'msg'=>_error.to_s, 'level'=>'error')
500
+ # end
501
+ # end
502
+ _ret.sort
503
+ rescue Exception => e
504
+ # Arcadia.console(self, 'msg'=>e.to_s, 'level'=>'error')
505
+ ensure
506
+ File.delete(temp_file) if File.exist?(temp_file)
507
+ end
508
+ end
509
+
510
+
511
+ def create_temp_file(_base_file=nil)
512
+ if _base_file
513
+ _file = _base_file+'~~'
514
+ else
515
+ _file = 'buffer~~'
516
+ end
517
+ f = File.new(_file, "w")
518
+ begin
519
+ if f
520
+ f.syswrite(@modified_source)
521
+ end
522
+ ensure
523
+ f.close unless f.nil?
524
+ end
525
+ _file
526
+ end
527
+
528
+ end
529
+
530
+
31
531
  #class TkArcadiaText < TkText
32
532
  #
33
533
  # def insert(insert, chars,*tags)
@@ -37,6 +537,90 @@ end
37
537
  # end
38
538
  #end
39
539
 
540
+
541
+ class TkTextListBox < TkScrollText
542
+ def initialize(parent=nil, keys={})
543
+ super(parent, keys)
544
+ wrap 'none'
545
+ tag_configure('selected','background' =>'#bbd9b1','borderwidth'=>1, 'relief'=>'raised')
546
+ tag_configure('class', 'foreground' => '#3398cb')
547
+ @count = 0
548
+ @selected = -1
549
+ self.bind_append('KeyPress'){|e| key_press(e)}
550
+ self.bind_append('KeyRelease'){|e| key_release(e)}
551
+ self.bind_append("ButtonPress-1", proc{|x,y| button_press(x,y)}, "%x %y")
552
+ end
553
+
554
+
555
+ def insert(index, chars, *tags)
556
+ super(index, chars, *tags)
557
+ end
558
+
559
+ def add(chars)
560
+ meth_str, class_str = chars.split('-')
561
+ if meth_str && meth_str.strip.length>0 && class_str
562
+ insert('end', "#{meth_str}")
563
+ insert('end', "-#{class_str}\n", 'class')
564
+ elsif meth_str && meth_str.strip.length==0 && class_str
565
+ insert('end', "-#{class_str}\n")
566
+ else
567
+ insert('end', "#{chars}\n")
568
+ end
569
+ @count = @count+1
570
+ end
571
+
572
+ def clear
573
+ delete('1.0','end')
574
+ @count = 0
575
+ end
576
+
577
+ def button_press(x,y)
578
+ _index = self.index("@#{x},#{y}")
579
+ _line = _index.split('.')[0].to_i
580
+ self.select(_line)
581
+ end
582
+
583
+ def key_press(_e)
584
+ case _e.keysym
585
+ when 'Up'
586
+ if @selected > 0
587
+ select(@selected-1)
588
+ end
589
+ when 'Down'
590
+ if @selected < @count
591
+ select(@selected+1)
592
+ end
593
+ end
594
+ end
595
+
596
+ def key_release(_e)
597
+ case _e.keysym
598
+ when 'Next','Prior'
599
+ index = self.index('@0,0')
600
+ line = index.split('.')[0].to_i
601
+ select(line)
602
+ end
603
+ end
604
+
605
+ def selected_line
606
+ if @selected > 0
607
+ self.get("#{@selected}.0", "#{@selected}.0 lineend")
608
+ end
609
+ end
610
+
611
+ def select(_row)
612
+ self.tag_remove('selected', '1.0', 'end')
613
+ _start_index = "#{_row.to_s}.0"
614
+ _end_index = "#{_start_index} +1 lines linestart"
615
+ self.tag_add('selected', _start_index, _end_index)
616
+ self.set_insert(_start_index)
617
+ self.see(_start_index)
618
+ @selected = _row
619
+ end
620
+
621
+ end
622
+
623
+
40
624
  class AgEditor
41
625
  include Configurable
42
626
  attr_reader :file
@@ -60,37 +644,31 @@ class AgEditor
60
644
  @loading=false
61
645
  end
62
646
 
63
- def hide_exp
64
- @fm.hide_left if @fm
65
- end
647
+ # def hide_exp
648
+ # @fm.hide_left if @fm
649
+ # end
66
650
 
67
- def is_exp_hide?
68
- if @fm.nil?
69
- return true
70
- else
71
- @fm.is_left_hide?
72
- end
651
+ # def is_exp_hide?
652
+ # if @fm.nil?
653
+ # return true
654
+ # else
655
+ # @fm.is_left_hide?
656
+ # end
657
+ # end
658
+
659
+ def xy_insert
660
+ _index_now = @text.index('insert')
661
+ _rx, _ry, _widht, _heigth = @text.bbox(_index_now);
662
+ _x = _rx + TkWinfo.rootx(@text)
663
+ _y = _ry + TkWinfo.rooty(@text) + @font_metrics[2][1]
664
+ _xroot = _x - TkWinfo.rootx(Arcadia.instance.layout.root)
665
+ _yroot = _y - TkWinfo.rooty(Arcadia.instance.layout.root)
666
+ return _xroot, _yroot
73
667
  end
74
668
 
669
+
75
670
  def initialize_tree(_frame)
76
- @classbrowsing = true
77
-
78
- @nb = Tk::BWidget::NoteBook.new(_frame, Arcadia.style('tabpanel')){
79
- # activeforeground 'red'
80
- # activebackground 'yellow'
81
- # borderwidth 1
82
- # font $arcadia['conf']['editor.tabs.font']
83
- tabbevelsize 0
84
- internalborderwidth 0
85
- side $arcadia['conf']['editor.explorer_panel.tabs.side']
86
- pack('fill'=>'both', :padx=>0, :pady=>0, :expand => 'yes')
87
- }
88
- @nb_tab_exp = @nb.insert('end','exp' ,
89
- 'text'=>'Source Tree',
90
- 'background'=> Arcadia.style("tabpanel.background"),
91
- 'foreground'=> Arcadia.style("tabpanel.foreground")
92
- )
93
- @nb.raise('exp')
671
+ @classbrowsing = @is_ruby
94
672
  _tree_goto = proc{|_self|
95
673
  _line = _self.selection_get[0]
96
674
  _index =_line.to_s+'.0'
@@ -98,7 +676,6 @@ class AgEditor
98
676
  _editor_line = @text.get(_index, _index+ ' lineend')
99
677
  if !_editor_line.include?(_hinner_text)
100
678
  Arcadia.console(self, 'msg'=>"... rebuild tree \n")
101
- #Arcadia.new_msg(self, "... rebuild tree \n")
102
679
  if @tree_thread && @tree_thread.alive?
103
680
  @tree_thread.exit
104
681
  end
@@ -113,24 +690,16 @@ class AgEditor
113
690
  @text.tag_remove('selected','1.0','end')
114
691
  @text.tag_add('selected',_line.to_s+'.0',(_line+1).to_s+'.0')
115
692
  }
116
- @tree_exp = Tk::BWidget::Tree.new(@nb_tab_exp, Arcadia.style('treepanel')){
117
- #background Arcadia.conf('edit.background')
118
- #relief Arcadia.conf('edit.relief')
119
- #highlightbackground Arcadia.conf('edit.highlightbackground')
120
- #borderwidth Arcadia.conf('edit.borderwidth')
693
+ @tree_exp = Tk::BWidget::Tree.new(_frame, Arcadia.style('treepanel')){
121
694
  showlines false
122
695
  deltay 18
123
696
  dragenabled true
124
697
  selectcommand proc{ _tree_goto.call(self) }
125
- place('relwidth' => 1,'relx' => 0,'x' => '0','y' => '0','relheight' => '1','rely' => 0,'height' => 1,'bordermode' => 'inside','width' => '50')
126
698
  }
127
-
128
- _c_explo = proc{|*args| @tree_exp.yview(*args)}
129
- _s_explo = TkScrollbar.new(@nb_tab_exp, Arcadia.style('scrollbar')){|s|
130
- width 8
131
- command _c_explo
132
- }.pack('side'=>'right', 'fill'=>'y')
133
- @tree_exp.yscrollcommand proc{|first,last| _s_explo.set first,last}
699
+ @tree_scroll_wrapper = TkScrollWidget.new(@tree_exp)
700
+ @tree_scroll_wrapper.show
701
+ @tree_scroll_wrapper.show_v_scroll
702
+ @tree_scroll_wrapper.show_h_scroll
134
703
  pop_up_menu_tree
135
704
  end
136
705
 
@@ -158,34 +727,37 @@ class AgEditor
158
727
 
159
728
 
160
729
  def initialize_text(_frame)
161
- @v_scroll = TkScrollbar.new(_frame,{
162
- 'orient'=>'vertical'}.update(Arcadia.style('scrollbar'))
163
- ).pack('side' => 'right', 'fill' => 'y')
164
- @text = TkText.new(@fm1.right_frame, Arcadia.style('edit')){|j|
730
+ # @v_scroll = TkScrollbar.new(_frame,{
731
+ # 'orient'=>'vertical'}.update(Arcadia.style('scrollbar'))
732
+ # ).pack('side' => 'right', 'fill' => 'y')
733
+ @text = TkScrollText.new(_frame, Arcadia.style('edit')){|j|
165
734
  wrap 'none'
166
- # relief 'flat'
167
735
  undo true
168
736
  insertofftime 200
169
737
  insertontime 200
170
- # insertbackground $arcadia['conf']['editor.color.insertbackground']
171
- # background $arcadia['conf']['editor.color.background']
172
- # foreground $arcadia['conf']['editor.color.foreground']
173
- # highlightcolor $arcadia['conf']['editor.color.background']
174
738
  highlightthickness 0
175
739
  insertwidth 3
176
740
  exportselection true
177
741
  autoseparators true
178
742
  padx 0
179
743
  tabs $arcadia['conf']['editor.tabs']
180
- place(
181
- 'x'=>0,
182
- 'y'=>0,
183
- 'width' => -15,
184
- 'relheight'=>1,
185
- 'relwidth'=>1,
186
- 'bordermode'=>'outside'
187
- )
744
+ # place(
745
+ # 'x'=>0,
746
+ # 'y'=>0,
747
+ # 'width' => -15,
748
+ # 'relheight'=>1,
749
+ # 'relwidth'=>1,
750
+ # 'bordermode'=>'outside'
751
+ # )
188
752
  }
753
+
754
+ # class << @text
755
+ # def do_yscrollcommand(first,last)
756
+ # super
757
+ # do_line_update()
758
+ # end
759
+ # end
760
+
189
761
  # @text.configure('font', @font);
190
762
 
191
763
  #do_tag_configure_global('debug')
@@ -194,6 +766,11 @@ class AgEditor
194
766
  #@text.tag_configure('debug', 'background' =>'#b9c6d9', 'borderwidth'=>1 ,'relief'=>'raise')
195
767
  @buffer = text_value
196
768
  pop_up_menu
769
+ @text.show
770
+ @text.show_v_scroll
771
+ @text.show_h_scroll
772
+ @text_cursor = @text.cget('cursor')
773
+
197
774
  end
198
775
 
199
776
  def create_temp_file
@@ -212,27 +789,333 @@ class AgEditor
212
789
  end
213
790
  _file
214
791
  end
792
+
793
+ def create_temp_file_for_completion(_row)
794
+ _custom_text = ""
795
+ text_value_array = text_value.split("\n")
796
+ text_value_array.each_with_index{|line,j|
797
+ # 1) includiano i require e la riga da includere
798
+ if line.include?("require") || j.to_i == _row.to_i-1
799
+ _custom_text = "#{_custom_text}#{line}\n"
800
+ #p "inserisco=>#{line} alla riga=>#{j}"
801
+ elsif j.to_i == _row.to_i-2
802
+ _custom_text = "#{_custom_text}$SAFE = 3\n"
803
+ else
804
+ _custom_text = "#{_custom_text}\n"
805
+ #p "inserisco=>blank alla riga=>#{j}"
806
+ end
807
+ #p "riga:#{j}"
808
+ break if j.to_i >= _row.to_i - 1
809
+ }
810
+ Arcadia.console(self, 'msg'=>_custom_text)
811
+
812
+ if @file
813
+ _file = @file+'~~'
814
+ else
815
+ _file = 'buffer~~'
816
+ end
817
+ f = File.new(_file, "w")
818
+ begin
819
+ if f
820
+ f.syswrite(_custom_text)
821
+ end
822
+ ensure
823
+ f.close unless f.nil?
824
+ end
825
+ _file
826
+ end
827
+
828
+ def complete_code_begin
829
+ @n_complete_task = 1
830
+ @text.configure('cursor'=> 'hand2')
831
+ #disactivate_key_binding
832
+ end
833
+
834
+ def complete_code_end
835
+ @text.configure('cursor'=> @text_cursor)
836
+ #activate_key_binding
837
+ @n_complete_task = 0
838
+ end
839
+
840
+
841
+ def complete_code
842
+ @do_complete = @do_complete && @controller.accept_complete_code
843
+ if @do_complete
844
+ line, col = @text.index('insert').split('.')
845
+ mss = SafeCompleteCode.new(text_value, line.to_i, col.to_i, @file)
846
+ candidates = mss.candidates
847
+ raise_complete_code(candidates, line.to_s, col.to_s, mss.filter) if candidates && candidates.length > 0
848
+ end
849
+ end
215
850
 
216
- def initialize_complete_code
217
- complete_code = proc{
218
- if @do_complete
219
- line, col = @text.index('insert').split('.')
220
- _file = create_temp_file
221
- #EditorContract.instance.complete_code(self, 'file'=>_file, 'line'=>line.to_s, 'col'=>col.to_s)
222
- begin
223
- event = Arcadia.process_event(CompleteCodeEvent.new(self, 'file'=>_file, 'row'=>line.to_s, 'col'=>col.to_s))
224
- ensure
225
- File.delete(_file) if File.exist?(_file)
226
- end
851
+ def arity_to_str(_arity=0)
852
+ ret = ''
853
+ jolly_args = _arity < 0
854
+ if jolly_args
855
+ _arity = _arity.abs - 1
856
+ end
857
+ j = _arity
858
+ while j > 0
859
+ if ret.strip.length > 0
860
+ ret = "#{ret},"
861
+ end
862
+ ret = "#{ret}arg#{_arity-j+1}"
863
+ j = j-1
864
+ end
865
+ if jolly_args
866
+ if ret.strip.length > 0
867
+ ret = "#{ret},"
868
+ end
869
+ ret = "#{ret}*"
870
+ end
871
+ ret
872
+ end
873
+
874
+
875
+ def raise_complete_code(_candidates, _row, _col, _filter='')
876
+ @raised_listbox_frame.destroy if @raised_listbox_frame != nil
877
+ #@raised_listbox.destroy if @raised_listbox != nil
878
+ _index_call = _row+'.'+_col
879
+ _index_now = @text.index('insert')
880
+ if _index_call == _index_now
881
+ _target = @text.get('insert - 1 chars wordstart','insert')
882
+ if _target.strip == '('
883
+ _target = @text.get('insert - 2 chars wordstart','insert')
884
+ end
885
+ if _target.strip.length > 0 && _target != '.'
886
+ extra_len = _target.length.+@
887
+ _begin_index = _index_now<<' - '<<extra_len.to_s<<' chars'
888
+ @text.tag_add('sel', _begin_index, _index_now)
889
+ else
890
+ _begin_index = _index_now
891
+ extra_len = 0
227
892
  end
228
- @controller.raise_complete_code(event) if @do_complete
229
- }
893
+ if _candidates.length >= 1
894
+ _rx, _ry, _widht, heigth = @text.bbox(_begin_index);
895
+ _x = _rx + TkWinfo.rootx(@text)
896
+ _y = _ry + TkWinfo.rooty(@text) + @font_metrics[2][1]
897
+ _xroot = _x - TkWinfo.rootx(Arcadia.instance.layout.root)
898
+ _yroot = _y - TkWinfo.rooty(Arcadia.instance.layout.root)
899
+
900
+ _max_height = TkWinfo.screenheight(Arcadia.instance.layout.root) - _y - 5
901
+ self.complete_code_begin
902
+
903
+ # @raised_listbox_frame = TkResizingTitledFrame.new(Arcadia.instance.layout.root)
904
+ @raised_listbox_frame = TkFrame.new(Arcadia.instance.layout.root, {
905
+ :padx=>"1",
906
+ :pady=>"1",
907
+ :background=> Arcadia.conf("foreground")
908
+ })
909
+
910
+ @raised_listbox = TkTextListBox.new(@raised_listbox_frame, {
911
+ :takefocus=>true,
912
+ :selectbackground=>Arcadia.conf('hightlight.1.background'),
913
+ :selectforeground=>Arcadia.conf('hightlight.1.foreground')}.update(Arcadia.style('listbox'))
914
+ )
915
+ _char_height = @font_metrics[2][1]
916
+ _width = 0
917
+ _docs_entries = Hash.new
918
+ _item_num = 0
919
+ _update_list = proc{|_in|
920
+ _in.strip!
921
+ @raised_listbox.clear
922
+ _length = 0
923
+ _candidates.each{|value|
924
+ _doc = value.strip
925
+ _class, _key, _arity = _doc.split('#')
926
+ if _key && _arity
927
+ args = arity_to_str(_arity.to_i)
928
+ if args.length > 0
929
+ _key = "#{_key}(#{args})"
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
950
+ end
951
+ }
952
+ _width = _length*8
953
+ @raised_listbox.select(1)
954
+ # p "_update_list end-->#{Time.new}"
230
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
970
+
971
+ _to_search = 'arg1'
972
+ _argindex = @text.search(_to_search,_begin_index)
973
+ if !(_argindex && _argindex.length>0)
974
+ _to_search = '*'
975
+ _argindex = @text.search(_to_search,_begin_index)
976
+ end
977
+ if _argindex && _argindex.length>0
978
+ _argrow, _argcol = _argindex.split('.')
979
+ if _argrow.to_i == _row.to_i
980
+ _argindex_sel_end = _argrow.to_i.to_s+'.'+(_argcol.to_i+_to_search.length).to_i.to_s
981
+ @text.tag_add('sel', _argindex,_argindex_sel_end)
982
+ @text.set_insert(_argindex)
983
+ end
984
+ end
985
+ end
986
+
987
+ Tk.callback_break
988
+ }
989
+ _update_list.call(_filter)
990
+ if _item_num == 0
991
+ @raised_listbox_frame.destroy
992
+ self.complete_code_end
993
+ return
994
+ elsif _item_num == 1
995
+ _insert_selected_value.call
996
+ return
997
+ 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
+
1003
+ _buffer = @text.get(_begin_index, 'insert')
1004
+ _buffer_ini_length = _buffer.length
1005
+ @raised_listbox_frame.place('x'=>_xroot,'y'=>_yroot, 'width'=>_width, 'height'=>_height)
1006
+ @raised_listbox.show(0,0,'inside')
1007
+ @raised_listbox.show_v_scroll
1008
+ @raised_listbox.focus
1009
+ #@raised_listbox.activate(0)
1010
+ @raised_listbox.select(1)
1011
+ @raised_listbox_frame.grab("set")
1012
+ # Tk.event_generate(@raised_listbox, "1")
1013
+
1014
+
1015
+ @raised_listbox.bind_append("Double-ButtonPress-1",
1016
+ proc{|x,y|
1017
+ _index = @raised_listbox.index("@#{x},#{y}")
1018
+ _line = _index.split('.')[0].to_i
1019
+ @raised_listbox.select(_line)
1020
+ _insert_selected_value.call
1021
+ }, "%x %y")
1022
+ @raised_listbox.bind_append('Shift-KeyPress'){|e|
1023
+ # todo
1024
+ case e.keysym
1025
+ when 'parenleft'
1026
+ @text.insert('insert','(')
1027
+ _buffer = _buffer + '('
1028
+ _item_num = 0
1029
+ _update_list.call(_buffer)
1030
+ if _item_num == 1
1031
+ _insert_selected_value.call
1032
+ end
1033
+ Tk.callback_break
1034
+ when 'A'..'Z','equal','greater'
1035
+ if e.keysym == 'equal'
1036
+ ch = '='
1037
+ elsif e.keysym == 'greater'
1038
+ ch = '>'
1039
+ else
1040
+ ch = e.keysym
1041
+ end
1042
+ @text.insert('insert',ch)
1043
+ _buffer = _buffer + ch
1044
+ _update_list.call(_buffer)
1045
+ Tk.callback_break
1046
+ else
1047
+ if e.keysym.length > 1
1048
+ p ">#{e.keysym}<"
1049
+ Tk.callback_break
1050
+ end
1051
+ end
1052
+ }
1053
+ @raised_listbox.bind_append('KeyPress'){|e|
1054
+ case e.keysym
1055
+ when 'Escape'
1056
+ @raised_listbox.grab("release")
1057
+ @raised_listbox_frame.destroy
1058
+ complete_code_end
1059
+ @text.focus
1060
+ #_menu.destroy
1061
+ Tk.callback_break
1062
+ # when 'Return'
1063
+ # _insert_selected_value.call
1064
+ when 'F1'
1065
+ _key = @raised_listbox.selected_line.split('-')[0].strip
1066
+ _x, _y = xy_insert
1067
+ Arcadia.process_event(DocCodeEvent.new(self, 'doc_entry'=>_docs_entries[_key], 'xdoc'=>_x, 'ydoc'=>_y))
1068
+ #EditorContract.instance.doc_code(self, 'doc_entry'=>_docs_entries[_key], 'xdoc'=>_x, 'ydoc'=>_y)
1069
+ when 'a'..'z','less','space'
1070
+ if e.keysym == 'less'
1071
+ ch = '<'
1072
+ elsif e.keysym == 'space'
1073
+ ch = ''
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'
1090
+ else
1091
+ Tk.callback_break
1092
+ end
1093
+ }
1094
+ @raised_listbox.bind_append('KeyRelease'){|e|
1095
+ case e.keysym
1096
+ when 'Return'
1097
+ _insert_selected_value.call
1098
+ end
1099
+ }
1100
+ elsif _candidates.length == 1 && _candidates[0].length>0
1101
+ @text.delete(_begin_index,'insert');
1102
+ @text.insert('insert',_candidates[0].split[0])
1103
+ complete_code_end
1104
+ end
1105
+ end
1106
+ end
1107
+
1108
+
1109
+ def activate_complete_code_key_binding
1110
+ @n_complete_task = 0
1111
+ # key binding for complete code
231
1112
  @text.bind_append("Control-KeyPress"){|e|
232
1113
  case e.keysym
233
1114
  when 'space'
234
- @do_complete = true
235
- complete_code.call
1115
+ if @n_complete_task == 0
1116
+ @do_complete = true
1117
+ complete_code
1118
+ end
236
1119
  end
237
1120
  }
238
1121
 
@@ -243,38 +1126,23 @@ class AgEditor
243
1126
  @text.bind_append("KeyRelease"){|e|
244
1127
  case e.keysym
245
1128
  when 'period'
246
- @do_complete = true
247
- complete_code.call
248
- end
249
- }
250
- end
251
-
252
- def initialize_text_binding
253
- @v_scroll.command(proc{|*args|
254
- @text.yview *args
255
- })
256
- @text.yscrollcommand(proc{|first,last| @v_scroll.set(first,last)
257
- #Arcadia.console(self, 'msg'=>"eseguo ---> do_line_update")
258
- self.do_line_update()
259
- })
260
- @text.tag_bind('selected', 'Enter', proc{@text.tag_remove('selected','1.0','end')})
261
-
262
- @text.bind("Enter", proc{check_file_last_access_time})
263
-
264
- # complete_code = proc{
265
- # if @do_complete
266
- # line, col = @text.index('insert').split('.')
267
- # _file = create_temp_file
268
- # #EditorContract.instance.complete_code(self, 'file'=>_file, 'line'=>line.to_s, 'col'=>col.to_s)
269
- # begin
270
- # event = Arcadia.process_event(CompleteCodeEvent.new(self, 'file'=>_file, 'row'=>line.to_s, 'col'=>col.to_s))
271
- # ensure
272
- # File.delete(_file) if File.exist?(_file)
273
- # end
274
- # end
275
- # @controller.raise_complete_code(event) if @do_complete
276
- # }
1129
+ _focus_line = @text.get('insert linestart','insert')
1130
+ if _focus_line.strip[0..0] != '#'
1131
+ Thread.new do
1132
+ @do_complete = true
1133
+ sleep(1)
1134
+ if @do_complete && @n_complete_task == 0
1135
+ complete_code
1136
+ end
1137
+ end
1138
+ end
1139
+ end
1140
+ }
277
1141
 
1142
+ end
1143
+
1144
+ def activate_key_binding
1145
+ activate_complete_code_key_binding if @is_ruby
278
1146
  @text.bind_append("Control-KeyPress"){|e|
279
1147
  case e.keysym
280
1148
  # when 'space'
@@ -311,17 +1179,7 @@ class AgEditor
311
1179
  when 's'
312
1180
  save
313
1181
  when 'f'
314
- _r = @text.tag_ranges('sel')
315
- if _r.length>0
316
- _text=@text.get(_r[0][0],_r[0][1])
317
- if _text.length > 0
318
- @find.e_what.text(_text)
319
- end
320
- else
321
- end
322
- @find.use(self)
323
- @find.e_what.focus
324
- @find.show
1182
+ find
325
1183
  when 'egrave'
326
1184
  @text.insert('insert',"{")
327
1185
  when 'plus'
@@ -329,7 +1187,7 @@ class AgEditor
329
1187
  end
330
1188
  }
331
1189
 
332
- @text.bind("Control-Shift-KeyPress"){|e|
1190
+ @text.bind_append("Control-Shift-KeyPress"){|e|
333
1191
  case e.keysym
334
1192
  when 'I'
335
1193
  _r = @text.tag_ranges('sel')
@@ -391,13 +1249,12 @@ class AgEditor
391
1249
  _row, _col = _index.split('.')
392
1250
  rehighlightline(_row.to_i) if @highlighting
393
1251
  when 'F5'
394
- save
395
- $arcadia['shell'].run(@file.to_s)
1252
+ run_buffer
396
1253
  when 'F3'
397
1254
  @find.do_find_next
398
1255
  when 'F1'
399
1256
  line, col = @text.index('insert').split('.')
400
- _x, _y = @controller.xy_insert
1257
+ _x, _y = xy_insert
401
1258
  _file = create_temp_file
402
1259
  begin
403
1260
  Arcadia.process_event(DocCodeEvent.new(self, 'file'=>_file, 'row'=>line.to_s, 'col'=>col.to_s, 'xdoc'=>_x, 'ydoc'=>_y))
@@ -426,11 +1283,6 @@ class AgEditor
426
1283
  end
427
1284
  end
428
1285
  }
429
-
430
-
431
- @text.bind("<Modified>"){|e|
432
- check_modify
433
- }
434
1286
 
435
1287
  @text.bind_append("KeyRelease"){|e|
436
1288
  case e.keysym
@@ -469,7 +1321,7 @@ class AgEditor
469
1321
  }
470
1322
 
471
1323
 
472
- @text.bind("Shift-KeyPress"){|e|
1324
+ @text.bind_append("Shift-KeyPress"){|e|
473
1325
  case e.keysym
474
1326
  when 'Tab'
475
1327
  _r = @text.tag_ranges('sel')
@@ -493,9 +1345,57 @@ class AgEditor
493
1345
  end
494
1346
  end
495
1347
  }
1348
+ end
1349
+
1350
+ def find
1351
+ _r = @text.tag_ranges('sel')
1352
+ if _r.length>0
1353
+ _text=@text.get(_r[0][0],_r[0][1])
1354
+ if _text.length > 0
1355
+ @find.e_what.text(_text)
1356
+ end
1357
+ else
1358
+ end
1359
+ @find.use(self)
1360
+ @find.e_what.focus
1361
+ @find.show
1362
+ end
1363
+
1364
+ def disactivate_key_binding
1365
+ @text.bind_remove('KeyPress')
1366
+ @text.bind_remove('KeyRelease')
1367
+ @text.bind_remove('Control-KeyPress')
1368
+ @text.bind_remove('Control-Shift-KeyPress')
1369
+ @text.bind_remove('Shift-KeyPress')
1370
+
1371
+ end
1372
+
1373
+ def initialize_text_binding
1374
+ @text.add_yscrollcommand(proc{|first,last| self.do_line_update()})
1375
+
1376
+ @text.tag_bind('selected', 'Enter', proc{@text.tag_remove('selected','1.0','end')})
1377
+
1378
+ @text.bind("Enter", proc{check_file_last_access_time})
496
1379
 
1380
+ @text.bind("<Modified>"){|e|
1381
+ check_modify
1382
+ }
1383
+ activate_key_binding
497
1384
  @text.bind_append("1",proc{Arcadia.process_event(InputEnterEvent.new(self,'receiver'=>@text))})
1385
+ end
498
1386
 
1387
+ def run_buffer
1388
+ if !@file
1389
+ _file = create_temp_file
1390
+ begin
1391
+ Arcadia.process_event(RunRubyFileEvent.new(self, 'file'=>_file, 'persistent'=>false))
1392
+ ensure
1393
+ File.delete(_file) if File.exist?(_file)
1394
+ end
1395
+ else
1396
+ save
1397
+ Arcadia.process_event(RunRubyFileEvent.new(self, 'file'=>@file, 'persistent'=>true))
1398
+ end
499
1399
  end
500
1400
 
501
1401
  def initialize_line_number(_frame)
@@ -652,6 +1552,16 @@ class AgEditor
652
1552
  end
653
1553
  end
654
1554
 
1555
+ def reset_highlight
1556
+ @is_line_bold.clear
1557
+ @is_tag_bold.clear
1558
+ @highlight_zone.clear
1559
+ @last_line_begin=0
1560
+ @last_line_end=0
1561
+ @last_zone_begin=0
1562
+ @last_zone_end=0
1563
+ end
1564
+
655
1565
  def initialize_highlight
656
1566
  @is_line_bold = Hash.new
657
1567
  @is_tag_bold = Hash.new
@@ -940,14 +1850,14 @@ class AgEditor
940
1850
  :command,
941
1851
  :label=>'Set wrap',
942
1852
  :hidemargin => false,
943
- :command=> proc{@text.configure('wrap'=>'word')}
1853
+ :command=> proc{@text.configure('wrap'=>'word');@text.hide_h_scroll}
944
1854
  )
945
1855
 
946
1856
  _sub_code.insert('end',
947
1857
  :command,
948
1858
  :label=>'Set no wrap',
949
1859
  :hidemargin => false,
950
- :command=> proc{@text.configure('wrap'=>'none')}
1860
+ :command=> proc{@text.configure('wrap'=>'none');@text.show_h_scroll}
951
1861
  )
952
1862
 
953
1863
  _sub_code.insert('end',
@@ -1029,87 +1939,87 @@ class AgEditor
1029
1939
  end
1030
1940
 
1031
1941
 
1032
- def build_tree_from_source(_source)
1033
- _row = 1
1034
- _liv = 0
1035
- _livs = Array.new
1036
- root = TreeNode.new(nil, 'KRoot'){|_node|
1037
- _node.rif= 'root'
1038
- _node.label=''
1039
- }
1040
- _livs[_liv]=root
1041
- _source.each_line{|line|
1042
- line = "\s"+line.split("#")[0]+"\s"
1043
- m = /[\s\n\t\;]+(module|class|def|if|unless|begin|case|for|while|do)[\s\n\t\;]+/.match(line)
1044
- if m
1045
- index = m.post_match.strip.length - 1
1046
- if m.post_match.strip[index,index]=='{'
1047
- _row = _row +1
1048
- next
1049
- end
1050
- _liv>=0? _liv = _liv + 1:_liv=1
1051
- _pliv = _liv
1052
- _parent = nil
1053
- while (_parent == nil && _pliv>=0)
1054
- _pliv = _pliv -1
1055
- _parent = _livs[_pliv]
1056
- end
1057
- if _parent
1058
- _helptext = m.post_match.strip
1059
- _label = _helptext.split('<')[0]
1060
- if _label == nil || _label.strip.length==0
1061
- _label = _helptext
1062
- end
1063
- if (m[0].strip[0..4] == "class" && m.pre_match.strip.length==0)
1064
- _kind = 'KClass'
1065
- elsif (m[0].strip[0..4] == "class" && m.pre_match.strip.length>0)
1066
- _row = _row +1
1067
- _liv = _liv - 1
1068
- next
1069
- elsif (m[0].strip[0..5] == "module" && m.pre_match.strip.length==0)
1070
- _kind = 'KModule'
1071
- elsif (m[0].strip[0..5] == "module" && m.pre_match.strip.length>0)
1072
- _row = _row +1
1073
- _liv = _liv - 1
1074
- next
1075
- 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))
1076
- _row = _row +1
1077
- next
1078
- elsif ((m[0].strip[0..1] == "if" || m[0].strip[0..5] == "unless") && m.pre_match.strip.length>0)
1079
- _row = _row +1
1080
- _liv = _liv - 1
1081
- next
1082
- elsif (m[0].strip[0..2] == "def" && m.pre_match.strip.length==0)
1083
- _kind = 'KDef'
1084
- if _label.include?(_parent.label + '.')
1085
- _kind = 'KDefClass'
1086
- end
1087
- # elsif (m[0].strip[0..10] == "attr_reader" && m.pre_match.strip.length==0)
1088
- # _kind = 'KAttr_reader'
1942
+ # def build_tree_from_source(_source)
1943
+ # _row = 1
1944
+ # _liv = 0
1945
+ # _livs = Array.new
1946
+ # root = TreeNode.new(nil, 'KRoot'){|_node|
1947
+ # _node.rif= 'root'
1948
+ # _node.label=''
1949
+ # }
1950
+ # _livs[_liv]=root
1951
+ # _source.each_line{|line|
1952
+ # line = "\s"+line.split("#")[0]+"\s"
1953
+ # m = /[\s\n\t\;]+(module|class|def|if|unless|begin|case|for|while|do)[\s\n\t\;]+/.match(line)
1954
+ # if m
1955
+ # index = m.post_match.strip.length - 1
1956
+ # if m.post_match.strip[index,index]=='{'
1957
+ # _row = _row +1
1958
+ # next
1959
+ # end
1960
+ # _liv>=0? _liv = _liv + 1:_liv=1
1961
+ # _pliv = _liv
1962
+ # _parent = nil
1963
+ # while (_parent == nil && _pliv>=0)
1964
+ # _pliv = _pliv -1
1965
+ # _parent = _livs[_pliv]
1966
+ # end
1967
+ # if _parent
1968
+ # _helptext = m.post_match.strip
1969
+ # _label = _helptext.split('<')[0]
1970
+ # if _label == nil || _label.strip.length==0
1971
+ # _label = _helptext
1972
+ # end
1973
+ # if (m[0].strip[0..4] == "class" && m.pre_match.strip.length==0)
1974
+ # _kind = 'KClass'
1975
+ # elsif (m[0].strip[0..4] == "class" && m.pre_match.strip.length>0)
1976
+ # _row = _row +1
1089
1977
  # _liv = _liv - 1
1978
+ # next
1979
+ # elsif (m[0].strip[0..5] == "module" && m.pre_match.strip.length==0)
1980
+ # _kind = 'KModule'
1981
+ # elsif (m[0].strip[0..5] == "module" && m.pre_match.strip.length>0)
1090
1982
  # _row = _row +1
1091
- end
1092
-
1093
- TreeNode.new(_parent, _kind){|_node|
1094
- _node.label = _label
1095
- _node.helptext = _helptext
1096
- _node.rif = _row.to_s
1097
- _livs[_pliv + 1]=_node
1098
- }
1099
- else
1100
- _row = _row +1
1101
- _liv = _liv - 1
1102
- next
1103
- end
1104
- end
1105
- m_end = /[\s\n\t\;]+end[\s\n\t\;]+/.match(line)
1106
- if m_end
1107
- _liv = _liv - 1
1108
- end
1109
- _row = _row +1
1110
- }
1111
- return root
1112
- end
1983
+ # _liv = _liv - 1
1984
+ # next
1985
+ # 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))
1986
+ # _row = _row +1
1987
+ # next
1988
+ # elsif ((m[0].strip[0..1] == "if" || m[0].strip[0..5] == "unless") && m.pre_match.strip.length>0)
1989
+ # _row = _row +1
1990
+ # _liv = _liv - 1
1991
+ # next
1992
+ # elsif (m[0].strip[0..2] == "def" && m.pre_match.strip.length==0)
1993
+ # _kind = 'KDef'
1994
+ # if _label.include?(_parent.label + '.')
1995
+ # _kind = 'KDefClass'
1996
+ # end
1997
+ # # elsif (m[0].strip[0..10] == "attr_reader" && m.pre_match.strip.length==0)
1998
+ # # _kind = 'KAttr_reader'
1999
+ # # _liv = _liv - 1
2000
+ # # _row = _row +1
2001
+ # end
2002
+ #
2003
+ # TreeNode.new(_parent, _kind){|_node|
2004
+ # _node.label = _label
2005
+ # _node.helptext = _helptext
2006
+ # _node.rif = _row.to_s
2007
+ # _livs[_pliv + 1]=_node
2008
+ # }
2009
+ # else
2010
+ # _row = _row +1
2011
+ # _liv = _liv - 1
2012
+ # next
2013
+ # end
2014
+ # end
2015
+ # m_end = /[\s\n\t\;]+end[\s\n\t\;]+/.match(line)
2016
+ # if m_end
2017
+ # _liv = _liv - 1
2018
+ # end
2019
+ # _row = _row +1
2020
+ # }
2021
+ # return root
2022
+ # end
1113
2023
 
1114
2024
  def build_tree_from_node(_node, _label_match=nil)
1115
2025
 
@@ -1145,6 +2055,7 @@ class AgEditor
1145
2055
  end
1146
2056
 
1147
2057
  def build_tree(_sel=nil)
2058
+ #Arcadia.console(self,"msg"=>"build for #{@file}")
1148
2059
  if _sel
1149
2060
  _label_sel = @tree_exp.itemcget(_sel,'text')
1150
2061
  end
@@ -1160,7 +2071,9 @@ class AgEditor
1160
2071
 
1161
2072
  #(re)build tree
1162
2073
  _txt = @text.get('1.0','end')
1163
- @root = build_tree_from_source(_txt)
2074
+ #@root = build_tree_from_source(_txt)
2075
+ @root = SourceStructure.new(_txt).root
2076
+
1164
2077
  @selected = nil
1165
2078
  build_tree_from_node(@root, _label_sel)
1166
2079
  if @selected
@@ -1549,7 +2462,7 @@ class AgEditor
1549
2462
  # real_line_begin = line_begin
1550
2463
  # end
1551
2464
 
1552
- if _ry < 0
2465
+ if _ry && _ry < 0
1553
2466
  real_line_end = line_end + 1
1554
2467
  # x = (_heigth+_ry)/_heigth
1555
2468
  # @text_line_num.yview_scroll(-(_heigth+_ry),"pixels")
@@ -1595,7 +2508,7 @@ class AgEditor
1595
2508
  #add_tag_breakpoint(_index+' -1 lines')
1596
2509
  end
1597
2510
  end
1598
- if _ry < 0
2511
+ if _ry && _ry < 0
1599
2512
  #Arcadia.console(self, 'msg'=>"scrollo -> #{-(_heigth+_ry)}")
1600
2513
  #Arcadia.console(self, 'msg'=>"_coef -> #{_coef}")
1601
2514
 
@@ -1721,6 +2634,7 @@ class AgEditor
1721
2634
  'title' => '(Arcadia) Libs', 'parent' => @text,
1722
2635
  'message' => msg) == 'yes'
1723
2636
  @text.delete('1.0','end')
2637
+ reset_highlight
1724
2638
  load_file(@file)
1725
2639
  else
1726
2640
  @file_last_access_time = ftime
@@ -1757,37 +2671,37 @@ class AgEditor
1757
2671
  end
1758
2672
 
1759
2673
  def init_editing(_ext='rb', _w1=150, _w2=60)
1760
- # find file lang
1761
- # _ext='' if _ext.nil?
1762
- # lang_file = File.dirname(__FILE__)+'/langs/'+_ext+'.lang'
1763
- # if File.exist?(lang_file)
1764
- # @lang_hash = properties_file2hash(lang_file)
1765
- # elsif File.exist?(lang_file+'.bind')
1766
- # b= properties_file2hash(lang_file+'.bind')
1767
- # lang_file_bind = File.dirname(__FILE__)+'/langs/'+b['bind']
1768
- # if b && File.exist?(lang_file_bind)
1769
- # @lang_hash = properties_file2hash(lang_file_bind)
1770
- # end
2674
+ @is_ruby = _ext=='rb'||_ext=='rbw'
2675
+ @lang_hash = languages_hash(_ext)
2676
+ # if !_ext.nil? && @is_ruby
2677
+ # @fm = AGTkVSplittedFrames.new(@page_frame,_w1)
2678
+ # @fm1 = AGTkVSplittedFrames.new(@fm.right_frame,_w2)
2679
+ # initialize_tree(@controller.frame(1).hinner_frame)
2680
+ # initialize_tree(@fm.left_frame)
1771
2681
  # else
1772
- # @lang = nil
2682
+ # @fm1 = AGTkVSplittedFrames.new(@page_frame,_w2)
1773
2683
  # end
1774
- is_ruby = _ext=='rb'||_ext=='rbw'
1775
- @lang_hash = languages_hash(_ext)
1776
- if !_ext.nil? && is_ruby
1777
- @fm = AGTkVSplittedFrames.new(@page_frame,_w1)
1778
- @fm1 = AGTkVSplittedFrames.new(@fm.right_frame,_w2)
1779
- initialize_tree(@fm.left_frame)
1780
- else
1781
- @fm1 = AGTkVSplittedFrames.new(@page_frame,_w2)
1782
- end
2684
+ @fm1 = AGTkVSplittedFrames.new(@page_frame,_w2)
1783
2685
  @fm1.splitter_frame.configure('relief'=>'flat')
1784
2686
  initialize_text(@fm1.right_frame)
1785
2687
  initialize_highlight
1786
2688
  initialize_line_number(@fm1.left_frame)
1787
2689
  initialize_text_binding
1788
- initialize_complete_code if is_ruby
2690
+ end
2691
+
2692
+ def show_outline
2693
+ if @tree_scroll_wrapper
2694
+ @tree_scroll_wrapper.show
2695
+ else
2696
+ initialize_tree(@controller.frame(1).hinner_frame)
2697
+ build_tree
2698
+ end
1789
2699
  end
1790
2700
 
2701
+ def hide_outline
2702
+ @tree_scroll_wrapper.hide if @tree_scroll_wrapper
2703
+ end
2704
+
1791
2705
  def file_extension(_filename=nil)
1792
2706
  if _filename
1793
2707
  _m = /(.*\.)(.*$)/.match(File.basename(_filename))
@@ -1835,7 +2749,7 @@ class AgEditor
1835
2749
  end
1836
2750
 
1837
2751
  def refresh
1838
- build_tree if @classbrowsing && !is_exp_hide?
2752
+ build_tree if @classbrowsing #&& !is_exp_hide?
1839
2753
  end
1840
2754
  end
1841
2755
 
@@ -1857,6 +2771,7 @@ class AgMultiEditorView
1857
2771
 
1858
2772
  end
1859
2773
 
2774
+
1860
2775
  class AgMultiEditor < ArcadiaExt
1861
2776
  include Autils
1862
2777
  attr_reader :breakpoints
@@ -1871,11 +2786,19 @@ class AgMultiEditor < ArcadiaExt
1871
2786
  Arcadia.attach_listener(self, StartDebugEvent)
1872
2787
  end
1873
2788
 
2789
+
1874
2790
  def on_before_run_ruby_file(_event)
1875
2791
  _filename = _event.file
1876
2792
  if _filename.nil?
1877
2793
  current_editor = self.raised
1878
- _event.file =current_editor.file if current_editor
2794
+ if current_editor
2795
+ if current_editor.file
2796
+ _event.file = current_editor.file
2797
+ _event.persistent = true
2798
+ else
2799
+ _event.file = current_editor.create_temp_file
2800
+ end
2801
+ end
1879
2802
  end
1880
2803
  end
1881
2804
 
@@ -2083,171 +3006,24 @@ class AgMultiEditor < ArcadiaExt
2083
3006
  end
2084
3007
  end
2085
3008
 
2086
- # def load_persistent_breakpoints
2087
- # b = Arcadia.persistent('editor.debug_breakpoints')
2088
- # if b
2089
- # _files_list =b.split("|")
2090
- # _files_list.each do |value|
2091
- # _file,_line = value.split('@@@')
2092
- # if _file && _line
2093
- # breakpoint_add(_file,_line)
2094
- # end
2095
- # end
2096
- # end
2097
- # end
2098
-
2099
- def xy_insert
2100
- _text = self.raised.text
2101
- _index_now = _text.index('insert')
2102
- _rx, _ry, _widht, _heigth = _text.bbox(_index_now);
2103
- _x = _rx + TkWinfo.rootx(_text)
2104
- _y = _ry + TkWinfo.rooty(_text) + TkFont.new(conf('font')).metrics[2][1]
2105
- _xroot = _x - TkWinfo.rootx(@arcadia.layout.root)
2106
- _yroot = _y - TkWinfo.rooty(@arcadia.layout.root)
2107
- return _xroot, _yroot
2108
- end
2109
-
2110
- def raise_complete_code(_context)
2111
- # delete the file used for completion
2112
- @raised_listbox.destroy if @raised_listbox != nil
2113
-
2114
- candidates = _context.results[0].candidates
2115
- _text = self.raised.text
2116
- _index_call = _context.row+'.'+_context.col
2117
- _index_now = _text.index('insert')
2118
- if _index_call == _index_now
2119
- _target = _text.get('insert - 1 chars wordstart','insert')
2120
- if _target.length > 0 && _target != '.'
2121
- extra_len = _target.length.+@
2122
- _begin_index = _index_now<<' - '<<extra_len.to_s<<' chars'
2123
- _text.tag_add('sel', _begin_index, _index_now)
2124
- else
2125
- _begin_index = _index_now
2126
- extra_len = 0
2127
- end
2128
- if candidates.length > 1
2129
- _rx, _ry, _widht, heigth = _text.bbox(_begin_index);
2130
- _x = _rx + TkWinfo.rootx(_text)
2131
- _y = _ry + TkWinfo.rooty(_text) + TkFont.new(conf('edit.font')).metrics[2][1]
2132
-
2133
- _xroot = _x - TkWinfo.rootx(@arcadia.layout.root)
2134
- _yroot = _y - TkWinfo.rooty(@arcadia.layout.root)
2135
-
2136
- _max_height = TkWinfo.screenheight(@arcadia.layout.root) - _y - 5
2137
-
2138
- @raised_listbox = TkListbox.new(@arcadia.layout.root, {
2139
- :takefocus=>true,
2140
- :selectbackground=>Arcadia.conf('hightlight.1.background'),
2141
- :selectforeground=>Arcadia.conf('hightlight.1.foreground'),
2142
- :activestyle=>'none'}.update(Arcadia.style('listbox'))
2143
- )
2144
- v_scroll = TkScrollbar.new(@raised_listbox,{
2145
- 'orient'=>'vertical'}.update(Arcadia.style('scrollbar'))
2146
- ).pack('side' => 'right', 'fill' => 'y')
2147
-
2148
- v_scroll.command(proc{|*args|
2149
- @raised_listbox.yview *args
2150
- })
2151
- @raised_listbox.yscrollcommand(proc{|first,last| v_scroll.set(first,last) })
2152
-
2153
- _font = TkFont.new(conf('edit.font'))
2154
- _char_height = _font.metrics[2][1]
2155
- _width = 0
2156
- _docs_entries = Hash.new
2157
- _update_list = proc{|_in|
2158
- @raised_listbox.delete('0','end')
2159
- candidates.each{|value|
2160
- _key, _doc = value.split
2161
- if _in.nil? || _in.strip.length == 0 || _key[0.._in.length-1] == _in
2162
- _docs_entries[_key]= _doc
2163
- @raised_listbox.insert('end', _key)
2164
- _temp_width = _font.measure(_key) + _font.measure('X')*3
2165
- _width = _temp_width if _temp_width > _width
2166
- end
2167
- }
2168
- Tk.event_generate(@raised_listbox, "1") if TkWinfo.mapped?(@raised_listbox)
2169
- }
2170
- _update_list.call
2171
- _width = _width + 15
2172
- #_height = (candidates.length+1)*_char_height
2173
- _height = 15*_char_height
2174
- _height = _max_height if _height > _max_height
2175
-
2176
- _buffer = _text.get(_begin_index, 'insert')
2177
- _buffer_ini_length = _buffer.length
2178
- # i2 = _begin_index
2179
- # i1 = _text.index("#{i2} -1 chars")
2180
- # xchar = _text.get(i1, i2)
2181
- # while xchar != '.' && xchar != "\s" && xchar != "\n"
2182
- # _buffer = xchar + _buffer
2183
- # i2 = i1
2184
- # i1 = _text.index("#{i2} -1 chars")
2185
- # xchar = _text.get(i1, i2)
2186
- # end
2187
- @raised_listbox.place('x'=>_xroot,'y'=>_yroot, 'width'=>_width, 'height'=>_height)
2188
- @raised_listbox.focus
2189
- @raised_listbox.activate(0)
2190
- @raised_listbox.grab("set")
2191
- Tk.event_generate(@raised_listbox, "1")
2192
- _insert_selected_value = proc{
2193
- _value = @raised_listbox.get('active')
2194
- _text.delete(_begin_index,'insert')
2195
- _text.insert('insert',_value)
2196
- @raised_listbox.grab("release")
2197
- @raised_listbox.destroy
2198
- _text.focus
2199
- #_menu.destroy
2200
- Tk.callback_break
2201
- }
2202
- @raised_listbox.bind_append("Double-ButtonPress-1"){|e|
2203
- _insert_selected_value.call
2204
- }
2205
- @raised_listbox.bind_append('KeyPress'){|e|
2206
- case e.keysym
2207
- when 'Escape'
2208
- @raised_listbox.grab("release")
2209
- @raised_listbox.destroy
2210
- _text.focus
2211
- #_menu.destroy
2212
- Tk.callback_break
2213
- when 'Return'
2214
- _insert_selected_value.call
2215
- when 'F1'
2216
- _key = @raised_listbox.get('active')
2217
- _x, _y = xy_insert
2218
- Arcadia.process_event(DocCodeEvent.new(self, 'doc_entry'=>_docs_entries[_key], 'xdoc'=>_x, 'ydoc'=>_y))
2219
- #EditorContract.instance.doc_code(self, 'doc_entry'=>_docs_entries[_key], 'xdoc'=>_x, 'ydoc'=>_y)
2220
- when 'a'..'z'
2221
- _text.insert('insert',e.keysym)
2222
- _buffer = _buffer + e.keysym
2223
- _update_list.call(_buffer)
2224
- when 'BackSpace'
2225
- if _buffer.length > _buffer_ini_length
2226
- _text.delete("#{_begin_index} + #{_buffer.length-1} chars" ,'insert')
2227
- _buffer = _buffer[0..-2]
2228
- Tk.update
2229
- _update_list.call(_buffer)
2230
- end
2231
- end
2232
- }
2233
- elsif candidates.length == 1 && candidates[0].length>0
2234
- _text.delete(_begin_index,'insert');
2235
- _text.insert('insert',candidates[0].split[0])
2236
- end
2237
- end
2238
- end
2239
-
2240
3009
  def get_find
2241
3010
  @find
2242
3011
  end
2243
-
3012
+
3013
+
2244
3014
  def create_find
2245
3015
  @find = Find.new(@arcadia.layout.root, self)
2246
3016
  @find.on_close=proc{@find.hide}
2247
3017
  @find.hide
2248
3018
  end
2249
3019
 
3020
+ def start_find
3021
+ _e = raised
3022
+ _e.find if _e
3023
+ end
3024
+
2250
3025
  def on_finalize(_event)
3026
+ @batch_files = true
2251
3027
  _files =''
2252
3028
  @tabs_editor.each_value{|editor|
2253
3029
  if editor.file != nil
@@ -2265,6 +3041,7 @@ class AgMultiEditor < ArcadiaExt
2265
3041
  # end
2266
3042
  # }
2267
3043
  # Arcadia.persistent('editor.debug_breakpoints', _breakpoints)
3044
+ @batch_files = true
2268
3045
  end
2269
3046
 
2270
3047
  def raised
@@ -2299,7 +3076,14 @@ class AgMultiEditor < ArcadiaExt
2299
3076
  return result
2300
3077
  end
2301
3078
 
3079
+ def update(_kind,_name)
3080
+ if _kind == 'RAISE' && _name == 'editor'
3081
+ change_outline(raised)
3082
+ end
3083
+ end
3084
+
2302
3085
  def open_last_files
3086
+ @batch_files = true
2303
3087
  if $arcadia['pers']['editor.files.open']
2304
3088
  _files_index =$arcadia['pers']['editor.files.open'].split("|")
2305
3089
  _files_index.each do |value|
@@ -2309,11 +3093,14 @@ class AgMultiEditor < ArcadiaExt
2309
3093
  end
2310
3094
  end
2311
3095
  end
3096
+ @batch_files = false
2312
3097
  _first_page = @main_frame.enb.pages(0) if @main_frame.enb.pages.length > 0
2313
3098
  if _first_page
2314
3099
  @main_frame.enb.raise(_first_page)
2315
3100
  @main_frame.enb.see(_first_page)
2316
3101
  end
3102
+ frame(1)
3103
+ @arcadia.layout.add_observer(self)
2317
3104
  self
2318
3105
  end
2319
3106
 
@@ -2433,7 +3220,7 @@ class AgMultiEditor < ArcadiaExt
2433
3220
  #debug_reset
2434
3221
  @editors_in_debug.each{|e|
2435
3222
  close_editor(e)
2436
- p "close editor #{e.file}"
3223
+ #p "close editor #{e.file}"
2437
3224
  }
2438
3225
  end
2439
3226
 
@@ -2460,6 +3247,14 @@ class AgMultiEditor < ArcadiaExt
2460
3247
  end
2461
3248
  end
2462
3249
 
3250
+ def change_outline(_e)
3251
+ if !@batch_files && frame(1).raised?
3252
+ @last_outline_e.hide_outline if @last_outline_e
3253
+ _e.show_outline
3254
+ @last_outline_e = _e
3255
+ end
3256
+ end
3257
+
2463
3258
  def do_buffer_raise(_name, _title='...')
2464
3259
  _index = @main_frame.enb.index(_name)
2465
3260
  _new_caption = '...'
@@ -2468,6 +3263,7 @@ class AgMultiEditor < ArcadiaExt
2468
3263
  #_tab = get_tab_from_name(_name)
2469
3264
  #@main_frame.enb.raise(_name)
2470
3265
  _e = @tabs_editor[_name]
3266
+ change_outline(_e) if _e
2471
3267
  if _e && _e.file != nil
2472
3268
  _new_caption = _e.file
2473
3269
  @find.use(_e)
@@ -2577,15 +3373,19 @@ class AgMultiEditor < ArcadiaExt
2577
3373
  end
2578
3374
 
2579
3375
  def close_others_editor(_editor, _mod=true)
3376
+ @batch_files = true
2580
3377
  @tabs_editor.values.each do |_e|
2581
3378
  close_editor(_e) if _e != _editor
2582
3379
  end
3380
+ @batch_files = false
2583
3381
  end
2584
3382
 
2585
3383
  def close_all_editor(_editor, _mod=true)
3384
+ @batch_files = true
2586
3385
  @tabs_editor.values.each do |_e|
2587
3386
  close_editor(_e)
2588
3387
  end
3388
+ @batch_files = false
2589
3389
  end
2590
3390
 
2591
3391
  def close_editor(_editor, _mod=true)
@@ -2629,6 +3429,27 @@ class AgMultiEditor < ArcadiaExt
2629
3429
  @tabs_editor[tab_name(_filename)].save_as
2630
3430
  end
2631
3431
 
3432
+ def accept_complete_code
3433
+ @ok_complete = true
3434
+ if !defined?(@ok_complete)
3435
+
3436
+ msg =<<EOS
3437
+ "Complete code" is actually based on rcodetools
3438
+ that exec code for retreave candidades.
3439
+ So it can be dangerous for example if you write system call.
3440
+ Do you want to activate it?
3441
+ EOS
3442
+ @ok_complete = Arcadia.dialog(self,
3443
+ 'level'=>'warning',
3444
+ 'type'=>'yes_no',
3445
+ 'title' => '(Arcadia) Complete code',
3446
+ 'msg'=>msg.upcase)=='yes'
3447
+
3448
+ end
3449
+ return @ok_complete
3450
+ end
3451
+
3452
+
2632
3453
  end
2633
3454
 
2634
3455
  class Findview < TkFloatTitledFrame
@@ -2637,12 +3458,12 @@ class Findview < TkFloatTitledFrame
2637
3458
  #stop_resizing
2638
3459
  y0 = 10
2639
3460
  d = 23
2640
- TkLabel.new(self.frame, Arcadia.style('label')){
2641
- text 'Find what:'
2642
- place('x' => 8,'y' => y0,'height' => 19)
2643
- }
2644
- y0 = y0 + d
2645
- @e_what = Tk::BWidget::ComboBox.new(self.frame, Arcadia.style('combobox')){
3461
+ TkLabel.new(self.frame, Arcadia.style('label')){
3462
+ text 'Find what:'
3463
+ place('x' => 8,'y' => y0,'height' => 19)
3464
+ }
3465
+ y0 = y0 + d
3466
+ @e_what = Tk::BWidget::ComboBox.new(self.frame, Arcadia.style('combobox')){
2646
3467
  editable true
2647
3468
  justify 'left'
2648
3469
  #relief 'ridge'
@@ -2651,19 +3472,19 @@ class Findview < TkFloatTitledFrame
2651
3472
  takefocus 'true'
2652
3473
  #pack('padx'=>10, 'fill'=>'x')
2653
3474
  place('relwidth' => 1, 'width'=>-16,'x' => 8,'y' => y0,'height' => 19)
2654
- }
2655
- @e_what_entry = TkWinfo.children(@e_what)[0]
3475
+ }
3476
+ @e_what_entry = TkWinfo.children(@e_what)[0]
2656
3477
 
2657
- @e_what_entry.bind_append("1",proc{Arcadia.process_event(InputEnterEvent.new(self,'receiver'=>@e_what_entry))})
3478
+ @e_what_entry.bind_append("1",proc{Arcadia.process_event(InputEnterEvent.new(self,'receiver'=>@e_what_entry))})
2658
3479
 
2659
- y0 = y0 + d
2660
- TkLabel.new(self.frame, Arcadia.style('label')){
2661
- text 'Replace with:'
2662
- place('x' => 8,'y' => y0,'height' => 19)
2663
- }
2664
- y0 = y0 + d
3480
+ y0 = y0 + d
3481
+ TkLabel.new(self.frame, Arcadia.style('label')){
3482
+ text 'Replace with:'
3483
+ place('x' => 8,'y' => y0,'height' => 19)
3484
+ }
3485
+ y0 = y0 + d
2665
3486
 
2666
- @e_with = Tk::BWidget::ComboBox.new(self.frame, Arcadia.style('combobox')){
3487
+ @e_with = Tk::BWidget::ComboBox.new(self.frame, Arcadia.style('combobox')){
2667
3488
  editable true
2668
3489
  justify 'left'
2669
3490
  autocomplete 'true'
@@ -2672,9 +3493,9 @@ class Findview < TkFloatTitledFrame
2672
3493
  #pack('padx'=>10, 'fill'=>'x')
2673
3494
  place('relwidth' => 1, 'width'=>-16,'x' => 8,'y' => y0,'height' => 19)
2674
3495
  }
2675
- @e_with_entry = TkWinfo.children(@e_with)[0]
3496
+ @e_with_entry = TkWinfo.children(@e_with)[0]
2676
3497
 
2677
- @e_with_entry.bind_append("1",proc{Arcadia.process_event(InputEnterEvent.new(self,'receiver'=>@e_with_entry))})
3498
+ @e_with_entry.bind_append("1",proc{Arcadia.process_event(InputEnterEvent.new(self,'receiver'=>@e_with_entry))})
2678
3499
 
2679
3500
  y0 = y0 + d
2680
3501
  @cb_reg = TkCheckButton.new(self.frame, Arcadia.style('checkbox')){|_cb_reg|
@@ -2693,9 +3514,9 @@ class Findview < TkFloatTitledFrame
2693
3514
  place('x' => 8,'y' => y0,'height' => 22)
2694
3515
  }
2695
3516
 
2696
- y0 = y0 + d
2697
- y0 = y0 + d
2698
- @buttons_frame = TkFrame.new(self.frame, Arcadia.style('panel')).pack('fill'=>'x', 'side'=>'bottom')
3517
+ y0 = y0 + d
3518
+ y0 = y0 + d
3519
+ @buttons_frame = TkFrame.new(self.frame, Arcadia.style('panel')).pack('fill'=>'x', 'side'=>'bottom')
2699
3520
 
2700
3521
  @b_replace_all = TkButton.new(@buttons_frame, Arcadia.style('button')){|_b_go|
2701
3522
  state 'disabled'
@@ -2860,10 +3681,17 @@ class Find < Findview
2860
3681
  if (_editor != @editor_caller)
2861
3682
  @last_index='insert'
2862
3683
  @editor_caller = _editor
2863
- title(_editor.file)
3684
+ _title = File.basename(_editor.file)
3685
+ title(_title)
3686
+ @goto_line_dialog.title(_title) if @goto_line_dialog
2864
3687
  end
2865
3688
  end
2866
3689
 
3690
+ def show
3691
+ super
3692
+ use(@controller.raised)
3693
+ end
3694
+
2867
3695
  def update_combo(_txt)
2868
3696
  values = @e_what.cget('values')
2869
3697
  if (values != nil && !values.include?(_txt))
@@ -2935,31 +3763,6 @@ class Find < Findview
2935
3763
  end
2936
3764
 
2937
3765
 
2938
- class KeyTestView < TkToplevel
2939
- attr_reader :ttest
2940
- def initialize
2941
- super
2942
-
2943
- Tk.tk_call('wm', 'title', self, '...hello' )
2944
- Tk.tk_call('wm', 'geometry', self, '638x117+200+257' )
2945
-
2946
- @ttest = TkText.new(self){
2947
- background '#FFF454'
2948
- place('relwidth' => '1','relx' => 0,'x' => '0','y' => '0','relheight' => '1','rely' => 0,'height' => '0','bordermode' => 'inside','width' => '0')
2949
- }
2950
-
2951
- end
2952
- end
2953
-
2954
- class KetTest
2955
- def initialize
2956
- kt = KeyTestView.new
2957
- kt.ttest.bind("KeyPress"){|e|
2958
- kt.ttest.insert('end'," [ "+e.keysym+" ] ")
2959
- break
2960
- }
2961
- end
2962
- end
2963
3766
 
2964
3767
  class CodeInsight
2965
3768
  end
@@ -2972,11 +3775,11 @@ class GoToLine < TkFloatTitledFrame
2972
3775
  #stop_resizing
2973
3776
  y0 = 10
2974
3777
  d = 23
2975
- TkLabel.new(self.frame, Arcadia.style('label')){
2976
- text 'Go to line:'
2977
- place('x' => 8,'y' => y0,'height' => 19)
2978
- }
2979
- y0 = y0 + d
3778
+ TkLabel.new(self.frame, Arcadia.style('label')){
3779
+ text 'Go to line:'
3780
+ place('x' => 8,'y' => y0,'height' => 19)
3781
+ }
3782
+ y0 = y0 + d
2980
3783
  @e_line = TkEntry.new(self.frame, Arcadia.style('edit')){
2981
3784
  justify 'left'
2982
3785
  #relief 'ridge'
@@ -2986,7 +3789,7 @@ class GoToLine < TkFloatTitledFrame
2986
3789
 
2987
3790
  y0 = y0 + d
2988
3791
  y0 = y0 + d
2989
- @buttons_frame = TkFrame.new(self.frame, Arcadia.style('panel')).pack('fill'=>'x', 'side'=>'bottom')
3792
+ @buttons_frame = TkFrame.new(self.frame, Arcadia.style('panel')).pack('fill'=>'x', 'side'=>'bottom')
2990
3793
 
2991
3794
  @b_go = TkButton.new(@buttons_frame, Arcadia.style('button')){|_b_go|
2992
3795
  compound 'none'
@@ -2996,7 +3799,7 @@ class GoToLine < TkFloatTitledFrame
2996
3799
  #justify 'center'
2997
3800
  pack('side'=>'right','ipadx'=>5, 'padx'=>5)
2998
3801
  }
2999
- place('x'=>150,'y'=>150,'height'=> 120,'width'=> 100)
3802
+ place('x'=>150,'y'=>150,'height'=> 120,'width'=> 240)
3000
3803
 
3001
3804
  end
3002
3805