rsence-pre 3.0.0.8 → 3.0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/client/conf/client_pkg.yaml +6 -2
  4. data/client/js/comm/queue/queue.js +32 -44
  5. data/client/js/comm/transporter/transporter.js +24 -16
  6. data/client/js/comm/values/values.js +27 -15
  7. data/client/js/controls/button/button.coffee +14 -5
  8. data/client/js/controls/button/themes/default/button.css +4 -2
  9. data/client/js/controls/checkbox/checkbox.js +4 -4
  10. data/client/js/controls/dialogs/sheet/sheet.js +11 -11
  11. data/client/js/controls/dialogs/sheet/themes/default/sheet.html +1 -1
  12. data/client/js/controls/imageview/imageview.js +15 -15
  13. data/client/js/controls/numerictextcontrol/numerictextcontrol.coffee +32 -10
  14. data/client/js/controls/onoffbutton/onoffbutton.coffee +5 -5
  15. data/client/js/controls/progress/progressbar/progressbar.js +6 -7
  16. data/client/js/controls/progress/progressbar/themes/default/progressbar.css +4 -4
  17. data/client/js/controls/progress/progressbar/themes/default/progressbar.html +1 -2
  18. data/client/js/controls/sliders/slider/slider.js +74 -79
  19. data/client/js/controls/stepper/stepper.js +31 -31
  20. data/client/js/controls/stringview/stringview.js +20 -8
  21. data/client/js/controls/tab/tab.js +57 -63
  22. data/client/js/controls/tab/themes/default/tab.html +4 -1
  23. data/client/js/controls/textcontrol/textcontrol.coffee +13 -3
  24. data/client/js/controls/validatorview/validatorview.js +4 -4
  25. data/client/js/controls/window/window.js +43 -56
  26. data/client/js/core/class/class.js +25 -23
  27. data/client/js/core/elem/elem.coffee +8 -1
  28. data/client/js/core/rsence_ns/rsence_ns.coffee +6 -2
  29. data/client/js/core/util/util_methods/util_methods.coffee +57 -15
  30. data/client/js/datetime/calendar/calendar.coffee +196 -199
  31. data/client/js/datetime/calendar/themes/default/calendar.css +81 -159
  32. data/client/js/datetime/calendar/themes/default/calendar.html +9 -18
  33. data/client/js/datetime/datepicker/datepicker.coffee +18 -3
  34. data/client/js/datetime/datetimepicker/datetimepicker.coffee +6 -1
  35. data/client/js/datetime/datetimevalue/datetimevalue.coffee +194 -0
  36. data/client/js/datetime/momentjs/momentjs.js +310 -76
  37. data/client/js/datetime/timepicker/timepicker.coffee +6 -1
  38. data/client/js/datetime/timesheet/timesheet.js +59 -61
  39. data/client/js/foundation/control/control.js +45 -44
  40. data/client/js/foundation/control/controldefaults/controldefaults.js +13 -9
  41. data/client/js/foundation/control/dyncontrol/dyncontrol.js +45 -57
  42. data/client/js/foundation/control/eventresponder/eventresponder.js +97 -97
  43. data/client/js/foundation/control/valuematrix/valuematrix.js +13 -13
  44. data/client/js/foundation/eventmanager/eventmanager.coffee +50 -32
  45. data/client/js/foundation/geom/rect/rect.js +43 -32
  46. data/client/js/foundation/locale_settings/locale_settings.js +36 -25
  47. data/client/js/foundation/system/system.js +79 -67
  48. data/client/js/foundation/thememanager/thememanager.coffee +11 -1
  49. data/client/js/foundation/value/pullvalue/pullvalue.coffee +7 -0
  50. data/client/js/foundation/value/pushvalue/pushvalue.coffee +25 -0
  51. data/client/js/foundation/value/value.js +22 -15
  52. data/client/js/foundation/view/view.js +94 -55
  53. data/client/js/foundation/view/viewdefaults/viewdefaults.js +5 -1
  54. data/client/js/lists/listitems/listitems.js +26 -4
  55. data/client/js/menus/combobox/combobox.coffee +55 -0
  56. data/client/js/menus/minimenu/minimenu.js +61 -30
  57. data/client/js/menus/minimenu/themes/default/minimenu.css +1 -6
  58. data/client/js/menus/minimenu/themes/default/minimenu.html +5 -4
  59. data/client/js/menus/minimenuitem/minimenuitem.js +6 -6
  60. data/client/js/menus/popupmenu/themes/default/popupmenu.css +1 -6
  61. data/client/js/menus/popupmenu/themes/default/popupmenu.html +5 -4
  62. data/client/js/tables/table/table.coffee +109 -64
  63. data/client/js/tables/table/themes/default/table.css +4 -0
  64. data/lib/rsence/msg.rb +64 -64
  65. data/lib/rsence/plugins/plugin.rb +68 -52
  66. data/lib/rsence/session/sequel_sessionstorage.rb +5 -5
  67. data/lib/rsence/value.rb +79 -59
  68. data/plugins/client_pkg/lib/client_pkg_build.rb +5 -1
  69. data/plugins/client_pkg/lib/client_pkg_serve.rb +40 -32
  70. data/plugins/main/js/main.js +46 -28
  71. metadata +6 -8
  72. data/client/js/datetime/calendar/themes/default/calendar_arrows.png +0 -0
  73. data/client/js/datetime/calendar/themes/default/calendar_bg.png +0 -0
  74. data/client/js/datetime/calendar/themes/default/calendar_parts1.png +0 -0
  75. data/client/js/datetime/calendar/themes/default/calendar_parts2.png +0 -0
  76. data/client/js/datetime/datetimepicker/datetimepicker.js +0 -210
  77. data/client/js/datetime/datetimevalue/datetimevalue.js +0 -265
