/*
* 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.tools;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import javax.swing.AbstractCellEditor;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.SpinnerListModel;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import org.opensourcephysics.display.CellBorder;
import org.opensourcephysics.display.Dataset;
import org.opensourcephysics.display.DrawingPanel;
import org.opensourcephysics.display.TeXParser;
import org.opensourcephysics.tools.DataToolTable.WorkingDataset;
/**
* This displays plot properties of the columns in a data tool table.
*
* @author Douglas Brown
* @version 1.0
*/
public class DataToolPropsTable extends JTable {
// static fields
final static Color LIGHT_RED = new Color(255, 153, 153);
// instance fields
DataToolTable dataTable;
PropsTableModel propsModel;
DataToolTable.LabelRenderer labelRenderer;
PropsRenderer propsRenderer;
MarkerEditor markerEditor = new MarkerEditor();
JDialog styleDialog;
Dataset markerDataset = new Dataset();
Dataset lineDataset = new Dataset();
JButton closeButton;
String[] shapeNames;
int[] shapeNumbers;
JLabel shapeLabel, sizeLabel;
JCheckBox markerVisCheckbox, lineVisCheckbox;
JButton markerColorButton, lineColorButton;
JDialog colorPopup;
JSpinner shapeSpinner, sizeSpinner;
int markerRow = 0, lineRow = 1, styleRow = 2, axisRow = 3;
boolean labelDrawn;
/**
* Constructor.
*
* @param table the datatable
*/
public DataToolPropsTable(DataToolTable table) {
dataTable = table;
propsModel = new PropsTableModel();
addMouseMotionListener(new MouseInputAdapter() {
public void mouseMoved(MouseEvent e) {
int col = columnAtPoint(e.getPoint());
int labelCol = convertColumnIndexToView(0);
int xCol = (labelCol==0) ? 1 : 0;
int row = rowAtPoint(e.getPoint());
if(col==labelCol || col==xCol || row==axisRow) {
setToolTipText(null);
}
else {
if(row==markerRow) {
setToolTipText(ToolsRes.getString("DataToolPropsTable.Markers.Tooltip")); //$NON-NLS-1$
}
else if(row==lineRow) {
setToolTipText(ToolsRes.getString("DataToolPropsTable.Lines.Tooltip")); //$NON-NLS-1$
}
else if(row==styleRow) {
setToolTipText(ToolsRes.getString("DataToolPropsTable.Style.Tooltip")); //$NON-NLS-1$
}
}
}
});
init();
}
/**
* Initializes the table.
*/
protected void init() {
dataTable.getColumnModel().addColumnModelListener(new TableColumnModelListener() {
public void columnAdded(TableColumnModelEvent e) {
/** empty block */
}
public void columnRemoved(TableColumnModelEvent e) {
/** empty block */
}
public void columnSelectionChanged(ListSelectionEvent e) {
/** empty block */
}
public void columnMarginChanged(ChangeEvent e) {
refreshTable();
}
public void columnMoved(TableColumnModelEvent e) {
refreshTable();
}
});
// set and configure table model and header
setModel(propsModel);
setGridColor(Color.blue);
setTableHeader(null); // no table header
labelRenderer = dataTable.labelRenderer;
propsRenderer = new PropsRenderer();
setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
refreshCellWidths();
}
/**
* Returns labels that describe the property rows.
*
* @return labels
*/
private String[] getPropLabels() {
return new String[] {ToolsRes.getString("DataToolPropsTable.Label.Markers"), //$NON-NLS-1$
ToolsRes.getString("DataToolPropsTable.Label.Lines"), //$NON-NLS-1$
ToolsRes.getString("DataToolPropsTable.Label.Style"), //$NON-NLS-1$
ToolsRes.getString("DataToolPropsTable.Label.Axis")}; //$NON-NLS-1$
}
/**
* Refresh the data display in this table.
*/
public void refreshTable() {
Runnable refresh = new Runnable() {
public synchronized void run() {
tableChanged(new TableModelEvent(propsModel, TableModelEvent.HEADER_ROW));
refreshCellWidths();
}
};
if(SwingUtilities.isEventDispatchThread()) {
refresh.run();
} else {
SwingUtilities.invokeLater(refresh);
}
}
public void addColumn(TableColumn aColumn) {
int modelColumn = aColumn.getModelIndex();
if(aColumn.getHeaderValue()==null) {
String columnName = getModel().getColumnName(modelColumn);
aColumn.setHeaderValue(columnName);
}
// workaround to prevent adding multiple columns with same model index
for (int i = 0; i < getColumnModel().getColumnCount(); i++) {
int index = getColumnModel().getColumn(i).getModelIndex();
if (index==modelColumn) return;
}
getColumnModel().addColumn(aColumn);
}
/**
* Refresh the cell widths in the table.
*/
public void refreshCellWidths() {
// set width of columns
if(getColumnCount()!=dataTable.getColumnCount()) {
return;
}
for(int i = 0; i<getColumnCount(); i++) {
TableColumn propColumn = getColumnModel().getColumn(i);
TableColumn dataColumn = dataTable.getColumnModel().getColumn(i);
propColumn.setMaxWidth(dataColumn.getWidth());
propColumn.setMinWidth(dataColumn.getWidth());
propColumn.setWidth(dataColumn.getWidth());
}
}
/**
* Refresh the GUI.
*/
public void refreshGUI() {
refreshLabelColumnWidth();
tableChanged(null);
refreshTable();
}
/**
* Refresh the label column width.
*/
public void refreshLabelColumnWidth() {
// set label column width
int w = 40;
String[] labels = getPropLabels();
for(int i = 0; i<labels.length; i++) {
JLabel label = new JLabel(labels[i]);
label.setFont(labelRenderer.getFont());
w = Math.max(w, label.getMinimumSize().width);
}
dataTable.setLabelColumnWidth(w+5);
}
/**
* Returns the renderer for a cell specified by row and column.
*
* @param row the row number
* @param column the column number
* @return the cell renderer
*/
public TableCellRenderer getCellRenderer(int row, int column) {
int i = dataTable.convertColumnIndexToModel(column);
if(i==0) {
return labelRenderer;
}
return propsRenderer;
}
/**
* Returns the editor for a cell specified by row and column.
*
* @param row the row number
* @param column the column number
* @return the cell editor
*/
public TableCellEditor getCellEditor(int row, int column) {
if(row==styleRow) {
return markerEditor;
}
return getDefaultEditor(Boolean.class);
}
public void setFont(Font font) {
super.setFont(font);
setRowHeight(font.getSize()+4);
if(dataTable!=null) {
refreshLabelColumnWidth();
}
}
protected JDialog getStyleDialog() {
if(styleDialog==null) {
// create style dialog
final Frame frame = JOptionPane.getFrameForComponent(dataTable);
styleDialog = new JDialog(frame, true);
closeButton = new JButton();
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
styleDialog.setVisible(false);
markerEditor.stopCellEditing();
}
});
// create shape data and action
shapeNames = new String[] {
ToolsRes.getString("Shape.Circle"), //$NON-NLS-1$
ToolsRes.getString("Shape.Square"), //$NON-NLS-1$
ToolsRes.getString("Shape.Pixel"), //$NON-NLS-1$
ToolsRes.getString("Shape.Bar"), //$NON-NLS-1$
ToolsRes.getString("Shape.Post") //$NON-NLS-1$
};
shapeNumbers = new int[] {Dataset.CIRCLE, Dataset.SQUARE, Dataset.PIXEL, Dataset.BAR, Dataset.POST};
// create shape spinner
SpinnerModel model = new SpinnerListModel(shapeNames);
shapeSpinner = new JSpinner(model) {
public Dimension getPreferredSize() {
Dimension dim = super.getPreferredSize();
dim.height = markerColorButton.getPreferredSize().height;
dim.width += 2;
return dim;
}
};
shapeSpinner.setToolTipText(ToolsRes.getString("Spinner.MarkerShape.ToolTip")); //$NON-NLS-1$
shapeSpinner.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
String shape = shapeSpinner.getValue().toString();
for(int i = 0; i<shapeNames.length; i++) {
if(shapeNames[i].equals(shape)) {
WorkingDataset working = dataTable.workingMap.get(styleDialog.getName());
if(working!=null) {
dataTable.dataToolTab.tabChanged = true;
working.setMarkerShape(shapeNumbers[i]);
markerDataset.setMarkerShape(shapeNumbers[i]);
styleDialog.repaint();
frame.repaint();
}
}
}
}
});
// create size spinner
SpinnerModel sizemodel = new SpinnerNumberModel(2, 1, 6, 1);
sizeSpinner = new JSpinner(sizemodel) {
public Dimension getPreferredSize() {
return shapeSpinner.getPreferredSize();
}
};
sizeSpinner.setToolTipText(ToolsRes.getString("Spinner.MarkerSize.ToolTip")); //$NON-NLS-1$
sizeSpinner.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
int size = ((Integer) sizeSpinner.getValue()).intValue();
WorkingDataset working = dataTable.workingMap.get(styleDialog.getName());
if(working!=null) {
dataTable.dataToolTab.tabChanged = true;
working.setMarkerSize(size);
markerDataset.setMarkerSize(size);
styleDialog.repaint();
frame.repaint();
}
}
});
// create checkboxes
markerVisCheckbox = new JCheckBox(ToolsRes.getString("DataToolPropsTable.Dialog.Checkbox.Visible")); //$NON-NLS-1$
markerVisCheckbox.setHorizontalAlignment(SwingConstants.CENTER);
markerVisCheckbox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
WorkingDataset working = dataTable.workingMap.get(styleDialog.getName());
if(working!=null) {
dataTable.dataToolTab.tabChanged(true);
working.setMarkersVisible(markerVisCheckbox.isSelected());
styleDialog.repaint();
frame.repaint();
}
}
});
lineVisCheckbox = new JCheckBox(ToolsRes.getString("DataToolPropsTable.Dialog.Checkbox.Visible")); //$NON-NLS-1$
lineVisCheckbox.setHorizontalAlignment(SwingConstants.CENTER);
lineVisCheckbox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
WorkingDataset working = dataTable.workingMap.get(styleDialog.getName());
if(working!=null) {
dataTable.dataToolTab.tabChanged(true);
working.setConnected(lineVisCheckbox.isSelected());
styleDialog.repaint();
frame.repaint();
}
}
});
// create marker and line plots
final DrawingPanel markerPlot = new DrawingPanel() {
public Dimension getPreferredSize() {
Dimension dim = markerColorButton.getPreferredSize();
dim.width -= 20;
return dim;
}
};
markerPlot.setShowCoordinates(false);
markerPlot.setBorder(BorderFactory.createEtchedBorder());
markerPlot.setBackground(Color.white);
markerPlot.setAntialiasShapeOn(true);
markerDataset.append(0, 1);
markerPlot.addDrawable(markerDataset);
// create line plot
DrawingPanel linePlot = new DrawingPanel() {
public Dimension getPreferredSize() {
return markerPlot.getPreferredSize();
}
};
linePlot.setShowCoordinates(false);
linePlot.setBorder(BorderFactory.createEtchedBorder());
linePlot.setBackground(Color.white);
linePlot.setAntialiasShapeOn(true);
lineDataset.append(-1, 1);
lineDataset.append(1, -1);
lineDataset.setMarkerShape(Dataset.NO_MARKER);
lineDataset.setConnected(true);
linePlot.addDrawable(lineDataset);
// create labels
shapeLabel = new JLabel(ToolsRes.getString("DataToolPropsTable.Dialog.Label.Shape")); //$NON-NLS-1$
sizeLabel = new JLabel(ToolsRes.getString("DataToolPropsTable.Dialog.Label.Size")); //$NON-NLS-1$
// create color chooser
final JColorChooser cc = new JColorChooser();
cc.getSelectionModel().addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
Color color = cc.getColor();
WorkingDataset working = dataTable.workingMap.get(styleDialog.getName());
if(working!=null) {
dataTable.dataToolTab.tabChanged = true;
if(colorPopup.getName().equals("marker")) { //$NON-NLS-1$
working.setColor(color, working.getLineColor());
} else {
working.setColor(working.getEdgeColor(), color);
}
markerDataset.setMarkerColor(working.getFillColor(), working.getEdgeColor());
lineDataset.setLineColor(working.getLineColor());
colorPopup.setVisible(false);
styleDialog.repaint();
frame.repaint();
}
}
});
// create color popup, action and buttons
colorPopup = new JDialog(styleDialog, true);
colorPopup.setUndecorated(true);
colorPopup.getContentPane().add(cc.getChooserPanels()[0]);
colorPopup.pack();
ActionListener colorAction = new ActionListener() {
public void actionPerformed(ActionEvent e) {
JButton b = (JButton) e.getSource();
colorPopup.setName((b==markerColorButton) ? "marker" : "line"); //$NON-NLS-1$ //$NON-NLS-2$
Point loc = b.getLocationOnScreen();
colorPopup.setLocation(loc.x, loc.y+b.getSize().height);
colorPopup.setVisible(true);
}
};
markerColorButton = new JButton(ToolsRes.getString("DataToolPropsTable.Dialog.Button.Color")); //$NON-NLS-1$
markerColorButton.addActionListener(colorAction);
lineColorButton = new JButton(ToolsRes.getString("DataToolPropsTable.Dialog.Button.Color")); //$NON-NLS-1$
lineColorButton.addActionListener(colorAction);
// assemble dialog
JPanel contentPane = new JPanel(new BorderLayout());
Box box = Box.createVerticalBox();
contentPane.add(box);
// marker properties
Box markerBox = Box.createVerticalBox();
box.add(markerBox);
markerBox.setBorder(BorderFactory.createTitledBorder(ToolsRes.getString("DataToolPropsTable.Dialog.Label.Markers"))); //$NON-NLS-1$
JPanel markerNorth = new JPanel(new GridLayout());
markerBox.add(markerNorth);
JPanel markerPlotPanel = new JPanel();
markerPlotPanel.add(markerPlot);
markerNorth.add(markerPlotPanel);
JPanel markerButtonPanel = new JPanel();
markerButtonPanel.add(markerColorButton);
markerNorth.add(markerButtonPanel);
markerNorth.add(markerVisCheckbox);
JPanel markerCenter = new JPanel(new GridLayout());
markerBox.add(markerCenter);
JPanel sizePanel = new JPanel();
sizePanel.add(sizeLabel);
sizePanel.add(sizeSpinner);
markerCenter.add(sizePanel);
JPanel shapePanel = new JPanel();
shapePanel.add(shapeLabel);
shapePanel.add(shapeSpinner);
markerCenter.add(shapePanel);
// line properties
Box lineBox = Box.createVerticalBox();
box.add(lineBox);
lineBox.setBorder(BorderFactory.createTitledBorder(ToolsRes.getString("DataToolPropsTable.Dialog.Label.Lines"))); //$NON-NLS-1$
JPanel lineNorth = new JPanel(new GridLayout());
lineBox.add(lineNorth);
JPanel linePlotPanel = new JPanel();
linePlotPanel.add(linePlot);
lineNorth.add(linePlotPanel);
JPanel lineButtonPanel = new JPanel();
lineButtonPanel.add(lineColorButton);
lineNorth.add(lineButtonPanel);
lineNorth.add(lineVisCheckbox);
// close button
JPanel buttonPanel = new JPanel();
buttonPanel.add(closeButton);
box.add(buttonPanel);
styleDialog.setContentPane(contentPane);
FontSizer.setFonts(styleDialog, FontSizer.getLevel());
styleDialog.pack();
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
int x = (dim.width-styleDialog.getWidth())/2;
Point p = this.getLocationOnScreen();
int y = Math.max(0, p.y-styleDialog.getHeight());
styleDialog.setLocation(x, y);
}
return styleDialog;
}
/**
* A class to provide model data for this table.
*/
class PropsTableModel extends AbstractTableModel {
public String getColumnName(int col) {
String name = dataTable.getColumnName(col);
if (name.endsWith(DataToolTab.SHIFTED)) {
name = name.substring(0, name.length()-DataToolTab.SHIFTED.length());
}
return name;
}
public int getRowCount() {
return 4;
}
public int getColumnCount() {
return dataTable.getModel().getColumnCount();
}
public Object getValueAt(int row, int col) {
int labelCol = dataTable.convertColumnIndexToView(0);
if(col==labelCol) {
return getPropLabels()[row];
}
int xCol = (labelCol==0) ? 1 : 0;
int yCol = (labelCol<2) ? 2 : 1;
if(row==axisRow) {
if(col==xCol) {
return ToolsRes.getString("DataToolPropsTable.Axis.Horizontal"); //$NON-NLS-1$
}
return ToolsRes.getString("DataToolPropsTable.Axis.Vertical"); //$NON-NLS-1$
}
String name = getColumnName(col);
WorkingDataset data = dataTable.workingMap.get(name);
if(data==null) {
data = dataTable.getWorkingData(name);
}
if(row==markerRow) {
if((col==yCol)&&(data!=null)) {
data.isWorkingYColumn = true;
return Boolean.TRUE;
}
if(data!=null) {
data.isWorkingYColumn = false;
}
if(col==0) {
return Boolean.FALSE;
}
return(data==null) ? Boolean.FALSE : new Boolean(data.isMarkersVisible());
}
if(row==lineRow) {
if(col==0) {
return Boolean.FALSE;
}
return(data==null) ? false : new Boolean(data.isConnected());
}
// row == styleRow
if(col==xCol) {
return null;
}
return data;
}
public boolean isCellEditable(int row, int col) {
if(row==axisRow) {
return false;
}
int labelCol = dataTable.convertColumnIndexToView(0);
int xCol = (labelCol==0) ? 1 : 0;
int yCol = (labelCol<2) ? 2 : 1;
if((col==labelCol)||(col==xCol)) {
return false;
}
if((col==yCol)&&(row==markerRow)) {
return false;
}
return true;
}
public Class<?> getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
// changes the value of a cell
public void setValueAt(Object value, int row, int col) {
if (value instanceof Boolean) {
dataTable.dataToolTab.tabChanged(true);
boolean selected = ((Boolean) value).booleanValue();
String name = getColumnName(col);
WorkingDataset working = dataTable.workingMap.get(name);
if(row==markerRow) {
working.setMarkersVisible(selected);
} else if(row==lineRow) {
working.setConnected(selected);
}
int labelCol = dataTable.convertColumnIndexToView(0);
int xCol = (labelCol==0) ? 1 : 0;
String xName = getColumnName(xCol);
if((working.getXSource()==null)||!working.getXSource().getYColumnName().equals(xName)) {
working.setXSource((dataTable.workingMap.get(xName)).getYSource());
}
firePropertyChange("display", null, name); //$NON-NLS-1$
}
}
}
/**
* A class to render checkboxes and dataset markers.
*/
class PropsRenderer implements TableCellRenderer {
JPanel panel = new JPanel(new GridLayout());
JCheckBox checkbox = new JCheckBox();
DrawingPanel plot = new DrawingPanel();
Dataset markerset = new Dataset();
Dataset lineset = new Dataset();
/**
* Constructor PropsRenderer
*/
public PropsRenderer() {
checkbox.setHorizontalAlignment(SwingConstants.CENTER);
checkbox.setBackground(Color.white);
plot.setBackground(Color.white);
plot.setAntialiasShapeOn(true);
markerset.append(0, 1);
lineset.append(-1, 2);
lineset.append(1, 0);
lineset.setMarkerShape(Dataset.NO_MARKER);
lineset.setConnected(true);
plot.addDrawable(markerset);
plot.addDrawable(lineset);
checkbox.setBackground(Color.white);
}
// Returns a component for the specified cell.
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
panel.remove(checkbox);
panel.remove(plot);
int labelCol = dataTable.convertColumnIndexToView(0);
int xCol = (labelCol==0) ? 1 : 0;
int yCol = (labelCol<2) ? 2 : 1;
Color color = (col==xCol) ? DataToolTable.xAxisColor : (col==yCol) ? DataToolTable.yAxisColor : Color.white;
panel.setBackground((row!=axisRow) ? Color.white : color);
if(value==null) {
return panel;
}
if(value instanceof String) {
Component c = getDefaultRenderer(String.class).getTableCellRendererComponent(DataToolPropsTable.this, value, false, false, 0, 0);
if(c instanceof JLabel) {
JLabel label = (JLabel) c;
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setBackground(color);
label.setBorder(new CellBorder(new Color(240, 240, 240)));
return label;
}
}
if(value instanceof WorkingDataset) {
WorkingDataset working = (WorkingDataset) value;
markerset.setMarkerColor(working.getFillColor(), working.getEdgeColor());
markerset.setMarkerSize(working.getMarkerSize());
markerset.setMarkerShape(working.markerType);
lineset.setLineColor(working.getLineColor());
Boolean markerVis = (Boolean) propsModel.getValueAt(markerRow, col);
Boolean lineVis = (Boolean) propsModel.getValueAt(lineRow, col);
plot.clear();
if(markerVis.booleanValue()) {
plot.addDrawable(markerset);
}
if(lineVis.booleanValue()) {
plot.addDrawable(lineset);
}
panel.add(plot);
}
else { // value is Boolean
if(col==xCol) {
return panel;
}
checkbox.setSelected(((Boolean) value).booleanValue());
checkbox.setEnabled(propsModel.isCellEditable(row, col));
panel.add(checkbox);
}
panel.setBorder(new CellBorder(new Color(240, 240, 240)));
return panel;
}
}
/**
* A class to edit dataset markers.
*/
class MarkerEditor extends AbstractCellEditor implements TableCellEditor {
// Gets the component to be displayed while editing.
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int col) {
JDialog dialog = getStyleDialog();
String name = getColumnName(col);
WorkingDataset working = dataTable.workingMap.get(name);
markerDataset.setMarkerColor(working.getFillColor(), working.getEdgeColor());
markerDataset.setMarkerSize(working.getMarkerSize());
markerDataset.setMarkerShape(working.markerType);
lineDataset.setLineColor(working.getLineColor());
closeButton.setText(ToolsRes.getString("Button.OK")); //$NON-NLS-1$
dialog.setName(null); // set to null to prevent changes when setting
sizeSpinner.setToolTipText(ToolsRes.getString("Spinner.MarkerSize.ToolTip")); //$NON-NLS-1$
sizeSpinner.setValue(new Integer(working.getMarkerSize()));
shapeSpinner.setToolTipText(ToolsRes.getString("Spinner.MarkerShape.ToolTip")); //$NON-NLS-1$
shapeNames = new String[] {
ToolsRes.getString("Shape.Circle"), //$NON-NLS-1$
ToolsRes.getString("Shape.Square"), //$NON-NLS-1$
ToolsRes.getString("Shape.Pixel"), //$NON-NLS-1$
ToolsRes.getString("Shape.Bar"), //$NON-NLS-1$
ToolsRes.getString("Shape.Post") //$NON-NLS-1$
};
SpinnerModel model = new SpinnerListModel(shapeNames) {
public Object getNextValue() {
Object value = super.getNextValue();
if((value==null)&&(getList().size()>0)) {
value = getList().get(0);
}
return value;
}
public Object getPreviousValue() {
Object value = super.getPreviousValue();
int n = getList().size();
if((value==null)&&(n>0)) {
value = getList().get(n-1);
}
return value;
}
};
shapeSpinner.setModel(model);
for(int i = 0; i<shapeNumbers.length; i++) {
if(shapeNumbers[i]==working.markerType) {
shapeSpinner.setValue(shapeNames[i]);
}
}
markerVisCheckbox.setSelected(working.isMarkersVisible());
markerVisCheckbox.setEnabled(!working.isWorkingYColumn);
lineVisCheckbox.setSelected(working.isConnected());
dialog.setName(name);
String var = TeXParser.removeSubscripting(name);
String title = ToolsRes.getString("DataToolPropsTable.Dialog.Title"); //$NON-NLS-1$
dialog.setTitle(title+" \""+var+"\""); //$NON-NLS-1$ //$NON-NLS-2$
dialog.pack();
// a hack to make sure spinners are displayed correctly...
Dimension dim = dialog.getSize();
dim.width += 6;
dialog.setSize(dim);
dialog.setVisible(true);
return null;
}
// Called when editing is completed.
public Object getCellEditorValue() {
return null;
}
}
}
/*
* 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
*/