shoes-swt 4.0.0.pre12 → 4.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/bin/shoes-swt +1 -0
  3. data/lib/shoes/swt.rb +3 -1
  4. data/lib/shoes/swt/animation.rb +1 -0
  5. data/lib/shoes/swt/app.rb +12 -11
  6. data/lib/shoes/swt/arc.rb +1 -0
  7. data/lib/shoes/swt/arc_painter.rb +4 -3
  8. data/lib/shoes/swt/arrow.rb +1 -0
  9. data/lib/shoes/swt/arrow_painter.rb +10 -5
  10. data/lib/shoes/swt/background.rb +1 -0
  11. data/lib/shoes/swt/border.rb +1 -0
  12. data/lib/shoes/swt/button.rb +1 -0
  13. data/lib/shoes/swt/check.rb +1 -0
  14. data/lib/shoes/swt/check_button.rb +1 -0
  15. data/lib/shoes/swt/click_listener.rb +1 -0
  16. data/lib/shoes/swt/color.rb +1 -0
  17. data/lib/shoes/swt/color_factory.rb +1 -0
  18. data/lib/shoes/swt/common/clickable.rb +1 -0
  19. data/lib/shoes/swt/common/container.rb +1 -0
  20. data/lib/shoes/swt/common/fill.rb +2 -1
  21. data/lib/shoes/swt/common/focus.rb +5 -0
  22. data/lib/shoes/swt/common/image_handling.rb +11 -5
  23. data/lib/shoes/swt/common/painter.rb +21 -1
  24. data/lib/shoes/swt/common/painter_updates_position.rb +1 -0
  25. data/lib/shoes/swt/common/remove.rb +16 -3
  26. data/lib/shoes/swt/common/resource.rb +1 -0
  27. data/lib/shoes/swt/common/selection_listener.rb +1 -0
  28. data/lib/shoes/swt/common/stroke.rb +1 -0
  29. data/lib/shoes/swt/common/translate.rb +1 -0
  30. data/lib/shoes/swt/common/update_position.rb +1 -0
  31. data/lib/shoes/swt/common/visibility.rb +7 -2
  32. data/lib/shoes/swt/dialog.rb +1 -0
  33. data/lib/shoes/swt/disposed_protection.rb +1 -0
  34. data/lib/shoes/swt/download.rb +1 -0
  35. data/lib/shoes/swt/font.rb +1 -0
  36. data/lib/shoes/swt/generate_backend.rb +10 -10
  37. data/lib/shoes/swt/gradient.rb +24 -6
  38. data/lib/shoes/swt/image.rb +6 -10
  39. data/lib/shoes/swt/image_painter.rb +26 -0
  40. data/lib/shoes/swt/image_pattern.rb +1 -0
  41. data/lib/shoes/swt/input_box.rb +1 -0
  42. data/lib/shoes/swt/key_listener.rb +6 -5
  43. data/lib/shoes/swt/line.rb +1 -0
  44. data/lib/shoes/swt/line_painter.rb +3 -2
  45. data/lib/shoes/swt/link.rb +1 -0
  46. data/lib/shoes/swt/link_segment.rb +1 -0
  47. data/lib/shoes/swt/list_box.rb +1 -0
  48. data/lib/shoes/swt/mouse_move_listener.rb +1 -0
  49. data/lib/shoes/swt/oval.rb +1 -0
  50. data/lib/shoes/swt/oval_painter.rb +4 -3
  51. data/lib/shoes/swt/packager.rb +1 -0
  52. data/lib/shoes/swt/progress.rb +1 -0
  53. data/lib/shoes/swt/radio.rb +4 -3
  54. data/lib/shoes/swt/radio_group.rb +1 -0
  55. data/lib/shoes/swt/rect.rb +1 -2
  56. data/lib/shoes/swt/rect_painter.rb +3 -2
  57. data/lib/shoes/swt/redrawing_aspect.rb +16 -12
  58. data/lib/shoes/swt/shape.rb +5 -3
  59. data/lib/shoes/swt/shape_painter.rb +12 -0
  60. data/lib/shoes/swt/shoes_layout.rb +1 -0
  61. data/lib/shoes/swt/slot.rb +24 -13
  62. data/lib/shoes/swt/sound.rb +1 -1
  63. data/lib/shoes/swt/star.rb +1 -0
  64. data/lib/shoes/swt/star_painter.rb +2 -1
  65. data/lib/shoes/swt/swt_button.rb +1 -0
  66. data/lib/shoes/swt/text_block.rb +1 -0
  67. data/lib/shoes/swt/text_block/centered_text_segment.rb +1 -0
  68. data/lib/shoes/swt/text_block/cursor_painter.rb +1 -0
  69. data/lib/shoes/swt/text_block/fitter.rb +1 -0
  70. data/lib/shoes/swt/text_block/painter.rb +1 -0
  71. data/lib/shoes/swt/text_block/text_font_factory.rb +2 -0
  72. data/lib/shoes/swt/text_block/text_segment.rb +1 -0
  73. data/lib/shoes/swt/text_block/text_segment_collection.rb +1 -0
  74. data/lib/shoes/swt/text_block/text_style_factory.rb +1 -0
  75. data/lib/shoes/swt/timer.rb +1 -0
  76. data/lib/shoes/swt/tooling/leak_hunter.rb +1 -0
  77. data/lib/shoes/swt/version.rb +1 -1
  78. metadata +7 -6
