Class: Glimmer::SWT::GWidget

Inherits:
Object
  • Object
show all
Includes:
Parent
Defined in:
lib/glimmer/swt/g_widget.rb

Direct Known Subclasses

GShell, GTabItemComposite

Constant Summary collapse

@@default_styles =

TODO externalize

{
  "text" => GSWT[:border],
  "table" => GSWT[:border],
  "spinner" => GSWT[:border],
  "list" => GSWT[:border, :v_scroll],
  "button" => GSWT[:push],
}
@@default_initializers =

TODO externalize

{
  "composite" => Proc.new {|composite| composite.setLayout(GridLayout.new) },
  "table" => Proc.new do |table|
    table.setHeaderVisible(true)
    table.setLinesVisible(true)
  end,
  "table_column" => Proc.new { |table_column| table_column.setWidth(80) },
  "group" => Proc.new {|group| group.setLayout(GridLayout.new) },
}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(underscored_widget_name, parent, styles, &contents) ⇒ GWidget

styles is a comma separate list of symbols representing SWT styles in lower case



40
41
42
43
# File 'lib/glimmer/swt/g_widget.rb', line 40

def initialize(underscored_widget_name, parent, styles, &contents)
  @widget = self.class.swt_widget_class_for(underscored_widget_name).new(parent, style(underscored_widget_name, styles))
  @@default_initializers[underscored_widget_name].call(@widget) if @@default_initializers[underscored_widget_name]
end

Instance Attribute Details

#widgetObject (readonly)

Returns the value of attribute widget.



17
18
19
# File 'lib/glimmer/swt/g_widget.rb', line 17

def widget
  @widget
end

Class Method Details

.swt_widget_class_for(underscored_widget_name) ⇒ Object

This supports widgets in and out of basic SWT



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/glimmer/swt/g_widget.rb', line 101

def self.swt_widget_class_for(underscored_widget_name)
  swt_widget_name = underscored_widget_name.camelcase(:upper)
  swt_widget_class = eval(swt_widget_name)
  unless swt_widget_class.ancestors.include?(org.eclipse.swt.widgets.Widget)
    Glimmer.logger.debug("Class #{swt_widget_class} matching #{underscored_widget_name} is not a subclass of org.eclipse.swt.widgets.Widget")
    return nil
  end
  swt_widget_class
rescue NameError => e
  Glimmer.logger.debug("#{e.message}\n#{e.backtrace.join("\n")}")
  nil
rescue => e
  Glimmer.logger.debug("#{e.message}\n#{e.backtrace.join("\n")}")
  nil
end

.widget_exists?(underscored_widget_name) ⇒ Boolean

Returns:

  • (Boolean)


96
97
98
# File 'lib/glimmer/swt/g_widget.rb', line 96

def self.widget_exists?(underscored_widget_name)
  !!swt_widget_class_for(underscored_widget_name)
end

Instance Method Details

#add_listener(underscored_listener_name, &block) ⇒ Object



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/glimmer/swt/g_widget.rb', line 149

def add_listener(underscored_listener_name, &block)
  listener_method_name = underscored_listener_name.camelcase(:lower)
  @widget.getClass.getMethods.each do |widget_method|
    if widget_method.getName.match(/add.*Listener/)
      widget_method.getParameterTypes.each do |listener_type|
        listener_type.getMethods.each do |listener_method|
          if (listener_method.getName == listener_method_name)
            listener_class = Class.new(Object)
            listener_class.send :include, (eval listener_type.to_s.sub("interface", ""))
            listener = listener_class.new
            listener_type.getMethods.each do |t_method|
              eval "def listener.#{t_method.getName}(event) end"
            end
            def listener.block=(block)
              @block = block
            end
            listener.block=block
            eval "def listener.#{listener_method.getName}(event) @block.call(event) if @block end"
            @widget.send(widget_method.getName, listener)
            return GWidgetListener.new(listener)
          end
        end
      end
    end
  end
end

#apply_property_type_converters(attribute_name, args) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/glimmer/swt/g_widget.rb', line 83

