ironnails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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