limelight 0.0.1-java

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 (165) hide show
  1. data/bin/icons/icon.ico +0 -0
  2. data/bin/icons/icon_48.gif +0 -0
  3. data/bin/icons/limelight.icns +0 -0
  4. data/bin/icons/splash.png +0 -0
  5. data/bin/limelight +6 -0
  6. data/bin/ll +10 -0
  7. data/bin/ll.bat +5 -0
  8. data/lib/init.rb +11 -0
  9. data/lib/limelight/build_exception.rb +45 -0
  10. data/lib/limelight/button_group_cache.rb +11 -0
  11. data/lib/limelight/casting_director.rb +72 -0
  12. data/lib/limelight/commands.rb +66 -0
  13. data/lib/limelight/file_chooser.rb +55 -0
  14. data/lib/limelight/file_filter.rb +26 -0
  15. data/lib/limelight/java_util.rb +29 -0
  16. data/lib/limelight/limelight_exception.rb +9 -0
  17. data/lib/limelight/loaders/file_scene_loader.rb +48 -0
  18. data/lib/limelight/menu_bar.rb +49 -0
  19. data/lib/limelight/paint_action.rb +25 -0
  20. data/lib/limelight/pen.rb +53 -0
  21. data/lib/limelight/players/button.rb +29 -0
  22. data/lib/limelight/players/check_box.rb +38 -0
  23. data/lib/limelight/players/combo_box.rb +44 -0
  24. data/lib/limelight/players/radio_button.rb +47 -0
  25. data/lib/limelight/players/text_area.rb +25 -0
  26. data/lib/limelight/players/text_box.rb +25 -0
  27. data/lib/limelight/players.rb +9 -0
  28. data/lib/limelight/producer.rb +141 -0
  29. data/lib/limelight/production.rb +64 -0
  30. data/lib/limelight/production_builder.rb +49 -0
  31. data/lib/limelight/prop.rb +241 -0
  32. data/lib/limelight/prop_builder.rb +60 -0
  33. data/lib/limelight/scene.rb +75 -0
  34. data/lib/limelight/stage.rb +93 -0
  35. data/lib/limelight/stage_builder.rb +62 -0
  36. data/lib/limelight/styles.rb +37 -0
  37. data/lib/limelight/styles_builder.rb +61 -0
  38. data/lib/limelight/theater.rb +42 -0
  39. data/lib/limelight/util.rb +26 -0
  40. data/lib/limelight/version.rb +20 -0
  41. data/lib/limelight.jar +0 -0
  42. data/productions/examples/8thlight.com/about/about.txt +24 -0
  43. data/productions/examples/8thlight.com/about/props.rb +11 -0
  44. data/productions/examples/8thlight.com/about/styles.rb +2 -0
  45. data/productions/examples/8thlight.com/footer.rb +6 -0
  46. data/productions/examples/8thlight.com/home/props.rb +28 -0
  47. data/productions/examples/8thlight.com/home/styles.rb +2 -0
  48. data/productions/examples/8thlight.com/images/anvil.jpg +0 -0
  49. data/productions/examples/8thlight.com/images/bg.jpg +0 -0
  50. data/productions/examples/8thlight.com/images/botticelli.jpg +0 -0
  51. data/productions/examples/8thlight.com/images/button_bg.jpg +0 -0
  52. data/productions/examples/8thlight.com/images/canvas_bg.jpg +0 -0
  53. data/productions/examples/8thlight.com/images/footer_bg.jpg +0 -0
  54. data/productions/examples/8thlight.com/images/header.jpg +0 -0
  55. data/productions/examples/8thlight.com/images/moses.jpg +0 -0
  56. data/productions/examples/8thlight.com/images/statemachine_thumbnail.png +0 -0
  57. data/productions/examples/8thlight.com/images/thumbnail_book.jpg +0 -0
  58. data/productions/examples/8thlight.com/menu.rb +11 -0
  59. data/productions/examples/8thlight.com/services/props.rb +11 -0
  60. data/productions/examples/8thlight.com/services/services.txt +8 -0
  61. data/productions/examples/8thlight.com/services/styles.rb +2 -0
  62. data/productions/examples/8thlight.com/stages.rb +8 -0
  63. data/productions/examples/8thlight.com/styles.rb +205 -0
  64. data/productions/examples/calculator/players/button.rb +24 -0
  65. data/productions/examples/calculator/players/calculator.rb +15 -0
  66. data/productions/examples/calculator/players/calculator_model.rb +13 -0
  67. data/productions/examples/calculator/props.rb +23 -0
  68. data/productions/examples/calculator/styles.rb +38 -0
  69. data/productions/examples/langstons_ant/html_javascript/ant.css +39 -0
  70. data/productions/examples/langstons_ant/html_javascript/ant.html +22 -0
  71. data/productions/examples/langstons_ant/html_javascript/ant.js +23 -0
  72. data/productions/examples/langstons_ant/players/ant.rb +103 -0
  73. data/productions/examples/langstons_ant/players/log.rb +29 -0
  74. data/productions/examples/langstons_ant/players/start_stop_button.rb +37 -0
  75. data/productions/examples/langstons_ant/players/world.rb +61 -0
  76. data/productions/examples/langstons_ant/props.rb +22 -0
  77. data/productions/examples/langstons_ant/styles.rb +105 -0
  78. data/productions/examples/sandbox/click_me/players/chromaton.rb +47 -0
  79. data/productions/examples/sandbox/click_me/props.rb +8 -0
  80. data/productions/examples/sandbox/click_me/styles.rb +12 -0
  81. data/productions/examples/sandbox/floaters/players/floater.rb +92 -0
  82. data/productions/examples/sandbox/floaters/players/surface.rb +17 -0
  83. data/productions/examples/sandbox/floaters/props.rb +10 -0
  84. data/productions/examples/sandbox/floaters/styles.rb +25 -0
  85. data/productions/examples/sandbox/gradients/players/spinner.rb +23 -0
  86. data/productions/examples/sandbox/gradients/players/teaser.rb +26 -0
  87. data/productions/examples/sandbox/gradients/players/wave.rb +26 -0
  88. data/productions/examples/sandbox/gradients/players/waves.rb +26 -0
  89. data/productions/examples/sandbox/gradients/props.rb +13 -0
  90. data/productions/examples/sandbox/gradients/styles.rb +47 -0
  91. data/productions/examples/sandbox/header.rb +15 -0
  92. data/productions/examples/sandbox/homer/players/homer.rb +20 -0
  93. data/productions/examples/sandbox/homer/props.rb +10 -0
  94. data/productions/examples/sandbox/homer/styles.rb +17 -0
  95. data/productions/examples/sandbox/images/arch.jpg +0 -0
  96. data/productions/examples/sandbox/images/beach.jpg +0 -0
  97. data/productions/examples/sandbox/images/homer.jpg +0 -0
  98. data/productions/examples/sandbox/images/limelight_spotlight.jpg +0 -0
  99. data/productions/examples/sandbox/images/marilyn.jpg +0 -0
  100. data/productions/examples/sandbox/inputs/players/button_input.rb +48 -0
  101. data/productions/examples/sandbox/inputs/players/check_box_input.rb +40 -0
  102. data/productions/examples/sandbox/inputs/players/combo_box_input.rb +41 -0
  103. data/productions/examples/sandbox/inputs/players/radio_button_input.rb +43 -0
  104. data/productions/examples/sandbox/inputs/players/text_area_input.rb +36 -0
  105. data/productions/examples/sandbox/inputs/players/text_box_input.rb +36 -0
  106. data/productions/examples/sandbox/inputs/props.rb +40 -0
  107. data/productions/examples/sandbox/inputs/styles.rb +39 -0
  108. data/productions/examples/sandbox/players/sandbox.rb +11 -0
  109. data/productions/examples/sandbox/rounded_corners/players/box.rb +11 -0
  110. data/productions/examples/sandbox/rounded_corners/props.rb +22 -0
  111. data/productions/examples/sandbox/rounded_corners/styles.rb +18 -0
  112. data/productions/examples/sandbox/scrolling/players/cell.rb +16 -0
  113. data/productions/examples/sandbox/scrolling/props.rb +40 -0
  114. data/productions/examples/sandbox/scrolling/styles.rb +25 -0
  115. data/productions/examples/sandbox/sketching/players/sketchpad.rb +46 -0
  116. data/productions/examples/sandbox/sketching/props.rb +25 -0
  117. data/productions/examples/sandbox/sketching/styles.rb +36 -0
  118. data/productions/examples/sandbox/stages.rb +6 -0
  119. data/productions/examples/sandbox/styles.rb +37 -0
  120. data/productions/examples/sandbox/teaser/players/fader.rb +58 -0
  121. data/productions/examples/sandbox/teaser/props.rb +14 -0
  122. data/productions/examples/sandbox/teaser/styles.rb +22 -0
  123. data/productions/examples/tutorials/tutorial_1/players/sample.rb +11 -0
  124. data/productions/examples/tutorials/tutorial_1/props.rb +9 -0
  125. data/productions/examples/tutorials/tutorial_1/styles.rb +27 -0
  126. data/productions/stage_composer/init.rb +10 -0
  127. data/productions/stage_composer/inspector/players/inspector.rb +80 -0
  128. data/productions/stage_composer/inspector/players/prop_row.rb +12 -0
  129. data/productions/stage_composer/inspector/players/prop_tree.rb +33 -0
  130. data/productions/stage_composer/inspector/players/style_table.rb +12 -0
  131. data/productions/stage_composer/inspector/players/style_value.rb +16 -0
  132. data/productions/stage_composer/inspector/props.rb +19 -0
  133. data/productions/stage_composer/inspector/styles.rb +71 -0
  134. data/productions/stage_composer/lib/init.rb +5 -0
  135. data/productions/stage_composer/lib/limelight/composer/controller.rb +51 -0
  136. data/productions/stage_composer/lib/limelight/composer/lethargy.rb +24 -0
  137. data/productions/stage_composer/production.rb +6 -0
  138. data/productions/stage_composer/stages.rb +15 -0
  139. data/productions/startup/props.rb +5 -0
  140. data/spec/casting_director_spec.rb +94 -0
  141. data/spec/commands_spec.rb +33 -0
  142. data/spec/file_chooser_spec.rb +64 -0
  143. data/spec/file_filter_spec.rb +29 -0
  144. data/spec/java_util_spec.rb +53 -0
  145. data/spec/loaders/file_loader_spec.rb +28 -0
  146. data/spec/paint_action_spec.rb +30 -0
  147. data/spec/pen_spec.rb +62 -0
  148. data/spec/players/button_spec.rb +31 -0
  149. data/spec/players/check_box_spec.rb +40 -0
  150. data/spec/players/combo_box_spec.rb +39 -0
  151. data/spec/players/radio_button_spec.rb +75 -0
  152. data/spec/players/text_area_spec.rb +37 -0
  153. data/spec/players/text_box_spec.rb +37 -0
  154. data/spec/producer_spec.rb +157 -0
  155. data/spec/production_builder_spec.rb +48 -0
  156. data/spec/production_spec.rb +75 -0
  157. data/spec/prop_builder_spec.rb +178 -0
  158. data/spec/prop_spec.rb +216 -0
  159. data/spec/scene_spec.rb +34 -0
  160. data/spec/spec_helper.rb +18 -0
  161. data/spec/stage_builder_spec.rb +90 -0
  162. data/spec/stage_spec.rb +57 -0
  163. data/spec/styles_builder_spec.rb +123 -0
  164. data/spec/theater_spec.rb +66 -0
  165. metadata +275 -0
