shoes-swt 4.0.0.pre2

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 (238) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +84 -0
  3. data/Gemfile +24 -0
  4. data/Guardfile +11 -0
  5. data/LICENSE +31 -0
  6. data/README.md +201 -0
  7. data/lib/shoes/swt.rb +118 -0
  8. data/lib/shoes/swt/animation.rb +46 -0
  9. data/lib/shoes/swt/app.rb +314 -0
  10. data/lib/shoes/swt/arc.rb +71 -0
  11. data/lib/shoes/swt/background.rb +41 -0
  12. data/lib/shoes/swt/border.rb +41 -0
  13. data/lib/shoes/swt/button.rb +18 -0
  14. data/lib/shoes/swt/check.rb +14 -0
  15. data/lib/shoes/swt/check_button.rb +19 -0
  16. data/lib/shoes/swt/color.rb +49 -0
  17. data/lib/shoes/swt/color_factory.rb +32 -0
  18. data/lib/shoes/swt/common/child.rb +16 -0
  19. data/lib/shoes/swt/common/clickable.rb +68 -0
  20. data/lib/shoes/swt/common/container.rb +28 -0
  21. data/lib/shoes/swt/common/fill.rb +38 -0
  22. data/lib/shoes/swt/common/painter.rb +92 -0
  23. data/lib/shoes/swt/common/painter_updates_position.rb +12 -0
  24. data/lib/shoes/swt/common/remove.rb +30 -0
  25. data/lib/shoes/swt/common/resource.rb +29 -0
  26. data/lib/shoes/swt/common/selection_listener.rb +14 -0
  27. data/lib/shoes/swt/common/stroke.rb +42 -0
  28. data/lib/shoes/swt/common/update_position.rb +15 -0
  29. data/lib/shoes/swt/common/visibility.rb +13 -0
  30. data/lib/shoes/swt/dialog.rb +90 -0
  31. data/lib/shoes/swt/disposed_protection.rb +23 -0
  32. data/lib/shoes/swt/download.rb +24 -0
  33. data/lib/shoes/swt/font.rb +32 -0
  34. data/lib/shoes/swt/gradient.rb +92 -0
  35. data/lib/shoes/swt/image.rb +128 -0
  36. data/lib/shoes/swt/image_pattern.rb +31 -0
  37. data/lib/shoes/swt/input_box.rb +73 -0
  38. data/lib/shoes/swt/key_listener.rb +145 -0
  39. data/lib/shoes/swt/line.rb +60 -0
  40. data/lib/shoes/swt/link.rb +31 -0
  41. data/lib/shoes/swt/link_segment.rb +111 -0
  42. data/lib/shoes/swt/list_box.rb +48 -0
  43. data/lib/shoes/swt/mouse_move_listener.rb +67 -0
  44. data/lib/shoes/swt/oval.rb +52 -0
  45. data/lib/shoes/swt/progress.rb +35 -0
  46. data/lib/shoes/swt/radio.rb +29 -0
  47. data/lib/shoes/swt/radio_group.rb +54 -0
  48. data/lib/shoes/swt/rect.rb +30 -0
  49. data/lib/shoes/swt/rect_painter.rb +23 -0
  50. data/lib/shoes/swt/redrawing_aspect.rb +123 -0
  51. data/lib/shoes/swt/shape.rb +133 -0
  52. data/lib/shoes/swt/shoes_layout.rb +43 -0
  53. data/lib/shoes/swt/slot.rb +39 -0
  54. data/lib/shoes/swt/sound.rb +119 -0
  55. data/lib/shoes/swt/star.rb +50 -0
  56. data/lib/shoes/swt/support/jl1.0.1.jar +0 -0
  57. data/lib/shoes/swt/support/jogg-0.0.7.jar +0 -0
  58. data/lib/shoes/swt/support/jorbis-0.0.15.jar +0 -0
  59. data/lib/shoes/swt/support/log4j-1.2.16.jar +0 -0
  60. data/lib/shoes/swt/support/mp3spi1.9.5.jar +0 -0
  61. data/lib/shoes/swt/support/tritonus_share.jar +0 -0
  62. data/lib/shoes/swt/support/vorbisspi1.0.3.jar +0 -0
  63. data/lib/shoes/swt/swt_button.rb +56 -0
  64. data/lib/shoes/swt/text_block.rb +124 -0
  65. data/lib/shoes/swt/text_block/centered_text_segment.rb +22 -0
  66. data/lib/shoes/swt/text_block/cursor_painter.rb +53 -0
  67. data/lib/shoes/swt/text_block/fitter.rb +212 -0
  68. data/lib/shoes/swt/text_block/painter.rb +47 -0
  69. data/lib/shoes/swt/text_block/text_font_factory.rb +50 -0
  70. data/lib/shoes/swt/text_block/text_segment.rb +108 -0
  71. data/lib/shoes/swt/text_block/text_segment_collection.rb +160 -0
  72. data/lib/shoes/swt/text_block/text_style_factory.rb +88 -0
  73. data/lib/shoes/swt/timer.rb +19 -0
  74. data/lib/shoes/swt/tooling/leak_hunter.rb +35 -0
  75. data/lib/shoes/swt/version.rb +5 -0
  76. data/manifests/common.rb +34 -0
  77. data/manifests/shoes-swt.rb +29 -0
  78. data/shoes-swt.gemspec +24 -0
  79. data/spec/code_coverage.rb +14 -0
  80. data/spec/shoes/animation_spec.rb +65 -0
  81. data/spec/shoes/app_spec.rb +484 -0
  82. data/spec/shoes/arc_spec.rb +51 -0
  83. data/spec/shoes/background_spec.rb +53 -0
  84. data/spec/shoes/border_spec.rb +47 -0
  85. data/spec/shoes/builtin_methods_spec.rb +110 -0
  86. data/spec/shoes/button_spec.rb +44 -0
  87. data/spec/shoes/check_spec.rb +35 -0
  88. data/spec/shoes/cli_spec.rb +15 -0
  89. data/spec/shoes/color_spec.rb +408 -0
  90. data/spec/shoes/common/inspect_spec.rb +26 -0
  91. data/spec/shoes/common/remove_spec.rb +38 -0
  92. data/spec/shoes/common/style_normalizer_spec.rb +28 -0
  93. data/spec/shoes/common/style_spec.rb +147 -0
  94. data/spec/shoes/configuration_spec.rb +36 -0
  95. data/spec/shoes/constants_spec.rb +38 -0
  96. data/spec/shoes/dialog_spec.rb +163 -0
  97. data/spec/shoes/dimension_spec.rb +407 -0
  98. data/spec/shoes/dimensions_spec.rb +837 -0
  99. data/spec/shoes/download_spec.rb +142 -0
  100. data/spec/shoes/flow_spec.rb +133 -0
  101. data/spec/shoes/font_spec.rb +37 -0
  102. data/spec/shoes/framework_learning_spec.rb +30 -0
  103. data/spec/shoes/gradient_spec.rb +32 -0
  104. data/spec/shoes/helpers/fake_element.rb +17 -0
  105. data/spec/shoes/helpers/inspect_helpers.rb +5 -0
  106. data/spec/shoes/helpers/sample17_helper.rb +66 -0
  107. data/spec/shoes/image_spec.rb +49 -0
  108. data/spec/shoes/images/shoe.jpg +0 -0
  109. data/spec/shoes/input_box_spec.rb +80 -0
  110. data/spec/shoes/integration_spec.rb +20 -0
  111. data/spec/shoes/internal_app_spec.rb +141 -0
  112. data/spec/shoes/keypress_spec.rb +11 -0
  113. data/spec/shoes/keyrelease_spec.rb +12 -0
  114. data/spec/shoes/line_spec.rb +49 -0
  115. data/spec/shoes/link_spec.rb +105 -0
  116. data/spec/shoes/list_box_spec.rb +74 -0
  117. data/spec/shoes/logger/ruby_spec.rb +8 -0
  118. data/spec/shoes/logger_spec.rb +45 -0
  119. data/spec/shoes/oval_spec.rb +24 -0
  120. data/spec/shoes/point_spec.rb +71 -0
  121. data/spec/shoes/progress_spec.rb +54 -0
  122. data/spec/shoes/radio_spec.rb +32 -0
  123. data/spec/shoes/rect_spec.rb +39 -0
  124. data/spec/shoes/renamed_delegate_spec.rb +70 -0
  125. data/spec/shoes/shape_spec.rb +95 -0
  126. data/spec/shoes/shared_examples/button.rb +6 -0
  127. data/spec/shoes/shared_examples/changeable.rb +26 -0
  128. data/spec/shoes/shared_examples/clickable.rb +5 -0
  129. data/spec/shoes/shared_examples/common_methods.rb +35 -0
  130. data/spec/shoes/shared_examples/dimensions.rb +32 -0
  131. data/spec/shoes/shared_examples/dsl.rb +44 -0
  132. data/spec/shoes/shared_examples/dsl/animate.rb +29 -0
  133. data/spec/shoes/shared_examples/dsl/arc.rb +45 -0
  134. data/spec/shoes/shared_examples/dsl/background.rb +26 -0
  135. data/spec/shoes/shared_examples/dsl/border.rb +10 -0
  136. data/spec/shoes/shared_examples/dsl/button.rb +5 -0
  137. data/spec/shoes/shared_examples/dsl/cap.rb +6 -0
  138. data/spec/shoes/shared_examples/dsl/check.rb +11 -0
  139. data/spec/shoes/shared_examples/dsl/edit_box.rb +8 -0
  140. data/spec/shoes/shared_examples/dsl/edit_line.rb +8 -0
  141. data/spec/shoes/shared_examples/dsl/editable_element.rb +29 -0
  142. data/spec/shoes/shared_examples/dsl/fill.rb +27 -0
  143. data/spec/shoes/shared_examples/dsl/flow.rb +15 -0
  144. data/spec/shoes/shared_examples/dsl/gradient.rb +62 -0
  145. data/spec/shoes/shared_examples/dsl/image.rb +21 -0
  146. data/spec/shoes/shared_examples/dsl/line.rb +9 -0
  147. data/spec/shoes/shared_examples/dsl/nofill.rb +6 -0
  148. data/spec/shoes/shared_examples/dsl/nostroke.rb +6 -0
  149. data/spec/shoes/shared_examples/dsl/oval.rb +88 -0
  150. data/spec/shoes/shared_examples/dsl/pattern.rb +34 -0
  151. data/spec/shoes/shared_examples/dsl/progress.rb +7 -0
  152. data/spec/shoes/shared_examples/dsl/rect.rb +92 -0
  153. data/spec/shoes/shared_examples/dsl/rgb.rb +26 -0
  154. data/spec/shoes/shared_examples/dsl/shape.rb +21 -0
  155. data/spec/shoes/shared_examples/dsl/star.rb +48 -0
  156. data/spec/shoes/shared_examples/dsl/stroke.rb +30 -0
  157. data/spec/shoes/shared_examples/dsl/strokewidth.rb +19 -0
  158. data/spec/shoes/shared_examples/dsl/style.rb +32 -0
  159. data/spec/shoes/shared_examples/dsl/text_elements.rb +81 -0
  160. data/spec/shoes/shared_examples/dsl/video.rb +5 -0
  161. data/spec/shoes/shared_examples/dsl_app_context.rb +8 -0
  162. data/spec/shoes/shared_examples/hover_leave.rb +11 -0
  163. data/spec/shoes/shared_examples/parent.rb +6 -0
  164. data/spec/shoes/shared_examples/scroll.rb +41 -0
  165. data/spec/shoes/shared_examples/shared_element_method.rb +60 -0
  166. data/spec/shoes/shared_examples/slot.rb +331 -0
  167. data/spec/shoes/shared_examples/state.rb +19 -0
  168. data/spec/shoes/shared_examples/style.rb +82 -0
  169. data/spec/shoes/slot_spec.rb +130 -0
  170. data/spec/shoes/sound_spec.rb +15 -0
  171. data/spec/shoes/span_spec.rb +112 -0
  172. data/spec/shoes/spec_helper.rb +24 -0
  173. data/spec/shoes/stack_spec.rb +79 -0
  174. data/spec/shoes/star_spec.rb +31 -0
  175. data/spec/shoes/text_block_dimensions_spec.rb +75 -0
  176. data/spec/shoes/text_block_spec.rb +270 -0
  177. data/spec/shoes/url_spec.rb +68 -0
  178. data/spec/shoes/widget_spec.rb +70 -0
  179. data/spec/shoes_spec.rb +44 -0
  180. data/spec/spec_helper.rb +18 -0
  181. data/spec/swt_shoes/animation_spec.rb +86 -0
  182. data/spec/swt_shoes/app_spec.rb +84 -0
  183. data/spec/swt_shoes/arc_spec.rb +103 -0
  184. data/spec/swt_shoes/background_spec.rb +67 -0
  185. data/spec/swt_shoes/border_spec.rb +52 -0
  186. data/spec/swt_shoes/button_spec.rb +101 -0
  187. data/spec/swt_shoes/check_spec.rb +28 -0
  188. data/spec/swt_shoes/color_factory_spec.rb +49 -0
  189. data/spec/swt_shoes/color_spec.rb +67 -0
  190. data/spec/swt_shoes/common/painter_spec.rb +49 -0
  191. data/spec/swt_shoes/common/remove_spec.rb +53 -0
  192. data/spec/swt_shoes/configuration_spec.rb +12 -0
  193. data/spec/swt_shoes/dialog_spec.rb +106 -0
  194. data/spec/swt_shoes/disposed_protection_spec.rb +49 -0
  195. data/spec/swt_shoes/flow_spec.rb +36 -0
  196. data/spec/swt_shoes/font_spec.rb +33 -0
  197. data/spec/swt_shoes/gradient_spec.rb +31 -0
  198. data/spec/swt_shoes/image_pattern_spec.rb +35 -0
  199. data/spec/swt_shoes/image_spec.rb +100 -0
  200. data/spec/swt_shoes/input_box_spec.rb +116 -0
  201. data/spec/swt_shoes/integration_spec.rb +27 -0
  202. data/spec/swt_shoes/key_listener_spec.rb +325 -0
  203. data/spec/swt_shoes/line_spec.rb +49 -0
  204. data/spec/swt_shoes/link_segment_spec.rb +120 -0
  205. data/spec/swt_shoes/link_spec.rb +54 -0
  206. data/spec/swt_shoes/list_box_spec.rb +56 -0
  207. data/spec/swt_shoes/minimal.png +0 -0
  208. data/spec/swt_shoes/mouse_move_listener_spec.rb +123 -0
  209. data/spec/swt_shoes/oval_spec.rb +51 -0
  210. data/spec/swt_shoes/progress_spec.rb +44 -0
  211. data/spec/swt_shoes/radio_group_spec.rb +73 -0
  212. data/spec/swt_shoes/radio_spec.rb +56 -0
  213. data/spec/swt_shoes/rect_painter_spec.rb +45 -0
  214. data/spec/swt_shoes/rect_spec.rb +19 -0
  215. data/spec/swt_shoes/shape_spec.rb +84 -0
  216. data/spec/swt_shoes/shared_examples/button.rb +21 -0
  217. data/spec/swt_shoes/shared_examples/clickable.rb +85 -0
  218. data/spec/swt_shoes/shared_examples/movable.rb +36 -0
  219. data/spec/swt_shoes/shared_examples/paintable.rb +7 -0
  220. data/spec/swt_shoes/shared_examples/painter.rb +83 -0
  221. data/spec/swt_shoes/shared_examples/pattern.rb +32 -0
  222. data/spec/swt_shoes/shared_examples/removable.rb +41 -0
  223. data/spec/swt_shoes/shared_examples/swt_app_context.rb +23 -0
  224. data/spec/swt_shoes/shared_examples/visibility.rb +15 -0
  225. data/spec/swt_shoes/shell_control_listener_spec.rb +23 -0
  226. data/spec/swt_shoes/slot_spec.rb +24 -0
  227. data/spec/swt_shoes/sound.rb +10 -0
  228. data/spec/swt_shoes/spec_helper.rb +31 -0
  229. data/spec/swt_shoes/star_spec.rb +47 -0
  230. data/spec/swt_shoes/text_block/centered_text_segment_spec.rb +16 -0
  231. data/spec/swt_shoes/text_block/cursor_painter_spec.rb +120 -0
  232. data/spec/swt_shoes/text_block/fitter_spec.rb +213 -0
  233. data/spec/swt_shoes/text_block/painter_spec.rb +212 -0
  234. data/spec/swt_shoes/text_block/text_font_factory_spec.rb +40 -0
  235. data/spec/swt_shoes/text_block/text_segment_collection_spec.rb +256 -0
  236. data/spec/swt_shoes/text_block/text_segment_spec.rb +135 -0
  237. data/spec/swt_shoes/text_block_spec.rb +199 -0
  238. metadata +496 -0
