Class: Glimmer::SWT::Custom::Shape
- Inherits:
-
Object
- Object
- Glimmer::SWT::Custom::Shape
show all
- Includes:
- Packages, Properties
- Defined in:
- lib/glimmer/swt/custom/shape/arc.rb,
lib/glimmer/swt/custom/shape/line.rb,
lib/glimmer/swt/custom/shape/oval.rb,
lib/glimmer/swt/custom/shape/text.rb,
lib/glimmer/swt/custom/shape/focus.rb,
lib/glimmer/swt/custom/shape/image.rb,
lib/glimmer/swt/custom/shape/point.rb,
lib/glimmer/swt/custom/shape/polygon.rb,
lib/glimmer/swt/custom/shape/polyline.rb,
lib/glimmer/swt/custom/shape/rectangle.rb,
lib/glimmer/swt/custom/shape.rb
Overview
Represents a shape (graphics) to be drawn on a control/widget/canvas/display That is because Shape is drawn on a parent as graphics and doesn’t have an SWT widget for itself
Defined Under Namespace
Classes: Arc, Focus, Image, Line, Oval, Point, Polygon, Polyline, Rectangle, Text
Constant Summary
collapse
- String =
Text
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
-
#absolute_x ⇒ Object
-
#absolute_y ⇒ Object
-
#add_shape(shape) ⇒ Object
-
#amend_method_name_options_based_on_properties! ⇒ Object
-
#apply_property_arg_conversions(method_name, property, args) ⇒ Object
-
#apply_shape_arg_conversions! ⇒ Object
-
#apply_shape_arg_defaults! ⇒ Object
-
#background_pattern_args ⇒ Object
-
#bounds ⇒ Object
The bounding box top-left x, y, width, height in absolute positioning.
-
#calculate_paint_args! ⇒ Object
-
#calculated_args ⇒ Object
args translated to absolute coordinates.
-
#calculated_args? ⇒ Boolean
-
#calculated_args_changed!(children: true) ⇒ Object
-
#calculated_args_changed_for_defaults! ⇒ Object
-
#calculated_height ⇒ Object
-
#calculated_width ⇒ Object
-
#calculated_x ⇒ Object
-
#calculated_y ⇒ Object
-
#contain?(x, y) ⇒ Boolean
Returns if shape contains a point Subclasses (like polygon) may override to indicate if a point x,y coordinates falls inside the shape some shapes may choose to provide a fuzz factor to make usage of this method for mouse clicking more user friendly.
-
#current_parameter_name?(attribute_name) ⇒ Boolean
-
#default_height ⇒ Object
-
#default_height? ⇒ Boolean
-
#default_height_delta ⇒ Object
-
#default_height_delta=(delta) ⇒ Object
-
#default_width ⇒ Object
-
#default_width? ⇒ Boolean
-
#default_width_delta ⇒ Object
-
#default_width_delta=(delta) ⇒ Object
-
#default_x ⇒ Object
-
#default_x? ⇒ Boolean
-
#default_x_delta ⇒ Object
-
#default_x_delta=(delta) ⇒ Object
-
#default_y ⇒ Object
-
#default_y? ⇒ Boolean
-
#default_y_delta ⇒ Object
-
#default_y_delta=(delta) ⇒ Object
-
#dispose(dispose_images: true, dispose_patterns: true) ⇒ Object
-
#draw? ⇒ Boolean
(also: #drawn?)
-
#ensure_extent(paint_event) ⇒ Object
-
#expanded_shapes ⇒ Object
-
#fill? ⇒ Boolean
(also: #filled?)
-
#foreground_pattern_args ⇒ Object
-
#get_attribute(attribute_name) ⇒ Object
-
#gradient? ⇒ Boolean
-
#has_attribute?(attribute_name, *args) ⇒ Boolean
-
#has_some_background? ⇒ Boolean
-
#has_some_foreground? ⇒ Boolean
-
#include?(x, y) ⇒ Boolean
Returns if shape includes a point.
-
#initialize(parent, keyword, *args, &property_block) ⇒ Shape
constructor
-
#inspect ⇒ Object
Overriding inspect to avoid printing very long shape hierarchies.
-
#irregular? ⇒ Boolean
Indicates if a shape’s x, y, width, height differ from its bounds calculation (e.g. arc / polygon).
-
#location ⇒ Object
The bounding box top-left x and y.
-
#location_parameter_names ⇒ Object
subclasses may override to specify location parameter names if different from x and y (e.g. all polygon points are location parameters) used in calculating movement changes.
-
#method_missing(method_name, *args, &block) ⇒ Object
-
#move_by(x_delta, y_delta) ⇒ Object
moves by x delta and y delta.
-
#paint(paint_event) ⇒ Object
-
#paint_children(paint_event) ⇒ Object
-
#paint_self(paint_event) ⇒ Object
-
#parameter_index(attribute_name) ⇒ Object
-
#parameter_name?(attribute_name) ⇒ Boolean
-
#parameter_names ⇒ Object
parameter names for arguments to pass to SWT GC.xyz method for rendering shape (e.g. draw_image(image, x, y) yields :image, :x, :y parameter names).
-
#parent_shape_absolute_location_changed? ⇒ Boolean
-
#pattern(*args, type: nil) ⇒ Object
-
#pattern_args(type: nil) ⇒ Object
-
#possible_parameter_names ⇒ Object
-
#post_add_content ⇒ Object
-
#respond_to?(method_name, *args, &block) ⇒ Boolean
-
#round? ⇒ Boolean
-
#set_attribute(attribute_name, *args) ⇒ Object
-
#set_parameter_attribute(attribute_name, *args) ⇒ Object
-
#size ⇒ Object
The bounding box width and height (as a Point object with x being width and y being height).
-
#tolerate_shape_extra_args! ⇒ Object
Tolerates shape extra args added by user by mistake (e.g. happens when switching from round rectangle to a standard one without removing all extra args).
Methods included from Properties
attribute_getter, #attribute_getter, attribute_setter, #attribute_setter, normalized_attribute, #normalized_attribute, ruby_attribute_getter, #ruby_attribute_setter, ruby_attribute_setter
Methods included from Packages
included
Constructor Details
#initialize(parent, keyword, *args, &property_block) ⇒ Shape
Returns a new instance of Shape.
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
# File 'lib/glimmer/swt/custom/shape.rb', line 132
def initialize(parent, keyword, *args, &property_block)
@parent = parent
@drawable = @parent.is_a?(Drawable) ? @parent : @parent.drawable
@name = keyword
@options = self.class.arg_options(args, extract: true)
@method_name = self.class.method_name(keyword, @options)
@args = args
@properties = {}
@shapes = []
@options.reject {|key, value| %w[fill gradient round].include?(key.to_s)}.each do |property, property_args|
@properties[property] = property_args
end
@parent.add_shape(self)
post_add_content if property_block.nil?
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_name, *args, &block) ⇒ Object
452
453
454
455
456
457
458
459
460
|
# File 'lib/glimmer/swt/custom/shape.rb', line 452
def method_missing(method_name, *args, &block)
if method_name.to_s.end_with?('=')
set_attribute(method_name, *args)
elsif has_attribute?(method_name)
get_attribute(method_name)
else
super
end
end
|
Instance Attribute Details
#args ⇒ Object
Returns the value of attribute args.
129
130
131
|
# File 'lib/glimmer/swt/custom/shape.rb', line 129
def args
@args
end
|
#drawable ⇒ Object
Returns the value of attribute drawable.
129
130
131
|
# File 'lib/glimmer/swt/custom/shape.rb', line 129
def drawable
@drawable
end
|
#extent ⇒ Object
Returns the value of attribute extent.
130
131
132
|
# File 'lib/glimmer/swt/custom/shape.rb', line 130
def extent
@extent
end
|
#name ⇒ Object
Returns the value of attribute name.
129
130
131
|
# File 'lib/glimmer/swt/custom/shape.rb', line 129
def name
@name
end
|
#options ⇒ Object
Returns the value of attribute options.
129
130
131
|
# File 'lib/glimmer/swt/custom/shape.rb', line 129
def options
@options
end
|
#parent ⇒ Object
Returns the value of attribute parent.
129
130
131
|
# File 'lib/glimmer/swt/custom/shape.rb', line 129
def parent
@parent
end
|
#shapes ⇒ Object
Returns the value of attribute shapes.
129
130
131
|
# File 'lib/glimmer/swt/custom/shape.rb', line 129
def shapes
@shapes
end
|
Class Method Details
.arg_options(args, extract: false) ⇒ Object
94
95
96
97
98
|
# File 'lib/glimmer/swt/custom/shape.rb', line 94
def arg_options(args, extract: false)
arg_options_method = ? :pop : :last
options = args.send(arg_options_method) if args.last.is_a?(Hash)
options.nil? ? {} : options.symbolize_keys
end
|
.create(parent, keyword, *args, &property_block) ⇒ Object
67
68
69
70
71
72
73
74
|
# File 'lib/glimmer/swt/custom/shape.rb', line 67
def create(parent, keyword, *args, &property_block)
potential_shape_class_name = keyword.to_s.camelcase(:upper).to_sym
if constants.include?(potential_shape_class_name)
const_get(potential_shape_class_name).new(parent, keyword, *args, &property_block)
else
new(parent, keyword, *args, &property_block)
end
end
|
.flyweight_method_names ⇒ Object
112
113
114
|
# File 'lib/glimmer/swt/custom/shape.rb', line 112
def flyweight_method_names
@flyweight_method_names ||= {}
end
|
.flyweight_patterns ⇒ Object
124
125
126
|
# File 'lib/glimmer/swt/custom/shape.rb', line 124
def flyweight_patterns
@flyweight_patterns ||= {}
end
|
.gc_instance_methods ⇒ Object
80
81
82
|
# File 'lib/glimmer/swt/custom/shape.rb', line 80
def gc_instance_methods
@gc_instance_methods ||= org.eclipse.swt.graphics.GC.instance_methods.map(&:to_s)
end
|
.keywords ⇒ Object
84
85
86
87
88
89
90
91
92
|
# File 'lib/glimmer/swt/custom/shape.rb', line 84
def keywords
@keywords ||= gc_instance_methods.select do |method_name|
!method_name.end_with?('=') && (method_name.start_with?('draw_') || method_name.start_with?('fill_'))
end.reject do |method_name|
gc_instance_methods.include?("#{method_name}=") || gc_instance_methods.include?("set_#{method_name}")
end.map do |method_name|
method_name.gsub(/(draw|fill|gradient|round)_/, '')
end.uniq.compact.to_a
end
|
.method_name(keyword, method_arg_options) ⇒ Object
100
101
102
103
104
105
106
107
108
109
110
|
# File 'lib/glimmer/swt/custom/shape.rb', line 100
def method_name(keyword, method_arg_options)
keyword = keyword.to_s
method_arg_options = method_arg_options.select {|key, value| %w[fill gradient round].include?(key.to_s)}
unless flyweight_method_names.keys.include?([keyword, method_arg_options])
gradient = 'Gradient' if method_arg_options[:gradient]
round = 'Round' if method_arg_options[:round]
gc_instance_method_name_prefix = !['polyline', 'point', 'image', 'focus'].include?(keyword) && (method_arg_options[:fill] || method_arg_options[:gradient]) ? 'fill' : 'draw'
flyweight_method_names[[keyword, method_arg_options]] = "#{gc_instance_method_name_prefix}#{gradient}#{round}#{keyword.capitalize}"
end
flyweight_method_names[[keyword, method_arg_options]]
end
|
.pattern(*args) ⇒ Object
116
117
118
119
120
121
122
|
# File 'lib/glimmer/swt/custom/shape.rb', line 116
def pattern(*args)
found_pattern = flyweight_patterns[args]
if found_pattern.nil? || found_pattern.is_disposed
found_pattern = flyweight_patterns[args] = org.eclipse.swt.graphics.Pattern.new(*args)
end
found_pattern
end
|
.valid?(parent, keyword, *args, &block) ⇒ Boolean
76
77
78
|
# File 'lib/glimmer/swt/custom/shape.rb', line 76
def valid?(parent, keyword, *args, &block)
gc_instance_methods.include?(method_name(keyword, arg_options(args)))
end
|
Instance Method Details
#absolute_x ⇒ Object
774
775
776
777
778
779
780
781
|
# File 'lib/glimmer/swt/custom/shape.rb', line 774
def absolute_x
x = calculated_x
if parent.is_a?(Shape)
parent.absolute_x + x
else
x
end
end
|
#absolute_y ⇒ Object
783
784
785
786
787
788
789
790
|
# File 'lib/glimmer/swt/custom/shape.rb', line 783
def absolute_y
y = calculated_y
if parent.is_a?(Shape)
parent.absolute_y + y
else
y
end
end
|
#add_shape(shape) ⇒ Object
148
149
150
151
|
# File 'lib/glimmer/swt/custom/shape.rb', line 148
def add_shape(shape)
@shapes << shape
calculated_args_changed_for_defaults!
end
|
#amend_method_name_options_based_on_properties! ⇒ Object
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
|
# File 'lib/glimmer/swt/custom/shape.rb', line 360
def amend_method_name_options_based_on_properties!
return if @name == 'point'
if @name != 'text' && @name != 'string' && has_some_background? && !has_some_foreground?
@options[:fill] = true
elsif !has_some_background? && has_some_foreground?
@options[:fill] = false
elsif @name == 'rectangle' && has_some_background? && has_some_foreground?
@options[:fill] = true
@options[:gradient] = true
end
if @name == 'rectangle' && @args.size > 4 && @args.last.is_a?(Numeric)
@options[:round] = true
end
@method_name = self.class.method_name(@name, @options)
end
|
#apply_property_arg_conversions(method_name, property, args) ⇒ Object
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
|
# File 'lib/glimmer/swt/custom/shape.rb', line 244
def apply_property_arg_conversions(method_name, property, args)
args = args.dup
the_java_method = org.eclipse.swt.graphics.GC.java_class.declared_instance_methods.detect {|m| m.name == method_name}
return args if the_java_method.nil?
if the_java_method.parameter_types.first == Color.java_class && args.first.is_a?(RGB)
args[0] = [args[0].red, args[0].green, args[0].blue]
end
if ['setBackground', 'setForeground'].include?(method_name.to_s) && args.first.is_a?(Array)
args[0] = ColorProxy.new(args[0])
end
if method_name.to_s == 'setLineDash' && args.size > 1
args[0] = args.dup
args[1..-1] = []
end
if args.first.is_a?(Symbol) || args.first.is_a?(::String)
if the_java_method.parameter_types.first == Color.java_class
args[0] = ColorProxy.new(args[0])
end
if the_java_method.parameter_types.first == Java::int.java_class
args[0] = SWTProxy.constant(args[0])
end
end
if args.first.is_a?(ColorProxy)
args[0] = args[0].swt_color
end
if (args.first.is_a?(Hash) || args.first.is_a?(FontData)) && the_java_method.parameter_types.first == Font.java_class
args[0] = FontProxy.new(args[0])
end
if args.first.is_a?(FontProxy)
args[0] = args[0].swt_font
end
if args.first.is_a?(TransformProxy)
args[0] = args[0].swt_transform
end
if ['setBackgroundPattern', 'setForegroundPattern'].include?(method_name.to_s)
@drawable.requires_shape_disposal = true
args = args.first if args.first.is_a?(Array)
args.each_with_index do |arg, i|
arg = ColorProxy.new(arg.red, arg.green, arg.blue) if arg.is_a?(RGB)
arg = ColorProxy.new(arg) if arg.is_a?(Symbol) || arg.is_a?(::String)
arg = arg.swt_color if arg.is_a?(ColorProxy)
args[i] = arg
end
@pattern_args ||= {}
pattern_type = method_name.to_s.match(/set(.+)Pattern/)[1]
if args.first.is_a?(Pattern)
new_args = @pattern_args[pattern_type]
else
new_args = args.first.is_a?(Display) ? args : ([DisplayProxy.instance.swt_display] + args)
@pattern_args[pattern_type] = new_args.dup
end
args[0] = pattern(*new_args, type: pattern_type)
args[1..-1] = []
end
args
end
|
#apply_shape_arg_conversions! ⇒ Object
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
|
# File 'lib/glimmer/swt/custom/shape.rb', line 301
def apply_shape_arg_conversions!
if @args.size > 1 && (['polygon', 'polyline'].include?(@name))
@args[0] = @args.dup
@args[1..-1] = []
end
if @name == 'image'
if @args.first.is_a?(::String)
@args[0] = ImageProxy.new(@args[0])
end
if @args.first.is_a?(ImageProxy)
@image = @args[0] = @args[0].swt_image
end
if @args.first.nil?
@image = nil
end
end
if @name == 'text'
if @args[3].is_a?(Symbol) || @args[3].is_a?(::String)
@args[3] = [@args[3]]
end
if @args[3].is_a?(Array)
if @args[3].size == 1 && @args[3].first.is_a?(Array)
@args[3] = @args[3].first
end
@args[3] = SWTProxy[*@args[3]]
end
end
end
|
#apply_shape_arg_defaults! ⇒ Object
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
|
# File 'lib/glimmer/swt/custom/shape.rb', line 330
def apply_shape_arg_defaults!
self.x = :default if current_parameter_name?(:x) && x.nil?
self.y = :default if current_parameter_name?(:y) && y.nil?
self.dest_x = :default if current_parameter_name?(:dest_x) && dest_x.nil?
self.dest_y = :default if current_parameter_name?(:dest_y) && dest_y.nil?
self.width = :default if current_parameter_name?(:width) && width.nil?
self.height = :default if current_parameter_name?(:height) && height.nil?
if @name.include?('rectangle') && round? && @args.size.between?(4, 5)
(6 - @args.size).times {@args << 60}
elsif @name.include?('rectangle') && gradient? && @args.size == 4
set_attribute('vertical', true, redraw: false)
elsif (@name.include?('text') || @name.include?('string')) && !@properties.keys.map(&:to_s).include?('background') && @args.size < 4
set_attribute('is_transparent', true, redraw: false)
end
if @name.include?('image')
@drawable.requires_shape_disposal = true
end
end
|
#background_pattern_args ⇒ Object
485
486
487
|
# File 'lib/glimmer/swt/custom/shape.rb', line 485
def background_pattern_args
pattern_args(type: 'background')
end
|
#bounds ⇒ Object
The bounding box top-left x, y, width, height in absolute positioning
172
173
174
|
# File 'lib/glimmer/swt/custom/shape.rb', line 172
def bounds
org.eclipse.swt.graphics.Rectangle.new(absolute_x, absolute_y, calculated_width, calculated_height)
end
|
#calculate_paint_args! ⇒ Object
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
|
# File 'lib/glimmer/swt/custom/shape.rb', line 799
def calculate_paint_args!
unless @calculated_paint_args
if @name == 'pixel'
@name = 'point'
if !@properties[:foreground].is_a?(Color)
if @properties[:foreground].is_a?(Array)
@properties[:foreground] = ColorProxy.new(@properties[:foreground], ensure_bounds: false)
end
if @properties[:foreground].is_a?(Symbol) || @properties[:foreground].is_a?(::String)
@properties[:foreground] = ColorProxy.new(@properties[:foreground], ensure_bounds: false)
end
if @properties[:foreground].is_a?(ColorProxy)
@properties[:foreground] = @properties[:foreground].swt_color
end
end
else
@properties['background'] = [@drawable.background] if fill? && !has_some_background?
@properties['foreground'] = [@drawable.foreground] if @drawable.respond_to?(:foreground) && draw? && !has_some_foreground?
@properties['alpha'] ||= [255]
@properties['font'] = [@drawable.font] if @drawable.respond_to?(:font) && draw? && !@properties.keys.map(&:to_s).include?('font')
@properties['transform'] = [nil] if @drawable.respond_to?(:transform) && !@properties.keys.map(&:to_s).include?('transform')
@properties.each do |property, args|
method_name = attribute_setter(property)
converted_args = apply_property_arg_conversions(method_name, property, args)
@properties[property] = converted_args
end
apply_shape_arg_conversions!
apply_shape_arg_defaults!
@calculated_paint_args = true
end
end
end
|
#calculated_args ⇒ Object
args translated to absolute coordinates
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
|
# File 'lib/glimmer/swt/custom/shape.rb', line 606
def calculated_args
return @args if !default_x? && !default_y? && !default_width? && !default_height? && parent.is_a?(Drawable)
@perform_redraw = false
original_x = nil
original_y = nil
original_width = nil
original_height = nil
if parent.is_a?(Shape)
@parent_absolute_x = parent.absolute_x
@parent_absolute_y = parent.absolute_y
end
if default_width?
original_width = width
self.width = default_width + default_width_delta
end
if default_height?
original_height = height
self.height = default_height + default_height_delta
end
if default_x?
original_x = x
self.x = default_x + default_x_delta
end
if default_y?
original_y = y
self.y = default_y + default_y_delta
end
if parent.is_a?(Shape)
move_by(@parent_absolute_x, @parent_absolute_y)
result_args = @args.clone
move_by(-1*@parent_absolute_x, -1*@parent_absolute_y)
else
result_args = @args.clone
end
if original_x
self.x = original_x
end
if original_y
self.y = original_y
end
if original_width
self.width = original_width
end
if original_height
self.height = original_height
end
@perform_redraw = true
result_args
end
|
#calculated_args? ⇒ Boolean
601
602
603
|
# File 'lib/glimmer/swt/custom/shape.rb', line 601
def calculated_args?
!!@calculated_args
end
|
#calculated_args_changed!(children: true) ⇒ Object
583
584
585
586
587
|
# File 'lib/glimmer/swt/custom/shape.rb', line 583
def calculated_args_changed!(children: true)
@calculated_args = nil
shapes.each(&:calculated_args_changed!) if children
end
|
#calculated_args_changed_for_defaults! ⇒ Object
589
590
591
592
593
594
595
596
597
598
599
|
# File 'lib/glimmer/swt/custom/shape.rb', line 589
def calculated_args_changed_for_defaults!
has_default_dimensions = default_width? || default_height?
parent_calculated_args_changed_for_defaults = has_default_dimensions
@calculated_args = nil if default_x? || default_y? || has_default_dimensions
if has_default_dimensions && parent.is_a?(Shape)
parent.calculated_args_changed_for_defaults!
elsif @content_added && !drawable.is_disposed
drawable.redraw if !@painting && !drawable.is_a?(ImageProxy)
end
end
|
#calculated_height ⇒ Object
718
719
720
|
# File 'lib/glimmer/swt/custom/shape.rb', line 718
def calculated_height
default_height? ? (default_height + default_height_delta) : height
end
|
#calculated_width ⇒ Object
714
715
716
|
# File 'lib/glimmer/swt/custom/shape.rb', line 714
def calculated_width
default_width? ? (default_width + default_width_delta) : width
end
|
#calculated_x ⇒ Object
762
763
764
765
766
|
# File 'lib/glimmer/swt/custom/shape.rb', line 762
def calculated_x
result = default_x? ? default_x : self.x
result += default_x_delta
result
end
|
#calculated_y ⇒ Object
768
769
770
771
772
|
# File 'lib/glimmer/swt/custom/shape.rb', line 768
def calculated_y
result = default_y? ? default_y : self.y
result += default_y_delta
result
end
|
#contain?(x, y) ⇒ Boolean
Returns if shape contains a point Subclasses (like polygon) may override to indicate if a point x,y coordinates falls inside the shape some shapes may choose to provide a fuzz factor to make usage of this method for mouse clicking more user friendly
193
194
195
196
|
# File 'lib/glimmer/swt/custom/shape.rb', line 193
def contain?(x, y)
x.between?(self.absolute_x, self.absolute_x + calculated_width) && y.between?(self.absolute_y, self.absolute_y + calculated_height)
end
|
#current_parameter_name?(attribute_name) ⇒ Boolean
395
396
397
|
# File 'lib/glimmer/swt/custom/shape.rb', line 395
def current_parameter_name?(attribute_name)
parameter_names.include?(attribute_name.to_s.to_sym)
end
|
#default_height ⇒ Object
704
705
706
707
708
709
710
711
712
|
# File 'lib/glimmer/swt/custom/shape.rb', line 704
def default_height
y_ends = shapes.map do |shape|
shape_height = shape.calculated_height.to_f
shape_y = shape.default_y? ? 0 : shape.y.to_f
shape_y + shape_height
end
y_ends.max.to_f
end
|
#default_height? ⇒ Boolean
676
677
678
679
680
|
# File 'lib/glimmer/swt/custom/shape.rb', line 676
def default_height?
return false unless current_parameter_name?(:height)
height = self.height
(height.nil? || height == :default || height == 'default' || (height.is_a?(Array) && (height.first.to_s == :default || height.first.to_s == 'default')))
end
|
#default_height_delta ⇒ Object
737
738
739
740
|
# File 'lib/glimmer/swt/custom/shape.rb', line 737
def default_height_delta
return 0 unless default_height? && height.is_a?(Array)
height[1].to_f
end
|
#default_height_delta=(delta) ⇒ Object
757
758
759
760
|
# File 'lib/glimmer/swt/custom/shape.rb', line 757
def default_height_delta=(delta)
return unless default_height?
self.height = [:default, delta]
end
|
#default_width ⇒ Object
694
695
696
697
698
699
700
701
702
|
# File 'lib/glimmer/swt/custom/shape.rb', line 694
def default_width
x_ends = shapes.map do |shape|
shape_width = shape.calculated_width.to_f
shape_x = shape.default_x? ? 0 : shape.x.to_f
shape_x + shape_width
end
x_ends.max.to_f
end
|
#default_width? ⇒ Boolean
670
671
672
673
674
|
# File 'lib/glimmer/swt/custom/shape.rb', line 670
def default_width?
return false unless current_parameter_name?(:width)
width = self.width
(width.nil? || width == :default || width == 'default' || (width.is_a?(Array) && (width.first.to_s == :default || width.first.to_s == 'default')))
end
|
#default_width_delta ⇒ Object
732
733
734
735
|
# File 'lib/glimmer/swt/custom/shape.rb', line 732
def default_width_delta
return 0 unless default_width? && width.is_a?(Array)
width[1].to_f
end
|
#default_width_delta=(delta) ⇒ Object
752
753
754
755
|
# File 'lib/glimmer/swt/custom/shape.rb', line 752
def default_width_delta=(delta)
return unless default_width?
self.width = [:default, delta]
end
|
#default_x ⇒ Object
682
683
684
685
686
|
# File 'lib/glimmer/swt/custom/shape.rb', line 682
def default_x
result = ((parent.size.x - size.x) / 2)
result += parent.bounds.x - parent.absolute_x if parent.is_a?(Shape) && parent.irregular?
result
end
|
#default_x? ⇒ Boolean
660
661
662
663
|
# File 'lib/glimmer/swt/custom/shape.rb', line 660
def default_x?
current_parameter_name?(:x) and
(x.nil? || x.to_s == 'default' || (x.is_a?(Array) && x.first.to_s == 'default'))
end
|
#default_x_delta ⇒ Object
722
723
724
725
|
# File 'lib/glimmer/swt/custom/shape.rb', line 722
def default_x_delta
return 0 unless default_x? && x.is_a?(Array)
x[1].to_f
end
|
#default_x_delta=(delta) ⇒ Object
742
743
744
745
|
# File 'lib/glimmer/swt/custom/shape.rb', line 742
def default_x_delta=(delta)
return unless default_x?
self.x = [:default, delta]
end
|
#default_y ⇒ Object
688
689
690
691
692
|
# File 'lib/glimmer/swt/custom/shape.rb', line 688
def default_y
result = ((parent.size.y - size.y) / 2)
result += parent.bounds.y - parent.absolute_y if parent.is_a?(Shape) && parent.irregular?
result
end
|
#default_y? ⇒ Boolean
665
666
667
668
|
# File 'lib/glimmer/swt/custom/shape.rb', line 665
def default_y?
current_parameter_name?(:y) and
(y.nil? || y.to_s == 'default' || (y.is_a?(Array) && y.first.to_s == 'default'))
end
|
#default_y_delta ⇒ Object
727
728
729
730
|
# File 'lib/glimmer/swt/custom/shape.rb', line 727
def default_y_delta
return 0 unless default_y? && y.is_a?(Array)
y[1].to_f
end
|
#default_y_delta=(delta) ⇒ Object
747
748
749
750
|
# File 'lib/glimmer/swt/custom/shape.rb', line 747
def default_y_delta=(delta)
return unless default_y?
self.y = [:default, delta]
end
|
#dispose(dispose_images: true, dispose_patterns: true) ⇒ Object
493
494
495
496
497
498
499
500
501
502
503
504
505
|
# File 'lib/glimmer/swt/custom/shape.rb', line 493
def dispose(dispose_images: true, dispose_patterns: true)
if dispose_patterns
@background_pattern&.dispose
@background_pattern = nil
@foreground_pattern&.dispose
@foreground_pattern = nil
end
if dispose_images
@image&.dispose
@image = nil
end
@parent.shapes.delete(self)
end
|
#draw? ⇒ Boolean
Also known as:
drawn?
153
154
155
|
# File 'lib/glimmer/swt/custom/shape.rb', line 153
def draw?
!fill?
end
|
#ensure_extent(paint_event) ⇒ Object
554
555
556
557
558
559
560
561
562
563
564
565
566
567
|
# File 'lib/glimmer/swt/custom/shape.rb', line 554
def ensure_extent(paint_event)
old_extent = @extent
if ['text', 'string'].include?(@name)
extent_args = [string]
extent_flags = SWTProxy[:draw_transparent] if current_parameter_name?(:is_transparent) && is_transparent
extent_flags = flags if current_parameter_name?(:flags)
extent_args << extent_flags unless extent_flags.nil?
self.extent = paint_event.gc.send("#{@name}Extent", *extent_args)
end
if !@extent.nil? && (old_extent&.x != @extent&.x || old_extent&.y != @extent&.y)
calculated_args_changed!
parent.calculated_args_changed_for_defaults! if parent.is_a?(Shape)
end
end
|
#expanded_shapes ⇒ Object
569
570
571
572
573
574
575
576
577
|
# File 'lib/glimmer/swt/custom/shape.rb', line 569
def expanded_shapes
if shapes.to_a.any?
shapes.map do |shape|
[shape] + shape.expanded_shapes
end.flatten
else
[]
end
end
|
#fill? ⇒ Boolean
Also known as:
filled?
158
159
160
|
# File 'lib/glimmer/swt/custom/shape.rb', line 158
def fill?
@options[:fill]
end
|
#foreground_pattern_args ⇒ Object
489
490
491
|
# File 'lib/glimmer/swt/custom/shape.rb', line 489
def foreground_pattern_args
pattern_args(type: 'foreground')
end
|
#get_attribute(attribute_name) ⇒ Object
441
442
443
444
445
446
447
448
449
450
|
# File 'lib/glimmer/swt/custom/shape.rb', line 441
def get_attribute(attribute_name)
if parameter_name?(attribute_name)
arg_index = parameter_index(attribute_name)
@args[arg_index] if arg_index
elsif (respond_to?(attribute_name, super: true) and respond_to?(ruby_attribute_setter(attribute_name), super: true))
self.send(attribute_name)
else
@properties.symbolize_keys[attribute_name.to_s.to_sym]
end
end
|
#gradient? ⇒ Boolean
163
164
165
|
# File 'lib/glimmer/swt/custom/shape.rb', line 163
def gradient?
@options[:gradient]
end
|
#has_attribute?(attribute_name, *args) ⇒ Boolean
407
408
409
410
411
|
# File 'lib/glimmer/swt/custom/shape.rb', line 407
def has_attribute?(attribute_name, *args)
self.class.gc_instance_methods.include?(attribute_setter(attribute_name)) or
parameter_name?(attribute_name) or
(respond_to?(attribute_name, super: true) and respond_to?(ruby_attribute_setter(attribute_name), super: true))
end
|
#has_some_background? ⇒ Boolean
228
229
230
|
# File 'lib/glimmer/swt/custom/shape.rb', line 228
def has_some_background?
@properties.keys.map(&:to_s).include?('background') || @properties.keys.map(&:to_s).include?('background_pattern')
end
|
#has_some_foreground? ⇒ Boolean
232
233
234
|
# File 'lib/glimmer/swt/custom/shape.rb', line 232
def has_some_foreground?
@properties.keys.map(&:to_s).include?('foreground') || @properties.keys.map(&:to_s).include?('foreground_pattern')
end
|
#include?(x, y) ⇒ Boolean
Returns if shape includes a point. When the shape is filled, this is the same as contain. When the shape is drawn, it only returns true if the point lies on the edge (boundary/border) Subclasses (like polygon) may override to indicate if a point x,y coordinates falls on the edge of a drawn shape or inside a filled shape some shapes may choose to provide a fuzz factor to make usage of this method for mouse clicking more user friendly
201
202
203
204
|
# File 'lib/glimmer/swt/custom/shape.rb', line 201
def include?(x, y)
contain?(x, y)
end
|
#inspect ⇒ Object
Overriding inspect to avoid printing very long shape hierarchies
793
794
795
796
797
|
# File 'lib/glimmer/swt/custom/shape.rb', line 793
def inspect
"#<#{self.class.name}:0x#{self.hash.to_s(16)} args=#{@args.inspect}, properties=#{@properties.inspect}}>"
rescue => e
"#<#{self.class.name}:0x#{self.hash.to_s(16)}"
end
|
#irregular? ⇒ Boolean
Indicates if a shape’s x, y, width, height differ from its bounds calculation (e.g. arc / polygon)
207
208
209
|
# File 'lib/glimmer/swt/custom/shape.rb', line 207
def irregular?
false
end
|
#location ⇒ Object
The bounding box top-left x and y
177
178
179
|
# File 'lib/glimmer/swt/custom/shape.rb', line 177
def location
org.eclipse.swt.graphics.Point.new(bounds.x, bounds.y)
end
|
#location_parameter_names ⇒ Object
subclasses may override to specify location parameter names if different from x and y (e.g. all polygon points are location parameters) used in calculating movement changes
383
384
385
|
# File 'lib/glimmer/swt/custom/shape.rb', line 383
def location_parameter_names
[:x, :y]
end
|
#move_by(x_delta, y_delta) ⇒ Object
moves by x delta and y delta. Subclasses must implement provdies a default implementation that assumes moving x and y is sufficient by default (not for polygons though, which must override)
213
214
215
216
217
218
219
220
221
222
223
224
225
226
|
# File 'lib/glimmer/swt/custom/shape.rb', line 213
def move_by(x_delta, y_delta)
if respond_to?(:x) && respond_to?(:y) && respond_to?(:x=) && respond_to?(:y=)
if default_x?
self.default_x_delta += x_delta
else
self.x += x_delta
end
if default_y?
self.default_y_delta += y_delta
else
self.y += y_delta
end
end
end
|
#paint(paint_event) ⇒ Object
507
508
509
510
511
512
513
514
515
516
517
|
# File 'lib/glimmer/swt/custom/shape.rb', line 507
def paint(paint_event)
paint_children(paint_event) if default_width? || default_height?
paint_self(paint_event)
shapes.each(&:calculated_args_changed!) if default_width? || default_height?
paint_children(paint_event)
rescue => e
Glimmer::Config.logger.error {"Error encountered in painting shape (#{self.inspect}) with calculated args (#{@calculated_args}) and args (#{@args})"}
Glimmer::Config.logger.error {e.full_message}
end
|
#paint_children(paint_event) ⇒ Object
548
549
550
551
552
|
# File 'lib/glimmer/swt/custom/shape.rb', line 548
def paint_children(paint_event)
shapes.to_a.each do |shape|
shape.paint(paint_event)
end
end
|
#paint_self(paint_event) ⇒ Object
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
|
# File 'lib/glimmer/swt/custom/shape.rb', line 519
def paint_self(paint_event)
@painting = true
calculate_paint_args!
@original_properties_backup = {}
@properties.each do |property, args|
method_name = attribute_setter(property)
@original_properties_backup[method_name] = paint_event.gc.send(method_name.sub('set', 'get')) rescue nil
paint_event.gc.send(method_name, *args)
if property == 'transform' && args.first.is_a?(TransformProxy)
args.first.swt_transform.dispose
end
end
ensure_extent(paint_event)
if !@calculated_args || parent_shape_absolute_location_changed?
@calculated_args = calculated_args
end
paint_event.gc.send(@method_name, *@calculated_args) unless parent.is_a?(Shape) && !parent.calculated_args?
@original_properties_backup.each do |method_name, value|
paint_event.gc.send(method_name, value)
end
@painting = false
rescue => e
Glimmer::Config.logger.error {"Error encountered in painting shape (#{self.inspect}) with calculated args (#{@calculated_args}) and args (#{@args})"}
Glimmer::Config.logger.error {e.full_message}
ensure
@painting = false
end
|
#parameter_index(attribute_name) ⇒ Object
399
400
401
|
# File 'lib/glimmer/swt/custom/shape.rb', line 399
def parameter_index(attribute_name)
parameter_names.index(attribute_name.to_s.to_sym)
end
|
#parameter_name?(attribute_name) ⇒ Boolean
391
392
393
|
# File 'lib/glimmer/swt/custom/shape.rb', line 391
def parameter_name?(attribute_name)
possible_parameter_names.map(&:to_s).include?(ruby_attribute_getter(attribute_name))
end
|
#parameter_names ⇒ Object
parameter names for arguments to pass to SWT GC.xyz method for rendering shape (e.g. draw_image(image, x, y) yields :image, :x, :y parameter names)
377
378
379
|
# File 'lib/glimmer/swt/custom/shape.rb', line 377
def parameter_names
[]
end
|
#parent_shape_absolute_location_changed? ⇒ Boolean
579
580
581
|
# File 'lib/glimmer/swt/custom/shape.rb', line 579
def parent_shape_absolute_location_changed?
(parent.is_a?(Shape) && (parent.absolute_x != @parent_absolute_x || parent.absolute_y != @parent_absolute_y))
end
|
#pattern(*args, type: nil) ⇒ Object
472
473
474
475
476
477
478
479
|
# File 'lib/glimmer/swt/custom/shape.rb', line 472
def pattern(*args, type: nil)
instance_variable_name = "@#{type}_pattern"
the_pattern = instance_variable_get(instance_variable_name)
if the_pattern.nil? || the_pattern.is_disposed
the_pattern = self.class.pattern(*args)
end
the_pattern
end
|
#pattern_args(type: nil) ⇒ Object
481
482
483
|
# File 'lib/glimmer/swt/custom/shape.rb', line 481
def pattern_args(type: nil)
@pattern_args && @pattern_args[type.to_s.capitalize]
end
|
#possible_parameter_names ⇒ Object
387
388
389
|
# File 'lib/glimmer/swt/custom/shape.rb', line 387
def possible_parameter_names
parameter_names
end
|
#post_add_content ⇒ Object
236
237
238
239
240
241
242
|
# File 'lib/glimmer/swt/custom/shape.rb', line 236
def post_add_content
unless @content_added
amend_method_name_options_based_on_properties!
@drawable.setup_shape_painting unless @drawable.is_a?(ImageProxy)
@content_added = true
end
end
|
#respond_to?(method_name, *args, &block) ⇒ Boolean
462
463
464
465
466
467
468
469
470
|
# File 'lib/glimmer/swt/custom/shape.rb', line 462
def respond_to?(method_name, *args, &block)
options = args.last if args.last.is_a?(Hash)
super_invocation = options && options[:super]
if !super_invocation && has_attribute?(method_name)
true
else
super
end
end
|
#round? ⇒ Boolean
167
168
169
|
# File 'lib/glimmer/swt/custom/shape.rb', line 167
def round?
@options[:round]
end
|
#set_attribute(attribute_name, *args) ⇒ Object
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
|
# File 'lib/glimmer/swt/custom/shape.rb', line 413
def set_attribute(attribute_name, *args)
options = args.last if args.last.is_a?(Hash)
args.pop if !options.nil? && !options[:redraw].nil?
perform_redraw = @perform_redraw
perform_redraw = options[:redraw] if perform_redraw.nil? && !options.nil?
perform_redraw = true if perform_redraw.nil?
if parameter_name?(attribute_name)
set_parameter_attribute(attribute_name, *args)
elsif (respond_to?(attribute_name, super: true) and respond_to?(ruby_attribute_setter(attribute_name), super: true))
self.send(ruby_attribute_setter(attribute_name), *args)
else
@properties[ruby_attribute_getter(attribute_name)] = args
end
if @content_added && perform_redraw && !drawable.is_disposed
@calculated_paint_args = false
attribute_name = ruby_attribute_getter(attribute_name)
if location_parameter_names.map(&:to_s).include?(attribute_name)
@calculated_args = nil
parent.calculated_args_changed_for_defaults! if parent.is_a?(Shape)
end
if ['width', 'height'].include?(attribute_name)
calculated_args_changed_for_defaults!
end
drawable.redraw unless drawable.is_a?(ImageProxy)
end
end
|
#set_parameter_attribute(attribute_name, *args) ⇒ Object
403
404
405
|
# File 'lib/glimmer/swt/custom/shape.rb', line 403
def set_parameter_attribute(attribute_name, *args)
@args[parameter_index(ruby_attribute_getter(attribute_name))] = args.size == 1 ? args.first : args
end
|
#size ⇒ Object
The bounding box width and height (as a Point object with x being width and y being height)
182
183
184
|
# File 'lib/glimmer/swt/custom/shape.rb', line 182
def size
org.eclipse.swt.graphics.Point.new(calculated_width, calculated_height)
end
|
Tolerates shape extra args added by user by mistake (e.g. happens when switching from round rectangle to a standard one without removing all extra args)
351
352
353
354
355
356
357
358
|
# File 'lib/glimmer/swt/custom/shape.rb', line 351
def
the_java_method_arg_count = org.eclipse.swt.graphics.GC.java_class.declared_instance_methods.select do |m|
m.name == @method_name.camelcase(:lower)
end.map(&:parameter_types).map(&:size).max
if the_java_method_arg_count && @args.to_a.size > the_java_method_arg_count
@args[the_java_method_arg_count..-1] = []
end
end
|