arcadia 0.2.0 → 0.3.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 (38) hide show
  1. data/README +132 -134
  2. data/bin/arcadia +13 -0
  3. data/conf/arcadia.conf +196 -3
  4. data/conf/arcadia.init.rb +27 -6
  5. data/conf/arcadia.res.rb +10 -0
  6. data/ext/ae-complete-code/ae-complete-code.rb +76 -82
  7. data/ext/ae-doc-code/ae-doc-code.rb +295 -291
  8. data/ext/ae-editor/ae-editor.conf +88 -67
  9. data/ext/ae-editor/ae-editor.rb +400 -202
  10. data/ext/ae-editor/langs/conf.lang +16 -5
  11. data/ext/ae-editor/langs/lang.lang.bind +1 -1
  12. data/ext/ae-editor/langs/rb.lang +77 -41
  13. data/ext/ae-editor/langs/rbw.lang.bind +1 -1
  14. data/ext/ae-event-log/ae-event-log.rb +46 -45
  15. data/ext/ae-file-history/ae-file-history.conf +1 -1
  16. data/ext/ae-file-history/ae-file-history.rb +373 -298
  17. data/ext/ae-output/ae-output.conf +2 -0
  18. data/ext/ae-output/ae-output.rb +200 -202
  19. data/ext/ae-rad/ae-rad-inspector.rb +64 -70
  20. data/ext/ae-rad/ae-rad-palette.rb +14 -14
  21. data/ext/ae-rad/ae-rad.conf +2 -0
  22. data/ext/ae-rad/lib/tk/al-tk.rb +2991 -2987
  23. data/ext/ae-rad/lib/tk/al-tkarcadia.rb +26 -26
  24. data/ext/ae-ruby-debug/ae-ruby-debug.conf +8 -8
  25. data/ext/ae-ruby-debug/ae-ruby-debug.rb +1566 -1465
  26. data/ext/ae-search-in-files/ae-search-in-files.rb +294 -284
  27. data/ext/ae-shell/ae-shell.rb +20 -11
  28. data/{base → lib}/a-commons.rb +291 -80
  29. data/{base → lib}/a-contracts.rb +40 -18
  30. data/{arcadia.rb → lib/a-core.rb} +238 -148
  31. data/{base → lib}/a-tkcommons.rb +81 -63
  32. metadata +64 -65
  33. data/ext/ae-action-dispatcher/ae-action-dispatcher.conf +0 -6
  34. data/ext/ae-action-dispatcher/ae-action-dispatcher.rb +0 -22
  35. data/ext/ae-inspector/ae-inspector.conf +0 -7
  36. data/ext/ae-inspector/ae-inspector.rb +0 -1519
  37. data/ext/ae-palette/ae-palette.conf +0 -7
  38. data/ext/ae-palette/ae-palette.rb +0 -265
@@ -9,8 +9,8 @@ require "tk"
9
9
  class Shell < ArcadiaExt
10
10
 
11
11
  def on_before_build(_event)
12
- Arcadia.add_listener(self, SystemExecEvent)
13
- Arcadia.add_listener(self, RunRubyFileEvent)
12
+ Arcadia.attach_listener(self, SystemExecEvent)
13
+ Arcadia.attach_listener(self, RunRubyFileEvent)
14
14
  end
15
15
 
16
16
  def on_build(_event)
@@ -32,13 +32,14 @@ class Shell < ArcadiaExt
32
32
  else
33
33
  Process.fork{
34
34
  open(_cmd_,"r"){|f|
35
- Arcadia.new_debug_msg(self, f.read)
35
+ Arcadia.console(self,'msg'=>f.read, 'level'=>'debug')
36
36
  #Arcadia.new_debug_msg(self, f.read)
37
37
  }
38
38
  }
39
39
  end
40
40
  rescue Exception => e
41
- Arcadia.new_debug_msg(self, e)
41
+ Arcadia.console(self,'msg'=>e, 'level'=>'debug')
42
+ #Arcadia.new_debug_msg(self, e)
42
43
  end
43
44
 
44
45
  end
@@ -52,11 +53,13 @@ class Shell < ArcadiaExt
52
53
  _cmd_ = "|"+@arcadia['conf']['shell.ruby']+" "+_filename+" 2>&1"
