Class: Glimmer::SWT::TableItemProxy

Inherits:
WidgetProxy show all
Defined in:
lib/glimmer/swt/table_item_proxy.rb

Constant Summary collapse

STYLE =
<<~CSS
  tr.table-item td {
    padding-bottom: 0;
  }
  tr.table-item:nth-child(even):not(.selected) {
    background: rgb(243, 244, 246);
  }
CSS

Constants inherited from WidgetProxy

WidgetProxy::DEFAULT_INITIALIZERS

Instance Attribute Summary collapse

Attributes inherited from WidgetProxy

#args, #background, #children, #disposed?, #enabled, #focus, #font, #foreground, #parent, #path, #rendered

Instance Method Summary collapse

Methods inherited from WidgetProxy

#add_content_on_render, #add_css_class, #add_css_classes, #add_observer, #apply_property_type_converters, #build_dom, #can_handle_observation_request?, #clear_css_classes, #content, #content_on_render_blocks, #css_classes, #default_observation_request_to_event_mapping, #dispose, #dom_element, #effective_observation_request_to_event_mapping, for, #handle_observation_request, #has_style?, #id, #id=, #listener_dom_element, #listener_path, max_id_number_for, max_id_numbers, #method_missing, #name, next_id_number_for, #observation_request_to_event_mapping, #observation_requests, #parent_dom_element, #post_add_content, #post_dispose_child, #post_initialize_child, #property_type_converters, #remove_all_listeners, #remove_css_class, #remove_css_classes, #render, reset_max_id_numbers!, #selector, #set_attribute, #set_focus, #style_element, underscored_widget_name, widget_class, widget_exists?, #widget_property_listener_installers

Methods included from PropertyOwner

#attribute_getter, #attribute_setter, #get_attribute, #set_attribute

Constructor Details

#initialize(parent, args, block) ⇒ TableItemProxy

Returns a new instance of TableItemProxy.



38
39
40
41
42
43
44
# File 'lib/glimmer/swt/table_item_proxy.rb', line 38

def initialize(parent, args, block)
  super(parent, args, block)
  # TODO check if there is a need to remove this observer when removing widget from table upon items update
  on_widget_selected { |event|
    parent.select(parent.index_of(self), event.meta?)
  }
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Glimmer::SWT::WidgetProxy

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



36
37
38
# File 'lib/glimmer/swt/table_item_proxy.rb', line 36

def data
  @data
end

Instance Method Details

#cell_dom_element(column_index) ⇒ Object



87
88
89
# File 'lib/glimmer/swt/table_item_proxy.rb', line 87

def cell_dom_element(column_index)
  dom_element.find("td:nth-child(#{column_index + 1})")
end

#data_hashObject



75
76
77
# File 'lib/glimmer/swt/table_item_proxy.rb', line 75

def data_hash
  @data_hash ||= {}
end

#domObject



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/glimmer/swt/table_item_proxy.rb', line 160

def dom
  table_item_id = id
  table_item_id_style = css
  table_item_css_classes = css_classes
  table_item_css_classes << name
  table_item_selection = parent.selection.include?(self)
  if table_item_selection
    table_item_css_classes << 'selected'
  else
    table_item_css_classes.delete('selected')
  end
  table_item_text_array = text_array
  table_item_max_width = max_column_width(@edit_column_index) if @edit_column_index

  @dom ||= html {
    tr(id: table_item_id, style: table_item_id_style, class: table_item_css_classes.to_a.join(' ')) {
      table_item_text_array.each_with_index do |table_item_text, column_index|
        td('data-column-index' => column_index) {
          if @edit_column_index == column_index
            input(type: 'text', value: table_item_text, style: "max-width: #{table_item_max_width - 11}px;")
          else
            table_item_text
          end
        }
      end
    }
  }.to_s
end

#edit(column_index) ⇒ Object



135
136
137
138
139
140
# File 'lib/glimmer/swt/table_item_proxy.rb', line 135

