/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package presenter ;
import javax.swing.JTable ;
import javax.swing.JTextArea ;
import javax.swing.table.DefaultTableCellRenderer ;
import javax.swing.table.TableCellRenderer ;
import javax.swing.table.TableColumn ;
import javax.swing.table.TableColumnModel ;
import java.awt.Component ;
import java.util.Enumeration ;
import java.util.HashMap ;
import java.util.Map ;
/**
* The standard class for rendering (displaying) individual cells in a JTable.
* This class inherits from JTextArea, a standard component class.
* However JTextArea is a multi-line area that displays plain text.
*
* This class implements TableCellRenderer , i.e. interface.
* This interface defines the method required by any object that
* would like to be a renderer for cells in a JTable.
*
* @author Manivel
* @see JTable
* @see JTextArea
*/
// Column heights are placed in this Map
/**
* Creates a text area renderer.
*/
public TextAreaRenderer( ) {
setLineWrap( true ) ;
setWrapStyleWord( true ) ;
}
/**
* Returns the component used for drawing the cell. This method is
* used to configure the renderer appropriately before drawing.
*
* @param jTable3 - JTable object
* @param value - the value of the cell to be rendered.
* @param isSelected - isSelected true if the cell is to be rendered with the selection highlighted;
* otherwise false.
* @param hasFocus - if true, render cell appropriately.
* @param row - The row index of the cell being drawn.
* @param column - The column index of the cell being drawn.
* @return - Returns the component used for drawing the cell.
*/
@Override
public Component getTableCellRendererComponent
( JTable jTable3,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column
) { // set the Font, Color, etc.
renderer.getTableCellRendererComponent ( jTable3, value, isSelected, hasFocus, row, column) ;
setForeground( renderer.getForeground ( ) ) ;
setBackground( renderer.getBackground ( ) ) ;
setBorder( renderer.getBorder ( ) ) ;
setFont( renderer.getFont ( ) ) ;
setText( renderer.getText ( ) ) ;
setSize( columnModel.getColumn ( column) .getWidth ( ) , 0 ) ;
int height_wanted = ( int ) getPreferredSize( ) .getHeight ( ) ;
addSize( jTable3, row, column, height_wanted) ;
height_wanted = findTotalMaximumRowSize( jTable3, row) ;
if ( height_wanted != jTable3.getRowHeight ( row) ) {
jTable3.setRowHeight ( row, height_wanted) ;
}
return this ;
}
/**
* @param jTable3 - JTable object
* @param row - The row index of the cell being drawn.
* @param column - The column index of the cell being drawn.
* @param height - Row cell height as int value
* This method will add size to cell based on row and column number
*/
private void addSize
( JTable jTable3,
int row,
int column,
int height
) { Map
< Object , Map
< Object , Integer
>> rowsMap
= tablecellSizes.
get ( jTable3
) ; if ( rowsMap == null ) {
tablecellSizes.
put ( jTable3, rowsMap
= new HashMap
< Object , Map
< Object , Integer
>> ( ) ) ; }
Map
< Object , Integer
> rowheightsMap
= rowsMap.
get ( row
) ; if ( rowheightsMap == null ) {
rowsMap.
put ( row, rowheightsMap
= new HashMap
< Object , Integer
> ( ) ) ; }
rowheightsMap.put ( column, height) ;
}
/**
* Look through all columns and get the renderer. If it is
* also a TextAreaRenderer, we look at the maximum height in
* its hash table for this row.
*
* @param jTable3 -JTable object
* @param row - The row index of the cell being drawn.
* @return row maximum height as integer value
*/
private int findTotalMaximumRowSize
( JTable jTable3,
int row
) { int maximum_height = 0 ;
Enumeration< TableColumn> columns = jTable3.getColumnModel ( ) .getColumns ( ) ;
while ( columns.hasMoreElements ( ) ) {
if ( cellRenderer instanceof TextAreaRenderer) {
TextAreaRenderer tar = ( TextAreaRenderer) cellRenderer;
maximum_height
= Math .
max ( maximum_height,
tar.findMaximumRowSize ( jTable3, row) ) ;
}
}
return maximum_height;
}
/**
* This will find the maximum row size
*
* @param jTable3 - JTable object
* @param row - The row index of the cell being drawn.
* @return row maximum height as integer value
*/
private int findMaximumRowSize
( JTable jTable3,
int row
) { Map
< Object , Map
< Object , Integer
>> rows
= tablecellSizes.
get ( jTable3
) ; if ( rows == null ) return 0 ;
Map
< Object , Integer
> rowheights
= rows.
get ( row
) ; if ( rowheights == null ) return 0 ;
int maximum_height = 0 ;
for ( Map .
Entry < Object , Integer
> entry
: rowheights.
entrySet ( ) ) { int cellHeight = entry.getValue ( ) ;
maximum_height
= Math .
max ( maximum_height, cellHeight
) ; }
return maximum_height;
}
}
LyoKICogVG8gY2hhbmdlIHRoaXMgbGljZW5zZSBoZWFkZXIsIGNob29zZSBMaWNlbnNlIEhlYWRlcnMgaW4gUHJvamVjdCBQcm9wZXJ0aWVzLgogKiBUbyBjaGFuZ2UgdGhpcyB0ZW1wbGF0ZSBmaWxlLCBjaG9vc2UgVG9vbHMgfCBUZW1wbGF0ZXMKICogYW5kIG9wZW4gdGhlIHRlbXBsYXRlIGluIHRoZSBlZGl0b3IuCiAqLwpwYWNrYWdlIHByZXNlbnRlcjsKCmltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7IAppbXBvcnQgamF2YXguc3dpbmcuSlRleHRBcmVhOyAKaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLkRlZmF1bHRUYWJsZUNlbGxSZW5kZXJlcjsgCmltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNlbGxSZW5kZXJlcjsgCmltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNvbHVtbjsgCmltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNvbHVtbk1vZGVsOyAKaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsgCmltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247IAppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7IAppbXBvcnQgamF2YS51dGlsLk1hcDsgCiAKLyoqIAogKiBUaGUgc3RhbmRhcmQgY2xhc3MgZm9yIHJlbmRlcmluZyAoZGlzcGxheWluZykgaW5kaXZpZHVhbCBjZWxscyBpbiBhIEpUYWJsZS4gCiAqIFRoaXMgY2xhc3MgaW5oZXJpdHMgZnJvbSBKVGV4dEFyZWEsIGEgc3RhbmRhcmQgY29tcG9uZW50IGNsYXNzLiAKICogSG93ZXZlciBKVGV4dEFyZWEgaXMgYSBtdWx0aS1saW5lIGFyZWEgdGhhdCBkaXNwbGF5cyBwbGFpbiB0ZXh0LiAKICogCiAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBUYWJsZUNlbGxSZW5kZXJlciAsIGkuZS4gaW50ZXJmYWNlLiAKICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgbWV0aG9kIHJlcXVpcmVkIGJ5IGFueSBvYmplY3QgdGhhdCAKICogd291bGQgbGlrZSB0byBiZSBhIHJlbmRlcmVyIGZvciBjZWxscyBpbiBhIEpUYWJsZS4gCiAqIAogKiBAYXV0aG9yIE1hbml2ZWwgCiAqIEBzZWUgSlRhYmxlIAogKiBAc2VlIEpUZXh0QXJlYSAKICovIAogCnB1YmxpYyBjbGFzcyBUZXh0QXJlYVJlbmRlcmVyIGV4dGVuZHMgSlRleHRBcmVhIGltcGxlbWVudHMgVGFibGVDZWxsUmVuZGVyZXIgeyAKICAgIHByaXZhdGUgZmluYWwgRGVmYXVsdFRhYmxlQ2VsbFJlbmRlcmVyIHJlbmRlcmVyID0gbmV3IERlZmF1bHRUYWJsZUNlbGxSZW5kZXJlcigpOyAKIAogICAgLy8gQ29sdW1uIGhlaWdodHMgYXJlIHBsYWNlZCBpbiB0aGlzIE1hcCAKICAgIHByaXZhdGUgZmluYWwgTWFwPEpUYWJsZSwgTWFwPE9iamVjdCwgTWFwPE9iamVjdCwgSW50ZWdlcj4+PiB0YWJsZWNlbGxTaXplcyA9IG5ldyBIYXNoTWFwPEpUYWJsZSwgTWFwPE9iamVjdCwgTWFwPE9iamVjdCwgSW50ZWdlcj4+PigpOyAKIAogICAgLyoqIAogICAgICogQ3JlYXRlcyBhIHRleHQgYXJlYSByZW5kZXJlci4gCiAgICAgKi8gCiAgICBwdWJsaWMgVGV4dEFyZWFSZW5kZXJlcigpIHsgCiAgICAgICAgc2V0TGluZVdyYXAodHJ1ZSk7IAogICAgICAgIHNldFdyYXBTdHlsZVdvcmQodHJ1ZSk7IAogICAgfSAKIAogICAgLyoqIAogICAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IHVzZWQgZm9yIGRyYXdpbmcgdGhlIGNlbGwuICBUaGlzIG1ldGhvZCBpcyAKICAgICAqIHVzZWQgdG8gY29uZmlndXJlIHRoZSByZW5kZXJlciBhcHByb3ByaWF0ZWx5IGJlZm9yZSBkcmF3aW5nLiAKICAgICAqIAogICAgICogQHBhcmFtIGpUYWJsZTMgICAgICAtIEpUYWJsZSBvYmplY3QgCiAgICAgKiBAcGFyYW0gdmFsdWUgICAgICAtIHRoZSB2YWx1ZSBvZiB0aGUgY2VsbCB0byBiZSByZW5kZXJlZC4gCiAgICAgKiBAcGFyYW0gaXNTZWxlY3RlZCAtIGlzU2VsZWN0ZWQgICB0cnVlIGlmIHRoZSBjZWxsIGlzIHRvIGJlIHJlbmRlcmVkIHdpdGggdGhlIHNlbGVjdGlvbiBoaWdobGlnaHRlZDsgCiAgICAgKiAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgZmFsc2UuIAogICAgICogQHBhcmFtIGhhc0ZvY3VzICAgLSBpZiB0cnVlLCByZW5kZXIgY2VsbCBhcHByb3ByaWF0ZWx5LiAKICAgICAqIEBwYXJhbSByb3cgICAgICAgIC0gVGhlIHJvdyBpbmRleCBvZiB0aGUgY2VsbCBiZWluZyBkcmF3bi4gCiAgICAgKiBAcGFyYW0gY29sdW1uICAgICAtIFRoZSBjb2x1bW4gaW5kZXggb2YgdGhlIGNlbGwgYmVpbmcgZHJhd24uIAogICAgICogQHJldHVybiAtIFJldHVybnMgdGhlIGNvbXBvbmVudCB1c2VkIGZvciBkcmF3aW5nIHRoZSBjZWxsLiAKICAgICAqLyAKICAgIEBPdmVycmlkZQogICAgcHVibGljIENvbXBvbmVudCBnZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudChKVGFibGUgalRhYmxlMywgT2JqZWN0IHZhbHVlLCBib29sZWFuIGlzU2VsZWN0ZWQsYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgeyAKICAgICAgICAvLyBzZXQgdGhlIEZvbnQsIENvbG9yLCBldGMuIAogICAgICAgIHJlbmRlcmVyLmdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KGpUYWJsZTMsIHZhbHVlLCBpc1NlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pOyAKICAgICAgICBzZXRGb3JlZ3JvdW5kKHJlbmRlcmVyLmdldEZvcmVncm91bmQoKSk7IAogICAgICAgIHNldEJhY2tncm91bmQocmVuZGVyZXIuZ2V0QmFja2dyb3VuZCgpKTsgCiAgICAgICAgc2V0Qm9yZGVyKHJlbmRlcmVyLmdldEJvcmRlcigpKTsgCiAgICAgICAgc2V0Rm9udChyZW5kZXJlci5nZXRGb250KCkpOyAKICAgICAgICBzZXRUZXh0KHJlbmRlcmVyLmdldFRleHQoKSk7IAogCiAgICAgICAgVGFibGVDb2x1bW5Nb2RlbCBjb2x1bW5Nb2RlbCA9IGpUYWJsZTMuZ2V0Q29sdW1uTW9kZWwoKTsgCiAgICAgICAgc2V0U2l6ZShjb2x1bW5Nb2RlbC5nZXRDb2x1bW4oY29sdW1uKS5nZXRXaWR0aCgpLCAwKTsgCiAgICAgICAgaW50IGhlaWdodF93YW50ZWQgPSAoaW50KSBnZXRQcmVmZXJyZWRTaXplKCkuZ2V0SGVpZ2h0KCk7IAogICAgICAgIGFkZFNpemUoalRhYmxlMywgcm93LCBjb2x1bW4sIGhlaWdodF93YW50ZWQpOyAKICAgICAgICBoZWlnaHRfd2FudGVkID0gZmluZFRvdGFsTWF4aW11bVJvd1NpemUoalRhYmxlMywgcm93KTsgCiAgICAgICAgCiAgICAgICAgaWYgKGhlaWdodF93YW50ZWQgIT0galRhYmxlMy5nZXRSb3dIZWlnaHQocm93KSkgeyAKICAgICAgICAgICAgalRhYmxlMy5zZXRSb3dIZWlnaHQocm93LCBoZWlnaHRfd2FudGVkKTsgCiAgICAgICAgfSAKICAgICAgICByZXR1cm4gdGhpczsgCiAgICB9IAogCiAgICAvKiogCiAgICAgKiBAcGFyYW0galRhYmxlMyAgLSBKVGFibGUgb2JqZWN0IAogICAgICogQHBhcmFtIHJvdyAgICAtIFRoZSByb3cgaW5kZXggb2YgdGhlIGNlbGwgYmVpbmcgZHJhd24uIAogICAgICogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gaW5kZXggb2YgdGhlIGNlbGwgYmVpbmcgZHJhd24uIAogICAgICogQHBhcmFtIGhlaWdodCAtIFJvdyBjZWxsIGhlaWdodCBhcyBpbnQgdmFsdWUgCiAgICAgKiAgICAgICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgYWRkIHNpemUgdG8gY2VsbCBiYXNlZCBvbiByb3cgYW5kIGNvbHVtbiBudW1iZXIgCiAgICAgKi8gCiAgICBwcml2YXRlIHZvaWQgYWRkU2l6ZShKVGFibGUgalRhYmxlMywgaW50IHJvdywgaW50IGNvbHVtbiwgaW50IGhlaWdodCkgeyAKICAgICAgICBNYXA8T2JqZWN0LCBNYXA8T2JqZWN0LCBJbnRlZ2VyPj4gcm93c01hcCA9IHRhYmxlY2VsbFNpemVzLmdldChqVGFibGUzKTsgCiAgICAgICAgaWYgKHJvd3NNYXAgPT0gbnVsbCkgeyAKICAgICAgICAgICAgdGFibGVjZWxsU2l6ZXMucHV0KGpUYWJsZTMsIHJvd3NNYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE1hcDxPYmplY3QsIEludGVnZXI+PigpKTsgCiAgICAgICAgfSAKICAgICAgICBNYXA8T2JqZWN0LCBJbnRlZ2VyPiByb3doZWlnaHRzTWFwID0gcm93c01hcC5nZXQocm93KTsgCiAgICAgICAgaWYgKHJvd2hlaWdodHNNYXAgPT0gbnVsbCkgeyAKICAgICAgICAgICAgcm93c01hcC5wdXQocm93LCByb3doZWlnaHRzTWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBJbnRlZ2VyPigpKTsgCiAgICAgICAgfSAKICAgICAgICByb3doZWlnaHRzTWFwLnB1dChjb2x1bW4sIGhlaWdodCk7IAogICAgfSAKIAogICAgLyoqIAogICAgICogTG9vayB0aHJvdWdoIGFsbCBjb2x1bW5zIGFuZCBnZXQgdGhlIHJlbmRlcmVyLiAgSWYgaXQgaXMgCiAgICAgKiBhbHNvIGEgVGV4dEFyZWFSZW5kZXJlciwgd2UgbG9vayBhdCB0aGUgbWF4aW11bSBoZWlnaHQgaW4gCiAgICAgKiBpdHMgaGFzaCB0YWJsZSBmb3IgdGhpcyByb3cuIAogICAgICogCiAgICAgKiBAcGFyYW0galRhYmxlMyAtSlRhYmxlIG9iamVjdCAKICAgICAqIEBwYXJhbSByb3cgICAtIFRoZSByb3cgaW5kZXggb2YgdGhlIGNlbGwgYmVpbmcgZHJhd24uIAogICAgICogQHJldHVybiByb3cgbWF4aW11bSBoZWlnaHQgYXMgaW50ZWdlciB2YWx1ZSAKICAgICAqLyAKICAgIHByaXZhdGUgaW50IGZpbmRUb3RhbE1heGltdW1Sb3dTaXplKEpUYWJsZSBqVGFibGUzLCBpbnQgcm93KSB7IAogICAgICAgIGludCBtYXhpbXVtX2hlaWdodCA9IDA7IAogICAgICAgIEVudW1lcmF0aW9uPFRhYmxlQ29sdW1uPiBjb2x1bW5zID0galRhYmxlMy5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbnMoKTsgCiAgICAgICAgd2hpbGUgKGNvbHVtbnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsgCiAgICAgICAgICAgIFRhYmxlQ29sdW1uIHRjID0gY29sdW1ucy5uZXh0RWxlbWVudCgpOyAKICAgICAgICAgICAgVGFibGVDZWxsUmVuZGVyZXIgY2VsbFJlbmRlcmVyID0gdGMuZ2V0Q2VsbFJlbmRlcmVyKCk7IAogICAgICAgICAgICBpZiAoY2VsbFJlbmRlcmVyIGluc3RhbmNlb2YgVGV4dEFyZWFSZW5kZXJlcikgeyAKICAgICAgICAgICAgICAgIFRleHRBcmVhUmVuZGVyZXIgdGFyID0gKFRleHRBcmVhUmVuZGVyZXIpIGNlbGxSZW5kZXJlcjsgCiAgICAgICAgICAgICAgICBtYXhpbXVtX2hlaWdodCA9IE1hdGgubWF4KG1heGltdW1faGVpZ2h0LCAKICAgICAgICAgICAgICAgIHRhci5maW5kTWF4aW11bVJvd1NpemUoalRhYmxlMywgcm93KSk7IAogICAgICAgICAgICB9IAogICAgICAgIH0gCiAgICAgICAgCiAgICAgICAgcmV0dXJuIG1heGltdW1faGVpZ2h0OyAKICAgIH0gCiAKICAgIC8qKiAKICAgICAqIFRoaXMgd2lsbCBmaW5kIHRoZSBtYXhpbXVtIHJvdyBzaXplIAogICAgICogCiAgICAgKiBAcGFyYW0galRhYmxlMyAtIEpUYWJsZSBvYmplY3QgCiAgICAgKiBAcGFyYW0gcm93ICAgLSBUaGUgcm93IGluZGV4IG9mIHRoZSBjZWxsIGJlaW5nIGRyYXduLiAKICAgICAqIEByZXR1cm4gcm93IG1heGltdW0gaGVpZ2h0IGFzIGludGVnZXIgdmFsdWUgCiAgICAgKi8gCiAgICBwcml2YXRlIGludCBmaW5kTWF4aW11bVJvd1NpemUoSlRhYmxlIGpUYWJsZTMsIGludCByb3cpIHsgCiAgICAgICAgTWFwPE9iamVjdCwgTWFwPE9iamVjdCwgSW50ZWdlcj4+IHJvd3MgPSB0YWJsZWNlbGxTaXplcy5nZXQoalRhYmxlMyk7IAogICAgICAgIGlmIChyb3dzID09IG51bGwpIHJldHVybiAwOyAKICAgICAgICBNYXA8T2JqZWN0LCBJbnRlZ2VyPiByb3doZWlnaHRzID0gcm93cy5nZXQocm93KTsgCiAgICAgICAgaWYgKHJvd2hlaWdodHMgPT0gbnVsbCkgcmV0dXJuIDA7IAogICAgICAgIGludCBtYXhpbXVtX2hlaWdodCA9IDA7IAogICAgICAgIGZvciAoTWFwLkVudHJ5PE9iamVjdCwgSW50ZWdlcj4gZW50cnkgOiByb3doZWlnaHRzLmVudHJ5U2V0KCkpIHsgCiAgICAgICAgICAgIGludCBjZWxsSGVpZ2h0ID0gZW50cnkuZ2V0VmFsdWUoKTsgCiAgICAgICAgICAgIG1heGltdW1faGVpZ2h0ID0gTWF0aC5tYXgobWF4aW11bV9oZWlnaHQsIGNlbGxIZWlnaHQpOyAKICAgICAgICB9IAogICAgICAgIHJldHVybiBtYXhpbXVtX2hlaWdodDsgCiAgICB9IAp9