arcadia 0.1.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.
data/base/a-libs.rb ADDED
@@ -0,0 +1,852 @@
1
+ #
2
+ # a-libs.rb - Arcadia Ruby ide
3
+ # by Antonio Galeone <antonio-galeone@rubyforge.org>
4
+ #
5
+
6
+ class ArcadiaLib
7
+ attr_reader :arcadia_lib_params
8
+ attr_reader :classes
9
+
10
+ def initialize(_arcadia, _arcadia_lib_params)
11
+ @arcadia = _arcadia
12
+ @arcadia_lib_params = _arcadia_lib_params
13
+ @classes = Array.new
14
+ @requires = Array.new
15
+ @require4class = Hash.new
16
+ register_classes
17
+ end
18
+
19
+ def add_class(arcadia_class=nil, _is_top=false)
20
+ _self = self
21
+ if arcadia_class
22
+ class << arcadia_class
23
+ def library=(lib)
24
+ @library = lib
25
+ end
26
+ def library
27
+ @library
28
+ end
29
+
30
+ end
31
+ arcadia_class.library = self
32
+ if _is_top
33
+ class << arcadia_class
34
+ def is_top
35
+ true
36
+ end
37
+ end
38
+ else
39
+ class << arcadia_class
40
+ def is_top
41
+ false
42
+ end
43
+ end
44
+ end
45
+ @classes << arcadia_class
46
+ end
47
+ end
48
+
49
+ protected :add_class
50
+ def register_classes
51
+ end
52
+ protected :register_classes
53
+
54
+ end
55
+
56
+
57
+ class ArcadiaLibs
58
+ attr_reader :arcadia
59
+ ArcadiaLibParams = Struct.new( "ArcadiaLibParams",
60
+ :name,
61
+ :source,
62
+ :require,
63
+ :classLib
64
+ )
65
+
66
+ def initialize(_arcadia)
67
+ @arcadia = _arcadia
68
+ @@libs = Array.new
69
+ end
70
+
71
+ def list
72
+ @@libs
73
+ end
74
+
75
+ def add_lib(arcadia_lib_params=nil)
76
+ if arcadia_lib_params
77
+ @@libs << arcadia_lib_params.classLib.new(@arcadia,arcadia_lib_params)
78
+ end
79
+ end
80
+
81
+ def ArcadiaLibs.check_dictionary
82
+ if !defined?(@@wrappers_for_classes)
83
+ @@wrappers_for_classes = Hash.new
84
+ @@libs.each{|_lib|
85
+ _lib.classes.each{|_class|
86
+ @@wrappers_for_classes[_class.class_wrapped]=_class
87
+ }
88
+ }
89
+ end
90
+ end
91
+
92
+ def ArcadiaLibs.wrapper_class(_class)
93
+ check_dictionary
94
+ return @@wrappers_for_classes[_class]
95
+ end
96
+
97
+ def ArcadiaLibs.copy_wrapper_of_class_to_class(_of_class, _to_class)
98
+ check_dictionary
99
+ @@wrappers_for_classes[_to_class] = @@wrappers_for_classes[_of_class]
100
+ end
101
+
102
+ end
103
+
104
+ class PropType
105
+ def initialize
106
+ end
107
+ end
108
+
109
+ class StringType < PropType
110
+ def initialize
111
+ end
112
+ end
113
+
114
+ class NumberType < PropType
115
+ def initialize
116
+ end
117
+ end
118
+
119
+ class ProcType < PropType
120
+ def initialize(_proc)
121
+ @p = _proc
122
+ end
123
+ def procReturn
124
+ @p.call
125
+ end
126
+ end
127
+
128
+ class EnumType < PropType
129
+ attr_reader :values
130
+ def initialize(*args)
131
+ if args.class == Array
132
+ @values = *args
133
+ else
134
+ @values = [*args]
135
+ end
136
+ end
137
+ end
138
+
139
+ class EnumProcType < EnumType
140
+ def initialize(_proc, *args)
141
+ @p = _proc
142
+ super(*args)
143
+ end
144
+ def procReturn
145
+ @p.call
146
+ end
147
+ end
148
+
149
+ class ObjEnumProcType < EnumProcType
150
+ attr_reader :it
151
+ def initialize(_obj, _proc, *args)
152
+ @it = me
153
+ super(_proc, *args)
154
+ end
155
+ end
156
+
157
+ class AGSniffer
158
+ attr_reader :sons
159
+ def initialize(_obj)
160
+ @obj = _obj
161
+ @sons = Array.new
162
+ find_sons
163
+ end
164
+ def find_sons
165
+
166
+ end
167
+ def has_sons?
168
+ @sons.length > 0
169
+ end
170
+ end
171
+
172
+ class AGRenderer
173
+ #INDENT_UNIT = "\t"
174
+ INDENT_UNIT = "\s"*2
175
+ def initialize(_agobj=nil)
176
+ if _agobj
177
+ @agobj = _agobj
178
+ else
179
+ exit
180
+ end
181
+ end
182
+
183
+ def class_code(_ind=0, _args=nil)
184
+ args = render_on_create_properties(_args)
185
+ return class_begin(_ind, args), class_hinner_begin(_ind+1), class_hinner_end(_ind+1), class_end(_ind)
186
+ end
187
+
188
+ def class_begin(_ind=0, _args=nil)
189
+ code = INDENT_UNIT*_ind,'class ', @agobj.getInstanceClass, ' < ', @agobj.getObjClass
190
+ code_attr=''
191
+ code_hinner_class=''
192
+ @agobj.sons.each {|value|
193
+ if (value.sons.length > 0)
194
+ code_hinner_class = code_hinner_class,"\n", value.renderer.class_code(_ind+1)
195
+ end
196
+ code_attr = code_attr,"\n",INDENT_UNIT*(_ind+1),'attr_reader :', value.i_name
197
+ }
198
+ code = code,code_attr if (code_attr.length >0)
199
+ code = code,code_hinner_class,"\n" if (code_hinner_class.length >0)
200
+ code = code,"\n", INDENT_UNIT*(_ind+1),"def initialize(parent=nil, *args)\n"
201
+ if _args
202
+ code = code, INDENT_UNIT*(_ind+2),"super(parent, "+_args+")\n"
203
+ else
204
+ code = code, INDENT_UNIT*(_ind+2),"super(parent, *args)\n"
205
+ end
206
+ end
207
+
208
+ def class_hinner_begin(_ind=0)
209
+ return render_family(_ind+1,'property','default')
210
+ end
211
+
212
+ def class_hinner_end(_ind=0)
213
+ code = ''
214
+ @agobj.sons.each {|value|
215
+ if (value.sons.length > 0)
216
+ code = code, value.renderer.obj_begin(_ind+1),"\n"
217
+ else
218
+ code = code, value.renderer.obj_code(_ind+1),"\n"
219
+ end
220
+ }
221
+ return code.to_s
222
+ end
223
+
224
+ def class_end(_ind=0)
225
+ code = code, "\n", INDENT_UNIT*(_ind+1),"end\n",INDENT_UNIT*(_ind),"end"
226
+ return code.to_s
227
+ end
228
+
229
+ def obj_code(_ind=0)
230
+ return obj_begin(_ind), "{ ",obj_hinner_begin(_ind+1), obj_hinner_end(_ind+1), obj_end(_ind),"}"
231
+ end
232
+
233
+ def obj_begin(_ind=0)
234
+ _s_ind = INDENT_UNIT*_ind
235
+ if _s_ind == nil
236
+ _s_ind = ''
237
+ end
238
+ if @agobj.sons.length > 0
239
+ _class = @agobj.getInstanceClass
240
+ else
241
+ _class = @agobj.class.class_wrapped.to_s
242
+ end
243
+ return "\n",_s_ind+'@'+@agobj.i_name+' = '+_class+'.new(self)'
244
+ end
245
+
246
+ def obj_hinner_begin(_ind=0)
247
+ return class_hinner_begin(_ind)
248
+ end
249
+
250
+ def obj_hinner_end(_ind=0)
251
+ code = ''
252
+ _s_attr_reader = ''
253
+ _s_ind = INDENT_UNIT*_ind
254
+ _s_attr_reader = ''
255
+ @agobj.sons.each{|son|
256
+ code = code , "\n", son.renderer.obj_code(_ind)
257
+ _s_attr_reader = _s_attr_reader, "\n", _s_ind,INDENT_UNIT*2 ,':',son.i_name
258
+ }
259
+ if code.length > 0 then
260
+ code = code , "\n",_s_ind,"class << self"
261
+ code = code , "\n",_s_ind," attr_reader",_s_attr_reader
262
+ code = code , "\n",_s_ind,"end"
263
+ end
264
+ return code
265
+ end
266
+
267
+ def obj_end(_ind=0)
268
+ _s_ind = INDENT_UNIT*_ind
269
+ if _s_ind == nil
270
+ _s_ind = ''
271
+ end
272
+ _s_ind
273
+ end
274
+
275
+ def render_on_create_properties(_args = nil)
276
+ ret = nil
277
+ if _args
278
+ ret = ''
279
+ _args.each{|k,v|
280
+ if ret.strip.length > 0
281
+ ret = ret + ', '
282
+ end
283
+ ret = ret + "'"+k+"' => '"+v+"'"
284
+ }
285
+ end
286
+ aprop = @agobj.props_kinds['property']['on-create']
287
+ if aprop
288
+ ret = '' if ret == nil
289
+ aprop.each{|name|
290
+ next if _args && _args.has_key?(name)
291
+ prop = @agobj.props['property'][name]
292
+ _val = render_value(prop, 'property')
293
+ if _val == nil
294
+ next
295
+ end
296
+ if ret.strip.length > 0
297
+ ret = ret +', '
298
+ end
299
+ #Tk.messageBox('message'=>_val.to_s)
300
+ if (prop['def'] == '')||(prop['def'] == nil) #significa che possiamo inserire nel blocco come chiave,valore
301
+ ret = ret + "'"+ prop['name'] +"' => "+ _val.to_s
302
+ elsif (prop['def'] != nil)&&(prop['def'] != 'nodef')
303
+ ret = ret + prop['def'].call(_val.to_s)
304
+ end
305
+ }
306
+ end
307
+ ret = nil if ret != nil && ret.strip.length == 0
308
+ return ret
309
+ end
310
+
311
+ def render_value(_prop, _family)
312
+ #Tk.messageBox('message'=>_prop['name'])
313
+ return nil if _prop == nil
314
+ _val = _prop['get'].call
315
+
316
+ if @agobj.defaults_values[@agobj.class][_family][_prop['name']]==_val
317
+ return nil
318
+ end
319
+
320
+ _prop['def_string'] != nil && !_prop['def_string'] ? is_string = false: is_string = true
321
+
322
+ if _val.kind_of?(String) && is_string
323
+ _val = "'",_val,"'"
324
+ elsif _val != nil
325
+ _val = _val.to_s
326
+ end
327
+ #Tk.messageBox('message'=>_val)
328
+ return _val
329
+ end
330
+
331
+ def render_value_default(_prop, _family)
332
+ return nil if _prop == nil
333
+ _val = _prop['value']
334
+ _prop['def_string'] != nil && !_prop['def_string'] ? is_string = false: is_string = true
335
+ if _val.kind_of?(String) && is_string
336
+ _val = "'",_val,"'"
337
+ elsif _val != nil
338
+ _val = _val.to_s
339
+ end
340
+ return _val
341
+ end
342
+
343
+
344
+
345
+ def render_family(_ind=0, _family='', _kind=nil, _default=false)
346
+ if @agobj.props[_family] == nil
347
+ return ''
348
+ end
349
+ _s_block = ''
350
+ _s_ind = INDENT_UNIT*_ind
351
+
352
+ render_group = @agobj.props_def[_family] != nil
353
+ if render_group
354
+ @agobj.props_def[_family]['sep'] != nil ? render_group_sep = @agobj.props_def[_family]['sep']:render_group_sep = ''
355
+ @agobj.props_def[_family]['default'] != nil ? render_group_default = @agobj.props_def[_family]['default']:render_group_default = proc{|nome,x| "'#{nome}' #{x}"}
356
+ end
357
+ if _kind == nil
358
+ properties_list = Array.new
359
+ @agobj.props_kinds[_family].each_value{|p|
360
+ properties_list.concat(p)
361
+ }
362
+ else
363
+ properties_list = @agobj.props_kinds[_family][_kind]
364
+ end
365
+ properties_list.each{|name|
366
+ value = @agobj.props[_family][name]
367
+ if _default
368
+ _val = render_value_default(value, _family)
369
+ else
370
+ _val = render_value(value, _family)
371
+ end
372
+ if _val == nil
373
+ next
374
+ end
375
+
376
+ if render_group
377
+ if _s_block.length > 0
378
+ _s_block = _s_block, render_group_sep
379
+ end
380
+ _s_block = _s_block,"\n",_s_ind, INDENT_UNIT
381
+ if (value['def'] == '')||(value['def'] == nil) #significa che possiamo inserire nel blocco come chiave,valore
382
+ _s_block = _s_block, render_group_default.call(value['name'] , _val)
383
+ elsif (value['def'] != nil)&&(value['def'] != 'nodef')
384
+ _s_block = _s_block, value['def'].call(_val)
385
+ end
386
+ else
387
+ if (value['def'] == '')||(value['def'] == nil) #significa che possiamo inserire nel blocco come chiave,valore
388
+ _s_block = _s_block, "\n",_s_ind , value['name'] ,INDENT_UNIT , _val
389
+ elsif (value['def'] != nil)&&(value['def'] != 'nodef')
390
+ _s_block = _s_block , "\n", _s_ind ,value['def'].call(_val)
391
+ end
392
+ end
393
+ }
394
+
395
+ if render_group
396
+ _ss_block = "\n",_s_ind
397
+ if @agobj.props_def[_family]['path'] != nil
398
+ _ss_block = _ss_block, @agobj.props_def[_family]['path']
399
+ end
400
+ _ss_block = _ss_block, @agobj.props_def[_family]['before'], _s_block, "\n",_s_ind, @agobj.props_def[_family]['after']
401
+ else
402
+ _ss_block = _s_block
403
+ end
404
+ #p _ss_block.to_s
405
+ return _ss_block
406
+ end
407
+ end
408
+
409
+ class AG
410
+ attr_reader :props, :props_def, :i_name, :i_ag, :ag_parent, :obj_class, :obj
411
+ attr_reader :sons, :renderer
412
+ attr_reader :sniffer
413
+ attr_reader :persistent
414
+ #attr_reader :props_seq
415
+ attr_reader :props_kinds
416
+ attr_writer :props, :i_name, :i_ag
417
+
418
+ def initialize(_ag_parent = nil, _object = nil)
419
+ @ag_parent = _ag_parent
420
+ if _object == nil
421
+ new_object
422
+ else
423
+ passed_object(_object)
424
+ end
425
+
426
+ @obj_class = self.class.near_class_wrapped(@obj)
427
+ @sons = Array.new
428
+ @renderer=self.class.class_renderer.new(self)
429
+ @sniffer=self.class.class_sniffer.new(@obj)
430
+ yield(self) if block_given?
431
+ if !defined?(@i_name)
432
+ @i_name = self.class.class_wrapped.to_s.gsub('::','_') + new_id
433
+ @i_name = @i_name.sub(/^./) { $&.downcase}
434
+ end
435
+ @i_ag = 'ag' + @i_name
436
+ @props = Hash.new
437
+ @props_def = Hash.new
438
+ @props_kinds = Hash.new
439
+ @persistent = Hash.new
440
+ @requires = Hash.new
441
+ properties
442
+ defaults(_object != nil )
443
+ if _object != nil
444
+ retrive_values
445
+ else
446
+ start_properties
447
+ end
448
+ self.register
449
+ end
450
+
451
+ def add_require(_require)
452
+ if @requires[_require] == nil
453
+ @requires[_require] = 1
454
+ else
455
+ @requires[_require] += 1
456
+ end
457
+ end
458
+
459
+ def del_require(_require)
460
+ @requires[_require] -= 1
461
+ if @requires[_require] == 0
462
+ @requires[_require] = nil
463
+ end
464
+ end
465
+
466
+ def select
467
+ _tobj = InspectorContract::TInspectorObj.new(self)
468
+ _tobj.wrapper = self
469
+ InspectorContract.instance.select(_tobj)
470
+ self
471
+ end
472
+
473
+
474
+ def activate
475
+ @@active = self
476
+ end
477
+
478
+
479
+ def build_sons
480
+ iv = @obj.instance_variables
481
+ if iv.length > 0
482
+ cod = " class << @obj"+"\n"
483
+ iv.each{|i|
484
+ i.delete!('@')
485
+ cod = cod + " attr_reader :"+i+"\n"
486
+ }
487
+ cod = cod +"end\n"
488
+ eval(cod)
489
+ end
490
+ iv_obj = Hash.new
491
+ iv.each{|i|
492
+ iv_obj[i] = eval("@obj."+i)
493
+ }
494
+ i_name = nil
495
+ self.sniffer.sons.each{|obj_son|
496
+ clazz = self.class.near_class_wrapper(obj_son)
497
+ if clazz != nil
498
+ iv_obj.each{|key, value|
499
+ if value == obj_son
500
+ i_name=key
501
+ end
502
+ }
503
+ if i_name == nil
504
+ clazz.new(self,obj_son)
505
+ else
506
+ clazz.new(self,obj_son){|_self| _self.i_name = i_name}
507
+ end
508
+ end
509
+ }
510
+ end
511
+
512
+ def register(_agobj=self)
513
+ @sons << _agobj if _agobj!=self && _agobj.ag_parent == self
514
+ if @ag_parent
515
+ return @ag_parent.register(_agobj)
516
+ else
517
+ WrapperContract.instance.wrapper_created(WrapperContract::TWrapperObj.new(self,'wrapper'=>_agobj))
518
+ #
519
+ # _tobj = InspectorActionContract::TInspectorActionObj.new(self)
520
+ # _tobj.wrapper = _agobj
521
+ # InspectorActionContract.instance.register(_tobj)
522
+ end
523
+ end
524
+
525
+ def has_sons
526
+ return (self.sons.length > 0)
527
+ end
528
+
529
+ def new_id
530
+ if !defined?(@@ag_id)
531
+ @@ag_id = Hash.new
532
+ end
533
+ if (@@ag_id[self.class]==nil)
534
+ @@ag_id[self.class] = 1
535
+ else
536
+ @@ag_id[self.class] = @@ag_id[self.class] + 1
537
+ end
538
+ return @@ag_id[self.class].to_s
539
+ end
540
+
541
+ def defaults_values
542
+ @@defaults_values
543
+ end
544
+
545
+ def defaults(_new=false)
546
+ if !defined?(@@defaults_values)
547
+ @@defaults_values = Hash.new
548
+ end
549
+ if (!defined?(@@defaults_values[self.class]))||(@@defaults_values[self.class] == nil)
550
+ @@defaults_values[self.class] = Hash.new
551
+ if _new
552
+ _obj = @obj_class.new
553
+ fill_defaults_value_from_agobj(_obj)
554
+ else
555
+ fill_defaults_value_from_agobj
556
+ end
557
+ end
558
+ end
559
+
560
+ def fill_defaults_value_from_agobj(_obj=nil)
561
+ #return if _obj == nil
562
+ _obj_save = @obj
563
+ if _obj
564
+ @obj = _obj
565
+ end
566
+ begin
567
+ @props.each{|_key,_family|
568
+ #Tk.messageBox('message'=>_key)
569
+ if @@defaults_values[self.class][_key] == nil
570
+ @@defaults_values[self.class][_key] = Hash.new
571
+ end
572
+ _family.each_value{|value|
573
+ if (value['name'] != nil) && @@defaults_values[self.class][_key][value['name']] == nil
574
+ if (value['default'] != nil)
575
+ @@defaults_values[self.class][_key][value['name']] = value['default']
576
+ elsif (value['get'] != nil)
577
+ @@defaults_values[self.class][_key][value['name']] = value['get'].call
578
+ end
579
+ end
580
+ }
581
+ }
582
+ ensure
583
+ if _obj
584
+ @obj = _obj_save
585
+ _obj.destroy
586
+ end
587
+ end
588
+
589
+ end
590
+
591
+
592
+ def delete
593
+ _tobj = InspectorContract::TInspectorObj.new(self)
594
+ _tobj.wrapper = self
595
+ InspectorContract.instance.delete_wrapper(_tobj)
596
+ end
597
+
598
+ def AG.class_wrapped
599
+ nil
600
+ end
601
+
602
+ def AG.class_renderer
603
+ AGRenderer
604
+ end
605
+
606
+ def AG.class_sniffer
607
+ AGSniffer
608
+ end
609
+
610
+ def AG.active
611
+ @@active
612
+ end
613
+
614
+
615
+ def getFileName
616
+ __FILE__
617
+ end
618
+
619
+ def AG.publish_property(_name, args = nil)
620
+ # class_eval(%Q[
621
+ # def #{_name}
622
+ # @#{_name}
623
+ # #{args('get').call}
624
+ # end
625
+ #
626
+ # def #{_name}=(value)
627
+ # @#{_name} = value
628
+ # #{args('set').call(value)}
629
+ # end
630
+ # ])
631
+
632
+ end
633
+
634
+
635
+ def new_object
636
+ if self.class.class_wrapped
637
+ @obj = self.class.class_wrapped.new
638
+ end
639
+ end
640
+
641
+ def AG.near_class_wrapped(_obj)
642
+ clazz = _obj.class
643
+ while (ArcadiaLibs.wrapper_class(clazz) == nil)&&(clazz!=nil)
644
+ clazz = clazz.superclass
645
+ end
646
+ return clazz
647
+ end
648
+
649
+ def AG.near_class_wrapper(_obj)
650
+ ArcadiaLibs.wrapper_class(self.near_class_wrapped(_obj))
651
+ end
652
+
653
+
654
+ def passed_object(_obj)
655
+ @obj = _obj
656
+ end
657
+
658
+ def start_properties
659
+ @props.each_value{|family|
660
+ family.each_value{|value|
661
+ if value['start'] != nil
662
+ value['set'].call(value['start'])
663
+ end
664
+ }
665
+ }
666
+ end
667
+
668
+ def retrive_values
669
+ @props.each_value{|family|
670
+ family.each_value{|prop|
671
+ prop['value'] = prop['get'].call
672
+ }
673
+ }
674
+ end
675
+
676
+ def getViewClassName
677
+ return 'V',@i_name
678
+ end
679
+
680
+ def getControlClassName
681
+ return @i_name.capitalize
682
+ end
683
+
684
+ def getInstanceClass
685
+ return @i_name.capitalize
686
+ #return 'C',@i_name
687
+ end
688
+
689
+ def get_path_i_name
690
+ _return = @i_name
691
+ _agstart = self
692
+ while _agstart.ag_parent != nil
693
+ _return = _agstart.ag_parent.i_name,'.',_return
694
+ _agstart = _agstart.ag_parent
695
+ end
696
+ return _return
697
+ end
698
+
699
+ def get_implementation_new(_variable = false)
700
+ if (ag_parent == nil)|| _variable
701
+ result = '@',@i_name,' = ', getInstanceClass ,'.new(', '@',@ag_parent.i_name, ")\n"
702
+ end
703
+ result = result, self.class, '.new(', '@',@ag_parent.i_ag,", @",get_path_i_name,")"
704
+ end
705
+
706
+ def get_implementation_block
707
+ result = result, " @i_name = '", @i_name, "'\n"
708
+ result = result, " @i_ag = '", @i_ag, "'\n"
709
+ result = result, " @obj_class = '", getObjClass, "'\n"
710
+ end
711
+
712
+ def get_implementation_code
713
+ result = result, get_implementation_new, "{\n"
714
+ result = result, get_implementation_block
715
+ @requires.each_key do |key|
716
+ result = result," @object_inspector.addRequire('#{key}')\n"
717
+ end
718
+
719
+ result = result,"}"
720
+ end
721
+
722
+
723
+ def getObjClass
724
+ if defined? @obj_class
725
+ return @obj_class
726
+ else
727
+ return @obj.class
728
+ end
729
+ end
730
+
731
+ def publish_def(_family, args = nil)
732
+ @props_def[_family]=args
733
+ end
734
+
735
+ # def AG.publish_def(_family, args = nil)
736
+ # @@props_def = Hash.new if !defined?(@@props_def)
737
+ # @@props_def[_family]=args
738
+ # end
739
+
740
+
741
+ def publish(_family, args = nil)
742
+ if @props[_family] == nil
743
+ @props[_family] = Hash.new
744
+ end
745
+ @props[_family][args['name']]=args
746
+ args['kind'] != nil ? kind = args['kind']:kind = 'default'
747
+ if @props_kinds[_family] == nil
748
+ @props_kinds[_family] = Hash.new
749
+ end
750
+ if @props_kinds[_family][kind] == nil
751
+ @props_kinds[_family][kind] = Array.new
752
+ end
753
+ @props_kinds[_family][kind] << args['name']
754
+ end
755
+
756
+
757
+
758
+
759
+ # def AG.publish(_family, args = nil)
760
+ # @@props = Hash.new if !defined?(@@props)
761
+ # if @@props[_family] == nil
762
+ # @@props[_family] = Hash.new
763
+ # end
764
+ # @@props[_family][args['name']]=args
765
+ # args['kind'] != nil ? kind = args['kind']:kind = 'default'
766
+ # @@props_kinds = Hash.new if !defined?(@props_kinds)
767
+ # if @@props_kinds[_family] == nil
768
+ # @@props_kinds[_family] = Hash.new
769
+ # end
770
+ # if @@props_kinds[_family][kind] == nil
771
+ # @@props_kinds[_family][kind] = Array.new
772
+ # end
773
+ # @@props_kinds[_family][kind] << args['name']
774
+ # end
775
+
776
+
777
+ def publish_mod(_family, args = nil)
778
+ args.each do |key, value|
779
+ @props[_family][args['name']]["#{key}"] = value
780
+ end
781
+ end
782
+
783
+ # def AG.publish_mod(_family, args = nil)
784
+ # args.each do |key, value|
785
+ # @@props[_family][args['name']]["#{key}"] = value if !defined?(@@props)
786
+ # end
787
+ # end
788
+
789
+
790
+ def publish_del(_family, _name=nil)
791
+ if _name == nil
792
+ @props.delete(_family)
793
+ else
794
+ @props[_family].delete(_name)
795
+ end
796
+ end
797
+
798
+ # def AG.publish_del(_family, _name=nil)
799
+ # if _name == nil
800
+ # @@props.delete(_family)
801
+ # else
802
+ # @@props[_family].delete(_name)
803
+ # end
804
+ # end
805
+
806
+ def properties
807
+ publish( 'property',
808
+ 'name' => 'name',
809
+ 'get'=> proc{@i_name},
810
+ 'set'=> proc{|n| self.i_name = n},
811
+ 'def'=> 'nodef'
812
+ )
813
+ end
814
+
815
+
816
+
817
+ # def delete
818
+ # @obj.destroy
819
+ # end
820
+
821
+ # def setp(_family, _name, _value)
822
+ # @props[_family][_name]['set'].call(_value)
823
+ # tobj = InspectorActionContract::TInspectorActionObj.new(self)
824
+ # tobj.wrapper = self
825
+ # tobj.property_family = _family
826
+ # tobj.property_name = _name
827
+ # tobj.property_value = _value
828
+ # InspectorActionContract.instance.update_property(tobj)
829
+ # end
830
+
831
+ def update_property(_sender, _family,_name,_value)
832
+ old_value = @props[_family][_name]['get'].call(_value)
833
+ if old_value != _value
834
+ @props[_family][_name]['set'].call(_value)
835
+ end
836
+ WrapperContract.instance.property_updated(
837
+ WrapperContract::TWrapperObj.new(self,
838
+ 'wrapper'=>self,
839
+ 'property_name'=> _name,
840
+ 'property_family'=>_family,
841
+ 'property_old_value'=>old_value,
842
+ 'property_new_value'=>_value
843
+ )
844
+ )
845
+ end
846
+
847
+ # def updatep(_family, prop, value, _call_from_inspector=false)
848
+ # @props[_family][prop]['set'].call(value)
849
+ # end
850
+
851
+ end
852
+