glimmer-dsl-swt 4.18.5.3 → 4.18.6.2

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.
@@ -37,10 +37,23 @@ module Glimmer
37
37
  [:x, :y, :width, :height, :start_angle, :arc_angle]
38
38
  end
39
39
 
40
+ def bounds
41
+ shape_bounds = geometry.getBounds2D
42
+ org.eclipse.swt.graphics.Rectangle.new(shape_bounds.x, shape_bounds.y, shape_bounds.width, shape_bounds.height)
43
+ end
44
+
45
+ def size
46
+ shape_bounds = geometry.getBounds2D
47
+ org.eclipse.swt.graphics.Point.new(shape_bounds.width, shape_bounds.height)
48
+ end
49
+
50
+ def geometry
51
+ java.awt.geom.Arc2D::Double.new(self.absolute_x, self.absolute_y, calculated_width, calculated_height, start_angle, arc_angle, java.awt.geom.Arc2D::PIE)
52
+ end
53
+
40
54
  # checks if shape contains the point denoted by x and y
41
55
  def contain?(x, y)
42
- shape_geometry = java.awt.geom.Arc2D::Double.new(self.absolute_x, self.absolute_y, width, height, start_angle, arc_angle, java.awt.geom.Arc2D::PIE)
43
- shape_geometry.contains(x, y)
56
+ geometry.contains(x, y)
44
57
  end
45
58
 
46
59
  def include?(x, y)
@@ -48,11 +61,16 @@ module Glimmer
48
61
  contain?(x, y)
49
62
  else
50
63
  # give it some fuzz to allow a larger region around the drawn oval to accept including a point (helps with mouse clickability on a shape)
51
- outer_shape_geometry = java.awt.geom.Arc2D::Double.new(self.absolute_x, self.absolute_y, width + 3, height + 3, start_angle, arc_angle, java.awt.geom.Arc2D::PIE)
52
- inner_shape_geometry = java.awt.geom.Arc2D::Double.new(self.absolute_x, self.absolute_y, width - 3, height - 3, start_angle, arc_angle, java.awt.geom.Arc2D::PIE)
64
+ outer_shape_geometry = java.awt.geom.Arc2D::Double.new(self.absolute_x, self.absolute_y, calculated_width + 3, calculated_height + 3, start_angle, arc_angle, java.awt.geom.Arc2D::PIE)
65
+ inner_shape_geometry = java.awt.geom.Arc2D::Double.new(self.absolute_x, self.absolute_y, calculated_width - 3, calculated_height - 3, start_angle, arc_angle, java.awt.geom.Arc2D::PIE)
53
66
  outer_shape_geometry.contains(x, y) && !inner_shape_geometry.contains(x, y)
54
67
  end
55
68
  end
69
+
70
+ def irregular?
71
+ true
72
+ end
73
+
56
74
  end
57
75
  end
58
76
  end
