ruby_mvc 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/LICENSE +19 -0
  2. data/README.md +69 -0
  3. data/lib/ruby_mvc.rb +33 -0
  4. data/lib/ruby_mvc/application.rb +53 -0
  5. data/lib/ruby_mvc/controllers/app_controller.rb +93 -0
  6. data/lib/ruby_mvc/controllers/rails_controller.rb +71 -0
  7. data/lib/ruby_mvc/models.rb +28 -0
  8. data/lib/ruby_mvc/models/array_table_model.rb +59 -0
  9. data/lib/ruby_mvc/models/keyed_array_table_model.rb +83 -0
  10. data/lib/ruby_mvc/models/table_model.rb +42 -0
  11. data/lib/ruby_mvc/module.rb +35 -0
  12. data/lib/ruby_mvc/renderers.rb +26 -0
  13. data/lib/ruby_mvc/renderers/html4_table_model_renderer.rb +100 -0
  14. data/lib/ruby_mvc/toolkit.rb +31 -0
  15. data/lib/ruby_mvc/toolkit/app.rb +32 -0
  16. data/lib/ruby_mvc/toolkit/dialog.rb +31 -0
  17. data/lib/ruby_mvc/toolkit/frame.rb +34 -0
  18. data/lib/ruby_mvc/toolkit/notification.rb +202 -0
  19. data/lib/ruby_mvc/toolkit/peers/wxruby.rb +31 -0
  20. data/lib/ruby_mvc/toolkit/peers/wxruby/app.rb +44 -0
  21. data/lib/ruby_mvc/toolkit/peers/wxruby/box_layout.rb +48 -0
  22. data/lib/ruby_mvc/toolkit/peers/wxruby/common.rb +72 -0
  23. data/lib/ruby_mvc/toolkit/peers/wxruby/frame.rb +49 -0
  24. data/lib/ruby_mvc/toolkit/peers/wxruby/web_view.rb +87 -0
  25. data/lib/ruby_mvc/toolkit/web_view.rb +60 -0
  26. data/lib/ruby_mvc/toolkit/widget.rb +108 -0
  27. data/lib/ruby_mvc/views.rb +85 -0
  28. data/lib/ruby_mvc/views/ar_model_editor.rb +84 -0
  29. data/lib/ruby_mvc/views/ar_type_editor.rb +65 -0
  30. data/lib/ruby_mvc/views/ar_type_list.rb +45 -0
  31. data/lib/ruby_mvc/views/table_view.rb +96 -0
  32. data/lib/ruby_mvc/views/web_view.rb +65 -0
  33. data/lib/ruby_mvc/wx.rb +26 -0
  34. data/ruby_mvc.gemspec +37 -0
  35. data/sample/frame.rb +28 -0
  36. data/sample/mvc.rb +29 -0
  37. data/sample/test.html +118 -0
  38. data/sample/web_view.rb +34 -0
  39. data/test/unit/models/test_array_table_model.rb +56 -0
  40. data/test/unit/models/test_keyed_array_table_model.rb +54 -0
  41. data/test/unit/test_array_table_model.rb +38 -0
  42. 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