lib/glimmer/swt/style_constantizable.rb in glimmer-dsl-swt-4.18.4.5 vs lib/glimmer/swt/style_constantizable.rb in glimmer-dsl-swt-4.18.4.6

- old
+ new

@@ -1,157 +1,157 @@ -# Copyright (c) 2007-2021 Andy Maleh -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -require 'glimmer/error' - -module Glimmer - module SWT - # Mixin for all proxy classes that manage style constants (e.g. SWT, DND, etc...) - module StyleConstantizable - include SuperModule - - class << self - REGEX_SYMBOL_NEGATIVITY = /^([^!]+)(!)?$/ - - def constant_java_import - raise 'Not implemented! Mixer must implement!' - end - - def constant_source_class - raise 'Not implemented! Mixer must implement!' - end - - def constant_value_none - # TODO instead of raising error try a convention instead like CLASSNAME::NONE by default - raise 'Not implemented! Mixer must implement!' - end - - # hash of extra composite styles (i.e. style combinations defined under new style names) - def extra_styles - {} - end - - def error_message_invalid_style - " is an invalid #{constant_source_class.name.split(':').last} style! Please choose a style from #{constant_java_import} class constants." # TODO parameterize - end - - # Gets constants (e.g. SWT::CONSTANT) where constant is - # passed in as a lower case symbol - def [](*symbols) - symbols = symbols.first if symbols.size == 1 && symbols.first.is_a?(Array) - result = symbols.compact.map do |symbol| - constant(symbol).tap do |constant_value| - raise Glimmer::Error, symbol.to_s + error_message_invalid_style unless constant_value.is_a?(Integer) - end - end.reduce do |output, constant_value| - if constant_value < 0 - output & constant_value - else - output | constant_value - end - end - result.nil? ? constant_value_none : result - end - - # Returns style integer value for passed in symbol or allows - # passed in object to pass through (e.g. Integer). This makes is convenient - # to use symbols or actual style integers in Glimmer - # Does not raise error for invalid values. Just lets them pass as is. - # (look into [] operator if you want an error raised on invalid values) - def constant(symbol) - return symbol unless symbol.is_a?(Symbol) || symbol.is_a?(String) - symbol_string, negative = extract_symbol_string_negativity(symbol) - swt_constant_symbol = symbol_string.downcase == symbol_string ? symbol_string.upcase.to_sym : symbol_string.to_sym - bit_value = constant_source_class.const_get(swt_constant_symbol) - negative ? ~bit_value : bit_value - rescue => e - begin -# Glimmer::Config.logger.debug {e.full_message} - alternative_swt_constant_symbol = constant_source_class.constants.find {|c| c.to_s.upcase == swt_constant_symbol.to_s.upcase} - bit_value = constant_source_class.const_get(alternative_swt_constant_symbol) - negative ? ~bit_value : bit_value - rescue => e -# Glimmer::Config.logger.debug {e.full_message} - if symbol.to_s.size == 1 # accelerator key - symbol.to_s.bytes.first - else - bit_value = extra_styles[swt_constant_symbol] - if bit_value - negative ? ~bit_value : bit_value - else - symbol - end - end - end - end - - def extract_symbol_string_negativity(symbol) - if symbol.is_a?(Symbol) || symbol.is_a?(String) - symbol_negativity_match = symbol.to_s.match(REGEX_SYMBOL_NEGATIVITY) - symbol = symbol_negativity_match[1] - negative = !!symbol_negativity_match[2] - [symbol, negative] - else - negative = symbol < 0 - [symbol, negative] - end - end - - def negative?(symbol) - extract_symbol_string_negativity(symbol)[1] - end - - def has_constant?(symbol) - return false unless symbol.is_a?(Symbol) || symbol.is_a?(String) - constant(symbol).is_a?(Integer) - end - - def constantify_args(args) - args.map {|arg| constant(arg)} - end - - # Deconstructs a style integer into symbols - # Useful for debugging - def deconstruct(integer) - constant_source_class.constants.reduce([]) do |found, c| - constant_value = constant_source_class.const_get(c) rescue -1 - is_found = constant_value.is_a?(Integer) && (integer & constant_value) == constant_value - is_found ? found += [c] : found - end - end - - # Reverse engineer a style integer into a symbol - # Useful for debugging - def reverse_lookup(integer) - # TODO support looking up compound style mixes - constant_source_class.constants.reduce([]) do |found, c| - constant_value = constant_source_class.const_get(c) rescue -1 - is_found = constant_value.is_a?(Integer) && integer == constant_value - is_found ? found += [c] : found - end - end - - def include?(swt_constant, *symbols) - swt_constant & self[symbols] == self[symbols] - end - end - end - end -end +# Copyright (c) 2007-2021 Andy Maleh +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +require 'glimmer/error' + +module Glimmer + module SWT + # Mixin for all proxy classes that manage style constants (e.g. SWT, DND, etc...) + module StyleConstantizable + include SuperModule + + class << self + REGEX_SYMBOL_NEGATIVITY = /^([^!]+)(!)?$/ + + def constant_java_import + raise 'Not implemented! Mixer must implement!' + end + + def constant_source_class + raise 'Not implemented! Mixer must implement!' + end + + def constant_value_none + # TODO instead of raising error try a convention instead like CLASSNAME::NONE by default + raise 'Not implemented! Mixer must implement!' + end + + # hash of extra composite styles (i.e. style combinations defined under new style names) + def extra_styles + {} + end + + def error_message_invalid_style + " is an invalid #{constant_source_class.name.split(':').last} style! Please choose a style from #{constant_java_import} class constants." # TODO parameterize + end + + # Gets constants (e.g. SWT::CONSTANT) where constant is + # passed in as a lower case symbol + def [](*symbols) + symbols = symbols.first if symbols.size == 1 && symbols.first.is_a?(Array) + result = symbols.compact.map do |symbol| + constant(symbol).tap do |constant_value| + raise Glimmer::Error, symbol.to_s + error_message_invalid_style unless constant_value.is_a?(Integer) + end + end.reduce do |output, constant_value| + if constant_value < 0 + output & constant_value + else + output | constant_value + end + end + result.nil? ? constant_value_none : result + end + + # Returns style integer value for passed in symbol or allows + # passed in object to pass through (e.g. Integer). This makes is convenient + # to use symbols or actual style integers in Glimmer + # Does not raise error for invalid values. Just lets them pass as is. + # (look into [] operator if you want an error raised on invalid values) + def constant(symbol) + return symbol unless symbol.is_a?(Symbol) || symbol.is_a?(String) + symbol_string, negative = extract_symbol_string_negativity(symbol) + swt_constant_symbol = symbol_string.downcase == symbol_string ? symbol_string.upcase.to_sym : symbol_string.to_sym + bit_value = constant_source_class.const_get(swt_constant_symbol) + negative ? ~bit_value : bit_value + rescue => e + begin +# Glimmer::Config.logger.debug {e.full_message} + alternative_swt_constant_symbol = constant_source_class.constants.find {|c| c.to_s.upcase == swt_constant_symbol.to_s.upcase} + bit_value = constant_source_class.const_get(alternative_swt_constant_symbol) + negative ? ~bit_value : bit_value + rescue => e +# Glimmer::Config.logger.debug {e.full_message} + if symbol.to_s.size == 1 # accelerator key + symbol.to_s.bytes.first + else + bit_value = extra_styles[swt_constant_symbol] + if bit_value + negative ? ~bit_value : bit_value + else + symbol + end + end + end + end + + def extract_symbol_string_negativity(symbol) + if symbol.is_a?(Symbol) || symbol.is_a?(String) + symbol_negativity_match = symbol.to_s.match(REGEX_SYMBOL_NEGATIVITY) + symbol = symbol_negativity_match[1] + negative = !!symbol_negativity_match[2] + [symbol, negative] + else + negative = symbol < 0 + [symbol, negative] + end + end + + def negative?(symbol) + extract_symbol_string_negativity(symbol)[1] + end + + def has_constant?(symbol) + return false unless symbol.is_a?(Symbol) || symbol.is_a?(String) + constant(symbol).is_a?(Integer) + end + + def constantify_args(args) + args.map {|arg| constant(arg)} + end + + # Deconstructs a style integer into symbols + # Useful for debugging + def deconstruct(integer) + constant_source_class.constants.reduce([]) do |found, c| + constant_value = constant_source_class.const_get(c) rescue -1 + is_found = constant_value.is_a?(Integer) && (integer & constant_value) == constant_value + is_found ? found += [c] : found + end + end + + # Reverse engineer a style integer into a symbol + # Useful for debugging + def reverse_lookup(integer) + # TODO support looking up compound style mixes + constant_source_class.constants.reduce([]) do |found, c| + constant_value = constant_source_class.const_get(c) rescue -1 + is_found = constant_value.is_a?(Integer) && integer == constant_value + is_found ? found += [c] : found + end + end + + def include?(swt_constant, *symbols) + swt_constant & self[symbols] == self[symbols] + end + end + end + end +end