@@ -1,11 +1,16 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  module Common
5
6
  module Visibility
6
7
  def update_visibility
7
- if @real && @real.respond_to?(:set_visible)
8
- @real.set_visible(@dsl.visible?)
8
+ if defined?(@real) && @real.respond_to?(:set_visible)
9
+ # hidden_from_view? handles all visiblity conditions, including
10
+ # being outside a slot. SWT as backend doesn't get that for free
11
+ # because we can't use Composites as they lack transparency...
12
+ visible = !@dsl.hidden_from_view?
13
+ @real.set_visible(visible)
9
14
  end
10
15
  end
11
16
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Dialog
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  module DisposedProtection
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Download
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  module Font
@@ -7,21 +7,21 @@ class Shoes
7
7
  class << self
8
8
  def validate
9
9
  if RUBY_ENGINE != "jruby"
10
- puts <<-EOS
10
+ puts <<~EOS
11
11
 
12
- *******************************************************************************
13
- The shoes-swt backend requires a 9.X version of JRuby.
12
+ *******************************************************************************
13
+ The shoes-swt backend requires a 9.X version of JRuby.
14
14
 
15
- You are running the following Ruby instead:
15
+ You are running the following Ruby instead:
16
16
 
17
- #{RUBY_DESCRIPTION}
17
+ #{RUBY_DESCRIPTION}
18
18
 
19
- Please download JRuby from http://jruby.org (or your favorite Ruby version
20
- manager), then check our https://github.com/shoes/shoes4#installing-shoes-4 to
21
- get Shoes installed.
19
+ Please download JRuby from http://jruby.org (or your favorite Ruby version
20
+ manager), then check our https://github.com/shoes/shoes4#installing-shoes-4 to
21
+ get Shoes installed.
22
22
 
23
- Sorry for the inconvenience!
24
- *******************************************************************************
23
+ Sorry for the inconvenience!
24
+ *******************************************************************************
25
25
 
26
26
  EOS
27
27
  exit 1
@@ -1,4 +1,16 @@
1
1
  # frozen_string_literal: true
2
+
3
+ # Gradients are a little confusing, but don't let all the math below scare you.
4
+ # Here's the (relatively) simple explanation of what's going on.
5
+ #
6
+ # ::SWT::Pattern, the underlying class we use, defines a gradient by a starting
7
+ # and ending point. We account the angle into it by changing these points.
8
+ #
9
+ # To look right, the start/end points must be outside our shape! If not, then
10
+ # we get a hard line where the color resets without fading, which looks bad.
11
+ # Given that, we must keep those points outside our bounds of the element,
12
+ # which are reported via the redraw_left, redraw_top, etc. methods.
13
+
2
14
  class Shoes