def apply_property_type_converters(attribute_name, args)
  if args.count == 1
    value = args.first
    converter = property_type_converters[attribute_name.to_sym]
    args[0] = converter.call(value) if converter
  end
  if args.count == 1 && args.first.is_a?(GColor)
    g_color = args.first
    g_color.display = widget.display if g_color.display.nil? || g_color.display != widget.display
    args[0] = g_color.color
  end
end

#async_exec(&block) ⇒ Object



180
181
182
# File 'lib/glimmer/swt/g_widget.rb', line 180

def async_exec(&block)
  @widget.getDisplay.asyncExec(GRunnable.new(&block))
end

#can_add_listener?(underscored_listener_name) ⇒ Boolean

Returns:

  • (Boolean)


133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/glimmer/swt/g_widget.rb', line 133

def can_add_listener?(underscored_listener_name)
  listener_method_name = underscored_listener_name.camelcase(:lower)
  @widget.getClass.getMethods.each do |widget_method|
    if widget_method.getName.match(/add.*Listener/)
      widget_method.getParameterTypes.each do |listener_type|
        listener_type.getMethods.each do |listener_method|
          if (listener_method.getName == listener_method_name)
            return true
          end
        end
      end
    end
  end
  return false
end

#disposeObject



192
193
194
# File 'lib/glimmer/swt/g_widget.rb', line 192

def dispose
  @widget.dispose
end

#has_attribute?(attribute_name, *args) ⇒ Boolean

Returns:

  • (Boolean)


49
50
51
# File 'lib/glimmer/swt/g_widget.rb', line 49

def has_attribute?(attribute_name, *args)
  @widget.respond_to?(attribute_setter(attribute_name), args)
end

#has_style?(style) ⇒ Boolean

Returns:

  • (Boolean)


45
46
47
# File 'lib/glimmer/swt/g_widget.rb', line 45

def has_style?(swt_style)
  pd(pd(@widget.getStyle) & swt_style) == pd(swt_style)
end

#process_block(block) ⇒ Object



176
177
178
# File 'lib/glimmer/swt/g_widget.rb', line 176

def process_block(block)
  block.call(@widget)
end

#property_type_convertersObject



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/glimmer/swt/g_widget.rb', line 58

def property_type_converters
  color_converter = Proc.new do |value|
    if value.is_a?(Symbol) || value.is_a?(String)
      GColor.color_for(widget.getDisplay, value)
    else
      value
    end
  end
  @property_type_converters ||= {
    :text => Proc.new { |value| value.to_s },
    :items => Proc.new { |value| value.to_java :string},
    :visible => Proc.new { |value| !!value},
    :background => color_converter,
    :foreground => color_converter,
    :font => Proc.new do |value|
      if value.is_a?(Hash)
        font_properties = value
        GFont.for(self).font(font_properties)
      else
        value
      end
    end,
  }
end

#set_attribute(attribute_name, *args) ⇒ Object



53
54
55
56
# File 'lib/glimmer/swt/g_widget.rb', line 53

def set_attribute(attribute_name, *args)
  apply_property_type_converters(attribute_name, args)
  @widget.send(attribute_setter(attribute_name), *args)
end

#sync_exec(&block) ⇒ Object



184
185
186
# File 'lib/glimmer/swt/g_widget.rb', line 184

def sync_exec(&block)
  @widget.getDisplay.syncExec(GRunnable.new(&block))
end

#widget_listener_exists?(underscored_listener_name) ⇒ Boolean

Returns:

  • (Boolean)


117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/glimmer/swt/g_widget.rb', line 117

def widget_listener_exists?(underscored_listener_name)
  listener_method_name = underscored_listener_name.listener_method_name(:lower)
  @widget.getClass.getMethods.each do |widget_method|
    if widget_method.getName.match(/add.*Listener/)
      widget_method.getParameterTypes.each do |listener_type|
        listener_type.getMethods.each do |listener_method|
          if (listener_method.getName == listener_method_name)
            return true
          end
        end
      end
    end
  end
  return false
end