data/lib/rsence/value.rb CHANGED
@@ -5,98 +5,102 @@ module RSence
5
5
  # HValue is the model for client-server synchronized values.
6
6
  # A value contains its payload {#data} and enough meta-data to define its behavior.
7
7
  class HValue
8
-
8
+
9
9
  # The validity of the data. Defaults to false, when the data comes from the client.
10
10
  # @return [Boolean] True, when set by the server. False when initially set by the client. Also false, unless all responders return true.
11
11
  attr_reader :is_valid
12
-
12
+
13
13
  # @private Is true when changed by the server. Causes the ValueManager to send its client-side representation.
14
14
  attr_reader :sync
15
-
15
+
16
16
  # @private The unique ID of the value.
17
17
  attr_reader :value_id
18
18
  alias val_id value_id
19
-
19
+
20
20
  # The payload data. Use {#set} to change.
21
21
  attr_reader :data
22
-
22
+
23
23
  # @private List of responders
24
24
  attr_reader :members
25
-
25
+
26
26
  # @private
27
27
  attr_writer :is_valid
28
-
28
+
29
29
  # @private
30
30
  def value_id=(new_id)
31
31
  @value_id = new_id
32
32
  end
33
33
  # @private
34
34
  alias val_id= value_id=
35
-
35
+
36
36
  alias valid is_valid
37
37
  alias valid? is_valid
38
-
38
+
39
39
  # @private Method for binding the value to the session data.
40
40
  def add( msg )
41
-
41
+
42
42
  # get the value storage from the session data
43
43
  session_values = msg.session[:values][:by_id]
44
-
44
+
45
45
  ## Store the object here
46
46
  session_values[ @value_id ] = self
47
-
47
+
48
48
  ## Sends the client-side description
49
49
  restore( msg )
50
-
50
+
51
51
  ## Set the valid flag, so we know that the value is initially in sync
52
52
  @is_valid = true
53
53
  end
54
-
54
+
55
55
  # @private (Re-)Send the client-size representation
56
56
  def restore( msg )
57
-
57
+
58
58
  ## Tags itself as a new value from the client's point of view
59
59
  @is_new_to_client = true
60
-
60
+
61
61
  add_to_sync( msg )
62
-
62
+
63
63
  end
64
-
64
+
65
65
  # Value meta-data. The third constructor parameter
66
66
  attr_accessor :meta