53
54
  open(_cmd_,"r"){|f|
54
55
  _readed = f.read
55
- Arcadia.new_debug_msg(self, _readed)
56
+ Arcadia.console(self,'msg'=>_readed, 'level'=>'debug')
57
+ #Arcadia.new_debug_msg(self, _readed)
56
58
  _event.add_result(self, 'output'=>_readed)
57
59
  }
58
60
  rescue Exception => e
59
- Arcadia.new_debug_msg(self, e)
61
+ Arcadia.console(self,'msg'=>e, 'level'=>'debug')
62
+ #Arcadia.new_debug_msg(self, e)
60
63
  end
61
64
  end
62
65
  end
@@ -66,19 +69,23 @@ class Shell < ArcadiaExt
66
69
  (RUBY_PLATFORM.include?('mswin32'))?_cmd="cmd":_cmd='sh'
67
70
  if is_windows?
68
71
  Thread.new{
69
- Arcadia.new_debug_msg(self, 'inizio')
72
+ Arcadia.console(self,'msg'=>'begin', 'level'=>'debug')
73
+ #Arcadia.new_debug_msg(self, 'inizio')
70
74
  @io = IO.popen(_cmd,'r+')
71
75
  @io.puts(command)
72
76
  result = ''
73
77
  while line = @io.gets
74
78
  result << line
75
79
  end
76
- Arcadia.new_debug_msg(self, result)
80
+ #Arcadia.new_debug_msg(self, result)
81
+ Arcadia.console(self,'msg'=>result, 'level'=>'debug')
82
+
77
83
  }
78
84
  else
79
85
  Process.fork{
80
86
  open(_cmd_,"r"){|f|
81
- Arcadia.new_debug_msg(self, f.read)
87
+ Arcadia.console(self,'msg'=>f.read, 'level'=>'debug')
88
+ #Arcadia.new_debug_msg(self, f.read)
82
89
  }
83
90
  }
84
91
  end
@@ -118,11 +125,13 @@ class Shell < ArcadiaExt
118
125
  _cmd_ = "|"+$arcadia['conf']['shell.ruby']+" "+_filename+" 2>&1"
119
126
  # Arcadia.new_debug_msg(self, _cmd_)
120
127
  @cmd = open(_cmd_,"r"){|f|
121
- Arcadia.new_debug_msg(self, f.read)
128
+ Arcadia.console(self, 'msg'=>f.read ,'level'=>'debug')
129
+ #Arcadia.new_debug_msg(self, f.read)
122
130
  }
123
131
  end
124
132
  rescue Exception => e
125
- Arcadia.new_debug_msg(self, e)
133
+ Arcadia.console(self, 'msg'=>e ,'level'=>'debug')
134
+ #Arcadia.new_debug_msg(self, e)
126
135
  end
127
136
  end
128
137
  end
@@ -10,32 +10,176 @@ require 'singleton'
10
10
  # Extension
11
11
  # +------------------------------------------+
12
12
 