3
15
  module Swt
4
16
  class Gradient
@@ -7,6 +19,8 @@ class Shoes
7
19
  def initialize(dsl)
8
20
  @dsl = dsl
9
21
  @patterns = []
22
+ @color1 = nil
23
+ @color2 = nil
10
24
  end
11
25
 
12
26
  def dispose
@@ -42,12 +56,16 @@ class Shoes
42
56
 
43
57
  private
44
58
 
45
- def create_pattern(dsl)
46
- width = dsl.element_width * 0.5
47
- height = dsl.element_height * 0.5
48
- angle = normalize_angle(-dsl.angle)
49
- left, top, width, height = determine_args_based_on_angle(angle, dsl.element_left,
50
- dsl.element_top, width, height)
59
+ def create_pattern(gui)
60
+ dsl = gui.dsl
61
+ width = dsl.redraw_width * 0.5
62
+ height = dsl.redraw_height * 0.5
63
+ angle = normalize_angle(-(dsl.angle || 0))
64
+ left, top, width, height = determine_args_based_on_angle(angle,
65
+ dsl.redraw_left,
66
+ dsl.redraw_top,
67
+ width,
68
+ height)
51
69
 
52
70
  pattern = ::Swt::Pattern.new Shoes.display, left, top, width, height,
53
71
  color1.real, color2.real
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'fileutils'
3
4
 
4
5
  class Shoes
@@ -14,13 +15,16 @@ class Shoes
14
15
  include Common::ImageHandling
15
16
  include ::Shoes::BackendDimensionsDelegations
16
17
 
17
- attr_reader :app, :real, :dsl, :painter
18
+ attr_reader :app, :real, :dsl, :painter, :full_width, :full_height
18
19
 
19
20
  def initialize(dsl, app)
20
21
  @dsl = dsl
21
22
  @app = app
23
+ @tmpname_or_data = nil
22
24
  update_image
23
- add_paint_listener
25
+
26
+ @painter = ImagePainter.new(self)
27
+ app.add_paint_listener(@painter)
24
28
  end
25
29
 
26
30
  def update_image
@@ -116,14 +120,6 @@ class Shoes
116
120
  end
117
121
  data
118
122
  end
119
-
120
- def add_paint_listener
121
- @painter = lambda do |event|
122
- graphics_context = event.gc
123
- graphics_context.drawImage @real, 0, 0, @full_width, @full_height, dsl.element_left, dsl.element_top, dsl.element_width, dsl.element_height unless @dsl.hidden
124
- end
125
- app.add_paint_listener(@painter)
126
- end
127
123
  end
128
124
  end
129
125
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Shoes
4
+ module Swt
5
+ class ImagePainter
6
+ include Common::Resource
7
+
8
+ def initialize(image)
9
+ @image = image
10
+ @dsl = image.dsl
11
+ end
12
+
13
+ def paint_control(event)
14
+ return if @dsl.hidden
15
+
16
+ graphics_context = event.gc
17
+ clip_context_to(graphics_context, @dsl.parent) do
18
+ graphics_context.drawImage(@image.real, 0, 0,
19
+ @image.full_width, @image.full_height,
20
+ @dsl.element_left, @dsl.element_top,
21
+ @dsl.element_width, @dsl.element_height)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class ImagePattern
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  # Class is used by edit_box and edit_line
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class KeyListener
@@ -9,13 +10,13 @@ class Shoes
9
10
  end
10
11
 
11
12
  SPECIAL_KEY_NAMES = Hash[
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).map do |key|
13
+ %w[TAB PAGE_UP PAGE_DOWN HOME END F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12
14
+ F13 F14 F15].map do |key|
14
15
  [get_swt_constant(key), key.downcase]
15
16
  end
16
17
  ]
17
18
 
18
- %w(UP DOWN LEFT RIGHT).each do |key|
19
+ %w[UP DOWN LEFT RIGHT].each do |key|
19
20
  SPECIAL_KEY_NAMES[get_swt_constant "ARROW_#{key}"] = key.downcase