67
-
67
+
68
68
  # Creates a new client-server automatically synchronized data wrapper object.
69
69
  # @param [Message] msg Just pass on the +msg+ from the scope you call from.
70
70
  # @param [#to_json] data Any data that can be converted to JSON.
71
71
  # @param [Hash] meta Has no effect yet.
72
- def initialize( msg, data, meta = { :name => nil } )
73
-
72
+ def initialize( msg, data, meta = { :name => nil, :type => 0 } )
73
+
74
74
  ## Get an unique integer id for the value
75
75
  if RSence.args[:debug] and meta[:name] and not msg.valuemanager.id_exists?( msg, meta[:name] )
76
76
  @value_id = meta[:name]
77
77
  else
78
78
  @value_id = msg.valuemanager.ses_unique_id( msg )
79
79
  end
80
-
80
+
81
81
  @meta = meta
82
-
82
+
83
+ if meta[:type] == 2
84
+ @buffer = []
85
+ end
86
+
83
87
  ## set the data of the hvalue
84
88
  set( msg, data, true )
85
-
89
+
86
90
  ## the @sync flag is raised, when the client data is older than the server data
87
91
  @sync = false
88
-
92
+
89
93
  ## the @is_valid flag is lowered, when the client data is newer than the server data
90
94
  @is_valid = true
91
-
95
+
92
96
  ## Bind the value to the value manager and report it to the client
93
97
  add( msg )
94
-
98
+
95
99
  ## storage for validator bindings
96
100
  @members = {}
97
-
101
+
98
102
  end
99
-
103
+
100
104
  # Binds the value to a responder. The responder is an instance of {Plugins::Plugin__ Plugin} or {Plugins::GUIPlugin__ GUIPlugin}.
101
105
  # Responders are called once, when the client requests the data to be changed.
102
106
  # Responders must return +true+, if they accept the change. Otherwise the data is treated as invalid.
@@ -112,7 +116,7 @@ module RSence
112
116
  @members[plugin_name].push( method_name ) unless @members[plugin_name].include?( method_name )
113
117
  return true
114
118
  end
115
-
119
+
116
120
  # Checks, if the plugin_name and method_name pairing is already bound with the bind method. Returns true or false.
117
121
  def bound?( plugin_name, method_name )
118
122
  plugin_name = plugin_name.to_sym unless plugin_name.class == Symbol
@@ -120,7 +124,7 @@ module RSence
120
124
  return false unless @members.has_key?(plugin_name)
121
125
  return @members[plugin_name].include?(method_name)
122
126
  end
123
-
127
+
124
128
  # Releases the responder of the value, both params as in bind, but optional +method_name+ can be omitted, matching all methods bound to the +plugin_name+.
125
129
  # @param [Symbol] plugin_name The name of the plugin acting as a responder to the value.
126
130
  # @param [Symbol] method_name The name of the method of the plugin acting as a responder to the value.
@@ -132,7 +136,7 @@ module RSence
132
136
  return false unless @members.has_key?( plugin_name )
133
137
  if not method_name
134
138
  @members.delete( plugin_name )
135
- else
139
+ else
136
140
  @members[plugin_name].slice!(@members[plugin_name].index( method_name )) if @members[plugin_name].include?(method_name)
137
141
  if @members[plugin_name].empty?
138
142
  @members.delete( plugin_name )
@@ -140,23 +144,32 @@ module RSence
140
144
  end
141
145
  return true
142
146
  end
143
-
147
+
144
148
  # Releases all responders.
145
149
  # @return [true]
146
150
  def release_all
147
151
  @members = {}
148
152
  return true
149
153
  end
150
-
154
+
151
155
  # @deprecated Use {#release} as the opposite to bind.
152
156
  alias unbind release
153
-
157
+
154
158
  # @private Tell all bound instances that the value is changed.
155
159
  def tell( msg )
156
160
  invalid_count = 0
157
161
  @members.each_key do |plugin_name|
158
162
  @members[plugin_name].each do |method_name|
