/*
* Open Source Physics software is free software as described near the bottom of this code file.
*
* For additional information and documentation on Open Source Physics please see:
* <http://www.opensourcephysics.org/>
*/
package org.opensourcephysics.display;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
/**
* TableFrame displays a DataTable with a scroll pane in a frame.
*
* @author Joshua Gould
* @author Wolfgang Christian
* @created August 16, 2002
* @version 1.0
*/
public class DataTableFrame extends OSPFrame {
protected JMenuBar menuBar;
protected JMenu fileMenu;
protected JMenu editMenu;
protected JMenuItem saveAsItem;
protected DataTable table;
/**
* TableFrame Constructor
*
* @param table Description of the Parameter
*/
public DataTableFrame(DataTable table) {
this(DisplayRes.getString("DataTableFrame.DefaultTitle"), table); //$NON-NLS-1$
}
/**
* TableFrame Constructor
*
* @param title
* @param _table Description of the Parameter
*/
public DataTableFrame(String title, DataTable _table) {
super(title);
table = _table;
JScrollPane scrollPane = new JScrollPane(table);
Container c = getContentPane();
c.add(scrollPane, BorderLayout.CENTER);
// table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
pack();
// setVisible(true);
if(!OSPRuntime.appletMode) {
createMenuBar();
loadDisplayMenu();
}
}
/**
* Adds a Display menu to the menu bar.
*/
protected JMenu loadDisplayMenu() {
JMenuBar menuBar = getJMenuBar();
if(menuBar==null) {
return null;
}
JMenu displayMenu = new JMenu();
displayMenu.setText(DisplayRes.getString("DataTableFrame.Display_menu_title")); //$NON-NLS-1$
menuBar.add(displayMenu);
JMenuItem setFontItem = new JMenuItem(DisplayRes.getString("DataTableFrame.NumberFormat_menu_item_title")); //$NON-NLS-1$
setFontItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setNumberFormat();
}
});
displayMenu.add(setFontItem);
return displayMenu;
}
private void createMenuBar() {
menuBar = new JMenuBar();
setJMenuBar(menuBar);
fileMenu = new JMenu(DisplayRes.getString("DataTableFrame.File_menu_item_title")); //$NON-NLS-1$
editMenu = new JMenu(DisplayRes.getString("DataTableFrame.Edit_menu_item_title")); //$NON-NLS-1$
menuBar.add(fileMenu);
menuBar.add(editMenu);
JMenuItem saveAsItem = new JMenuItem(DisplayRes.getString("DataTableFrame.SaveAs_menu_item_title")); //$NON-NLS-1$
JMenuItem copyItem = new JMenuItem(DisplayRes.getString("DataTableFrame.Copy_menu_item_title")); //$NON-NLS-1$
JMenuItem selectAlItem = new JMenuItem(DisplayRes.getString("DataTableFrame.SelectAll_menu_item_title")); //$NON-NLS-1$
fileMenu.add(saveAsItem);
editMenu.add(copyItem);
editMenu.add(selectAlItem);
copyItem.setAccelerator(KeyStroke.getKeyStroke('C', DrawingFrame.MENU_SHORTCUT_KEY_MASK));
copyItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
copy();
}
});
selectAlItem.setAccelerator(KeyStroke.getKeyStroke('A', DrawingFrame.MENU_SHORTCUT_KEY_MASK));
selectAlItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
table.selectAll();
}
});
saveAsItem.setAccelerator(KeyStroke.getKeyStroke('S', DrawingFrame.MENU_SHORTCUT_KEY_MASK));
saveAsItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveAs();
}
});
validate();
}
void setNumberFormat() {
int digits = table.getMaximumFractionDigits();
String str = JOptionPane.showInputDialog(this, DisplayRes.getString("DataTableFrame.NumberOfDigits_option_pane_title"), ""+digits); //$NON-NLS-1$ //$NON-NLS-2$
if(str==null) {
return;
}
digits = Integer.parseInt(str);
digits = Math.max(digits, 1);
table.setMaximumFractionDigits(Math.min(digits, 16));
table.refreshTable();
}
/** Copies the data in the table to the system clipboard */
public void copy() {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
int[] selectedRows = table.getSelectedRows();
int[] selectedColumns = table.getSelectedColumns();
StringBuffer buf = getSelectedData(selectedRows, selectedColumns);
StringSelection stringSelection = new StringSelection(buf.toString());
clipboard.setContents(stringSelection, stringSelection);
}
/**
* Refresh the data in the DataTable, as well as other changes to the table,
* such as row number visibility. Changes to the TableModels displayed in the
* table will not be visible until this method is called.
*/
public void refreshTable() {
table.refreshTable();
}
/**
* Gets the data selected by the user in the table.
*
* @param selectedRows Description of the Parameter
* @param selectedColumns Description of the Parameter
* @return the selected data.
*/
public StringBuffer getSelectedData(int[] selectedRows, int[] selectedColumns) {
StringBuffer buf = new StringBuffer();
for(int i = 0; i<selectedRows.length; i++) {
for(int j = 0; j<selectedColumns.length; j++) {
int row = i;
int temp = table.convertColumnIndexToModel(selectedColumns[j]);
if(table.isRowNumberVisible()) {
if(temp==0) {
continue;
}
}
Object value = table.getValueAt(row, selectedColumns[j]); // column converted to model
if(value!=null) {
buf.append(value);
}
buf.append("\t"); //$NON-NLS-1$
}
buf.append("\n"); //$NON-NLS-1$
}
return buf;
}
/**
* Sorts the table using the given column.
* @param col int
*/
public void sort(int col) {
table.sort(col);
}
/**
* Pops open a save file dialog to save the data in this table to a file.
*/
public void saveAs() {
File file = GUIUtils.showSaveDialog(this);
if(file==null) {
return;
}
int firstRow = 0;
int lastRow = table.getRowCount()-1;
int lastColumn = table.getColumnCount()-1;
int firstColumn = 0;
if(table.isRowNumberVisible()) {
firstColumn++;
}
int[] selectedRows = new int[lastRow+1];
int[] selectedColumns = new int[lastColumn+1];
for(int i = firstRow; i<=lastRow; i++) {
selectedRows[i] = i;
}
for(int i = firstColumn; i<=lastColumn; i++) {
selectedColumns[i] = i;
}
try {
FileWriter fw = new FileWriter(file);
PrintWriter pw = new PrintWriter(fw);
pw.print(getSelectedData(selectedRows, selectedColumns));
pw.close();
} catch(IOException e) {
JOptionPane.showMessageDialog(this, DisplayRes.getString("DataTableFrame.SaveErrorMessage"), DisplayRes.getString("DataTableFrame.Error"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
/*
* Open Source Physics software is free software; you can redistribute
* it and/or modify it under the terms of the GNU General Public License (GPL) as
* published by the Free Software Foundation; either version 2 of the License,
* or(at your option) any later version.
* Code that uses any portion of the code in the org.opensourcephysics package
* or any subpackage (subdirectory) of this package must must also be be released
* under the GNU GPL license.
*
* This software 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; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA
* or view the license online at http://www.gnu.org/copyleft/gpl.html
*
* Copyright (c) 2007 The Open Source Physics project
* http://www.opensourcephysics.org
*/