arcadia 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. data/README +126 -123
  2. data/arcadia.rb +770 -756
  3. data/base/a-contracts.rb +130 -93
  4. data/base/a-ext.rb +280 -280
  5. data/base/a-libs.rb +5 -11
  6. data/base/a-utils.rb +235 -44
  7. data/conf/arcadia.conf +20 -16
  8. data/conf/arcadia.init.rb +0 -0
  9. data/conf/arcadia.res.rb +74 -0
  10. data/ext/ae-complete-code/ae-complete-code.conf +0 -0
  11. data/ext/ae-complete-code/ae-complete-code.rb +80 -79
  12. data/ext/ae-debug/ae-debug.conf +0 -0
  13. data/ext/ae-debug/ae-debug.rb +2 -6
  14. data/ext/ae-debug/debug1.57.rb +0 -0
  15. data/ext/ae-doc-code/ae-doc-code.conf +15 -0
  16. data/ext/ae-doc-code/ae-doc-code.rb +289 -0
  17. data/ext/ae-editor/ae-editor.conf +17 -8
  18. data/ext/ae-editor/ae-editor.rb +738 -396
  19. data/ext/ae-event-log/ae-event-log.conf +0 -0
  20. data/ext/ae-event-log/ae-event-log.rb +0 -0
  21. data/ext/ae-file-history/ae-file-history.conf +2 -2
  22. data/ext/ae-file-history/ae-file-history.rb +286 -290
  23. data/ext/ae-inspector/ae-inspector.conf +0 -0
  24. data/ext/ae-inspector/ae-inspector.rb +0 -0
  25. data/ext/ae-output-event/ae-output-event.conf +2 -2
  26. data/ext/ae-output/ae-output.conf +2 -2
  27. data/ext/ae-output/ae-output.rb +173 -178
  28. data/ext/ae-palette/ae-palette.conf +0 -0
  29. data/ext/ae-palette/ae-palette.rb +0 -0
  30. data/ext/ae-shell/ae-shell.conf +0 -0
  31. data/ext/ae-shell/ae-shell.rb +54 -54
  32. data/lib/tk/al-tk.rb +3076 -3082
  33. data/lib/tk/al-tk.res.rb +0 -0
  34. data/lib/tk/al-tkarcadia.rb +0 -0
  35. data/lib/tk/al-tkcustom.rb +0 -0
  36. data/lib/tkext/al-bwidget.rb +0 -0
  37. data/lib/tkext/al-iwidgets.rb +0 -0
  38. data/lib/tkext/al-tile.rb +0 -0
  39. data/lib/tkext/al-tktable.rb +0 -0
  40. data/tcl/BWidget-1.8.0/BWman/ArrowButton.html +276 -0
  41. data/tcl/BWidget-1.8.0/BWman/BWidget.html +228 -0
  42. data/tcl/BWidget-1.8.0/BWman/Button.html +273 -0
  43. data/tcl/BWidget-1.8.0/BWman/ButtonBox.html +264 -0
  44. data/tcl/BWidget-1.8.0/BWman/ComboBox.html +402 -0
  45. data/tcl/BWidget-1.8.0/BWman/Dialog.html +314 -0
  46. data/tcl/BWidget-1.8.0/BWman/DragSite.html +139 -0
  47. data/tcl/BWidget-1.8.0/BWman/DropSite.html +254 -0
  48. data/tcl/BWidget-1.8.0/BWman/DynamicHelp.html +248 -0
  49. data/tcl/BWidget-1.8.0/BWman/Entry.html +341 -0
  50. data/tcl/BWidget-1.8.0/BWman/Label.html +331 -0
  51. data/tcl/BWidget-1.8.0/BWman/LabelEntry.html +194 -0
  52. data/tcl/BWidget-1.8.0/BWman/LabelFrame.html +144 -0
  53. data/tcl/BWidget-1.8.0/BWman/ListBox.html +678 -0
  54. data/tcl/BWidget-1.8.0/BWman/MainFrame.html +283 -0
  55. data/tcl/BWidget-1.8.0/BWman/MessageDlg.html +218 -0
  56. data/tcl/BWidget-1.8.0/BWman/NoteBook.html +374 -0
  57. data/tcl/BWidget-1.8.0/BWman/PagesManager.html +180 -0
  58. data/tcl/BWidget-1.8.0/BWman/PanedWindow.html +142 -0
  59. data/tcl/BWidget-1.8.0/BWman/PanelFrame.html +153 -0
  60. data/tcl/BWidget-1.8.0/BWman/PasswdDlg.html +214 -0
  61. data/tcl/BWidget-1.8.0/BWman/ProgressBar.html +152 -0
  62. data/tcl/BWidget-1.8.0/BWman/ProgressDlg.html +145 -0
  63. data/tcl/BWidget-1.8.0/BWman/ScrollView.html +130 -0
  64. data/tcl/BWidget-1.8.0/BWman/ScrollableFrame.html +191 -0
  65. data/tcl/BWidget-1.8.0/BWman/ScrolledWindow.html +116 -0
  66. data/tcl/BWidget-1.8.0/BWman/SelectColor.html +164 -0
  67. data/tcl/BWidget-1.8.0/BWman/SelectFont.html +152 -0
  68. data/tcl/BWidget-1.8.0/BWman/Separator.html +77 -0
  69. data/tcl/BWidget-1.8.0/BWman/SpinBox.html +250 -0
  70. data/tcl/BWidget-1.8.0/BWman/StatusBar.html +147 -0
  71. data/tcl/BWidget-1.8.0/BWman/TitleFrame.html +107 -0
  72. data/tcl/BWidget-1.8.0/BWman/Tree.html +947 -0
  73. data/tcl/BWidget-1.8.0/BWman/Widget.html +502 -0
  74. data/tcl/BWidget-1.8.0/BWman/contents.html +84 -0
  75. data/tcl/BWidget-1.8.0/BWman/index.html +7 -0
  76. data/tcl/BWidget-1.8.0/BWman/navtree.html +41 -0
  77. data/tcl/BWidget-1.8.0/BWman/options.htm +458 -0
  78. data/tcl/BWidget-1.8.0/CHANGES.txt +266 -0
  79. data/tcl/BWidget-1.8.0/ChangeLog +1641 -0
  80. data/tcl/BWidget-1.8.0/LICENSE.txt +41 -0
  81. data/tcl/BWidget-1.8.0/README.txt +127 -0
  82. data/tcl/BWidget-1.8.0/arrow.tcl +551 -0
  83. data/tcl/BWidget-1.8.0/bitmap.tcl +94 -0
  84. data/tcl/BWidget-1.8.0/button.tcl +324 -0
  85. data/tcl/BWidget-1.8.0/buttonbox.tcl +403 -0
  86. data/tcl/BWidget-1.8.0/color.tcl +493 -0
  87. data/tcl/BWidget-1.8.0/combobox.tcl +809 -0
  88. data/tcl/BWidget-1.8.0/demo/basic.tcl +199 -0
  89. data/tcl/BWidget-1.8.0/demo/bwidget.xbm +46 -0
  90. data/tcl/BWidget-1.8.0/demo/demo.tcl +212 -0
  91. data/tcl/BWidget-1.8.0/demo/dnd.tcl +42 -0
  92. data/tcl/BWidget-1.8.0/demo/manager.tcl +141 -0
  93. data/tcl/BWidget-1.8.0/demo/select.tcl +59 -0
  94. data/tcl/BWidget-1.8.0/demo/tmpldlg.tcl +214 -0
  95. data/tcl/BWidget-1.8.0/demo/tree.tcl +260 -0
  96. data/tcl/BWidget-1.8.0/demo/x1.xbm +2258 -0
  97. data/tcl/BWidget-1.8.0/dialog.tcl +345 -0
  98. data/tcl/BWidget-1.8.0/dragsite.tcl +197 -0
  99. data/tcl/BWidget-1.8.0/dropsite.tcl +455 -0
  100. data/tcl/BWidget-1.8.0/dynhelp.tcl +625 -0
  101. data/tcl/BWidget-1.8.0/entry.tcl +469 -0
  102. data/tcl/BWidget-1.8.0/font.tcl +566 -0
  103. data/tcl/BWidget-1.8.0/images/bold.gif +0 -0
  104. data/tcl/BWidget-1.8.0/images/copy.gif +0 -0
  105. data/tcl/BWidget-1.8.0/images/cut.gif +0 -0
  106. data/tcl/BWidget-1.8.0/images/dragfile.gif +0 -0
  107. data/tcl/BWidget-1.8.0/images/dragicon.gif +0 -0
  108. data/tcl/BWidget-1.8.0/images/error.gif +0 -0
  109. data/tcl/BWidget-1.8.0/images/file.gif +0 -0
  110. data/tcl/BWidget-1.8.0/images/folder.gif +0 -0
  111. data/tcl/BWidget-1.8.0/images/hourglass.gif +0 -0
  112. data/tcl/BWidget-1.8.0/images/info.gif +0 -0
  113. data/tcl/BWidget-1.8.0/images/italic.gif +0 -0
  114. data/tcl/BWidget-1.8.0/images/minus.xbm +5 -0
  115. data/tcl/BWidget-1.8.0/images/new.gif +0 -0
  116. data/tcl/BWidget-1.8.0/images/opcopy.xbm +5 -0
  117. data/tcl/BWidget-1.8.0/images/open.gif +0 -0
  118. data/tcl/BWidget-1.8.0/images/openfold.gif +0 -0
  119. data/tcl/BWidget-1.8.0/images/oplink.xbm +5 -0
  120. data/tcl/BWidget-1.8.0/images/opmove.xbm +5 -0
  121. data/tcl/BWidget-1.8.0/images/overstrike.gif +0 -0
  122. data/tcl/BWidget-1.8.0/images/palette.gif +0 -0
  123. data/tcl/BWidget-1.8.0/images/passwd.gif +0 -0
  124. data/tcl/BWidget-1.8.0/images/paste.gif +0 -0
  125. data/tcl/BWidget-1.8.0/images/plus.xbm +5 -0
  126. data/tcl/BWidget-1.8.0/images/print.gif +0 -0
  127. data/tcl/BWidget-1.8.0/images/question.gif +0 -0
  128. data/tcl/BWidget-1.8.0/images/redo.gif +0 -0
  129. data/tcl/BWidget-1.8.0/images/save.gif +0 -0
  130. data/tcl/BWidget-1.8.0/images/target.xbm +9 -0
  131. data/tcl/BWidget-1.8.0/images/underline.gif +0 -0
  132. data/tcl/BWidget-1.8.0/images/undo.gif +0 -0
  133. data/tcl/BWidget-1.8.0/images/warning.gif +0 -0
  134. data/tcl/BWidget-1.8.0/init.tcl +40 -0
  135. data/tcl/BWidget-1.8.0/label.tcl +271 -0
  136. data/tcl/BWidget-1.8.0/labelentry.tcl +100 -0
  137. data/tcl/BWidget-1.8.0/labelframe.tcl +160 -0
  138. data/tcl/BWidget-1.8.0/lang/da.rc +52 -0
  139. data/tcl/BWidget-1.8.0/lang/de.rc +52 -0
  140. data/tcl/BWidget-1.8.0/lang/en.rc +52 -0
  141. data/tcl/BWidget-1.8.0/lang/es.rc +53 -0
  142. data/tcl/BWidget-1.8.0/lang/fr.rc +52 -0
  143. data/tcl/BWidget-1.8.0/listbox.tcl +1638 -0
  144. data/tcl/BWidget-1.8.0/mainframe.tcl +711 -0
  145. data/tcl/BWidget-1.8.0/messagedlg.tcl +128 -0
  146. data/tcl/BWidget-1.8.0/notebook.tcl +1164 -0
  147. data/tcl/BWidget-1.8.0/pagesmgr.tcl +294 -0
  148. data/tcl/BWidget-1.8.0/panedw.tcl +381 -0
  149. data/tcl/BWidget-1.8.0/panelframe.tcl +246 -0
  150. data/tcl/BWidget-1.8.0/passwddlg.tcl +178 -0
  151. data/tcl/BWidget-1.8.0/pkgIndex.tcl +47 -0
  152. data/tcl/BWidget-1.8.0/progressbar.tcl +208 -0
  153. data/tcl/BWidget-1.8.0/progressdlg.tcl +87 -0
  154. data/tcl/BWidget-1.8.0/scrollframe.tcl +226 -0
  155. data/tcl/BWidget-1.8.0/scrollview.tcl +254 -0
  156. data/tcl/BWidget-1.8.0/scrollw.tcl +280 -0
  157. data/tcl/BWidget-1.8.0/separator.tcl +75 -0
  158. data/tcl/BWidget-1.8.0/spinbox.tcl +331 -0
  159. data/tcl/BWidget-1.8.0/statusbar.tcl +422 -0
  160. data/tcl/BWidget-1.8.0/tests/entry.test +173 -0
  161. data/tcl/BWidget-1.8.0/titleframe.tcl +170 -0
  162. data/tcl/BWidget-1.8.0/tree.tcl +2228 -0
  163. data/tcl/BWidget-1.8.0/utils.tcl +645 -0
  164. data/tcl/BWidget-1.8.0/widget.tcl +1576 -0
  165. data/tcl/BWidget-1.8.0/wizard.tcl +1028 -0
  166. data/tcl/BWidget-1.8.0/xpm2image.tcl +115 -0
  167. metadata +141 -5