159
- invalid_count += 1 unless msg.plugins.run_plugin( plugin_name, method_name, msg, self )
163
+ if @meta[:type] == 1
164
+ data = @data
165
+ for item in data
166
+ @data = item
167
+ msg.plugins.run_plugin( plugin_name, method_name, msg, self )
168
+ end
169
+ @data = data
170
+ else
171
+ invalid_count += 1 unless msg.plugins.run_plugin( plugin_name, method_name, msg, self )
172
+ end
160
173
  end
161
174
  end
162
175
  if invalid_count == 0
@@ -164,29 +177,29 @@ module RSence
164
177
  msg.session[:values][:check].delete( @value_id )
165
178
  end
166
179
  end
167
-
180
+
168
181
  # @private Handle updates from the client.
169
182
  def from_client( msg, data )
170
183
  # only process changes, if different from the one already stored.
171
184
  if @data != data
172
-
185
+
173
186
  # puts "data sync from client: #{@data.inspect} -> #{data.inspect} (#{@meta[:name]})"
174
187
 
175
188
  ## set takes care of the setting..
176
189
  @data = data
177
-
190
+
178
191
  ## change the valid state, because the value was set by the client!
179
192
  @is_valid = false
180
-
193
+
181
194
  ## add the id to the values to be checked
182
195
  check_ids = msg.session[:values][:check]
183
196
  unless check_ids.include?( @value_id )
184
197
  check_ids.push( @value_id )
185
198
  end
186
199
  end
187
-
200
+
188
201
  end
189
-
202
+
190
203
  # @private Adds the value to the sync array.
191
204
  def add_to_sync( msg )
192
205
  ## add the id to the values to be synchronized (to client)
@@ -195,68 +208,75 @@ module RSence
195
208
  sync_ids.push( @value_id )
196
209
  end
197
210
  end
198
-
211
+
199
212
  # Sets the data of the value, the change will be synced with the client.
200
213
  # @param [Message] msg The {Message} instance.
201
214
  # @param [#to_json] data Any data that can be mapped to JSON and handled by the client.
202
215
  # @param [Boolean] dont_tell_client Doesn't notify the client about the change, if true.
203
216
  def set( msg, data, dont_tell_client=false )
204
-
217
+
205
218
  @data = data
206
-
219
+
207
220
  # won't tell the client about the change, usually not needed
208
221
  unless dont_tell_client
222
+ @buffer.push( data ) if @meta[:type] == 2
209
223
  ## update the flags
210
224
  @sync = false
211
225
  @is_valid = true
212
-
226
+
213
227
  add_to_sync( msg )
214
228
  end
215
229
  end
216
-
230
+
217
231
  # Sets the key of the hash data of the value, the change will be synced with the client.
218
232
  # @param [Message] msg The {Message} instance.
219
233
  # @param [String] key The key of data to change
220
234
  # @param [#to_json] data Any data that can be mapped to JSON and handled by the client.
221
235
  # @param [Boolean] dont_tell_client Doesn't notify the client about the change, if true.
222
236
  def set_key( msg, key, data, dont_tell_client=false )
223
-
237
+
224
238
  @data[key] = data
225
-
239
+
226
240
  # won't tell the client about the change, usually not needed
227
241
  unless dont_tell_client
228
242
  ## update the flags
229
243
  @sync = false
230
244
  @is_valid = true
231
-
245
+
232
246
  add_to_sync( msg )
233
247
  end
234
248
  end
235
-
249
+
236
250
  # @private Tell the client that the value changed.
237
251
  def to_client( msg )
252
+ if @meta[:type] == 2
253
+ data = @buffer.clone
254
+ @buffer = []
255
+ else
256
+ data = @data
257
+ end
238
258
  if @is_new_to_client
239
259
  ## Initialize a new client value
240
- msg.reply_value( :new, @value_id, @data )
260
+ msg.reply_value( :new, @value_id, data, @meta[:type] )
241
261
  @is_new_to_client = false
242
262
  else
243
263
  ## Sets the client value
244
- msg.reply_value( :set, @value_id, @data )
264
+ msg.reply_value( :set, @value_id, data )
245
265
  end
246
266
  end
247
-
267
+
248
268
  # Destructor method. If msg is supplied, deletes the client representation too.