13
+
14
+ class AbstractFrameWrapper
15
+ # def AbstractFrameWrapper.inherited(sub)
16
+ # unless sub.respond_to? :hinner_frame
17
+ # raise NoMethodError, "#{sub} needs to respond to `:hinner_frame'"
18
+ # end
19
+ # unless sub.respond_to? :title
20
+ # raise NoMethodError, "#{sub} needs to respond to `:title'"
21
+ # end
22
+ #
23
+ # unless sub.respond_to? :show
24
+ # raise NoMethodError, "#{sub} needs to respond to `:show'"
25
+ # end
26
+ #
27
+ # unless sub.respond_to? :hide
28
+ # raise NoMethodError, "#{sub} needs to respond to `:hide'"
29
+ # end
30
+ #
31
+ # unless sub.respond_to? :free
32
+ # raise NoMethodError, "#{sub} needs to respond to `:free'"
33
+ # end
34
+ # end
35
+
36
+ def initialize
37
+ unless sub.respond_to? :hinner_frame
38
+ raise NoMethodError, "#{sub} needs to respond to `:hinner_frame'"
39
+ end
40
+ unless sub.respond_to? :title
41
+ raise NoMethodError, "#{sub} needs to respond to `:title'"
42
+ end
43
+
44
+ unless sub.respond_to? :show
45
+ raise NoMethodError, "#{sub} needs to respond to `:show'"
46
+ end
47
+
48
+ unless sub.respond_to? :hide
49
+ raise NoMethodError, "#{sub} needs to respond to `:hide'"
50
+ end
51
+
52
+ unless sub.respond_to? :free
53
+ raise NoMethodError, "#{sub} needs to respond to `:free'"
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ #module AbstractFrameWrapper
60
+ # def hinner_frame
61
+ # raise NoMethodError, "#{self} needs to respond to `:hinner_frame'"
62
+ # end
63
+ #end
64
+
65
+ class FixedFrameWrapper < AbstractFrameWrapper
66
+ # include AbstractFrameWrapper
67
+ def initialize(_arcadia, _point, _name, _title='')
68
+ @arcadia = _arcadia
69
+ @point =_point
70
+ @name = _name
71
+ @title = _title
72
+ fixed_frame_forge
73
+ end
74
+
75
+ def fixed_frame_forge
76
+ @fixed_frame = @arcadia.layout.register_panel(@point, @name, @title) if @fixed_frame.nil?
77
+ end
78
+ private :fixed_frame_forge
79
+
80
+ def hinner_frame
81
+ fixed_frame_forge
82
+ @fixed_frame
83
+ end
84
+
85
+ def title(_title=nil)
86
+ fixed_frame_forge
87
+ @arcadia.layout.domain(@point)['root'].top_text(_title)
88
+ end
89
+
90
+ def show
91
+ fixed_frame_forge
92
+ @arcadia.layout.raise_panel(@point, @name)
93
+ end
94
+
95
+ def hide
96
+ end
97
+
98
+ def free
99
+ @arcadia.layout.unregister_panel(@point, @name)
100
+ @fixed_frame = nil
101
+ end
102
+ end
103
+
104
+
105
+ class FloatFrameWrapper < AbstractFrameWrapper
106
+ # include AbstractFrameWrapper
107
+ def initialize(_arcadia, _geometry=nil, _title=nil)
108
+ @arcadia = _arcadia
109
+ @geometry = _geometry
110
+ @title= _title
111
+ float_frame_forge
112
+ end
113
+
114
+ def float_frame_forge
115
+ if @obj.nil?
116
+ a = @geometry.scan(/[+-]*\d\d*%*/)
117
+ p_height = TkWinfo.screenheight(@arcadia.layout.root)
118
+ p_width = TkWinfo.screenwidth(@arcadia.layout.root)
119
+ if a[0][-1..-1]=='%'
120
+ n = a[0][0..-2].to_i.abs
121
+ a[0] = (p_width/100*n).to_i
122
+ end
123
+ if a[1][-1..-1]=='%'
124
+ n = a[1][0..-2].to_i.abs
125
+ a[1] = (p_height/100*n).to_i
126
+ end
127
+ if a[2][-1..-1]=='%'
128
+ n = a[2][0..-2].to_i.abs
129
+ a[2] = (p_width/100*n).to_i
130
+ end
131
+ if a[3][-1..-1]=='%'
132
+ n = a[3][0..-2].to_i.abs
133
+ a[3] = (p_height/100*n).to_i
134
+ end
135
+
136
+ args = {'width'=>a[0], 'height'=>a[1], 'x'=>a[2], 'y'=>a[3]}
137
+ @obj = @arcadia.layout.new_float_frame(args)
138
+ @obj.title(@title) if @title
139
+ end
140
+ end
141
+
142
+ def hinner_frame
143
+ float_frame_forge
144
+ @obj.frame if @obj
145
+ end
146
+
147
+ def title(_title=nil)
148
+ float_frame_forge
149
+ @obj.title(_title) if @obj
150
+ end
151
+
152
+ def show
153
+ float_frame_forge
154
+ @obj.show if @obj
155
+ end
156
+
157
+ def hide
158
+ float_frame_forge
159
+ @obj.hide if @obj
160
+ end
161
+
162
+ def free
163
+ @obj.destroy if @obj
164
+ @obj = nil
165
+ end
166
+ end
167
+
13
168
  class ArcadiaExt
14
169
  attr_reader :arcadia
15
-
16
170
  def initialize(_arcadia, _name=nil)