@@ -0,0 +1,48 @@
1
+ class Shoes
2
+ module Swt
3
+ class ListBox
4
+ include Common::Child
5
+ include Common::Remove
6
+ include Common::Visibility
7
+ include Common::UpdatePosition
8
+ include ::Shoes::BackendDimensionsDelegations
9
+
10
+ attr_reader :dsl, :parent
11
+
12
+ # Create a list box
13
+ #
14
+ # @param dsl [Shoes::List_box] The Shoes DSL list box this represents
15
+ # @param parent [::Swt::Widgets::Composite] The parent element of this button
16
+ def initialize(dsl, parent)
17
+ @dsl = dsl
18
+ @parent = parent
19
+ @real = ::Swt::Widgets::Combo.new(
20
+ @parent.real,
21
+ ::Swt::SWT::DROP_DOWN | ::Swt::SWT::READ_ONLY
22
+ )
23
+ @real.set_size dsl.element_width, dsl.element_height
24
+ @real.add_selection_listener do |event|
25
+ @dsl.call_change_listeners
26
+ end
27
+ update_items @dsl.items
28
+ end
29
+
30
+ def update_items(values)
31
+ @real.items = values.map(&:to_s)
32
+ end
33
+
34
+ def text
35
+ text = @real.text
36
+ text == '' ? nil : text
37
+ end
38
+
39
+ def choose(item)
40
+ @real.text = item
41
+ end
42
+
43
+ def enabled(value)
44
+ @real.enable_widget value
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,67 @@
1
+ class Shoes
2
+ module Swt
3
+ class MouseMoveListener
4
+ include ::Swt::Events::MouseMoveListener
5
+
6
+ def initialize app
7
+ @app = app
8
+ end
9
+
10
+ def mouse_move(mouse_event)
11
+ @app.dsl.mouse_pos = [mouse_event.x, mouse_event.y]
12
+ @app.dsl.mouse_motion.each{|blk| eval_move_block blk, mouse_event}
13
+ mouse_shape_control mouse_event
14
+ mouse_leave_control mouse_event
15
+ mouse_hover_control mouse_event
16
+ end
17
+
18
+ private
19
+ def eval_move_block(blk, event)
20
+ blk.call event.x, event.y
21
+ end
22
+
23
+ def mouse_shape_control(mouse_event)
24
+ cursor = if cursor_over_clickable_element? mouse_event
25
+ ::Swt::SWT::CURSOR_HAND
26
+ else
27
+ ::Swt::SWT::CURSOR_ARROW
28
+ end
29
+ @app.shell.setCursor Shoes.display.getSystemCursor(cursor)
30
+ end
31
+
32
+ def mouse_leave_control(mouse_event)
33
+ @app.dsl.mouse_hover_controls.each do |element|
34
+ if !mouse_on?(element, mouse_event) and element.hovered?
35
+ element.mouse_left
36
+ end
37
+ end
38
+ end
39
+
40
+ def mouse_hover_control(mouse_event)
41
+ @app.dsl.mouse_hover_controls.each do |element|
42
+ if mouse_on?(element, mouse_event) and !element.hovered?
43
+ element.mouse_hovered
44
+ end
45
+ end
46
+ end
47
+
48
+ def mouse_on?(element, mouse_event)
49
+ element_visible?(element) && element.in_bounds?(mouse_event.x, mouse_event.y)
50
+ end
51
+
52
+ def element_visible?(element)
53
+ if element.respond_to?(:visible?)
54
+ element.visible?
55
+ else
56
+ false
57
+ end
58
+ end
59
+
60
+ def cursor_over_clickable_element?(mouse_event)
61
+ @app.clickable_elements.any? do |element|
62
+ mouse_on? element, mouse_event
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,52 @@
1
+ class Shoes
2
+ module Swt
3
+ class Oval
4
+ include Common::Fill
5
+ include Common::Stroke
6
+ include Common::Clickable
7
+ include Common::PainterUpdatesPosition
8
+ include Common::Visibility
9
+ include Common::Remove
10
+ include ::Shoes::BackendDimensionsDelegations
11
+
12
+ attr_reader :dsl, :app, :transform, :painter, :container
13
+
14
+
15
+ # @param [Shoes::Oval] dsl the dsl object to provide gui for
16
+ # @param [Shoes::Swt::App] app the app
17
+ # @param [Hash] opts options
18
+ def initialize(dsl, app)
19
+ @dsl = dsl
20
+ @app = app
21
+ @container = @app.real
22
+
23
+ @painter = Painter.new(self)
24
+ @app.add_paint_listener @painter
25
+ end
26
+
27
+ def update_position
28
+ # No-op, since it has its own painter
29
+ end
30
+
31
+ class Painter < Common::Painter
32
+ def clipping
33
+ clipping = ::Swt::Path.new(Shoes.display)
34
+ clipping.add_arc(@obj.element_left, @obj.element_top,
35
+ @obj.element_width, @obj.element_height, 0, 360)
36
+ clipping
37
+ end
38
+
39
+ def fill(graphics_context)
40
+ graphics_context.fill_oval(@obj.element_left, @obj.element_top,
41
+ @obj.element_width, @obj.element_height)
42
+ end
43
+
44
+ def draw(graphics_context)
45
+ sw = graphics_context.get_line_width
46
+ graphics_context.draw_oval(@obj.element_left+sw/2, @obj.element_top+sw/2,
47
+ @obj.element_width-sw, @obj.element_height-sw)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,35 @@
1
+ class Shoes
2
+ module Swt
3
+ class Progress
4
+ include Common::Child
5
+ include Common::Remove
6
+ include Common::Visibility
7
+ include Common::UpdatePosition
8
+ include ::Shoes::BackendDimensionsDelegations
9
+
10
+ attr_reader :parent, :real, :dsl
11
+
12
+ def initialize(dsl, parent)
13
+ @dsl = dsl
14
+ @parent = parent
15
+
16
+ @real = ::Swt::Widgets::ProgressBar.new(@parent.real,
17
+ ::Swt::SWT::SMOOTH)
18
+ @real.minimum = 0
19
+ @real.maximum = 100
20
+
21
+ if @dsl.element_width and @dsl.element_height
22
+ @real.setSize dsl.element_width, dsl.element_height
23
+ else
24
+ @real.pack
25
+ @dsl.element_width = @real.size.x
26
+ @dsl.element_height = @real.size.y
27
+ end
28
+ end
29
+
30
+ def fraction=(value)
31
+ @real.selection = (value*100).to_i unless @real.disposed?
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ class Shoes
2
+ module Swt
3
+ # In Swt a radio button is actually just a
4
+ # button, so a lot of these methods are
5
+ # borrowed from button.rb
6
+ class Radio < CheckButton
7
+ attr_accessor :group
8
+
9
+ # Create a radio button
10
+ #
11
+ # @param [Shoes::Radio] dsl The Shoes DSL radio this represents
12
+ # @param [::Swt::Widgets::Composite] parent The parent element of this button
13
+ # @param [Proc] blk The block of code to call when this button is activated
14
+ def initialize(dsl, parent)
15
+ super(dsl, parent, ::Swt::SWT::RADIO)
16
+ self.group = dsl.group
17
+ end
18
+
19
+ def group=(value)
20
+ group_lookup = RadioGroup.group_lookup
21
+ group_lookup[@group].remove(self) unless @group.nil?
22
+ @group = value || RadioGroup::DEFAULT_RADIO_GROUP
23
+ group_lookup[@group].add self
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+
@@ -0,0 +1,54 @@
1
+ class Shoes
2
+ module Swt
3
+ # In Swt radio groups are managed by composites which occupy space
4
+ # and can interfere with users interacting with other controls. Here
5
+ # we simulate radio groups so that they can all be in one composite.
6
+ class RadioGroup
7
+ extend Forwardable
8
+ include Enumerable
9
+
10
+ DEFAULT_RADIO_GROUP = "Default Radio Group"
11
+
12
+ @group_lookup = Hash.new { |h, k| h[k] = RadioGroup.new(k) }
13
+
14
+ attr_reader :name
15
+ def_delegators :@radio_buttons, :each, :length, :empty?
16
+
17
+ def initialize(name = DEFAULT_RADIO_GROUP)
18
+ @name = name
19
+ @radio_buttons = []
20
+ @selection_listeners = []
21
+ end
22
+
23
+ def add(radio_button)
24
+ return if @radio_buttons.include?(radio_button)
25
+ @radio_buttons << radio_button
26
+
27
+ selection_listener = SelectionListener.new radio_button do |selected_radio, event|
28
+ select_only_one_radio_in_group(selected_radio)
29
+ end
30
+ @selection_listeners << selection_listener
31
+ radio_button.real.add_selection_listener selection_listener
32
+ end
33
+
34
+ def remove(radio_button)
35
+ index = @radio_buttons.index(radio_button)
36
+ return if index.nil?
37
+ @radio_buttons.delete_at(index)
38
+
39
+ radio_button.real.remove_selection_listener @selection_listeners[index]
40
+ @selection_listeners.delete_at(index)
41
+ end
42
+
43
+ def self.group_lookup
44
+ @group_lookup
45
+ end
46
+
47
+ def select_only_one_radio_in_group(selected_radio)
48
+ @radio_buttons.each do |radio|
49
+ radio.real.set_selection(radio == selected_radio)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,30 @@
1
+ class Shoes
2
+ module Swt
3
+ class Rect
4
+ extend Forwardable
5
+ include Common::Fill
6
+ include Common::Stroke
7
+ include Common::Clickable
8
+ include Common::PainterUpdatesPosition
9
+ include Common::Visibility
10
+ include Common::Remove
11
+ include ::Shoes::BackendDimensionsDelegations
12
+
13
+ def_delegators :dsl, :angle
14
+
15
+ attr_reader :dsl, :app, :transform, :painter
16
+
17
+ def initialize(dsl, app)
18
+ @dsl = dsl
19
+ @app = app
20
+
21
+ @painter = RectPainter.new(self)
22
+ @app.add_paint_listener @painter
23
+ end
24
+
25
+ def corners
26
+ dsl.curve
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ class Shoes
2
+ module Swt
3
+ class RectPainter < Common::Painter
4
+ def fill(graphics_context)
5
+ graphics_context.fill_round_rectangle(@obj.element_left,
6
+ @obj.element_top,
7
+ @obj.element_width,
8
+ @obj.element_height,
9
+ @obj.corners*2,
10
+ @obj.corners*2)
11
+ end
12
+
13
+ def draw(gc)
14
+ stroke_width = gc.get_line_width
15
+ gc.draw_round_rectangle(@obj.element_left+stroke_width/2,
16
+ @obj.element_top+stroke_width/2,
17
+ @obj.element_width-stroke_width,
18
+ @obj.element_height-stroke_width,
19
+ @obj.corners*2, @obj.corners*2)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,123 @@
1
+ # This file uses the after_do gem, which you probably haven't heard of (yet)
2
+ # It basically works like Class.after :method do ... end
3
+ # So for every instance of Class, after method is executed the block you
4
+ # gave it is executed.
5
+ # Here it is used to redraw the application, after specific methods are called.
6
+ # So that everything belonging to the aspect of redrawing is in one file.
7
+ # There is more documentation up here: https://github.com/PragTob/after_do
8
+
9
+ class Shoes
10
+ module Swt
11
+ class RedrawingAspect
12
+
13
+ NEED_TO_UPDATE =
14
+ {Animation => [:eval_block],
15
+ Button => [:eval_block],
16
+ Common::Clickable::ClickListener => [:eval_block],
17
+ ::Shoes::InternalApp => [:execute_block],
18
+ Keypress => [:eval_block],
19
+ Keyrelease => [:eval_block],
20
+ MouseMoveListener => [:eval_move_block],
21
+ TextBlock::CursorPainter => [:move_textcursor],
22
+ Timer => [:eval_block],
23
+ ::Shoes::Common::Changeable => [:call_change_listeners]}
24
+ # only the main thread may draw
25
+ NEED_TO_ASYNC_UPDATE_GUI = {::Shoes::Download => [:eval_block]}
26
+
27
+ # These need to trigger a redraw
28
+ SAME_POSITION = {Common::Visibility => [:update_visibility],
29
+ Image => [:update_image],
30
+ ::Shoes::Common::Style => [:update_style],
31
+ ::Shoes::Common::Remove => [:remove],
32
+ ::Shoes::Slot => [:mouse_hovered,
33
+ :mouse_left],
34
+ ::Shoes::TextBlock => [:replace]}
35
+
36
+ CHANGED_POSITION = {::Shoes::Common::Positioning => [:_position]}
37
+
38
+ # These methods trigger SWT painting listeners, so we need to be sure
39
+ # that positioning has run properly before allowing them to continue.
40
+ NEED_CONTENTS_ALIGNMENT = {
41
+ ::Shoes::Swt::Dialog => [:ask_color,
42
+ :dialog_chooser,
43
+ :open_message_box],
44
+ ::Shoes::Swt::AskDialog => [:open]
45
+ }
46
+
47
+
48
+ attr_reader :app
49
+
50
+ def initialize(swt_app, display)
51
+ @app = swt_app
52
+ @display = display
53
+ extend_needed_classes
54
+ add_redraws
55
+ end
56
+
57
+ def remove_redraws
58
+ affected_classes.each {|klass| klass.remove_all_callbacks}
59
+ end
60
+
61
+ private
62
+ def extend_needed_classes
63
+ affected_classes.each {|klass| klass.extend AfterDo}
64
+ end
65
+
66
+ def affected_classes
67
+ classes = NEED_TO_UPDATE.keys +
68
+ NEED_TO_ASYNC_UPDATE_GUI.keys +
69
+ NEED_CONTENTS_ALIGNMENT.keys +
70
+ SAME_POSITION.keys +
71
+ CHANGED_POSITION.keys
72
+ classes.uniq
73
+ end
74
+
75
+ def add_redraws
76
+ after_every NEED_TO_UPDATE do update_gui end
77
+ after_every NEED_TO_ASYNC_UPDATE_GUI do
78
+ @display.asyncExec do update_gui end
79
+ end
80
+ after_every SAME_POSITION do |*args, element|
81
+ element = element.dsl if element.respond_to? :dsl
82
+ redraw_element element, false
83
+ end
84
+ # need to redraw old occupied area and newly occupied area
85
+ before_and_after_every CHANGED_POSITION do |*args, element|
86
+ redraw_element element
87
+ end
88
+ before_every NEED_CONTENTS_ALIGNMENT do |*args|
89
+ app.dsl.top_slot.contents_alignment
90
+ end
91
+ end
92
+
93
+ def update_gui
94
+ app.flush unless app.disposed?
95
+ end
96
+
97
+ def redraw_element(element, include_children = true)
98
+ redraw_area element.element_left, element.element_top,
99
+ element.element_width, element.element_height,
100
+ include_children
101
+ end
102
+
103
+ def redraw_area(left, top, width, height, include_children = true)
104
+ unless app.disposed?
105
+ app.redraw left, top, width, height, include_children
106
+ end
107
+ end
108
+
109
+ def after_every(hash, &blk)
110
+ hash.each {|klass, methods| klass.after methods, &blk }
111
+ end
112
+
113
+ def before_and_after_every(hash, &blk)
114
+ before_every hash, &blk
115
+ after_every hash, &blk
116
+ end
117
+
118
+ def before_every(hash, &blk)
119
+ hash.each {|klass, methods| klass.before methods, &blk }
120
+ end
121
+ end
122
+ end
123
+ end