limelight 0.4.0-java → 0.5.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. data/lib/limelight.jar +0 -0
  2. data/lib/limelight/animation.rb +4 -3
  3. data/lib/limelight/builtin/players.rb +3 -1
  4. data/lib/limelight/builtin/players/image.rb +4 -0
  5. data/lib/limelight/builtin/players/stage_mover.rb +31 -0
  6. data/lib/limelight/builtin/players/stage_sizer.rb +34 -0
  7. data/lib/limelight/builtin/utilities_production/alert/players/alert.rb +11 -0
  8. data/lib/limelight/builtin/utilities_production/alert/props.rb +3 -0
  9. data/lib/limelight/builtin/utilities_production/alert/styles.rb +7 -0
  10. data/lib/limelight/builtin/utilities_production/incompatible_version/props.rb +3 -0
  11. data/lib/limelight/builtin/utilities_production/incompatible_version/styles.rb +3 -0
  12. data/lib/limelight/builtin/utilities_production/production.rb +3 -0
  13. data/lib/limelight/builtin/utilities_production/stages.rb +3 -0
  14. data/lib/limelight/builtin/utilities_production/styles.rb +3 -0
  15. data/lib/limelight/casting_director.rb +1 -1
  16. data/lib/limelight/commands/create_command.rb +33 -19
  17. data/lib/limelight/commands/freeze_command.rb +20 -5
  18. data/lib/limelight/commands/open_command.rb +2 -1
  19. data/lib/limelight/dsl/styles_builder.rb +40 -18
  20. data/lib/limelight/file_loader.rb +1 -1
  21. data/lib/limelight/gems.rb +3 -1
  22. data/lib/limelight/java_couplings.rb +1 -0
  23. data/lib/limelight/producer.rb +4 -47
  24. data/lib/limelight/production.rb +20 -0
  25. data/lib/limelight/prop.rb +32 -32
  26. data/lib/limelight/scene.rb +2 -1
  27. data/lib/limelight/specs/spec_helper.rb +24 -22
  28. data/lib/limelight/specs/test_scene_opener.rb +60 -0
  29. data/lib/limelight/string.rb +1 -1
  30. data/lib/limelight/studio.rb +28 -9
  31. data/lib/limelight/templates/production_templater.rb +5 -2
  32. data/lib/limelight/templates/scene_templater.rb +7 -6
  33. data/lib/limelight/templates/sources/production/production.rb.template +1 -1
  34. data/lib/limelight/templates/sources/production/spec/spec_helper.rb.template +8 -1
  35. data/lib/limelight/version.rb +1 -1
  36. data/productions/examples/sandbox/alerts/incompatible_production/default_scene/props.rb +3 -0
  37. data/productions/examples/sandbox/alerts/incompatible_production/default_scene/styles.rb +3 -0
  38. data/productions/examples/sandbox/alerts/incompatible_production/production.rb +3 -0
  39. data/productions/examples/sandbox/alerts/incompatible_production/spec/default_scene/default_scene_spec.rb +3 -0
  40. data/productions/examples/sandbox/alerts/incompatible_production/spec/spec_helper.rb +3 -0
  41. data/productions/examples/sandbox/alerts/incompatible_production/stages.rb +3 -0
  42. data/productions/examples/sandbox/alerts/incompatible_production/styles.rb +3 -0
  43. data/productions/examples/sandbox/alerts/players/alerts.rb +3 -0
  44. data/productions/examples/sandbox/alerts/props.rb +3 -0
  45. data/productions/examples/sandbox/alerts/styles.rb +3 -0
  46. data/productions/examples/sandbox/background_images/props.rb +3 -0
  47. data/productions/examples/sandbox/header.rb +1 -0
  48. data/productions/examples/sandbox/images_scene/props.rb +8 -0
  49. data/productions/examples/sandbox/kiosk/players/kiosk.rb +3 -0
  50. data/productions/examples/sandbox/kiosk/props.rb +3 -0
  51. data/productions/examples/sandbox/kiosk/styles.rb +3 -0
  52. data/productions/examples/sandbox/spec/alerts/alerts_spec.rb +3 -0
  53. data/productions/examples/sandbox/stage_handles/players/sizer.rb +35 -0
  54. data/productions/examples/sandbox/stage_handles/props.rb +17 -0
  55. data/productions/examples/sandbox/stage_handles/styles.rb +58 -0
  56. data/productions/playbills.lll +1 -0
  57. data/productions/startup/production.rb +3 -0
  58. data/productions/startup/spec/default_scene/default_scene_spec.rb +3 -0
  59. data/productions/startup/spec/spec_helper.rb +3 -0
  60. data/productions/startup/styles.rb +3 -0
  61. data/spec/{builtin → limelight/builtin}/players/button_spec.rb +1 -1
  62. data/spec/{builtin → limelight/builtin}/players/check_box_spec.rb +1 -1
  63. data/spec/{builtin → limelight/builtin}/players/combo_box_spec.rb +1 -1
  64. data/spec/{builtin → limelight/builtin}/players/image_spec.rb +1 -2
  65. data/spec/{builtin → limelight/builtin}/players/password_box_spec.rb +1 -1
  66. data/spec/{builtin → limelight/builtin}/players/radio_button_spec.rb +1 -1
  67. data/spec/limelight/builtin/players/stage_mover_spec.rb +36 -0
  68. data/spec/limelight/builtin/players/stage_sizer_spec.rb +40 -0
  69. data/spec/{builtin → limelight/builtin}/players/text_area_spec.rb +1 -1
  70. data/spec/{builtin → limelight/builtin}/players/text_box_spec.rb +1 -1
  71. data/spec/limelight/builtin/utilities_production/spec_helper.rb +7 -0
  72. data/spec/{builtin → limelight/builtin}/utilities_production/utilities_production_spec.rb +3 -0
  73. data/spec/{casting_director_spec.rb → limelight/casting_director_spec.rb} +1 -1
  74. data/spec/{client → limelight/client}/playbills_spec.rb +1 -1
  75. data/spec/{commands → limelight/commands}/command_spec.rb +1 -1
  76. data/spec/{commands → limelight/commands}/create_command_spec.rb +23 -19
  77. data/spec/limelight/commands/freeze_command_spec.rb +143 -0
  78. data/spec/{commands → limelight/commands}/help_command_spec.rb +1 -1
  79. data/spec/{commands → limelight/commands}/open_command_spec.rb +1 -1
  80. data/spec/{commands → limelight/commands}/pack_command_spec.rb +1 -1
  81. data/spec/{commands → limelight/commands}/unpack_command_spec.rb +1 -1
  82. data/spec/{data_spec.rb → limelight/data_spec.rb} +1 -1
  83. data/spec/{dsl → limelight/dsl}/prop_builder_spec.rb +1 -1
  84. data/spec/{dsl → limelight/dsl}/stage_builder_spec.rb +1 -1
  85. data/spec/{dsl → limelight/dsl}/styles_builder_spec.rb +52 -13
  86. data/spec/{file_chooser_spec.rb → limelight/file_chooser_spec.rb} +1 -1
  87. data/spec/{file_filter_spec.rb → limelight/file_filter_spec.rb} +1 -1
  88. data/spec/{file_loader_spec.rb → limelight/file_loader_spec.rb} +1 -1
  89. data/spec/{gems_spec.rb → limelight/gems_spec.rb} +10 -4
  90. data/spec/{java_util_spec.rb → limelight/java_util_spec.rb} +1 -1
  91. data/spec/{main_spec.rb → limelight/main_spec.rb} +1 -1
  92. data/spec/{paint_action_spec.rb → limelight/paint_action_spec.rb} +1 -1
  93. data/spec/{pen_spec.rb → limelight/pen_spec.rb} +1 -1
  94. data/spec/{producer_spec.rb → limelight/producer_spec.rb} +4 -12
  95. data/spec/{production_spec.rb → limelight/production_spec.rb} +32 -11
  96. data/spec/{prop_spec.rb → limelight/prop_spec.rb} +30 -2
  97. data/spec/{scene_spec.rb → limelight/scene_spec.rb} +28 -2
  98. data/spec/{stage_spec.rb → limelight/stage_spec.rb} +1 -1
  99. data/spec/{string_spec.rb → limelight/string_spec.rb} +1 -1
  100. data/spec/{studio_spec.rb → limelight/studio_spec.rb} +16 -1
  101. data/spec/{styles_spec.rb → limelight/styles_spec.rb} +1 -1
  102. data/spec/{templates → limelight/templates}/production_templater_spec.rb +17 -6
  103. data/spec/{templates → limelight/templates}/scene_templater_spec.rb +15 -4
  104. data/spec/{templates → limelight/templates}/templater_logger_spec.rb +1 -1
  105. data/spec/{templates → limelight/templates}/templater_spec.rb +1 -1
  106. data/spec/{theater_spec.rb → limelight/theater_spec.rb} +1 -1
  107. data/spec/{util → limelight/util}/downloader_spec.rb +1 -1
  108. data/spec/spec_helper.rb +11 -0
  109. metadata +62 -70
  110. data/lib/limelight/dsl/production_builder.rb +0 -71
  111. data/spec/builtin/utilities_production/spec_helper.rb +0 -4
  112. data/spec/commands/freeze_command_spec.rb +0 -62
  113. data/spec/dsl/production_builder_spec.rb +0 -46
