Class: Clevic::RowHeader
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
-
#table_view ⇒ Object
readonly
The Clevic::TableView instance.
Instance Method Summary collapse
-
#getCellRenderer(row, column) ⇒ Object
return self so that getTableCellRendererComponent is called.
-
#getTableCellRendererComponent(jtable, value, is_selected, has_focus, row, column) ⇒ Object
Implementation of TableCellRenderer return renderer Component.
-
#initialize(table_view) ⇒ RowHeader
constructor
this will add a row header to the passed table_view.
- #process_list_selection(event) ⇒ Object
-
#row_header_selecting(&block) ⇒ Object
guard to make sure changes to main table selection don’t feed back.
-
#row_selection_handlers ⇒ Object
Transfer row header selection to full row selections in the main table.
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_view ⇒ Object (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_handlers ⇒ Object
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 |