def edit(column_index)
  return if @edit_column_index == column_index.to_i
  parent.select(parent.index_of(self), false)
  @edit_column_index = column_index.to_i
  redraw
end

#elementObject



83
84
85
# File 'lib/glimmer/swt/table_item_proxy.rb', line 83

def element
  'tr'
end

#get_data(key = nil) ⇒ Object



59
60
61
62
63
64
65
# File 'lib/glimmer/swt/table_item_proxy.rb', line 59

def get_data(key = nil)
  if key.nil?
    @data
  else
    data_hash[key]
  end
end

#get_text(index) ⇒ Object



46
47
48
# File 'lib/glimmer/swt/table_item_proxy.rb', line 46

def get_text(index)
  text_array[index]
end

#max_column_width(column_index) ⇒ Object



156
157
158
# File 'lib/glimmer/swt/table_item_proxy.rb', line 156

def max_column_width(column_index)
  parent_dom_element.find("tr td:nth-child(#{column_index + 1})").first.width
end

#on_widget_selected(&block) ⇒ Object



150
151
152
153
154
# File 'lib/glimmer/swt/table_item_proxy.rb', line 150

def on_widget_selected(&block)
  event = 'click'
  delegate = $document.on(event, selector, &block)
  EventListenerProxy.new(element_proxy: self, event: event, selector: selector, delegate: delegate)
end

#parent_pathObject



79
80
81
# File 'lib/glimmer/swt/table_item_proxy.rb', line 79

def parent_path
  parent.items_path
end

#redrawObject



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/glimmer/swt/table_item_proxy.rb', line 91

def redraw
  super() #TODO re-enable and remove below lines

  # TODO perhaps turn the following lambdas into methods
  table_item_edit_handler = lambda do |event, cancel = false|
    Async::Task.new do
      text_value = event.target.value
      edit_property = parent.column_properties[@edit_column_index]
      edit_model = get_data
      if !cancel && edit_model.send(edit_property) != text_value
        edit_model.send("#{edit_property}=", text_value)
        set_text(@edit_column_index, text_value)
      end
      @edit_column_index = nil
      redraw
    end
  end
  table_item_edit_cancel_handler = lambda do |event|
    Async::Task.new do
      table_item_edit_handler.call(event, true)
    end
  end
  table_item_edit_key_handler = lambda do |event|
    Async::Task.new do
      if event.key_code == 13
        table_item_edit_handler.call(event)
      elsif event.key_code == 27
        table_item_edit_cancel_handler.call(event)
      end
    end
  end
  
  if @edit_column_index
    table_item_input = dom_element.find("td:nth-child(#{@edit_column_index + 1}) input")
    if !table_item_input.empty?
      Async::Task.new do
        table_item_input.focus
        table_item_input.on('keyup', &table_item_edit_key_handler)
        table_item_input.on('focusout', &table_item_edit_cancel_handler)
      end
    end
  end
end

#redraw_selectionObject



142
143
144
145
146
147
148
# File 'lib/glimmer/swt/table_item_proxy.rb', line 142

def redraw_selection
  if parent.selection.include?(self)
    dom_element.add_class('selected')
  else
    dom_element.remove_class('selected')
  end
end

#set_data(key = nil, data_value) ⇒ Object



67
68
69
70
71
72
73
# File 'lib/glimmer/swt/table_item_proxy.rb', line 67

def set_data(key = nil, data_value)
  if key.nil?
    @data = data_value
  else
    data_hash[key] = data_value
  end
end

#set_text(index, text_value) ⇒ Object



50
51
52
53
# File 'lib/glimmer/swt/table_item_proxy.rb', line 50

def set_text(index, text_value)
  text_array[index] = text_value
  redraw
end

#text_arrayObject



55
56
57
# File 'lib/glimmer/swt/table_item_proxy.rb', line 55

def text_array
  @text_array ||= []
end