Class: Glimmer::SWT::TableItemProxy

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

Constant Summary

Constants inherited from WidgetProxy

WidgetProxy::DEFAULT_INITIALIZERS

Instance Attribute Summary collapse

Attributes inherited from WidgetProxy

#args, #background, #children, #enabled, #font, #foreground, #parent, #path

Instance Method Summary collapse

Methods inherited from WidgetProxy

#add_child, #add_css_class, #add_css_classes, #add_observer, #apply_property_type_converters, #build_dom, #can_handle_observation_request?, #clear_css_classes, #content, #css_classes, #dispose, #dom_element, for, #handle_observation_request, #has_style?, #id, #id=, #listener_dom_element, #listener_path, max_id_number_for, max_id_numbers, #name, next_id_number_for, #observation_request_to_event_mapping, #parent_dom_element, #property_type_converters, #remove_css_class, #remove_css_classes, #render, reset_max_id_numbers!, #selector, #set_attribute, #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) ⇒ TableItemProxy

Returns a new instance of TableItemProxy.



8
9
10
11
12
13
# File 'lib/glimmer/swt/table_item_proxy.rb', line 8

def initialize(parent, args)
  super(parent, args)
  on_widget_selected { |event|
    parent.select(parent.index_of(self), event.meta?)
  }
end

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



6
7
8
# File 'lib/glimmer/swt/table_item_proxy.rb', line 6

def data
  @data
end

Instance Method Details

#data_hashObject



44
45
46
# File 'lib/glimmer/swt/table_item_proxy.rb', line 44

def data_hash
  @data_hash ||= {}
end

#domObject



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/glimmer/swt/table_item_proxy.rb', line 117

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



100
101
102
103
104
105
# File 'lib/glimmer/swt/table_item_proxy.rb', line 100

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



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

def element
  'tr'
end

#get_data(key = nil) ⇒ Object



28
29
30
31
32
33
34
# File 'lib/glimmer/swt/table_item_proxy.rb', line 28

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

#get_text(index) ⇒ Object



15
16
17
# File 'lib/glimmer/swt/table_item_proxy.rb', line 15

def get_text(index)
  text_array[index]
end

#max_column_width(column_index) ⇒ Object



113
114
115
# File 'lib/glimmer/swt/table_item_proxy.rb', line 113

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



107
108
109
110
111
# File 'lib/glimmer/swt/table_item_proxy.rb', line 107

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



48
49
50
# File 'lib/glimmer/swt/table_item_proxy.rb', line 48

def parent_path
  parent.items_path
end

#redrawObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/glimmer/swt/table_item_proxy.rb', line 56

def redraw
  super() #TODO re-enalbe 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

#set_data(key = nil, data_value) ⇒ Object



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

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



19
20
21
22
# File 'lib/glimmer/swt/table_item_proxy.rb', line 19

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

#text_arrayObject



24
25
26
# File 'lib/glimmer/swt/table_item_proxy.rb', line 24

def text_array
  @text_array ||= []
end