ruby_mvc 0.0.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/LICENSE +19 -0
- data/README.md +69 -0
- data/lib/ruby_mvc.rb +33 -0
- data/lib/ruby_mvc/application.rb +53 -0
- data/lib/ruby_mvc/controllers/app_controller.rb +93 -0
- data/lib/ruby_mvc/controllers/rails_controller.rb +71 -0
- data/lib/ruby_mvc/models.rb +28 -0
- data/lib/ruby_mvc/models/array_table_model.rb +59 -0
- data/lib/ruby_mvc/models/keyed_array_table_model.rb +83 -0
- data/lib/ruby_mvc/models/table_model.rb +42 -0
- data/lib/ruby_mvc/module.rb +35 -0
- data/lib/ruby_mvc/renderers.rb +26 -0
- data/lib/ruby_mvc/renderers/html4_table_model_renderer.rb +100 -0
- data/lib/ruby_mvc/toolkit.rb +31 -0
- data/lib/ruby_mvc/toolkit/app.rb +32 -0
- data/lib/ruby_mvc/toolkit/dialog.rb +31 -0
- data/lib/ruby_mvc/toolkit/frame.rb +34 -0
- data/lib/ruby_mvc/toolkit/notification.rb +202 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby.rb +31 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/app.rb +44 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/box_layout.rb +48 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/common.rb +72 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/frame.rb +49 -0
- data/lib/ruby_mvc/toolkit/peers/wxruby/web_view.rb +87 -0
- data/lib/ruby_mvc/toolkit/web_view.rb +60 -0
- data/lib/ruby_mvc/toolkit/widget.rb +108 -0
- data/lib/ruby_mvc/views.rb +85 -0
- data/lib/ruby_mvc/views/ar_model_editor.rb +84 -0
- data/lib/ruby_mvc/views/ar_type_editor.rb +65 -0
- data/lib/ruby_mvc/views/ar_type_list.rb +45 -0
- data/lib/ruby_mvc/views/table_view.rb +96 -0
- data/lib/ruby_mvc/views/web_view.rb +65 -0
- data/lib/ruby_mvc/wx.rb +26 -0
- data/ruby_mvc.gemspec +37 -0
- data/sample/frame.rb +28 -0
- data/sample/mvc.rb +29 -0
- data/sample/test.html +118 -0
- data/sample/web_view.rb +34 -0
- data/test/unit/models/test_array_table_model.rb +56 -0
- data/test/unit/models/test_keyed_array_table_model.rb +54 -0
- data/test/unit/test_array_table_model.rb +38 -0
- metadata +107 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
#--
|
2
|
+
######################################################################
|
3
|
+
#
|
4
|
+
# Copyright 2011 Andrew S. Townley
|
5
|
+
#
|
6
|
+
# Permission to use, copy, modify, and disribute this software for
|
7
|
+
# any purpose with or without fee is hereby granted, provided that
|
8
|
+
# the above copyright notices and this permission notice appear in
|
9
|
+
# all copies.
|
10
|
+
#
|
11
|
+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
|
12
|
+
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
13
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
14
|
+
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
|
15
|
+
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
16
|
+
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
17
|
+
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
18
|
+
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
19
|
+
#
|
20
|
+
# File: table_model.rb
|
21
|
+
# Created: Sat 19 Nov 2011 18:13:40 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module ShoesMVC
|
27
|
+
module Models
|
28
|
+
|
29
|
+
# This class defines the behavior of a base TableModel API
|
30
|
+
# that is used by the TableView class. The model represents
|
31
|
+
# an ordered set of data rows which are "square" in that
|
32
|
+
# they are expected to all have the same number of columns.
|
33
|
+
#
|
34
|
+
# Logically, each of the elements in the table model is a
|
35
|
+
# row instance that provides keyed property access to the
|
36
|
+
# data in the model based on the [] method.
|
37
|
+
|
38
|
+
class TableModel
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#--
|
2
|
+
######################################################################
|
3
|
+
#
|
4
|
+
# Copyright 2011 Andrew S. Townley
|
5
|
+
#
|
6
|
+
# Permission to use, copy, modify, and disribute this software for
|
7
|
+
# any purpose with or without fee is hereby granted, provided that
|
8
|
+
# the above copyright notices and this permission notice appear in
|
9
|
+
# all copies.
|
10
|
+
#
|
11
|
+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
|
12
|
+
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
13
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
14
|
+
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
|
15
|
+
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
16
|
+
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
17
|
+
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
18
|
+
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
19
|
+
#
|
20
|
+
# File: module.rb
|
21
|
+
# Created: Sat 19 Nov 2011 11:24:19 GMT
|
22
|
+
#
|
23
|
+
######################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
# This method is used to convert a name to a method name.
|
28
|
+
# It is borrowed and adapted from shoes.rb:538-540.
|
29
|
+
|
30
|
+
def self.method_name(str)
|
31
|
+
str.to_s.gsub("/", "").gsub("::", "_").
|
32
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
33
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').downcase
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#--
|
2
|
+
######################################################################
|
3
|
+
#
|
4
|
+
# Copyright 2011 Andrew S. Townley
|
5
|
+
#
|
6
|
+
# Permission to use, copy, modify, and disribute this software for
|
7
|
+
# any purpose with or without fee is hereby granted, provided that
|
8
|
+
# the above copyright notices and this permission notice appear in
|
9
|
+
# all copies.
|
10
|
+
#
|
11
|
+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
|
12
|
+
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
13
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
14
|
+
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
|
15
|
+
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
16
|
+
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
17
|
+
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
18
|
+
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
19
|
+
#
|
20
|
+
# File: renderers.rb
|
21
|
+
# Created: Wed 23 Nov 2011 17:06:49 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
require 'ruby_mvc/renderers/html4_table_model_renderer'
|
@@ -0,0 +1,100 @@
|
|
1
|
+
#--
|
2
|
+
######################################################################
|
3
|
+
#
|
4
|
+
# Copyright 2011 Andrew S. Townley
|
5
|
+
#
|
6
|
+
# Permission to use, copy, modify, and disribute this software for
|
7
|
+
# any purpose with or without fee is hereby granted, provided that
|
8
|
+
# the above copyright notices and this permission notice appear in
|
9
|
+
# all copies.
|
10
|
+
#
|
11
|
+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
|
12
|
+
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
13
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
14
|
+
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
|
15
|
+
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
16
|
+
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
17
|
+
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
18
|
+
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
19
|
+
#
|
20
|
+
# File: html4_table_model_renderer.rb
|
21
|
+
# Created: Wed 23 Nov 2011 16:50:30 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
require 'tagz'
|
27
|
+
|
28
|
+
module RubyMVC
|
29
|
+
module Renderers
|
30
|
+
|
31
|
+
# This class provides a very basic HTML4 renderer for
|
32
|
+
# table models. The HTML generated by this renderer does
|
33
|
+
# not have any support for CSS, and will use a plethora of
|
34
|
+
# in-line deprecated HTML tags to support older rendering
|
35
|
+
# engines.
|
36
|
+
|
37
|
+
class Html4TableModelRenderer
|
38
|
+
include Tagz
|
39
|
+
|
40
|
+
OPTIONS = {
|
41
|
+
:border => 1,
|
42
|
+
:cellspacing => 0,
|
43
|
+
:cellpadding => 3
|
44
|
+
}.freeze
|
45
|
+
|
46
|
+
TD_OPTIONS = {
|
47
|
+
:valign => "top"
|
48
|
+
}.freeze
|
49
|
+
|
50
|
+
def self.render(model, cols, options = {})
|
51
|
+
self.new.render(model, cols, options)
|
52
|
+
end
|
53
|
+
|
54
|
+
def render(model, cols, options = {})
|
55
|
+
options = OPTIONS.merge(options)
|
56
|
+
tagz {
|
57
|
+
table_(options) {
|
58
|
+
build_header(model, cols, options)
|
59
|
+
model.each { |row| build_row(cols, row) }
|
60
|
+
}
|
61
|
+
}
|
62
|
+
end
|
63
|
+
|
64
|
+
protected
|
65
|
+
def build_header(model, cols, options = {})
|
66
|
+
return if options[:headers] == false
|
67
|
+
|
68
|
+
tr_ {
|
69
|
+
cols.each do |col|
|
70
|
+
th_(:align => "center", :valign => "bottom") {
|
71
|
+
strong_ col[:label]
|
72
|
+
}
|
73
|
+
end
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
def build_row(cols, row)
|
78
|
+
tr_ {
|
79
|
+
cols.each do |col|
|
80
|
+
if(r = col[:renderer])
|
81
|
+
tagz.concat r.render(self, row, col)
|
82
|
+
else
|
83
|
+
data = row[col[:key]]
|
84
|
+
style = TD_OPTIONS.merge(col[:style])
|
85
|
+
weight = style.delete(:weight)
|
86
|
+
td_(style) {
|
87
|
+
if weight == "bold"
|
88
|
+
strong_ data
|
89
|
+
else
|
90
|
+
data
|
91
|
+
end
|
92
|
+
}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#--
|
2
|
+
######################################################################
|
3
|
+
#
|
4
|
+
# Copyright 2011 Andrew S. Townley
|
5
|
+
#
|
6
|
+
# Permission to use, copy, modify, and disribute this software for
|
7
|
+
# any purpose with or without fee is hereby granted, provided that
|
8
|
+
# the above copyright notices and this permission notice appear in
|
9
|
+
# all copies.
|
10
|
+
#
|
11
|
+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
|
12
|
+
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
13
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
14
|
+
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
|
15
|
+
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
16
|
+
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
17
|
+
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
18
|
+
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
19
|
+
#
|
20
|
+
# File: toolkit.rb
|
21
|
+
# Created: Wed 23 Nov 2011 10:41:51 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
require 'ruby_mvc/toolkit/notification'
|
27
|
+
require 'ruby_mvc/toolkit/widget'
|
28
|
+
require 'ruby_mvc/toolkit/app'
|
29
|
+
require 'ruby_mvc/toolkit/dialog'
|
30
|
+
require 'ruby_mvc/toolkit/frame'
|
31
|
+
require 'ruby_mvc/toolkit/web_view'
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#--
|
2
|
+
######################################################################
|
3
|
+
#
|
4
|
+
# Copyright 2011 Andrew S. Townley
|
5
|
+
#
|
6
|
+
# Permission to use, copy, modify, and disribute this software for
|
7
|
+
# any purpose with or without fee is hereby granted, provided that
|
8
|
+
# the above copyright notices and this permission notice appear in
|
9
|
+
# all copies.
|
10
|
+
#
|
11
|
+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
|
12
|
+
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
13
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
14
|
+
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
|
15
|
+
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
16
|
+
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
17
|
+
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
18
|
+
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
19
|
+
#
|
20
|
+
# File: frame.rb
|
21
|
+
# Created: Wed 23 Nov 2011 10:39:10 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Toolkit
|
28
|
+
|
29
|
+
class App < Widget; end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#--
|
2
|
+
######################################################################
|
3
|
+
#
|
4
|
+
# Copyright 2011 Andrew S. Townley
|
5
|
+
#
|
6
|
+
# Permission to use, copy, modify, and disribute this software for
|
7
|
+
# any purpose with or without fee is hereby granted, provided that
|
8
|
+
# the above copyright notices and this permission notice appear in
|
9
|
+
# all copies.
|
10
|
+
#
|
11
|
+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
|
12
|
+
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
13
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
14
|
+
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
|
15
|
+
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
16
|
+
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
17
|
+
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
18
|
+
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
19
|
+
#
|
20
|
+
# File: dialog.rb
|
21
|
+
# Created: Wed 23 Nov 2011 10:41:15 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Toolkit
|
28
|
+
|
29
|
+
class Dialog < Widget; end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#--
|
2
|
+
######################################################################
|
3
|
+
#
|
4
|
+
# Copyright 2011 Andrew S. Townley
|
5
|
+
#
|
6
|
+
# Permission to use, copy, modify, and disribute this software for
|
7
|
+
# any purpose with or without fee is hereby granted, provided that
|
8
|
+
# the above copyright notices and this permission notice appear in
|
9
|
+
# all copies.
|
10
|
+
#
|
11
|
+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
|
12
|
+
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
13
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
14
|
+
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
|
15
|
+
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
16
|
+
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
17
|
+
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
18
|
+
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
19
|
+
#
|
20
|
+
# File: frame.rb
|
21
|
+
# Created: Wed 23 Nov 2011 10:39:10 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Toolkit
|
28
|
+
|
29
|
+
class Frame < Widget
|
30
|
+
api_methods :add
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
#--
|
2
|
+
######################################################################
|
3
|
+
#
|
4
|
+
# Copyright 2008, Andrew S. Townley
|
5
|
+
#
|
6
|
+
# Permission to use, copy, modify, and disribute this software for
|
7
|
+
# any purpose with or without fee is hereby granted, provided that
|
8
|
+
# the above copyright notices and this permission notice appear in
|
9
|
+
# all copies.
|
10
|
+
#
|
11
|
+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
|
12
|
+
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
13
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
14
|
+
# AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
|
15
|
+
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
16
|
+
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
17
|
+
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
18
|
+
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
19
|
+
#
|
20
|
+
# File: notification.rb
|
21
|
+
# Author: Andrew S. Townley
|
22
|
+
# Created: Sat Nov 1 14:27:10 GMT 2008
|
23
|
+
# Borrowed: Wed 23 Nov 2011 22:29:22 GMT
|
24
|
+
#
|
25
|
+
######################################################################
|
26
|
+
#++
|
27
|
+
|
28
|
+
module RubyMVC
|
29
|
+
module Toolkit
|
30
|
+
|
31
|
+
# This class allows obsevers to register a single block
|
32
|
+
# rather than implementing public observer methods (which
|
33
|
+
# can get messy and unnecessarily pollute the public API
|
34
|
+
# of the class)
|
35
|
+
#
|
36
|
+
# Each registered block will be called with the following
|
37
|
+
# arguments:
|
38
|
+
#
|
39
|
+
# 1) The notification name (or the method name to be called)
|
40
|
+
# 2) The sender of the notification
|
41
|
+
# 3) The notification parameters.
|
42
|
+
|
43
|
+
class ObserverReference
|
44
|
+
attr_reader :observer
|
45
|
+
|
46
|
+
def initialize(observer, &block)
|
47
|
+
@observer = observer
|
48
|
+
@block = block
|
49
|
+
end
|
50
|
+
|
51
|
+
def method_missing(method, *args, &block)
|
52
|
+
if @observer.respond_to? method
|
53
|
+
@observer.send(method, *args, &block)
|
54
|
+
elsif !@block.nil?
|
55
|
+
@block.call(method, *args)
|
56
|
+
else
|
57
|
+
super
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class ObserverList
|
63
|
+
def initialize
|
64
|
+
@observers = {}
|
65
|
+
end
|
66
|
+
|
67
|
+
def <<(val)
|
68
|
+
if !val.is_a? ObserverReference
|
69
|
+
raise ArgumentError, "can only have observer references in the list!"
|
70
|
+
end
|
71
|
+
|
72
|
+
@observers[val.observer] = val if !@observers.include? val.observer
|
73
|
+
end
|
74
|
+
|
75
|
+
def delete(val)
|
76
|
+
@observers.delete(val)
|
77
|
+
end
|
78
|
+
|
79
|
+
def each(&block)
|
80
|
+
@observers.each_value(&block)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# This class is used to relay notifications from one sender
|
85
|
+
# to another sender's registered listeners.
|
86
|
+
|
87
|
+
class NotificationRelay
|
88
|
+
def initialize(sender, listeners)
|
89
|
+
@listeners = listeners
|
90
|
+
@sender = sender
|
91
|
+
end
|
92
|
+
|
93
|
+
def method_missing(method, *args, &block)
|
94
|
+
args[0] = @sender
|
95
|
+
@listeners.each { |l| l.send(method, *args, &block) }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
module ViewChangeNotifier
|
100
|
+
def register_view_change_observer(observer, &block)
|
101
|
+
observers = (@view_change_observers ||= ObserverList.new)
|
102
|
+
observers << ObserverReference.new(observer, &block)
|
103
|
+
end
|
104
|
+
|
105
|
+
def unregister_view_change_observer(observer)
|
106
|
+
observers = (@view_change_observers ||= ObserverList.new)
|
107
|
+
observers.delete(observer)
|
108
|
+
end
|
109
|
+
|
110
|
+
protected
|
111
|
+
def fire_view_changed
|
112
|
+
observers = (@view_change_observers ||= [])
|
113
|
+
observers.each { |o| o.view_changed(self) }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
module ChangeNotifier
|
118
|
+
def register_change_observer(observer, &block)
|
119
|
+
observers = (@change_observers ||= ObserverList.new)
|
120
|
+
observers << ObserverReference.new(observer, &block)
|
121
|
+
end
|
122
|
+
|
123
|
+
def unregister_change_observer(observer)
|
124
|
+
observers = (@change_observers ||= [])
|
125
|
+
observers.delete(observer)
|
126
|
+
end
|
127
|
+
|
128
|
+
def squelch=(val)
|
129
|
+
@notification_squelch = val
|
130
|
+
end
|
131
|
+
|
132
|
+
protected
|
133
|
+
def fire_changed
|
134
|
+
return if @notification_squelch
|
135
|
+
observers = (@change_observers ||= [])
|
136
|
+
observers.each { |o| o.changed(self) }
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
module PropertyChangeNotifier
|
141
|
+
def register_property_change_observer(observer, &block)
|
142
|
+
observers = (@property_change_observers ||= [])
|
143
|
+
observers << ObserverReference.new(observer, &block)
|
144
|
+
end
|
145
|
+
|
146
|
+
def unregister_property_change_observer(observer)
|
147
|
+
observers = (@property_change_observers ||= [])
|
148
|
+
observers.delete(observer)
|
149
|
+
end
|
150
|
+
|
151
|
+
def squelch=(val)
|
152
|
+
@notification_squelch = val
|
153
|
+
end
|
154
|
+
|
155
|
+
protected
|
156
|
+
def fire_property_changed(property, old_val, new_val)
|
157
|
+
return if @notification_squelch
|
158
|
+
observers = (@property_change_observers ||= [])
|
159
|
+
observers.each { |o| o.property_changed(self, property, old_val, new_val) }
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
module SignalHandler
|
164
|
+
module ClassMethods
|
165
|
+
def signals
|
166
|
+
@signals ||= {}
|
167
|
+
end
|
168
|
+
|
169
|
+
def signal(signal, options = { :vetoable => false })
|
170
|
+
signals[signal] = options
|
171
|
+
end
|
172
|
+
|
173
|
+
def valid_signal?(signal)
|
174
|
+
if !signals.has_key? signal
|
175
|
+
raise ArgumentError, "class #{self} does not support signal '#{signal}'"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def signal_connect(signal, &block)
|
181
|
+
self.class.valid_signal? signal if self.class.respond_to? :signals
|
182
|
+
signals = (@signals ||= {})
|
183
|
+
signals[signal] = block
|
184
|
+
end
|
185
|
+
|
186
|
+
def signal_disconnect(signal)
|
187
|
+
self.class.valid_signal? signal if self.class.respond_to? :signals
|
188
|
+
signals = (@signals ||= {})
|
189
|
+
signals.delete(signal)
|
190
|
+
end
|
191
|
+
|
192
|
+
def signal_emit(signal, *args)
|
193
|
+
self.class.valid_signal? signal if self.class.respond_to? :signals
|
194
|
+
signals = (@signals ||= {})
|
195
|
+
if signals.key? signal
|
196
|
+
proc = signals[signal]
|
197
|
+
proc.call(*args) if !proc.nil?
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|