20
21
  end
21
22
 
@@ -26,7 +27,7 @@ class Shoes
26
27
 
27
28
  SPECIAL_KEY_NAMES.freeze
28
29
 
29
- MODIFIER_KEYS = %w(CTRL SHIFT ALT CAPS_LOCK COMMAND).map do |key|
30
+ MODIFIER_KEYS = %w[CTRL SHIFT ALT CAPS_LOCK COMMAND].map do |key|
30
31
  get_swt_constant key
31
32
  end
32
33
 
@@ -49,7 +50,7 @@ class Shoes
49
50
  end
50
51
 
51
52
  BUTTON_EXCLUDES = ["\n", " "].freeze
52
- COMBO_EXCLUDES = %w(up down) + BUTTON_EXCLUDES
53
+ COMBO_EXCLUDES = %w[up down] + BUTTON_EXCLUDES
53
54
 
54
55
  # For a variety of SWT controls, certain characters should not be passed
55
56
  # to Shoes key listeners, since they're already handled by the controls.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Line
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class LinePainter < Common::Painter
5
6
  def draw(gc)
6
7
  gc.draw_line(@obj.translate_left + @obj.element_left,
7
- @obj.translate_top + @obj.element_top,
8
+ @obj.translate_top + drawing_top,
8
9
  @obj.translate_left + @obj.element_right + 1,
9
- @obj.translate_top + @obj.element_bottom + 1)
10
+ @obj.translate_top + drawing_bottom + 1)
10
11
  end
11
12
 
12
13
  # Don't do fill setup
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Link
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class LinkSegment
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class ListBox
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class MouseMoveListener
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Oval
@@ -1,17 +1,18 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class OvalPainter < Common::Painter
5
6
  def clipping
6
7
  clipping = ::Swt::Path.new(Shoes.display)