17
171
  @arcadia = _arcadia
18
- Arcadia.add_listener(self, BuildEvent)
19
- Arcadia.add_listener(self, ExitQueryEvent)
20
- Arcadia.add_listener(self, FinalizeEvent)
172
+ Arcadia.attach_listener(self, BuildEvent)
173
+ Arcadia.attach_listener(self, ExitQueryEvent)
174
+ Arcadia.attach_listener(self, FinalizeEvent)
21
175
  @name = _name
22
176
  @frames = Array.new
23
177
  @frames_points = conf_array("#{_name}.frames")
24
178
  @frames_labels = conf_array("#{_name}.labels")
25
179
  @float_frames = Array.new
26
- # unless self.respond_to? :build
27
- # raise NoMethodError, "ArcadiaExt needs to respond to `:build'"
28
- # end
29
- # unless self.respond_to? :before_build
30
- # raise NoMethodError, "ArcadiaExt needs to respond to `:before_build'"
31
- # end
32
- # unless self.respond_to? :after_build
33
- # raise NoMethodError, "ArcadiaExt needs to respond to `:after_build'"
34
- # end
35
- # if self.respond_to? :arcadia_update
36
- # ObserverCallback.new(@arcadia.main_contract, self, :arcadia_update)
37
- # end
38
- ObjectSpace.define_finalizer(self, self.method(:finalize).to_proc)
180
+ @float_geometries = conf_array("#{_name}.float_frames")
181
+ @float_labels = conf_array("#{_name}.float_labels")
182
+ #ObjectSpace.define_finalizer(self, self.method(:finalize).to_proc)
39
183
  end
40
184
 
41
185
  def conf_array(_name)
@@ -48,67 +192,27 @@ class ArcadiaExt
48
192
  def frame(_n=0)
49
193
  if @frames[_n] == nil && @frames_points[_n]
50
194
  (@frames_labels[_n].nil?)? _label = @name : _label = @frames_labels[_n]
51
- @frames[_n] = @arcadia.layout.register_panel(@frames_points[_n],@name, _label)
195
+ @frames[_n] = FixedFrameWrapper.new(@arcadia, @frames_points[_n], @name, _label)
52
196
  end
53
197
  return @frames[_n]
54
198
  end
55
-
56
- def frame_free(_n=0)
57
- if _n.nil?
58
- @frames.each_index{|i|
59
- @arcadia.layout.unregister_panel(@frames_points[i],@name)
60
- @frames[i]=nil
61
- }
62
- else
63
- @arcadia.layout.unregister_panel(@frames_points[_n],@name)
64
- @frames[_n] = nil
65
- end
66
-
67
- end
68
-
69
- def frame_raise(_n=0)
70
- if _n.nil?
71
- @frames.each_index{|i|
72
- @arcadia.layout.raise_panel(@frames_points[i],@name)
73
- }
74
- else
75
- @arcadia.layout.raise_panel(@frames_points[_n],@name)
76
- end
77
- end
78
-
79
-
80
- def frame_title(_title=nil, _n=0)
81
- self.frames(_n) if @frames[_n] == nil
82
- @arcadia.layout.domain(@frames_points[_n])['root'].top_text(_title)
83
- end
84
-
199
+
85
200
  def float_frame(_n=0, _args=nil)
86
201
  if @float_frames[_n].nil?
87
- @float_frames[_n] = @arcadia.layout.new_float_frame(_args)
202
+ (@float_labels[_n].nil?)? _label = @name : _label = @float_labels[_n]
203
+ @float_frames[_n] = FloatFrameWrapper.new(@arcadia, @float_geometries[_n], _label)
88
204
  end
89
205
  @float_frames[_n]
90
206
  end
91
207
 
92
- def conf(_property)
208
+ def conf(_property)
93
209
  @arcadia['conf'][@name+'.'+_property]
94
- end
95
-
96
- # def arcadia_update(_sender, _event)
97
- #must be implemented to activate
98
- # end
99
-
100
- def can_exit_query
101
- return true
102
- end
103
-
104
- def finalize
105
- #may be extendeded in child
106
210
  end
107
211
 