@@ -5,18 +5,19 @@ active=yes
5
5
  require=ext/ae-editor/ae-editor
6
6
  class=AgMultiEditor
7
7
 
8
- tab-chars=0.5c
8
+ tabs=0.5c left
9
+ # to use tab key set tab-replace-width-space=0
9
10
  tab-replace-width-space=2
10
- find.frame=0.0
11
+
11
12
  #tabs
12
- tabs.font=courier 9
13
+ tabs.font=courier 12
13
14
  i386-freebsd6::tabs.font=courier 12
14
15
  i386-mswin32::tabs.font={Courier New} 9
15
16
  #tabs.side=bottom
16
17
  tabs.side=top
17
18
  # editor
18
- font=courier 9
19
- font.bold=courier 9 bold
19
+ font=courier 12
20
+ font.bold=courier 12 bold
20
21
  i386-freebsd6::font=courier 12
21
22
  i386-freebsd6::font.bold=courier 12 bold
22
23
  i386-mswin32::font={Courier New} 9
@@ -56,12 +57,20 @@ hightlight.number.color.foreground=#007F7F
56
57
  #hightlight.capitalize.color.foreground=#0000FF
57
58
  hightlight.operator.color.foreground=#000000
58
59
  hightlight.operator.style=bold
59
- #hightlight.sel.color.foreground=yellow
60
- hightlight.sel.color.background=#cccccc
60
+ hightlight.sel.color.foreground=black
61
+ hightlight.sel.color.background=#68f914
61
62
  hightlight.sel.borderwidth=1
62
63
  hightlight.sel.relief=raised
63
64
  #hightlight.goto.color.foreground=blue
64
65
  hightlight.selected.color.background=yellow
66
+ hightlight.tabs.color.foreground=black
67
+ hightlight.tabs.color.background=#b1cfba
68
+ hightlight.tabs.borderwidth=1
69
+ hightlight.tabs.relief=raised
70
+ hightlight.spaces.color.foreground=black
71
+ hightlight.spaces.color.background=#d9f42b
72
+ hightlight.spaces.borderwidth=1
73
+ hightlight.spaces.relief=raised
65
74
  #+--------------------------------------------------
66
75
 
67
76
 
@@ -76,7 +85,7 @@ line_number_panel.color.foreground=#333333
76
85
  # tree explorer
77
86
  explorer_panel.tree.color.background=#ffffff
78
87
  explorer_panel.tree.color.foreground=white
79
- explorer_panel.tree.font=courier 9
88
+ explorer_panel.tree.font=courier 12
80
89
  i386-freebsd6::explorer_panel.tree.font=courier 12
81
90
  i386-mswin32::explorer_panel.tree.font={Courier New} 9
82
91
  explorer_panel.tree.class.color.foreground=#a42019
@@ -37,17 +37,10 @@ class AgEditor
37
37
  @controller = _controller
38
38
  @page_frame = _page_frame
39
39
  @set_mod = false
40
- # @fm = AGTkVSplittedFrames.new(@page_frame,150)
41
- # @fm1 = AGTkVSplittedFrames.new(@fm.right_frame,60)
42
40
  @font = @controller.conf('font')
43
41
  @font_bold = @controller.conf('font.bold')
44
42
  @font_metrics = TkFont.new(@font).metrics
45
43
  @font_metrics_bold = TkFont.new(@font_bold).metrics
46
- # initialize_text
47
- # initialize_text_binding
48
- # initialize_highlight
49
- # initialize_line_number
50
- # initialize_tree
51
44
  @highlighting = false
52
45
  @classbrowsing = false
53
46
  @find = @controller.get_find
@@ -97,17 +90,38 @@ class AgEditor
97
90
  selectcommand proc{ _tree_goto.call(self) }
98
91
  place('relwidth' => 1,'relx' => 0,'x' => '0','y' => '0','relheight' => '1','rely' => 0,'height' => 1,'bordermode' => 'inside','width' => '50')
99
92
  }
100
- @nodes = Array.new
93
+
101
94
  _c_explo = proc{|*args| @tree_exp.yview(*args)}
102
95
  _s_explo = TkScrollbar.new(@nb_tab_exp){|s|
103
96
  width 8
104
97
  command _c_explo
105
98
  }.pack('side'=>'right', 'fill'=>'y')
106
99
  @tree_exp.yscrollcommand proc{|first,last| _s_explo.set first,last}
107
-
100
+ pop_up_menu_tree
108
101
  end
109
102
 