data/lib/limelight.jar CHANGED
Binary file
@@ -3,7 +3,7 @@
3
3
 
4
4
  module Limelight
5
5
 
6
- # An object to manage a seqeunce of changes, assuably to a prop. The Animation object is constructed with options
6
+ # An object to manage a seqeunce of changes, assumedly to a prop. The Animation object is constructed with options
7
7
  # and a block. Once the Animation is started, the block is invoked repeatedly until the Animation is stopped.
8
8
  #
9
9
  # Although, this object does not update the screen, it provides a means to perform sequential updates in evenly
@@ -11,8 +11,9 @@ module Limelight
11
11
  #
12
12
  class Animation < Limelight::Background::Animation
13
13
 
14
- # A Prop and block are required to construct an Animation. Options may include :name (string), :updates_per_second
15
- # (int defaults to 60)
14
+ # A Prop and block are required to construct an Animation. Options may include
15
+ # 1. :name (string)
16
+ # 2. :updates_per_second (int defaults to 60)
16
17
  #
17
18
  # animation = Animation.new(prop, Proc.new { "do something"}, :updates_per_second => 20)
18
19
  # animation.start
@@ -11,4 +11,6 @@ require 'limelight/builtin/players/combo_box_popup_list_item'
11
11
  require 'limelight/builtin/players/combo_box_popup_list'