108
- def verbose
109
- '??????'
110
- end
111
-
212
+ # def conf_global(_property)
213
+ # @arcadia['conf'][_property]
214
+ # end
215
+
112
216
  def exec(_method, _args=nil)
113
217
  if self.respond_to(_method)
114
218
  self.send(_method, _args)
@@ -268,25 +372,29 @@ module EventBus #(or SourceEvent)
268
372
  if _class != _event.class
269
373
  sub_method_name = _method_name(_event.class)
270
374
  @@listeners[_class].each do|_listener|
271
- #p "--- method_name=>#{method_name}"
272
- #p "--- sub_method_name=>#{sub_method_name}"
273
- #p "--- for listener #{_listener}"
274
- if _listener.respond_to?(sub_method_name)
275
- Thread.new{_listener.send(sub_method_name, _event)}
276
- elsif _listener.respond_to?(method_name)
277
- Thread.new{_listener.send(method_name, _event)}
278
- end
375
+ if _listener.respond_to?(sub_method_name)
376
+ Thread.new{_listener.send(sub_method_name, _event)}
377
+ elsif _listener.respond_to?(method_name)
378
+ Thread.new{_listener.send(method_name, _event)}
379
+ end
279
380
  end
280
381
  else
281
382
  @@listeners[_class].each do|_listener|
282
- _listener.send(method_name, _event) if _listener.respond_to?(method_name)
383
+ Thread.new{
384
+ _listener.send(method_name, _event) if _listener.respond_to?(method_name)
385
+ }
283
386
  end
284
387
  end
285
388
  end
286
389
  private :_broadcast_fase
287
390
 
391
+ def detach_listener(_listener, _class_event)
392
+ if @@listeners[_class_event]
393
+ @@listeners[_class_event].delete(_listener)
394
+ end
395
+ end
288
396
 
289
- def add_listener(_listener, _class_event)
397
+ def attach_listener(_listener, _class_event)
290
398
  @@listeners = {} unless defined? @@listeners
291
399
  @@listeners[_class_event] = [] unless @@listeners.has_key?(_class_event)
292
400
  @@listeners[_class_event] << _listener
@@ -317,7 +425,8 @@ module Autils
317
425
  end
318
426
 
319
427
  module Configurable
320
- def properties_file2hash(_property_file)
428
+
429
+ def properties_file2hash(_property_file, _link_hash=nil)
321
430
  r_hash = Hash.new
322
431
  if _property_file && FileTest::exist?(_property_file)
323
432
  f = File::open(_property_file,'r')
@@ -339,6 +448,9 @@ module Configurable
339
448
  if var.length > 1
340
449
  _value = var[1].strip
341
450
  var[2..-1].collect{|x| _value=_value+'='+x} if var.length > 2
451
+ if _link_hash
452
+ _value = resolve_link(_value, _link_hash)
453
+ end
342
454
  r_hash[var[0].strip]=_value
343
455
  end
344
456
  end
@@ -349,6 +461,63 @@ module Configurable
349
461
  return r_hash
350
462
  end
351
463
  end
464
+
465
+ def Configurable.properties_group(_group, _hash_source)
466
+ @@conf_groups = Hash.new if !defined?(@@conf_groups)
467
+ if @@conf_groups[_group].nil?
468
+ @@conf_groups[_group] = Hash.new
469
+ glen=_group.length
470
+ _hash_source.keys.sort.each{|k|
471
+ if k[0..glen] == "#{_group}."
472
+ @@conf_groups[_group][k[glen+1..-1]]=_hash_source[k]
473
+ elsif @@conf_groups[_group].length > 0
474
+ break
475
+ end
476
+ }
477
+ end
478
+ Hash.new.update(@@conf_groups[_group])
479
+ end
480
+
481
+
482
+ def resolve_link(_v, _hash_source, _link_symbol='>>>')
483
+ if _v.length > 3 && _v[0..2]==_link_symbol
484
+ _v=_hash_source[_v[3..-1]] if _hash_source[_v[3..-1]]
485
+ end
486
+ return _v
487
+ end
488
+
489
+ def resolve_properties_link(_hash_target, _hash_source, _link_symbol='>>>')
490
+ loop_level_max = 10
491
+ # _hash_adding = Hash.new
492
+ _keys_to_extend = Array.new
493
+ _hash_target.each{|k,v|
494
+ loop_level = 0
495
+ while loop_level < loop_level_max && v.length > 3 && v[0..2]==_link_symbol
496
+ if k[-1..-1]=='.'
497
+ _keys_to_extend << k
498
+ break
499
+ elsif _hash_source[v[3..-1]]
500
+ v=_hash_source[v[3..-1]]
501
+ else
502
+ break
503
+ end
504
+ loop_level = loop_level + 1
505
+ end
506
+ _hash_target[k]=v
507
+ if loop_level == loop_level_max
508
+ raise("Link loop found for property : #{k}")
509
+ end
510
+ }
511
+ _keys_to_extend.each do |k|
512
+ v=_hash_target[k]
513
+ g=Configurable.properties_group(v[3..-1], _hash_target)
514
+ g.each do |key,value|
515
+ _hash_target["#{k[0..-2]}.#{key}"]=value if !_hash_target["#{k[0..-2]}.#{key}"]
516
+ end
517
+ _hash_target.delete(k)
518
+ end
519
+ end
520
+
352
521
  end