110
- def initialize_text(_frame)
103
+ def pop_up_menu_tree
104
+ @pop_up_tree = TkMenu.new(
105
+ :parent=>@tree_exp,
106
+ :title => 'Menu tree'
107
+ )
108
+ @pop_up_tree.insert('end',
109
+ :command,
110
+ :label=>'Rebuild',
111
+ :hidemargin => false,
112
+ :command=> proc{build_tree}
113
+ )
114
+ @tree_exp.bind_append("Button-3",
115
+ proc{|x,y|
116
+ _x = TkWinfo.pointerx(@tree_exp)
117
+ _y = TkWinfo.pointery(@tree_exp)
118
+ @pop_up_tree.popup(_x,_y)
119
+ },
120
+ "%x %y")
121
+ end
122
+
123
+
124
+ def initialize_text(_frame)
111
125
  @v_scroll = TkScrollbar.new(_frame,
112
126
  'orient'=>'vertical',
113
127
  'relief'=>'flat'
@@ -125,7 +139,7 @@ class AgEditor
125
139
  exportselection true
126
140
  autoseparators true
127
141
  padx 0
128
- tabs $arcadia['conf']['editor.tab-chars']
142
+ tabs $arcadia['conf']['editor.tabs']
129
143
  place(
130
144
  'x'=>0,
131
145
  'y'=>0,
@@ -142,9 +156,22 @@ class AgEditor
142
156
  @text.tag_configure('debug', 'background' =>'#b9c6d9', 'borderwidth'=>1 ,'relief'=>'raise')
143
157
  @buffer = text_value
144
158
  pop_up_menu
145
- end
146
-
147
- def initialize_text_binding
159
+ end
160
+
161
+ def create_temp_file
162
+ _file = @file+'~~'
163
+ f = File.new(@file+'~~', "w")
164
+ begin
165
+ if f
166
+ f.syswrite(text_value)
167
+ end
168
+ ensure
169
+ f.close unless f.nil?
170
+ end
171
+ _file
172
+ end
173
+
174
+ def initialize_text_binding
148
175
  @v_scroll.command(proc{|*args|
149
176
  @text.yview *args
150
177
  })
@@ -163,19 +190,8 @@ class AgEditor
163
190
  case e.keysym
164
191
  when 'space'
165
192
  line, col = @text.index('insert').split('.')
166
- _file = @file+'~~'
167
- f = File.new(@file+'~~', "w")
168
- begin
169
- if f
170
- f.syswrite(text_value)
171
- end
172
- ensure
173
- f.close unless f.nil?
174
- end
175
-
176
-
177
-
178
- EditorContract.instance.complete_code(EditorContract::TEditorObj.new(self, 'file'=>_file, 'line'=>line.to_s, 'col'=>col.to_s))
193
+ _file = create_temp_file
194
+ EditorContract.instance.complete_code(self, 'file'=>_file, 'line'=>line.to_s, 'col'=>col.to_s)
179
195
  when 'z'
180
196
  _b = @text.index('insert').split('.')[0].to_i
181
197
  @text.edit_undo
@@ -217,6 +233,7 @@ class AgEditor
217
233
  end
218
234
  @find.use(self)
219
235
  @find.e_what.focus
236
+ @find.show
220
237
  when 'egrave'
221
238
  @text.insert('insert',"{")
222
239
  when 'plus'
@@ -230,18 +247,30 @@ class AgEditor
230
247
  _r = @text.tag_ranges('sel')
231
248
  _row_begin = _r[0][0].split('.')[0].to_i
232
249
  _row_end = _r[_r.length - 1][1].split('.')[0].to_i
250
+ n_space = $arcadia['conf']['editor.tab-replace-width-space'].to_i
251
+ if n_space > 0
252
+ suf = "\s"*n_space
253
+ else
254
+ suf = "\t"
255
+ end
233
256
 
234
257
  for _row in _row_begin..._row_end
235
- @text.insert(_row.to_s+'.0',"\s\s")
258
+ @text.insert(_row.to_s+'.0',suf)
236
259
  end
237
260
  when 'U'
238
261
  _r = @text.tag_ranges('sel')
239
262
  _row_begin = _r[0][0].split('.')[0].to_i
240
263
  _row_end = _r[_r.length - 1][1].split('.')[0].to_i
241
-
264
+ n_space = $arcadia['conf']['editor.tab-replace-width-space'].to_i
265
+ if n_space > 0
266
+ suf = "\s"*n_space
267
+ else
268
+ suf = "\t"
269
+ end
270
+ _l_suf = suf.length.to_s
242
271
  for _row in _row_begin..._row_end
243
- if @text.get(_row.to_s+'.0',_row.to_s+'.2') == "\s\s"
244
- @text.delete(_row.to_s+'.0',_row.to_s+'.2')
272
+ if @text.get(_row.to_s+'.0',_row.to_s+'.'+_l_suf) == suf
273
+ @text.delete(_row.to_s+'.0',_row.to_s+'.'+_l_suf)
245
274
  end
246
275
  end
247
276
  when 'C'
@@ -260,6 +289,7 @@ class AgEditor
260
289
 
261
290
  end
262
291
  }
292
+
263
293
  @text.bind("KeyPress"){|e|
264
294
  case e.keysym
265
295
  when 'Return'
@@ -276,12 +306,17 @@ class AgEditor
276
306
  $arcadia['shell'].run(@file.to_s)
277
307
  when 'F3'
278
308
  @find.do_find_next
309
+ when 'F1'
310
+ line, col = @text.index('insert').split('.')
311
+ _file = create_temp_file
312
+ _x, _y = @controller.xy_insert
313
+ EditorContract.instance.doc_code(@controller, 'file'=>_file, 'line'=>line.to_s, 'col'=>col.to_s, 'xdoc'=>_x, 'ydoc'=>_y)
279
314
  when 'Tab'
315
+ n_space = $arcadia['conf']['editor.tab-replace-width-space'].to_i
280
316
  _r = @text.tag_ranges('sel')
281
317
  if _r && _r[0]
282
318
  _row_begin = _r[0][0].split('.')[0].to_i
283
319
  _row_end = _r[_r.length - 1][1].split('.')[0].to_i
284
- n_space = $arcadia['conf']['editor.tab-replace-width-space'].to_i
285
320
  if n_space > 0
286
321
  suf = "\s"*n_space
287
322
  else
@@ -290,7 +325,10 @@ class AgEditor
290
325
  for _row in _row_begin..._row_end
291
326
  @text.insert(_row.to_s+'.0', suf)
292
327
  end
293
- break
328
+ break
329
+ elsif n_space > 0
330
+ @text.insert('insert', "\s"*n_space)
331
+ break
294
332
  end
295
333
  end
296
334
  }
@@ -364,10 +402,8 @@ class AgEditor
364
402
  end
365
403
  end
366
404
  }
367
-
368
-
369
- end
370
-
405
+ end
406
+
371
407
  def initialize_line_number(_frame)
372
408
  @text_line_num = TkText.new(_frame){
373
409
  wrap 'none'
@@ -426,7 +462,7 @@ class AgEditor
426
462
  '__LINE__', 'begin', 'defined?', 'ensure', 'module', 'redo', 'super', 'until',
427
463
  'BEGIN', 'break', 'do', 'false', 'next', 'rescue', 'then', 'when',
428
464
  'END', 'case', 'else', 'for', 'nil', 'retry', 'true', 'while',
429
- 'alias', 'class', 'elsif', 'if', 'not', 'return', 'undef', 'yield','require']
465
+ 'alias', 'class', 'elsif', 'if', 'not', 'return', 'undef', 'yield','require','include']
430
466
  _re_string = ''
431
467
  @keyword.each{|word|
432
468
  if _re_string.length > 0
@@ -457,7 +493,8 @@ class AgEditor
457
493
  do_tag_configure('sel')
458
494
  do_tag_configure('selected')
459
495
  do_tag_configure('operator')
460
-
496
+ do_tag_configure('tabs')
497
+ do_tag_configure('spaces')
461
498
  end
462
499
 
463
500
  def do_tag_configure(_name)
@@ -499,26 +536,30 @@ class AgEditor
499
536
  :hidemargin => false,
500
537
  :command=> proc{save}
501
538
  )
502
- # @pop_up.insert('end',
503
- # :command,
504
- # :label=>'New',
505
- # :hidemargin => false,
506
- # :command=> proc{@controller.open_buffer()}
507
- # )
508
- # @pop_up.insert('end',
509
- # :command,
510
- # :label=>'Open',
511
- # :hidemargin => false,
512
- # :command=> proc{ @controller.open_file(Tk.getOpenFile)}
513
- # )
514
- # @pop_up.insert('end',
515
- # :command,
516
- # :label=>'Close',
517
- # :hidemargin => false,
518
- # :command=> proc{
519
- # @controller.close_editor(self)
520
- # }
521
- # )
539
+
540
+ @pop_up.insert('end',
541
+ :command,
542
+ :label=>'Close',
543
+ :hidemargin => false,
544
+ :command=> proc{@controller.close_editor(self)}
545
+ )
546
+
547
+ @pop_up.insert('end',
548
+ :command,
549
+ :label=>'Close others',
550
+ :hidemargin => false,
551
+ :command=> proc{@controller.close_others_editor(self)}
552
+ )
553
+
554
+ @pop_up.insert('end',
555
+ :command,
556
+ :label=>'Close all',
557
+ :hidemargin => false,
558
+ :command=> proc{@controller.close_all_editor(self)}
559
+ )
560
+
561
+
562
+ @pop_up.insert('end', :separator)
522
563
 
523
564
  @pop_up.insert('end',
524
565
  :command,
@@ -536,31 +577,55 @@ class AgEditor
536
577
  @text.insert('insert', $arcadia['action.get.font'].call)
537
578
  }
538
579
  )