249
269
  # @param [false, Message] A {Message} instance. When supplied, deletes the client representation.
250
270
  def die!( msg=false )
251
-
271
+
252
272
  release_all
253
-
273
+
254
274
  # get the value storage from the session data
255
275
  session_values = msg.session[:values][:by_id]
256
-
276
+
257
277
  ## Store the object here
258
278
  session_values.delete( @value_id )
259
-
279
+
260
280
  if msg and not @is_new_to_client
261
281
  msg.reply_value( :del, @value_id )
262
282
  end
@@ -266,7 +286,7 @@ module RSence
266
286
  def inspect
267
287
  "#<RSence::HValue value_id:#{@value_id.inspect}, valid: #{@is_valid.inspect}, sync: #{@sync.inspect}, is_new_to_client: #{@is_new_to_client.inspect}, meta: #{@meta.inspect[0..100]}, data: #{@data.inspect[0..100]} ...>"
268
288
  end
269
-
289
+
270
290
  end
271
291
 
272
292
  end
@@ -107,7 +107,11 @@ class ClientPkgBuild
107
107
  tmpl.gsub!( HEIGHT_RE, ']H[')
108
108
  tmpl.gsub!( TMPL_RE ) do
109
109
  ( js_type, js_code ) = [ $1, $2 ]
110
- js_code = CoffeeScript.compile( js_code, :bare => true ) if js_code.start_with?('#!coffee')
110
+ begin
111
+ js_code = CoffeeScript.compile( js_code, :bare => true ) if js_code.start_with?('#!coffee')
112
+ rescue ExecJS::RuntimeError
113
+ js_code = "console.log('Invalid coffee in template #{theme_name}/#{component_name}:',#{js_code.to_json})"
114
+ end
111
115
  if cached_idx.has_key?( js_code )
112
116
  seq_id = cached_idx[ js_code ]
113
117
  else
@@ -3,27 +3,27 @@ module ClientPkgServe
3
3
  def broker_urls
4
4
  ::RSence.config[:broker_urls]
5
5
  end
6
-
6
+
7
7
  def match( uri, request_type )
8
8
  uri.match( /^#{broker_urls[:h]}/ )
9
9
  end
10
-
10
+
11
11
  # Helper method to return the time formatted according to the HTTP RFC
12
12
  def httime(time)
13
13
  return time.gmtime.strftime('%a, %d %b %Y %H:%M:%S %Z')
14
14
  end
15
-
15
+
16
16
  def build_busy_wait
17
17
  while @build_busy
18
18
  puts "-- build not finished, waiting.. --"
19
19
  sleep 0.4
20
20
  end
21
21
  end
22
-
22
+
23
23
  def set_headers( response )
24
24
  # Sets the response date header to the current time:
25
25
  response['Date'] = httime( Time.now )
26
-
26
+
27
27
  # Controls caching with headers based on the configuration
28
28
  if ::RSence.config[:cache_maximize]
29
29
  response['Expires'] = httime(Time.now+::RSence.config[:cache_expire])
@@ -31,7 +31,7 @@ module ClientPkgServe
31
31
  response['Cache-Control'] = 'no-cache'
32
32
  end
33
33
  end
34
-
34
+
35
35
  def check_ua( request )
36
36
  support_gzip = (request.header.has_key?('Accept-Encoding') and request.header['Accept-Encoding'].include?('gzip'))
37
37
  support_gzip = false if ::RSence.config[:no_gzip]
@@ -51,27 +51,27 @@ module ClientPkgServe
51
51
  :version => version
52
52
  }
53
53
  end
54
-
54
+
55
55
  def support_gzip?( ua )
56
56
  doesnt_support = (ua[:safari] and ua[:version] < 533)
57
57
  return ( not doesnt_support )
58
58
  end
59
-
59
+
60
60
  def serve_js( request, response, request_path, ua )
61
61
  # the file-specific identifier ('core', 'basic' etc)
62
62
  req_file = request_path[3][0..-4]
63
-
63
+
64
64
  if not @client_cache.js_cache.has_key?( req_file )
65
65
  response.status = 404
