arcadia 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +20 -14
- data/conf/arcadia.conf +5 -3
- data/conf/arcadia.init.rb +1 -0
- data/conf/arcadia.res.rb +27 -0
- data/conf/theme-dark.conf +5 -2
- data/ext/ae-dir-projects/ae-dir-projects.rb +8 -2
- data/ext/ae-editor/ae-editor.conf +9 -45
- data/ext/ae-editor/ae-editor.rb +650 -240
- data/ext/ae-editor/langs/coderay.tokens +11 -3
- data/ext/ae-editor/langs/java.lang +1 -1
- data/ext/ae-editor/langs/ruby.lang +1 -1
- data/ext/ae-rad/ae-rad-palette.rb +1 -1
- data/ext/ae-ruby-debug/ae-ruby-debug.rb +13 -5
- data/ext/ae-search-in-files/ae-search-in-files.conf +1 -1
- data/ext/ae-search-in-files/ae-search-in-files.rb +10 -16
- data/ext/ae-search-in-files/ext/ack-in-files/ack-in-files.conf +1 -1
- data/ext/ae-search-in-files/ext/ack-in-files/ack-in-files.rb +7 -12
- data/lib/a-commons.rb +458 -251
- data/lib/a-contracts.rb +25 -10
- data/lib/a-core.rb +185 -77
- data/lib/a-tkcommons.rb +224 -77
- metadata +6 -4
@@ -1,17 +1,23 @@
|
|
1
1
|
#coderay.classes=annotation,attribute_name,attribute_name_fat,attribute_value,attribute_value_fat,bin,char,class,class_variable,color,comment,constant,content,definition,delimiter,directive,doc,doctype,doc_string,entity,error,escape,exception,float,function,global_variable,hex,important,include,inline,inline_delimiter,instance_variable,integer,interpreted,keyword,key,label,local_variable,modifier,oct,operator_fat,pre_constant,pre_type,predefined,preprocessor,pseudo_class,regexp,reserved,shell,string,symbol,tag,tag_fat,tag_special,type,variable,value,xml_text,insert,delete,change,head,
|
2
2
|
|
3
3
|
|
4
|
-
coderay.classes=
|
5
|
-
coderay.hightlight.reserved.foreground=>>>hightlight.reserved.foreground
|
6
|
-
coderay.hightlight.reserved.style=bold
|
4
|
+
coderay.classes=keyword,method,class,char,comment,instance_variable,class_variable,symbol,constant,string,content,integer
|
5
|
+
#coderay.hightlight.reserved.foreground=>>>hightlight.reserved.foreground
|
6
|
+
#coderay.hightlight.reserved.style=bold
|
7
|
+
coderay.hightlight.keyword.foreground=>>>hightlight.reserved.foreground
|
8
|
+
coderay.hightlight.keyword.style=bold
|
7
9
|
coderay.hightlight.method.foreground=>>>hightlight.method.foreground
|
8
10
|
coderay.hightlight.method.style=bold
|
11
|
+
#coderay.hightlight.ident.style=bold
|
12
|
+
#coderay.hightlight.delimiter.style=bold
|
9
13
|
coderay.hightlight.class.foreground=>>>hightlight.class.foreground
|
10
14
|
coderay.hightlight.class.style=bold
|
11
15
|
coderay.hightlight.module_name.foreground=>>>hightlight.class.foreground
|
12
16
|
coderay.hightlight.module_name.style=bold
|
13
17
|
coderay.hightlight.instance_variable.foreground=>>>hightlight.instance_variable.foreground
|
14
18
|
coderay.hightlight.instance_variable.style=bold
|
19
|
+
coderay.hightlight.class_variable.foreground=>>>hightlight.class_variable.foreground
|
20
|
+
coderay.hightlight.class_variable.style=bold
|
15
21
|
coderay.hightlight.constant.foreground=>>>hightlight.constant.foreground
|
16
22
|
coderay.hightlight.constant.style=bold
|
17
23
|
coderay.hightlight.global_variable.foreground=>>>hightlight.global_variable.foreground
|
@@ -39,3 +45,5 @@ coderay.hightlight.directive.style=bold
|
|
39
45
|
coderay.hightlight.type.foreground=>>>hightlight.reserved.foreground
|
40
46
|
coderay.hightlight.type.style=bold
|
41
47
|
coderay.hightlight.operator.style=bold
|
48
|
+
coderay.hightlight.predefined_type.foreground=>>>hightlight.class.foreground
|
49
|
+
coderay.hightlight.exception.foreground=>>>hightlight.exception.foreground
|
@@ -2,4 +2,4 @@ language=java
|
|
2
2
|
exts=java
|
3
3
|
scanner=coderay
|
4
4
|
@include=coderay.tokens
|
5
|
-
coderay.classes=keyword,directive,type,
|
5
|
+
coderay.classes=keyword,directive,type,predefined_type,operator,delimiter,method,class,char,comment,instance_variable,constant,string,content,integer,exception
|
@@ -194,7 +194,7 @@ class WrapperContainer < TkFrame
|
|
194
194
|
@selected_class = nil
|
195
195
|
@selected_require = nil
|
196
196
|
@selected_class_obj = nil
|
197
|
-
Arcadia.instance.layout.domain(Arcadia.instance['conf']['palette.frame'])['root'].
|
197
|
+
Arcadia.instance.layout.domain(Arcadia.instance['conf']['palette.frame'])['root'].top_text_clear
|
198
198
|
end
|
199
199
|
|
200
200
|
def add_palette(_lib_obj)
|
@@ -1570,9 +1570,12 @@ class RubyDebug < ArcadiaExt
|
|
1570
1570
|
|
1571
1571
|
def on_exit_query(_event)
|
1572
1572
|
if @rdc && @rdc.is_alive?
|
1573
|
-
query = (
|
1573
|
+
query = (Arcadia.dialog(self, 'icon' => 'question', 'type' => 'yes_no',
|
1574
1574
|
'title' => '(Arcadia) Debug',
|
1575
1575
|
'message' => "Debug in course, do you want to exit?")=='yes')
|
1576
|
+
# query = (Tk.messageBox('icon' => 'question', 'type' => 'yesno',
|
1577
|
+
# 'title' => '(Arcadia) Debug',
|
1578
|
+
# 'message' => "Debug in course, do you want to exit?")=='yes')
|
1576
1579
|
if query
|
1577
1580
|
debug_quit
|
1578
1581
|
_event.can_exit=true
|
@@ -1657,10 +1660,15 @@ class RubyDebug < ArcadiaExt
|
|
1657
1660
|
if @rdc
|
1658
1661
|
if @rdc.is_alive?
|
1659
1662
|
Thread.new{
|
1660
|
-
|
1661
|
-
|
1662
|
-
|
1663
|
-
|
1663
|
+
Arcadia.dialog(self,
|
1664
|
+
'type'=>'ok',
|
1665
|
+
'title' => "(Arcadia) Debug",
|
1666
|
+
'msg'=>"Debug in course, stop it before exit",
|
1667
|
+
'level'=>'info')
|
1668
|
+
# Tk.messageBox('icon' => 'info',
|
1669
|
+
# 'type' => 'ok',
|
1670
|
+
# 'title' => '(Arcadia) Debug',
|
1671
|
+
# 'message' => "Debug in course, stop it before exit")
|
1664
1672
|
}
|
1665
1673
|
else
|
1666
1674
|
begin
|
@@ -3,20 +3,13 @@
|
|
3
3
|
# by Antonio Galeone <antonio-galeone@rubyforge.org>
|
4
4
|
#
|
5
5
|
|
6
|
-
class
|
6
|
+
class SearchInFiles < ArcadiaExt
|
7
7
|
|
8
8
|
def on_before_build(_event)
|
9
|
-
Arcadia.attach_listener(SearchInFilesListener.new(self),SearchInFilesEvent)
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
class SearchInFilesListener
|
15
|
-
def initialize(_service)
|
16
|
-
@service = _service
|
17
9
|
create_find 'Search in files'
|
10
|
+
Arcadia.attach_listener(self, SearchInFilesEvent)
|
18
11
|
end
|
19
|
-
|
12
|
+
|
20
13
|
def on_before_search_in_files(_event)
|
21
14
|
if _event.what.nil?
|
22
15
|
if _event.dir
|
@@ -32,9 +25,9 @@ class SearchInFilesListener
|
|
32
25
|
|
33
26
|
#def on_after_search_in_files(_event)
|
34
27
|
#end
|
35
|
-
|
28
|
+
|
36
29
|
def create_find title
|
37
|
-
@find = FindFrame.new(
|
30
|
+
@find = FindFrame.new(self.arcadia.layout.root)
|
38
31
|
@find.on_close=proc{@find.hide}
|
39
32
|
@find.hide
|
40
33
|
@find.b_go.bind('1', proc{update_all_combo;do_find}) # add trigger to button
|
@@ -89,9 +82,9 @@ class SearchInFilesListener
|
|
89
82
|
return if @find.e_what.text.strip.length == 0 || @find.e_filter.text.strip.length == 0 || @find.e_dir.text.strip.length == 0
|
90
83
|
@find.hide
|
91
84
|
if !defined?(@search_output)
|
92
|
-
@search_output = SearchOutput.new(
|
85
|
+
@search_output = SearchOutput.new(self)
|
93
86
|
end
|
94
|
-
|
87
|
+
self.frame.show_anyway
|
95
88
|
Thread.new do
|
96
89
|
begin
|
97
90
|
MonitorLastUsedDir.set_last @find.e_dir.text # save it away TODO make it into a message
|
@@ -101,7 +94,7 @@ class SearchInFilesListener
|
|
101
94
|
_files = Dir[_filter]
|
102
95
|
_node = @search_output.new_result(_search_title, _files.length)
|
103
96
|
progress_stop=false
|
104
|
-
progress_bar = TkProgressframe.new(
|
97
|
+
progress_bar = TkProgressframe.new(self.arcadia.layout.root, _files.length)
|
105
98
|
progress_bar.title('Searching')
|
106
99
|
progress_bar.on_cancel=proc{progress_stop=true}
|
107
100
|
#@progress_bar.on_cancel=proc{cancel}
|
@@ -129,7 +122,7 @@ class SearchInFilesListener
|
|
129
122
|
#Arcadia.new_error_msg(self, e.message)
|
130
123
|
ensure
|
131
124
|
progress_bar.destroy if progress_bar
|
132
|
-
|
125
|
+
self.frame.show_anyway
|
133
126
|
end
|
134
127
|
end
|
135
128
|
end
|
@@ -343,6 +336,7 @@ class FindFrame < TkFloatTitledFrame
|
|
343
336
|
super
|
344
337
|
self.focus
|
345
338
|
@e_what.focus
|
339
|
+
@e_what_entry.select_throw
|
346
340
|
@e_what_entry.selection_range(0,'end')
|
347
341
|
end
|
348
342
|
end
|
@@ -3,16 +3,11 @@
|
|
3
3
|
# by Roger D. Pack
|
4
4
|
#
|
5
5
|
|
6
|
-
class
|
7
|
-
def on_before_build(_event)
|
8
|
-
Arcadia.attach_listener(AckInFilesListener.new(self),AckInFilesEvent)
|
9
|
-
end
|
10
|
-
end
|
6
|
+
class AckInFiles < SearchInFiles
|
11
7
|
|
12
|
-
|
13
|
-
def initialize(_service)
|
14
|
-
@service = _service
|
8
|
+
def on_before_build(_event)
|
15
9
|
create_find 'Ack in files'
|
10
|
+
Arcadia.attach_listener(self, AckInFilesEvent)
|
16
11
|
end
|
17
12
|
|
18
13
|
def on_before_ack_in_files(_event)
|
@@ -23,9 +18,9 @@ class AckInFilesListener < SearchInFilesListener
|
|
23
18
|
return if @find.e_what.text.strip.length == 0 || @find.e_filter.text.strip.length == 0 || @find.e_dir.text.strip.length == 0
|
24
19
|
@find.hide
|
25
20
|
if !defined?(@search_output)
|
26
|
-
@search_output = SearchOutput.new(
|
21
|
+
@search_output = SearchOutput.new(self)
|
27
22
|
else
|
28
|
-
|
23
|
+
self.frame.show
|
29
24
|
end
|
30
25
|
begin
|
31
26
|
# unfortunately, it uses regex instead of glob. Oh well.
|
@@ -40,13 +35,13 @@ class AckInFilesListener < SearchInFilesListener
|
|
40
35
|
_filter = @find.e_dir.text+'/**/'+@find.e_filter.text
|
41
36
|
_node = @search_output.new_result(_search_title, '')
|
42
37
|
progress_stop=false
|
43
|
-
@progress_bar = TkProgressframe.new(
|
38
|
+
@progress_bar = TkProgressframe.new(self.arcadia.layout.root, 2)
|
44
39
|
@progress_bar.title('Running')
|
45
40
|
|
46
41
|
answer = `#{command}`
|
47
42
|
answer_lines = answer.split("\n")
|
48
43
|
@progress_bar.destroy # destroy the old one
|
49
|
-
@progress_bar = TkProgressframe.new(
|
44
|
+
@progress_bar = TkProgressframe.new(self.arcadia.layout.root, answer_lines.length)
|
50
45
|
@progress_bar.title('Parsing')
|
51
46
|
@progress_bar.on_cancel=proc{progress_stop=true}
|
52
47
|
|
data/lib/a-commons.rb
CHANGED
@@ -12,45 +12,45 @@ require 'singleton'
|
|
12
12
|
|
13
13
|
|
14
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
|
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
35
|
|
36
36
|
def initialize
|
37
37
|
unless sub.respond_to? :hinner_frame
|
38
|
-
raise NoMethodError, "#{sub} needs to respond to `:hinner_frame'"
|
38
|
+
raise NoMethodError, "#{sub} needs to respond to `:hinner_frame'"
|
39
39
|
end
|
40
40
|
unless sub.respond_to? :title
|
41
|
-
raise NoMethodError, "#{sub} needs to respond to `:title'"
|
41
|
+
raise NoMethodError, "#{sub} needs to respond to `:title'"
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
unless sub.respond_to? :show
|
45
|
-
raise NoMethodError, "#{sub} needs to respond to `:show'"
|
45
|
+
raise NoMethodError, "#{sub} needs to respond to `:show'"
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
unless sub.respond_to? :hide
|
49
|
-
raise NoMethodError, "#{sub} needs to respond to `:hide'"
|
49
|
+
raise NoMethodError, "#{sub} needs to respond to `:hide'"
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
unless sub.respond_to? :free
|
53
|
-
raise NoMethodError, "#{sub} needs to respond to `:free'"
|
53
|
+
raise NoMethodError, "#{sub} needs to respond to `:free'"
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -58,12 +58,12 @@ end
|
|
58
58
|
|
59
59
|
#module AbstractFrameWrapper
|
60
60
|
# def hinner_frame
|
61
|
-
# raise NoMethodError, "#{self} needs to respond to `:hinner_frame'"
|
61
|
+
# raise NoMethodError, "#{self} needs to respond to `:hinner_frame'"
|
62
62
|
# end
|
63
63
|
#end
|
64
64
|
|
65
65
|
class FixedFrameWrapper < AbstractFrameWrapper
|
66
|
-
# include AbstractFrameWrapper
|
66
|
+
# include AbstractFrameWrapper
|
67
67
|
attr_accessor :domain
|
68
68
|
attr_reader :name
|
69
69
|
attr_reader :title
|
@@ -77,27 +77,31 @@ class FixedFrameWrapper < AbstractFrameWrapper
|
|
77
77
|
@index = _index
|
78
78
|
fixed_frame_forge
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
def fixed_frame_forge
|
82
82
|
@fixed_frame = Arcadia.layout.register_panel(self) if @fixed_frame.nil?
|
83
83
|
end
|
84
84
|
private :fixed_frame_forge
|
85
|
-
|
85
|
+
|
86
86
|
def hinner_frame
|
87
87
|
fixed_frame_forge
|
88
88
|
@fixed_frame
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
def root
|
92
92
|
fixed_frame_forge
|
93
|
-
Arcadia.layout.domain(@domain)
|
93
|
+
if Arcadia.layout.domain(@domain)
|
94
|
+
Arcadia.layout.domain(@domain)['root']
|
95
|
+
else
|
96
|
+
Arcadia.layout.domain('nil')['root']
|
97
|
+
end
|
94
98
|
end
|
95
|
-
|
96
|
-
# def top_text(_top_text=nil)
|
97
|
-
# fixed_frame_forge
|
98
|
-
# Arcadia.layout.domain(@domain)['root'].top_text(_top_text)
|
99
|
-
# #@arcadia.layout.domain_for_frame(@domain, @name)['root'].top_text(_title)
|
100
|
-
# end
|
99
|
+
|
100
|
+
# def top_text(_top_text=nil)
|
101
|
+
# fixed_frame_forge
|
102
|
+
# Arcadia.layout.domain(@domain)['root'].top_text(_top_text)
|
103
|
+
# #@arcadia.layout.domain_for_frame(@domain, @name)['root'].top_text(_title)
|
104
|
+
# end
|
101
105
|
|
102
106
|
def show
|
103
107
|
fixed_frame_forge
|
@@ -113,10 +117,10 @@ class FixedFrameWrapper < AbstractFrameWrapper
|
|
113
117
|
Arcadia.layout.register_panel(self, self.hinner_frame)
|
114
118
|
end
|
115
119
|
end
|
116
|
-
|
120
|
+
|
117
121
|
def hide
|
118
122
|
end
|
119
|
-
|
123
|
+
|
120
124
|
def raised?
|
121
125
|
Arcadia.layout.raised?(@domain, @name)
|
122
126
|
end
|
@@ -132,7 +136,7 @@ class FixedFrameWrapper < AbstractFrameWrapper
|
|
132
136
|
def resize
|
133
137
|
Arcadia.layout.domain(@domain)['root'].resize
|
134
138
|
end
|
135
|
-
|
139
|
+
|
136
140
|
def free
|
137
141
|
Arcadia.layout.unregister_panel(self)
|
138
142
|
@fixed_frame = nil
|
@@ -141,7 +145,7 @@ end
|
|
141
145
|
|
142
146
|
|
143
147
|
class FloatFrameWrapper < AbstractFrameWrapper
|
144
|
-
# include AbstractFrameWrapper
|
148
|
+
# include AbstractFrameWrapper
|
145
149
|
def initialize(_arcadia, _geometry=nil, _title=nil)
|
146
150
|
@arcadia = _arcadia
|
147
151
|
@geometry = _geometry
|
@@ -152,27 +156,27 @@ class FloatFrameWrapper < AbstractFrameWrapper
|
|
152
156
|
def float_frame_forge
|
153
157
|
if @obj.nil?
|
154
158
|
a = @geometry.scan(/[+-]*\d\d*%*/)
|
155
|
-
p_height = TkWinfo.screenheight(@arcadia.layout.root)
|
156
|
-
p_width = TkWinfo.screenwidth(@arcadia.layout.root)
|
159
|
+
p_height = TkWinfo.screenheight(@arcadia.layout.root)
|
160
|
+
p_width = TkWinfo.screenwidth(@arcadia.layout.root)
|
157
161
|
if a[0][-1..-1]=='%'
|
158
162
|
n = a[0][0..-2].to_i.abs
|
159
|
-
|
163
|
+
a[0] = (p_width/100*n).to_i
|
160
164
|
end
|
161
165
|
if a[1][-1..-1]=='%'
|
162
166
|
n = a[1][0..-2].to_i.abs
|
163
|
-
|
167
|
+
a[1] = (p_height/100*n).to_i
|
164
168
|
end
|
165
169
|
if a[2][-1..-1]=='%'
|
166
170
|
n = a[2][0..-2].to_i.abs
|
167
|
-
|
171
|
+
a[2] = (p_width/100*n).to_i
|
168
172
|
end
|
169
173
|
if a[3][-1..-1]=='%'
|
170
174
|
n = a[3][0..-2].to_i.abs
|
171
|
-
|
175
|
+
a[3] = (p_height/100*n).to_i
|
172
176
|
end
|
173
|
-
|
177
|
+
|
174
178
|
args = {'width'=>a[0], 'height'=>a[1], 'x'=>a[2], 'y'=>a[3]}
|
175
|
-
@obj = @arcadia.layout.
|
179
|
+
@obj = @arcadia.layout.add_float_frame(args)
|
176
180
|
@obj.title(@title) if @title
|
177
181
|
end
|
178
182
|
end
|
@@ -181,7 +185,7 @@ class FloatFrameWrapper < AbstractFrameWrapper
|
|
181
185
|
float_frame_forge
|
182
186
|
@obj.frame if @obj
|
183
187
|
end
|
184
|
-
|
188
|
+
|
185
189
|
def title(_title=nil)
|
186
190
|
float_frame_forge
|
187
191
|
@obj.title(_title) if @obj
|
@@ -189,16 +193,16 @@ class FloatFrameWrapper < AbstractFrameWrapper
|
|
189
193
|
|
190
194
|
def show
|
191
195
|
float_frame_forge
|
192
|
-
@obj.show if @obj
|
196
|
+
@obj.show if @obj
|
193
197
|
end
|
194
|
-
|
198
|
+
|
195
199
|
def hide
|
196
200
|
float_frame_forge
|
197
|
-
@obj.hide if @obj
|
201
|
+
@obj.hide if @obj
|
198
202
|
end
|
199
|
-
|
203
|
+
|
200
204
|
def free
|
201
|
-
@obj.destroy if @obj
|
205
|
+
@obj.destroy if @obj
|
202
206
|
@obj = nil
|
203
207
|
end
|
204
208
|
end
|
@@ -209,10 +213,6 @@ class ArcadiaExt
|
|
209
213
|
def initialize(_arcadia, _name=nil)
|
210
214
|
@arcadia = _arcadia
|
211
215
|
@arcadia.register(self)
|
212
|
-
Arcadia.attach_listener(self, BuildEvent)
|
213
|
-
Arcadia.attach_listener(self, InitializeEvent)
|
214
|
-
Arcadia.attach_listener(self, ExitQueryEvent)
|
215
|
-
Arcadia.attach_listener(self, FinalizeEvent)
|
216
216
|
@name = _name
|
217
217
|
@frames = Array.new
|
218
218
|
@frames_points = conf_array("#{_name}.frames")
|
@@ -221,39 +221,74 @@ class ArcadiaExt
|
|
221
221
|
@float_frames = Array.new
|
222
222
|
@float_geometries = conf_array("#{_name}.float_frames")
|
223
223
|
@float_labels = conf_array("#{_name}.float_labels")
|
224
|
+
Arcadia.attach_listener(self, BuildEvent)
|
225
|
+
Arcadia.attach_listener(self, InitializeEvent)
|
226
|
+
Arcadia.attach_listener(self, ExitQueryEvent)
|
227
|
+
Arcadia.attach_listener(self, FinalizeEvent)
|
224
228
|
#ObjectSpace.define_finalizer(self, self.method(:finalize).to_proc)
|
225
229
|
end
|
226
|
-
|
227
|
-
|
230
|
+
|
231
|
+
|
228
232
|
def conf_array(_name)
|
229
233
|
res = []
|
230
234
|
value = @arcadia['conf'][_name]
|
231
235
|
res.concat(value.split(',')) if value
|
232
236
|
res
|
233
237
|
end
|
234
|
-
|
238
|
+
|
239
|
+
def array_conf(_name, _array)
|
240
|
+
value = ''
|
241
|
+
_array.each{|e|
|
242
|
+
if value.length > 0
|
243
|
+
value = "#{value},#{e}"
|
244
|
+
else
|
245
|
+
value = "#{e}"
|
246
|
+
end
|
247
|
+
}
|
248
|
+
@arcadia['conf'][_name]=value
|
249
|
+
value
|
250
|
+
end
|
251
|
+
|
252
|
+
def add_to_conf_property(_name, _value)
|
253
|
+
a = conf_array(_name)
|
254
|
+
if !a.include?(_value)
|
255
|
+
a << _value
|
256
|
+
array_conf(_name,a)
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
def del_from_conf_property(_name, _value)
|
261
|
+
a = conf_array(_name)
|
262
|
+
a.delete(_value)
|
263
|
+
array_conf(_name,a)
|
264
|
+
end
|
265
|
+
|
235
266
|
def frame_def_visible?(_n=0)
|
236
267
|
@arcadia.layout.domains.include?(@frames_points[_n])
|
237
268
|
#@frames_points[_n] != '-1.-1'
|
238
269
|
end
|
239
|
-
|
270
|
+
|
240
271
|
def frame_visible?(_n=0)
|
241
272
|
@frames[_n] != nil && @frames[_n].hinner_frame && TkWinfo.mapped?(@frames[_n].hinner_frame)
|
242
273
|
end
|
243
|
-
|
274
|
+
|
244
275
|
def frame(_n=0,create_if_not_exist=true)
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
276
|
+
if @frames_points[_n].nil?
|
277
|
+
@frames_points[_n] = '0.0'
|
278
|
+
Arcadia['conf']["#{@name}.frames"]+=',0.0'
|
279
|
+
end
|
280
|
+
if @frames[_n] == nil && @frames_points[_n] && create_if_not_exist
|
281
|
+
(@frames_labels[_n].nil?)? _label = @name : _label = @frames_labels[_n]
|
282
|
+
(@frames_names[_n].nil?)? _name = @name : _name = @frames_names[_n]
|
283
|
+
@frames[_n] = FixedFrameWrapper.new(self, @frames_points[_n], _name, _label, _n)
|
284
|
+
end
|
250
285
|
return @frames[_n]
|
251
286
|
end
|
252
|
-
|
287
|
+
|
253
288
|
def frame_domain(_n=0)
|
254
289
|
if conf('frames')
|
255
|
-
|
256
|
-
else
|
290
|
+
frs = conf('frames').split(',')
|
291
|
+
else
|
257
292
|
frs = Array.new
|
258
293
|
end
|
259
294
|
ret = nil
|
@@ -265,8 +300,8 @@ class ArcadiaExt
|
|
265
300
|
|
266
301
|
def frame_domain_default(_n=0)
|
267
302
|
if conf_default('frames')
|
268
|
-
|
269
|
-
else
|
303
|
+
frs = conf_default('frames').split(',')
|
304
|
+
else
|
270
305
|
frs = Array.new
|
271
306
|
end
|
272
307
|
ret = nil
|
@@ -277,19 +312,19 @@ class ArcadiaExt
|
|
277
312
|
end
|
278
313
|
|
279
314
|
def float_frame(_n=0, _args=nil)
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
315
|
+
if @float_frames[_n].nil?
|
316
|
+
(@float_labels[_n].nil?)? _label = @name : _label = @float_labels[_n]
|
317
|
+
@float_frames[_n] = FloatFrameWrapper.new(@arcadia, @float_geometries[_n], _label)
|
318
|
+
end
|
319
|
+
@float_frames[_n]
|
285
320
|
end
|
286
321
|
|
287
322
|
def conf(_property)
|
288
|
-
|
323
|
+
@arcadia['conf'][@name+'.'+_property]
|
289
324
|
end
|
290
325
|
|
291
326
|
def conf_default(_property)
|
292
|
-
|
327
|
+
@arcadia['conf_without_local'][@name+'.'+_property]
|
293
328
|
end
|
294
329
|
|
295
330
|
def restore_default_conf(_property)
|
@@ -297,17 +332,17 @@ class ArcadiaExt
|
|
297
332
|
@arcadia['conf'][@name+'.'+_property] = @arcadia['conf_without_local'][@name+'.'+_property]
|
298
333
|
end
|
299
334
|
end
|
300
|
-
|
301
|
-
# def conf_global(_property)
|
302
|
-
# @arcadia['conf'][_property]
|
303
|
-
# end
|
304
|
-
|
335
|
+
|
336
|
+
# def conf_global(_property)
|
337
|
+
# @arcadia['conf'][_property]
|
338
|
+
# end
|
339
|
+
|
305
340
|
def exec(_method, _args=nil)
|
306
341
|
if self.respond_to(_method)
|
307
342
|
self.send(_method, _args)
|
308
343
|
end
|
309
344
|
end
|
310
|
-
|
345
|
+
|
311
346
|
def maximized?(_n=0)
|
312
347
|
ret= false
|
313
348
|
ret=@frames[_n].maximized? if @frames[_n]
|
@@ -317,23 +352,164 @@ class ArcadiaExt
|
|
317
352
|
def maximize(_n=0)
|
318
353
|
@frames[_n].maximize if @frames[_n]
|
319
354
|
end
|
320
|
-
|
355
|
+
|
321
356
|
def resize(_n=0)
|
322
357
|
@frames[_n].resize if @frames[_n]
|
323
358
|
end
|
324
359
|
end
|
325
360
|
|
361
|
+
class ArcadiaExtPlus < ArcadiaExt
|
362
|
+
attr_reader :index
|
363
|
+
|
364
|
+
def initialize(_arcadia, _name=nil)
|
365
|
+
@@instances = {} if !defined?(@@instances)
|
366
|
+
@@main_instance = {} if !defined?(@@main_instance)
|
367
|
+
@@active_instance = {} if !defined?(@@active_instance)
|
368
|
+
@@instances[self.class] = [] if @@instances[self.class] == nil
|
369
|
+
@@instances[self.class] << self
|
370
|
+
@@main_instance[self.class] = self if @@main_instance[self.class] == nil
|
371
|
+
Arcadia.attach_listener(self, ActivateInstanceEvent)
|
372
|
+
super(_arcadia, _name)
|
373
|
+
if self.frame != nil
|
374
|
+
self.frame.hinner_frame.bind_append("Enter", proc{activate})
|
375
|
+
if @@main_instance[self.class] == self
|
376
|
+
frame.root.add_state_button(
|
377
|
+
self.name,
|
378
|
+
'Duplicate',
|
379
|
+
proc{duplicate},
|
380
|
+
PLUS_EX_GIF,
|
381
|
+
'left')
|
382
|
+
activate(self, false)
|
383
|
+
else
|
384
|
+
frame.root.add_state_button(
|
385
|
+
self.name,
|
386
|
+
'Destroy',
|
387
|
+
proc{deduplicate},
|
388
|
+
MINUS_EX_GIF,
|
389
|
+
'left')
|
390
|
+
activate(self, false)
|
391
|
+
end
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
def ArcadiaExtPlus.instances(_class)
|
396
|
+
@@instances[_class]
|
397
|
+
end
|
398
|
+
|
399
|
+
def active_instance
|
400
|
+
@@active_instance[self.class]
|
401
|
+
end
|
402
|
+
|
403
|
+
def main_instance
|
404
|
+
@@main_instance[self.class]
|
405
|
+
end
|
406
|
+
|
407
|
+
def activate(_obj=self, _raise_event=true)
|
408
|
+
@@active_instance[self.class] = _obj
|
409
|
+
@@active_instance[self.class].frame.root.shift_on if @@active_instance[self.class].frame != nil
|
410
|
+
instances.each{|i|
|
411
|
+
i.frame.root.shift_off if i != @@active_instance[self.class] && i.frame != nil && i.frame.root != @@active_instance[self.class].frame.root
|
412
|
+
}
|
413
|
+
ActivateInstanceEvent.new(Arcadia.instance, 'name'=>self.name).go! if _raise_event
|
414
|
+
end
|
415
|
+
|
416
|
+
def activate_main
|
417
|
+
activate(@@main_instance[self.class])
|
418
|
+
end
|
419
|
+
|
420
|
+
def active?
|
421
|
+
@@active_instance[self.class] == self
|
422
|
+
end
|
423
|
+
|
424
|
+
def instances
|
425
|
+
@@instances[self.class]
|
426
|
+
end
|
427
|
+
|
428
|
+
def instance_index
|
429
|
+
instances.index(self)
|
430
|
+
end
|
431
|
+
|
432
|
+
def new_name
|
433
|
+
#"#{main_instance.name}#{instances.length}"
|
434
|
+
name = main_instance.name
|
435
|
+
i=0
|
436
|
+
while exist_name?(name)
|
437
|
+
i+=1
|
438
|
+
name = "#{main_instance.name}#{i}"
|
439
|
+
end
|
440
|
+
name
|
441
|
+
end
|
442
|
+
|
443
|
+
def exist_name?(_name)
|
444
|
+
exist = false
|
445
|
+
instances.each{|i|
|
446
|
+
exist = exist || i.name == _name
|
447
|
+
break if exist
|
448
|
+
}
|
449
|
+
exist
|
450
|
+
end
|
451
|
+
|
452
|
+
def duplicate(_name=new_name)
|
453
|
+
#create conf properties
|
454
|
+
Arcadia.conf_group_copy(@@main_instance[self.class].name, _name)
|
455
|
+
instance = clone(_name)
|
456
|
+
#initialize
|
457
|
+
Arcadia.process_event(InitializeEvent.new(Arcadia.instance), [instance])
|
458
|
+
add_to_conf_property("#{main_instance.name}.clones", _name)
|
459
|
+
end
|
460
|
+
|
461
|
+
def clone(_name)
|
462
|
+
#create
|
463
|
+
instance = self.class.new(Arcadia.instance, _name)
|
464
|
+
#build
|
465
|
+
Arcadia.process_event(BuildEvent.new(Arcadia.instance), [instance])
|
466
|
+
Arcadia.attach_listener(instance, ClearCacheInstanceEvent)
|
467
|
+
Arcadia.attach_listener(instance, DestroyInstanceEvent)
|
468
|
+
instance
|
469
|
+
end
|
470
|
+
|
471
|
+
def on_destroy_instance(_event)
|
472
|
+
Arcadia.detach_listener(self)
|
473
|
+
@arcadia.unregister(self)
|
474
|
+
@frames.each{|f| f.free }
|
475
|
+
end
|
476
|
+
|
477
|
+
# def on_before_layout_raising_frame(_event)
|
478
|
+
# if _event.extension_name == @name
|
479
|
+
# activate
|
480
|
+
# end
|
481
|
+
# end
|
482
|
+
|
483
|
+
def deduplicate
|
484
|
+
if (Arcadia.dialog(self, 'type'=>'yes_no',
|
485
|
+
'msg'=>"Shure delete '#{@name}'?",
|
486
|
+
'title' => "(Arcadia) Delete #{@name}",
|
487
|
+
'level' => 'question')=='yes')
|
488
|
+
exit_query_event = Arcadia.process_event(ExitQueryEvent.new(self, 'can_exit'=>true))
|
489
|
+
if exit_query_event.can_exit
|
490
|
+
activate_main
|
491
|
+
@@instances[self.class].delete(self) if @@instances[self.class]
|
492
|
+
Arcadia.del_conf_group(Arcadia['conf'],@name)
|
493
|
+
Arcadia.del_conf_group(Arcadia['pers'],@name)
|
494
|
+
del_from_conf_property("#{main_instance.name}.clones", @name)
|
495
|
+
Arcadia.process_event(ClearCacheInstanceEvent.new(Arcadia.instance), [self])
|
496
|
+
Arcadia.process_event(DestroyInstanceEvent.new(Arcadia.instance), [self])
|
497
|
+
end
|
498
|
+
end
|
499
|
+
end
|
500
|
+
|
501
|
+
end
|
326
502
|
|
327
503
|
class ObserverCallback
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
504
|
+
def initialize(_publisher, _subscriber, _method_update_to_call=:update)
|
505
|
+
@publisher = _publisher
|
506
|
+
@subscriber = _subscriber
|
507
|
+
@method=_method_update_to_call
|
508
|
+
@publisher.add_observer(self)
|
509
|
+
end
|
510
|
+
def update(*args)
|
511
|
+
@subscriber.send(@method,*args)
|
512
|
+
end
|
337
513
|
end
|
338
514
|
|
339
515
|
# +------------------------------------------+
|
@@ -346,7 +522,7 @@ class Event
|
|
346
522
|
attr_reader :time
|
347
523
|
def initialize(_sender, _args=nil)
|
348
524
|
@sender = _sender
|
349
|
-
if _args
|
525
|
+
if _args
|
350
526
|
_args.each do |key, value|
|
351
527
|
self.send(key+'=', value)
|
352
528
|
end
|
@@ -363,7 +539,7 @@ class Event
|
|
363
539
|
@breaked = false
|
364
540
|
@sender = _sender
|
365
541
|
@channel = '0'
|
366
|
-
if _args
|
542
|
+
if _args
|
367
543
|
_args.each do |key, value|
|
368
544
|
#self.send(key, value)
|
369
545
|
self.send(key.to_s+'=', value) if self.respond_to?(key.to_s)
|
@@ -372,11 +548,11 @@ class Event
|
|
372
548
|
@time = Time.new
|
373
549
|
@results = Array.new
|
374
550
|
end
|
375
|
-
|
551
|
+
|
376
552
|
def add_finalize_callback(_proc)
|
377
|
-
ObjectSpace.define_finalizer(self, _proc)
|
553
|
+
ObjectSpace.define_finalizer(self, _proc)
|
378
554
|
end
|
379
|
-
|
555
|
+
|
380
556
|
def add_result(_sender, _args=nil)
|
381
557
|
if self.class::Result
|
382
558
|
res = self.class::Result.new(_sender, _args)
|
@@ -386,39 +562,64 @@ class Event
|
|
386
562
|
@results << res
|
387
563
|
res
|
388
564
|
end
|
389
|
-
|
565
|
+
|
390
566
|
def is_breaked?
|
391
567
|
@breaked
|
392
568
|
end
|
393
|
-
|
569
|
+
|
394
570
|
def break
|
395
571
|
@breaked = true
|
396
572
|
end
|
397
|
-
|
573
|
+
|
398
574
|
end
|
399
575
|
|
400
576
|
module EventBus #(or SourceEvent)
|
401
|
-
def process_event(_event)
|
577
|
+
def process_event(_event, _listeners=nil)
|
578
|
+
# _listener rapresent a filter on @@listeners if != nil
|
402
579
|
return _event if !defined?(@@listeners)
|
403
580
|
event_classes = _event_class_stack(_event.class)
|
404
581
|
#before fase
|
405
582
|
event_classes.each do |_c|
|
406
|
-
|
583
|
+
if _listeners.nil?
|
584
|
+
_process_fase(_c, _event, @@listeners[_c], 'before')
|
585
|
+
else
|
586
|
+
listeners_to_process = []
|
587
|
+
_listeners.each{|lis|
|
588
|
+
listeners_to_process << lis if @@listeners[_c] && @@listeners[_c].include?(lis)
|
589
|
+
}
|
590
|
+
_process_fase(_c, _event, listeners_to_process, 'before')
|
591
|
+
end
|
407
592
|
break if _event.is_breaked? # not responding to this means "you need to pass in an instance, not a class name
|
408
593
|
end unless _event.is_breaked?
|
409
594
|
# fase
|
410
595
|
event_classes.each do |_c|
|
411
|
-
|
596
|
+
if _listeners.nil?
|
597
|
+
_process_fase(_c, _event, @@listeners[_c])
|
598
|
+
else
|
599
|
+
listeners_to_process = []
|
600
|
+
_listeners.each{|lis|
|
601
|
+
listeners_to_process << lis if @@listeners[_c] && @@listeners[_c].include?(lis)
|
602
|
+
}
|
603
|
+
_process_fase(_c, _event, listeners_to_process)
|
604
|
+
end
|
412
605
|
break if _event.is_breaked?
|
413
606
|
end unless _event.is_breaked?
|
414
607
|
#after fase
|
415
608
|
event_classes.each do |_c|
|
416
|
-
|
609
|
+
if _listeners.nil?
|
610
|
+
_process_fase(_c, _event, @@listeners[_c], 'after')
|
611
|
+
else
|
612
|
+
listeners_to_process = []
|
613
|
+
_listeners.each{|lis|
|
614
|
+
listeners_to_process << lis if @@listeners[_c] && @@listeners[_c].include?(lis)
|
615
|
+
}
|
616
|
+
_process_fase(_c, _event, listeners_to_process, 'after')
|
617
|
+
end
|
417
618
|
break if _event.is_breaked?
|
418
619
|
end unless _event.is_breaked?
|
419
620
|
_event
|
420
621
|
end
|
421
|
-
|
622
|
+
|
422
623
|
def broadcast_event(_event)
|
423
624
|
return _event if !defined?(@@listeners)
|
424
625
|
event_classes = _event_class_stack(_event.class)
|
@@ -426,47 +627,45 @@ module EventBus #(or SourceEvent)
|
|
426
627
|
_broadcast_fase(_c, _event)
|
427
628
|
end
|
428
629
|
end
|
429
|
-
|
630
|
+
|
430
631
|
def _event_class_stack(_class)
|
431
632
|
#p "------> chiamato _event_class_stack for class #{_class}"
|
432
633
|
res = Array.new
|
433
634
|
cur_class = _class
|
434
635
|
while cur_class != Object
|
435
|
-
|
436
|
-
|
437
|
-
|
636
|
+
#p "#{cur_class} son on #{cur_class.superclass}"
|
637
|
+
res << cur_class
|
638
|
+
cur_class = cur_class.superclass
|
438
639
|
end
|
439
640
|
return res
|
440
641
|
end
|
441
642
|
private :_event_class_stack
|
442
|
-
|
443
|
-
def _process_fase(_class, _event, _fase_name = nil)
|
444
|
-
|
445
|
-
return if @@listeners[_class].nil?
|
643
|
+
|
644
|
+
def _process_fase(_class, _event, _listeners=nil, _fase_name = nil)
|
645
|
+
return if _listeners.nil?
|
446
646
|
_fase_name.nil?? suf = '':suf = _fase_name
|
447
|
-
#method_name = 'on_'+suf+_class.to_s.downcase.gsub('event','')
|
448
647
|
method_name = _method_name(_class, suf)
|
449
|
-
#p _method_name(_event, suf)+' == '+method_name
|
450
|
-
#p method_name
|
451
648
|
if _class != _event.class
|
452
|
-
#sub_method_name = 'on_'+suf+_event.class.to_s.downcase.gsub('event','')
|
453
649
|
sub_method_name = _method_name(_event.class, suf)
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
650
|
+
_listeners.each do|_listener|
|
651
|
+
next if _listener.kind_of?(ArcadiaExtPlus) && !(_listener.active? || _class == ArcadiaSysEvent || _class.superclass == ArcadiaSysEvent || _event.class.kind_of?(ArcadiaSysEvent))
|
652
|
+
if _listener.respond_to?(sub_method_name)
|
653
|
+
_listener.send(sub_method_name, _event)
|
654
|
+
elsif _listener.respond_to?(method_name)
|
655
|
+
_listener.send(method_name, _event)
|
656
|
+
end
|
657
|
+
break if _event.is_breaked?
|
461
658
|
end
|
462
659
|
else
|
463
|
-
|
660
|
+
_listeners.each do|_listener|
|
661
|
+
next if _listener.kind_of?(ArcadiaExtPlus) && !(_listener.active? || (_event.kind_of?(ArcadiaSysEvent)))
|
464
662
|
_listener.send(method_name, _event) if _listener.respond_to?(method_name)
|
465
663
|
break if _event.is_breaked?
|
466
664
|
end
|
467
665
|
end
|
468
666
|
end
|
469
667
|
private :_process_fase
|
668
|
+
|
470
669
|
def _method_name(_class, _suf='')
|
471
670
|
_str = _class.to_s
|
472
671
|
_pre = _str[0..1]
|
@@ -482,9 +681,9 @@ module EventBus #(or SourceEvent)
|
|
482
681
|
sub_method_name = _method_name(_event.class)
|
483
682
|
@@listeners[_class].each do|_listener|
|
484
683
|
if _listener.respond_to?(sub_method_name)
|
485
|
-
|
684
|
+
Thread.new{_listener.send(sub_method_name, _event)}
|
486
685
|
elsif _listener.respond_to?(method_name)
|
487
|
-
|
686
|
+
Thread.new{_listener.send(method_name, _event)}
|
488
687
|
end
|
489
688
|
end
|
490
689
|
else
|
@@ -497,12 +696,19 @@ module EventBus #(or SourceEvent)
|
|
497
696
|
end
|
498
697
|
private :_broadcast_fase
|
499
698
|
|
500
|
-
def detach_listener(_listener, _class_event)
|
501
|
-
if
|
502
|
-
@@listeners[_class_event]
|
699
|
+
def detach_listener(_listener, _class_event=nil)
|
700
|
+
if _class_event != nil
|
701
|
+
if @@listeners[_class_event]
|
702
|
+
@@listeners[_class_event].delete(_listener)
|
703
|
+
end
|
704
|
+
else
|
705
|
+
#delete all the issues of listenere
|
706
|
+
@@listeners.each{|klass, header|
|
707
|
+
header.delete(_listener)
|
708
|
+
}
|
503
709
|
end
|
504
710
|
end
|
505
|
-
|
711
|
+
|
506
712
|
def attach_listener(_listener, _class_event)
|
507
713
|
@@listeners = {} unless defined? @@listeners
|
508
714
|
@@listeners[_class_event] = [] unless @@listeners.has_key?(_class_event)
|
@@ -514,7 +720,7 @@ end
|
|
514
720
|
|
515
721
|
module Cacheble
|
516
722
|
def self.extended(_obj)
|
517
|
-
_obj.__initialize_cache(_obj)
|
723
|
+
_obj.__initialize_cache(_obj)
|
518
724
|
end
|
519
725
|
|
520
726
|
def self.included(_obj)
|
@@ -524,15 +730,15 @@ module Cacheble
|
|
524
730
|
def __initialize_cache(_obj)
|
525
731
|
@@cache = Hash.new
|
526
732
|
end
|
527
|
-
|
733
|
+
|
528
734
|
def self.clear_cache
|
529
735
|
@@cache.clear
|
530
736
|
end
|
531
|
-
|
737
|
+
|
532
738
|
def self.set_cache(_key, _value)
|
533
739
|
@@cache[_key]=_value
|
534
740
|
end
|
535
|
-
|
741
|
+
|
536
742
|
def self.get_cache(_key, _value)
|
537
743
|
@@cache[_key]
|
538
744
|
end
|
@@ -569,12 +775,12 @@ module Configurable
|
|
569
775
|
_line = ''
|
570
776
|
end
|
571
777
|
end
|
572
|
-
|
778
|
+
|
573
779
|
var = _line.split('=')
|
574
780
|
if var.length > 1
|
575
781
|
_value = var[1].strip
|
576
782
|
var[2..-1].collect{|x| _value=_value+'='+x} if var.length > 2
|
577
|
-
if _link_hash
|
783
|
+
if _link_hash
|
578
784
|
_value = resolve_value(_value, _link_hash)
|
579
785
|
end
|
580
786
|
r_hash[var[0].strip]=_value
|
@@ -584,18 +790,18 @@ module Configurable
|
|
584
790
|
ensure
|
585
791
|
f.close unless f.nil?
|
586
792
|
end
|
587
|
-
return r_hash
|
793
|
+
return r_hash
|
588
794
|
else
|
589
795
|
puts 'warning--file does not exist', _property_file
|
590
796
|
end
|
591
797
|
end
|
592
|
-
|
593
|
-
# def one_line_format_as_hash(_line)
|
594
|
-
# ret = Hash.new
|
595
|
-
# end
|
596
|
-
#
|
597
|
-
# def hash_as_one_line_format(_name, _hash)
|
598
|
-
# end
|
798
|
+
|
799
|
+
# def one_line_format_as_hash(_line)
|
800
|
+
# ret = Hash.new
|
801
|
+
# end
|
802
|
+
#
|
803
|
+
# def hash_as_one_line_format(_name, _hash)
|
804
|
+
# end
|
599
805
|
|
600
806
|
def Configurable.properties_group(_group, _hash_source, _hash_suff='conf', _refresh=false)
|
601
807
|
group_key="#{_hash_suff}.#{_group}"
|
@@ -615,21 +821,21 @@ module Configurable
|
|
615
821
|
end
|
616
822
|
|
617
823
|
def resolve_value(_value, _hash_source)
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
824
|
+
if _value.length > 0
|
825
|
+
_v, _vadd = _value.split(ADD_SYMBOL)
|
826
|
+
else
|
827
|
+
_v = _value
|
828
|
+
end
|
829
|
+
if _v.length > 3 && _v[0..2]==LINK_SYMBOL
|
830
|
+
_v=_hash_source[_v[3..-1]] if _hash_source[_v[3..-1]]
|
831
|
+
_v=_v+_vadd if _vadd
|
832
|
+
end
|
833
|
+
return _v
|
628
834
|
end
|
629
|
-
|
835
|
+
|
630
836
|
def resolve_properties_link(_hash_target, _hash_source)
|
631
837
|
loop_level_max = 10
|
632
|
-
# _hash_adding = Hash.new
|
838
|
+
# _hash_adding = Hash.new
|
633
839
|
_keys_to_extend = Array.new
|
634
840
|
_hash_target.each{|k,value|
|
635
841
|
loop_level = 0
|
@@ -638,9 +844,9 @@ module Configurable
|
|
638
844
|
else
|
639
845
|
v= value
|
640
846
|
end
|
641
|
-
# p "value=#{value} class=#{value.class}"
|
642
|
-
# p "v=#{v} class=#{v.class}"
|
643
|
-
# p "vadd=#{vadd}"
|
847
|
+
# p "value=#{value} class=#{value.class}"
|
848
|
+
# p "v=#{v} class=#{v.class}"
|
849
|
+
# p "vadd=#{vadd}"
|
644
850
|
while loop_level < loop_level_max && v.length > 3 && v[0..2]==LINK_SYMBOL
|
645
851
|
if k[-1..-1]=='.'
|
646
852
|
_keys_to_extend << k
|
@@ -667,15 +873,15 @@ module Configurable
|
|
667
873
|
_hash_target.delete(k)
|
668
874
|
end
|
669
875
|
end
|
670
|
-
|
876
|
+
|
671
877
|
def make_value(_self_context=self, _value='')
|
672
878
|
value = _value.strip
|
673
879
|
if value[0..0]=='!'
|
674
|
-
value=_self_context.instance_eval(value[1..-1])
|
880
|
+
value=_self_context.instance_eval(value[1..-1])
|
675
881
|
end
|
676
882
|
value
|
677
883
|
end
|
678
|
-
|
884
|
+
|
679
885
|
end
|
680
886
|
|
681
887
|
module Persistable
|
@@ -702,7 +908,7 @@ module Persistable
|
|
702
908
|
begin
|
703
909
|
if f
|
704
910
|
if _persistent_key
|
705
|
-
|
911
|
+
f.syswrite(_persistent_key+'='+_persistent_value+"\n")
|
706
912
|
end
|
707
913
|
end
|
708
914
|
ensure
|
@@ -710,7 +916,7 @@ module Persistable
|
|
710
916
|
end
|
711
917
|
end
|
712
918
|
end
|
713
|
-
|
919
|
+
|
714
920
|
end
|
715
921
|
|
716
922
|
class Application
|
@@ -718,10 +924,10 @@ class Application
|
|
718
924
|
include Configurable
|
719
925
|
include Persistable
|
720
926
|
ApplicationParams = Struct.new( "ApplicationParams",
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
927
|
+
:name,
|
928
|
+
:version,
|
929
|
+
:config_file,
|
930
|
+
:persistent_file
|
725
931
|
)
|
726
932
|
|
727
933
|
def initialize(_ap=ApplicationParams.new)
|
@@ -742,47 +948,48 @@ class Application
|
|
742
948
|
publish('pers', properties_file2hash(self['applicationParams'].persistent_file)) if self['applicationParams'].persistent_file
|
743
949
|
yield(self) if block_given?
|
744
950
|
end
|
745
|
-
|
951
|
+
|
746
952
|
def Application.instance
|
747
953
|
@@instance
|
748
954
|
end
|
749
955
|
|
750
956
|
def Application.conf(_property)
|
751
|
-
|
957
|
+
@@instance['conf'][_property] if @@instance
|
752
958
|
end
|
753
959
|
|
754
960
|
def conf(_property)
|
755
|
-
|
961
|
+
self['conf'][_property]
|
756
962
|
end
|
757
|
-
|
963
|
+
|
758
964
|
def Application.sys_info
|
759
965
|
"[Platform = #{RUBY_PLATFORM}]\n[Ruby version = #{RUBY_VERSION}]"
|
760
966
|
end
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
if @@conf_groups
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
967
|
+
|
968
|
+
|
969
|
+
# def Application.conf_group(_group, _suff = 'conf')
|
970
|
+
# group_key="#{_suff}.#{_group}"
|
971
|
+
# @@conf_groups = Hash.new if !defined?(@@conf_groups)
|
972
|
+
# if @@conf_groups[group_key].nil?
|
973
|
+
# @@conf_groups[group_key] = Hash.new
|
974
|
+
# glen=_group.length
|
975
|
+
# @@instance['conf'].keys.sort.each{|k|
|
976
|
+
# if k[0..glen] == "#{_group}."
|
977
|
+
# @@conf_groups[group_key][k[glen+1..-1]]=@@instance['conf'][k]
|
978
|
+
# elsif @@conf_groups[group_key].length > 0
|
979
|
+
# break
|
980
|
+
# end
|
981
|
+
# }
|
982
|
+
# end
|
983
|
+
# @@conf_groups[_group]
|
984
|
+
# end
|
778
985
|
|
779
986
|
def Application.del_conf_group(_conf_hash, _group)
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
|
987
|
+
glen=_group.length
|
988
|
+
_conf_hash.keys.sort.each{|k|
|
989
|
+
if k[0..glen] == "#{_group}."
|
990
|
+
_conf_hash.delete(k)
|
991
|
+
end
|
992
|
+
}
|
786
993
|
end
|
787
994
|
|
788
995
|
def Application.del_conf(_k)
|
@@ -804,60 +1011,60 @@ class Application
|
|
804
1011
|
def local_file_config
|
805
1012
|
File.join(local_dir, File.basename(self['applicationParams'].config_file))
|
806
1013
|
end
|
807
|
-
|
1014
|
+
|
808
1015
|
def update_local_config
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
end
|
1016
|
+
# local_dir is ~/arcadia
|
1017
|
+
if FileTest.exist?(local_file_config)
|
1018
|
+
if FileTest.writable?(local_dir)
|
1019
|
+
f = File.new(local_file_config, "w")
|
1020
|
+
begin
|
1021
|
+
if f
|
1022
|
+
properties = self['conf']
|
1023
|
+
if properties
|
1024
|
+
properties.keys.sort.each{|key|
|
1025
|
+
if self['conf_without_local'][key] == self['conf'][key] || (self['origin_conf'][key] && self['origin_conf'][key].include?('>>>')) # || self['local_conf'][key].nil?
|
1026
|
+
f.syswrite("# #{key}=#{self['origin_conf'][key]}\n") # write it as a comment since it isn't a real change
|
1027
|
+
elsif self['conf'][key]
|
1028
|
+
f.syswrite("#{key}=#{self['conf'][key]}\n")
|
1029
|
+
end
|
1030
|
+
}
|
825
1031
|
end
|
826
|
-
ensure
|
827
|
-
f.close unless f.nil?
|
828
1032
|
end
|
1033
|
+
ensure
|
1034
|
+
f.close unless f.nil?
|
829
1035
|
end
|
830
1036
|
end
|
1037
|
+
end
|
831
1038
|
end
|
832
|
-
|
1039
|
+
|
833
1040
|
# this method load config file from local directory for personalizations
|
834
1041
|
def load_local_config(_create_if_not_exist=true)
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
end
|
1042
|
+
if FileTest.exist?(local_file_config)
|
1043
|
+
self['local_conf']= self.properties_file2hash(local_file_config)
|
1044
|
+
self['conf'].update(self['local_conf'])
|
1045
|
+
elsif _create_if_not_exist
|
1046
|
+
if FileTest.writable?(local_dir)
|
1047
|
+
f = File.new(local_file_config, "w")
|
1048
|
+
begin
|
1049
|
+
if f
|
1050
|
+
p = self['conf']
|
1051
|
+
if p
|
1052
|
+
p.keys.sort.each{|key|
|
1053
|
+
f.syswrite('#'+key+'='+self['conf'][key]+"\n")
|
1054
|
+
}
|
849
1055
|
end
|
850
|
-
ensure
|
851
|
-
f.close unless f.nil?
|
852
1056
|
end
|
853
|
-
|
854
|
-
|
855
|
-
Arcadia.dialog(self, 'type'=>'ok','title' => '(Arcadia)', 'msg' => msg, 'level'=>'error')
|
856
|
-
exit
|
1057
|
+
ensure
|
1058
|
+
f.close unless f.nil?
|
857
1059
|
end
|
1060
|
+
else
|
1061
|
+
msg = "Locad dir "+'"'+local_dir+'"'+" must be writable!"
|
1062
|
+
Arcadia.dialog(self, 'type'=>'ok','title' => '(Arcadia)', 'msg' => msg, 'level'=>'error')
|
1063
|
+
exit
|
858
1064
|
end
|
1065
|
+
end
|
859
1066
|
end
|
860
|
-
|
1067
|
+
|
861
1068
|
def load_theme(_name=nil)
|
862
1069
|
_theme_file = "conf/theme-#{_name}.conf" if !_name.nil?
|
863
1070
|
if _theme_file && File.exist?(_theme_file)
|
@@ -868,13 +1075,13 @@ class Application
|
|
868
1075
|
if _theme_res_file && File.exist?(_theme_res_file)
|
869
1076
|
begin
|
870
1077
|
require _theme_res_file
|
871
|
-
rescue Exception => e
|
1078
|
+
rescue Exception => e
|
872
1079
|
end
|
873
1080
|
|
874
1081
|
end
|
875
|
-
end
|
1082
|
+
end
|
876
1083
|
end
|
877
|
-
|
1084
|
+
|
878
1085
|
def local_dir
|
879
1086
|
home = File.expand_path '~'
|
880
1087
|
_local_dir = File.join(home,'.'+self['applicationParams'].name) if home
|
@@ -910,9 +1117,9 @@ class Application
|
|
910
1117
|
|
911
1118
|
def []=(_name, _value)
|
912
1119
|
@objs[_name] = _value
|
913
|
-
# if @objs[_name]
|
914
|
-
# @objs[_name] = _value
|
915
|
-
# end
|
1120
|
+
# if @objs[_name]
|
1121
|
+
# @objs[_name] = _value
|
1122
|
+
# end
|
916
1123
|
end
|
917
1124
|
|
918
1125
|
|