@@ -0,0 +1,118 @@
1
+ # Copyright (c) 2007-2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer/swt/custom/shape'
23
+ require 'glimmer/swt/custom/shape/path'
24
+ require 'glimmer/swt/custom/shape/path_segment'
25
+ require 'glimmer/swt/swt_proxy'
26
+ require 'glimmer/swt/display_proxy'
27
+ require 'glimmer/swt/color_proxy'
28
+ require 'glimmer/swt/font_proxy'
29
+ require 'glimmer/swt/transform_proxy'
30
+
31
+ module Glimmer
32
+ module SWT
33
+ module Custom
34
+ # Represents a shape (graphics) to be drawn on a control/widget/canvas/display
35
+ # That is because Shape is drawn on a parent as graphics and doesn't have an SWT widget for itself
36
+ class Shape
37
+ class Cubic < Path
38
+ def parameter_names
39
+ [:point_array]
40
+ end
41
+
42
+ def geometry
43
+ the_point_array = point_array
44
+ if the_point_array != @geometry_point_array
45
+ @geometry_point_array = the_point_array
46
+ @geometry = Java::JavaAwtGeom::Path2D::Double.new
47
+ add_to_geometry(@geometry)
48
+ end
49
+ @geometry
50
+ end
51
+
52
+ def contain?(x, y)
53
+ include?(x, y, filled: true)
54
+ end
55
+
56
+ # checks if drawn or filled rectangle includes the point denoted by x and y (if drawn, it only returns true if point lies on the edge)
57
+ def include?(x, y, filled: nil)
58
+ filled = filled? if filled.nil?
59
+ makeshift_gc = org.eclipse.swt.graphics.GC.new(Glimmer::SWT::DisplayProxy.instance.swt_display)
60
+ swt_path = org.eclipse.swt.graphics.Path.new(Glimmer::SWT::DisplayProxy.instance.swt_display)
61
+ the_path_segment_args = path_segment_args.dup
62
+ if previous_point_connected?
63
+ the_previous_path_segment = previous_path_segment
64
+ swt_path.moveTo(the_previous_path_segment.x, the_previous_path_segment.y)
65
+ else
66
+ swt_path.moveTo(the_path_segment_args.shift, the_path_segment_args.shift)
67
+ end
68
+ swt_path.curveTo(*the_path_segment_args)
69
+ swt_path.contains(x.to_f, y.to_f, makeshift_gc, !filled)
70
+ ensure
71
+ swt_path.dispose
72
+ end
73
+
74
+ def move_by(x_delta, y_delta)
75
+ the_point_array = @args.compact
76
+ the_point_array = the_point_array.first if the_point_array.first.is_a?(Array)
77
+ self.point_array = the_point_array.each_with_index.map {|coordinate, i| i.even? ? coordinate + x_delta : coordinate + y_delta}
78
+ end
79
+
80
+ def path_segment_method_name
81
+ 'cubicTo'
82
+ end
83
+
84
+ def path_segment_args
85
+ # TODO make args auto-infer control points if previous_point_connected is true or if there is only a point_array with 1 point
86
+ @args.to_a
87
+ end
88
+
89
+ def default_path_segment_arg_count
90
+ 8
91
+ end
92
+
93
+ def default_connected_path_segment_arg_count
94
+ 6
95
+ end
96
+
97
+ def path_segment_geometry_method_name
98
+ 'curveTo'
99
+ end
100
+
101
+ def previous_point_connected?
102
+ @args.compact.count == 6 && !first_path_segment?
103
+ end
104
+
105
+ def eql?(other)
106
+ other.is_a?(Cubic) && point_array == (other && other.respond_to?(:point_array) && other.point_array)
107
+ end
108
+ alias == eql?
109
+
110
+ def hash
111
+ point_array.hash
112
+ end
113
+
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -80,17 +80,17 @@ module Glimmer
80
80
 
81
81
  def default_x?
82
82
  super ||
83
- current_parameter_name?('dest_x') && (dest_x.nil? || dest_x.to_s == 'default')
83
+ current_parameter_name?(:dest_x) && (dest_x.nil? || dest_x.to_s == 'default')
84
84
  end
85
85
 
86
86
  def default_y?
87
87
  super ||
88
- current_parameter_name?('dest_y') && (dest_y.nil? || dest_y.to_s == 'default')
88
+ current_parameter_name?(:dest_y) && (dest_y.nil? || dest_y.to_s == 'default')
89
89
  end
90
90
 
91
91
  def move_by(x_delta, y_delta)
92
92
  if default_x?
93
- self.x_delta += x_delta
93
+ self.default_x_delta += x_delta
94
94
  elsif dest_x
95
95
  self.dest_x += x_delta
96
96
  else
@@ -98,7 +98,7 @@ module Glimmer
98
98
  end
99
99
 
100
100
  if default_y?
101
- self.y_delta += y_delta
101
+ self.default_y_delta += y_delta
102
102
  elsif dest_y
103
103
  self.dest_y += y_delta
104
104
  else
@@ -1,4 +1,5 @@
1
1
  # Copyright (c) 2007-2021 Andy Maleh
2
+ # Copyright (c) 2007-2021 Andy Maleh
2
3
  #
3
4
  # Permission is hereby granted, free of charge, to any person obtaining
4
5
  # a copy of this software and associated documentation files (the
@@ -20,6 +21,7 @@
20
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
22
 
22
23
  require 'glimmer/swt/custom/shape'
24
+ require 'glimmer/swt/custom/shape/path_segment'
23
25
  require 'glimmer/swt/swt_proxy'
24
26
  require 'glimmer/swt/display_proxy'
25
27
  require 'glimmer/swt/color_proxy'
@@ -33,6 +35,8 @@ module Glimmer
33
35
  # That is because Shape is drawn on a parent as graphics and doesn't have an SWT widget for itself
