Neurogami-jimpanzee 1.0.2.1 → 1.0.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,10 @@
1
+ == 1.0.3.1 / 2009-05-30
2
+
3
+ * Fixed bug in have_focus? and in generator code
4
+
5
+ == 1.0.2.2 / 2009-05-29
6
+ * Updated generator to include UI filem using SwingSet
7
+
1
8
  == 1.0.2.1 / 2009-05-16
2
9
  * Glommed source from Monkeybars gitorious repo
3
10
 
data/Jimpanzee.gemspec CHANGED
Binary file
data/Manifest.txt CHANGED
@@ -22,14 +22,14 @@ lib/monkeybars/view_nesting.rb
22
22
  lib/monkeybars/view_positioning.rb
23
23
  lib/jimpanzee_version.rb
24
24
  skeleton/Rakefile
25
- skeleton/lib/java/monkeybars-1.0.2.1.jar
25
+ skeleton/lib/java/monkeybars-1.0.3.1.jar
26
26
  skeleton/lib/ruby/README.txt
27
27
  skeleton/src/application_controller.rb
28
28
  skeleton/src/application_view.rb
29
29
  skeleton/src/main.rb
30
30
  skeleton/src/manifest.rb
31
31
  skeleton/src/resolver.rb
32
- skeleton/tasks/monkeybars.rake
32
+ skeleton/tasks/jimpanzee.rake
33
33
  spec/spec_helper.rb
34
34
  spec/unit/component_mixin_spec.rb
35
35
  spec/unit/controller_spec.rb
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- Jimpanzee 1.0.2.1
1
+ Monkeybars 1.0.3.1
2
2
 
3
3
  http://github.com/Neurogami/Jimpanzee/tree/master
4
4
 
data/bin/jimpanzee CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'fileutils'
4
4
  require 'rubygems'
5
- require 'monkeybars_version'
5
+ require 'jimpanzee_version'
6
6
 
7
7
  def help(message = nil)
8
8
  $stdout << message + "\n-----------------------------------\n" unless message.nil?
@@ -0,0 +1,9 @@
1
+ # :main: /home/james/ngprojects/Jimpanzee/README.md
2
+ #
3
+ module Jimpanzee
4
+ VERSION = "1.0.3.2"
5
+
6
+ def self.version
7
+ VERSION
8
+ end
9
+ end
@@ -84,10 +84,11 @@ module Monkeybars
84
84
  class Controller
85
85
  include TaskProcessor
86
86
  include EventHandlerRegistrationAndDispatchMixin
87
+
87
88
 
88
89
  @@instance_list ||= Hash.new {|hash, key| hash[key] = []}
89
90
  @@instance_lock ||= Hash.new {|hash, key| hash[key] = Mutex.new }
90
-
91
+
91
92
  # Controllers cannot be instantiated via a call to new, instead use instance
92
93
  # to retrieve the instance of the view. Currently only one instance of a
93
94
  # controller is created but in the near future a configurable limit will be
@@ -102,7 +103,7 @@ module Monkeybars
102
103
  end
103
104
  end
104
105
  end
105
-
106
+
106
107
  # Always returns a new instance of the controller.
107
108
  #
108
109
  # controller1 = MyController.create_instance
@@ -113,7 +114,7 @@ module Monkeybars
113
114
  def self.create_instance
114
115
  new
115
116
  end
116
-
117
+
117
118
  # Declares the view class (as a symbol) to use when instantiating the controller.
118
119
  #
119
120
  # set_view :MyView
@@ -175,7 +176,7 @@ module Monkeybars
175
176
  raise "'Update' is a reserved method name" if :update == method
176
177
  self.send(:class_variable_set, :@@update_method_name, method)
177
178
  end
178
-
179
+
179
180
  # Valid close actions are
180
181
  # * :nothing
181
182
  # * :close (default)
@@ -195,7 +196,7 @@ module Monkeybars
195
196
  def self.set_close_action(action)
196
197
  self.send(:class_variable_set, :@@close_action, action)
197
198
  end
198
-
199
+
199
200
  # Returns a frozen hash of ControllerName => [instances] pairs. This is
200
201
  # useful if you need to iterate over all active controllers to call update
201
202
  # or to check for a status.
@@ -208,29 +209,29 @@ module Monkeybars
208
209
  def self.active_controllers
209
210
  @@instance_list.clone.freeze
