arcadia 0.1.3 → 0.2.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 (56) hide show
  1. data/README +69 -77
  2. data/arcadia.rb +1097 -770
  3. data/base/a-commons.rb +480 -0
  4. data/base/a-contracts.rb +207 -322
  5. data/base/{a-utils.rb → a-tkcommons.rb} +933 -993
  6. data/conf/arcadia.conf +130 -203
  7. data/conf/arcadia.res.rb +1332 -1325
  8. data/ext/ae-action-dispatcher/ae-action-dispatcher.conf +6 -0
  9. data/ext/ae-action-dispatcher/ae-action-dispatcher.rb +22 -0
  10. data/ext/ae-complete-code/ae-complete-code.conf +2 -2
  11. data/ext/ae-complete-code/ae-complete-code.rb +82 -80
  12. data/ext/ae-doc-code/ae-doc-code.conf +2 -2
  13. data/ext/ae-doc-code/ae-doc-code.rb +114 -111
  14. data/ext/ae-editor/ae-editor.conf +110 -105
  15. data/ext/ae-editor/ae-editor.rb +2501 -2287
  16. data/ext/ae-editor/langs/conf.lang +15 -0
  17. data/ext/ae-editor/langs/lang.lang.bind +1 -0
  18. data/ext/ae-editor/langs/rb.lang +67 -0
  19. data/ext/ae-editor/langs/rbw.lang.bind +1 -0
  20. data/ext/ae-event-log/ae-event-log.rb +45 -52
  21. data/ext/ae-file-history/ae-file-history.conf +4 -4
  22. data/ext/ae-file-history/ae-file-history.rb +298 -286
  23. data/ext/ae-flag/ae-flag.conf +6 -6
  24. data/ext/ae-flag/ae-flag.rb +12 -12
  25. data/ext/ae-inspector/ae-inspector.conf +3 -3
  26. data/ext/ae-inspector/ae-inspector.rb +2 -2
  27. data/ext/ae-output-event/ae-output-event.conf +15 -15
  28. data/ext/ae-output/ae-output.conf +5 -3
  29. data/ext/ae-output/ae-output.rb +62 -33
  30. data/ext/ae-palette/ae-palette.conf +3 -3
  31. data/ext/ae-palette/ae-palette.rb +265 -306
  32. data/ext/ae-rad/ae-rad-inspector.rb +1534 -0
  33. data/{base/a-libs.rb → ext/ae-rad/ae-rad-libs.rb} +1118 -846
  34. data/ext/ae-rad/ae-rad-palette.rb +273 -0
  35. data/ext/ae-rad/ae-rad.conf +71 -0
  36. data/ext/ae-rad/ae-rad.rb +56 -0
  37. data/{lib → ext/ae-rad/lib}/tk/al-tk.rb +21 -110
  38. data/{lib → ext/ae-rad/lib}/tk/al-tk.res.rb +0 -0
  39. data/{lib → ext/ae-rad/lib}/tk/al-tkarcadia.rb +26 -26
  40. data/{lib → ext/ae-rad/lib}/tk/al-tkcustom.rb +70 -70
  41. data/{lib → ext/ae-rad/lib}/tkext/al-bwidget.rb +194 -194
  42. data/{lib → ext/ae-rad/lib}/tkext/al-iwidgets.rb +25 -25
  43. data/{lib → ext/ae-rad/lib}/tkext/al-tile.rb +173 -173
  44. data/{lib → ext/ae-rad/lib}/tkext/al-tktable.rb +0 -0
  45. data/ext/ae-ruby-debug/ae-ruby-debug.conf +7 -4
  46. data/ext/ae-ruby-debug/ae-ruby-debug.rb +278 -142
  47. data/ext/ae-search-in-files/ae-search-in-files.conf +15 -0
  48. data/ext/ae-search-in-files/ae-search-in-files.rb +284 -0
  49. data/ext/ae-shell/ae-shell.rb +88 -8
  50. data/ext/ae-shell/sh.rb +7 -0
  51. metadata +93 -79
  52. data/base/a-contracts-work.rb +0 -219
  53. data/base/a-ext.rb +0 -280
  54. data/ext/ae-debug/ae-debug.conf +0 -7
  55. data/ext/ae-debug/ae-debug.rb +0 -601
  56. data/ext/ae-debug/debug1.57.rb +0 -998