34
36
  class Shape
35
37
  class Line < Shape
38
+ include PathSegment
39
+
36
40
  class << self
37
41
  def include?(x1, y1, x2, y2, x, y)
38
42
  distance1 = Math.sqrt((x - x1)**2 + (y - y1)**2)
@@ -50,14 +54,40 @@ module Glimmer
50
54
  parameter_names
51
55
  end
52
56
 
53
- # Logical x coordinate. Always assumes the first point in the line to be the x coordinate.
57
+ def bounds
58
+ shape_bounds = geometry.getBounds2D
59
+ org.eclipse.swt.graphics.Rectangle.new(shape_bounds.x, shape_bounds.y, shape_bounds.width, shape_bounds.height)
60
+ end
61
+
62
+ def size
63
+ shape_bounds = geometry.getBounds2D
64
+ org.eclipse.swt.graphics.Point.new(shape_bounds.width, shape_bounds.height)
65
+ end
66
+
67
+ def geometry
68
+ java.awt.geom.Line2D::Double.new(absolute_x1, absolute_y1, absolute_x2, absolute_y2)
69
+ end
70
+
71
+ # Logical x coordinate relative to parent
54
72
  def x
55
- x1
73
+ x_value = bounds.x
74
+ x_value -= parent.absolute_x if parent.is_a?(Shape)
75
+ x_value
56
76
  end
57
77
 
58
- # Logical y coordinate. Always assumes the first point in the line to be the y coordinate.
78
+ # Logical y coordinate relative to parent
59
79
  def y
60
- y1
80
+ y_value = bounds.y
81
+ y_value -= parent.absolute_y if parent.is_a?(Shape)
82
+ y_value
83
+ end
84
+
85
+ def width
86
+ size.x
87
+ end
88
+
89
+ def height
90
+ size.y
61
91
  end
62
92
 
63
93
  def absolute_x1
@@ -78,7 +108,7 @@ module Glimmer
78
108
 
79
109
  def absolute_x2
80
110
  if parent.is_a?(Shape)
81
- parent.absolute_x + x2
111
+ parent.absolute_x + x2.to_f
82
112
  else
83
113
  x2
84
114
  end
@@ -86,7 +116,7 @@ module Glimmer
86
116
 
87
117
  def absolute_y2
88
118
  if parent.is_a?(Shape)
89
- parent.absolute_y + y1
119
+ parent.absolute_y + y2.to_f
90
120
  else
91
121
  y2
92
122
  end
@@ -104,6 +134,50 @@ module Glimmer
104
134
  self.x2 += x_delta
105
135
  self.y2 += y_delta
106
136
  end
137
+
138
+ def irregular?
139
+ true
140
+ end
141
+
142
+ def path_segment_method_name
143
+ 'lineTo'
144
+ end
145
+
146
+ def path_segment_args
147
+ # TODO make args auto-infer first point if previous_point_connected is true or if there is only x1,y1 or x2,y2 (but not both), or if there is an x, y, or if there is a point_array with 1 point
148
+ @args
149
+ end
150
+
151
+ def default_path_segment_arg_count
152
+ 4
153
+ end
154
+
155
+ def default_connected_path_segment_arg_count
156
+ 2
157
+ end
158
+
159
+ def path_segment_geometry_args
160
+ # TODO make args auto-infer first point if previous_point_connected is true or if there is only x1,y1 or x2,y2 (but not both), or if there is an x, y, or if there is a point_array with 1 point
161
+ @args
162
+ end
163
+
164
+ def previous_point_connected?
165
+ @args.compact.count == 2 && !first_path_segment?
166
+ end
167
+
168
+ def eql?(other)
169
+ other.is_a?(Line) &&
170
+ x1 == (other && other.respond_to?(:x1) && other.x1) &&
171
+ y1 == (other && other.respond_to?(:y1) && other.y1) &&
172
+ x2 == (other && other.respond_to?(:x2) && other.x2) &&
173
+ y2 == (other && other.respond_to?(:y2) && other.y2)
174
+ end
175
+ alias == eql?
176
+
177
+ def hash
178
+ [x1, y1, x2, y2].hash
179
+ end
180
+
107
181
  end
108
182
  end
109
183
  end
@@ -39,7 +39,7 @@ module Glimmer
39
39
 
40
40
  # checks if shape contains the point denoted by x and y
41
41
  def contain?(x, y)
