/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cli_fmw.utils.sorted_table;
import cli_fmw.delegate.directory.DirectoryItemRO;
import cli_fmw.main.ClipsException;
import cli_fmw.utils.ConfigGui;
import cli_fmw.utils.ErrorValue;
import cli_fmw.utils.MessageBox;
import cli_fmw.utils.sorted_table.renderer.SortedErrorRenderer;
import cli_fmw.utils.sorted_table.renderer.simple.BooleanRenderer;
import cli_fmw.utils.sorted_table.renderer.simple.CollectionRenderer;
import cli_fmw.utils.sorted_table.renderer.simple.DateRenderer;
import cli_fmw.utils.sorted_table.renderer.simple.DefaultRenderer;
import cli_fmw.utils.sorted_table.renderer.simple.DoubleRenderer;
import cli_fmw.utils.sorted_table.renderer.simple.IconRenderer;
import cli_fmw.utils.sorted_table.renderer.simple.NumberRenderer;
import cli_fmw.utils.table_config_states.StateAttachable;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.Vector;
import javax.swing.DefaultCellEditor;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.RowSorter;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
/**
*
* @author petr
*/
public class SortedTable extends JTable implements StateAttachable {
private static DefaultRenderer defaultRenderer = new DefaultRenderer();
private static NumberRenderer numberRenderer = new NumberRenderer();
private static DoubleRenderer doubleRenderer = new DoubleRenderer();
private static DateRenderer dateRenderer = new DateRenderer();
private static IconRenderer iconRenderer = new IconRenderer();
private static BooleanRenderer booleanRenderer = new BooleanRenderer();
private static CollectionRenderer collectionRenderer = new CollectionRenderer();
private Defaultlistener defaultlistener = new Defaultlistener();
// private RowSorter<TableModel> defaultRowSorter;
private class Defaultlistener extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() < 2) {
int col = SortedTable.this.columnAtPoint(e.getPoint());
int row = SortedTable.this.rowAtPoint(e.getPoint());
// System.err.print("CLICK ON SORTED TABLE point:" + e.getPoint() + " cell: [" + col
// + "," + row +"]" +
// " value: ");
Object value = SortedTable.this.getValueAt(row, col);
// System.err.println(value);
// System.err.println("CLICK ON SORTED TABLE colCount: " + SortedTable.this.getColumnCount() + " rowCount: " + SortedTable.this.getRowCount());
if (value != null && value instanceof ErrorValue) {
MessageBox.showException(((ErrorValue) value).getException());
}
}
}
}
private static class DefaultEditor extends DefaultCellEditor {
public DefaultEditor() {
super(new JTextField());
delegate = new EditorDelegate() {
@Override
public void setValue(Object value) {
if (value instanceof DirectoryItemRO) {
((JTextField) editorComponent).setText((value != null) ? ((DirectoryItemRO) value).getTitle() : "");
} else {
((JTextField) editorComponent).setText((value != null) ? value.toString() : "");
}
}
@Override
public Object getCellEditorValue() {
return ((JTextField) editorComponent).getText();
}
};
}
}
private static DefaultEditor editor = new DefaultEditor();
public SortedTable(Object[][] rowData, Object[] columnNames) {
super(rowData, columnNames);
initExtensionComponents();
}
public SortedTable(Vector rowData, Vector columnNames) {
super(rowData, columnNames);
initExtensionComponents();
}
public SortedTable(int numRows, int numColumns) {
super(numRows, numColumns);
initExtensionComponents();
}
public SortedTable(TableModel dm, TableColumnModel cm) {
super(dm, cm);
initExtensionComponents();
}
public SortedTable(TableModel dm) {
super(dm);
initExtensionComponents();
}
public SortedTable() {
super();
initExtensionComponents();
}
public SortedTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) {
super(dm, cm, sm);
initExtensionComponents();
}
private void initExtensionComponents() {
initDefaultProperties();
initRenderer();
initSorter();
this.addMouseListener(defaultlistener);//+mouseListener
}
/**
* Дефолтный рендерер
*/
private void initRenderer() {
this.setDefaultRenderer(Object.class, defaultRenderer);
this.setDefaultRenderer(Number.class, numberRenderer);
this.setDefaultRenderer(Float.class, doubleRenderer);
this.setDefaultRenderer(Double.class, doubleRenderer);
this.setDefaultRenderer(Date.class, dateRenderer);
this.setDefaultRenderer(Icon.class, iconRenderer);
this.setDefaultRenderer(ImageIcon.class, iconRenderer);
this.setDefaultRenderer(Boolean.class, booleanRenderer);
this.setDefaultRenderer(Collection.class, collectionRenderer);
this.setDefaultRenderer(List.class, collectionRenderer);
this.setDefaultRenderer(Set.class, collectionRenderer);
this.setDefaultEditor(Object.class, editor);
}
/**
* Дефолтный сортировщик
*/
private void initSorter() {
this.setRowSorter(new TableRowSorter(this.dataModel));
}
/**
* Дефолтные свойства
*/
private void initDefaultProperties() {
this.setShowGrid(true);
this.setShowHorizontalLines(false);
this.setRowMargin(0);
//this.getTableHeader().setReorderingAllowed(false);
}
@Override
public int getEditingRow() {
int er = super.getEditingRow();
return er;
}
/**
* Can be used but return selected row "as see" (not row in model), and this data can be
* incorrect and need converting to model row
* @return
* @see RowSorter
* @deprecated
*/
@Deprecated
@Override
public int getSelectedRow() {
return super.getSelectedRow();
}
/**
* Can be used but return selected rows "as see" (not rows in model), and this data can be
* incorrect and need converting to model row
* @return
* @see RowSorter
* @deprecated
*/
@Deprecated
@Override
public int[] getSelectedRows() {
return super.getSelectedRows();
}
@Override
public Object getValueAt(int row, int column) {
// System.err.print("GET VALUE AT in SORTED TABLE cell: [" + column
// + "," + row +"]");
Object value = super.getValueAt(row, column);
// System.err.println(" value: " + value);
return value;
}
@Override
public void setModel(TableModel dataModel) {
super.setModel(dataModel);
initSorter();
}
/**
* Convert number of selection row to model.
* If selected nothing return -1
* @return
*/
public int getSelectedRowSorted() {
int row = super.getSelectedRow();
if (row < 0 || row >= super.getRowCount()) {
return row;
}
RowSorter<? extends TableModel> rowSorter = this.getRowSorter();
// System.err.print("getSelectedRow, Sorted table, row: " + row);
if (rowSorter != null) {
row = rowSorter.convertRowIndexToModel(row);
}
// System.err.println(" --> " + row);
return row;
}
/**
* Convert numbers of selection rows to model.
* Numbers sorted from min to max
* @return
*/
public int[] getSelectedRowsSorted() {
int[] selectedRows = super.getSelectedRows();
RowSorter<? extends TableModel> rowSorter = this.getRowSorter();
// System.err.println("===getSelectedRows, Sorted table===");
if (rowSorter != null) {
for (int i = 0; i < selectedRows.length; i++) {
// System.err.print("Row: " + selectedRows[i]);
selectedRows[i] = rowSorter.convertRowIndexToModel(selectedRows[i]);
// System.err.println(" --> " + selectedRows[i]);
}
}
// System.err.println("==================");
Arrays.sort(selectedRows);
return selectedRows;
}
@Override
public SortedErrorRenderer getCellRenderer(int row, int column) {
return (SortedErrorRenderer) super.getCellRenderer(row, column);
}
@Override
public Rectangle getCellRect(int row, int column, boolean includeSpacing) {
Rectangle cellRect = super.getCellRect(row, column, includeSpacing);
// if (row == this.getRowCount()-1){
// cellRect.setSize(cellRect.width, cellRect.height+1);
// }
// System.err.println("CELL RECT w: " + cellRect.width + " h: " + cellRect.height);
return cellRect;
}
@Override
public void paint(Graphics g) {
if (!attached) {
attached = true;
if (ConfigGui.isLoaded()) {
MessageBox.asyncShowExceptionOnly(new ClipsException(
"Таблица " + getClass().getName() + " не прикреплена к хранителю состояний, чтобы прикрепить " +
"таблицу, вызовете StateSaver.attachTo(this) последней " +
"строкой конструктора контенера"), false);
}
}
//super.paint(g);
super.paint(g);
int height = this.getHeight();
int width = this.getWidth();
g.setColor(gridColor);
g.drawLine(0, height - 1, width, height - 1);
}
@Override
public void setSelectionMode(int selectionMode) {
super.setSelectionMode(selectionMode);
}
private boolean attached;
@Override
public boolean isAttached() {
return attached;
}
@Override
public void setAttached(boolean attached) {
this.attached = attached;
}
}