66
66
  response.body = '/* 404 - Not Found */'
67
67
  else
68
-
68
+
69
69
  response.status = 200
70
70
  response['Content-Type'] = 'text/javascript; charset=utf-8'
71
-
71
+
72
72
  # these browsers have issues with gzipped js content
73
73
  support_gzip = support_gzip?( ua )
74
-
74
+
75
75
  if support_gzip
76
76
  #response['Transfer-Encoding'] = 'chunked,gzip'
77
77
  response['Last-Modified'] = @client_cache.last_modified
@@ -80,39 +80,39 @@ module ClientPkgServe
80
80
  response['Content-Encoding'] = 'gzip'
81
81
  response.body = body
82
82
  else
83
-
83
+
84
84
  response['Last-Modified'] = @client_cache.last_modified
85
85
  body = @client_cache.js_cache[ req_file ]
86
86
  response['Content-Length'] = body.bytesize.to_s
87
87
  response.body = body
88
-
88
+
89
89
  end
90
90
  end
91
91
  end
92
-
92
+
93
93
  def serve_theme( request, response, request_path, ua )
94
94
  # Get the name of the theme
95
95
  theme_name = request_path[3]
96
-
96
+
97
97
  # Get the theme resource type (html/css/gfx)
98
98
  theme_part = request_path[4].to_sym
99
-
99
+
100
100
  # Get the theme resource identifier
101
101
  req_file = request_path[5]
102
-
102
+
103
103
  # checks for theme name
104
104
  has_theme = @client_cache.theme_cache.has_key?( theme_name )
105
-
105
+
106
106
  # checks for theme part (css/html/gfx)
107
107
  if theme_part == :css or theme_part == :html
108
108
  has_theme_part = false
109
109
  else
110
110
  has_theme_part = ( has_theme and @client_cache.theme_cache[theme_name].has_key?(theme_part) )
111
111
  end
112
-
112
+
113
113
  # checks for theme file
114
114
  has_theme_file = ( has_theme_part and @client_cache.theme_cache[theme_name][theme_part].has_key?( req_file ) )
115
-
115
+
116
116
  if not has_theme
117
117
  response.status = 404
118
118
  response.body = '404 - Theme Not Found'
@@ -143,30 +143,38 @@ module ClientPkgServe
143
143
  response.body = body
144
144
  end
145
145
  end
146
-
146
+
147
147
  ## Responds to get-requests
148
148
  def get( request, response, session )
149
-
150
- build_busy_wait
151
-
149
+
150
+ if @build_busy
151
+ puts "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} -- Client build busy."
152
+ response['Retry-After'] = '1'
153
+ response['Content-Type'] = 'text/plain'
154
+ response['Refresh'] = "1; #{env['REQUEST_URI']}"
155
+ response['Content-Length'] = '0'
156
+ response.body = ''
157
+ response.status = 503
158
+ end
159
+
152
160
  ua = check_ua( request )
153
-
161
+
154
162
  set_headers( response )
155
-
163
+
156
164
  ## Split path into an array for determining what to serve