42
- shape_geometry = java.awt.geom.Ellipse2D::Double.new(self.absolute_x, self.absolute_y, width, height)
42
+ shape_geometry = java.awt.geom.Ellipse2D::Double.new(self.absolute_x, self.absolute_y, calculated_width, calculated_height)
43
43
  shape_geometry.contains(x, y)
44
44
  end
45
45
 
@@ -49,8 +49,8 @@ module Glimmer
49
49
  contain?(x, y)
50
50
  else
51
51
  # give it some fuzz to allow a larger region around the drawn oval to accept including a point (helps with mouse clickability on a shape)
52
- outer_shape_geometry = java.awt.geom.Ellipse2D::Double.new(self.absolute_x - 3, self.absolute_y - 3, width + 6, height + 6)
53
- inner_shape_geometry = java.awt.geom.Ellipse2D::Double.new(self.absolute_x + 3, self.absolute_y + 3, width - 6, height - 6)
52
+ outer_shape_geometry = java.awt.geom.Ellipse2D::Double.new(self.absolute_x - 3, self.absolute_y - 3, calculated_width + 6, calculated_height + 6)
53
+ inner_shape_geometry = java.awt.geom.Ellipse2D::Double.new(self.absolute_x + 3, self.absolute_y + 3, calculated_width - 6, calculated_height - 6)
54
54
  outer_shape_geometry.contains(x, y) && !inner_shape_geometry.contains(x, y)
55
55
  end
56
56
  end