210
211
  end
211
-
212
+
212
213
  # See EventHandlerRegistrationAndDispatchMixin::ClassMethods#add_listener
213
214
  class << self
214
- alias_method :original_add_listener, :add_listener
215
+ alias_method :original_add_listener, :add_listener
215
216
  end
216
217
  def self.add_listener(details)
217
218
  original_add_listener(details)
218
219
  hide_protected_class_methods #workaround for JRuby bug #1283
219
220
  end
220
-
221
- private
221
+
222
+ private
222
223
  def self.hide_protected_class_methods #JRuby bug #1283
223
224
  private_class_method :new
224
225
  end
225
226
  hide_protected_class_methods
226
-
227
+
227
228
  def self.__new__
228
229
  object = new
229
230
  @@instance_list[self] << object
230
231
  @@instance_list[self].uniq!
231
232
  object
232
233
  end
233
-
234
+
234
235
  def initialize
235
236
  @model_has_block = false
236
237
  @__model = create_new_model unless self.class.model_class.nil?
@@ -239,25 +240,25 @@ module Monkeybars
239
240
  @__transfer = {}
240
241
  @__view_state = nil
241
242
  setup_implicit_and_explicit_event_handlers
242
-
243
+
243
244
  action = close_action
244
245
  unless [:nothing, :close, :exit, :dispose, :hide].include?(action)
245
246
  raise "Unknown close action: #{action}. Only :nothing, :close, :exit, :dispose, and :hide are supported"
246
247
  end
247
-
248
+
248
249
  window_type = if @__view.instance_variable_get(:@main_view_component).kind_of? javax.swing.JInternalFrame
249
250
  "internalFrame"
250
- else
251
+ else
251
252
  "window"
252
- end
253
-
253
+ end
254
+
254
255
  unless @__view.nil?
255
256
  @__view.close_action(Monkeybars::View::CloseActions::METHOD, MonkeybarsWindowAdapter.new(:"#{window_type}Closing" => self.method(:built_in_close_method)))
256
257
  end
257
-
258
+
258
259
  @closed = true
259
260
  end
260
-
261
+
261
262
  def close_action
262
263
  if self.class.class_variables.member?("@@close_action")
263
264
  action = self.class.send(:class_variable_get, :@@close_action)
@@ -266,7 +267,7 @@ module Monkeybars
266
267
  end
267
268
  action
268
269
  end
269
-
270
+
270
271
  public
271
272
  # Calls the method that was set using Controller.set_update_method. If no method has been set defined, this call is ignored.
272
273
  def update
@@ -281,7 +282,7 @@ module Monkeybars
281
282
  def update_view
282
283
  @__view.update(model, transfer)
283
284
  end
284
-
285
+
285
286
  # Sends a signal to the view. The view will process the signal (if it is
286
287
  # defined in the view via View.define_signal) and optionally invoke the
287
288
  #callback that is passed in as a block.
@@ -294,7 +295,7 @@ module Monkeybars
294
295
  def signal(signal_name, &callback)
295
296
  @__view.process_signal(signal_name, model, transfer, &callback)
296
297
  end
297
-
298
+
298
299
  # Nests a controller under this controller with the given key
299
300
  # def add_user_button_action_performed
300
301
  # @controllers << UserController.create_instance
@@ -308,7 +309,7 @@ module Monkeybars
308
309
  nested_view = sub_controller.instance_variable_get(:@__view)
309
310
  @__view.add_nested_view(name, nested_view, nested_view.instance_variable_get(:@main_view_component), model, transfer)
310
311
  end
311
-
312
+
312
313
  # Removes the nested controller with the given key
313
314
  # This does not do any cleanup on the nested controller's instance.
314
315
  #
@@ -326,6 +327,13 @@ module Monkeybars
326
327
  @__view.remove_nested_view(name, nested_view, nested_view.instance_variable_get(:@main_view_component), model, transfer)
327
328
  end
328
329
 
330
+
331
+ # You cannot jusrt call the Rubty 'exit' to exit the application process, you need the Java exit.
332
+ #
333
+ def application_exit
334
+ java.lang.System.exit(0)
335
+ end
336
+
329
337
  # Returns true if the view is visible, false otherwise
330
338
  def visible?
331
339
  @__view.visible?
@@ -335,7 +343,7 @@ module Monkeybars
335
343
  def hide
