ironnails 0.0.1

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.
Files changed (60) hide show
  1. data/Rakefile +21 -0
  2. data/VERSION +1 -0
  3. data/init.rb +1 -0
  4. data/ironnails.gemspec +96 -0
  5. data/lib/iron_nails.rb +1 -0
  6. data/lib/ironnails/bin/IronNails.Library.dll +0 -0
  7. data/lib/ironnails/bin/IronRuby.Libraries.Yaml.dll +0 -0
  8. data/lib/ironnails/bin/IronRuby.Libraries.dll +0 -0
  9. data/lib/ironnails/bin/IronRuby.dll +0 -0
  10. data/lib/ironnails/bin/Microsoft.Dynamic.dll +0 -0
  11. data/lib/ironnails/bin/Microsoft.Scripting.Core.dll +0 -0
  12. data/lib/ironnails/bin/Microsoft.Scripting.ExtensionAttribute.dll +0 -0
  13. data/lib/ironnails/bin/Microsoft.Scripting.dll +0 -0
  14. data/lib/ironnails/config/configuration.rb +141 -0
  15. data/lib/ironnails/config/initializer.rb +144 -0
  16. data/lib/ironnails/controller/base.rb +135 -0
  17. data/lib/ironnails/controller/view_operations.rb +101 -0
  18. data/lib/ironnails/controller.rb +2 -0
  19. data/lib/ironnails/core_ext/array.rb +15 -0
  20. data/lib/ironnails/core_ext/class/attribute_accessors.rb +57 -0
  21. data/lib/ironnails/core_ext/class.rb +8 -0
  22. data/lib/ironnails/core_ext/fixnum.rb +22 -0
  23. data/lib/ironnails/core_ext/hash.rb +32 -0
  24. data/lib/ironnails/core_ext/kernel.rb +26 -0
  25. data/lib/ironnails/core_ext/string.rb +58 -0
  26. data/lib/ironnails/core_ext/symbol.rb +78 -0
  27. data/lib/ironnails/core_ext/system/net/web_request.rb +110 -0
  28. data/lib/ironnails/core_ext/system/security/secure_string.rb +18 -0
  29. data/lib/ironnails/core_ext/system/windows/markup/xaml_reader.rb +6 -0
  30. data/lib/ironnails/core_ext/system/windows/ui_element.rb +17 -0
  31. data/lib/ironnails/core_ext/time.rb +28 -0
  32. data/lib/ironnails/core_ext.rb +12 -0
  33. data/lib/ironnails/errors.rb +19 -0
  34. data/lib/ironnails/iron_xml.rb +83 -0
  35. data/lib/ironnails/logger.rb +4 -0
  36. data/lib/ironnails/logging/buffered_logger.rb +137 -0
  37. data/lib/ironnails/logging/class_logger.rb +29 -0
  38. data/lib/ironnails/models/base.rb +16 -0
  39. data/lib/ironnails/models/bindable_collection.rb +15 -0
  40. data/lib/ironnails/models/model_mixin.rb +69 -0
  41. data/lib/ironnails/models.rb +3 -0
  42. data/lib/ironnails/nails_engine.rb +398 -0
  43. data/lib/ironnails/observable.rb +117 -0
  44. data/lib/ironnails/security/secure_string.rb +61 -0
  45. data/lib/ironnails/version.rb +11 -0
  46. data/lib/ironnails/view/collections.rb +117 -0
  47. data/lib/ironnails/view/commands/add_sub_view_command.rb +33 -0
  48. data/lib/ironnails/view/commands/behavior_command.rb +29 -0
  49. data/lib/ironnails/view/commands/command.rb +208 -0
  50. data/lib/ironnails/view/commands/event_command.rb +32 -0
  51. data/lib/ironnails/view/commands/timed_command.rb +40 -0
  52. data/lib/ironnails/view/commands.rb +5 -0
  53. data/lib/ironnails/view/view.rb +190 -0
  54. data/lib/ironnails/view/view_model.rb +45 -0
  55. data/lib/ironnails/view/xaml_proxy.rb +226 -0
  56. data/lib/ironnails/view.rb +5 -0
  57. data/lib/ironnails/wpf.rb +113 -0
  58. data/lib/ironnails/wpf_application.rb +30 -0
  59. data/lib/ironnails.rb +68 -0
  60. metadata +133 -0
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "ironnails"
8
+ gem.summary = %Q{IronNails brings rails like development to IronRuby and WPF}
9
+ gem.description = %Q{IronNails is a framework inspired by the Rails and rucola frameworks. It offers a rails-like way of developing
10
+ applications with IronRuby and Windows Presentation Foundation (WPF).}
11
+ gem.email = "ivan@flanders.co.nz"
12
+ gem.homepage = "http://github.com/casualjim/ironnails"
13
+ gem.authors = ["Ivan Porto Carrero"]
14
+ gem.add_development_dependency "rspec", ">= 0"
15
+ gem.files = FileList["[A-Z]*", "{lib}/**/*"]
16
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
21
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + "/lib/ironnails"
data/ironnails.gemspec ADDED
@@ -0,0 +1,96 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ironnails}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Ivan Porto Carrero"]
12
+ s.date = %q{2010-02-28}
13
+ s.description = %q{IronNails is a framework inspired by the Rails and rucola frameworks. It offers a rails-like way of developing
14
+ applications with IronRuby and Windows Presentation Foundation (WPF).}
15
+ s.email = %q{ivan@flanders.co.nz}
16
+ s.files = [
17
+ "Rakefile",
18
+ "VERSION",
19
+ "init.rb",
20
+ "ironnails.gemspec",
21
+ "lib/iron_nails.rb",
22
+ "lib/ironnails.rb",
23
+ "lib/ironnails/bin/IronNails.Library.dll",
24
+ "lib/ironnails/bin/IronRuby.Libraries.Yaml.dll",
25
+ "lib/ironnails/bin/IronRuby.Libraries.dll",
26
+ "lib/ironnails/bin/IronRuby.dll",
27
+ "lib/ironnails/bin/Microsoft.Dynamic.dll",
28
+ "lib/ironnails/bin/Microsoft.Scripting.Core.dll",
29
+ "lib/ironnails/bin/Microsoft.Scripting.ExtensionAttribute.dll",
30
+ "lib/ironnails/bin/Microsoft.Scripting.dll",
31
+ "lib/ironnails/config/configuration.rb",
32
+ "lib/ironnails/config/initializer.rb",
33
+ "lib/ironnails/controller.rb",
34
+ "lib/ironnails/controller/base.rb",
35
+ "lib/ironnails/controller/view_operations.rb",
36
+ "lib/ironnails/core_ext.rb",
37
+ "lib/ironnails/core_ext/array.rb",
38
+ "lib/ironnails/core_ext/class.rb",
39
+ "lib/ironnails/core_ext/class/attribute_accessors.rb",
40
+ "lib/ironnails/core_ext/fixnum.rb",
41
+ "lib/ironnails/core_ext/hash.rb",
42
+ "lib/ironnails/core_ext/kernel.rb",
43
+ "lib/ironnails/core_ext/string.rb",
44
+ "lib/ironnails/core_ext/symbol.rb",
45
+ "lib/ironnails/core_ext/system/net/web_request.rb",
46
+ "lib/ironnails/core_ext/system/security/secure_string.rb",
47
+ "lib/ironnails/core_ext/system/windows/markup/xaml_reader.rb",
48
+ "lib/ironnails/core_ext/system/windows/ui_element.rb",
49
+ "lib/ironnails/core_ext/time.rb",
50
+ "lib/ironnails/errors.rb",
51
+ "lib/ironnails/iron_xml.rb",
52
+ "lib/ironnails/logger.rb",
53
+ "lib/ironnails/logging/buffered_logger.rb",
54
+ "lib/ironnails/logging/class_logger.rb",
55
+ "lib/ironnails/models.rb",
56
+ "lib/ironnails/models/base.rb",
57
+ "lib/ironnails/models/bindable_collection.rb",
58
+ "lib/ironnails/models/model_mixin.rb",
59
+ "lib/ironnails/nails_engine.rb",
60
+ "lib/ironnails/observable.rb",
61
+ "lib/ironnails/security/secure_string.rb",
62
+ "lib/ironnails/version.rb",
63
+ "lib/ironnails/view.rb",
64
+ "lib/ironnails/view/collections.rb",
65
+ "lib/ironnails/view/commands.rb",
66
+ "lib/ironnails/view/commands/add_sub_view_command.rb",
67
+ "lib/ironnails/view/commands/behavior_command.rb",
68
+ "lib/ironnails/view/commands/command.rb",
69
+ "lib/ironnails/view/commands/event_command.rb",
70
+ "lib/ironnails/view/commands/timed_command.rb",
71
+ "lib/ironnails/view/view.rb",
72
+ "lib/ironnails/view/view_model.rb",
73
+ "lib/ironnails/view/xaml_proxy.rb",
74
+ "lib/ironnails/wpf.rb",
75
+ "lib/ironnails/wpf_application.rb"
76
+ ]
77
+ s.homepage = %q{http://github.com/casualjim/ironnails}
78
+ s.rdoc_options = ["--charset=UTF-8"]
79
+ s.require_paths = ["lib"]
80
+ s.rubygems_version = %q{1.3.6}
81
+ s.summary = %q{IronNails brings rails like development to IronRuby and WPF}
82
+
83
+ if s.respond_to? :specification_version then
84
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
85
+ s.specification_version = 3
86
+
87
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
88
+ s.add_development_dependency(%q<rspec>, [">= 0"])
89
+ else
90
+ s.add_dependency(%q<rspec>, [">= 0"])
91
+ end
92
+ else
93
+ s.add_dependency(%q<rspec>, [">= 0"])
94
+ end
95
+ end
96
+
data/lib/iron_nails.rb ADDED
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + "/ironnails"
Binary file
@@ -0,0 +1,141 @@
1
+ # A wrapper module that will contain all the relevant objects for our twitter application
2
+ module IronNails
3
+
4
+ # This structure has been heavily inspired by the rails framework.
5
+ # The Configuration class holds all the parameters for the Initializer
6
+ # Usually, you'll create a Configuration file implicitly through the block
7
+ # running on the Initializer, but it's also possible to create
8
+ # the Configuration instance in advance and pass it in
9
+ # like this:
10
+ #
11
+ # config = IronNails::Configuration.new
12
+ # IronNails::Initializer.run(config)
13
+ class Configuration
14
+
15
+ # the root path for our application
16
+ attr_reader :root_path
17
+
18
+ # the search paths for ruby source files
19
+ attr_reader :application_paths
20
+
21
+ # the search paths for .NET binaries
22
+ attr_reader :assembly_paths
23
+
24
+ # the namespaces that need to be included by default
25
+ attr_reader :namespaces
26
+
27
+ # the files that won't be initialized through this procedure
28
+ attr_reader :excluded_files
29
+
30
+ # The log level to use for the default Rails logger. In production mode,
31
+ # this defaults to <tt>:info</tt>. In development mode, it defaults to
32
+ # <tt>:debug</tt>.
33
+ attr_accessor :log_level
34
+
35
+ # The path to the log file to use. Defaults to log/#{environment}.log
36
+ # (e.g. log/development.log or log/production.log).
37
+ attr_accessor :log_path
38
+
39
+ # The specific logger to use. By default, a logger will be created and
40
+ # initialized using #log_path and #log_level, but a programmer may
41
+ # specifically set the logger to use via this accessor and it will be
42
+ # used directly.
43
+ attr_accessor :logger
44
+
45
+ def initialize(rpath = (File.dirname(__FILE__) + '/../../..'))
46
+ @root_path = rpath
47
+ initialize_with_defaults
48
+ end
49
+
50
+ def environment
51
+ ::IRONNAILS_ENV
52
+ end
53
+
54
+ # The paths that contain sources for our application.
55
+ # We will require these at a later stage
56
+ def default_application_paths
57
+ paths = []
58
+
59
+ # Followed by the standard includes.
60
+ paths.concat %w(
61
+ config
62
+ lib
63
+ lib/core_ext
64
+ app
65
+ app/models
66
+ app/controllers
67
+ app/converters
68
+ app/helpers
69
+ ).map { |dir| "#{root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
70
+ end
71
+
72
+ #files to exclude from requiring in our app
73
+ def default_excluded_files
74
+ ['config/environment.rb', 'lib/main.rb', 'config/boot.rb', 'bin/IronNails.Library.dll' ].collect{ |dir| "#{root_path}/#{dir}" }
75
+ end
76
+
77
+ def default_log_level
78
+ (IRONNAILS_ENV == 'development' || IRONNAILS_ENV.nil?) ? :debug : :info
79
+ end
80
+
81
+ def default_log_path
82
+ File.join(root_path, 'log', "#{environment}.log")
83
+ end
84
+
85
+ # returns wheter or not the specified path is an excluded file
86
+ def excluded_file?(file_path)
87
+ excluded_files.include? file_path
88
+ end
89
+
90
+ # The paths that contain .NET binaries
91
+ def default_assembly_paths
92
+ paths = []
93
+ paths.concat %w( bin ).map{ |dir| "#{root_path}/#{dir}"}.select{ |dir| File.directory?(dir) }
94
+ end
95
+
96
+ def default_namespaces
97
+ %w(
98
+ System
99
+ System::Net
100
+ System::Xml
101
+ System::IO
102
+ System::Web
103
+ System::Text
104
+ System::Threading
105
+ System::Windows
106
+ System::Collections::ObjectModel
107
+ IronNails::Controller
108
+ IronNails::View
109
+ )
110
+ end
111
+
112
+ def initialize_with_defaults
113
+ set_root_path!
114
+ @application_paths, @assembly_paths, @namespaces, @excluded_files = default_application_paths, default_assembly_paths, default_namespaces, default_excluded_files
115
+ @log_level, @log_path = default_log_level, default_log_path
116
+ end
117
+
118
+ # Set the root_path to IRONNAILS_ROOT and canonicalize it.
119
+ def set_root_path!
120
+ raise 'IRONNAILS_ROOT is not set' unless defined?(::IRONNAILS_ROOT)
121
+ raise 'IRONNAILS_ROOT is not a directory' unless File.directory?(::IRONNAILS_ROOT)
122
+
123
+ @root_path =
124
+ # Pathname is incompatible with Windows, but Windows doesn't have
125
+ # real symlinks so File.expand_path is safe.
126
+ if ENV['OS'] == 'Windows_NT'.freeze
127
+ File.expand_path(::IRONNAILS_ROOT)
128
+
129
+ # Otherwise use Pathname#realpath which respects symlinks.
130
+ else
131
+ Pathname.new(::IRONNAILS_ROOT).realpath.to_s
132
+ end
133
+
134
+ Object.const_set(:RELATIVE_SAILS_ROOT, ::IRONNAILS_ROOT.dup) unless defined?(::RELATIVE_SYLVESTER_ROOT)
135
+
136
+ ::IRONNAILS_ROOT.replace @root_path
137
+ end
138
+
139
+ end
140
+
141
+ end
@@ -0,0 +1,144 @@
1
+ def include_global_namespaces(namespaces)
2
+ namespaces.each { |namespace| include(eval(namespace)) }
3
+ end
4
+
5
+ module IronNails
6
+
7
+ class << self
8
+ # The Configuration instance used to configure the Rails environment
9
+ def configuration
10
+ @@configuration
11
+ end
12
+
13
+ def configuration=(configuration)
14
+ @@configuration = configuration
15
+ end
16
+
17
+ def logger
18
+ IRONNAILS_DEFAULT_LOGGER
19
+ end
20
+
21
+ def root
22
+ if defined?(IRONNAILS_ROOT)
23
+ IRONNAILS_ROOT
24
+ else
25
+ nil
26
+ end
27
+ end
28
+
29
+ def env
30
+ IRONNAILS_ENV
31
+ end
32
+
33
+ def version
34
+ IronNails::VERSION::STRING
35
+ end
36
+
37
+ end
38
+
39
+ # This structure has been heavily inspired by the rails framework.
40
+ # The Configuration class holds all the parameters for the Initializer
41
+ # Usually, you'll create a Configuration file implicitly through the block
42
+ # running on the Initializer, but it's also possible to create
43
+ # the Configuration instance in advance and pass it in
44
+ # like this:
45
+ #
46
+ # config = IronNails::Configuration.new
47
+ # IronNails::Initializer.run(config)
48
+ class Initializer
49
+
50
+ def initialize(configuration)
51
+ IronNails.configuration = configuration
52
+
53
+ initialize_logger
54
+
55
+ set_constants
56
+ require_binaries
57
+ include_namespaces
58
+ require_application_files
59
+ end
60
+
61
+ def self.run(configuration = Configuration.new)
62
+ yield configuration if block_given?
63
+ initializer = new configuration
64
+ initializer
65
+ end
66
+
67
+ def configuration
68
+ IronNails.configuration
69
+ end
70
+
71
+ def set_constants
72
+ logger.debug "setting application constants", IRONNAILS_FRAMEWORKNAME
73
+ end
74
+
75
+ # If the IRONNAILS_DEFAULT_LOGGER constant is already set, this initialization
76
+ # routine does nothing. If the constant is not set, and Configuration#logger
77
+ # is not +nil+, this also does nothing. Otherwise, a new logger instance
78
+ # is created at Configuration#log_path, with a default log level of
79
+ # Configuration#log_level.
80
+ #
81
+ # If the log could not be created, the log will be set to output to
82
+ # +STDERR+, with a log level of +WARN+.
83
+ def initialize_logger
84
+ # if the environment has explicitly defined a logger, use it
85
+ return if defined?(IRONNAILS_DEFAULT_LOGGER)
86
+
87
+ unless logr = configuration.logger
88
+ begin
89
+ logr = IronNails::Logging::BufferedLogger.new(configuration.log_path)
90
+ logr.level = IronNails::Logging::BufferedLogger.const_get(configuration.log_level.to_s.upcase)
91
+ if configuration.environment == "production"
92
+ logr.auto_flushing = false
93
+ logr.set_non_blocking_io
94
+ end
95
+ rescue StandardError => e
96
+ logr = IronNails::Logging::BufferedLogger.new(STDERR)
97
+ logr.level = IronNails::Logging::BufferedLogger::WARN
98
+ logr.warn(
99
+ "IronNails Error: Unable to access log file. Please ensure that #{configuration.log_path} exists and is chmod 0666. " +
100
+ "The log level has been raised to WARN and the output directed to STDERR until the problem is fixed. #{e}"
101
+ )
102
+ end
103
+ logr.debug "initializing logger", IRONNAILS_FRAMEWORKNAME
104
+ end
105
+
106
+ silence_warnings { Object.const_set "IRONNAILS_DEFAULT_LOGGER", logr }
107
+ end
108
+
109
+ def logger
110
+ IRONNAILS_DEFAULT_LOGGER
111
+ end
112
+
113
+
114
+ def require_binaries
115
+ logger.debug "requiring binaries from bin", IRONNAILS_FRAMEWORKNAME
116
+ configuration.assembly_paths.each do |path|
117
+ require_files path, :dll
118
+ end
119
+ end
120
+
121
+
122
+ def include_namespaces
123
+ logger.debug "Including namespaces", IRONNAILS_FRAMEWORKNAME
124
+ #include_global_namespaces configuration.namespaces
125
+ configuration.namespaces.each { |namespace| Object.send :include, eval(namespace) }
126
+ end
127
+
128
+ def require_application_files
129
+ logger.debug "requiring application files", IRONNAILS_FRAMEWORKNAME
130
+ configuration.application_paths.each do |path|
131
+ require_files path, :rb
132
+ end
133
+ end
134
+
135
+ def require_files(path, extension)
136
+ Dir.glob("#{File.expand_path(path)}/*.#{extension}").each do |file|
137
+ # puts "#{file}"
138
+ require "#{file}" unless configuration.excluded_file? file
139
+ end
140
+ end
141
+
142
+ end
143
+
144
+ end
@@ -0,0 +1,135 @@
1
+ require File.dirname(__FILE__) + '/view_operations'
2
+ module IronNails
3
+
4
+ module Controller
5
+
6
+ class Base
7
+
8
+ include IronNails::Controller::ViewOperations
9
+ include IronNails::Logging::ClassLogger
10
+ include IronNails::Core::Observable
11
+
12
+
13
+ # Gets or sets the objects for the presenter
14
+ attr_accessor :objects
15
+
16
+ # Gets or sets the meta data for binding ui stuff we can't with Xaml (like Password on the PasswordBox)
17
+ attr_accessor :view_properties
18
+
19
+ # Gets or sets the commands for the presenter
20
+ attr_accessor :commands
21
+
22
+ # Gets or sets the presenters collection for this controller
23
+ attr_accessor :presenters
24
+
25
+ def controller_name
26
+ self.class.to_s.underscore.to_sym
27
+ end
28
+
29
+ def show_view
30
+ #log_on_error do
31
+ setup_for_showing_view
32
+ main_presenter.show_view
33
+ #end
34
+ end
35
+
36
+ def refresh_view(name=nil)
37
+ name ||= view_name.to_sym
38
+ setup_for_showing_view
39
+ nails_engine.refresh_view(nails_engine.find_view(controller_name, name))
40
+ on_view(name) do |proxy|
41
+ proxy.refresh
42
+ end
43
+ end
44
+
45
+ def on_view(name=nil, options={}, &b)
46
+ name ||= view_name.to_sym
47
+ if block_given?
48
+ setup_for_showing_view
49
+ nails_engine.on_view(controller_name, name, &b)
50
+ else
51
+ if options[:set].nil?
52
+ nails_engine.from_view(controller_name, name, options[:from], options[:get])
53
+ else
54
+ nails_engine.set_on_view(controller_name, name, options[:from], options[:set], options[:value])
55
+ end
56
+ end
57
+ end
58
+
59
+ # def from_view(name, options)
60
+ # name ||= view_name.to_sym
61
+ # nails_engine.from_view(controller_name, name, options[:from], options[:get])
62
+ # end
63
+
64
+ def child_view(view_name, options)
65
+ nails_engine.register_child_view :controller => controller_name, :container => options[:in], :name => view_name
66
+ end
67
+
68
+ def view_model(model_name, value)
69
+ instance_variable_set "@#{model_name}", value
70
+ refresh_objects
71
+ nails_engine.set_viewmodel_for self, model_name, value
72
+ end
73
+
74
+ def configure_viewmodel_for_showing
75
+ nails_engine.configure_view_for_showing
76
+ end
77
+
78
+ def to_update_ui_after(options, &b)
79
+ nails_engine.to_update_ui_after self, options, &b
80
+ end
81
+
82
+ def on_ui_thread(options=nil, &b)
83
+ nails_engine.on_ui_thread self, options, &b
84
+ end
85
+
86
+ def play_storyboard(name=nil, storyboard=nil)
87
+ nails_engine.play_storyboard self, (storyboard.nil? ? view_name : name), (storyboard.nil? ? name : storyboard)
88
+ end
89
+
90
+ def stop_storyboard(name=nil, storyboard=nil)
91
+ nails_engine.stop_storyboard self, (storyboard.nil? ? view_name : name), (storyboard.nil? ? name : storyboard)
92
+ end
93
+
94
+ def init_controller
95
+ end
96
+
97
+ def __init_controller__
98
+ @command_builder = CommandBuilder.new self
99
+ init_controller
100
+ end
101
+
102
+
103
+ class << self
104
+
105
+ alias_method :old_nails_controller_new, :new
106
+
107
+ def new
108
+ ctrlr = old_nails_controller_new
109
+ ctrlr.__init_controller__
110
+ ctrlr
111
+ end
112
+
113
+ def view_action(name, options={}, &b)
114
+ @commands ||= {}
115
+ options[:action] = b if block_given?
116
+ @commands[name] = options
117
+ end
118
+
119
+ def view_object(name, options = nil)
120
+ @objects ||= {}
121
+ @view_properties ||={}
122
+ unless options.is_a?(Hash) && !options[:element].nil?
123
+ @objects[name] = options.is_a?(Hash) ? options[:value] : options
124
+ else
125
+ @view_properties[name] = options
126
+ end
127
+
128
+ end
129
+
130
+ end
131
+ end
132
+
133
+ end
134
+
135
+ end
@@ -0,0 +1,101 @@
1
+ module IronNails
2
+
3
+ module Controller
4
+
5
+ # Encapsulates all the operations that have to do with the
6
+ # view model in controllers.
7
+ module ViewOperations
8
+
9
+ attr_accessor :nails_engine
10
+
11
+ # gets the view name for the class that includes this module
12
+ def view_name
13
+ self.class.demodulize.underscore.gsub(/_controller$/, '')
14
+ end
15
+
16
+ # gets the name of the view model class
17
+ def view_model_name
18
+ "#{view_name}_view_model"
19
+ end
20
+
21
+ def nails_engine=(value)
22
+ @nails_engine = value
23
+ init_view_manager
24
+ end
25
+
26
+ # initializes a new instance of the ViewManager
27
+ def init_view_manager
28
+
29
+ nails_engine.add_observer :refreshing_view, controller_name do
30
+ setup_for_showing_view
31
+ end
32
+ copy_vars
33
+ #end
34
+ end
35
+
36
+ def synchronise_with_view_model
37
+ nails_engine.synchronise_to_controller self
38
+ refresh_instance_variables
39
+ end
40
+
41
+ # setup the viewmodel for the current objects and command defintions
42
+ def setup_for_showing_view
43
+ #log_on_error do
44
+ objs = ModelCollection.generate_for refresh_objects
45
+ cmds = @command_builder.generate_for commands
46
+ cmds.each do |cmd|
47
+ cmd.add_observer(:reading_input) do
48
+ synchronise_with_view_model
49
+ end
50
+ end
51
+ nails_engine.initialize_with cmds, objs
52
+ logger.debug "initialized the view manager", IRONNAILS_FRAMEWORKNAME
53
+ #end
54
+ end
55
+
56
+ def add_action(name, options, &b)
57
+ options[:action] = b if block_given?
58
+ cmd_def = { "#{name}".to_sym => options }
59
+ nails_engine.add_command_to_view cmd_def
60
+ end
61
+
62
+ def refresh_objects
63
+ instance_variables.each do |var|
64
+ sym = var.gsub(/@/, "").to_sym
65
+ if objects.has_key?(sym)
66
+ val = instance_variable_get(var)
67
+ objects[sym] = val
68
+ end
69
+ end
70
+ objects
71
+ end
72
+
73
+ def refresh_instance_variables
74
+ objects.each do |k, v|
75
+ instance_variable_set "@#{k}", v
76
+ end
77
+ view_properties.each do |k, v|
78
+ val = on_view v[:view], :from => v[:element], :get => v[:property]
79
+ instance_variable_set "@#{k}", val
80
+ end
81
+ end
82
+
83
+ # copies an instance variable from the class object to this instance
84
+ def instance_variable_copy(var)
85
+ log_on_error do
86
+ val = self.class.instance_variable_get var
87
+ instance_variable_set var, val
88
+ end
89
+ end
90
+
91
+ # copies the instance variables from the class object to this instance
92
+ def copy_vars
93
+ self.class.instance_variables.each { |var| instance_variable_copy var }
94
+ end
95
+
96
+
97
+ end
98
+
99
+ end
100
+
101
+ end
@@ -0,0 +1,2 @@
1
+ require File.dirname(__FILE__) + '/controller/view_operations'
2
+ require File.dirname(__FILE__) + '/controller/base'
@@ -0,0 +1,15 @@
1
+ class Array
2
+
3
+ # Extracts options from a set of arguments. Removes and returns the last
4
+ # element in the array if it's a hash, otherwise returns a blank hash.
5
+ #
6
+ # def options(*args)
7
+ # args.extract_options!
8
+ # end
9
+ #
10
+ # options(1, 2) # => {}
11
+ # options(1, 2, :a => :b) # => {:a=>:b}
12
+ def extract_options!
13
+ last.is_a?(::Hash) ? pop : {}
14
+ end
15
+ end