shoes-swt 4.0.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG +84 -0
- data/Gemfile +24 -0
- data/Guardfile +11 -0
- data/LICENSE +31 -0
- data/README.md +201 -0
- data/lib/shoes/swt.rb +118 -0
- data/lib/shoes/swt/animation.rb +46 -0
- data/lib/shoes/swt/app.rb +314 -0
- data/lib/shoes/swt/arc.rb +71 -0
- data/lib/shoes/swt/background.rb +41 -0
- data/lib/shoes/swt/border.rb +41 -0
- data/lib/shoes/swt/button.rb +18 -0
- data/lib/shoes/swt/check.rb +14 -0
- data/lib/shoes/swt/check_button.rb +19 -0
- data/lib/shoes/swt/color.rb +49 -0
- data/lib/shoes/swt/color_factory.rb +32 -0
- data/lib/shoes/swt/common/child.rb +16 -0
- data/lib/shoes/swt/common/clickable.rb +68 -0
- data/lib/shoes/swt/common/container.rb +28 -0
- data/lib/shoes/swt/common/fill.rb +38 -0
- data/lib/shoes/swt/common/painter.rb +92 -0
- data/lib/shoes/swt/common/painter_updates_position.rb +12 -0
- data/lib/shoes/swt/common/remove.rb +30 -0
- data/lib/shoes/swt/common/resource.rb +29 -0
- data/lib/shoes/swt/common/selection_listener.rb +14 -0
- data/lib/shoes/swt/common/stroke.rb +42 -0
- data/lib/shoes/swt/common/update_position.rb +15 -0
- data/lib/shoes/swt/common/visibility.rb +13 -0
- data/lib/shoes/swt/dialog.rb +90 -0
- data/lib/shoes/swt/disposed_protection.rb +23 -0
- data/lib/shoes/swt/download.rb +24 -0
- data/lib/shoes/swt/font.rb +32 -0
- data/lib/shoes/swt/gradient.rb +92 -0
- data/lib/shoes/swt/image.rb +128 -0
- data/lib/shoes/swt/image_pattern.rb +31 -0
- data/lib/shoes/swt/input_box.rb +73 -0
- data/lib/shoes/swt/key_listener.rb +145 -0
- data/lib/shoes/swt/line.rb +60 -0
- data/lib/shoes/swt/link.rb +31 -0
- data/lib/shoes/swt/link_segment.rb +111 -0
- data/lib/shoes/swt/list_box.rb +48 -0
- data/lib/shoes/swt/mouse_move_listener.rb +67 -0
- data/lib/shoes/swt/oval.rb +52 -0
- data/lib/shoes/swt/progress.rb +35 -0
- data/lib/shoes/swt/radio.rb +29 -0
- data/lib/shoes/swt/radio_group.rb +54 -0
- data/lib/shoes/swt/rect.rb +30 -0
- data/lib/shoes/swt/rect_painter.rb +23 -0
- data/lib/shoes/swt/redrawing_aspect.rb +123 -0
- data/lib/shoes/swt/shape.rb +133 -0
- data/lib/shoes/swt/shoes_layout.rb +43 -0
- data/lib/shoes/swt/slot.rb +39 -0
- data/lib/shoes/swt/sound.rb +119 -0
- data/lib/shoes/swt/star.rb +50 -0
- data/lib/shoes/swt/support/jl1.0.1.jar +0 -0
- data/lib/shoes/swt/support/jogg-0.0.7.jar +0 -0
- data/lib/shoes/swt/support/jorbis-0.0.15.jar +0 -0
- data/lib/shoes/swt/support/log4j-1.2.16.jar +0 -0
- data/lib/shoes/swt/support/mp3spi1.9.5.jar +0 -0
- data/lib/shoes/swt/support/tritonus_share.jar +0 -0
- data/lib/shoes/swt/support/vorbisspi1.0.3.jar +0 -0
- data/lib/shoes/swt/swt_button.rb +56 -0
- data/lib/shoes/swt/text_block.rb +124 -0
- data/lib/shoes/swt/text_block/centered_text_segment.rb +22 -0
- data/lib/shoes/swt/text_block/cursor_painter.rb +53 -0
- data/lib/shoes/swt/text_block/fitter.rb +212 -0
- data/lib/shoes/swt/text_block/painter.rb +47 -0
- data/lib/shoes/swt/text_block/text_font_factory.rb +50 -0
- data/lib/shoes/swt/text_block/text_segment.rb +108 -0
- data/lib/shoes/swt/text_block/text_segment_collection.rb +160 -0
- data/lib/shoes/swt/text_block/text_style_factory.rb +88 -0
- data/lib/shoes/swt/timer.rb +19 -0
- data/lib/shoes/swt/tooling/leak_hunter.rb +35 -0
- data/lib/shoes/swt/version.rb +5 -0
- data/manifests/common.rb +34 -0
- data/manifests/shoes-swt.rb +29 -0
- data/shoes-swt.gemspec +24 -0
- data/spec/code_coverage.rb +14 -0
- data/spec/shoes/animation_spec.rb +65 -0
- data/spec/shoes/app_spec.rb +484 -0
- data/spec/shoes/arc_spec.rb +51 -0
- data/spec/shoes/background_spec.rb +53 -0
- data/spec/shoes/border_spec.rb +47 -0
- data/spec/shoes/builtin_methods_spec.rb +110 -0
- data/spec/shoes/button_spec.rb +44 -0
- data/spec/shoes/check_spec.rb +35 -0
- data/spec/shoes/cli_spec.rb +15 -0
- data/spec/shoes/color_spec.rb +408 -0
- data/spec/shoes/common/inspect_spec.rb +26 -0
- data/spec/shoes/common/remove_spec.rb +38 -0
- data/spec/shoes/common/style_normalizer_spec.rb +28 -0
- data/spec/shoes/common/style_spec.rb +147 -0
- data/spec/shoes/configuration_spec.rb +36 -0
- data/spec/shoes/constants_spec.rb +38 -0
- data/spec/shoes/dialog_spec.rb +163 -0
- data/spec/shoes/dimension_spec.rb +407 -0
- data/spec/shoes/dimensions_spec.rb +837 -0
- data/spec/shoes/download_spec.rb +142 -0
- data/spec/shoes/flow_spec.rb +133 -0
- data/spec/shoes/font_spec.rb +37 -0
- data/spec/shoes/framework_learning_spec.rb +30 -0
- data/spec/shoes/gradient_spec.rb +32 -0
- data/spec/shoes/helpers/fake_element.rb +17 -0
- data/spec/shoes/helpers/inspect_helpers.rb +5 -0
- data/spec/shoes/helpers/sample17_helper.rb +66 -0
- data/spec/shoes/image_spec.rb +49 -0
- data/spec/shoes/images/shoe.jpg +0 -0
- data/spec/shoes/input_box_spec.rb +80 -0
- data/spec/shoes/integration_spec.rb +20 -0
- data/spec/shoes/internal_app_spec.rb +141 -0
- data/spec/shoes/keypress_spec.rb +11 -0
- data/spec/shoes/keyrelease_spec.rb +12 -0
- data/spec/shoes/line_spec.rb +49 -0
- data/spec/shoes/link_spec.rb +105 -0
- data/spec/shoes/list_box_spec.rb +74 -0
- data/spec/shoes/logger/ruby_spec.rb +8 -0
- data/spec/shoes/logger_spec.rb +45 -0
- data/spec/shoes/oval_spec.rb +24 -0
- data/spec/shoes/point_spec.rb +71 -0
- data/spec/shoes/progress_spec.rb +54 -0
- data/spec/shoes/radio_spec.rb +32 -0
- data/spec/shoes/rect_spec.rb +39 -0
- data/spec/shoes/renamed_delegate_spec.rb +70 -0
- data/spec/shoes/shape_spec.rb +95 -0
- data/spec/shoes/shared_examples/button.rb +6 -0
- data/spec/shoes/shared_examples/changeable.rb +26 -0
- data/spec/shoes/shared_examples/clickable.rb +5 -0
- data/spec/shoes/shared_examples/common_methods.rb +35 -0
- data/spec/shoes/shared_examples/dimensions.rb +32 -0
- data/spec/shoes/shared_examples/dsl.rb +44 -0
- data/spec/shoes/shared_examples/dsl/animate.rb +29 -0
- data/spec/shoes/shared_examples/dsl/arc.rb +45 -0
- data/spec/shoes/shared_examples/dsl/background.rb +26 -0
- data/spec/shoes/shared_examples/dsl/border.rb +10 -0
- data/spec/shoes/shared_examples/dsl/button.rb +5 -0
- data/spec/shoes/shared_examples/dsl/cap.rb +6 -0
- data/spec/shoes/shared_examples/dsl/check.rb +11 -0
- data/spec/shoes/shared_examples/dsl/edit_box.rb +8 -0
- data/spec/shoes/shared_examples/dsl/edit_line.rb +8 -0
- data/spec/shoes/shared_examples/dsl/editable_element.rb +29 -0
- data/spec/shoes/shared_examples/dsl/fill.rb +27 -0
- data/spec/shoes/shared_examples/dsl/flow.rb +15 -0
- data/spec/shoes/shared_examples/dsl/gradient.rb +62 -0
- data/spec/shoes/shared_examples/dsl/image.rb +21 -0
- data/spec/shoes/shared_examples/dsl/line.rb +9 -0
- data/spec/shoes/shared_examples/dsl/nofill.rb +6 -0
- data/spec/shoes/shared_examples/dsl/nostroke.rb +6 -0
- data/spec/shoes/shared_examples/dsl/oval.rb +88 -0
- data/spec/shoes/shared_examples/dsl/pattern.rb +34 -0
- data/spec/shoes/shared_examples/dsl/progress.rb +7 -0
- data/spec/shoes/shared_examples/dsl/rect.rb +92 -0
- data/spec/shoes/shared_examples/dsl/rgb.rb +26 -0
- data/spec/shoes/shared_examples/dsl/shape.rb +21 -0
- data/spec/shoes/shared_examples/dsl/star.rb +48 -0
- data/spec/shoes/shared_examples/dsl/stroke.rb +30 -0
- data/spec/shoes/shared_examples/dsl/strokewidth.rb +19 -0
- data/spec/shoes/shared_examples/dsl/style.rb +32 -0
- data/spec/shoes/shared_examples/dsl/text_elements.rb +81 -0
- data/spec/shoes/shared_examples/dsl/video.rb +5 -0
- data/spec/shoes/shared_examples/dsl_app_context.rb +8 -0
- data/spec/shoes/shared_examples/hover_leave.rb +11 -0
- data/spec/shoes/shared_examples/parent.rb +6 -0
- data/spec/shoes/shared_examples/scroll.rb +41 -0
- data/spec/shoes/shared_examples/shared_element_method.rb +60 -0
- data/spec/shoes/shared_examples/slot.rb +331 -0
- data/spec/shoes/shared_examples/state.rb +19 -0
- data/spec/shoes/shared_examples/style.rb +82 -0
- data/spec/shoes/slot_spec.rb +130 -0
- data/spec/shoes/sound_spec.rb +15 -0
- data/spec/shoes/span_spec.rb +112 -0
- data/spec/shoes/spec_helper.rb +24 -0
- data/spec/shoes/stack_spec.rb +79 -0
- data/spec/shoes/star_spec.rb +31 -0
- data/spec/shoes/text_block_dimensions_spec.rb +75 -0
- data/spec/shoes/text_block_spec.rb +270 -0
- data/spec/shoes/url_spec.rb +68 -0
- data/spec/shoes/widget_spec.rb +70 -0
- data/spec/shoes_spec.rb +44 -0
- data/spec/spec_helper.rb +18 -0
- data/spec/swt_shoes/animation_spec.rb +86 -0
- data/spec/swt_shoes/app_spec.rb +84 -0
- data/spec/swt_shoes/arc_spec.rb +103 -0
- data/spec/swt_shoes/background_spec.rb +67 -0
- data/spec/swt_shoes/border_spec.rb +52 -0
- data/spec/swt_shoes/button_spec.rb +101 -0
- data/spec/swt_shoes/check_spec.rb +28 -0
- data/spec/swt_shoes/color_factory_spec.rb +49 -0
- data/spec/swt_shoes/color_spec.rb +67 -0
- data/spec/swt_shoes/common/painter_spec.rb +49 -0
- data/spec/swt_shoes/common/remove_spec.rb +53 -0
- data/spec/swt_shoes/configuration_spec.rb +12 -0
- data/spec/swt_shoes/dialog_spec.rb +106 -0
- data/spec/swt_shoes/disposed_protection_spec.rb +49 -0
- data/spec/swt_shoes/flow_spec.rb +36 -0
- data/spec/swt_shoes/font_spec.rb +33 -0
- data/spec/swt_shoes/gradient_spec.rb +31 -0
- data/spec/swt_shoes/image_pattern_spec.rb +35 -0
- data/spec/swt_shoes/image_spec.rb +100 -0
- data/spec/swt_shoes/input_box_spec.rb +116 -0
- data/spec/swt_shoes/integration_spec.rb +27 -0
- data/spec/swt_shoes/key_listener_spec.rb +325 -0
- data/spec/swt_shoes/line_spec.rb +49 -0
- data/spec/swt_shoes/link_segment_spec.rb +120 -0
- data/spec/swt_shoes/link_spec.rb +54 -0
- data/spec/swt_shoes/list_box_spec.rb +56 -0
- data/spec/swt_shoes/minimal.png +0 -0
- data/spec/swt_shoes/mouse_move_listener_spec.rb +123 -0
- data/spec/swt_shoes/oval_spec.rb +51 -0
- data/spec/swt_shoes/progress_spec.rb +44 -0
- data/spec/swt_shoes/radio_group_spec.rb +73 -0
- data/spec/swt_shoes/radio_spec.rb +56 -0
- data/spec/swt_shoes/rect_painter_spec.rb +45 -0
- data/spec/swt_shoes/rect_spec.rb +19 -0
- data/spec/swt_shoes/shape_spec.rb +84 -0
- data/spec/swt_shoes/shared_examples/button.rb +21 -0
- data/spec/swt_shoes/shared_examples/clickable.rb +85 -0
- data/spec/swt_shoes/shared_examples/movable.rb +36 -0
- data/spec/swt_shoes/shared_examples/paintable.rb +7 -0
- data/spec/swt_shoes/shared_examples/painter.rb +83 -0
- data/spec/swt_shoes/shared_examples/pattern.rb +32 -0
- data/spec/swt_shoes/shared_examples/removable.rb +41 -0
- data/spec/swt_shoes/shared_examples/swt_app_context.rb +23 -0
- data/spec/swt_shoes/shared_examples/visibility.rb +15 -0
- data/spec/swt_shoes/shell_control_listener_spec.rb +23 -0
- data/spec/swt_shoes/slot_spec.rb +24 -0
- data/spec/swt_shoes/sound.rb +10 -0
- data/spec/swt_shoes/spec_helper.rb +31 -0
- data/spec/swt_shoes/star_spec.rb +47 -0
- data/spec/swt_shoes/text_block/centered_text_segment_spec.rb +16 -0
- data/spec/swt_shoes/text_block/cursor_painter_spec.rb +120 -0
- data/spec/swt_shoes/text_block/fitter_spec.rb +213 -0
- data/spec/swt_shoes/text_block/painter_spec.rb +212 -0
- data/spec/swt_shoes/text_block/text_font_factory_spec.rb +40 -0
- data/spec/swt_shoes/text_block/text_segment_collection_spec.rb +256 -0
- data/spec/swt_shoes/text_block/text_segment_spec.rb +135 -0
- data/spec/swt_shoes/text_block_spec.rb +199 -0
- 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
|