Class: Clevic::RowHeader

Inherits:
Object show all
Defined in:
lib/clevic/swing/row_header.rb

Overview

The JTable used to display a row header, and allow row selection. Also handles highlighting rows for different states, eg validation errors or unsaved. TODO need to add exceptions thrown by a Model.save to the error list in the model

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(table_view) ⇒ RowHeader

this will add a row header to the passed table_view



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/clevic/swing/row_header.rb', line 76

def initialize( table_view )
  @table_view = table_view
  super( RowHeaderModel.new( table_view.model ) )
  self.font = table_view.font
  self.grid_color = java.awt.Color::white

  # user header renderer for all cells
  set_default_renderer( java.lang.Object, table_header.default_renderer )

  # set the width
  column_width = table_view.column_width( 0, "  #{row_count}" )
  column_model.column( 0 ).preferred_width = column_width

  # This is a workaround either for OSX, or java-1.5.0_19-b02-306
  self.minimum_size = java.awt.Dimension.new( column_width, minimum_size.height )

  # put a count above the row number header
  @count_label = javax.swing.JLabel.new( row_count.to_s ).tap do |count_label|
    count_label.font = self.font
    count_label.horizontal_alignment = javax.swing.JComponent::CENTER_ALIGNMENT
    table_view.set_corner( javax.swing.ScrollPaneConstants::UPPER_LEFT_CORNER, count_label )

    # make sure count label is updated when the model changes
    model.add_table_model_listener do |event|
      count_label.text = row_count.to_s
    end
  end

  # insert into the row header side of the scrollpane
  table_view.row_header = javax.swing.JViewport.new.tap do |vp|
    vp.view = self
    # make sure size is passed along to viewport
    vp.preferred_size = preferred_size
  end

  row_selection_handlers
end

Instance Attribute Details

#table_viewObject (readonly)

The Clevic::TableView instance



73
74
75
# File 'lib/clevic/swing/row_header.rb', line 73

def table_view
  @table_view
end

Instance Method Details

#getCellRenderer(row, column) ⇒ Object

return self so that getTableCellRendererComponent is called



167
168
169
# File 'lib/clevic/swing/row_header.rb', line 167

def getCellRenderer( row, column )
  self
end

#getTableCellRendererComponent(jtable, value, is_selected, has_focus, row, column) ⇒ Object

Implementation of TableCellRenderer return renderer Component



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/clevic/swing/row_header.rb', line 173

def getTableCellRendererComponent(jtable, value,is_selected,has_focus,row,column)
  item = table_view.model.collection[row]
  renderer = get_default_renderer( java.lang.Object ).getTableCellRendererComponent(jtable,value,is_selected,has_focus,row,column)

  case
  # no highlighting for an empty item
  when item.nil?
    renderer.background = java.awt.Color::yellow
    renderer.opaque = true
    renderer.tool_tip_text = "deleted elsewhere"

  # there's a validation error
  when item.errors && !item.errors.empty?
    renderer.background = java.awt.Color::orange
    renderer.opaque = true
    renderer.tool_tip_text = "validation errors"

  # record isn't saved yet
  when item.changed?
    renderer.background = java.awt.Color::yellow
    renderer.opaque = true
    renderer.tool_tip_text = "row not saved"

  when is_selected
    renderer.background = javax.swing.UIManager.get 'Table.selectionBackground'
    renderer.tool_tip_text = "id=#{item.id}"

  else
    renderer.tool_tip_text = "id=#{item.id}"

  end

  renderer
end

#process_list_selection(event) ⇒ Object



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/clevic/swing/row_header.rb', line 144

def process_list_selection( event )
  # tell the main table handler we're busy
  row_header_selecting do
    # clear main table selection and start again
    table_view.jtable.selection_model.clear_selection

    # select the whole row in main table. Subsequent row selections will also
    # select the whole row. What a broken API.
    table_view.jtable.setColumnSelectionInterval( table_view.model.fields.size-1, 0 )

    selected_rows.each do |row|
      table_view.jtable.selection_model.addSelectionInterval( row, row )
    end

    # make sure the keyboard focus is on the latest selected row
    table_view.jtable.selection_model.addSelectionInterval( selection_model.lead_selection_index, selection_model.lead_selection_index )

    # make sure main table gets focus again
    table_view.request_focus
  end
end

#row_header_selecting(&block) ⇒ Object

guard to make sure changes to main table selection don’t feed back.



131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/clevic/swing/row_header.rb', line 131

def row_header_selecting( &block )
  if block_given?
    begin
      @row_header_selecting = true
      yield
    ensure
      @row_header_selecting = false
    end
  else
    @row_header_selecting
  end
end

#row_selection_handlersObject

Transfer row header selection to full row selections in the main table. Also clear the row header selection if a main table selection happens.



117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/clevic/swing/row_header.rb', line 117

def row_selection_handlers
  # add a selection listener to select data table rows
  selection_model.addListSelectionListener do |list_event|
    process_list_selection( list_event )
  end

  # selections in the main table must clear any selections
  # in the row header, ie self
  table_view.jtable.selection_model.addListSelectionListener do |event|
    selection_model.clear_selection unless row_header_selecting
  end
end