arcadia 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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