336
344
  @__view.hide
337
345
  end
338
-
346
+
339
347
  # Disposes the view
340
348
  def dispose
341
349
  @__view.dispose
@@ -345,7 +353,7 @@ module Monkeybars
345
353
  def show
346
354
  @__view.show
347
355
  end
348
-
356
+
349
357
  # True if close has been called on the controller
350
358
  def closed?
351
359
  @closed
@@ -370,19 +378,19 @@ module Monkeybars
370
378
  @@instance_list[self.class] << self
371
379
  end
372
380
  end
373
-
381
+
374
382
  if closed?
375
383
  load(*args, &block)
376
384
  @__view.on_first_update(model, transfer)
377
385
  clear_view_state
378
386
  @closed = false
379
387
  end
380
-
388
+
381
389
  show
382
-
390
+
383
391
  self #allow var assignment off of open, i.e. screen = SomeScreen.instance.open
384
392
  end
385
-
393
+
386
394
  # Stub to be overriden in sub-class. This is where you put the code you would
387
395
  # normally put in initialize, it will be called the first time open is called
388
396
  # on the controller.
@@ -397,9 +405,16 @@ module Monkeybars
397
405
  original_handle_event(component_name, event_name, event)
398
406
  clear_view_state
399
407
  end
408
+
409
+
400
410
 
411
+ def have_focus?
412
+ !@__view.have_focus?.nil?
413
+ end
414
+ alias_method :focused?, :have_focus?
415
+
401
416
  private
402
-
417
+
403
418
  # Returns the model object. This is the object that is passed to the view
404
419
  # when update_view is called. This model is *not* the same model that you
405
420
  # get from #view_state. Values that you want to propogate from the
@@ -407,7 +422,7 @@ module Monkeybars
407
422
  def model #:doc:
408
423
  @__model
409
424
  end
410
-
425
+
411
426
  # Returns the transfer object which is a transient hash passed to the view
412
427
  # whenever #update_view is called. The transfer is cleared after each call
413
428
  # to #update_view. The transfer is used to pass data to and
@@ -427,7 +442,7 @@ module Monkeybars
427
442
  def transfer #:doc:
428
443
  @__transfer
429
444
  end
430
-
445
+
431
446
  # Returns a ViewState object which contains a model and a transfer hash of the
432
447
  # view's current contents as defined by the view's mappings. This is for use in
433
448
  # event handlers. The contents of the model and transfer are *not* the same as
@@ -463,19 +478,19 @@ module Monkeybars
463
478
  def view_model # :doc:
464
479
  view_state.model
465
480
  end
466
-
481
+
467
482
  # Equivalent to view_state.transfer
468
483
  def view_transfer
469
484
  view_state.transfer
470
485
  end
471
-
486
+
472
487
  # Resets memoized view_state value. This is called automatically after each
473
488
  # event so it would only need to be called if view_state is used outside
474
489
  # of an event handler.
475
490
  def clear_view_state # :doc:
476
491
  @__view_state = nil
477
492
  end
478
-
493
+
479
494
  # This method is almost always used from within an event handler to propogate
480
495
  # the view_state to the model. Updates the model from the source provided
481
496
  # (typically from view_state). The list of properties defines what is modified
@@ -492,7 +507,7 @@ module Monkeybars
492
507
  def update_model(source, *properties) # :doc:
493
508
  update_provided_model(source, @__model, *properties)
494
509
  end
495
-
510
+
496
511
  # This method works just like Controller#update_model except that the target
497
512
  # is not implicitly the model. The second parameter is a target object for
498
513
  # the properties to be propogated to. This is useful if you have a composite
@@ -511,29 +526,29 @@ module Monkeybars
511
526
  destination.send("#{property}=", source.send(property))
512
527
  end
513
528
  end
514
-
529
+
515
530
  @@model_class_for_child_controller ||= {}
516
531
  def self.model_class
517
532
  @@model_class_for_child_controller[self]
518
533
  end
519
-
534
+
520
535
  def self.model_class=(model)
521
536
  @@model_class_for_child_controller[self] = model
522
537
  end
523
-
538
+
524
539
  @@view_class_for_child_controller ||= {}
525
540
  def self.view_class
526
541
  @@view_class_for_child_controller[self]
527
542
  end
528
-
543
+
529
544
  def self.view_class=(view)
530
545
  @@view_class_for_child_controller[self] = view
