package com.revolsys.swing.map.form; import java.awt.BorderLayout; import java.awt.Color; import java.lang.ref.Reference; import java.lang.ref.WeakReference; import javax.swing.BorderFactory; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import com.revolsys.geometry.model.Geometry; import com.revolsys.swing.component.ValueField; import com.revolsys.swing.table.BaseJTable; import com.revolsys.swing.table.TablePanel; import com.revolsys.swing.table.editor.BaseTableCellEditor; import com.revolsys.swing.table.geometry.GeometryCoordinatesTableModel; import com.revolsys.swing.table.renderer.BaseTableCellRenderer; import com.revolsys.util.Property; public class GeometryCoordinatesPanel extends ValueField implements TableModelListener { private static final long serialVersionUID = 1L; final BaseTableCellEditor cellEditor; final TableCellRenderer cellRenderer = new BaseTableCellRenderer(); private final Reference<LayerRecordForm> form; private final GeometryCoordinatesTableModel model = new GeometryCoordinatesTableModel(this); private final BaseJTable table; private final TablePanel tablePanel; public GeometryCoordinatesPanel(final LayerRecordForm form, final String fieldName) { super(new BorderLayout(), fieldName, null); setLayout(new BorderLayout()); this.form = new WeakReference<>(form); this.model.addTableModelListener(this); Property.addListener(this.model, form); this.model.setForm(form); this.table = new BaseJTable(this.model); this.table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); this.cellEditor = new BaseTableCellEditor(this.table); tableChanged(null); this.tablePanel = new TablePanel(this.table); GeometryCoordinateErrorPredicate.add(this.table); add(this.tablePanel, BorderLayout.WEST); } public LayerRecordForm getForm() { return this.form.get(); } public BaseJTable getTable() { return this.table; } public TablePanel getTablePanel() { return this.tablePanel; } @Override public void setFieldInvalid(final String message, final Color foregroundColor, final Color backgroundColor) { super.setFieldInvalid(message, foregroundColor, backgroundColor); setForeground(null); setBackground(null); this.tablePanel.setBorder(BorderFactory.createLineBorder(foregroundColor, 3)); } @Override public void setFieldValid() { this.tablePanel.setBorder(null); super.setFieldValid(); } @Override public boolean setFieldValue(final Object value) { if (value instanceof Geometry) { final Geometry geometry = (Geometry)value; this.model.setGeometry(geometry); final TableColumnModel columnModel = this.table.getColumnModel(); for (int columnIndex = 0; columnIndex < this.model.getColumnCount(); columnIndex++) { final TableColumn column = columnModel.getColumn(columnIndex); column.setCellEditor(this.cellEditor); column.setCellRenderer(this.cellRenderer); } } return super.setFieldValue(value); } @Override public void tableChanged(final TableModelEvent e) { for (int columnIndex = 0; columnIndex < this.model.getColumnCount(); columnIndex++) { int width; final TableColumn column = this.table.getColumn(columnIndex); if (columnIndex < this.model.getNumIndexItems()) { width = (int)Math.ceil(Math.log10(this.model.getRowCount())) * 20; if (columnIndex < this.model.getNumIndexItems() - 1) { } else { width += 20; } width = Math.max(50, width); column.setCellRenderer(this.cellRenderer); } else { width = 120; column.setCellEditor(this.cellEditor); column.setCellRenderer(this.cellRenderer); } this.table.setColumnWidth(columnIndex, width); } } }