539
- # @pop_up.insert('end',
540
- # :command,
541
- # :label=>'Eval Toplevel',
542
- # :hidemargin => false,
543
- # :command=> proc{
544
- # _r = @text.tag_ranges('sel')
545
- # _ibegin = _r[_r.length - 1][0]
546
- # _iend = _r[_r.length - 1][1]
547
- # _cod = @text.get(_ibegin, _iend)
548
- # Revparsel.new(_cod, @file)
549
- # @text.tag_add('eval',_ibegin, _iend)
550
- # _reset = proc{
551
- # _message = 'Replace code with new '+$arcadia['objic'].active.agobj_start.i_name+'?'
552
- # _r = TkDialog2.new('message'=>_message, 'buttons'=>['Yes','No','Cancel']).show()
553
- # if _r == '0'
554
- # @text.tag_remove('eval',_ibegin, _iend)
555
- # @text.delete(_ibegin, _iend)
556
- # text_insert(_ibegin,$arcadia['objic'].active.objects2code.to_s){_edit_reset=false}
557
- # @text.tag_remove('sel','1.0', 'end')
558
- # $arcadia['objic'].del($arcadia['objic'].active)
559
- # end
560
- # }
561
- # @text.tag_bind('eval',"Double-ButtonPress-1",_reset)
562
- # }
563
- # )
580
+
581
+ @pop_up.insert('end', :separator)
582
+
583
+ @pop_up.insert('end',
584
+ :command,
585
+ :label=>'Show tabs',
586
+ :hidemargin => false,
587
+ :command=> proc{show_tabs}
588
+ )
589
+
590
+
591
+ @pop_up.insert('end',
592
+ :command,
593
+ :label=>'Hide tabs',
594
+ :hidemargin => false,
595
+ :command=> proc{hide_tabs}
596
+ )
597
+
598
+ @pop_up.insert('end',
599
+ :command,
600
+ :label=>'Show spaces',
601
+ :hidemargin => false,
602
+ :command=> proc{show_spaces}
603
+ )
604
+
605
+
606
+ @pop_up.insert('end',
607
+ :command,
608
+ :label=>'Hide spaces',
609
+ :hidemargin => false,
610
+ :command=> proc{hide_spaces}
611
+ )
612
+
613
+
614
+ @pop_up.insert('end',
615
+ :command,
616
+ :label=>'Space to tabs indentation',
617
+ :hidemargin => false,
618
+ :command=> proc{indentation_space_2_tabs}
619
+ )
620
+
621
+ @pop_up.insert('end',
622
+ :command,
623
+ :label=>'Tabs to space indentation',
624
+ :hidemargin => false,
625
+ :command=> proc{indentation_tabs_2_space}
626
+ )
627
+
628
+
564
629
  @text.bind("Button-3",
565
630
  proc{|x,y|
566
631
  _x = TkWinfo.pointerx(@text)
@@ -646,7 +711,6 @@ class AgEditor
646
711
  # _row = _row +1
647
712
  end
648
713
 
649
- @nodes << _row.to_s
650
714
  TreeNode.new(_parent, _kind){|_node|
651
715
  _node.label = _label
652
716
  _node.helptext = _helptext
@@ -669,38 +733,31 @@ class AgEditor
669
733
  end
670
734
 
671
735
  def build_tree_from_node(_node, _label_match=nil)
736
+
737
+ @image_kclass = TkPhotoImage.new('dat' => TREE_NODE_CLASS_GIF)
738
+ @image_kmodule = TkPhotoImage.new('dat' => TREE_NODE_MODULE_GIF)
739
+ @image_kdef = TkPhotoImage.new('dat' => TREE_NODE_DEF_GIF)
740
+ @image_kdefclass = TkPhotoImage.new('dat' => TREE_NODE_DEFCLASS_GIF)
741
+
672
742
  _sorted_sons = _node.sons.sort
673
743
  for inode in 0.._sorted_sons.length - 1
674
744
  _son = _sorted_sons[inode]
675
745
  if _son.kind == 'KClass'
676
- _window = TkLabel.new(@fm.left_frame){
677
- image TkPhotoImage.new('dat' => TREE_NODE_CLASS_GIF)
678
- background($arcadia['conf']['editor.explorer_panel.tree.color.background'])
679
- }
746
+ _image = @image_kclass
680
747
  elsif _son.kind == 'KModule'
681
- _window = TkLabel.new(@fm.left_frame){
682
- image TkPhotoImage.new('dat' => TREE_NODE_MODULE_GIF)
683
- background($arcadia['conf']['editor.explorer_panel.tree.color.background'])
684
- }
748
+ _image = @image_kmodule
685
749
  elsif _son.kind == 'KDef'
686
- _window = TkLabel.new(@fm.left_frame){
687
- image TkPhotoImage.new('dat' => TREE_NODE_DEF_GIF)
688
- background($arcadia['conf']['editor.explorer_panel.tree.color.background'])
689
- }
750
+ _image = @image_kdef
690
751
  elsif _son.kind == 'KDefClass'
691
- _window = TkLabel.new(@fm.left_frame){
692
- image TkPhotoImage.new('dat' => TREE_NODE_DEFCLASS_GIF)
693
- background($arcadia['conf']['editor.explorer_panel.tree.color.background'])
694
- }
752
+ _image = @image_kdefclass
695
753
  end
696
754
  @tree_exp.insert('end', _son.parent.rif ,_son.rif, {
697
755
  'text' => _son.label ,
698
756
  'helptext' => _son.helptext,
699
757
  'font'=>$arcadia['conf']['editor.explorer_panel.tree.font'],
700
- 'window'=> _window
758
+ 'image'=> _image
701
759
  }
702
760
  )
703
- @nodes << _son.rif
704
761
  if (_label_match) && (_label_match.strip == _son.label.strip)
705
762
  @selected = _son
706
763
  end
@@ -712,9 +769,16 @@ class AgEditor
712
769
  if _sel
713
770
  _label_sel = @tree_exp.itemcget(_sel,'text')
714
771
  end
772
+
715
773
  #clear tree
716
- @tree_exp.delete(@nodes)
717
- @nodes.clear
774
+ begin
775
+ @tree_exp.delete(@tree_exp.nodes('root'))
776
+ rescue Exception
777
+ # workaround on windows
778
+ @tree_exp.delete(@tree_exp.nodes('root'))
779
+ end
780
+
781
+
718
782
  #(re)build tree
719
783
  _txt = @text.get('1.0','end')
720
784
  @root = build_tree_from_source(_txt)
@@ -722,6 +786,8 @@ class AgEditor
722
786
  build_tree_from_node(@root, _label_sel)
723
787
  if @selected
724
788
  @tree_exp.selection_add(@selected.rif)
789
+ @tree_exp.open_tree(@selected.parent.rif)
790
+ @tree_exp.see(@selected.rif)
725
791
  end
726
792
  end
727
793
 
@@ -791,16 +857,98 @@ class AgEditor
791
857
  end
792
858
  end
793
859
 
794
- # def find_next_and_set_tag(_re, _row, _col, _txt, _tag)
795
- # m = _re.match(_txt)
796
- # if m
797
- # _txt = m.post_match
798
- # _ibegin = _row.to_s+'.'+(m.begin(0)+_end).to_s
799
- # _col = m.end(0)+ _col
800
- # _iend = _row.to_s+'.'+(_col.to_s)
801
- # @text.tag_add(_tag,_ibegin, _iend)
802
- # end
803
- # end
860
+ def show_spaces
861
+ @spaces_show = true
862
+ _row = 1
863
+ @text.value.each{|_line|
864
+ show_chars_line(_row, _line, /[ ^\t]\s*/, 'spaces')
865
+ _row = _row+1
866
+ }
867
+ end
868
+
869
+
870
+ def show_tabs
871
+ @tabs_show = true
872
+ _row = 1
873
+ @text.value.each{|_line|
874
+ show_chars_line(_row, _line, /\t/, 'tabs')
875
+ _row = _row+1
876
+ }
877
+ end
878
+
879
+
880
+ def show_chars_line(_row, _line, _re, _tag)
881
+ m = _re.match(_line)
882
+ _end = 0
883
+ while m
884
+ _txt = m.post_match
885
+ _ibegin = _row.to_s+'.'+(m.begin(0)+_end).to_s
886
+ _end = m.end(0) + _end
887
+ _iend = _row.to_s+'.'+(_end.to_s)
888
+ @text.tag_add(_tag,_ibegin, _iend)
889
+ m = _re.match(_txt)
890
+ end
891
+ end
892
+
893
+ def indentation_space_2_tabs(_n_space=2)
894
+ _row = 1
895
+ @text.value.each{|_line|
896
+ m = /\s*/.match(_line)
897
+ _end = 0
898
+ if m && m.begin(0)==0
899
+ _s = m[0]
900
+ if !_s.include?("\n") && !_s.include?("\t")
901
+ _ibegin = _row.to_s+'.0'
902
+ _iend = _row.to_s+'.'+m.end(0).to_s
903
+ _n_tab = (_s.length / _n_space).round
904
+ @text.delete(_ibegin, _iend)
905
+ @text.insert(_ibegin,"\t"*_n_tab )
906
+ end
907
+ end
908
+ _row = _row+1
909
+ }
910
+ if modified?
911
+ set_modify
912
+ else
913
+ reset_modify
914
+ end
915
+
916
+ end
917
+
918
+ def indentation_tabs_2_space(_n_space=2)
919
+ _row = 1
920
+ @text.value.each{|_line|
921
+ m = /\t*/.match(_line)
922
+ _end = 0
923
+ if m && m.begin(0)==0
924
+ _s = m[0]
925
+ if !_s.include?("\n")
926
+ _ibegin = _row.to_s+'.0'
927
+ _iend = _row.to_s+'.'+m.end(0).to_s
928
+ @text.delete(_ibegin, _iend)
929
+ @text.insert(_ibegin,"\s"*_s.length*_n_space )
930
+ end
931
+ end
932
+ _row = _row+1
933
+ }
934
+ if modified?
935
+ set_modify
936
+ else
937
+ reset_modify
938
+ end
939
+ end
940
+
941
+
942
+ def hide_tabs
943
+ @text.tag_remove('tabs','1.0', 'end')
944
+ @tabs_show = false
945
+ end
946
+
947
+ def hide_spaces
948
+ @text.tag_remove('spaces','1.0', 'end')
949
+ @spaces_show = false
950
+ end
951
+
804
952
 
805
953
  def modified?
806
954
  return !(@buffer === text_value)
@@ -852,6 +1000,8 @@ class AgEditor
852
1000
  arem << 'operator'
853
1001
  find_and_set_tag(@re_string, _row, _txt, 'string', arem)
854
1002
  end
1003
+ find_and_set_tag(/\t/, _row, _txt, 'tabs', arem) if @tabs_show
1004
+ find_and_set_tag(/[ ^\t]\s*/, _row, _txt, 'spaces', arem) if @spaces_show
855
1005
  end
856
1006
 
857
1007
  def rehighlightline(_row)
@@ -979,60 +1129,69 @@ class AgEditor
979
1129
  ensure
980
1130
  f.close unless f.nil?
981
1131
  end
1132
+ EditorContract.instance.file_saved(self,'file' =>@file)
982
1133
  end
983
1134
  end
984
1135
 
985
1136
  def save_as
986
- @file = Tk.getSaveFile
1137
+ @file = Tk.getSaveFile("filetypes"=>[["Ruby Files", [".rb", ".rbw"]]])
1138
+ @file = nil if @file == "" # cancelled
987
1139
  if @file
988
1140
  save
989
1141
  @controller.change_file_name(@page_frame, @file)
1142
+ EditorContract.instance.file_created(self, 'file'=>@file)
990
1143
  end
991
1144
  end
992
1145
 
993
1146
 
994
- def check_file_last_access_time
995
- if @file && @file_last_access_time
996
-
997
- ftime = File.mtime(@file)
998
- if @file_last_access_time != ftime
999
- msg = 'File "'+@file+'" is changed! Reload?'
1147
+ def check_file_last_access_time
1148
+ if @file && @file_last_access_time
1149
+
1150
+ ftime = File.mtime(@file)
1151
+ if @file_last_access_time != ftime
1152
+ msg = 'File "'+@file+'" is changed! Reload?'
1000
1153
  if Tk.messageBox('icon' => 'error', 'type' => 'yesno',
1001
1154
  'title' => '(Arcadia) Libs', 'parent' => @text,
1002
1155
  'message' => msg) == 'yes'
1003
- @text.delete('1.0','end')
1004
- load_file(@file)
1005
- else
1006
- @file_last_access_time = ftime
1156
+ @text.delete('1.0','end')
1157
+ load_file(@file)
1158
+ else
1159
+ @file_last_access_time = ftime
1007
1160
  end
1008
- end
1009
- end
1010
- end
1011
-
1012
- def init_editing(_ext='rb')
1013
- case _ext
1014
- when 'rb'
1015
- @fm = AGTkVSplittedFrames.new(@page_frame,150)
1016
- @fm1 = AGTkVSplittedFrames.new(@fm.right_frame,60)
1161
+ end
1162
+ end
1163
+ end
1164
+
1165
+ def init_editing(_ext='rb')
1166
+ case _ext
1167
+ when 'rb'
1168
+ @fm = AGTkVSplittedFrames.new(@page_frame,150)
1169
+ @fm1 = AGTkVSplittedFrames.new(@fm.right_frame,60)
1017
1170
  initialize_text(@fm1.right_frame)
1018
- initialize_text_binding
1019
- initialize_highlight
1020
- initialize_line_number(@fm1.left_frame)
1021
- initialize_tree(@fm.left_frame)
1022
- else
1023
- @fm1 = AGTkVSplittedFrames.new(@page_frame,60)
1171
+ initialize_text_binding
1172
+ initialize_highlight
1173
+ initialize_line_number(@fm1.left_frame)
1174
+ initialize_tree(@fm.left_frame)
1175
+ when nil
1176
+ @fm1 = AGTkVSplittedFrames.new(@page_frame,60)
1024
1177
  initialize_text(@fm1.right_frame)
1025
- initialize_text_binding
1026
- initialize_line_number(@fm1.left_frame)
1027
- end
1028
- end
1029
-
1030
- def file_extension(_filename=nil)
1031
- if _filename
1032
- _m = /(.*\.)(.*$)/.match(File.basename(_filename))
1033
- return _m[2] if _m && _m.length > 1
1034
- end
1035
- end
1178
+ initialize_text_binding
1179
+ initialize_highlight
1180
+ initialize_line_number(@fm1.left_frame)
1181
+ else
1182
+ @fm1 = AGTkVSplittedFrames.new(@page_frame,60)
1183
+ initialize_text(@fm1.right_frame)
1184
+ initialize_text_binding
1185
+ initialize_line_number(@fm1.left_frame)
1186
+ end
1187
+ end
1188
+
1189
+ def file_extension(_filename=nil)
1190
+ if _filename
1191
+ _m = /(.*\.)(.*$)/.match(File.basename(_filename))
1192
+ end
1193
+ _ret = (_m && _m.length > 1)?_m[2]: nil
1194
+ end
1036
1195
 
1037
1196
  def load_file(_filename = nil)
1038
1197
  #if filename is nil then open a new tab
@@ -1078,21 +1237,22 @@ end
1078
1237
 
1079
1238
  class AgMultiEditor < ArcadiaExt
1080
1239
  attr_reader :breakpoints
1081
- attr_reader :splitted_frame
1082
- def before_build
1240
+ attr_reader :splitted_frame
1241
+ def before_build
1083
1242
  ArcadiaContractListener.new(self, DebugContract, :do_debug_event)
1084
1243
  ArcadiaContractListener.new(self, EditorContract, :do_editor_event)
1085
1244
  ArcadiaContractListener.new(self, MainContract, :do_main_event)
1086
- end
1245
+ end
1087
1246
 
1088
1247
  def build
1089
1248
  if @arcadia.layout.headed?
1090
- title_frame = @arcadia.layout.domain(conf('frame'))['root']
1249
+ title_frame = @arcadia.layout.domain(conf('frame'))['root']
1091
1250
  #@close_button = title_frame.add_button(nil,nil,TAB_CLOSE_GIF,'left')
1092
1251
  end
1093
1252
 
1094
- @splitted_frame = AGTkOSplittedFrames.new(self.frame,20)
1095
- @main_frame = AgMultiEditorView.new(@splitted_frame.bottom_frame)
1253
+ #@splitted_frame = AGTkOSplittedFrames.new(self.frame,20)
1254
+ #@main_frame = AgMultiEditorView.new(@splitted_frame.bottom_frame)
1255
+ @main_frame = AgMultiEditorView.new(self.frame)
1096
1256
  #@close_button.bind('1',proc{close_raised})
1097
1257
  @tabs_file =Hash.new
1098
1258
  @tabs_editor =Hash.new
@@ -1101,9 +1261,9 @@ class AgMultiEditor < ArcadiaExt
1101
1261
  pop_up_menu
1102
1262
  end
1103
1263
 
1104
- def after_build
1105
- self.open_last_files
1106
- end
1264
+ def after_build
1265
+ self.open_last_files
1266
+ end
1107
1267
 
1108
1268
  def pop_up_menu
1109
1269
  @pop_up = TkMenu.new(
@@ -1115,33 +1275,47 @@ class AgMultiEditor < ArcadiaExt
1115
1275
  :command,
1116
1276
  :label=>'...',
1117
1277
  :state=>'disabled',
1118
- :background=>'yellow',
1119
- :activebackground=>'yellow',
1278
+ :background=>'blue',
1279
+ :font => conf('font.bold'),
1120
1280
  :hidemargin => true
1121
1281
  )
1122
1282
  @c = @pop_up.insert('end',
1123
1283
  :command,
1124
1284
  :label=>'Close',
1285
+ :font => conf('font'),
1125
1286
  :hidemargin => false,
1126
1287
  :command=> proc{
1127
1288
  if @selected_tab_name_from_popup != nil
1128
- _e = @tabs_editor[@selected_tab_name_from_popup]
1129
- self.close_editor(_e)
1289
+ _e = @tabs_editor[@selected_tab_name_from_popup]
1290
+ self.close_editor(_e)
1130
1291
  end
1131
1292
  }
1132
1293
  )
1133
1294
  @c = @pop_up.insert('end',
1134
1295
  :command,
1135
1296
  :label=>'Close others',
1297
+ :font => conf('font'),
1136
1298
  :hidemargin => false,
1137
1299
  :command=> proc{
1138
1300
  if @selected_tab_name_from_popup != nil
1139
- _e = @tabs_editor[@selected_tab_name_from_popup]
1140
- self.close_others_editor(_e)
1301
+ _e = @tabs_editor[@selected_tab_name_from_popup]
1302
+ self.close_others_editor(_e)
1141
1303
  end
1142
1304
  }
1143
1305
  )
1144
-
1306
+ @c = @pop_up.insert('end',
1307
+ :command,
1308
+ :label=>'Close all',
1309
+ :font => conf('font'),
1310
+ :hidemargin => false,
1311
+ :command=> proc{
1312
+ if @selected_tab_name_from_popup != nil
1313
+ _e = @tabs_editor[@selected_tab_name_from_popup]
1314
+ self.close_all_editor(_e)
1315
+ end
1316
+ }
1317
+ )
1318
+
1145
1319
  @main_frame.enb.tabbind("Button-3",
1146
1320
  proc{|*x|
1147
1321
  _x = TkWinfo.pointerx(@main_frame.enb)
@@ -1153,39 +1327,60 @@ class AgMultiEditor < ArcadiaExt
1153
1327
  _index = @main_frame.enb.index(@selected_tab_name_from_popup)
1154
1328
  end
1155
1329
  if _index != -1
1156
- _file = @main_frame.enb.itemcget(@selected_tab_name_from_popup, 'text')
1157
- @pop_up.entryconfigure(0, 'label'=>_file)
1158
- @pop_up.popup(_x,_y)
1330
+ _file = @main_frame.enb.itemcget(@selected_tab_name_from_popup, 'text')
1331
+ @pop_up.entryconfigure(0, 'label'=>_file)
1332
+ @pop_up.popup(_x,_y)
1159
1333
  end
1160
1334
  })
1161
1335
  end
1162
1336
 
1163
1337
 
1164
- def do_debug_event(_event)
1165
- #@arcadia.outln('_sender ----> '+_sender.to_s)
1166
- #@arcadia.outln('_event.signature ----> '+_event.signature)
1167
- case _event.signature
1168
- when DebugContract::DEBUG_BEGIN
1169
- self.debug_begin
1170
- when DebugContract::DEBUG_END
1171
- self.debug_end
1172
- when DebugContract::DEBUG_STEP
1173
- if _event.context.file
1174
- self.open_file_in_debug(_event.context.file, _event.context.line)
1175
- end
1176
- end
1177
- end
1178
-
1179
- def do_editor_event(_event)
1180
- case _event.signature
1181
- when EditorContract::OPEN_FILE
1182
- if _event.context.file
1183
- if _event.context.line
1184
- _index = _event.context.line.to_s+'.0'
1185
- end
1186
- self.open_file(_event.context.file, _index)
1187
- _event.handled(self)
1188
- end
1338
+ def do_debug_event(_event)
1339
+ #@arcadia.outln('_sender ----> '+_sender.to_s)
1340
+ #@arcadia.outln('_event.signature ----> '+_event.signature)
1341
+ case _event.signature
1342
+ when DebugContract::DEBUG_BEGIN
1343
+ self.debug_begin
1344
+ when DebugContract::DEBUG_END
1345
+ self.debug_end
1346
+ when DebugContract::DEBUG_STEP
1347
+ if _event.context.file
1348
+ self.open_file_in_debug(_event.context.file, _event.context.line)
1349
+ end
1350
+ end
1351
+ end
1352
+
1353
+ def do_editor_event(_event)
1354
+ case _event.signature
1355
+ when EditorContract::OPEN_FILE
1356
+ if _event.context.file
1357
+ if _event.context.line
1358
+ _index = _event.context.line.to_s+'.0'
1359
+ end
1360
+ self.open_file(_event.context.file, _index)
1361
+ _event.handled(self)
1362
+ end
1363
+ when EditorContract::CLOSE_FILE
1364
+ if _event.context.file
1365
+ self.close_file(_event.context.file)
1366
+ _event.handled(self)
1367
+ end
1368
+ when EditorContract::SAVE_FILE_RAISED
1369
+ self.raised.save
1370
+ _event.handled(self)
1371
+ when EditorContract::SAVE_FILE
1372
+ if _event.context.file
1373
+ self.save_file(_event.context.file)
1374
+ _event.handled(self)
1375
+ end
1376
+ when EditorContract::SAVE_AS_FILE_RAISED
1377
+ self.raised.save_as
1378
+ _event.handled(self)
1379
+ when EditorContract::SAVE_AS_FILE
1380
+ if _event.context.file
1381
+ self.save_as_file(_event.context.file)
1382
+ _event.handled(self)
1383
+ end
1189
1384
  when EditorContract::OPEN_TEXT
1190
1385
  if _event.context.title
1191
1386
  _tab_name = self.tab_name(_event.context.title)
@@ -1197,126 +1392,129 @@ class AgMultiEditor < ArcadiaExt
1197
1392
  add_reverse_item(_e)
1198
1393
  _event.handled(self)
1199
1394
  end
1200
- when EditorContract::CLOSE_FILE
1201
- if _event.context.file
1202
- self.close_file(_event.context.file)
1203
- _event.handled(self)
1204
- end
1205
- end
1206
- end
1207
-
1208
- def do_main_event(_event)
1209
- case _event.signature
1395
+ when EditorContract::SHOW_SEARCH_DIALOG
1396
+ @find.show
1397
+ when EditorContract::SHOW_GOTO_LINE_DIALOG
1398
+ @find.show_go_to_line_dialog
1399
+ end
1400
+ end
1401
+
1402
+ def xy_insert
1403
+ _text = self.raised.text
1404
+ _index_now = _text.index('insert')
1405
+ _rx, _ry, _widht, _heigth = _text.bbox(_index_now);
1406
+ _x = _rx + TkWinfo.rootx(_text)
1407
+ _y = _ry + TkWinfo.rooty(_text) + TkFont.new(conf('font')).metrics[2][1]
1408
+ _xroot = _x - TkWinfo.rootx(@arcadia.layout.root)
1409
+ _yroot = _y - TkWinfo.rooty(@arcadia.layout.root)
1410
+ return _xroot, _yroot
1411
+ end
1412
+
1413
+
1414
+
1415
+ def raise_complete_code(_context)
1416
+ # delete the file used for completion
1417
+ if File.exist?(_context.file) && _context.file.include?('~~')
1418
+ File.delete(_context.file)
1419
+ end
1420
+ @raised_listbox.destroy if @raised_listbox != nil
1421
+
1422
+ _text = self.raised.text
1423
+ _index_call = _context.line+'.'+_context.col
1424
+ _index_now = _text.index('insert')
1425
+ if _index_call == _index_now
1426
+ _target = _text.get('insert - 1 chars wordstart','insert')
1427
+ if _target.length > 0 && _target != '.'
1428
+ extra_len = _target.length.+@
1429
+ _begin_index = _index_now<<' - '<<extra_len.to_s<<' chars'
1430
+ _text.tag_add('sel', _begin_index, _index_now)
1431
+ else
1432
+ _begin_index = _index_now
1433
+ extra_len = 0
1434
+ end
1435
+ if _context.candidates.length > 1
1436
+ _rx, _ry, _widht, heigth = _text.bbox(_begin_index);
1437
+ _x = _rx + TkWinfo.rootx(_text)
1438
+ _y = _ry + TkWinfo.rooty(_text) + TkFont.new(conf('font')).metrics[2][1]
1439
+
1440
+ _xroot = _x - TkWinfo.rootx(@arcadia.layout.root)
1441
+ _yroot = _y - TkWinfo.rooty(@arcadia.layout.root)
1442
+
1443
+ _max_height = TkWinfo.screenheight(@arcadia.layout.root) - _y - 5
1444
+
1445
+ @raised_listbox = TkListbox.new(@arcadia.layout.root,
1446
+ 'takefocus'=>true,
1447
+ :background=>conf('color.background'),
1448
+ :foreground=>conf('color.foreground'),
1449
+ :selectbackground=>'yellow',
1450
+ :selectforeground=>'red',
1451
+ :activestyle=>'none',
1452
+ :font => conf('font'),
1453
+ :borderwidth=>1
1454
+ )
1455
+ _font = TkFont.new(conf('font'))
1456
+ _char_height = _font.metrics[2][1]
1457
+ _width = 0
1458
+ _docs_entries = Hash.new
1459
+ _context.candidates.each{|value|
1460
+ _key, _doc = value.split
1461
+ _docs_entries[_key]= _doc
1462
+ @raised_listbox.insert('end', _key)
1463
+ _temp_width = _font.measure(_key) + _font.measure('X')
1464
+ _width = _temp_width if _temp_width > _width
1465
+ }
1466
+ _height = (_context.candidates.length+1)*_char_height
1467
+ _height = _max_height if _height > _max_height
1468
+ @raised_listbox.place('x'=>_xroot,'y'=>_yroot, 'width'=>_width, 'height'=>_height)
1469
+
1470
+ @raised_listbox.focus
1471
+ @raised_listbox.bind_append('KeyPress'){|e|
1472
+ case e.keysym
1473
+ when 'Escape'
1474
+ @raised_listbox.destroy
1475
+ #_menu.destroy
1476
+ Tk.callback_break
1477
+ when 'Return'
1478
+ _value = @raised_listbox.get('active')
1479
+ _text.delete(_begin_index,'insert')
1480
+ _text.insert('insert',_value)
1481
+ @raised_listbox.destroy
1482
+ #_menu.destroy
1483
+ Tk.callback_break
1484
+ when 'F1'
1485
+ _key = @raised_listbox.get('active')
1486
+ _x, _y = xy_insert
1487
+ EditorContract.instance.doc_code(self, 'doc_entry'=>_docs_entries[_key], 'xdoc'=>_x, 'ydoc'=>_y)
1488
+ end
1489
+ }
1490
+ elsif _context.candidates.length == 1 && _context.candidates[0].length>0
1491
+ _text.delete(_begin_index,'insert');
1492
+ _text.insert('insert',_context.candidates[0].split[0])
1493
+ end
1494
+ end
1495
+ end
1496
+
1497
+ def do_main_event(_event)
1498
+ case _event.signature
1210
1499
  when MainContract::EVENT_HANDLED
1211
1500
  _cause = _event.context.caused_by
1212
1501
  if _cause.signature == EditorContract::COMPLETE_CODE &&
1213
1502
  _cause.context.sender == self.raised
1214
- # delete the file used for completion
1215
- if File.exist?(_cause.context.file) && _cause.context.file.include?('~~')
1216
- File.delete(_cause.context.file)
1217
- end
1218
-
1219
- _text = self.raised.text
1220
- _index_call = _cause.context.line+'.'+_cause.context.col
1221
- _index_now = _text.index('insert')
1222
- if _index_call == _index_now
1223
- _target = _text.get('insert - 1 chars wordstart','insert')
1224
- if _target.length > 0 && _target != '.'
1225
- extra_len = _target.length.+@
1226
- _begin_index = _index_now<<' - '<<extra_len.to_s<<' chars'
1227
- _text.tag_add('sel', _begin_index, _index_now)
1228
- else
1229
- _begin_index = _index_now
1230
- extra_len = 0
1231
- end
1232
- if _cause.context.candidates.length > 1
1233
- _rx, _ry, _widht, heigth = _text.bbox(_begin_index);
1234
- _menu = TkMenu.new(
1235
- :parent=>_text,
1236
- :tearoff=>0,
1237
- :relief=>'solid',
1238
- :borderwidth=>1,
1239
- :background=>conf('color.background'),
1240
- :foreground=>conf('color.foreground'),
1241
- :font => conf('font')
1242
- )
1243
- _cause.context.candidates.each{|item|
1244
- _value, _hint = item.split
1245
- if _hint
1246
- _menu.insert('end',
1247
- :command,
1248
- :accelerator=>_hint.split('#')[0],
1249
- :command=> proc{_text.delete(_begin_index,'insert'); _text.insert('insert',_value)},
1250
- :label=>_value,
1251
- :activebackground=>'yellow',
1252
- :hidemargin => true
1253
- )
1254
- else
1255
- _menu.insert('end',
1256
- :command,
1257
- :command=> proc{_text.delete(_begin_index,'insert'); _text.insert('insert',_value)},
1258
- :label=>_value,
1259
- :activebackground=>'yellow',
1260
- :hidemargin => true
1261
- )
1262
- end
1263
- }
1264
-
1265
- _x = _rx + TkWinfo.rootx(_text)
1266
- _y = _ry + TkWinfo.rooty(_text) + TkFont.new(conf('font')).metrics[2][1]
1267
- _menu.popup(_x,_y)
1268
-
1269
- _old_g = TkWinfo.geometry(_menu)
1270
- _w,_h = _old_g.split('+')[0].split('x')
1271
- _yy = TkWinfo.screenheight(_menu) - _y - 5
1272
- if _h.to_i > _yy
1273
- _h = _yy.to_s
1274
- _w = (_w.to_i+5).to_s
1275
- _new_g = _w+'x'+_h+'+'+_x.to_s+'+'+_y.to_s
1276
- Tk.tk_call('wm', 'geometry', _menu, _new_g )
1277
- _listbox = TkListbox.new(_menu,
1278
- 'takefocus'=>true,
1279
- :background=>conf('color.background'),
1280
- :foreground=>conf('color.foreground'),
1281
- :selectbackground=>'yellow',
1282
- :activestyle=>'none',
1283
- :font => conf('font'),
1284
- :borderwidth=>1
1285
- ).place('x'=>0,'y'=>0, 'relwidth'=>1, 'relheight'=>1)
1286
- _listbox.focus
1287
- _listbox.bind_append('KeyPress'){|e|
1288
- case e.keysym
1289
- when 'Escape'
1290
- _listbox.destroy
1291
- _menu.destroy
1292
- Tk.callback_break
1293
- when 'Return'
1294
- _value = _listbox.get('active')
1295
- _text.delete(_begin_index,'insert')
1296
- _text.insert('insert',_value)
1297
- _listbox.destroy
1298
- _menu.destroy
1299
- Tk.callback_break
1300
- end
1301
- }
1302
- _cause.context.candidates.each{|value|
1303
- _listbox.insert('end', value)
1304
- }
1305
- end
1306
- elsif _cause.context.candidates.length == 1 && _cause.context.candidates[0].length>0
1307
- _text.delete(_begin_index,'insert');
1308
- _text.insert('insert',_cause.context.candidates[0].split[0])
1309
- end
1310
- end
1311
- end
1312
- end
1313
- end
1503
+ raise_complete_code(_cause.context)
1504
+ elsif _cause.signature == EditorContract::DOC_CODE && _cause.context.file != nil
1505
+ # delete the file used for completion
1506
+ if File.exist?(_cause.context.file) && _cause.context.file.include?('~~')
1507
+ File.delete(_cause.context.file)
1508
+ end
1509
+ end
1510
+ end
1511
+ end
1314
1512
 
1315
1513
  def add_reverse_item(_editor)
1316
1514
  code2form = proc{
1317
1515
  Revparsel.new(_editor.text_value)
1318
1516
  self.close_editor(_editor, false)
1319
- InspectorContract.instance.raise_last_widget(InspectorContract::TInspectorObj.new(self))
1517
+ InspectorContract.instance.raise_last_widget(self)
1320
1518
  }
1321
1519
  _editor.insert_popup_menu_item('end',
1322
1520
  :command,
@@ -1326,7 +1524,7 @@ class AgMultiEditor < ArcadiaExt
1326
1524
  )
1327
1525
 
1328
1526
  end
1329
-
1527
+
1330
1528
  # def editor_state
1331
1529
  # r = EditorContract::SObj.new
1332
1530
  # r.raised_file = self.raised.file
@@ -1340,7 +1538,10 @@ class AgMultiEditor < ArcadiaExt
1340
1538
 
1341
1539
  def create_find
1342
1540
  #find_frame = @arcadia.layout.register_panel(conf('find.frame'),'Find', 'Find')
1343
- @find = Find.new(@splitted_frame.top_frame, self)
1541
+ # @find = Find.new(@splitted_frame.top_frame, self)
1542
+ @find = Find.new(@arcadia.layout.root, self)
1543
+ @find.on_close=proc{@find.hide}
1544
+ @find.hide
1344
1545
  end
1345
1546
 
1346
1547
  def finalize
@@ -1367,18 +1568,12 @@ class AgMultiEditor < ArcadiaExt
1367
1568
  end
1368
1569
 
1369
1570
  def breakpoint_add(_file,_line)
1370
- _tobj = EditorContract::TEditorObj.new(self)
1371
- _tobj.file = _file
1372
- _tobj.line = _line
1373
- EditorContract.instance.breakpoint_created(_tobj)
1571
+ EditorContract.instance.breakpoint_created(self, 'file'=>_file, 'line'=>_line)
1374
1572
  @breakpoints << {:file=>_file,:line=>_line}
1375
1573
  end
1376
1574
 
1377
1575
  def breakpoint_del(_file,_line)
1378
- _tobj = EditorContract::TEditorObj.new(self)
1379
- _tobj.file = _file
1380
- _tobj.line = _line
1381
- EditorContract.instance.breakpoint_deleted(_tobj)
1576
+ EditorContract.instance.breakpoint_deleted(self, 'file'=>_file, 'line'=>_line)
1382
1577
  @breakpoints.delete_if{|b| (b[:file]==_file && b[:line]==_line)}
1383
1578
  end
1384
1579
 
@@ -1534,8 +1729,8 @@ class AgMultiEditor < ArcadiaExt
1534
1729
  _e = @tabs_editor[_name]
1535
1730
  if _e && _e.file != nil
1536
1731
  _new_caption = _e.file
1537
- @find.use(_e)
1538
- _e.check_file_last_access_time
1732
+ @find.use(_e)
1733
+ _e.check_file_last_access_time
1539
1734
  else
1540
1735
  _new_caption = _title
1541
1736
  end
@@ -1544,7 +1739,7 @@ class AgMultiEditor < ArcadiaExt
1544
1739
  @arcadia.layout.domain(@arcadia['conf'][@name+'.frame'])['root'].top_text(_new_caption)
1545
1740
  end
1546
1741
  _title = @tabs_file[_name] != nil ? File.basename(@tabs_file[_name]) :_name
1547
- EditorContract.instance.buffer_raised(EditorContract::TEditorObj.new(self, 'title'=>_title, 'file'=>@tabs_file[_name]))
1742
+ EditorContract.instance.buffer_raised(self, 'title'=>_title, 'file'=>@tabs_file[_name])
1548
1743
  end
1549
1744
 
1550
1745
  def editor_exist?(_filename)
@@ -1584,9 +1779,7 @@ class AgMultiEditor < ArcadiaExt
1584
1779
  @tabs_file[_tab_name]= _filename
1585
1780
  @tabs_editor[_tab_name].load_file(_filename)
1586
1781
  #do_buffer_raise(_tab_name)
1587
- _tobj =EditorContract::TEditorObj.new(self)
1588
- _tobj.file= _filename
1589
- EditorContract.instance.file_opened(_tobj)
1782
+ EditorContract.instance.file_opened(self, 'file'=>_filename)
1590
1783
  end
1591
1784
 
1592
1785
  if _text_index != nil && _text_index != '1.0'
@@ -1639,6 +1832,11 @@ class AgMultiEditor < ArcadiaExt
1639
1832
  end
1640
1833
  end
1641
1834
 
1835
+ def close_all_editor(_editor, _mod=true)
1836
+ @tabs_editor.values.each do |_e|
1837
+ close_editor(_e)
1838
+ end
1839
+ end
1642
1840
 
1643
1841
  def close_editor(_editor, _mod=true)
1644
1842
  if ((_mod)&&(_editor.modified?))
@@ -1654,9 +1852,7 @@ class AgMultiEditor < ArcadiaExt
1654
1852
  else
1655
1853
  close_tab(_editor.page_frame)
1656
1854
  end
1657
- _tobj = EditorContract::TEditorObj.new(self)
1658
- _tobj.file = _editor.file
1659
- EditorContract.instance.file_closed(_tobj)
1855
+ EditorContract.instance.file_closed(self, 'file'=>_editor.file)
1660
1856
  end
1661
1857
 
1662
1858
  def close_tab(_page_frame)
@@ -1672,78 +1868,120 @@ class AgMultiEditor < ArcadiaExt
1672
1868
  def close_file(_filename)
1673
1869
  close_editor(@tabs_editor[tab_name(_filename)])
1674
1870
  end
1871
+
1872
+ def save_file(_filename)
1873
+ @tabs_editor[tab_name(_filename)].save
1874
+ end
1875
+
1876
+ def save_as_file(_filename)
1877
+ @tabs_editor[tab_name(_filename)].save_as
1878
+ end
1879
+
1675
1880
  end
1676
1881
 
1677
- class Findview < TkFrame
1882
+ class Findview < TkFloatTitledFrame
1678
1883
  def initialize(_parent)
1679
1884
  super(_parent)
1680
- @cb_reg = TkCheckButton.new(self){|_cb_reg|
1681
- text 'regexp'
1885
+ #stop_resizing
1886
+ y0 = 10
1887
+ d = 23
1888
+ TkLabel.new(self.frame){
1889
+ text 'Find what:'
1890
+ place('x' => 8,'y' => y0,'height' => 19)
1891
+ }
1892
+ y0 = y0 + d
1893
+ @e_what = Tk::BWidget::ComboBox.new(self.frame){
1894
+ editable true
1895
+ justify 'left'
1896
+ relief 'ridge'
1897
+ autocomplete 'true'
1898
+ #insertbackground '#FFFFFF'
1899
+ entrybg '#FFFFFF'
1900
+ expand 'tab'
1901
+ takefocus 'true'
1902
+ #pack('padx'=>10, 'fill'=>'x')
1903
+ place('relwidth' => 1, 'width'=>-16,'x' => 8,'y' => y0,'height' => 19)
1904
+ }
1905
+ y0 = y0 + d
1906
+ TkLabel.new(self.frame){
1907
+ text 'Replace with:'
1908
+ place('x' => 8,'y' => y0,'height' => 19)
1909
+ }
1910
+ y0 = y0 + d
1911
+
1912
+ @e_with = Tk::BWidget::ComboBox.new(self.frame){
1913
+ editable true
1914
+ justify 'left'
1915
+ relief 'ridge'
1916
+ autocomplete 'true'
1917
+ #insertbackground '#FFFFFF'
1918
+ entrybg '#FFFFFF'
1919
+ expand 'tab'
1920
+ takefocus 'true'
1921
+ #pack('padx'=>10, 'fill'=>'x')
1922
+ place('relwidth' => 1, 'width'=>-16,'x' => 8,'y' => y0,'height' => 19)
1923
+ }
1924
+
1925
+ y0 = y0 + d
1926
+ @cb_reg = TkCheckButton.new(self.frame){|_cb_reg|
1927
+ text 'Use Regular Expression'
1682
1928
  justify 'left'
1683
1929
  relief 'flat'
1684
- pack('side'=>'left', 'anchor'=>'e')
1685
- #place('relwidth' => 0,'x' => 8,'y' => 14,'relheight' => 0,'rely' => 0,'height' => 22,'bordermode' => 'inside','width' => 62)
1930
+ #pack('side'=>'left', 'anchor'=>'e')
1931
+ place('x' => 8,'y' => y0,'height' => 22)
1686
1932
  }
1687
- # @e_kind = Tk::BWidget::ComboBox.new(self){
1688
- # editable true
1689
- # justify 'left'
1690
- # relief 'groove'
1691
- # autocomplete 'true'
1692
- # insertbackground '#FFFFFF'
1693
- # expand 'tab'
1694
- # values 'forwards backwards page'
1695
- # takefocus 'true'
1696
- # pack('side'=>'left', 'anchor'=>'e')
1697
- # }
1698
- @rb = TkRadioButton.new(self){
1699
- value 'forwards'
1700
- text 'forwards'
1701
- select
1702
- pack('side'=>'left', 'anchor'=>'e')
1703
- #place('relx' => 0,'x' => 8,'y' => 64,'relheight' => 0,'rely' => 0,'height' => 23,'bordermode' => 'inside')
1933
+ y0 = y0 + d
1934
+ @cb_back = TkCheckButton.new(self.frame){|_cb_reg|
1935
+ text 'Search backwards'
1936
+ justify 'left'
1937
+ relief 'flat'
1938
+ #pack('side'=>'left', 'anchor'=>'e')
1939
+ place('x' => 8,'y' => y0,'height' => 22)
1704
1940
  }
1705
- TkRadioButton.new(self){
1706
- value 'backwards'
1707
- text 'backwards'
1708
- pack('side'=>'left', 'anchor'=>'e')
1709
- #place('relx' => 0,'x' => 8,'y' => 84,'relheight' => 0,'rely' => 0,'height' => 23,'bordermode' => 'inside')
1941
+
1942
+ y0 = y0 + d
1943
+ y0 = y0 + d
1944
+ @buttons_frame = TkFrame.new(self.frame).pack('fill'=>'x', 'side'=>'bottom')
1945
+
1946
+ @b_replace_all = TkButton.new(@buttons_frame){|_b_go|
1947
+ state 'disabled'
1948
+ default 'disabled'
1949
+ text 'Replace All'
1950
+ overrelief 'raised'
1951
+ justify 'center'
1952
+ #width 15
1953
+ pack('side'=>'right','ipadx'=>5, 'padx'=>5)
1954
+ #place('width' => 50,'x' => 0,'y' => y0,'height' => 23,'bordermode' => 'inside')
1710
1955
  }
1711
- TkRadioButton.new(self){
1712
- value 'line'
1713
- text 'line'
1714
- pack('side'=>'left', 'anchor'=>'e')
1715
- #place('relx' => 0,'x' => 8,'y' => 104,'relheight' => 0,'rely' => 0,'height' => 23,'bordermode' => 'inside')
1956
+
1957
+
1958
+ @b_replace = TkButton.new(@buttons_frame){|_b_go|
1959
+ state 'disabled'
1960
+ default 'disabled'
1961
+ text 'Replace'
1962
+ overrelief 'raised'
1963
+ justify 'center'
1964
+ #width 15
1965
+ pack('side'=>'right','ipadx'=>5, 'padx'=>5)
1966
+ #place('width' => 50,'x' => 0,'y' => y0,'height' => 23,'bordermode' => 'inside')
1716
1967
  }
1717
- # TkLabel.new(self){
1718
- # text 'what'
1719
- # pack('side'=>'left', 'anchor'=>'e')
1720
- # }
1721
- @b_go = TkButton.new(self){|_b_go|
1968
+
1969
+
1970
+ @b_go = TkButton.new(@buttons_frame){|_b_go|
1722
1971
  compound 'none'
1723
1972
  default 'disabled'
1724
- text 'Find'
1973
+ text 'Find Next'
1725
1974
  #background '#ffffff'
1726
- image TkPhotoImage.new('dat' => FIND_GIF)
1975
+ #image TkPhotoImage.new('dat' => FIND_GIF)
1727
1976
  overrelief 'raised'
1728
1977
  justify 'center'
1729
- relief 'ridge'
1730
- width 20
1731
- pack('side'=>'right','ipadx'=>20)
1732
- #place('width' => 50,'x' => 0,'y' => 130,'height' => 23,'bordermode' => 'inside')
1733
- }
1734
- @e_what = Tk::BWidget::ComboBox.new(self){
1735
- editable true
1736
- justify 'left'
1737
- relief 'ridge'
1738
- autocomplete 'true'
1739
- #insertbackground '#FFFFFF'
1740
- entrybg '#FFFFFF'
1741
- expand 'tab'
1742
- takefocus 'true'
1743
- pack('padx'=>10, 'fill'=>'x')
1744
- #place('relwidth' => 1, 'x' => 0,'y' => 41,'height' => 19)
1978
+ #relief 'ridge'
1979
+ #width 15
1980
+ pack('side'=>'right','ipadx'=>5, 'padx'=>5)
1981
+ #place('width' => 50,'x' => 0,'y' => y0,'height' => 23,'bordermode' => 'inside')
1745
1982
  }
1746
- place('x'=>0,'y'=>0,'relheight'=> 1,'relwidth'=> 1)
1983
+ #place('x'=>0,'y'=>0,'relheight'=> 1,'relwidth'=> 1)
1984
+ place('x'=>100,'y'=>100,'height'=> 220,'width'=> 300)
1747
1985
 
1748
1986
  end
1749
1987
  end
@@ -1757,42 +1995,98 @@ class Find < Findview
1757
1995
  @controller = _controller
1758
1996
  @forwards = true
1759
1997
  @find_action = proc{
1760
- _radio = @rb.get_value
1761
- if _radio == 'line'
1762
- go_line
1763
- else
1764
- @forwards = _radio == 'forwards'
1998
+ #_radio = @rb.get_value
1999
+
2000
+ #if _radio == 'line'
2001
+ # go_line
2002
+ #else
1765
2003
  do_find_next
1766
- end
2004
+ #end
1767
2005
  }
1768
2006
  @b_go.bind('1', @find_action)
2007
+
2008
+ @b_replace.bind('1', proc{do_replace})
2009
+
2010
+ @b_replace_all.bind('1', proc{do_replace_all})
2011
+
1769
2012
  e = TkWinfo.children(@e_what)[0]
1770
2013
  e.bind_append('KeyPress'){|e|
1771
2014
  case e.keysym
1772
2015
  when 'Return'
1773
2016
  @find_action.call
2017
+ hide
2018
+ @editor_caller.text.focus
1774
2019
  Tk.callback_break
2020
+ else
2021
+ widget_state
1775
2022
  end
1776
2023
  }
2024
+ e2 = TkWinfo.children(@e_with)[0]
2025
+ e2.bind_append('KeyPress'){|e|
2026
+ widget_state
2027
+ }
1777
2028
  @last_index='insert'
2029
+
2030
+ @goto_line_dialog = GoToLine.new(_frame).hide
2031
+ @goto_line_dialog.on_close=proc{@goto_line_dialog.hide}
2032
+
2033
+ @goto_line_dialog.b_go.bind('1',proc{go_line})
2034
+ end
2035
+
2036
+ def do_replace
2037
+ if do_find_next
2038
+ _message = 'Replace "'+@e_what.value+'" with "'+@e_with.value+'" ?'
2039
+ if TkDialog2.new('message'=>_message, 'buttons'=>['Yes','No']).show() == 0
2040
+ self.editor.text.delete(@idx1,@idx2)
2041
+ self.editor.text.insert(@idx1,@e_with.value)
2042
+ end
2043
+ end
1778
2044
  end
1779
2045
 
1780
- def editor
2046
+ def do_replace_all
2047
+ while do_find_next
2048
+ _message = 'Replace "'+@e_what.value+'" with "'+@e_with.value+'" ?'
2049
+ _rc = TkDialog2.new('message'=>_message, 'buttons'=>['Yes','No','Annulla']).show()
2050
+ if _rc == 0
2051
+ self.editor.text.delete(@idx1,@idx2)
2052
+ self.editor.text.insert(@idx1,@e_with.value)
2053
+ elsif _rc == 2
2054
+ break
2055
+ end
2056
+ end
2057
+ end
2058
+
2059
+ def widget_state
2060
+ if (@e_what.value.length > 0) && (@e_with.value.length > 0)
2061
+ @b_replace.configure('state'=>'active')
2062
+ @b_replace_all.configure('state'=>'active')
2063
+ else
2064
+ @b_replace.configure('state'=>'disabled')
2065
+ @b_replace_all.configure('state'=>'disabled')
2066
+ end
2067
+ end
2068
+
2069
+
2070
+ def editor
1781
2071
  if @editor_caller == nil
1782
2072
  @editor_caller = @controller.raised
1783
2073
  end
1784
2074
  return @editor_caller
1785
- end
2075
+ end
1786
2076
 
2077
+ def show_go_to_line_dialog
2078
+ @goto_line_dialog.show
2079
+ end
1787
2080
 
1788
2081
  def go_line
1789
- if @e_what.value.length > 0
1790
- _row = @e_what.value
2082
+ if @goto_line_dialog.e_line.value.length > 0
2083
+ _row = @goto_line_dialog.e_line.value
1791
2084
  _index = _row+'.1'
1792
2085
  self.editor.text.see(_index)
1793
2086
  self.editor.text.tag_add('sel', _index,_index+' lineend')
1794
2087
  self.editor.text.set_insert(_index)
1795
2088
  @controller.bookmark_add(self.editor.file, _index)
2089
+ @goto_line_dialog.hide
1796
2090
  end
1797
2091
  #self.hide()
1798
2092
  end
@@ -1801,6 +2095,7 @@ class Find < Findview
1801
2095
  if (_editor != @editor_caller)
1802
2096
  @last_index='insert'
1803
2097
  @editor_caller = _editor
2098
+ title(_editor.file)
1804
2099
  end
1805
2100
  end
1806
2101
 
@@ -1812,6 +2107,10 @@ class Find < Findview
1812
2107
  end
1813
2108
 
1814
2109
  def do_find(_istart=nil)
2110
+ @forwards = @cb_back.cget('onvalue') != @cb_back.cget('variable').value.to_i
2111
+ _found = false
2112
+ @idx1 = nil
2113
+ @idx2 = nil
1815
2114
  if @e_what.text.length > 0
1816
2115
  update_combo(@e_what.text)
1817
2116
  if !_istart && self.editor.text.index('insert')!=nil
@@ -1822,15 +2121,15 @@ class Find < Findview
1822
2121
  _istart = '1.0'
1823
2122
  end
1824
2123
  if @forwards
1825
- if @cb_reg.cget('onvalue')=='1'
1826
- _index = self.editor.text.rsearch(@e_what.text,_istart)
2124
+ if @cb_reg.cget('onvalue')==@cb_reg.cget('variable').value.to_i
2125
+ _index = self.editor.text.tksearch(['regexp'],@e_what.text,_istart)
1827
2126
  else
1828
2127
  _index = self.editor.text.search(@e_what.text,_istart)
1829
2128
  end
1830
2129
  else
1831
2130
 
1832
- if @cb_reg.cget('onvalue')=='1'
1833
- _index = self.editor.text.tkrsearch(['backwards'],@e_what.text,_istart)
2131
+ if @cb_reg.cget('onvalue')==@cb_reg.cget('variable').value.to_i
2132
+ _index = self.editor.text.tksearch(['regexp','backwards'],@e_what.text,_istart)
1834
2133
  else
1835
2134
  _index = self.editor.text.tksearch(['backwards'],@e_what.text,_istart)
1836
2135
  end
@@ -1846,6 +2145,9 @@ class Find < Findview
1846
2145
  end
1847
2146
  self.editor.text.tag_add('sel', _index,_index_sel_end)
1848
2147
  self.editor.text.set_insert(_index)
2148
+ @idx1 =_index
2149
+ @idx2 =_index_sel_end
2150
+ _found = true
1849
2151
  @controller.bookmark_add(self.editor.file, _index)
1850
2152
  else
1851
2153
  _message = '"'+@e_what.value+'" not found'
@@ -1855,9 +2157,13 @@ class Find < Findview
1855
2157
  else
1856
2158
  self.show()
1857
2159
  end
2160
+ return _found
1858
2161
  end
1859
2162
 
1860
2163
  def do_find_next
2164
+ if @idx1 != nil
2165
+ self.editor.text.tag_remove('sel',@idx1,@idx2)
2166
+ end
1861
2167
  do_find(@last_index)
1862
2168
  end
1863
2169
  end
@@ -1891,3 +2197,39 @@ end
1891
2197
 
1892
2198
  class CodeInsight
1893
2199
  end
2200
+
2201
+ class GoToLine < TkFloatTitledFrame
2202
+ attr_reader :e_line
2203
+ attr_reader :b_go
2204
+ def initialize(_parent)
2205
+ super(_parent)
2206
+ #stop_resizing
2207
+ y0 = 10
2208
+ d = 23
2209
+ TkLabel.new(self.frame){
2210
+ text 'Go to line:'
2211
+ place('x' => 8,'y' => y0,'height' => 19)
2212
+ }
2213
+ y0 = y0 + d
2214
+ @e_line = TkEntry.new(self.frame){
2215
+ justify 'left'
2216
+ relief 'ridge'
2217
+ place('relwidth' => 1, 'width'=>-16,'x' => 8,'y' => y0,'height' => 19)
2218
+ }
2219
+
2220
+ y0 = y0 + d
2221
+ y0 = y0 + d
2222
+ @buttons_frame = TkFrame.new(self.frame).pack('fill'=>'x', 'side'=>'bottom')
2223
+
2224
+ @b_go = TkButton.new(@buttons_frame){|_b_go|
2225
+ compound 'none'
2226
+ default 'disabled'
2227
+ text 'Go'
2228
+ overrelief 'raised'
2229
+ justify 'center'
2230
+ pack('side'=>'right','ipadx'=>5, 'padx'=>5)
2231
+ }
2232
+ place('x'=>150,'y'=>150,'height'=> 120,'width'=> 100)
2233
+
2234
+ end
2235
+ end