@@ -0,0 +1,227 @@
1
+ # Copyright (c) 2007-2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'glimmer/swt/custom/shape'
23
+ require 'glimmer/swt/custom/shape/path_segment'
24
+ require 'glimmer/swt/swt_proxy'
25
+ require 'glimmer/swt/display_proxy'
26
+ require 'glimmer/swt/color_proxy'
27
+ require 'glimmer/swt/font_proxy'
28
+ require 'glimmer/swt/display_proxy'
29
+
30
+ module Glimmer
31
+ module SWT
32
+ module Custom
33
+ class Shape
34
+ # Represents a path to be drawn on a control/widget/canvas/display
35
+ # That is because Shape is drawn on a parent as graphics and doesn't have an SWT widget for itself
36
+ # swt_path is not guaranteed to have any object in it till after rendering
37
+ class Path < Shape
38
+ include PathSegment # a path may behave as a path segment in another path
39
+
40
+ attr_reader :swt_path, :path_segments
41
+ attr_accessor :calculated_path_args
42
+
43
+ def initialize(parent, keyword, *args, &property_block)
44
+ super
45
+ @path_segments = []
46
+ @uncalculated_path_segments = []
47
+ end
48
+
49
+ def parameter_names
50
+ [:swt_path]
51
+ end
52
+
53
+ def add_shape(shape)
54
+ if shape.is_a?(PathSegment)
55
+ @path_segments << shape
56
+ @uncalculated_path_segments << shape
57
+ else
58
+ super
59
+ end
60
+ end
61
+
62
+ def contain?(x, y)
63
+ makeshift_gc = org.eclipse.swt.graphics.GC.new(Glimmer::SWT::DisplayProxy.instance.swt_display)
64
+ @swt_path.contains(x.to_f, y.to_f, makeshift_gc, false)
65
+ end
66
+
67
+ def contain?(x, y)
68
+ include?(x, y, filled: true)
69
+ end
70
+
71
+ # checks if drawn or filled rectangle includes the point denoted by x and y (if drawn, it only returns true if point lies on the edge)
72
+ def include?(x, y, filled: nil)
73
+ filled = filled? if filled.nil?
74
+ makeshift_gc = org.eclipse.swt.graphics.GC.new(Glimmer::SWT::DisplayProxy.instance.swt_display)
75
+ @swt_path.contains(x.to_f, y.to_f, makeshift_gc, !filled)
76
+ end
77
+
78
+ def irregular?
79
+ true
80
+ end
81
+
82
+ def post_dispose_content(path_segment)
83
+ @path_segments.delete(path_segment)
84
+ @uncalculated_path_segments = @path_segments.dup
85
+ @swt_path&.dispose
86
+ @swt_path = nil
87
+ @args = []
88
+ calculated_args_changed!(children: false)
89
+ end
90
+
91
+ def clear
92
+ @path_segments.each { |path_segments| path_segments.class == Path && path_segments.dispose }
93
+ @path_segments.clear
94
+ @uncalculated_path_segments = @path_segments.dup
95
+ @swt_path&.dispose
96
+ @swt_path = nil
97
+ @args = []
98
+ calculated_args_changed!(children: false)
99
+ end
100
+
101
+ def dispose
102
+ clear if self.class == Path
103
+ super if parent.is_a?(Drawable)
104
+ end
105
+
106
+ def calculated_args_changed!(children: true)
107
+ super
108
+ end
109
+
110
+ def calculated_args
111
+ new_swt_path = @swt_path.nil? || !@calculated_paint_args || !@calculated_path_args
112
+ if new_swt_path
113
+ @swt_path&.dispose
114
+ @swt_path = org.eclipse.swt.graphics.Path.new(Glimmer::SWT::DisplayProxy.instance.swt_display)
115
+ @uncalculated_path_segments = @path_segments.dup
116
+ end
117
+ # TODO recreate @swt_path only if one of the children get disposed (must notify parent on dispose)
118
+ @args = [@swt_path]
119
+ @uncalculated_path_segments.each do |path_segment|
120
+ path_segment.add_to_swt_path(@swt_path)
121
+ @uncalculated_path_segments.delete(path_segment)
122
+ end
123
+ @calculated_path_args = true
124
+ if new_swt_path
125
+ @path_calculated_args = super
126
+ else
127
+ @path_calculated_args
128
+ end
129
+ rescue => e
130
+ Glimmer::Config.logger.error {e.full_message}
131
+ @args
132
+ end
133
+
134
+ def move_by(x_delta, y_delta)
135
+ @path_segments.each {|path_segment| path_segment.move_by(x_delta, y_delta)}
136
+ end
137
+
138
+ def bounds
139
+ if @path_segments != @bounds_path_segments
140
+ @bounds_path_segments = @path_segments
141
+ shape_bounds = geometry.getBounds2D
142
+ @bounds = org.eclipse.swt.graphics.Rectangle.new(shape_bounds.x, shape_bounds.y, shape_bounds.width, shape_bounds.height)
143
+ end
144
+ @bounds
145
+ end
146
+
147
+ def size
148
+ if @path_segments != @size_path_segments
149
+ @size_path_segments = @path_segments
150
+ shape_bounds = geometry.getBounds2D
151
+ @size = org.eclipse.swt.graphics.Point.new(shape_bounds.width, shape_bounds.height)
152
+ end
153
+ @size
154
+ end
155
+
156
+ # Logical x coordinate relative to parent
157
+ def x
158
+ x_value = bounds.x
159
+ x_value -= parent.absolute_x if parent.is_a?(Shape)
160
+ x_value
161
+ end
162
+
163
+ # Logical y coordinate relative to parent
164
+ def y
165
+ y_value = bounds.y
166
+ y_value -= parent.absolute_y if parent.is_a?(Shape)
167
+ y_value
168
+ end
169
+
170
+ def width
171
+ size.x
172
+ end
173
+
174
+ def height
175
+ size.y
176
+ end
177
+
178
+ def geometry
179
+ if @path_segments != @geometry_path_segments
180
+ @geometry_path_segments = @path_segments
181
+ @geometry = Java::JavaAwtGeom::Path2D::Double.new
182
+ @path_segments.each do |path_segment|
183
+ path_segment.add_to_geometry(@geometry)
184
+ end
185
+ end
186
+ @geometry
187
+ end
188
+
189
+ def path_segment_method_name
190
+ 'addPath'
191
+ end
192
+
193
+ def path_segment_args
194
+ @args
195
+ end
196
+
197
+ def path_segment_geometry_method_name
198
+ if self.class == Path
199
+ 'append'
200
+ else
201
+ super
202
+ end
203
+ end
204
+
205
+ def path_segment_geometry_args
206
+ if self.class == Path
207
+ # TODO consider supporting connected true instead of false (2nd arg)
208
+ [geometry, false]
209
+ else
210
+ super
211
+ end
212
+ end
213
+
214
+ def eql?(other)
215
+ (other.class == Path) && geometry.equals(other && other.respond_to?(:geometry) && other.geometry)
216
+ end
217
+ alias == eql?
218
+
219
+ def hash
220
+ geometry.hashCode
221
+ end
222
+
223
+ end
224
+ end
225
+ end
226
+ end
227
+ end