531
546
  end
532
-
547
+
533
548
  def sub_controllers
534
549
  @__sub_controllers ||= {}
535
550
  end
536
-
551
+
537
552
  def create_new_model
538
553
  begin
539
554
  unless self.class.model_class.first.nil?
@@ -548,7 +563,7 @@ module Monkeybars
548
563
  self.class.model_class.first.constantize.new
549
564
  end
550
565
  end
551
-
566
+
552
567
  def create_new_view
553
568
  begin
554
569
  self.class.view_class.constantize.new
@@ -581,11 +596,11 @@ module Monkeybars
581
596
  # an array so we emulate the array methods that are in common usage.
582
597
  class ViewState
583
598
  attr_reader :model, :transfer
584
-
599
+
585
600
  def initialize(model, transfer)
586
601
  @model, @transfer = model, transfer
587
602
  end
588
-
603
+
589
604
  def [](index)
590
605
  case index
591
606
  when 0
@@ -596,11 +611,11 @@ module Monkeybars
596
611
  nil
597
612
  end
598
613
  end
599
-
614
+
600
615
  def first
601
616
  @model
602
617
  end
603
-
618
+
604
619
  def last
605
620
  @transfer
606
621
  end
@@ -71,6 +71,8 @@ module Monkeybars
71
71
  METHOD = :method
72
72
  end
73
73
 
74
+
75
+
74
76
  private
75
77
  @@view_nestings_for_child_view ||= {}
76
78
  def self.view_nestings
@@ -437,6 +439,13 @@ module Monkeybars
437
439
  }
438
440
  end
439
441
 
442
+ def have_focus?
443
+ !@main_view_component.focus_owner?.nil?
444
+ end
445
+ alias_method :focused?, :have_focus?
446
+
447
+
448
+
440
449
  def update(model, transfer)
441
450
  self.class.view_mappings.select{|mapping| mapping.maps_to_view?}.each {|mapping| mapping.to_view(self, model, transfer)}
442
451
  transfer.clear
@@ -22,9 +22,19 @@ end
22
22
 
23
23
  require 'resolver'
24
24
 
25
+
26
+ # Good for when you replace an old version with a new version.
27
+ # Not good if you have more than one version in the same directory. :)
28
+ # But if take care to have only one monkeybars jar in the folder,
29
+ # then you don not need to re-edit this file.
30
+ def monkeybars_jar path
31
+ Dir.glob(path).select { |f| f =~ /(monkeybars-)(.+).jar$/}.first
32
+ end
33
+
25
34
  case Monkeybars::Resolver.run_location
26
35
  when Monkeybars::Resolver::IN_FILE_SYSTEM
27
- add_to_classpath '../lib/java/monkeybars-1.0.2.jar'
36
+ here = File.expand_path File.dirname(__FILE__)
37
+ add_to_classpath monkeybars_jar( here + '/../lib/java/*.jar' )
28
38
  end
29
39
 
30
40
  require 'monkeybars'
