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,31 @@
1
+ class Shoes
2
+ module Swt
3
+ class ImagePattern
4
+ include Common::Remove
5
+
6
+ def initialize(dsl)
7
+ @dsl = dsl
8
+ end
9
+
10
+ def dispose
11
+ @image.dispose if @image
12
+ @pattern.dispose if @pattern
13
+ end
14
+
15
+ # Since colors are bound up (at least in specs) with image patterns,
16
+ # we can't safely touch images during initialize, so lazily load them.
17
+ def pattern
18
+ @image ||= ::Swt::Image.new(Shoes.display, @dsl.path)
19
+ @pattern ||= ::Swt::Pattern.new(Shoes.display, @image)
20
+ end
21
+
22
+ def apply_as_fill(gc, left, top, width, height, angle = 0)
23
+ gc.set_background_pattern pattern
24
+ end
25
+
26
+ def apply_as_stroke(gc, left, top, width, height, angle = 0)
27
+ gc.set_foreground_pattern pattern
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,73 @@
1
+ class Shoes
2
+ module Swt
3
+ # Class is used by edit_box and edit_line
4
+ class InputBox
5
+ include Common::Child
6
+ include Common::Remove
7
+ include Common::PainterUpdatesPosition
8
+ include Common::Visibility
9
+ include Common::UpdatePosition
10
+ include ::Shoes::BackendDimensionsDelegations
11
+
12
+ attr_reader :real, :dsl, :parent
13
+
14
+ def initialize(dsl, parent, text_options)
15
+ @dsl = dsl
16
+ @parent = parent
17
+
18
+ @real = ::Swt::Widgets::Text.new(@parent.real, text_options)
19
+ @real.set_size dsl.element_width, dsl.element_height
20
+ @real.set_text dsl.style[:text]
21
+ @real.add_modify_listener do |event|
22
+ @dsl.call_change_listeners unless nothing_changed?(event)
23
+ end
24
+ end
25
+
26
+ def text
27
+ @real.text
28
+ end
29
+
30
+ def text=(value)
31
+ @last_text = @real.text
32
+ @real.text = value
33
+ end
34
+
35
+ def enabled(value)
36
+ @real.enable_widget value
37
+ end
38
+
39
+ def highlight_text(start_index, final_index)
40
+ @real.set_selection(start_index, final_index)
41
+ end
42
+
43
+ def caret_to(index)
44
+ @real.set_selection(index)
45
+ end
46
+
47
+ private
48
+ def nothing_changed?(event)
49
+ source = event.source
50
+ event.instance_of?(Java::OrgEclipseSwtEvents::ModifyEvent) &&
51
+ source.instance_of?(Java::OrgEclipseSwtWidgets::Text) &&
52
+ source.text == @last_text
53
+ end
54
+ end
55
+
56
+ class EditLine < InputBox
57
+ DEFAULT_STYLES = ::Swt::SWT::SINGLE | ::Swt::SWT::BORDER
58
+ def initialize(dsl, parent)
59
+ styles = DEFAULT_STYLES
60
+ styles |= ::Swt::SWT::PASSWORD if dsl.secret?
61
+ super(dsl, parent, styles)
62
+ end
63
+ end
64
+
65
+ class EditBox < InputBox
66
+ DEFAULT_STYLES = ::Swt::SWT::MULTI | ::Swt::SWT::BORDER | ::Swt::SWT::WRAP | ::Swt::SWT::V_SCROLL
67
+ def initialize(dsl, parent)
68
+ super(dsl, parent, DEFAULT_STYLES)
69
+ end
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,145 @@
1
+ class Shoes
2
+ module Swt
3
+ class KeyListener
4
+ include ::Swt::KeyListener
5
+
6
+ def self.get_swt_constant(name)
7
+ ::Swt::SWT.const_get name
8
+ end
9
+
10
+ SPECIAL_KEY_NAMES = {}
11
+
12
+ %w[TAB PAGE_UP PAGE_DOWN HOME END F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12
13
+ F13 F14 F15].each do|key|
14
+ SPECIAL_KEY_NAMES[get_swt_constant key] = key.downcase
15
+ end
16
+ %w[UP DOWN LEFT RIGHT].each do |key|
17
+ SPECIAL_KEY_NAMES[get_swt_constant "ARROW_#{key}"] = key.downcase
18
+ end
19
+
20
+ SPECIAL_KEY_NAMES[::Swt::SWT::DEL] = "delete"
21
+ SPECIAL_KEY_NAMES[::Swt::SWT::BS] = "backspace"
22
+ SPECIAL_KEY_NAMES[::Swt::SWT::ESC] = "escape"
23
+ SPECIAL_KEY_NAMES[::Swt::SWT::CR] = "\n"
24
+
25
+ MODIFIER_KEYS = %w[CTRL SHIFT ALT CAPS_LOCK COMMAND].map do |key|
26
+ get_swt_constant key
27
+ end
28
+
29
+ def initialize(dsl, app, &blk)
30
+ @block = blk
31
+ @app = app
32
+ @app.add_key_listener(self)
33
+ end
34
+
35
+ def handle_key_event(event)
36
+ modifiers = modifier_keys(event)
37
+ character = character_key(event)
38
+ key_string = modifiers + character
39
+ key_string = key_string.to_sym if should_be_symbol?(event, modifiers)
40
+ eval_block key_string unless character.empty?
41
+ end
42
+
43
+ def remove
44
+ @app.remove_key_listener(self)
45
+ end
46
+
47
+ BUTTON_EXCLUDES = ["\n", " "]
48
+ COMBO_EXCLUDES = %w[up down] + BUTTON_EXCLUDES
49
+
50
+ # For a variety of SWT controls, certain characters should not be passed
51
+ # to Shoes key listeners, since they're already handled by the controls.
52
+ #
53
+ # * Buttons ignore activating key press (enter, space depending on OS)
54
+ # * Text boxes ignore all key presses
55
+ # * Combo boxes ignore up/down and activating key presses
56
+ def ignore_event?(event)
57
+ char = character_key(event)
58
+ case event.widget
59
+ when Java::OrgEclipseSwtWidgets::Button
60
+ BUTTON_EXCLUDES.include?(char)
61
+ when Java::OrgEclipseSwtWidgets::Text
62
+ true
63
+ when Java::OrgEclipseSwtWidgets::Combo
64
+ COMBO_EXCLUDES.include?(char)
65
+ else
66
+ # Default? Don't ignore it!
67
+ false
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ def eval_block(key_string)
74
+ @block.call key_string
75
+ end
76
+
77
+ def modifier_keys(event)
78
+ modifier_keys = ''
79
+ modifier_keys += 'control_' if control?(event)
80
+ modifier_keys += 'shift_' if shift?(event) && special_key?(event)
81
+ modifier_keys += 'alt_' if alt?(event)
82
+ modifier_keys
83
+ end
84
+
85
+ def alt?(event)
86
+ is_this_modifier_key?(event, ::Swt::SWT::ALT)
87
+ end
88
+
89
+ # NOTE: state_mask and key_code error for me so the java version is used
90
+ def is_this_modifier_key?(event, key)
91
+ (event.stateMask & key) == key
92
+ end
93
+
94
+ def shift?(event)
95
+ is_this_modifier_key?(event, ::Swt::SWT::SHIFT)
96
+ end
97
+
98
+ def control?(event)
99
+ is_this_modifier_key?(event, ::Swt::SWT::CTRL)
100
+ end
101
+
102
+ def character_key(event)
103
+ return '' if current_key_is_modifier?(event)
104
+ if special_key?(event)
105
+ SPECIAL_KEY_NAMES[event.keyCode]
106
+ elsif control?(event) || alt?(event)
107
+ character_for_modified_keypress(event)
108
+ else
109
+ event.character.chr('UTF-8')
110
+ end
111
+ end
112
+
113
+ def character_for_modified_keypress(event)
114
+ character = event.keyCode.chr('UTF-8')
115
+ if shift?(event)
116
+ character.upcase
117
+ else
118
+ character
119
+ end
120
+ end
121
+
122
+ def special_key?(event)
123
+ SPECIAL_KEY_NAMES[event.keyCode]
124
+ end
125
+
126
+ def current_key_is_modifier?(event)
127
+ MODIFIER_KEYS.include? event.keyCode
128
+ end
129
+
130
+ def should_be_symbol?(event, modifiers)
131
+ !modifiers.empty? || (special_key?(event) && !enter?(event))
132
+ end
133
+
134
+ def enter?(event)
135
+ event.keyCode == ::Swt::SWT::CR
136
+ end
137
+ end
138
+
139
+ class Keypress < KeyListener
140
+ end
141
+
142
+ class Keyrelease < KeyListener
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,60 @@
1
+ class Shoes
2
+ module Swt
3
+ class Line
4
+ include Common::Clickable
5
+ include Common::Stroke
6
+ include Common::Visibility
7
+ include Common::Remove
8
+ include Common::PainterUpdatesPosition
9
+ include ::Shoes::BackendDimensionsDelegations
10
+
11
+ attr_reader :dsl, :app
12
+ attr_reader :translated_point_a, :translated_point_b
13
+ attr_reader :transform
14
+
15
+ # @param [Shoes::Line] dsl The {Shoes::Line} implemented by this object
16
+ # @param [Shoes::Swt::App] app The {Swt::App} this object belongs to
17
+ # @param [Shoes::Point] point_a One endpoint of the line
18
+ # @param [Shoes::Point] point_b The other endpoint of the line
19
+ def initialize(dsl, app)
20
+ @dsl, @app = dsl, app
21
+ translate_according_to_enclosing_box
22
+ @painter = Painter.new(self)
23
+ @app.add_paint_listener(@painter)
24
+ end
25
+
26
+ def dispose
27
+ @transform.dispose unless @transform.disposed?
28
+ end
29
+
30
+ def angle
31
+ @dsl.angle
32
+ end
33
+
34
+ def update_position
35
+ translate_according_to_enclosing_box
36
+ end
37
+
38
+ private
39
+ def translate_according_to_enclosing_box
40
+ @translated_point_a = @dsl.point_a.to(-left, -top)
41
+ @translated_point_b = @dsl.point_b.to(-left, -top)
42
+ @transform = ::Swt::Transform.new(::Swt.display)
43
+ @transform_elements = Java::float[6].new
44
+ @transform.get_elements @transform_elements
45
+ @transform.set_elements @transform_elements[0], @transform_elements[1], @transform_elements[2], @transform_elements[3], dsl.element_left, dsl.element_top
46
+ end
47
+
48
+ class Painter < Common::Painter
49
+ def draw(gc)
50
+ point_a, point_b = @obj.translated_point_a, @obj.translated_point_b
51
+ gc.draw_line(point_a.x, point_a.y, point_b.x, point_b.y)
52
+ end
53
+
54
+ # Don't do fill setup
55
+ def fill_setup(gc)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,31 @@
1
+ class Shoes
2
+ module Swt
3
+ class Link
4
+ include Common::Clickable
5
+
6
+ attr_reader :app, :link_segments, :dsl
7
+
8
+ def initialize(dsl, app)
9
+ @app = app
10
+ @link_segments = []
11
+ @dsl = dsl
12
+ end
13
+
14
+ def remove
15
+ @link_segments.clear
16
+ remove_listener_for self, ::Swt::SWT::MouseDown
17
+ end
18
+
19
+ def create_links_in(text_segment_ranges)
20
+ @link_segments.clear
21
+ text_segment_ranges.each do |text_segment, range|
22
+ @link_segments << LinkSegment.new(text_segment, range)
23
+ end
24
+ end
25
+
26
+ def in_bounds?(x, y)
27
+ @link_segments.any? {|segment| segment.in_bounds?(x, y)}
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,111 @@
1
+ class Shoes
2
+ module Swt
3
+ class LinkSegment
4
+ def initialize(text_segment, range)
5
+ @regions = []
6
+ @range = range
7
+ @text_segment = text_segment
8
+
9
+ # Don't create regions for empty links!
10
+ return unless @range.count > 0
11
+
12
+ add_regions_for_lines(lines_for_link)
13
+ offset_regions(text_segment.element_left, text_segment.element_top)
14
+ end
15
+
16
+ def add_regions_for_lines(lines)
17
+ first_line = lines.shift
18
+ last_line = lines.pop
19
+
20
+ if last_line.nil?
21
+ add_region_for_single_line(first_line)
22
+ else
23
+ add_regions_for_first_and_last_lines(first_line, last_line)
24
+ add_regions_for_remaining_lines(lines)
25
+ end
26
+ end
27
+
28
+ def lines_for_link
29
+ line_bounds.select do |bound|
30
+ line_in_bounds?(bound)
31
+ end
32
+ end
33
+
34
+ def line_bounds
35
+ (0..layout.line_count-1).map do |index|
36
+ layout.line_bounds(index)
37
+ end
38
+ end
39
+
40
+ def line_in_bounds?(bound)
41
+ bound.y >= start_position.y && bound.y <= end_position.y
42
+ end
43
+
44
+ def add_region_for_single_line(first_line)
45
+ add_region(start_position.x, start_position.y,
46
+ end_position.x, end_position.y + first_line.height)
47
+ end
48
+
49
+ def add_regions_for_first_and_last_lines(first_line, last_line)
50
+ add_region(start_position.x, start_position.y,
51
+ layout.width, start_position.y + first_line.height)
52
+ add_region(0, end_position.y,
53
+ end_position.x, end_position.y + last_line.height)
54
+ end
55
+
56
+ def add_regions_for_remaining_lines(lines)
57
+ lines.each do |line|
58
+ add_region(line.x, line.y,
59
+ line.x + line.width, line.y + line.height)
60
+ end
61
+ end
62
+
63
+ def add_region(left, top, right, bottom)
64
+ @regions << Region.new(left, top, right, bottom)
65
+ end
66
+
67
+ def offset_regions(left, top)
68
+ @regions.each do |region|
69
+ region.offset_by!(left, top)
70
+ end
71
+ end
72
+
73
+ def in_bounds?(x, y)
74
+ @regions.any? {|region| region.in_bounds?(x, y)}
75
+ end
76
+
77
+ def start_position
78
+ @text_segment.get_location(@range.first, false)
79
+ end
80
+
81
+ def end_position
82
+ @text_segment.get_location(@range.last, true)
83
+ end
84
+
85
+ def layout
86
+ @text_segment.layout
87
+ end
88
+
89
+ class Region
90
+ def initialize(start_x, start_y, end_x, end_y)
91
+ @start_x = start_x
92
+ @start_y = start_y
93
+ @end_x = end_x
94
+ @end_y = end_y
95
+ end
96
+
97
+ def offset_by!(left, top)
98
+ @start_x += left
99
+ @end_x += left
100
+
101
+ @start_y += top
102
+ @end_y += top
103
+ end
104
+
105
+ def in_bounds?(x, y)
106
+ (@start_x..@end_x).include?(x) and (@start_y..@end_y).include?(y)
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end