12
12
  require 'limelight/builtin/players/curtains'
13
13
  require 'limelight/builtin/players/image'
14
- require "limelight/builtin/players/password_box"
14
+ require "limelight/builtin/players/password_box"
15
+ require "limelight/builtin/players/stage_mover"
16
+ require "limelight/builtin/players/stage_sizer"
@@ -23,6 +23,10 @@ module Limelight
23
23
  image_panel.image_file = path
24
24
  end
25
25
 
26
+ def image_data=(data_hash)
27
+ image_panel.setImageData(data_hash[:data])
28
+ end
29
+
26
30
  def image
27
31
  return image_panel.image_file
28
32
  end
@@ -0,0 +1,31 @@
1
+ #- Copyright � 2008-2009 8th Light, Inc. All Rights Reserved.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ module Limelight
5
+ module Builtin
6
+ module Players
7
+
8
+ module StageMover
9
+
10
+ def mouse_pressed(e)
11
+ @drag_reference_x = e.x
12
+ @drag_reference_y = e.y
13
+ end
14
+
15
+ def mouse_dragged(e)
16
+ dx = e.x - @drag_reference_x
17
+ dy = e.y - @drag_reference_y
18
+
19
+ frame = scene.stage.frame
20
+ location = frame.location
21
+
22
+ location.x += dx
23
+ location.y += dy
24
+ frame.location = location
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,34 @@
1
+ #- Copyright � 2008-2009 8th Light, Inc. All Rights Reserved.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ module Limelight
5
+ module Builtin
6
+ module Players
7
+
8
+ module StageSizer
9
+
10
+ def mouse_pressed(e)
11
+ @sizer_reference_x = e.x
12
+ @sizer_reference_y = e.y
13
+ @sizer_frame = scene.stage.frame
14
+ @sizer_reference_size = @sizer_frame.size
15
+ end
16
+
17
+ def mouse_dragged(e)
18
+ return unless @sizer_frame
19
+ dx = e.x - @sizer_reference_x
20
+ dy = e.y - @sizer_reference_y
21
+
22
+ @sizer_reference_x = e.x
23
+ @sizer_reference_y = e.y
24
+
25
+ @sizer_reference_size.width += dx
26
+ @sizer_reference_size.height += dy
27
+ @sizer_frame.size = @sizer_reference_size
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,11 @@
1
+ module Alert
2
+
3
+ prop_reader :message
4
+
5
+ def scene_opened(e)
6
+ if message.area.height == message.style.max_height.to_i
7
+ message.style.vertical_scrollbar = :on
8
+ end
9
+ end
10
+
11
+ end
@@ -1,3 +1,6 @@
1
+ #- Copyright � 2008-2009 8th Light, Inc. All Rights Reserved.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
1
4
  title :id => "title", :text => "Limelight Alert"