@@ -0,0 +1,173 @@
1
+ require 'fileutils'
2
+
3
+ desc "ALL, CONTROLLER, VIEW, MODEL, UI are valid options."
4
+ task 'generate'
5
+ rule(/^generate/) do |t|
6
+ ARGV[1..-1].each do |generator_command|
7
+ command, argument = generator_command.split("=")
8
+ case command
9
+ when "ALL"
10
+ generate_tuple argument
11
+ when "VIEW"
12
+ generate_view argument
13
+ when "CONTROLLER"
14
+ generate_controller argument
15
+ when "MODEL"
16
+ generate_model argument
17
+ when "UI"
18
+ generate_ui argument
19
+
20
+ else
21
+ $stdout << "Unknown generate target #{argument}"
22
+ end
23
+ end
24
+ end
25
+
26
+ def generate_tuple path
27
+ pwd = FileUtils.pwd
28
+ generate_controller path
29
+ FileUtils.cd pwd
30
+ generate_model path
31
+ FileUtils.cd pwd
32
+ generate_view path, using_ui = true
33
+ FileUtils.cd pwd
34
+ generate_ui path
35
+ end
36
+
37
+ def generate_controller path
38
+ name = setup_directory path
39
+ file_name = "#{name}_controller.rb"
40
+ name = camelize name
41
+ $stdout << "Generating controller #{name}Controller in file #{file_name}\n"
42
+ File.open(file_name, "w") do |controller_file|
43
+ controller_file << <<-ENDL
44
+ class #{name}Controller < ApplicationController
45
+ set_model '#{name}Model'
46
+ set_view '#{name}View'
47
+ set_close_action :exit
48
+ end
49
+ ENDL
50
+ end
51
+ end
52
+
53
+ def generate_model(path)
54
+ name = setup_directory(path)
55
+ file_name = "#{name}_model.rb"
56
+ name = camelize(name)
57
+ $stdout << "Generating model #{name}Model in file #{file_name}\n"
58
+ File.open(file_name, "w") do |model_file|
59
+ model_file << <<-ENDL
60
+ class #{name}Model
61
+
62
+ end
63
+ ENDL
64
+ end
65
+ end
66
+
67
+ def generate_view path, using_ui = false
68
+ name = setup_directory path
69
+ file_name = "#{name}_view.rb"
70
+ cname = camelize(name)
71
+ puts "Generating view #{cname}View in file #{file_name}"
72
+
73
+
74
+ require_ui = using_ui ? "require '#{name}_ui'" : ''
75
+ java_class = using_ui ? "#{cname}Frame" : "'REPLACE_ME' "
76
+ view_file = %~
77
+ #{require_ui}
78
+
79
+ class #{cname}View < ApplicationView
80
+ set_java_class #{java_class}
81
+
82
+ # Put your load behavior here:
83
+ def load
84
+ move_to_center
85
+ end
86
+
87
+ end
88
+ ~
89
+
90
+ File.open(file_name, "w") {|f| f.puts view_file}
91
+
92
+
93
+ end
94
+
95
+
96
+
97
+ def generate_ui path
98
+ name = setup_directory path
99
+ file_name = "#{name}_ui.rb"
100
+ name = camelize(name)
101
+ $stdout << "Generating ui #{name}Frame in file #{file_name}\n"
102
+ source = %~# Must have the Neurogami::SwingSet files in your project
103
+ require 'swingset'
104
+
105
+ include Neurogami::SwingSet::Core
106
+
107
+ class #{name}Frame < Frame
108
+ FRAME_WIDTH = 420
109
+ FRAME_HEIGHT = 430
110
+
111
+ LABEL_HEIGHT = 20
112
+ LABEL_WIDTH = 200
113
+
114
+ # Need accessor methods for you UI components:
115
+ attr_accessor :example_label, :example_value
116
+
117
+
118
+ def initialize *args
119
+ super
120
+ self.minimum_width = FRAME_WIDTH
121
+ self.minimum_height = FRAME_HEIGHT
122
+ self.setSize FRAME_HEIGHT, FRAME_WIDTH
123
+ set_up_components
124
+ end
125
+
126
+
127
+ def set_up_components
128
+ # Assumes you have the MiG layout jar in your project and
129
+ # bundled with the app.
130
+
131
+ component_panel = Panel.new
132
+
133
+ component_panel.background_color 255, 255, 255
134
+ component_panel.size FRAME_WIDTH, FRAME_HEIGHT
135
+
136
+ @example_label = Label.new do |l|
137
+ l.font = Font.new "Lucida Grande", 0, 18
138
+ l.minimum_dimensions LABEL_WIDTH, LABEL_HEIGHT
139
+ l.text = "Example label"
140
+ end
141
+
142
+ @example_value = Label.new do |l|
143
+ l.font = Font.new "Lucida Grande", 0, 18
144
+ l.minimum_dimensions LABEL_WIDTH, LABEL_HEIGHT
145
+ l.text = "An example"
146
+ end
147
+
148
+ component_panel.add @example_label, 'grow x'
149
+ component_panel.add @example_value, "gap unrelated"
150
+
151
+ add component_panel
152
+
153
+ end
154
+ end ~
155
+
156
+ File.open(file_name, "w"){ |f| f.puts source }
157
+ end
158
+
159
+ def setup_directory(path)
160
+ FileUtils.mkdir_p path.gsub("\\", "/")
161
+ FileUtils.cd(path)
162
+ path.split("/").last
163
+ end
164
+
165
+ def camelize(name, first_letter_in_uppercase = true)
166
+ name = name.to_s
167
+ if first_letter_in_uppercase
168
+ name.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
169
+ else
170
+ name[0..0] + camelize(name[1..-1])
171
+ end
172
+ end
173
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Neurogami-jimpanzee
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2.1
4
+ version: 1.0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Britt
@@ -41,6 +41,7 @@ files:
41
41
  - bin/jimpanzee