353
522
 
354
523
  module Persistable
@@ -401,6 +570,27 @@ class Application
401
570
  @@instance
402
571
  end
403
572
 
573
+ def Application.conf(_property)
574
+ @@instance['conf'][_property] if @@instance
575
+ end
576
+
577
+ def Application.conf_group(_group)
578
+ @@conf_groups = Hash.new if !defined?(@@conf_groups)
579
+ if @@conf_groups[_group].nil?
580
+ @@conf_groups[_group] = Hash.new
581
+ glen=_group.length
582
+ @@instance['conf'].keys.sort.each{|k|
583
+ if k[0..glen] == "#{_group}."
584
+ @@conf_groups[_group][k[glen+1..-1]]=@@instance['conf'][k]
585
+ elsif @@conf_groups[_group].length > 0
586
+ break
587
+ end
588
+ }
589
+ end
590
+ @@conf_groups[_group]
591
+ end
592
+
593
+
404
594
  def prepare
405
595
  end
406
596
 
@@ -435,13 +625,27 @@ class Application
435
625
  end
436
626
  else
437
627
  msg = "Locad dir "+'"'+local_dir+'"'+" must be writable!"
438
- Arcadia.ok(self, 'title' => '(Arcadia)', 'msg' => msg, 'level'=>'error')
628
+ Arcadia.dialog(self, 'type'=>'ok','title' => '(Arcadia)', 'msg' => msg, 'level'=>'error')
439
629
  exit
440
-
441
630
  end
442
631
  end
443
632
  end
444
633
 
634
+ def load_theme(_name=nil)
635
+ _theme_file = "conf/theme-#{_name}.conf" if !_name.nil?
636
+ if _theme_file && File.exist?(_theme_file)
637
+ self['conf'].update(self.properties_file2hash(_theme_file))
638
+ _theme_res_file = "conf/theme-#{_name}.res.rb"
639
+ if _theme_res_file && File.exist?(_theme_res_file)
640
+ begin
641
+ require _theme_res_file
642
+ rescue Exception => e
643
+ end
644
+
645
+ end
646
+ end
647
+ end
648
+
445
649
  def local_dir
446
650
  _local_dir = File.join(ENV["HOME"],'.'+self['applicationParams'].name) if ENV["HOME"]
447
651
  if _local_dir && !File.exist?(_local_dir)
@@ -450,7 +654,7 @@ class Application
450
654
  @first_run = true
451
655
  else
452
656
  msg = "Locad dir "+'"'+ENV["HOME"]+'"'+" must be writable!"
453
- Arcadia.ok(self, 'title' => "(#{self['applicationParams'].name})", 'msg' => msg, 'level'=>'error')
657
+ Arcadia.dialog(self, 'type'=>'ok', 'title' => "(#{self['applicationParams'].name})", 'msg' => msg, 'level'=>'error')
454
658
  exit
455
659
  end
456
660
  end
@@ -473,6 +677,13 @@ class Application
473
677
  end
474
678
  end
475
679
 
680
+ def []=(_name, _value)
681
+ if @objs[_name]
682
+ @objs[_name] = _value
683
+ end
684
+ end
685
+
686
+
476
687
  def run
477
688
  end
478
689
  end