2
5
  advise :id => "message", :text => @message
3
6
  buttons do
@@ -1,7 +1,14 @@
1
+ #- Copyright � 2008-2009 8th Light, Inc. All Rights Reserved.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
1
4
  alert {
2
5
  background_color "#b2db5b"
3
6
  secondary_background_color "#8fc927"
4
7
  gradient :on
5
8
  gradient_angle 270
6
9
  padding 20
10
+ }
11
+
12
+ advise {
13
+ max_height 500
7
14
  }
@@ -1,3 +1,6 @@
1
+ #- Copyright � 2008-2009 8th Light, Inc. All Rights Reserved.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
1
4
  title :text => "Incompatible Version"
2
5
  label :text => "Production:"
3
6
  bold_label :id => "production_name_label", :text => @production_name
@@ -1,3 +1,6 @@
1
+ #- Copyright � 2008-2009 8th Light, Inc. All Rights Reserved.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
1
4
  incompatible_version {
2
5
  background_color "#b2db5b"
3
6
  secondary_background_color "#8fc927"
@@ -1,3 +1,6 @@
1
+ #- Copyright � 2008-2009 8th Light, Inc. All Rights Reserved.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
1
4
  require 'monitor'
2
5
 
3
6
  module Production
@@ -1,3 +1,6 @@
1
+ #- Copyright � 2008-2009 8th Light, Inc. All Rights Reserved.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
1
4
  #stage "default" do
2
5
  # default_scene :incompatible_version
3
6
  # location :center, :center
@@ -1,3 +1,6 @@
1
+ #- Copyright � 2008-2009 8th Light, Inc. All Rights Reserved.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
1
4
  title {
2
5
  width "100%"
3
6
  font_size 30
@@ -89,7 +89,7 @@ module Limelight
89
89
  private ###############################################
90
90
 
91
91
  def locate_player
92
- player_filename = File.join(@prop.scene.path.to_s, "players", "#{@player_name}.rb")
92
+ player_filename = File.join(@prop.scene.path.to_s, "players", "#{@player_name}.rb")
93
93
  if !@loader.exists?(player_filename)
94
94
  if @prop.scene.production && @prop.scene.path != @prop.scene.production.path
95
95
  player_filename = File.join(@prop.scene.production.path.to_s, "players", "#{@player_name}.rb")
@@ -8,17 +8,19 @@ module Limelight
8
8
 
9
9
  # See the following usages summary
10
10
  #
11
- # Usage: limelight create [options] <production|scene> <path>
12
- # Creates the directories and files for a production and/or scene.
13
- # options:
14
- # -h, --help Prints this usage summary.
15
- # -s, --scene=<name> Name of scene when creating a production. Defaults to 'default_scene'.
11
+ # Usage: limelight create [options] <production|scene> <path>
12
+ # Creates the directories and files for a production and/or scene.
13
+ # options:
14
+ # -h, --help Prints this usage summary.
15
+ # -s, --scene=<name> Name of scene when creating a production. Defaults to 'default_scene'.
16
+ # -p, --production_path=<path> Path of production to contain scene. Defaults to '.'.
17
+ # -S, --spec_path=<path> Path to spec directory, relative to <production_path>. Defaults to 'spec'.
16
18
  #
17
19
  # Assume you wanted to create a new production named "love_story" containing two scenes, "midnight_romance" and
18
20
  # "happily_ever_after". The following commands would created all the needed files.
19
21
  #
20
22
  # $ jruby -S limelight create -s midnight_romance production love_story
21
- # $ jruby -S limelight create scene love_story/happily_ever_after
23
+ # $ jruby -S limelight create -p love_story scene happily_ever_after
22
24
  #
23
25
  class CreateCommand < Command
24
26
 
@@ -28,33 +30,30 @@ module Limelight
28
30
  return "Creates the directories and files for a production and/or scene."
29
31
  end
30
32
 
31
- attr_reader :template_type, :path, :scene_name, :production_path #:nodoc:
33
+ attr_reader :template_type, :scene_name, :production_path, :spec_path #:nodoc:
32
34
 
33
35
  protected ###########################################
34
36
 
35
37
  def initialize #:nodoc:
36
38
  @scene_name = "default_scene"
37
39
  @production_path = "."
38
- @actions = {}
39
- @actions["production"] = :create_production
40
- @actions["scene"] = :create_scene
41
40
  end
42
41
 
43
42
  def process #:nodoc:
44
- action = @actions[@template_type]
45
- self.send action
43
+ create_method = "create_#{@template_type}".to_s
44
+ self.send create_method
46
45
  end
47
46
 
48
47
  def parameter_description #:nodoc:
49
- return "[options] <production|scene> <name>"
48
+ return "[options] <production|scene> <path>"
50
49
  end
51
50
 
52
51
  def parse_remainder(args) #:nodoc:
53
52
  @template_type = args.shift
54
53
  raise "Missing template type" if @template_type.nil?
55
- raise "Unknown template type: #{@template_type}" if @actions[@template_type].nil?
56
- @path = args.shift
57
- raise "Missing path parameter" if @path.nil?
54
+ raise "Unknown template type: #{@template_type}" if !["production", "scene"].include?(@template_type)
55
+ self.send "parse_#{@template_type}".to_sym, args
56
+ @spec_path = File.join(@production_path, "spec") unless @spec_path
58
57
  end
59
58
 
60
59
  def do_requires #:nodoc:
@@ -65,17 +64,32 @@ module Limelight
65
64
  def build_options(spec) #:nodoc:
66
65
  spec.on("-s <name>", "--scene=<name>", "Name of scene when creating a production. Defaults to 'default_scene'.") { |value| @scene_name = value}
67
66
  spec.on("-p <path>", "--production_path=<path>", "Path of production to contain scene. Defaults to '.'.") { |value| @production_path = value}
67
+ spec.on("-S <path>", "--spec_path=<path>", "Path to spec directory, relative to <production_path>. Defaults to 'spec'.") { |value| @spec_path = value}
68
68
  end
69
69
 
70
70
  private #############################################
71
71
 
72
+ def parse_production(args)
73
+ @production_path = args.shift
74
+ raise "Missing production path parameter" if @production_path.nil?
75
+ end
76
+
77
+ def parse_scene(args)
78
+ @scene_name = args.shift
79
+ raise "Missing scene name/path parameter" if @scene_name.nil?
80
+ end
81
+
72
82
  def create_production
73
- Templates::ProductionTemplater.new(@path, @scene_name).generate
74
- Templates::SceneTemplater.new(@path, @scene_name).generate
83
+ Templates::ProductionTemplater.new(options_hash).generate
84
+ Templates::SceneTemplater.new(options_hash).generate
75
85
  end
76
86
 
77
87
  def create_scene
78
- Templates::SceneTemplater.new(@production_path, @path).generate
88
+ Templates::SceneTemplater.new(options_hash).generate
89
+ end
90
+
91
+ def options_hash
92
+ return {:production_path => @production_path, :scene_path => @scene_name, :spec_path => @spec_path}
79
93
  end
80
94
 
81
95
  end
@@ -40,7 +40,7 @@ module Limelight
40
40
  def process #:nodoc:
41
41
  check_production_path
42
42
  gem_path = is_gem_file?(@gem_name) ? @gem_name : find_system_gem
43
- raise "Gem file does not exist: #{gem_path}" if !File.exists?(gem_path)
43
+ raise "Gem file does not exist: #{gem_path}" unless File.exists?(gem_path)
44
44
  freeze_gem(gem_path)
45
45
  end
46
46
 
@@ -94,20 +94,35 @@ module Limelight
94
94
  gem_installer = Gem::Installer.new(gem_path)
95
95
  @templater.logger.log("unpacking gem", @gem_dir_path)
96
96
  gem_installer.unpack(@gem_dir_path)
97
+
98
+ copy_gem_spec
99
+ end
100
+
101
+ def copy_gem_spec
102
+ @templater.directory(File.join("__resources", "gems", "specifications"))
103
+ FileUtils.copy(gemspec_path, local_gemspec_path) if File.exists?(gemspec_path)
97
104
 
98
105
  install_limelight_hook
99
106
  end
100
-
107
+
108
+ def gemspec_path
109
+ return File.join(Gem.dir, "specifications", "#{@gem_dir_name}.gemspec")
110
+ end
111
+
112
+ def local_gemspec_path
113
+ return File.join(@production_path, "__resources", "gems", "specifications")
114
+ end
115
+
101
116
  def establish_gem_dir
102
117
  @templater = Templates::Templater.new(@production_path)
103
- @gem_dir_path = File.join(@production_path, "__resources", "gems", @gem_dir_name)
118
+ @gem_dir_path = File.join(@production_path, "__resources", "gems", "gems", @gem_dir_name)
104
119
  raise "The gem (#{@gem_dir_name}) is already frozen." if File.exists?(@gem_dir_path)
105
- @templater.directory(File.join("__resources", "gems", @gem_dir_name))
120
+ @templater.directory(File.join("__resources", "gems", "gems", @gem_dir_name))
106
121
  end
107
122
 
108
123
  def install_limelight_hook
109
124
  tokens = { :GEM_NAME => @gem_dir_name, :PATHS => @gem_spec.require_paths.inspect }
110
- @templater.file(File.join("__resources", "gems", @gem_dir_name, "limelight_init.rb"), "freezing/limelight_init.rb.template", tokens)
125
+ @templater.file(File.join("__resources", "gems", "gems", @gem_dir_name, "limelight_init.rb"), "freezing/limelight_init.rb.template", tokens)
111
126
  end
112
127
 
113
128
  end
@@ -12,6 +12,7 @@ module Limelight
12
12
  # Open a limelight production.
13
13
  # options:
14
14
  # -h, --help Prints this usage summary.
15
+ # -d, --drb_port=<port> Publish the Studio using DRb on the specified port.
15
16
  #
16
17
  class OpenCommand < Command
17
18
 
@@ -41,7 +42,7 @@ module Limelight
41
42
  end
42
43
 
43
44
  def build_options(spec) #:nodoc:
44
- spec.on("-d <port>", "--drb_port=<port>", "Publish the opened production using DRb on the specified port.") { |value| @drb_port = value }
45
+ spec.on("-d <port>", "--drb_port=<port>", "Publish the Studio using DRb on the specified port.") { |value| @drb_port = value }
45
46
  end
46
47
 
47
48
  def parse_remainder(args)
@@ -9,10 +9,22 @@ module Limelight
9
9
  #
10
10
  # See Limelight::Stylesbuilder, Limelight::Stylebuilder
11
11
  #
12
- def self.build_styles(style_hash = nil, &block)
13
- builder = DSL::StylesBuilder.new(style_hash)
12
+ def self.build_styles(extendable_styles = nil, &block)
13
+ builder = DSL::StylesBuilder.new(extendable_styles)
14
14
  builder.instance_eval(&block) if block
15
- return builder.__styles__
15
+ return builder.__styles
16
+ end
17
+
18
+ def self.build_styles_from_file(filename, extendable_styles = nil)
19
+ content = IO.read(filename)
20
+ styles = Limelight.build_styles(extendable_styles) do
21
+ begin
22
+ eval content
23
+ rescue Exception => e
24
+ raise Limelight::DSL::BuildException.new(filename, content, e)
25
+ end
26
+ end
27
+ return styles
16
28
  end
17
29
 
18
30
  module DSL
@@ -50,20 +62,27 @@ module Limelight
50
62
 
51
63
  Limelight::Util.lobotomize(self)
52
64
 
53
- attr_reader :__styles__
65
+ attr_reader :__styles, :__extendable_styles
54
66
 
55
- def initialize(style_hash = nil)
56
- @__styles__ = style_hash || {}
67
+ def initialize(extendable_styles = nil)
68
+ @__extendable_styles = extendable_styles || {}
69
+ @__styles = {}
57
70
  end
58
71
 
59
72
  def method_missing(sym, &block) #:nodoc:
60
- __add_style__(sym.to_s, &block)
73
+ __add_style(sym.to_s, &block)
61
74
  end
62
75
 
63
- def __add_style__(name, &block) #:nodoc:
64
- builder = StyleBuilder.new(name, self)
76
+ def __add_style(name, &block) #:nodoc:
77
+ style = @__styles[name]
78
+ if style == nil
79
+ style = Styles::RichStyle.new
80
+ extension = @__extendable_styles[name]
81
+ style.add_extension(extension) if extension
82
+ end
83
+ builder = StyleBuilder.new(name, style, self)
65
84
  builder.instance_eval(&block) if block
66
- @__styles__[name] = builder.__style__
85
+ @__styles[name] = style
67
86
  end
68
87
  end
69
88
 
@@ -73,12 +92,12 @@ module Limelight
73
92
 
74
93
  Limelight::Util.lobotomize(self)
75
94
 
76
- attr_reader :__style__ #:nodoc:
95
+ attr_reader :__style #:nodoc:
77
96
 
78
- def initialize(name, styles_builder, options = {}) #:nodoc:
97
+ def initialize(name, style, styles_builder, options = {}) #:nodoc:
79
98
  @__name = name
99
+ @__style = style
80
100
  @__styles_builder = styles_builder
81
- @__style__ = @__styles_builder.__styles__[name] || Styles::RichStyle.new
82
101
  end
83
102
 
84
103
  # Used to define a hover style. Hover styles are appiled when the mouse passed over a prop using the specified style.
@@ -94,7 +113,7 @@ module Limelight
94
113
  # The text color of props using the 'spinner' style will become white when the mouse hovers over them.
95
114
  #
96
115
  def hover(&block)
97
- @__styles_builder.__add_style__("#{@__name}.hover", &block)
116
+ @__styles_builder.__add_style("#{@__name}.hover", &block)
98
117
  end
99
118
 
100
119
  # Styles may extend other styles.
@@ -113,22 +132,25 @@ module Limelight
113
132
  #
114
133
  def extends(*style_names)
115
134
  style_names.each do |style_name|
116
- extension = @__styles_builder.__styles__[style_name.to_s]
135
+ extension = @__styles_builder.__styles[style_name.to_s] || @__styles_builder.__extendable_styles[style_name.to_s]
117
136
  raise StyleBuilderException.new("Can't extend missing style: '#{style_name}'") if extension.nil?
118
- @__style__.add_extension(extension)
137
+ @__style.add_extension(extension)
119
138
  end
120
139
  end
121
140
 
122
141
  def method_missing(sym, value) #:nodoc:
123
142
  setter_sym = "#{sym}=".to_s
124
- raise StyleBuilderException.new("'#{sym}' is not a valid style") if !@__style__.respond_to?(setter_sym)
125
- @__style__.send(setter_sym, value.to_s)
143
+ raise StyleBuilderException.new("'#{sym}' is not a valid style") if !@__style.respond_to?(setter_sym)
144
+ @__style.send(setter_sym, value.to_s)
126
145
  end
127
146
  end
128
147
 
129
148
  # Exception thrown by StyleBuilder when an error is encountered.
130
149
  #
131
150
  class StyleBuilderException < Exception
151
+ def initialize(message)
152
+ super(message)
153
+ end
132
154
  end
133
155
 
134
156
  end