42
42
  - lib/monkeybars.rb
43
43
  - lib/monkeybars/controller.rb
44
+ - lib/jimpanzee_version.rb
44
45
  - lib/monkeybars/debug.rb
45
46
  - lib/monkeybars/event_handler.rb
46
47
  - lib/monkeybars/event_handler_registration_and_dispatch_mixin.rb
@@ -54,14 +55,14 @@ files:
54
55
  - lib/monkeybars/view_nesting.rb
55
56
  - lib/monkeybars/view_positioning.rb
56
57
  - lib/monkeybars/view.rb
57
- - skeleton/tasks/monkeybars.rake
58
+ - skeleton/tasks/jimpanzee.rake
58
59
  - skeleton/src/application_view.rb
59
60
  - skeleton/src/main.rb
60
61
  - skeleton/src/application_controller.rb
61
62
  - skeleton/src/resolver.rb
62
63
  - skeleton/src/manifest.rb
63
64
  - skeleton/lib/java/README.txt
64
- - skeleton/lib/java/monkeybars-1.0.2.1.jar
65
+ - skeleton/lib/java/monkeybars-1.0.3.1.jar
65
66
  - skeleton/lib/ruby/README.md
66
67
  - skeleton/lib/ruby/README.txt
67
68
  - skeleton/Rakefile
@@ -1,89 +0,0 @@
1
- require 'fileutils'
2
-
3
- desc "ALL, CONTROLLER, VIEW, MODEL are valid options."
4
- task 'generate'
5
- rule(/^generate/) do |t|
6
- ARGV[1..-1].each do |generator_command|
7
- command, argument = generator_command.split("=")
8
- case command
9
- when "ALL"
10
- generate_tuple(argument)
11
- when "VIEW"
12
- generate_view(argument)
13
- when "CONTROLLER"
14
- generate_controller(argument)
15
- when "MODEL"
16
- generate_model(argument)
17
- else
18
- $stdout << "Unknown generate target #{argument}"
19
- end
20
- end
21
- end
22
-
23
- def generate_tuple(path)
24
- pwd = FileUtils.pwd
25
- generate_controller(path)
26
- FileUtils.cd(pwd)
27
- generate_model(path)
28
- FileUtils.cd(pwd)
29
- generate_view(path)
30
- end
31
-
32
- def generate_controller(path)
33
- name = setup_directory(path)
34
- file_name = "#{name}_controller.rb"
35
- name = camelize(name)
36
- $stdout << "Generating controller #{name}Controller in file #{file_name}\n"
37
- File.open(file_name, "w") do |controller_file|
38
- controller_file << <<-ENDL
39
- class #{name}Controller < ApplicationController
40
- set_model '#{name}Model'
41
- set_view '#{name}View'
42
- set_close_action :exit
43
- end
44
- ENDL
45
- end
46
- end
47
-
48
- def generate_model(path)
49
- name = setup_directory(path)
50
- file_name = "#{name}_model.rb"
51
- name = camelize(name)
52
- $stdout << "Generating model #{name}Model in file #{file_name}\n"
53
- File.open(file_name, "w") do |model_file|
54
- model_file << <<-ENDL
55
- class #{name}Model
56
-
57
- end
58
- ENDL
59
- end
60
- end
61
-
62
- def generate_view(path)
63
- name = setup_directory(path)
64
- file_name = "#{name}_view.rb"
65
- name = camelize(name)
66
- $stdout << "Generating view #{name}View in file #{file_name}\n"
67
- File.open(file_name, "w") do |view_file|
68
- view_file << <<-ENDL
69
- class #{name}View < ApplicationView
70
- set_java_class ''
71
- end
72
- ENDL
73
- end
74
- end
75
-
76
- def setup_directory(path)
77
- FileUtils.mkdir_p path.gsub("\\", "/")
78
- FileUtils.cd(path)
79
- path.split("/").last
80
- end
81
-
82
- def camelize(name, first_letter_in_uppercase = true)
83
- name = name.to_s
84
- if first_letter_in_uppercase
85
- name.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
86
- else
87
- name[0..0] + camelize(name[1..-1])
88
- end
89
- end