newlisp/guiserver/java/TableWidget.java

414 lines
11 KiB
Java

//
// TableWidget.java
//
// Created by Unya (see http://newlispfanclub.alh.net/forum/)
// Functions for row and column removal by Ferry de Bruin (FdB)
//
//
// Copyright (C) 2016 Lutz Mueller
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.table.DefaultTableModel;
import java.util.*;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
class LineNumberTable extends JTable
{
public static final long serialVersionUID = 1L;
private JTable mainTable;
public LineNumberTable(JTable table)
{
super();
mainTable = table;
setAutoCreateColumnsFromModel( false );
setModel( mainTable.getModel() );
setSelectionModel( mainTable.getSelectionModel() );
setAutoscrolls( false );
addColumn( new TableColumn() );
getColumnModel().getColumn(0).setCellRenderer( mainTable.getTableHeader().getDefaultRenderer() );
getColumnModel().getColumn(0).setPreferredWidth(50);
setPreferredScrollableViewportSize(getPreferredSize());
}
public boolean isCellEditable(int row, int column) {
return false;
}
public int getRowCount() {
return mainTable.getRowCount() ;
}
public Object getValueAt(int row, int column) {
return new Integer(row + 1);
}
public int getRowHeight(int row) {
return mainTable.getRowHeight();
}
}
@SuppressWarnings("unchecked")
public class TableWidget extends gsObject {
JScrollPane scrollpane;
Vector columnNames ;
DefaultTableModel tableModel;
JTable mainTable ;
JTable table ;
TableColumnModel columnModel ;
int lastSelectCellRow = -1 ;
int lastSelectCellCol = -1 ;
public TableWidget(StringTokenizer params) {
id = params.nextToken() ;
action = params.nextToken() ;
columnModel = new DefaultTableColumnModel() {
public static final long serialVersionUID = 1L;
boolean first = true;
public int getRowCount() {
TableModel tm = table.getModel() ;
return tm.getRowCount() ;
}
public void addColumn(TableColumn tableColumn) {
if (first) {
tableColumn.setMaxWidth(tableColumn.getPreferredWidth());
super.addColumn(tableColumn);
tableColumn.setMaxWidth(40);
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setHorizontalAlignment(JLabel.RIGHT) ;
tableColumn.setCellRenderer(renderer) ;
first = false;
}
}
};
columnNames = makeColumns(params) ;
tableModel = new DefaultTableModel(columnNames, 0);
mainTable = new JTable(tableModel);
table = new LineNumberTable(mainTable) ;
JScrollPane jsp = new JScrollPane(mainTable);
jsp.setRowHeaderView(null) ;
jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED) ;
//jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
component = jsp ;
container = jsp ;
jcomponent = jsp ;
scrollpane = jsp ;
mainTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
mainTable.setCellSelectionEnabled(true);
mainTable.setShowGrid(true);
mainTable.setGridColor(Color.lightGray);
table.setShowGrid(true);
table.setGridColor(Color.lightGray);
// row selection change
mainTable.getSelectionModel().addListSelectionListener(new cellSelectListener());
// column selection change
mainTable.getColumnModel().getSelectionModel().addListSelectionListener(new cellSelectListener());
//mainTable.getModel().addTableModelListener(new TableChangeListener()) ;
gsObject.widgets.put(id, this);
}
private class cellSelectListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent event) {
if (event.getValueIsAdjusting()) {
// The mouse button has not yet been released
return;
}
int row = mainTable.getSelectionModel().getLeadSelectionIndex() ;
int col = mainTable.getColumnModel().getSelectionModel().getLeadSelectionIndex() ;
Object data = "===="; // base 64 for empty string
if(row < 0 || col < 0) return;
if (lastSelectCellRow == row && lastSelectCellCol == col) { return ; }
lastSelectCellRow = row ;
lastSelectCellCol = col ;
data = getCell(row, col);
if (action != null) {
String text = String.format("(%s \"%s\" %d %d (base64-dec [text]%s[/text]))",
action, id , row, col, data) ;
guiserver.out.println(text) ;
guiserver.out.flush() ;
}
}
}
/*
private class TableChangeListener implements TableModelListener {
public void tableChanged(TableModelEvent e) {
switch (e.getType()) {
case TableModelEvent.INSERT :
case TableModelEvent.UPDATE :
int tableRows = mainTable.getRowCount() ;
int tableCols = mainTable.getColumnCount() ;
if (action != null) {
String text = String.format("(%s \"%s\" %d %d )",
action, id, tableRows, tableCols) ;
guiserver.out.println(text) ;
guiserver.out.flush() ;
// debug
System.out.println("guiserver tablechanged listener " + text) ;
}
break ;
default :
break ;
}
}
}
*/
String getCell(int row, int col) {
Object value = null;
int tableRows = mainTable.getRowCount() ;
int tableCols = mainTable.getColumnCount() ;
String text ;
if (row >= 0 && col >= 0 && row < tableRows && col < tableCols)
value = mainTable.getValueAt(row, col) ;
if (value == null) value = "" ;
if (guiserver.UTF8)
text = Base64Coder.encodeStringUTF8(value.toString()) ;
else
text = Base64Coder.encodeString(value.toString()) ;
return text ;
}
// (gs:table-set-cell ID row col Value)
public void tableSetCell(StringTokenizer params) {
int row = Integer.parseInt(params.nextToken()) ;
int col = Integer.parseInt(params.nextToken()) ;
String value = Base64Coder.decodeString(params.nextToken()) ;
String oldvalue = "====";
int tableRows = mainTable.getRowCount() ;
int tableCols = mainTable.getColumnCount() ;
if (row >= 0 && col >= 0 && row < tableRows && col < tableCols)
{
oldvalue = getCell(row, col) ;
DefaultTableModel tm = (DefaultTableModel)(mainTable.getModel()) ;
tm.setValueAt(value, row, col) ;
}
String text = "(set 'gs:table-cell (base64-dec [text]" + oldvalue + "[/text]))" ;
guiserver.out.println(text) ;
guiserver.out.flush();
}
// (gs:table-get-cell ID row col)
public void tableGetCell(StringTokenizer params) {
int row = Integer.parseInt(params.nextToken()) ;
int col = Integer.parseInt(params.nextToken()) ;
String value ;
String text ;
value = getCell(row, col) ;
text = "(set 'gs:table-cell (base64-dec [text]" + value + "[/text]))" ;
guiserver.out.println(text) ;
guiserver.out.flush();
}
// (gs:table-get ID)
public void tableGetValueAll(StringTokenizer params) {
int tableRows = mainTable.getRowCount() ;
int tableCols = mainTable.getColumnCount() ;
String text = "(set 'gs:table-full '(";
for(int row = 0 ; row < tableRows ; row++) {
text += "(" ;
for(int col = 0 ; col < tableCols ; col++) {
text += "[text]" + getCell(row, col) + "[/text] " ;
}
text += ") " ;
}
text += ") )" ;
guiserver.out.println(text) ;
guiserver.out.flush();
}
// (gs:table-size ID)
public void tableGetSize(StringTokenizer params) {
String text = String.format("(set 'gs:table-size '(%d %d))"
, mainTable.getRowCount()
, mainTable.getColumnCount()) ;
guiserver.out.println(text) ;
guiserver.out.flush();
}
// (gs:table-add-row ID)
// (gs:table-add-row ID ColumnValue0 ColumnValue1 ...)
public void tableAddRow(StringTokenizer params) {
Vector v = params2vector(params) ;
DefaultTableModel tm = (DefaultTableModel)(mainTable.getModel()) ;
tm.addRow(v) ;
}
//FdB
// (gs:table-remove-row ID row)
public void tableRemoveRow(StringTokenizer params) {
int row = Integer.parseInt(params.nextToken()) ;
DefaultTableModel tm = (DefaultTableModel)(mainTable.getModel()) ;
tm.removeRow(row) ;
}
//FdB
// (gs:table-set-row-count ID row)
public void tableSetRowCount(StringTokenizer params) {
int count = Integer.parseInt(params.nextToken()) ;
DefaultTableModel tm = (DefaultTableModel)(mainTable.getModel()) ;
tm.setRowCount(count) ;
}
//FdB
// (gs:table-set-column-name ID)
// (gs:table-set-column-name ID ColumnName ColumnName ...)
public void tableSetColumnIdentifiers(StringTokenizer params) {
Vector v = params2vector(params) ;
DefaultTableModel tm = (DefaultTableModel)(mainTable.getModel()) ;
tm.setColumnIdentifiers(v) ;
}
// (gs:table-add-column ID)
// (gs:table-add-column ID ColumnName0 ColumnName1 ...)
public void tableAddColumn(StringTokenizer params) {
while(params.hasMoreTokens()) {
String token = params.nextToken() ;
String name ;
if (guiserver.UTF8)
name = Base64Coder.decodeStringUTF8(token) ;
else
name = Base64Coder.decodeString(token) ;
// outcommented for 10.5.7 GS v.1.51, allows to do headerless tables
// if (name.length() == 0)
// name = String.format("%d", mainTable.getColumnCount() + 1) ;
DefaultTableModel tm = (DefaultTableModel)(mainTable.getModel()) ;
tm.addColumn(name);
}
}
// (gs:table-column ID ColumnNumber Width)
// (gs:table-column ID ColumnNumber Width Justification)
// Justification : "left"(default) "center" "right"
public void tableSetColumn(StringTokenizer params) {
int colNumber = Integer.parseInt(params.nextToken()) ;
int colWidth = Integer.parseInt(params.nextToken()) ;
mainTable.getColumnModel().getColumn(colNumber).setPreferredWidth(colWidth) ;
if (params.hasMoreTokens()) {
String strJust = params.nextToken() ;
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
if (strJust.equals("center"))
renderer.setHorizontalAlignment(JLabel.CENTER) ;
else if (strJust.equals("right"))
renderer.setHorizontalAlignment(JLabel.RIGHT) ;
else
renderer.setHorizontalAlignment(JLabel.LEFT) ;
mainTable.getColumnModel().getColumn(colNumber).setCellRenderer(renderer) ;
}
}
public void tableShowRowNumber(StringTokenizer params) {
boolean bHeader = params.nextToken().equals("true") ;
if (bHeader)
scrollpane.setRowHeaderView(table) ;
else
scrollpane.setRowHeaderView(null) ;
/*
boolean bScrollbar = params.nextToken().equals("true") ;
if (bScrollbar)
scrollpane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED) ;
else
scrollpane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER) ;
*/
}
Vector makeColumns(StringTokenizer params) {
Vector v = params2vector(params) ;
if (v.isEmpty())
v.add("column 0") ;
return v ;
}
Vector params2vector(StringTokenizer params) {
Vector v = new Vector() ;
while(params.hasMoreTokens()) {
String token = params.nextToken() ;
String value ;
if (guiserver.UTF8)
value = Base64Coder.decodeStringUTF8(token) ;
else
value = Base64Coder.decodeString(token) ;
v.add(value) ;
}
return v ;
}
}
// eof