@@ -0,0 +1,47 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ module Limelight
5
+ module Players
6
+
7
+ module RadioButton
8
+ class << self
9
+ def extended(prop)
10
+ prop.panel.painters.clear
11
+ painter = Java.limelight.ui.painting.RadioButtonPainter.new(prop.panel)
12
+ prop.radio_button = painter.radio_button
13
+ prop.panel.painters << painter
14
+ prop.panel.clear_event_listeners
15
+ set_default_styles(prop)
16
+ end
17
+
18
+ def set_default_styles(prop)
19
+ prop.style.width = "22"
20
+ prop.style.height = "22"
21
+ end
22
+ end
23
+
24
+ attr_accessor :radio_button
25
+ attr_reader :button_group
26
+
27
+ def group=(group_name)
28
+ @button_group = scene.button_groups[group_name]
29
+ @button_group.add(@radio_button)
30
+ end
31
+
32
+ def checked=(value)
33
+ @radio_button.selected = value
34
+ end
35
+ alias :selected= :checked=
36
+
37
+ def checked
38
+ return @radio_button.is_selected
39
+ end
40
+ alias :checked? :checked
41
+ alias :selected? :checked
42
+ alias :selected :checked
43
+
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,25 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ module Limelight
5
+ module Players
6
+
7
+ module TextArea
8
+ class << self
9
+ def extended(prop)
10
+ prop.panel.painters.clear
11
+ prop.panel.painters << Java.limelight.ui.painting.TextAreaPainter.new(prop.panel)
12
+ prop.panel.clear_event_listeners
13
+ set_default_styles(prop)
14
+ end
15
+
16
+ def set_default_styles(prop)
17
+ prop.style.width ||= "240"
18
+ prop.style.height ||= "88"
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ module Limelight
5
+ module Players
6
+
7
+ module TextBox
8
+ class << self
9
+ def extended(prop)
10
+ prop.panel.painters.clear
11
+ prop.panel.painters << Java.limelight.ui.painting.TextBoxPainter.new(prop.panel)
12
+ prop.panel.clear_event_listeners
13
+ set_default_styles(prop)
14
+ end
15
+
16
+ def set_default_styles(prop)
17
+ prop.style.width = "120"
18
+ prop.style.height = "22"
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,9 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ require 'limelight/players/button'
5
+ require 'limelight/players/check_box'
6
+ require 'limelight/players/combo_box'
7
+ require 'limelight/players/radio_button'
8
+ require 'limelight/players/text_area'
9
+ require 'limelight/players/text_box'
@@ -0,0 +1,141 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ require 'limelight/loaders/file_scene_loader'
5
+ require 'limelight/prop_builder'
6
+ require 'limelight/styles_builder'
7
+ require 'limelight/stage_builder'
8
+ require 'limelight/production_builder'
9
+ require 'limelight/casting_director'
10
+ require 'limelight/stage'
11
+ require 'limelight/build_exception'
12
+ require 'limelight/theater'
13
+ require 'limelight/production'
14
+
15
+ module Limelight
16
+
17
+ class Producer
18
+
19
+ def self.open(production_name)
20
+ if(production_name[-4..-1] == ".llp")
21
+ production_name = unpack_production(production_name)
22
+ end
23
+ producer = new(production_name)
24
+ producer.open
25
+ end
26
+
27
+ attr_reader :loader, :theater, :production
28
+
29
+ def initialize(root_path, theater=nil, production=nil)
30
+ @loader = Loaders::FileSceneLoader.for_root(root_path)
31
+ @theater = theater.nil? ? Theater.new : theater
32
+ @production = production
33
+ end
34
+
35
+ def casting_director
36
+ @casting_director = CastingDirector.new(loader) if not @casting_director
37
+ return @casting_director
38
+ end
39
+
40
+ def open()
41
+ establish_production
42
+ Kernel.load(@loader.path_to("init.rb")) if @loader.exists?("init.rb")
43
+ if @loader.exists?("stages.rb")
44
+ load_stages.each { |stage| open_scene(stage.default_scene, stage) }
45
+ else
46
+ open_scene('.', @theater.default_stage)
47
+ end
48
+ @casting_director = nil
49
+ end
50
+
51
+ def open_scene(path, stage)
52
+ styles = load_styles(path)
53
+ merge_with_root_styles(styles)
54
+
55
+ scene = load_props(path, :styles => styles, :production => @production, :casting_director => casting_director, :loader => @loader, :path => path)
56
+
57
+ stage.open(scene)
58
+ end
59
+
60
+ def load_stages
61
+ content = @loader.load("stages.rb")
62
+ stages = Limelight.build_stages(@theater) do
63
+ begin
64
+ eval content
65
+ rescue Exception => e
66
+ raise BuildException.new("stages.rb", content, e)
67
+ end
68
+ end
69
+ return stages
70
+ end
71
+
72
+ def load_props(path, options = {})
73
+ return Scene.new(options) if path.nil?
74
+ filename = File.join(path, "props.rb")
75
+ content = @loader.exists?(filename) ? @loader.load(filename) : ""
76
+ options[:build_loader] = @loader
77
+ return Limelight.build_scene(options) do
78
+ begin
79
+ eval content
80
+ rescue Exception => e
81
+ raise BuildException.new(filename, content, e)
82
+ end
83
+ end
84
+ end
85
+
86
+ def load_styles(path)
87
+ return {} if path.nil?
88
+ filename = File.join(path, "styles.rb")
89
+ return {} if not @loader.exists?(filename)
90
+ content = @loader.load(filename)
91
+ return Limelight.build_styles do
92
+ begin
93
+ eval content
94
+ rescue Exception => e
95
+ raise BuildException.new(filename, content, e)
96
+ end
97
+ end
98
+ end
99
+
100
+ def establish_production
101
+ return if @production
102
+ if @loader.exists?("production.rb")
103
+ content = @loader.load("production.rb")
104
+ @production = Limelight.build_production(self, @theater) do
105
+ begin
106
+ eval content
107
+ rescue Exception => e
108
+ raise BuildException.new("production.rb", content, e)
109
+ end
110
+ end
111
+ else
112
+ @production = Production.new(self, @theater)
113
+ end
114
+ end
115
+
116
+ def root_styles
117
+ return @root_syles if @root_syles
118
+ if @loader.exists?('styles.rb')
119
+ @root_styles = load_styles('.')
120
+ else
121
+ @root_styles = {}
122
+ end
123
+ return @root_styles
124
+ end
125
+
126
+ private ###############################################
127
+
128
+ def merge_with_root_styles(styles)
129
+ root_styles.each_pair do |key, value|
130
+ styles[key] = value if !styles.has_key?(key)
131
+ end
132
+ end
133
+
134
+ def self.unpack_production(production_name)
135
+ packer = Java::limelight::io.Packer.new()
136
+ return packer.unpack(production_name)
137
+ end
138
+
139
+ end
140
+
141
+ end
@@ -0,0 +1,64 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ require 'limelight/limelight_exception'
5
+
6
+ module Limelight
7
+
8
+ class Production
9
+
10
+ class << self
11
+
12
+ def index(production)
13
+ @index = [] if @index.nil?
14
+ if production.name.nil?
15
+ assign_name_to(production)
16
+ else
17
+ error_if_duplicate_name(production.name)
18
+ end
19
+ @index << production
20
+ end
21
+
22
+ def [](name)
23
+ return nil if @index.nil?
24
+ return @index.find { |production| production.name == name }
25
+ end
26
+
27
+ def assign_name_to(production)
28
+ count = @index.length + 1
29
+ while name_taken?(count.to_s)
30
+ count += 1
31
+ end
32
+ production.name = count.to_s
33
+ end
34
+
35
+ def name_taken?(name)
36
+ return self[name] != nil
37
+ end
38
+
39
+ def clear_index
40
+ @index = []
41
+ end
42
+
43
+ def error_if_duplicate_name(name)
44
+ raise Limelight::LimelightException.new("Production name '#{name}' is already taken") if name_taken?(name)
45
+ end
46
+
47
+ end
48
+
49
+ attr_reader :producer, :theater, :name
50
+
51
+ def initialize(producer, theater)
52
+ @producer = producer
53
+ @theater = theater
54
+ self.class.index(self)
55
+ end
56
+
57
+ def name=(value)
58
+ self.class.error_if_duplicate_name(value)
59
+ @name = value
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,49 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ require 'limelight/production'
5
+ require 'limelight/limelight_exception'
6
+
7
+ module Limelight
8
+
9
+ def self.build_production(producer, theater, &block)
10
+ builder = ProductionBuilder.new(producer, theater)
11
+ builder.instance_eval(&block) if block
12
+ return builder.__production__
13
+ end
14
+
15
+ class ProductionBuilder
16
+
17
+ class << self
18
+
19
+ attr_accessor :current_attribute
20
+
21
+ end
22
+
23
+ attr_reader :__production__
24
+
25
+ def initialize(producer, theater)
26
+ @__production__ = Production.new(producer, theater)
27
+ end
28
+
29
+ def method_missing(sym, value)
30
+ setter_sym = "#{sym}=".to_s
31
+ raise ProductionBuilderException.new(sym) if !@__production__.respond_to?(setter_sym)
32
+ @__production__.send(setter_sym, value)
33
+ end
34
+
35
+ def attribute(sym)
36
+ ProductionBuilder.current_attribute = sym
37
+ class << @__production__
38
+ attr_accessor ProductionBuilder.current_attribute
39
+ end
40
+ end
41
+ end
42
+
43
+ class ProductionBuilderException < LimelightException
44
+ def initialize(name)
45
+ super("'#{name}' is not a valid production property")
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,241 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ require 'limelight/java_util'
5
+ require 'limelight/pen'
6
+ require 'limelight/paint_action'
7
+
8
+ module Limelight
9
+ class Prop
10
+
11
+ class << self
12
+
13
+ def event(*syms)
14
+ @events ||= []
15
+ syms.each do |sym|
16
+ @events << sym unless @events.include?(sym)
17
+ define_method(sym) { |event| } # do nothing by default
18
+ end
19
+ end
20
+
21
+ def events
22
+ return @events
23
+ end
24
+
25
+ end
26
+
27
+ include Java::limelight.ui.Prop
28
+
29
+ attr_reader :panel, :style, :children, :scene, :parent
30
+ attr_reader :name, :id, :players
31
+ getters :panel, :style, :scene, :name, :text
32
+ setters :text
33
+
34
+ def initialize(hash = {})
35
+ @options = hash
36
+ @children = []
37
+ @panel = Java::limelight.ui.Panel.new(self)
38
+ @style = Java::limelight.ui.ScreenableStyle.new
39
+ end
40
+
41
+ def add(child)
42
+ @children << child
43
+ @panel.add(child.panel)
44
+ child.set_parent(self)
45
+ end
46
+
47
+ def <<(child)
48
+ add(child)
49
+ return self
50
+ end
51
+
52
+ def build(&block)
53
+ require 'limelight/prop_builder'
54
+ builder = Limelight::PropBuilder.new(self)
55
+ builder.instance_eval(&block)
56
+ end
57
+
58
+ def remove(child)
59
+ if children.delete(child)
60
+ @panel.remove(child.panel)
61
+ end
62
+ end
63
+
64
+ def remove_all
65
+ @panel.remove_all
66
+ @children = []
67
+ end
68
+
69
+ def add_controller(controller_module)
70
+ extend controller_module unless self.is_a?(controller_module)
71
+ end
72
+
73
+ alias :include_player :add_controller
74
+
75
+ def update
76
+ return if(@scene.nil? || !@scene.visible)
77
+ @panel.doLayout
78
+ @panel.repaint
79
+ end
80
+
81
+ def update_now
82
+ return if(@scene.nil? || !@scene.visible)
83
+ @panel.doLayout()
84
+ @panel.paintImmediately(0, 0, @panel.width, @panel.height)
85
+ end
86
+
87
+ def after_painting(flag = true, &block)
88
+ if flag
89
+ @panel.after_paint_action = PaintAction.new(&block)
90
+ else
91
+ @panel.after_paint_action = nil
92
+ end
93
+ end
94
+
95
+ def find(id)
96
+ return self if @id == id
97
+ @children.each do |child|
98
+ result = child.find(id)
99
+ return result if result
100
+ end
101
+ return nil
102
+ end
103
+
104
+ def find_by_name(name, results = [])
105
+ results << self if @name == name
106
+ @children.each { |child| child.find_by_name(name, results) }
107
+ return results
108
+ end
109
+
110
+ def text=(value)
111
+ @panel.text_accessor.text = value
112
+ end
113
+
114
+ def text
115
+ return panel.text_accessor.text
116
+ end
117
+
118
+ #TODO - MDM - DELETE ME
119
+ def stage
120
+ return scene.stage
121
+ end
122
+
123
+ def production
124
+ return scene.production
125
+ end
126
+
127
+ def to_s
128
+ return "#{self.class.name}[id: #{@id}, name: #{@name}]"
129
+ end
130
+
131
+ def inspect
132
+ return self.to_s
133
+ end
134
+
135
+ # unusual name because it's not part of public api
136
+ def set_parent(parent)
137
+ @parent = parent
138
+ set_scene parent.scene
139
+ end
140
+
141
+ # unusual name because it's not part of public api
142
+ def set_scene(scene)
143
+ return if scene == @scene || scene.nil?
144
+ @scene = scene
145
+ illuminate
146
+ children.each { |child| child.set_scene(scene) }
147
+ end
148
+
149
+ def add_options(more_options)
150
+ raise "Too late to add options" if @options.nil?
151
+ @options.merge!(more_options)
152
+ end
153
+
154
+ def area
155
+ return panel.get_rectangle.clone
156
+ end
157
+
158
+ def bordered_area
159
+ return panel.get_rectangle_inside_borders.clone
160
+ end
161
+
162
+ def pen
163
+ return Pen.new(panel.getGraphics)
164
+ end
165
+
166
+ # GUI Events ##########################################
167
+
168
+ def hover_on
169
+ return nil if @hover_style.nil?
170
+ @panel.setCursor(java.awt.Cursor.new(java.awt.Cursor::HAND_CURSOR))
171
+ style.applyScreen(@hover_style)
172
+ update
173
+ end
174
+
175
+ def hover_off
176
+ return nil if @hover_style.nil?
177
+ @panel.setCursor(java.awt.Cursor.new(java.awt.Cursor::DEFAULT_CURSOR))
178
+ @style.removeScreen()
179
+ update
180
+ end
181
+
182
+ EVENTS = [:mouse_clicked, :mouse_entered, :mouse_exited, :mouse_pressed, :mouse_released, :mouse_dragged, :mouse_moved,
183
+ :key_typed, :key_pressed, :key_released, :focus_gained, :focus_lost, :state_changed, :button_pressed, :item_state_changed]
184
+
185
+ event *EVENTS
186
+
187
+ private ###############################################
188
+
189
+ def illuminate
190
+ return if @options.nil?
191
+
192
+ @id = @options.delete(:id)
193
+ @name = @options.delete(:name)
194
+ @players = @options.delete(:players)
195
+
196
+ inherit_styles
197
+ @scene.casting_director.fill_cast(self)
198
+ apply_options
199
+
200
+ @options = nil
201
+ end
202
+
203
+ def apply_options
204
+ @options.each_pair do |key, value|
205
+ setter_sym = "#{key.to_s}=".to_sym
206
+ if self.respond_to?(setter_sym)
207
+ self.send(setter_sym, value)
208
+ elsif self.style.respond_to?(setter_sym)
209
+ self.style.send(setter_sym, value)
210
+ elsif is_event_setter(key)
211
+ define_event(key, value)
212
+ end
213
+ end
214
+ end
215
+
216
+ def is_event_setter(symbol)
217
+ string_value = symbol.to_s
218
+ return string_value[0..2] == "on_" and self.events.include?(string_value[3..-1].to_sym)
219
+ end
220
+
221
+ def define_event(symbol, value)
222
+ event_name = symbol.to_s[3..-1]
223
+ self.instance_eval "def #{event_name}(event); #{value}; end"
224
+ end
225
+
226
+ def inherit_styles
227
+ return if @name.nil?
228
+ new_style = @scene.styles[@name]
229
+ @style.add_extension(new_style) if new_style
230
+ @hover_style = scene.styles["#{@name}.hover"]
231
+ end
232
+
233
+ def disinherit_styles
234
+ return if @name.nil?
235
+ old_style = @scene.styles[@name]
236
+ @style.remove_extension(old_style) if old_style
237
+ @hover_style = nil
238
+ end
239
+
240
+ end
241
+ end
@@ -0,0 +1,60 @@
1
+ #- Copyright 2008 8th Light, Inc.
2
+ #- Limelight and all included source files are distributed under terms of the GNU LGPL.
3
+
4
+ require 'limelight/prop'
5
+ require 'limelight/scene'
6
+ require 'limelight/build_exception'
7
+
8
+ module Limelight
9
+
10
+ def self.build_scene(options={}, &block)
11
+ loader = options.delete(:build_loader)
12
+ builder = SceneBuilder.new(options)
13
+ builder.__loader__ = loader
14
+ builder.instance_eval(&block) if block
15
+ return builder.__prop__
16
+ end
17
+
18
+ class PropBuilder
19
+ attr_reader :__prop__
20
+ attr_accessor :__loader__
21
+
22
+ def initialize(options)
23
+ if options.is_a?(Prop)
24
+ @__prop__ = options
25
+ else
26
+ @__prop__ = Prop.new(options)
27
+ end
28
+ end
29
+
30
+ def __(options)
31
+ @__prop__.add_options(options)
32
+ end
33
+
34
+ def __install(file)
35
+ raise "Cannot install external props because no loader was provided" if @__loader__.nil?
36
+ raise "External prop file: '#{file}' doesn't exist" if !@__loader__.exists?(file)
37
+ content = @__loader__.load(file)
38
+ begin
39
+ self.instance_eval(content)
40
+ rescue Exception => e
41
+ raise BuildException.new(file, content, e)
42
+ end
43
+ end
44
+
45
+ def method_missing(sym, options={}, &prop)
46
+ options[:name] ||= sym.to_s
47
+ builder = PropBuilder.new(options)
48
+ builder.__loader__ = @__loader__
49
+ builder.instance_eval(&prop) if prop
50
+ @__prop__.add(builder.__prop__)
51
+ end
52
+ end
53
+
54
+ class SceneBuilder < PropBuilder
55
+ def initialize(options)
56
+ @__prop__ = Scene.new(options)
57
+ end
58
+ end
59
+
60
+ end