@@ -0,0 +1,1534 @@
1
+ #
2
+ # ae-inspector.rb - Arcadia Ruby ide
3
+ # by Antonio Galeone <antonio-galeone@rubyforge.org>
4
+ #
5
+
6
+ require 'tk'
7
+ require 'base/a-tkcommons'
8
+ require 'tkextlib/bwidget'
9
+ require "observer"
10
+
11
+ class TkTy
12
+ attr_reader :agobj, :prop, :labelhost
13
+ attr_writer :labelhost
14
+ def free(_updatehost = false, _text = nil)
15
+ if (defined? @propobj)&&(@propobj != nil)
16
+ @propobj.destroy
17
+ @propobj=nil
18
+ end
19
+ if _text
20
+ @etextvalue = _text
21
+ end
22
+ if _updatehost and TkWinfo.exist?(@labelhost)
23
+ @labelhost.configure('text' => @etextvalue) if defined? @labelhost
24
+ end
25
+ end
26
+ end
27
+
28
+ class TkReadOnly < TkTy
29
+ def initialize(_label)
30
+ @label = _label
31
+ @color = @label.cget('foreground')
32
+ @label.configure('foreground'=>'#919191')
33
+ end
34
+
35
+ def free(_updatehost = false, _text = nil)
36
+ @label.configure('foreground'=>@color)
37
+ super
38
+ end
39
+ end
40
+
41
+
42
+ class TkStringType < TkTy
43
+
44
+ def initialize(_host, _family, _agobj, _prop, _val = nil)
45
+ @agobj = _agobj
46
+ @prop = _prop
47
+ @labelhost = _host
48
+ @family = _family
49
+ @etext = TkVariable.new(_host.cget('text'))
50
+ @etextvalue = @etext.to_s
51
+ @propobj = TkEntry.new(_host, 'textvariable'=>@etext){
52
+ relief 'groove'
53
+ font $arcadia['conf']['inspectors.inspector.value.font']
54
+ place('x'=>0, 'y'=>0,'relheight'=>1, 'relwidth'=>1, 'bordermode'=>'outside')
55
+ }
56
+ @propobj.bind("KeyRelease-F1", proc{do_update})
57
+ end
58
+
59
+ def setpropvalue(_value)
60
+ @etext = _value
61
+ end
62
+
63
+ def do_update
64
+ if @etextvalue != @etext.to_s
65
+ @agobj.update_property(self, @family, @prop['name'],@etext.to_s)
66
+ @etextvalue = @etext.to_s
67
+ end
68
+ end
69
+
70
+ def free(_updatehost = true, _text = nil)
71
+ do_update if (defined? @propobj)&&(@propobj != nil)
72
+ super
73
+ end
74
+
75
+ end
76
+
77
+ class TkProcType < TkStringType
78
+
79
+ def initialize(_host, _family, _agobj, _prop)
80
+ super(_host, _family, _agobj, _prop, true)
81
+ @bProp = TkButton.new(@propobj){
82
+ text '...'
83
+ relief 'flat'
84
+ anchor 'e'
85
+ padx 0
86
+ pady 0
87
+ activebackground background
88
+ activeforeground 'red'
89
+ borderwidth 1
90
+ pack('side' => 'right','fill' => 'y')
91
+ }
92
+ do_proc_update = proc{
93
+ _pr = @prop['type'].procReturn
94
+ $arcadia['objic.action.raise_active_obj'].call
95
+ if _pr && (_pr.length > 0)
96
+ @etext = _pr if _pr != ''
97
+ do_update
98
+ @propobj.value = @etext
99
+ end
100
+ }
101
+ @propobj.bind("Double-1", do_proc_update)
102
+ @bProp.bind("ButtonRelease-1", do_proc_update)
103
+ end
104
+
105
+ end
106
+
107
+ class TkEnumType < TkTy
108
+
109
+ def initialize(_host, _family, _agobj, _prop, _editable = false)
110
+ @agobj = _agobj
111
+ @prop = _prop
112
+ @labelhost = _host
113
+ @family = _family
114
+ @bool = _prop['type'].values[0].class.to_s == 'TrueClass'
115
+ if @bool
116
+ do_update = proc{
117
+ @etextvalue = @propobj.cget('text')
118
+ @agobj.update_property(self, @family, @prop['name'], source_to_bool(@etextvalue))
119
+ $arcadia['objic.action.raise_active_obj'].call
120
+ }
121
+ _values = []
122
+ _prop['type'].values.each{|value|
123
+ _values << bool_to_string(value)
124
+ }
125
+ #Tk.messageBox('message'=>_values.to_s)
126
+ else
127
+ do_update = proc{
128
+ #Tk.messageBox('message'=>'sasda')
129
+ @etextvalue = @propobj.cget('text')
130
+ @agobj.update_property(self, @family, @prop['name'], @etextvalue)
131
+ $arcadia['objic.action.raise_active_obj'].call
132
+ }
133
+ _values = _prop['type'].values
134
+ #Tk.messageBox('message'=>_values.class.to_s)
135
+ end
136
+ @propobj = Tk::BWidget::ComboBox.new(_host){
137
+ values _values
138
+ modifycmd do_update
139
+ font $arcadia['conf']['inspectors.inspector.value.font']
140
+ editable _editable
141
+ place('x'=>0, 'y'=>0,'relheight'=>1, 'relwidth'=>1, 'bordermode'=>'outside')
142
+ def e
143
+ TkWinfo.children(self)[0]
144
+ end
145
+ def b
146
+ TkWinfo.children(self)[1]
147
+ end
148
+ }
149
+ setpropvalue(@prop['get'].call.to_s)
150
+ end
151
+
152
+ def bool_to_string(_source)
153
+ if _source
154
+ return 'true'
155
+ else
156
+ return 'false'
157
+ end
158
+ end
159
+
160
+ def source_to_bool(_source)
161
+ _source = _source.to_s
162
+ if (_source == '1') or (_source == 'true')
163
+ return true
164
+ else
165
+ return false
166
+ end
167
+ end
168
+
169
+ def setpropvalue(_value)
170
+ #Tk.messageBox('message'=>'dip')
171
+ _index = @prop['type'].values.index(_value)
172
+ if _index != nil
173
+ @propobj.set_value(_index)
174
+ else
175
+ @propobj.e.insert( 0, _value)
176
+ end
177
+ @etextvalue = _value
178
+ end
179
+ end
180
+
181
+
182
+
183
+ class TkEnumProcType < TkEnumType
184
+
185
+ def initialize(_host, _family, _agobj, _prop)
186
+ super(_host, _family, _agobj, _prop, true)
187
+ @bProp = TkButton.new(@propobj.e){
188
+ text '...'
189
+ relief 'flat'
190
+ anchor 'e'
191
+ padx 0
192
+ pady 0
193
+ activebackground background
194
+ activeforeground 'red'
195
+ borderwidth 1
196
+ pack('side' => 'right','fill' => 'y')
197
+ }
198
+ do_proc_update = proc{
199
+ _pr = @prop['type'].procReturn
200
+ $arcadia['objic.action.raise_active_obj'].call
201
+ @etextvalue = _pr if _pr != ''
202
+ @agobj.update_property(self, _family, @prop['name'], @etextvalue)
203
+ @propobj.configure('text'=>@etextvalue)
204
+ }
205
+ @propobj.e.bind("Double-1", do_proc_update)
206
+ @bProp.bind("ButtonRelease-1", do_proc_update)
207
+ end
208
+
209
+ def do_update
210
+ if @etextvalue != @propobj.cget('text')
211
+ @etextvalue = @propobj.cget('text')
212
+ @agobj.update_property(self, @family, @prop['name'], @etextvalue)
213
+ end
214
+ end
215
+
216
+ def free(_updatehost=true, _text=nil)
217
+ do_update if (defined? @propobj)&&(@propobj != nil)
218
+ super
219
+ end
220
+ end
221
+
222
+ #class PTkEntryButton
223
+ #
224
+ # def initialize(_host, _agobj, _prop)
225
+ # do_update = proc{
226
+ # @etextvalue = @prop['type'].procReturn
227
+ # @agobj.updatep(@prop['name'], @etextvalue)
228
+ # @propobj.configure('text'=>@etextvalue, 'background'=>@etextvalue)
229
+ # }
230
+ # @button = TkButton.new(_host){
231
+ # text '...'
232
+ # font $arcadia['conf']['inspectors.inspector.value.font']
233
+ # place('x' => 20 ,'relheight'=>1, 'relwidth'=>0.5, 'bordermode'=>'outside', 'anchor'=>'e')
234
+ # }
235
+ # @etext = TkVariable.new(_prop['get'].call.to_s)
236
+ # @entry = TkEntry.new(_host, 'textvariable'=>@etext){
237
+ # relief 'groove'
238
+ # font $arcadia['conf']['inspectors.inspector.value.font']
239
+ # place('relheight'=>1, 'relwidth'=>0.5, 'bordermode'=>'outside')
240
+ # }
241
+ # end
242
+ #
243
+ # def setpropvalue(_value)
244
+ # @propobj.configure('text'=>_value)
245
+ # @etextvalue = _value
246
+ # end
247
+ #
248
+ # def destroy
249
+ # @entry.destroy
250
+ # @etext.destroy
251
+ # @button.destroy
252
+ # end
253
+ #
254
+ #end
255
+
256
+ class ValueRap
257
+ attr_reader :labelvalue, :handlervalue
258
+ attr_reader :labelkey
259
+ def initialize(_parent, _prop, _text = nil)
260
+ @parent = _parent;
261
+ #@host = _parent.pwind.right_frame
262
+ #Tk.messageBox('message'=>_prop)
263
+ @agobj = _parent.agobj
264
+ @family = _parent.family
265
+ @prop = _prop
266
+ if _text == nil
267
+ _text = _prop['get'].call.to_s
268
+ end
269
+ @text = _text
270
+ if !defined? @parent.lasthandlervalue
271
+ @parent.lasthandlervalue = 0
272
+ end
273
+ @labelkey = TkLabel.new(@parent.right_text,
274
+ 'text' => _text,
275
+ 'justify' => 'right',
276
+ 'anchor' => 'w',
277
+ #'width'=>15,
278
+ 'font'=> $arcadia['conf']['inspectors.inspector.value.font'],
279
+ 'relief'=>'groove')
280
+
281
+ TkTextWindow.new(@parent.right_text, 'end', 'window'=> @labelkey)
282
+
283
+ #@labelkey.pack('fill'=>'x',:padx=>0, :pady=>0)
284
+
285
+ @parent.right_text.insert('end',"\n")
286
+
287
+
288
+ @labelkey.bind("ButtonPress-1", proc{
289
+ if @prop['set'] != nil
290
+ do_manage(@prop['type'].class.to_s)
291
+ else
292
+ do_manage('ReadOnly')
293
+ end
294
+ })
295
+ end
296
+
297
+ def reset_last
298
+ @parent.lasthandlervalue = 0
299
+ end
300
+
301
+ def free
302
+ _reset_last = @handlervalue == @parent.lasthandlervalue
303
+ @labelkey.destroy if defined? @labelkey
304
+ @handlervalue.free if @handlervalue == @parent.lasthandlervalue
305
+ @parent.lasthandlervalue = 0 if _reset_last
306
+ end
307
+
308
+ def recicle(_family, _agobj, _prop)
309
+ @agobj = _agobj
310
+ @family = _family
311
+ @prop = _prop
312
+ if _prop['value'] != nil
313
+ @text = _prop['value']
314
+ else
315
+ @text = _prop['get'].call.to_s
316
+ end
317
+ @parent.lasthandlervalue = 0 if @parent.lasthandlervalue == @handlervalue
318
+ @handlervalue.free(false,@text) if defined? @handlervalue
319
+ @labelkey.configure('text' => @text)
320
+ end
321
+
322
+ def updatevalue(_text)
323
+ @labelkey.configure('text'=>_text)
324
+ @text = _text
325
+ end
326
+
327
+ def do_manage(_type)
328
+ if @parent.lasthandlervalue != 0
329
+ @parent.lasthandlervalue.free(defined? @labelkey)
330
+ end
331
+ case _type
332
+ when 'EnumType'
333
+ @handlervalue = TkEnumType.new(@labelkey, @family, @agobj, @prop)
334
+ when 'ProcType'
335
+ @handlervalue = TkProcType.new(@labelkey, @family, @agobj, @prop)
336
+ when 'StringType'
337
+ @handlervalue = TkStringType.new(@labelkey, @family, @agobj, @prop)
338
+ when 'EnumProcType'
339
+ @handlervalue = TkEnumProcType.new(@labelkey, @family, @agobj, @prop)
340
+ when 'ReadOnly'
341
+ @handlervalue = TkReadOnly.new(@labelkey)
342
+ else
343
+ @handlervalue = TkStringType.new(@labelkey, @family, @agobj, @prop)
344
+ end
345
+ @parent.lasthandlervalue = @handlervalue
346
+ end
347
+
348
+ end
349
+
350
+ class PropLine
351
+ attr_reader :valueobj
352
+ def initialize(_parent, _name, _prop)
353
+ @parent = _parent
354
+ @prop = _prop
355
+
356
+ @propkey = TkLabel.new(@parent.left_text){
357
+ text _name
358
+ justify 'right'
359
+ font $arcadia['conf']['inspectors.inspector.key.font']
360
+ anchor 'w'
361
+ # pack('fill'=>'x',:padx=>0, :pady=>0)
362
+ }
363
+
364
+ TkTextWindow.new(@parent.left_text, 'end',
365
+ 'window'=> @propkey)
366
+ @parent.left_text.insert('end',"\n")
367
+
368
+ if !defined? _prop['type']
369
+ _prop['type'] = 'StringType'
370
+ end
371
+ @valueobj = ValueRap.new(@parent, @prop)
372
+ end
373
+
374
+ def free
375
+ @propkey.destroy if @propkey !=nil
376
+ @valueobj.free if @valueobj !=nil
377
+ @valueobj = nil
378
+ @parent.left_text.delete('end -1 lines linestart','end')
379
+ @parent.right_text.delete('end -1 lines linestart','end')
380
+ end
381
+
382
+ def setvalue(_value)
383
+ @valueobj.updatevalue(_value)
384
+ end
385
+
386
+ def updatekeyvalue(_agobj, _name, _prop)
387
+ @prop = _prop
388
+ @propkey.configure('text'=>_name) # chiave
389
+ @valueobj.recicle(@parent.family, _agobj, @prop)
390
+ end
391
+
392
+ end
393
+
394
+
395
+ class ValueRapReadOnly
396
+ attr_reader :labelvalue, :handlervalue
397
+ def initialize(_parent, _text = nil)
398
+ @parent = _parent;
399
+ @host = _parent.splitted_frame.right_frame
400
+ @text = _text
401
+ if !defined? @parent.bodyprops.lasthandlervalue
402
+ @parent.bodyprops.lasthandlervalue = 0
403
+ end
404
+ @labelkey = TkLabel.new(@host,
405
+ 'text' => _text,
406
+ 'justify' => 'right',
407
+ 'anchor' => 'w',
408
+ 'font'=> $arcadia['conf']['inspectors.inspector.value.font'],
409
+ 'relief'=>'groove')
410
+ @labelkey.pack('fill'=>'x',:padx=>0, :pady=>0)
411
+ @labelkey.bind("ButtonPress-1", proc{
412
+ do_manage_read_only
413
+ })
414
+ end
415
+
416
+ def reset_last
417
+ @parent.bodyprops.lasthandlervalue = 0
418
+ end
419
+
420
+ def free
421
+ _reset_last = @handlervalue == @parent.bodyprops.lasthandlervalue
422
+ @labelkey.destroy if defined? @labelkey
423
+ @handlervalue.free if @handlervalue == @parent.bodyprops.lasthandlervalue
424
+ @parent.bodyprops.lasthandlervalue = 0 if _reset_last
425
+ end
426
+
427
+ def recicle(_text)
428
+ @text = _text
429
+ @parent.bodyprops.lasthandlervalue = 0 if @parent.bodyprops.lasthandlervalue == @handlervalue
430
+ @handlervalue.free(false,@text) if defined? @handlervalue
431
+ @labelkey.configure('text' => @text)
432
+ end
433
+
434
+ def updatevalue(_text)
435
+ @labelkey.configure('text'=>_text)
436
+ @text = _text
437
+ end
438
+
439
+ def do_manage_read_only
440
+ @handlervalue = TkReadOnly.new(@labelkey)
441
+ @parent.bodyprops.lasthandlervalue = @handlervalue
442
+ end
443
+
444
+ end
445
+
446
+ class PropLineReadOnly
447
+ attr_reader :valueobj
448
+ attr_reader :splitted_frame
449
+ attr_reader :bodyprops
450
+ def initialize(_bodyprops, _key, _value)
451
+ @bodyprops = _bodyprops
452
+ @key = _key
453
+ @splitted_frame = AGTkVSplittedFrames.new(@bodyprops.host, 85)
454
+ @propkey = TkLabel.new(@splitted_frame.left_frame){
455
+ text _key
456
+ justify 'right'
457
+ font $arcadia['conf']['inspectors.inspector.key.font']
458
+ anchor 'w'
459
+ pack('fill'=>'x',:padx=>0, :pady=>0)
460
+ }
461
+ @valueobj = ValueRapReadOnly.new(self, _value)
462
+ end
463
+
464
+ def free
465
+ @propkey.destroy if @propkey !=nil
466
+ @valueobj.free if @valueobj !=nil
467
+ @valueobj = nil
468
+ end
469
+
470
+ def setvalue(_value)
471
+ @valueobj.updatevalue(_value)
472
+ end
473
+
474
+ def updatekeyvalue(_key, _value)
475
+ @key = _key
476
+ @propkey.configure('text'=>_key) # chiave
477
+ @valueobj.recicle(_value)
478
+ end
479
+
480
+ end
481
+
482
+
483
+ class InspectListReadOnly
484
+ attr_reader :host
485
+ attr_writer :lasthandlervalue
486
+ attr_reader :lasthandlervalue
487
+
488
+ def initialize(_host, _left_width = 85)
489
+ @lasthandlervalue = 0;
490
+ @host = _host
491
+ @proplines = Hash.new
492
+ end
493
+
494
+ def clear
495
+ @proplines.values.each do | _value|
496
+ _value.free
497
+ end
498
+ @lasthandlervalue = 0;
499
+ @proplines.clear
500
+ end
501
+
502
+ def updatelines(_properties=nil)
503
+ if _properties == nil
504
+ clear
505
+ return
506
+ else
507
+ @lasthandlervalue.free(false) if @lasthandlervalue != 0
508
+ @lasthandlervalue = 0;
509
+ end
510
+ _propvalues = []
511
+ @proplines.keys.sort.each{|key|
512
+ _propvalues << @proplines[key]
513
+ }
514
+ @proplines.clear
515
+ _inf = 0
516
+ _sup = _propvalues.length
517
+ @array_key = _properties.keys
518
+ @array_key.sort.each do |key|
519
+ if _inf < _sup # reuse it
520
+ _propvalues[_inf].updatekeyvalue(key, _properties[key])
521
+ @proplines[key] = _propvalues[_inf]
522
+ _inf = _inf.next
523
+ else # create new
524
+ @proplines[key] = PropLineReadOnly.new(self, key, _properties[key])
525
+ end
526
+ end
527
+ if _sup > _inf
528
+ _inf.upto(_sup -1 ) {|i|
529
+ _propvalues[i].free
530
+ }
531
+ end
532
+ end
533
+
534
+ def modProp(_name, _newvalue)
535
+ @proplines[_name].setvalue(_newvalue)
536
+ end
537
+
538
+ def delete
539
+ @pwind.destroy
540
+ end
541
+
542
+ end
543
+
544
+ class InspectList
545
+ attr_reader :pwind, :agobj, :family
546
+ attr_writer :lasthandlervalue, :family
547
+ attr_reader :lasthandlervalue
548
+ attr_reader :left_text, :right_text
549
+ def initialize(_family, _host, _left_width = 85)
550
+ @lasthandlervalue = 0;
551
+ @family = _family
552
+ @bar = TkScrollbar.new(_host).pack('side'=>'right', 'fill'=>'y')
553
+ @pwind = AGTkVSplittedFrames.new(_host,_left_width)
554
+ background = _host.cget('background')
555
+ common_properties = {'relief'=>'flat','state'=>'disabled', 'borderwidth'=>0, 'relief'=>'flat', 'background'=>background}
556
+ @left_text = TkText.new(@pwind.left_frame, common_properties).pack('expand'=>'yes', 'fill'=>'both')
557
+ @right_text = TkText.new(@pwind.right_frame, common_properties).pack('expand'=>'yes', 'fill'=>'both')
558
+
559
+ @left_text.configure('selectbackground'=>@left_text.cget('background'))
560
+ @right_text.configure('selectbackground'=>@right_text.cget('background'))
561
+ # @left_text = TkText.new(@pwind.left_frame, 'relief'=>'flat').pack('expand'=>'yes', 'fill'=>'both')
562
+ # @right_text = TkText.new(@pwind.right_frame, 'relief'=>'flat').pack('expand'=>'yes', 'fill'=>'both')
563
+ @bar.command(proc { |*args|
564
+ @left_text.yview(*args)
565
+ @right_text.yview(*args)
566
+ })
567
+ @left_text.yscrollcommand(proc { |first, last|
568
+ @bar.set(first, last)
569
+ })
570
+ @right_text.yscrollcommand(proc { |first, last|
571
+ @bar.set(first, last)
572
+ })
573
+ @right_text.bind("Configure",
574
+ proc{
575
+ new_width = new_right_width
576
+ if new_width
577
+ @proplines.values.each do | _value|
578
+ _value.valueobj.labelkey.configure('width'=>(new_width))
579
+ end
580
+ end
581
+
582
+ },"%w")
583
+ @proplines = Hash.new
584
+ end
585
+
586
+ def new_right_width
587
+ font_size = TkFont.new(@right_text.cget('font')).size
588
+ w=TkPlace.info(@pwind.right_frame)['width']
589
+ dw = TkPlace.info(@pwind.left_frame)['width']
590
+ p = @pwind
591
+ while p != nil && !p.kind_of?(AGTkVSplittedFrames) || p == @pwind
592
+ p= TkWinfo.parent(p)
593
+ end
594
+ if p
595
+ dwp = TkPlace.info(p.left_frame)['width']
596
+ new_width = ((dwp+w)/(font_size-2)).round
597
+ end
598
+ return new_width
599
+ end
600
+
601
+ def clear
602
+ @proplines.values.each do | _value|
603
+ _value.free
604
+ end
605
+ @lasthandlervalue = 0;
606
+ @proplines.clear
607
+ end
608
+
609
+ def updatelines(_agobj, _properties=nil)
610
+ @left_text.configure('state'=>'normal')
611
+ @right_text.configure('state'=>'normal')
612
+ if _properties == nil
613
+ clear
614
+ return
615
+ else
616
+ @lasthandlervalue.free(false) if @lasthandlervalue != 0
617
+ @lasthandlervalue = 0;
618
+ end
619
+ @agobj = _agobj
620
+ _propvalues = []
621
+ @proplines.keys.sort.each{|key|
622
+ _propvalues << @proplines[key]
623
+ }
624
+ @proplines.clear
625
+ _inf = 0
626
+ _sup = _propvalues.length
627
+ @array_key = _properties.keys
628
+ @array_key.sort.each do |key|
629
+ if _inf < _sup # reuse it
630
+ _propvalues[_inf].updatekeyvalue(@agobj, key, _properties[key])
631
+ @proplines[key] = _propvalues[_inf]
632
+ _inf = _inf.next
633
+ else # create new
634
+ #Tk.messageBox('message'=>key)
635
+ @proplines[key] = PropLine.new(self, key, _properties[key])
636
+ @proplines[key].valueobj.labelkey.configure('width'=>(new_right_width))
637
+ end
638
+ end
639
+ if _sup > _inf
640
+ _inf.upto(_sup -1 ) {|i|
641
+ _propvalues[i].free
642
+ }
643
+ end
644
+ @left_text.configure('state'=>'disabled')
645
+ @right_text.configure('state'=>'disabled')
646
+ end
647
+
648
+ def modProp(_name, _newvalue)
649
+ @proplines[_name].setvalue(_newvalue)
650
+ end
651
+ def delete
652
+ @pwind.destroy
653
+ end
654
+ end
655
+
656
+ class InnerFrameInspectMultiList < TkFrame
657
+ attr_reader :lTitle
658
+ attr_reader :tkFrameHost
659
+ attr_reader :index
660
+ def initialize(_parent, _index,_contr=nil)
661
+ super(_parent)
662
+ @index = _index
663
+ borderwidth 2
664
+ relief 'groove'
665
+ pack('side' => 'top',
666
+ 'anchor' => 'n',
667
+ 'expand' => 0,
668
+ 'ipady' => 40,
669
+ 'fill' => 'x')
670
+ _self = self
671
+ bind('Enter', proc{ _contr.set_current(_index)})
672
+ @lTitle = TkLabel.new(self){
673
+ text '...'
674
+ background '#494949'
675
+ place('relwidth' => '1',
676
+ 'x' => 0,
677
+ 'y' => 0,
678
+ 'height' => 19)
679
+
680
+ @tkButtonX = TkButton.new(self){
681
+ text 'X'
682
+ pack('side' => 'top',
683
+ 'anchor' => 'e')
684
+ bind('ButtonPress-1',proc{_contr.del_event(_self, _index)})
685
+ }
686
+ class << self
687
+ attr_reader :tkButton2
688
+ end
689
+ }
690
+
691
+ @tkFrameHost = TkFrame.new(self){
692
+ borderwidth 2
693
+ relief 'groove'
694
+ place('relwidth' => '1',
695
+ 'x' => 0,
696
+ 'y' => 19,
697
+ 'relheight' => '1',
698
+ 'height' => -19)
699
+ }
700
+ end
701
+ end
702
+
703
+
704
+ class InspectMultiList
705
+ def initialize(_family, _host)
706
+ _contr = self
707
+ @family = _family
708
+ @itemCount = 0
709
+ @tkFrame1 = TkFrame.new(_host){
710
+ borderwidth 2
711
+ relief 'groove'
712
+ place(
713
+ 'relwidth' => '1',
714
+ 'x' => 0,
715
+ 'y' => 0,
716
+ 'height' => 30
717
+ )
718
+ @tkButton1 = TkButton.new(self){
719
+ text 'New'
720
+ padx 0
721
+ pady 0
722
+ relief 'groove'
723
+ place(
724
+ 'x' => 2,
725
+ 'y' => 2,
726
+ 'height' => 21,
727
+ 'width' => 54
728
+ )
729
+ bind('ButtonPress-1',proc{_contr.add_event})
730
+ }
731
+ class << self
732
+ attr_reader :tkButton1
733
+ end
734
+ }
735
+ @tkFrame2 = TkFrame.new(_host){
736
+ borderwidth 2
737
+ relief 'groove'
738
+ place(
739
+ 'relwidth' => '1',
740
+ 'relheight' => '1',
741
+ 'height'=>-50,
742
+ 'x' => 0,
743
+ 'y' => 50
744
+ )
745
+ }
746
+ @il = Hash.new
747
+ end
748
+
749
+ def add_event
750
+ set_current(@itemCount)
751
+ fi = InnerFrameInspectMultiList.new(@tkFrame2, @itemCount, self)
752
+ @il[fi]=InspectList.new(@family, fi.tkFrameHost,30)
753
+ @il[fi].updatelines(@agobj, @agobj.props[@family])
754
+ @itemCount = @itemCount + 1
755
+ end
756
+
757
+ def del_event(_innerFrame, _item)
758
+ if (@agobj.persistent != nil)
759
+ @agobj.persistent['events'].delete_at(_item)
760
+ @agobj.persistent['procs'].delete_at(_item) if @agobj.persistent['procs'] != nil
761
+ end
762
+ @itemCount = @itemCount - 1
763
+ _innerFrame.destroy
764
+ _innerFrame.callback_break
765
+ end
766
+
767
+ def set_current(_index)
768
+ @itemIndex = _index
769
+ if (@agobj.persistent['prog'] != nil)
770
+ @agobj.persistent['prog']=@itemIndex
771
+ end
772
+ end
773
+
774
+ def update(_agobj)
775
+ @itemCount = 0
776
+ @agobj = _agobj
777
+ @il.each_key{|k|
778
+ k.destroy
779
+ }
780
+ @il.clear
781
+ if _agobj.persistent['events'] != nil
782
+ _agobj.persistent['events'].each{|item|
783
+ add_event
784
+ }
785
+ end
786
+ end
787
+
788
+ end
789
+
790
+ class InspectEvents
791
+ attr_reader :pbottom
792
+ def initialize(_host, _agobj, _family)
793
+ @hash_entity = _agobj.props[_family]
794
+ @agobj = _agobj
795
+ @family = _family
796
+ @pmain = Tk::BWidget::PanedWindow.new(_host, 'side' => 'left', 'weights'=> 'available', 'width'=> 3){
797
+ pack('fill'=>'both', :padx=>0, :pady=>0)
798
+ }
799
+ @ptop = @pmain.add('weight'=>1)
800
+ @pbottom = @pmain.add('weight'=>2)
801
+ @list = InspectList.new('evens', @ptop)
802
+ end
803
+
804
+ def add(_event,_mods,_handler)
805
+ end
806
+
807
+ def update(_agobj, _family)
808
+ @hash_entity = _agobj.props[_family]
809
+ @agobj = _agobj
810
+ @family = _family
811
+ end
812
+
813
+ end
814
+
815
+
816
+ class InspectTkEvents
817
+
818
+ def initialize(_host, _agobj, _family)
819
+ @hash_entity = _agobj.props[_family]
820
+ @agobj = _agobj
821
+ @family = _family
822
+ @pmain = Tk::BWidget::PanedWindow.new(_host, 'side' => 'left', 'weights'=> 'available', 'width'=> 3){
823
+ pack('fill'=>'both', :padx=>0, :pady=>0)
824
+ }
825
+ @ptop = @pmain.add('weight'=>1)
826
+
827
+ @pbottom = @pmain.add('weight'=>2)
828
+
829
+ list = TkListbox.new(@ptop){
830
+ pack
831
+ }
832
+ end
833
+
834
+ def add(_event,_mods,_handler)
835
+
836
+ end
837
+ def update(_agobj, _family)
838
+ @hash_entity = _agobj.props[_family]
839
+ @agobj = _agobj
840
+ @family = _family
841
+ end
842
+ end
843
+
844
+ class ObjList
845
+ attr_reader :objects
846
+ def initialize
847
+ @objects = Array.new
848
+ end
849
+ def append(_o)
850
+ @objects << _o
851
+ end
852
+ end
853
+
854
+
855
+
856
+ class TkScrollbox<TkListbox
857
+ include TkComposite
858
+ def initialize_composite(keys=nil)
859
+ list = TkListbox.new(@frame)
860
+ scroll = TkScrollbar.new(@frame)
861
+ @path = list.path
862
+ list.configure 'yscroll', scroll.path+" set"
863
+ list.pack 'side'=>'left','fill'=>'both','expand'=>'yes'
864
+ scroll.configure 'command', list.path+" yview"
865
+ scroll.pack 'side'=>'right','fill'=>'y'
866
+ delegate('DEFAULT', list)
867
+ delegate('foreground', list)
868
+ delegate('background', list, scroll)
869
+ delegate('borderwidth', @frame)
870
+ delegate('relief', @frame)
871
+ configure keys if keys
872
+ end
873
+ end
874
+
875
+ class ObjBoard
876
+ attr_reader :objectsList
877
+ def initialize(_host, _obji)
878
+ @obji = _obji
879
+ @objectsList = Array.new
880
+ @count = 0
881
+ @itemindex = -1
882
+ end
883
+
884
+ def get_string(_agobj)
885
+ _agobj.i_name + ' [ < '+ _agobj.obj_class.to_s+' ]'
886
+ end
887
+
888
+ def delete(_agobj)
889
+ @objectsList.delete(_agobj)
890
+ @count = @count - 1
891
+ end
892
+
893
+ def insert(_agobj)
894
+ @objectsList << _agobj
895
+ @count = @count + 1
896
+ @itemindex = @count - 1
897
+ end
898
+
899
+ def select(_agobj)
900
+ end
901
+
902
+ # def change_name(_agobj, _newname)
903
+ # _agobj.i_name = _newname
904
+ # end
905
+
906
+ end
907
+
908
+
909
+ class TkScrollboxObjBoard < ObjBoard
910
+
911
+ def initialize(_host)
912
+ super
913
+ @sb = TkScrollbox.new(_host){
914
+ width 200
915
+ height 200
916
+ pack('fill'=>'both', :padx=>0, :pady=>0)
917
+ }
918
+ end
919
+
920
+ def delete(_agobj)
921
+ super
922
+ @sb.delete('active')
923
+ end
924
+
925
+ def insert(_agobj)
926
+ super
927
+ @sb.insert('end', _agobj.i_name)
928
+ end
929
+
930
+ def select(_agobj)
931
+ super
932
+ @sb.selection_clear(0, @sb.size - 1)
933
+ for i in 0..@sb.size - 1
934
+ if @sb.get(i) == _agobj.i_name.to_s
935
+ @sb.selection_set(i)
936
+ break
937
+ end
938
+ end
939
+ end
940
+
941
+ end
942
+
943
+ class TkBwComboBoxObjBoard < ObjBoard
944
+
945
+ def initialize(_host, _obji)
946
+ super
947
+ do_select = proc {
948
+ _itemindex = @sb.cget('values').index(@sb.cget('text'))
949
+ @obji.select(@objectsList[_itemindex])
950
+ @objectsList[_itemindex].activate
951
+ }
952
+ @sb = Tk::BWidget::ComboBox.new(_host){
953
+ modifycmd do_select
954
+ editable false
955
+ expand 'tab'
956
+ pack('fill'=>'x', 'padx'=>0, 'pady'=>0, 'anchor'=>'n')
957
+ }
958
+ end
959
+
960
+ def delete(_agobj)
961
+ super
962
+ @sb.delete('active')
963
+ end
964
+
965
+ def getString(_agobj)
966
+ _agobj.i_name + '<--'+ _agobj.obj.class.to_s
967
+ end
968
+
969
+ def insert(_agobj)
970
+ super
971
+ _values = @sb.cget('values').to_a
972
+ _values << getString(_agobj)
973
+ @sb.configure('values'=>_values)
974
+ @sb.set_value(@itemindex)
975
+ end
976
+
977
+ def select(_agobj)
978
+ super
979
+ @itemindex = @sb.cget('values').index(getString(_agobj))
980
+ @sb.set_value(@itemindex)
981
+ end
982
+
983
+ end
984
+
985
+ class TkMenuButtonObjBoard < ObjBoard
986
+
987
+ def initialize(_host, _obji)
988
+ super
989
+ @sb = TkMenubutton.new(
990
+ :parent=>_host,
991
+ :underline=>0,
992
+ :direction=>:flush,
993
+ :font=>$arcadia['conf']['inspectors.inspector.tree.font'],
994
+ :relief=>:groove,
995
+ :background=> :white,
996
+ :justify=> :left){|mb|
997
+ menu TkMenu.new(
998
+ :parent=>mb,
999
+ :tearoff=>1,
1000
+ :font=>$arcadia['conf']['inspectors.inspector.tree.font'],
1001
+ :background=> :white,:relief=>'flat'
1002
+ )
1003
+ pack('fill'=>'x', 'padx'=>0, 'pady'=>0, 'anchor'=>'n')
1004
+ }
1005
+ @menu = @sb.cget('menu')
1006
+ end
1007
+
1008
+ def delete(_agobj)
1009
+ super
1010
+ @menu.delete(getobjstring(_agobj))
1011
+ end
1012
+
1013
+ def getobjstring(_agobj)
1014
+ _num = 0
1015
+ _result = _agobj.i_name
1016
+ _parent = _agobj.ag_parent
1017
+ while _parent != nil
1018
+ _result = ' - '+_result
1019
+ _parent = _parent.ag_parent
1020
+ _num = _num+1
1021
+ end
1022
+ _space = ''; _num.times do
1023
+ _space = _space + ' '
1024
+ end
1025
+ if _agobj.ag_parent != nil
1026
+ _result = _space + '�'+_result
1027
+ end
1028
+ return _result
1029
+ end
1030
+
1031
+ def change_name(_agobj, _newname)
1032
+ @menu.delete(getobjstring(_agobj))
1033
+ super
1034
+ insert_menu_item(_agobj)
1035
+ end
1036
+
1037
+ def insert_menu_item(_agobj)
1038
+ _do_select = proc {
1039
+ @obji.select(_agobj)
1040
+ @sb.configure('text'=>get_string(_agobj))
1041
+ }
1042
+ if (!defined? _agobj.ag_parent)|| (_agobj.ag_parent == nil)
1043
+ _index = 0
1044
+ else
1045
+ _index = @menu.index(getobjstring(_agobj.ag_parent))
1046
+ end
1047
+ @menu.insert(_index + 1,
1048
+ :command,
1049
+ :label=>getobjstring(_agobj),
1050
+ :hidemargin => true,
1051
+ :accelerator => _agobj.obj_class.to_s,
1052
+ :command=>_do_select
1053
+ )
1054
+ @sb.configure('text'=>get_string(_agobj))
1055
+ end
1056
+
1057
+ def insert(_agobj)
1058
+ super
1059
+ insert_menu_item(_agobj)
1060
+ end
1061
+
1062
+ def select(_agobj)
1063
+ super
1064
+ @sb.configure('text'=>get_string(_agobj))
1065
+ end
1066
+
1067
+ end
1068
+
1069
+ class ObjiRenderer
1070
+
1071
+ def initialize(_obji=nil)
1072
+ if _obji
1073
+ @obji = _obji
1074
+ else
1075
+ exit
1076
+ end
1077
+ end
1078
+
1079
+ def code
1080
+ return codeBegin, codeHinnerBegin, codeHinnerEnd, codeEnd
1081
+ end
1082
+
1083
+ def codeBegin
1084
+ code_rb = ''
1085
+ @obji.requires.each_key do |key|
1086
+ code_rb = code_rb, "require '",key,"'\n"
1087
+ end
1088
+ return code_rb
1089
+ end
1090
+
1091
+ def codeHinnerBegin
1092
+ end
1093
+
1094
+ def codeHinnerEnd
1095
+ end
1096
+
1097
+ def codeEnd
1098
+ code_rb = code_rb, "\n", @obji.agobj_start.renderer.classCode
1099
+ end
1100
+
1101
+ end
1102
+
1103
+
1104
+ class Obji
1105
+ include Observable
1106
+ attr :lb
1107
+ attr :tlb
1108
+ attr :active_object
1109
+ attr_reader :filename
1110
+ attr_writer :filename
1111
+ attr_reader :requires
1112
+ attr_reader :inspect_core
1113
+ attr_reader :editor
1114
+ attr_reader :agobj_start
1115
+ attr_reader :renderer
1116
+
1117
+ def initialize(_frame, _controller, _agobj_start, _filename = nil)
1118
+ @agobj_start = _agobj_start
1119
+ @agobj_last = nil
1120
+ @controller = _controller
1121
+ @filename = _filename
1122
+ @frame = _frame
1123
+ @pmainwind = AGTkOSplittedFrames.new(@frame,20)
1124
+ @f_top = @pmainwind.top_frame
1125
+ @f_bottom = @pmainwind.bottom_frame
1126
+ @lb = TkMenuButtonObjBoard.new(@f_top, self)
1127
+ @ojts = Tk::BWidget::NoteBook.new(@f_bottom){
1128
+ tabbevelsize 0
1129
+ internalborderwidth 0
1130
+ side $arcadia['conf']['inspectors.inspector.tabs.side']
1131
+ font $arcadia['conf']['inspectors.inspector.tabs.font']
1132
+ pack('fill'=>'both', :padx=>0, :pady=>0, :expand => 'yes')
1133
+ }
1134
+ #@inspect_core = _agobj_start.class.class_inspector.new(@ojts, _agobj_start)
1135
+ @inspect_core = Inspector.iclass(_agobj_start.class).new(@ojts, _agobj_start)
1136
+ #@requires = Hash.new
1137
+ @renderer = @inspect_core.class.class_inspector_renderer.new(self)
1138
+ select(_agobj_start)
1139
+ end
1140
+
1141
+ def free
1142
+ #@agobj_start.delete
1143
+ @inspect_core.clear
1144
+ end
1145
+
1146
+ def change_name(_agobj, _newname)
1147
+ @lb.change_name(_agobj, _newname)
1148
+ end
1149
+
1150
+ def raise_toplevel
1151
+ @agobj_start.obj.raise
1152
+ end
1153
+
1154
+ def active
1155
+ @controller.active
1156
+ end
1157
+
1158
+ # def add_require(_require)
1159
+ # if @requires[_require] == nil
1160
+ # @requires[_require] = 1
1161
+ # else
1162
+ # @requires[_require] += 1
1163
+ # end
1164
+ # end
1165
+
1166
+ # def del_require(_require)
1167
+ # @requires[_require] -= 1
1168
+ # if @requires[_require] == 0
1169
+ # @requires[_require] = nil
1170
+ # end
1171
+ # end
1172
+
1173
+ def delete(_agobj)
1174
+ _agobj.obj.destroy if defined? _agobj.obj
1175
+ if _agobj==agobj_start
1176
+ @controller.del(self)
1177
+ else
1178
+ @lb.delete(_agobj)
1179
+ select(@lb.objectsList[@lb.objectsList.length - 1]) if @lb.objectsList.length > 0
1180
+ end
1181
+ end
1182
+
1183
+ def activate
1184
+ @controller.activate(self)
1185
+ end
1186
+
1187
+ def register(me)
1188
+ @lb.insert(me)
1189
+ @agobj_last = me
1190
+ return self
1191
+ end
1192
+
1193
+ def select_last(_activate=true)
1194
+ #Tk.messageBox('message'=>'select last')
1195
+ if @agobj_last != nil
1196
+ select(@agobj_last, _activate)
1197
+ end
1198
+ end
1199
+
1200
+ def select(me, _activate_me=true)
1201
+ return if @active_object == me
1202
+ me.activate #if _activate_me
1203
+ @active_object = me
1204
+ @inspect_core.recicle_inspects(me)
1205
+ @lb.select(me)
1206
+ changed
1207
+ notify_observers('SELECT', me)
1208
+ end
1209
+
1210
+ # def objects2code
1211
+ # code_rb = ''
1212
+ # @requires.each_key do |key|
1213
+ # code_rb = code_rb, "require '",key,"'\n"
1214
+ # end
1215
+ # code_rb = code_rb, "\n", @inspect_core.objects2text(@lb.objectsList)
1216
+ # end
1217
+
1218
+ def code2file(_objects_file = nil)
1219
+ @filename = _objects_file
1220
+ if !@filename
1221
+ exit
1222
+ end
1223
+
1224
+ File.open(_objects_file, "w") do |aFile|
1225
+ aFile.print @renderer.code
1226
+ end
1227
+ end
1228
+
1229
+ # def saveObjectsCreationtoFile(_objects_file = 'sample\objects.rb')
1230
+ # @filename = _objects_file
1231
+ # code_rb = ''
1232
+ # code_rbd = ''
1233
+ # code_form = ''
1234
+ # code_form = code_form, "class ", File.basename(_objects_file, ".rb"),"\n"
1235
+ # code_rbd = code_rbd, "require '",_objects_file,"'\n"
1236
+ # @requires.each_key do |key|
1237
+ # code_rb = code_rb, "require '",key,"'\n"
1238
+ # end
1239
+ # @lb.objectsList.each{|object|
1240
+ # code_rb = code_rb, object.get_class_code
1241
+ # code_rbd = code_rbd,"\n", object.get_implementation_code
1242
+ # }
1243
+ # File.open(_objects_file, "w") do |aFile|
1244
+ # aFile.print code_rb
1245
+ # end
1246
+ # File.open(_objects_file+'d', "w") do |aFile|
1247
+ # aFile.print code_rbd
1248
+ # end
1249
+ # end
1250
+
1251
+ def dumpObjectstoFile(_objects_file = 'sample\objects.rb')
1252
+ @filename = _objects_file
1253
+ File.open(_objects_file, "w") do |aFile|
1254
+ @lb.objectsList.each{|object|
1255
+ Marshal.dump(object.obj, aFile)
1256
+ }
1257
+ end
1258
+ end
1259
+
1260
+ end
1261
+
1262
+ class ObjiControllerView
1263
+ attr_reader :nb
1264
+ attr_reader :nb_base
1265
+ attr_reader :layout
1266
+ def initialize(_frame)
1267
+ @nb_base = Tk::BWidget::NoteBook.new(_frame){
1268
+ tabbevelsize 0
1269
+ internalborderwidth 0
1270
+ side $arcadia['conf']['inspectors.tabs.side']
1271
+ font $arcadia['conf']['inspectors.tabs.font']
1272
+ pack('fill'=>'both', :padx=>0, :pady=>0, :expand => 'yes')
1273
+ }
1274
+ end
1275
+ end
1276
+
1277
+ class ObjiController #< ArcadiaExt
1278
+
1279
+ attr_reader :active
1280
+
1281
+ def initialize(_rad)
1282
+ @rad = _rad
1283
+ ArcadiaContractListener.new(self, InspectorContract, :do_inspector_event)
1284
+ ArcadiaContractListener.new(self, WrapperContract, :do_wrapper_event)
1285
+ build
1286
+ end
1287
+
1288
+ # def on_before_build(_event)
1289
+ # ArcadiaContractListener.new(self, InspectorContract, :do_inspector_event)
1290
+ # ArcadiaContractListener.new(self, WrapperContract, :do_wrapper_event)
1291
+ # end
1292
+ def frame
1293
+ @rad.frame(0)
1294
+ end
1295
+
1296
+ def frame_free
1297
+ @rad.frame_free(0)
1298
+ end
1299
+
1300
+ def build
1301
+ #@main_frame = ObjiControllerView.new(self.frame)
1302
+ @objis = Hash.new
1303
+ @wrappers_obji = Hash.new
1304
+ @frames = Array.new
1305
+ end
1306
+
1307
+ def do_wrapper_event(_event)
1308
+ obji = @wrappers_obji[_event.context.wrapper] if _event.context
1309
+ case _event.signature
1310
+ when WrapperContract::WRAPPER_AFTER_CREATE
1311
+ self.register(_event.context.wrapper)
1312
+ when WrapperContract::PROPERTY_AFTER_UPDATE
1313
+ obji.inspect_core.update_property(_event.context.wrapper, _event.context.property_family, _event.context.property_name, _event.context.property_new_value)
1314
+ if (_event.context.property_family=='layout_man')
1315
+ obji.inspect_core.tabs['Layout'].family=_event.context.property_new_value
1316
+ obji.inspect_core.tabs['Layout'].updatelines(
1317
+ _event.context.wrapper,
1318
+ _event.context.wrapper.props[_event.context.property_new_value]
1319
+ )
1320
+ end
1321
+
1322
+ end
1323
+ end
1324
+
1325
+ def main_frame
1326
+ if !defined?(@main_frame) || @main_frame == nil
1327
+ @main_frame = ObjiControllerView.new(self.frame)
1328
+ end
1329
+ return @main_frame
1330
+ end
1331
+
1332
+ def do_inspector_event(_event)
1333
+ obji = @wrappers_obji[_event.context.wrapper] if _event.context
1334
+
1335
+ case _event.signature
1336
+ when InspectorContract::SELECT_WRAPPER
1337
+ obji.select(_event.context.wrapper, false)
1338
+ when InspectorContract::DELETE_WRAPPER
1339
+ obji.delete(_event.context.wrapper)
1340
+ when InspectorContract::DELETE_INSPECTOR
1341
+ self.del(obji)
1342
+ when InspectorContract::RAISE_ACTIVE_TOPLEVEL
1343
+ self.active.raise_toplevel if active
1344
+ when InspectorContract::RAISE_LAST_WIDGET
1345
+ self.active.select_last(true) if active
1346
+ end
1347
+ end
1348
+
1349
+ def register(_wrapper)
1350
+ if _wrapper.ag_parent
1351
+ obji = @wrappers_obji[_wrapper.ag_parent]
1352
+ else
1353
+ obji = self.new_obji(_wrapper)
1354
+ end
1355
+ if obji
1356
+ obji.register(_wrapper)
1357
+
1358
+ @wrappers_obji[_wrapper]=obji
1359
+ end
1360
+ @last_registred = _wrapper
1361
+ end
1362
+
1363
+ def new_obji(_sender, _filename = nil)
1364
+ _fname = 'f'+@frames.length.to_s
1365
+ _frame = self.main_frame.nb_base.insert('end',_fname,'text'=>_sender.i_name)
1366
+ @frames << _frame
1367
+
1368
+ _newobji = Obji.new(_frame, self, _sender, _filename)
1369
+
1370
+ @objis[_newobji]=_fname
1371
+
1372
+ activate(_newobji)
1373
+
1374
+ #@arcadia.layout.raise_panel('_mosca_','Inspect')
1375
+
1376
+ return _newobji
1377
+ end
1378
+
1379
+ def del(_obji)
1380
+ _obji.free
1381
+ self.main_frame.nb_base.delete(@objis.delete(_obji))
1382
+ if @objis.length == 0
1383
+ @active = nil
1384
+ self.frame_free
1385
+ @main_frame = nil
1386
+ else
1387
+ activate(@objis.keys[@objis.length-1])
1388
+ end
1389
+ end
1390
+
1391
+ def activate(me)
1392
+ @active = me
1393
+ self.main_frame.nb_base.raise(@objis[me])
1394
+ end
1395
+
1396
+ end
1397
+
1398
+
1399
+ class ObjiThread
1400
+ attr_reader :oi
1401
+
1402
+ def initialize(_filename = nil)
1403
+ @oi = Obji.new(_filename)
1404
+ end
1405
+
1406
+ def initialize_in_osservazione
1407
+ t_obji = Thread.new {
1408
+ print ' Thread.current = ', Thread.current,"\n"
1409
+ Thread.current[:oi]= Obji.new
1410
+ }
1411
+ @oi = t_obji[:oi]
1412
+ end
1413
+
1414
+ end
1415
+
1416
+
1417
+ #----- inspector core ------
1418
+
1419
+ class Inspector
1420
+ def Inspector.iclass(_wrapper_class)
1421
+ class_rif = _wrapper_class
1422
+ while @@i[class_rif] == nil
1423
+ class_rif = class_rif.superclass
1424
+ end
1425
+ return @@i[class_rif]
1426
+ end
1427
+
1428
+ def Inspector.add_wrapper_class(_class)
1429
+ if defined?(@@i)
1430
+ @@i[_class]=self
1431
+ else
1432
+ @@i = Hash.new
1433
+ end
1434
+ end
1435
+ end
1436
+
1437
+ class AGInspector < Inspector
1438
+ attr_reader :tabs
1439
+
1440
+ def initialize(_host, _agobj)
1441
+ @@instance = self
1442
+ @tabs = Hash.new
1443
+ @code = Hash.new
1444
+ @ag_signature_obj = _agobj
1445
+ @ojts_p = _host.insert('end','props','text'=>'Properties')
1446
+ _host.raise('props')
1447
+ @tabs['Properties'] = InspectList.new('property', @ojts_p)
1448
+ end
1449
+
1450
+ def AGInspector.instance
1451
+ @@instance
1452
+ end
1453
+
1454
+ def AGInspector.class_inspector_renderer
1455
+ ObjiRenderer
1456
+ end
1457
+
1458
+ def recicle_inspects(_agobj)
1459
+ tabs['Properties'].updatelines(_agobj, _agobj.props['property'])
1460
+ end
1461
+
1462
+ def update_property(obj, _fam, _name, _value)
1463
+ if _fam == 'property'
1464
+ tabs['Properties'].modProp(_name, _value)
1465
+ end
1466
+ end
1467
+
1468
+ def activate
1469
+
1470
+ end
1471
+
1472
+ def clear
1473
+ @tabs['Properties'].clear
1474
+ end
1475
+
1476
+ add_wrapper_class AG
1477
+
1478
+ end
1479
+
1480
+ class AGTkInspector < AGInspector
1481
+
1482
+ def initialize( _host, _agobj)
1483
+ super( _host, _agobj)
1484
+ @ojts_layout = _host.insert('end','layout','text'=>'Layout')
1485
+ @top_panel = TkFrame.new(@ojts_layout){
1486
+ place('x'=>0, 'y'=>0, 'relheight'=>1, 'relwidth'=>1)
1487
+ }
1488
+ @tabs['LayoutType'] = InspectList.new('layout_man', @top_panel)
1489
+ @mid_panel = TkFrame.new(@ojts_layout){
1490
+ place('x'=>0, 'y'=>20,'relheight'=>1, 'relwidth'=>1)
1491
+ }
1492
+ @tabs['Layout'] = InspectList.new('...',@mid_panel)
1493
+
1494
+ @ojts_winfo = _host.insert('end','winfo','text'=>'Winfo')
1495
+ @tabs['Winfo'] = InspectList.new('winfo', @ojts_winfo)
1496
+
1497
+
1498
+ #@ojts_bind = _host.insert('end','bind','text'=>'Binding')
1499
+ #@tabs['Binding'] = InspectMultiList.new('bind',@ojts_bind)
1500
+ end
1501
+
1502
+ def clear
1503
+ super
1504
+ @tabs['LayoutType'].clear
1505
+ end
1506
+
1507
+ def recicle_inspects(_agobj)
1508
+ super(_agobj)
1509
+ if _agobj.props['layout_man'] != nil
1510
+ _fam = _agobj.props['layout_man']['manager']['get'].call
1511
+ @tabs['Layout'].family=_fam
1512
+ @tabs['Layout'].updatelines(_agobj, _agobj.props[_fam])
1513
+ end
1514
+ @tabs['LayoutType'].updatelines(_agobj, _agobj.props['layout_man'])
1515
+ @tabs['Winfo'].updatelines(_agobj, _agobj.props['winfo'])
1516
+ #@tabs['Binding'].update(_agobj)
1517
+ end
1518
+
1519
+ def update_property(obj, _fam, _name, _value)
1520
+ if ['place','pack','grid'].include?(_fam)
1521
+ @tabs['Layout'].modProp(_name, _value)
1522
+ elsif ['layout_man'].include?(_fam)
1523
+ @tabs['LayoutType'].modProp(_name, _value)
1524
+ else
1525
+ super(obj, _fam, _name, _value)
1526
+ end
1527
+ end
1528
+
1529
+ add_wrapper_class AGTk
1530
+
1531
+
1532
+ end
1533
+
1534
+