ruby_mvc 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,85 @@
|
|
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: views.rb
|
21
|
+
# Created: Sat 19 Nov 2011 11:28:08 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Views
|
28
|
+
|
29
|
+
class View
|
30
|
+
def self.widget_def(targ = nil)
|
31
|
+
if targ == nil
|
32
|
+
@widget_def
|
33
|
+
else
|
34
|
+
if (x = targ.widget_def).nil?
|
35
|
+
if targ != RubyMVC::Views::View
|
36
|
+
self.widget_def(targ.superclass)
|
37
|
+
end
|
38
|
+
else
|
39
|
+
x
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.create_widget(klass)
|
45
|
+
w = self.widget_def(klass)
|
46
|
+
args = w[:args]
|
47
|
+
block = w[:block]
|
48
|
+
args[0].new(*args[1..-1], &block)
|
49
|
+
end
|
50
|
+
|
51
|
+
class << self
|
52
|
+
# This method is used to define the primary widget
|
53
|
+
# class through which this view may be added to other
|
54
|
+
# widgets.
|
55
|
+
|
56
|
+
def widget(*args, &block)
|
57
|
+
puts "Set widget for #{self}: #{args.inspect}"
|
58
|
+
@widget_def = { :args => args, :block => block }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def peer
|
63
|
+
@widget.peer
|
64
|
+
end
|
65
|
+
|
66
|
+
attr_accessor :controller, :widget
|
67
|
+
def initialize(*args)
|
68
|
+
@widget = View.create_widget(self.class)
|
69
|
+
if(options = args.last).is_a? Hash
|
70
|
+
self.controller = options[:controller]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def method_missing(m, *a, &b)
|
75
|
+
@widget.send(m, *a, &b)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
#require 'ruby_mvc/views/table_view'
|
82
|
+
#require 'ruby_mvc/views/ar_model_editor'
|
83
|
+
#require 'ruby_mvc/views/ar_type_list'
|
84
|
+
#require 'ruby_mvc/views/ar_type_editor'
|
85
|
+
require 'ruby_mvc/views/web_view'
|
@@ -0,0 +1,84 @@
|
|
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: ar_model_editor.rb
|
21
|
+
# Created: Sat 19 Nov 2011 11:26:37 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Views
|
28
|
+
|
29
|
+
# This class is responsible for building a form for the
|
30
|
+
# given ActiveRecord model
|
31
|
+
|
32
|
+
class ActiveRecordModelEditor < View
|
33
|
+
DEFAULTS = { :label_width => 0.3 }.freeze
|
34
|
+
|
35
|
+
def initialize(model, options = {}, &block)
|
36
|
+
super(options, &block)
|
37
|
+
load(model, options, &block)
|
38
|
+
end
|
39
|
+
|
40
|
+
# This method is used to load the view with the
|
41
|
+
# information in the AR model.
|
42
|
+
|
43
|
+
def load(model, options = {}, &block)
|
44
|
+
lwidth = options[:label_width] || DEFAULTS[:label_width]
|
45
|
+
|
46
|
+
stack :width => "100%" do
|
47
|
+
flow :width => "100%" do
|
48
|
+
model.attributes.keys.sort.each do |key|
|
49
|
+
# FIXME: I can't believe that you have to do this
|
50
|
+
# this way with AR. I'm surely missing
|
51
|
+
# something...
|
52
|
+
m = "#{key}=".to_sym
|
53
|
+
value = model.attributes[key]
|
54
|
+
flow :width => lwidth, :margin_top => 2 do
|
55
|
+
para key, :weight => 'bold', :align => "right"
|
56
|
+
end
|
57
|
+
flow :width => 1 - lwidth do
|
58
|
+
edit_line model.attributes[key] do |e|
|
59
|
+
model.send(m, e.text)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
@model = model
|
67
|
+
@options = options
|
68
|
+
end
|
69
|
+
|
70
|
+
def save
|
71
|
+
@model.save!
|
72
|
+
end
|
73
|
+
|
74
|
+
def create
|
75
|
+
if @model
|
76
|
+
load(@model.class.new, options)
|
77
|
+
else
|
78
|
+
alert("No template model.\nUse the #load method instead.")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,65 @@
|
|
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: ar_type_editor.rb
|
21
|
+
# Created: Mon 21 Nov 2011 18:00:49 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Views
|
28
|
+
|
29
|
+
class ActiveRecordTypeEditor < View
|
30
|
+
include RubyMVC::LinkDispatcher
|
31
|
+
|
32
|
+
def initialize(type, options = {}, &block)
|
33
|
+
ctrl = options[:controller] = options[:controller] || self
|
34
|
+
super(options, &block)
|
35
|
+
@type = type
|
36
|
+
@list = active_record_type_list type
|
37
|
+
para link("New...") {
|
38
|
+
ctrl.link_activated(self, "/create_instance")
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_instance(sender, link)
|
43
|
+
debug("create instance of type #{@type}")
|
44
|
+
obj = @type.new
|
45
|
+
window do
|
46
|
+
stack do
|
47
|
+
obj.description = "Some text"
|
48
|
+
editor = active_record_model_editor obj
|
49
|
+
flow :margin_left => 0, :left => "-25%" do
|
50
|
+
button "Cancel", :align => "right" do
|
51
|
+
close
|
52
|
+
end
|
53
|
+
button "Save", :align => "right" do
|
54
|
+
editor.save
|
55
|
+
close
|
56
|
+
end
|
57
|
+
debug("created buttons")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,45 @@
|
|
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: ar_type_list.rb
|
21
|
+
# Created: Mon 21 Nov 2011 15:57:27 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Views
|
28
|
+
|
29
|
+
class ActiveRecordTypeList < TableView
|
30
|
+
def load(model, options = {}, &block)
|
31
|
+
@entity_type = model
|
32
|
+
super(model.find(options[:query] || :all), options, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
def columns(model, options)
|
36
|
+
cols = []
|
37
|
+
@entity_type.attribute_names.each do |key|
|
38
|
+
cols << { :key => key, :label => key.capitalize }
|
39
|
+
end
|
40
|
+
cols
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,96 @@
|
|
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_view.rb
|
21
|
+
# Created: Sat 19 Nov 2011 20:14:33 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Views
|
28
|
+
|
29
|
+
# This class provides a basic TableView control based
|
30
|
+
# loosely on the Archistry JavaScript TreeGrid API. It
|
31
|
+
# requires that the data to be displayed be supplied as a
|
32
|
+
# TableModel instance.
|
33
|
+
|
34
|
+
class TableView < View
|
35
|
+
def initialize(model, options = {}, &block)
|
36
|
+
super(options, &block)
|
37
|
+
load(model, options, &block)
|
38
|
+
end
|
39
|
+
|
40
|
+
# This method is used to load the view with the
|
41
|
+
# information in the table model.
|
42
|
+
|
43
|
+
def load(model, options = {}, &block)
|
44
|
+
cols = columns(model, options)
|
45
|
+
defw = "#{100 / cols.size}%"
|
46
|
+
build_header(model, cols, defw, options)
|
47
|
+
stack(:width => "100%") do
|
48
|
+
model.each { |row| build_row(cols, row, defw) }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
protected
|
53
|
+
# This method extracts or creates the column model for the
|
54
|
+
# view.
|
55
|
+
|
56
|
+
def columns(model, options)
|
57
|
+
if cols = options[:columns]
|
58
|
+
cols
|
59
|
+
else
|
60
|
+
cols = model.keys.collect do |k|
|
61
|
+
{ :key => k.to_sym, :label => "#{k.capitalize}" }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def build_header(model, cols, defw, options)
|
67
|
+
if options[:headers] != false
|
68
|
+
stack(:width => "100%") do
|
69
|
+
flow do
|
70
|
+
cols.each do |col|
|
71
|
+
flow(:width => defw) do
|
72
|
+
para col[:label], :weight => "bold", :align => "center"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def build_row(cols, row, defw)
|
81
|
+
flow do
|
82
|
+
cols.each do |col|
|
83
|
+
flow(:width => defw) do
|
84
|
+
if(r = col[:renderer])
|
85
|
+
r.render(self, row, col)
|
86
|
+
else
|
87
|
+
para row[col[:key]], col[:style]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,65 @@
|
|
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: web_view.rb
|
21
|
+
# Created: Wed 23 Nov 2011 17:08:02 GMT
|
22
|
+
#
|
23
|
+
#####################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
module RubyMVC
|
27
|
+
module Views
|
28
|
+
|
29
|
+
# This is a more sophisticated view control vs. the standard
|
30
|
+
# toolkit widget.
|
31
|
+
|
32
|
+
class WebView < View
|
33
|
+
widget Toolkit::WebView
|
34
|
+
|
35
|
+
# This method is used to load the view with the
|
36
|
+
# information in the table model.
|
37
|
+
|
38
|
+
def load(model, options = {}, &block)
|
39
|
+
cols = columns(model, options)
|
40
|
+
if r = options[:renderer]
|
41
|
+
html = r.render(model, cols, options[:renderer_options])
|
42
|
+
puts "HTML:\n#{html}"
|
43
|
+
widget.load_html(html)
|
44
|
+
else
|
45
|
+
raise ArgumentError,"renderer not specified"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
# This method extracts or creates the column model for the
|
51
|
+
# view.
|
52
|
+
|
53
|
+
def columns(model, options)
|
54
|
+
if cols = options[:columns]
|
55
|
+
cols
|
56
|
+
else
|
57
|
+
cols = model.keys.collect do |k|
|
58
|
+
{ :key => k.to_sym, :label => "#{k.capitalize}" }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|