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.
- 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
|