157
165
  request_uri = '/'+request.path.match( /^#{::RSence.config[:broker_urls][:h]}(.*)$/ )[1]
158
-
166
+
159
167
  request_path = request_uri.split( '/' )
160
-
168
+
161
169
  ## Requested type of client resource (js/themes)
162
170
  req_type = request_path[2]
163
-
171
+
164
172
  unless ['js','themes'].include? req_type
165
173
  req_rev = req_type
166
174
  req_type = request_path[3]
167
175
  request_path.delete_at(2)
168
176
  end
169
-
177
+
170
178
  ## Serve compiled client javascript component files:
171
179
  if req_type == 'js'
172
180
  serve_js( request, response, request_path, ua )
@@ -174,7 +182,7 @@ module ClientPkgServe
174
182
  elsif req_type == 'themes'
175
183
  serve_theme( request, response, request_path, ua )
176
184
  end
177
-
185
+
178
186
  end
179
187
  end
180
188
 
@@ -1,39 +1,35 @@
1
1
  // List of apps initialized utilizing GUITrees, by GUIPlugin name
2
2
  RSence.apps = { };
3
3
 
4
- // Subview that utilizes GUITrees
5
- RSence.GUIView = HControl.extend({
6
-
7
- });
8
-
9
4
  // Application that handles GUITrees, populates its values dynamically
10
5
  RSence.GUIApp = HApplication.extend({
11
6
  constructor: function(_options){
12
-
7
+
13
8
  var
9
+ i = 0,
14
10
  _this = this,
15
-
11
+
16
12
  // Application priority
17
13
  _priority = _options.priority?_options.priority:100,
18
-
14
+
19
15
  // Application label / title
20
16
  _label = _options.label?_options.label:'Untitled Application',
21
-
17
+
22
18
  // Application description (multiline)
23
19
  _descr = _options.descr?_options.descr:'No Description',
24
-
20
+
25
21
  // Allow multiple instances?
26
22
  _allowMulti = _options.allowMulti?_options.allowMulti:false,
27
-
23
+
28
24
  // The GUI Tree
29
25
  _valueObj = _options.valueObj?_options.valueObj:false,
30
-
26
+
31
27
  // Signal input (from server to client)
32
- _sigInput = _options.sigInput?COMM.Values.values[_options.sigInput]:false,
33
-
28
+ _sigInput = _options.sigInput?_this.getValueById(_options.sigInput):false,
29
+
34
30
  // Signal output (from client to server)
35
- _sigOutput = _options.sigOutput?COMM.Values.values[_options.sigOutput]:false,
36
-
31
+ _sigOutput = _options.sigOutput?_this.getValueById(_options.sigOutput):false,
32
+
37
33
  // Icon image url.
38
34
  // Minimum size is 16x16 and multiple sizes are stacked on top of each other,
39
35
  // largest topmost, smaller versions aligned left below in size order.
@@ -48,10 +44,10 @@ RSence.GUIApp = HApplication.extend({
48
44
  // 512x896 -> 512x512, 256x256 and 128x128
49
45
  // etc..
50
46
  _iconUrl = _options.iconUrl?COMM.Values.values[_options.iconUrl]:false;
51
-
47
+
52
48
  // Construct the application base:
53
49
  _this.base( _priority, _label );
54
-
50
+
55
51
  // Options combined from vars above
56
52
  _this.options = HClass.extend(_options).extend({
57
53
  label: _label,
@@ -61,17 +57,39 @@ RSence.GUIApp = HApplication.extend({
61
57
  sigOutput: _sigOutput,
62
58
  icon: { url: _iconUrl, width: null, height: null },
63
59
  pid: this.appId,
60
+ elemId: 0,
64
61
  views: []
65
62
  }).nu();
66
-
67
- _this.valueObj = _valueObj;
68
- _this.value = _valueObj.value;
69
-
63
+ this.elemId = _this.options.elemId;
64
+
65
+ if( _options.values ){
66
+ _this.valueIds = _options.values;
67
+ _this.values = {};
68
+ for( i in _options.values ){
69
+ _this.values = _this.getValueById(i);
70
+ }
71
+ }
72
+
73
+ if( _options.localized ){
74
+ _this.localized = _options.localized;
75
+ }
76
+
77
+ if( _options.strings ){
78
+ _this.strings = _options.strings;
79
+ }
80
+
81
+ if(_valueObj){
82
+ _this.valueObj.bind(_this);
83
+ }
84
+ else {
85
+ _this.value = _options.value;
86
+ }
87
+
70
88
  // _this.app = _this;
71
-
72
- //
89
+
90
+ //
73
91
  // _this.renderer = COMM.JSONRenderer.extend({
74
- //
92
+ //
75
93
  // }).nu( _this.value, _this );
76
94
  _this.drawSubviews();
77
95
  if( _this.options.subviews ){
@@ -82,11 +100,11 @@ RSence.GUIApp = HApplication.extend({
82
100
  drawSubviews: function(){
83
101
 
84
102
  },
85
-
103
+
86
104
  die: function(){
87
105
  this.base();
88
-
106
+
89
107
  }
90
-
108
+
91
109
  });
92
110