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