7
- clipping.add_arc(@obj.element_left, @obj.element_top,
8
+ clipping.add_arc(@obj.element_left, drawing_top,
8
9
  @obj.element_width, @obj.element_height, 0, 360)
9
10
  clipping
10
11
  end
11
12
 
12
13
  def fill(graphics_context)
13
14
  graphics_context.fill_oval(@obj.translate_left + @obj.element_left,
14
- @obj.translate_top + @obj.element_top,
15
+ @obj.translate_top + drawing_top,
15
16
  @obj.element_width,
16
17
  @obj.element_height)
17
18
  end
@@ -19,7 +20,7 @@ class Shoes
19
20
  def draw(graphics_context)
20
21
  sw = graphics_context.get_line_width
21
22
  graphics_context.draw_oval(@obj.translate_left + @obj.element_left + sw / 2,
22
- @obj.translate_top + @obj.element_top + sw / 2,
23
+ @obj.translate_top + drawing_top + sw / 2,
23
24
  @obj.element_width - sw,
24
25
  @obj.element_height - sw)
25
26
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Packager
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Progress
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  # In Swt a radio button is actually just a
5
6
  # button, so a lot of these methods are
6
7
  # borrowed from button.rb
7
8
  class Radio < CheckButton
8
- attr_accessor :group
9
+ attr_reader :group
9
10
 
10
11
  # Create a radio button
11
12
  #
@@ -19,9 +20,9 @@ class Shoes
19
20
 
20
21
  def group=(value)
21
22
  group_lookup = RadioGroup.group_lookup
22
- group_lookup[@group].remove(self) unless @group.nil?
23
+ group_lookup[group].remove(self) unless group.nil?
23
24
  @group = value || RadioGroup::DEFAULT_RADIO_GROUP
24
- group_lookup[@group].add self
25
+ group_lookup[group].add self
25
26
  end
26
27
  end
27
28
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  # In Swt radio groups are managed by composites which occupy space
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class Rect
@@ -12,8 +13,6 @@ class Shoes
12
13
  include Common::Translate
13
14
  include ::Shoes::BackendDimensionsDelegations
14
15
 
15
- def_delegators :dsl, :angle
16
-
17
16
  attr_reader :dsl, :app, :transform, :painter
18
17
 
19
18
  def initialize(dsl, app)
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Shoes
3
4
  module Swt
4
5
  class RectPainter < Common::Painter
5
6
  def fill(gc)
6
7
  gc.fill_round_rectangle(@obj.translate_left + @obj.element_left + inset,
7
- @obj.translate_top + @obj.element_top + inset,
8
+ @obj.translate_top + drawing_top + inset,
8
9
  @obj.element_width - inset * 2,
9
10
  @obj.element_height - inset * 2,
10
11
  @obj.corners * 2,
@@ -14,7 +15,7 @@ class Shoes
14
15
  def draw(gc)
15
16
  stroke_width = gc.get_line_width
16
17
  gc.draw_round_rectangle(@obj.translate_left + @obj.element_left + stroke_width / 2,
17
- @obj.translate_top + @obj.element_top + stroke_width / 2,
18
+ @obj.translate_top + drawing_top + stroke_width / 2,
18
19
  @obj.element_width - stroke_width,
19
20
  @obj.element_height - stroke_width,
20
21
  @obj.corners * 2, @obj.corners * 2)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # This file uses the after_do gem, which you probably haven't heard of (yet)
3
4
  # It basically works like Class.after :method do ... end
4
5
  # So for every instance of Class, after method is executed the block you
@@ -22,18 +23,21 @@ class Shoes
22
23
  MouseMoveListener => [:eval_move_block],
23
24
  TextBlock::CursorPainter => [:move_textcursor],
24
25
  Timer => [:eval_block],
25
- ::Shoes::Common::Changeable => [:call_change_listeners]
26
+ Slot => [:update_scroll],
27
+ ::Shoes::Common::Changeable => [:call_change_listeners],
26
28
  }.freeze
27
29
 
28
30
  # These need to trigger a redraw
29
- SAME_POSITION = { Common::Visibility => [:update_visibility],
30
- Image => [:create_image],
31
- ::Shoes::Common::Hover => [:eval_hover_block],
32
- ::Shoes::Common::Style => [:update_style],
33
- ::Shoes::Common::Remove => [:remove],
34
- ::Shoes::Slot => [:mouse_hovered,
35
- :mouse_left],
36
- ::Shoes::TextBlock => [:replace] }.freeze
31
+ SAME_POSITION =
32
+ {
33
+ Common::Visibility => [:update_visibility],
34
+ Image => [:create_image],
35
+ ::Shoes::Common::Hover => [:eval_hover_block],
36
+ ::Shoes::Common::Style => [:update_style],
37
+ ::Shoes::Common::Remove => [:remove],
38
+ ::Shoes::Slot => [:mouse_hovered, :mouse_left],
39
+ ::Shoes::TextBlock => [:replace],
40
+ }.freeze
37
41
 
38
42
  CHANGED_POSITION = { ::Shoes::DimensionsDelegations => [:adjust_current_position],
39
43
  ::Shoes::Common::Positioning => [:_position, :displace],
@@ -85,8 +89,8 @@ class Shoes
85
89
 
86
90
  def redraw_element(element, include_children = true)
87
91
  target = redraw_target(element)
88
- redraw_area target.element_left, target.element_top,
89
- target.element_width, target.element_height,
92
+ redraw_area target.redraw_left, target.redraw_top,
93
+ target.redraw_width, target.redraw_height,
90
94
  include_children
91
95
  end
92
96
 
@@ -98,7 +102,7 @@ class Shoes
98
102
 
99
103
  def redraw_target(element)
100
104
  # During DSL initialization element.gui is nil, so if a SWT backend
101
- # object causes a redraw in its initailize (like Shoes::Swt::Image),
105
+ # object causes a redraw in its initialize (like Shoes::Swt::Image),
102
106
  # we won't have gui set yet. Annoying, but fine.
103
107
  if element.gui
104
108
  element.gui.redraw_target