package org.geogebra.desktop.gui.view.functioninspector;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Point;
import java.util.HashSet;
import javax.swing.BorderFactory;
import javax.swing.DefaultCellEditor;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JViewport;
import javax.swing.border.Border;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import org.geogebra.common.main.GeoGebraColorConstants;
import org.geogebra.desktop.awt.GColorD;
import org.geogebra.desktop.gui.inputfield.MyTextFieldD;
import org.geogebra.desktop.main.AppD;
public class InspectorTable extends JTable {
private static final long serialVersionUID = 1L;
AppD app;
FunctionInspectorD inspector;
boolean doRedNegative = false;
HashSet<Point> editableCell;
public static final int TYPE_INTERVAL = 0;
public static final int TYPE_XY = 1;
int tableType;
public InspectorTable(AppD app, FunctionInspectorD inspector, int minRows,
int tableType) {
super(minRows, 2);
this.app = app;
this.inspector = inspector;
this.tableType = tableType;
// set visual appearance
setShowGrid(true);
setGridColor(
GColorD.getAwtColor(GeoGebraColorConstants.TABLE_GRID_COLOR));
// setSelectionBackground(new Color(255, 130, 171));
setSelectionBackground(
GColorD.getAwtColor(GeoGebraColorConstants.PINK));
setBorder(BorderFactory.createEmptyBorder());
// set resizing fields
setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
setPreferredScrollableViewportSize(this.getPreferredSize());
// this.addKeyListener(this);
// set renderer and editor
setDefaultRenderer(Object.class, new MyCellRenderer(this));
setDefaultEditor(Object.class, new MyEditor());
editableCell = new HashSet<Point>();
}
public boolean isDoRedNegative() {
return doRedNegative;
}
public void setDoRedNegative(boolean doRedNegative) {
this.doRedNegative = doRedNegative;
}
public void setCellEditable(int rowIndex, int colIndex) {
if (rowIndex == -1 && colIndex == -1) {
editableCell.clear();
} else {
editableCell.add(new Point(rowIndex, colIndex));
}
}
// control cell editing
@Override
public boolean isCellEditable(int rowIndex, int colIndex) {
return editableCell.contains(new Point(rowIndex, colIndex));
}
// fill empty scroll pane space with table background color
@Override
protected void configureEnclosingScrollPane() {
super.configureEnclosingScrollPane();
Container p = getParent();
if (p instanceof JViewport) {
((JViewport) p).setBackground(getBackground());
}
}
public void setColumnWidths() {
setColumnWidths(this);
}
private void setColumnWidths(JTable table) {
int w;
for (int i = 0; i < getColumnCount(); ++i) {
w = getMaxColumnWidth(table, i) + 5;
table.getColumnModel().getColumn(i).setPreferredWidth(w);
}
int gap = table.getParent().getPreferredSize().width
- table.getPreferredSize().width;
// System.out.println(table.getParent().getPreferredSize().width);
if (gap > 0) {
w = table.getColumnCount() - 1;
int newWidth = gap + table.getColumnModel()
.getColumn(table.getColumnCount() - 1).getWidth();
table.getColumnModel().getColumn(w).setPreferredWidth(newWidth);
}
}
/**
* Finds the maximum preferred width of a column.
*/
public int getMaxColumnWidth(JTable table, int column) {
TableColumn tableColumn = table.getColumnModel().getColumn(column);
// iterate through the rows and find the preferred width
int maxPrefWidth = tableColumn.getPreferredWidth();
int colPrefWidth = 0;
for (int row = 0; row < table.getRowCount(); row++) {
if (table.getValueAt(row, column) != null) {
colPrefWidth = (int) table.getCellRenderer(row, column)
.getTableCellRendererComponent(table,
table.getValueAt(row, column), false, false,
row, column)
.getPreferredSize().getWidth();
maxPrefWidth = Math.max(maxPrefWidth, colPrefWidth);
}
}
return maxPrefWidth + table.getIntercellSpacing().width;
}
public void setMyCellEditor(int colIndex) {
getColumnModel().getColumn(colIndex).setCellEditor(new MyEditor());
}
// ====================================================
// Cell Renderer
// ====================================================
private class MyCellRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
private JTextField tf;
private Border editCellBorder;
private JTable table;
private Border paddingBorder;
private boolean doRedNegative;
private MyCellRenderer(InspectorTable table) {
this.table = table;
tf = new JTextField();
http: // dev.geogebra.org/trac/ticket/4316#
this.doRedNegative = table.isDoRedNegative();
paddingBorder = BorderFactory.createEmptyBorder(2, 2, 2, 2);
// paddingBorder =
// BorderFactory.createMatteBorder(3,3,3,3,Color.RED);
editCellBorder = BorderFactory.createCompoundBorder(tf.getBorder(),
paddingBorder);
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
final int row, int column) {
setFont(app.getPlainFont());
if (table.isCellEditable(row, column)) {
setBorder(editCellBorder);
} else {
setBorder(paddingBorder);
}
if (isSelected && !table.isCellEditable(row, column)) {
setBackground(table.getSelectionBackground());
// setForeground(table.getSelectionForeground());
setForeground(Color.RED);
} else {
setBackground(rowColor(row));
setForeground(getForeground());
}
setForeground(Color.black);
if (value != null) {
try {
double val = Double.parseDouble((String) value);
if (val < 0 && doRedNegative) {
setForeground(Color.red);
}
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
}
}
setText((String) value);
return this;
}
// shade alternate rows
private Color rowColor(int row) {
Color c;
// if (row % 2 == 0)
// c = EVEN_ROW_COLOR;
// else
c = table.getBackground();
return c;
}
}
// ====================================================
// Cell Editor
// ====================================================
private class MyEditor extends DefaultCellEditor {
private static final long serialVersionUID = 1L;
public MyEditor() {
super(new MyTextFieldD(app));
this.setClickCountToStart(1);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
JTextField editor = (JTextField) super.getTableCellEditorComponent(
table, value, isSelected, row, column);
editor.setForeground(Color.RED);
editor.setFont(app.getPlainFont());
return editor;
}
@Override
public boolean stopCellEditing() {
boolean isStopped = super.stopCellEditing();
try {
if (isStopped) {
double val = Double
.parseDouble((String) this.getCellEditorValue());
// change
inspector.changeStart(val);
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
return isStopped;
}
}
}