/*
GeoGebra - Dynamic Mathematics for Everyone
http://www.geogebra.org
This file is part of GeoGebra.
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.
*/
package org.geogebra.desktop.gui.view.spreadsheet;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.geogebra.common.euclidian.EuclidianConstants;
import org.geogebra.common.gui.view.spreadsheet.CellRange;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoElement.TraceModesEnum;
import org.geogebra.common.kernel.geos.GeoElementSpreadsheet;
import org.geogebra.common.main.GeoElementSelectionListener;
import org.geogebra.common.main.SpreadsheetTraceManager;
import org.geogebra.common.util.SpreadsheetTraceSettings;
import org.geogebra.desktop.gui.inputfield.MyTextFieldD;
import org.geogebra.desktop.main.AppD;
import org.geogebra.desktop.main.LocalizationD;
import org.geogebra.desktop.util.GuiResourcesD;
/**
* Dialog to add/remove/edit spreadsheet traces
*
* @author G. Sturr, 2010-5-14
*
*
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public class TraceDialog extends javax.swing.JDialog
implements GeoElementSelectionListener, ActionListener, FocusListener,
ListSelectionListener, WindowListener
{
private static final long serialVersionUID = 1L;
// external components
private final AppD app;
private SpreadsheetViewD view;
private SpreadsheetTraceManager traceManager;
private GeoElement geo;
// JList to display trace geos
private JList traceGeoList;
private DefaultListModel traceGeoListModel;
// other GUI objects
private JSplitPane splitPane;
private JPanel tabbedPane;
private JPanel optionsPanel, listPanel, promptPanel, buttonPanel,
leftButtonPanel;
private JTextField firstRowField, numRowsField;
private JCheckBox cbResetColumns, cbRowLimit, cbShowLabel, cbTraceList;
private JRadioButton traceModeValues, traceModeCopy;
private TitledBorder traceModeTitle, locationTitle, optionsTitle;
private JButton btRemove, btAdd, btClose, btCancel, btErase;
private JLabel prompt;
// modes
private static final int MODE_NORMAL = 0;
private static final int MODE_ADD = 1;
private static final int MODE_LOCATE = 2;
private int mode = MODE_NORMAL;
// misc
private CellRange newTraceLocation;
private boolean isIniting = false;
private JLabel lblStartRow;
private final LocalizationD loc;
/**
* Constructor
*
* @param app
* application
* @param selectedGeo
* selected geo
* @param traceCell
* trce range
*/
public TraceDialog(AppD app, GeoElement selectedGeo, CellRange traceCell) {
super(app.getFrame());
this.app = app;
this.loc = app.getLocalization();
this.view = (SpreadsheetViewD) app.getGuiManager().getSpreadsheetView();
geo = selectedGeo;
traceManager = app.getTraceManager();
traceGeoList = new JList();
initGUI();
setTraceDialogSelection(selectedGeo, traceCell);
updateGUI();
setLabels();
}
// ======================================================
// Initialize
// ======================================================
/**
* Sets the intial selection of a trace geo and handles these different
* calling contexts:
*
* 1) Spreadsheet context menu. This passes either a currently tracing geo,
* or just a cell location. In this case the user must be prompted for a geo
* to trace.
*
* 2) Euclidian or algebra view context menu. This passes either a currently
* tracing geo, or just a geo. In this case the geo is automatically
* assigned a trace location.
*
* 3) Toolbar button. A button click loads the dialog without any selection.
*
* @param selectedGeo0
* selected geo
* @param traceCell
* trace range
*
*/
public void setTraceDialogSelection(GeoElement selectedGeo0,
CellRange traceCell) {
GeoElement selectedGeo = selectedGeo0;
// if the traceCell column is tracing a geo then set selectedGeo to this
// geo
if (traceCell != null
&& traceManager.isTraceColumn(traceCell.getMinColumn())) {
selectedGeo = traceManager.getTraceGeo(traceCell.getMinColumn());
} else {
if (selectedGeo == null) { // case dialog is called from stylebar
selectedGeo = traceManager.getFirstTraceGeo();
}
}
// selectedGeo exists
if (selectedGeo != null) {
setMode(MODE_NORMAL);
// if selectedGeo is not a trace geo then add it to the trace
// collection
if (!traceManager.isTraceGeo(selectedGeo)) {
// create default trace settings
// TraceSettings t = new TraceSettings();
SpreadsheetTraceSettings t = selectedGeo.getTraceSettings();
if (traceCell != null) {
t.traceColumn1 = traceCell.getMinColumn();
t.traceRow1 = traceCell.getMinRow();
}
traceManager.addSpreadsheetTraceGeo(selectedGeo);
}
// update the trace geo list and select our geo
updateTraceGeoList();
traceGeoList.removeListSelectionListener(this);
traceGeoList.setSelectedValue(selectedGeo, true);
traceGeoList.addListSelectionListener(this);
// selectedGeo does not exist, user must select a geo
} else {
// switch to Add mode
newTraceLocation = traceCell;
isIniting = true;
// setMode(MODE_ADD);
setMode(MODE_NORMAL);
}
}
@Override
public void setVisible(boolean isVisible) {
super.setVisible(isVisible);
if (isVisible) {
view.setTraceDialogMode(true);
updateGUI();
app.setSelectionListenerMode(this);
} else {
// clear the selection rectangle and switch back to normal mode
traceGeoList.clearSelection();
setMode(MODE_NORMAL);
view.getSpreadsheetTable().selectionChanged();
view.setTraceDialogMode(false);
app.setSelectionListenerMode(null);
}
}
// ======================================================
// Create GUI
// ======================================================
private void initGUI() {
// TODO use a set labels method for language support
try {
setTitle(loc.getMenu("RecordToSpreadsheet"));
BorderLayout thisLayout = new BorderLayout();
getContentPane().setLayout(thisLayout);
// tabbed panel
tabbedPane = new JPanel();
tabbedPane.setLayout(new BoxLayout(tabbedPane, BoxLayout.Y_AXIS));
tabbedPane.add(buildLocationPanel());
tabbedPane.add(buildTraceModePanel());
tabbedPane.add(buildOptionsPanel());
tabbedPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5));
// split pane: trace list on left, tabbed options on left
splitPane = new JSplitPane();
splitPane.setLeftComponent(buildListPanel());
splitPane.setRightComponent(tabbedPane);
splitPane.setDividerSize(0);
// put it all together
getContentPane().add(splitPane, BorderLayout.CENTER);
getContentPane().add(buildButtonPanel(), BorderLayout.SOUTH);
// finish setup
setResizable(false);
pack();
setLocationRelativeTo(app.getFrame());
} catch (Exception e) {
e.printStackTrace();
}
}
private JPanel buildListPanel() {
// init the trace options panel
listPanel = new JPanel();
listPanel.setLayout(new BorderLayout());
listPanel.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1,
SystemColor.controlShadow));
traceGeoListModel = new DefaultListModel();
traceGeoList = new JList(traceGeoListModel);
traceGeoList
.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
traceGeoList.addListSelectionListener(this);
traceGeoList.setLayoutOrientation(JList.VERTICAL);
traceGeoList.setVisibleRowCount(-1);
MyCellRenderer rend = new MyCellRenderer();
traceGeoList.setCellRenderer(rend);
JScrollPane listScroller = new JScrollPane(traceGeoList);
listScroller.setPreferredSize(new Dimension(180, 30));
listScroller.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5));
listPanel.add(listScroller, BorderLayout.CENTER);
return listPanel;
}
private JPanel buildLocationPanel() {
// start row panel
lblStartRow = new JLabel(loc.getMenu("StartRow" + ": "));
firstRowField = new MyTextFieldD(app);
firstRowField.setColumns(3);
firstRowField.addActionListener(this);
firstRowField.addFocusListener(this);
JPanel startRowPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
startRowPanel.setAlignmentX(0.0f);
startRowPanel.add(lblStartRow);
startRowPanel.add(firstRowField);
// row limit panel
cbRowLimit = new JCheckBox(loc.getMenu("RowLimit" + ": "));
cbRowLimit.addActionListener(this);
numRowsField = new MyTextFieldD(app);
numRowsField.setAlignmentX(0.0f);
numRowsField.setColumns(3);
numRowsField.addActionListener(this);
numRowsField.addFocusListener(this);
JPanel rowLimitPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
rowLimitPanel.setAlignmentX(0.0f);
rowLimitPanel.add(cbRowLimit);
rowLimitPanel.add(numRowsField);
// locationPanel
JPanel locationPanel = new JPanel();
locationPanel.setLayout(new BoxLayout(locationPanel, BoxLayout.Y_AXIS));
locationPanel.setMinimumSize(new Dimension(200, 30));
locationTitle = BorderFactory
.createTitledBorder(loc.getPlain("Location"));
locationPanel
.setBorder(BorderFactory.createTitledBorder(locationTitle));
locationPanel.add(startRowPanel);
locationPanel.add(rowLimitPanel);
return locationPanel;
}
private JPanel buildTraceModePanel() {
// trace as... radio buttons
JPanel pane = new JPanel();
pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
traceModeTitle = BorderFactory
.createTitledBorder(loc.getPlain("TraceMode"));
pane.setBorder(BorderFactory.createTitledBorder(traceModeTitle));
traceModeValues = new JRadioButton(loc.getPlain(""));
traceModeValues.addActionListener(this);
traceModeCopy = new JRadioButton(loc.getPlain(""));
traceModeCopy.addActionListener(this);
ButtonGroup group = new ButtonGroup();
group.add(traceModeValues);
group.add(traceModeCopy);
pane.add(traceModeValues);
pane.add(traceModeCopy);
return pane;
}
private JPanel buildOptionsPanel() {
// options panel
optionsPanel = new JPanel();
optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.Y_AXIS));
// optionsPanel.setBorder(BorderFactory.createEmptyBorder(0,5,5,5));
optionsTitle = BorderFactory
.createTitledBorder(loc.getPlain("Options"));
optionsPanel.setBorder(BorderFactory.createTitledBorder(optionsTitle));
cbShowLabel = new JCheckBox(loc.getPlain("ShowLabel"));
cbShowLabel.addActionListener(this);
optionsPanel.add(cbShowLabel);
cbTraceList = new JCheckBox(loc.getMenu("TraceToList"));
cbTraceList.addActionListener(this);
optionsPanel.add(cbTraceList);
cbResetColumns = new JCheckBox(loc.getMenu("ColumnReset"));
cbResetColumns.addActionListener(this);
optionsPanel.add(cbResetColumns);
optionsPanel.setMinimumSize(optionsPanel.getPreferredSize());
return optionsPanel;
}
private JPanel buildButtonPanel() {
// init button panel
buttonPanel = new JPanel(new BorderLayout());
// btRemove = new JButton("\u2718");
btRemove = new JButton(app.getScaledIcon(GuiResourcesD.DELETE_SMALL));
btRemove.addActionListener(this);
btAdd = new JButton("\u271A");
btAdd.addActionListener(this);
btErase = new JButton(app.getScaledIcon(GuiResourcesD.EDIT_CLEAR));
btErase.addActionListener(this);
leftButtonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
leftButtonPanel.add(btRemove);
// leftButtonPanel.add(btAdd);
leftButtonPanel.add(Box.createRigidArea(new Dimension(10, 0)));
leftButtonPanel.add(btErase);
btClose = new JButton(loc.getMenu("Close"));
btClose.addActionListener(this);
btCancel = new JButton(loc.getPlain("Cancel"));
btCancel.addActionListener(this);
JPanel closeCancelPanel = new JPanel();
closeCancelPanel.add(btCancel);
closeCancelPanel.add(btClose);
promptPanel = new JPanel(new BorderLayout());
prompt = new JLabel(loc.getMenu("SelectAnObjectToTrace"));
prompt.setHorizontalAlignment(SwingConstants.CENTER);
prompt.setVerticalAlignment(SwingConstants.CENTER);
promptPanel.add(prompt, BorderLayout.CENTER);
promptPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
// promptPanel.setVisible(false);
buttonPanel.add(closeCancelPanel, loc.borderEast());
// buttonPanel.add(promptPanel, BorderLayout.CENTER);
buttonPanel.add(leftButtonPanel, loc.borderWest());
buttonPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
// buttonPanel.setPreferredSize(new Dimension(400,50));
return buttonPanel;
}
/**
* Update localization
*/
public void setLabels() {
setTitle(loc.getMenu("RecordToSpreadsheet"));
lblStartRow.setText(loc.getMenu("StartRow") + ": ");
cbRowLimit.setText(loc.getMenu("RowLimit") + ": ");
cbShowLabel.setText(loc.getPlain("ShowLabel"));
cbTraceList.setText(loc.getMenu("TraceToList"));
traceModeTitle.setTitle(loc.getPlain("TraceMode"));
setTraceModeLabels();
cbResetColumns.setText(loc.getMenu("ColumnReset"));
btClose.setText(loc.getMenu("Close"));
btCancel.setText(loc.getPlain("Cancel"));
prompt.setText(loc.getMenu("SelectAnObjectToTrace"));
btRemove.setText(loc.getPlain("Remove"));
btAdd.setToolTipText(loc.getMenuTooltip("AddTrace"));
btErase.setText(loc.getMenuTooltip("ClearTrace"));
locationTitle.setTitle(loc.getMenu("Location"));
optionsTitle.setTitle(loc.getMenu("Options"));
}
private StringBuilder sb = new StringBuilder();
private void setTraceModeLabels() {
TraceModesEnum traceModes = geo.getTraceModes();
sb.setLength(0);
sb.append("<html>");
switch (traceModes) {
default:
case ONE_VALUE_OR_COPY:
case ONE_VALUE_ONLY:
sb.append(app.getLocalization().getPlain("ValueOfA",
geo.getTraceDialogAsValues()));
break;
case SEVERAL_VALUES_OR_COPY:
case SEVERAL_VALUES_ONLY:
case ONLY_COPY: // button disabled
sb.append(app.getLocalization().getPlain("ValuesOfA",
geo.getTraceDialogAsValues()));
break;
}
sb.append("</html>");
traceModeValues.setText(sb.toString());
sb.setLength(0);
sb.append("<html>");
sb.append(app.getLocalization().getPlain("CopyOfA",
geo.getLabelTextOrHTML(false)));
sb.append("</html>");
traceModeCopy.setText(sb.toString());
if (traceModes == TraceModesEnum.ONE_VALUE_ONLY
|| traceModes == TraceModesEnum.SEVERAL_VALUES_ONLY) {
traceModeCopy.setEnabled(false);
traceModeCopy.setForeground(Color.GRAY);
traceModeValues.setEnabled(true);
traceModeValues.setForeground(Color.BLACK);
} else {
traceModeCopy.setEnabled(true);
traceModeCopy.setForeground(Color.BLACK);
if (traceModes == TraceModesEnum.ONLY_COPY) {
traceModeValues.setEnabled(false);
traceModeValues.setForeground(Color.GRAY);
} else {
traceModeValues.setEnabled(true);
traceModeValues.setForeground(Color.BLACK);
}
}
}
// ======================================================
// Update GUI
// ======================================================
private void updateGUI() {
updateTraceGeoList();
switch (mode) {
default:
// do nothing
break;
case MODE_ADD:
// promptPanel.setVisible(true);
btCancel.setVisible(true);
btClose.setVisible(false);
leftButtonPanel.setVisible(false);
// splitPane.setVisible(false);
// traceGeoList.clearSelection();
// traceGeoList.setEnabled(false);
// tabbedPane.setEnabled(false);
view.getSpreadsheetTable().selectionChanged();
getContentPane().remove(splitPane);
getContentPane().add(promptPanel, BorderLayout.CENTER);
Dimension size = splitPane.getPreferredSize();
size.height = promptPanel.getPreferredSize().height;
promptPanel.setPreferredSize(size);
pack();
repaint();
break;
case MODE_NORMAL:
// splitPane.setVisible(true);
// promptPanel.setVisible(false);
leftButtonPanel.setVisible(true);
btCancel.setVisible(false);
btClose.setVisible(true);
// traceGeoList.setEnabled(true);
// tabbedPane.setEnabled(true);
view.getSpreadsheetTable().selectionChanged();
getContentPane().remove(promptPanel);
getContentPane().add(splitPane, BorderLayout.CENTER);
pack();
repaint();
if (!traceGeoList.isSelectionEmpty()) {
// update checkboxes
cbResetColumns.removeActionListener(this);
cbResetColumns.setSelected(getSettings().doColumnReset);
cbResetColumns.addActionListener(this);
cbRowLimit.removeActionListener(this);
cbRowLimit.setSelected(getSettings().doRowLimit);
cbRowLimit.addActionListener(this);
cbShowLabel.removeActionListener(this);
cbShowLabel.setSelected(getSettings().showLabel);
cbShowLabel.addActionListener(this);
cbTraceList.removeActionListener(this);
cbTraceList.setSelected(getSettings().showTraceList);
cbTraceList.addActionListener(this);
traceModeCopy.removeActionListener(this);
traceModeCopy.setSelected(getSettings().doTraceGeoCopy);
traceModeCopy.addActionListener(this);
traceModeValues.removeActionListener(this);
traceModeValues.setSelected(!getSettings().doTraceGeoCopy);
traceModeValues.addActionListener(this);
// update row limit textfield
numRowsField.setEnabled(getSettings().doRowLimit);
numRowsField.removeActionListener(this);
numRowsField.setText("" + getSettings().numRows);
numRowsField.setCaretPosition(0);
numRowsField.addActionListener(this);
// update first row textfield
firstRowField.removeActionListener(this);
firstRowField.setText("" + (getSettings().traceRow1 + 1));
firstRowField.setCaretPosition(0);
firstRowField.addActionListener(this);
// update trace values label
geo = (GeoElement) traceGeoList.getSelectedValue();
setTraceModeLabels();
}
view.repaintView();
break;
}
}
/** Update the trace geo list with current trace geos */
private void updateTraceGeoList() {
GeoElement selectedGeo = (GeoElement) traceGeoList.getSelectedValue();
traceGeoList.removeListSelectionListener(this);
traceGeoListModel.clear();
for (GeoElement geo1 : traceManager.getTraceGeoList()) {
traceGeoListModel.addElement(geo1);
}
if (selectedGeo != null && traceGeoListModel.contains(selectedGeo)) {
traceGeoList.setSelectedValue(selectedGeo, true);
}
traceGeoList.addListSelectionListener(this);
}
// ======================================================
// Event Listeners and Handlers
// ======================================================
@Override
public void actionPerformed(ActionEvent e) {
doActionPerformed(e.getSource());
}
/**
* Process checkbox events
*
* @param source
* event source
*/
public void doActionPerformed(Object source) {
if (source == cbResetColumns) {
getSettings().doColumnReset = cbResetColumns.isSelected();
updateSelectedTraceGeo();
}
else if (source == cbRowLimit) {
getSettings().doRowLimit = cbRowLimit.isSelected();
updateSelectedTraceGeo();
}
else if (source == cbShowLabel) {
getSettings().showLabel = cbShowLabel.isSelected();
updateSelectedTraceGeo();
}
else if (source == cbTraceList) {
getSettings().showTraceList = cbTraceList.isSelected();
updateSelectedTraceGeo();
}
else if (source == traceModeCopy) {
getSettings().doTraceGeoCopy = true;
updateSelectedTraceGeo();
}
else if (source == traceModeValues) {
getSettings().doTraceGeoCopy = false;
updateSelectedTraceGeo();
}
else if (source instanceof JTextField) {
doTextFieldActionPerformed((JTextField) source);
}
else if (source == btAdd) {
setMode(MODE_ADD);
}
else if (source == btErase) {
clearSelectedTraceGeo();
// traceManager.clearGeoTraceColumns(getSelectedGeo());
}
else if (source == btRemove) {
removeTrace();
}
else if (source == btCancel) {
setMode(MODE_NORMAL);
if (isIniting) {
closeDialog();
return;
}
} else if (source == btClose) {
closeDialog();
return;
}
updateGUI();
}
private void doTextFieldActionPerformed(JTextField source) {
try {
Integer value = Integer.parseInt(source.getText());
if (value > 0
&& value < app.getMaxSpreadsheetRowsVisible()) {
if (source == firstRowField) {
traceManager.clearGeoTraceColumns(getSelectedGeo());
getSettings().traceRow1 = value - 1;
updateSelectedTraceGeo();
}
else if (source == numRowsField) {
getSettings().numRows = value;
updateSelectedTraceGeo();
}
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
/** Listener for selection changes in the traceGeoList */
@Override
public void valueChanged(ListSelectionEvent e) {
// if(getSettings() != null) getSettings().debug(getSelectedGeo());
if (!e.getValueIsAdjusting()) {
updateGUI();
}
}
/** Listener for changes in geo selection */
@Override
public void geoElementSelected(GeoElement geo1, boolean addToSelection) {
if (traceManager.isTraceGeo(geo1)) {
traceGeoList.setSelectedValue(geo1, true);
updateGUI();
} else {
if (mode == MODE_ADD && geo1.isSpreadsheetTraceable()
&& !GeoElementSpreadsheet.hasSpreadsheetLabel(geo1)) {
addTrace(geo1);
}
}
}
/** Add a geo to the traceGeoCollection and update the dialog. */
private void addTrace(GeoElement geo1) {
this.geo = geo1;
// add geo to the trace collection
if (!traceManager.isTraceGeo(geo1)) {
SpreadsheetTraceSettings t = geo1.getTraceSettings();
if (newTraceLocation != null) {
t.traceColumn1 = newTraceLocation.getMinColumn();
t.traceRow1 = newTraceLocation.getMinRow();
}
traceManager.addSpreadsheetTraceGeo(geo1);
updateTraceGeoList();
}
// update
setMode(MODE_NORMAL);
traceGeoList.setSelectedValue(geo1, true);
newTraceLocation = null;
updateGUI();
}
/** Remove a geo from the traceGeoCollection and update the dialog. */
private void removeTrace() {
GeoElement geo1 = (GeoElement) traceGeoList.getSelectedValue();
traceManager.removeSpreadsheetTraceGeo(geo1);
geo1.setSpreadsheetTrace(false);
geo1.setTraceSettings(null);
updateTraceGeoList();
if (!traceGeoListModel.isEmpty()) {
traceGeoList.setSelectedIndex(0);
}
updateGUI();
}
private GeoElement getSelectedGeo() {
return (GeoElement) traceGeoList.getSelectedValue();
}
private SpreadsheetTraceSettings getSettings() {
if (traceGeoList.isSelectionEmpty()) {
return null;
}
return ((GeoElement) traceGeoList.getSelectedValue())
.getTraceSettings();
}
private void updateSelectedTraceGeo() {
traceManager.updateTraceSettings(getSelectedGeo());
}
private void clearSelectedTraceGeo() {
app.storeUndoInfo();
traceManager.clearGeoTrace(getSelectedGeo());
}
/**
* Determine the cell range to be selected on spreadsheet mouse click.
*
* @param anchorColumn
* column
* @param anchorRow
* row
* @return range
*/
public CellRange getTraceSelectionRange(int anchorColumn, int anchorRow) {
CellRange cr = new CellRange(app);
switch (mode) {
default:
// do nothing
break;
case MODE_NORMAL:
if (getSettings() == null) {
cr.setCellRange(-1, -1, -1, -1);
} else {
cr.setCellRange(getSettings().traceColumn1,
getSettings().traceRow1, getSettings().traceColumn2,
(getSettings().doRowLimit) ? getSettings().traceRow2
: app.getMaxSpreadsheetRowsVisible());
}
break;
case MODE_ADD:
if (newTraceLocation != null) {
cr = newTraceLocation;
} else {
cr = new CellRange(app, traceManager.getNextTraceColumn(), 0);
}
break;
case MODE_LOCATE:
int w = getSettings().traceColumn2 - getSettings().traceColumn1;
int h = ((getSettings().doRowLimit) ? getSettings().traceRow2
: app.getMaxSpreadsheetRowsVisible())
- getSettings().traceRow1;
cr.setCellRange(anchorColumn, anchorRow, anchorColumn + w,
anchorRow + h);
break;
}
return cr;
}
@Override
public void focusGained(FocusEvent arg0) {
// nothing to do
}
@Override
public void focusLost(FocusEvent e) {
// doActionPerformed(e.getSource());
doTextFieldActionPerformed((JTextField) (e.getSource()));
updateGUI();
}
private void setMode(int mode) {
this.mode = mode;
switch (mode) {
case MODE_NORMAL:
isIniting = false;
// app.setSelectionListenerMode(null);
break;
case MODE_ADD:
app.setMoveMode();
app.setSelectionListenerMode(this);
view.getSpreadsheetTable().selectionChanged();
break;
case MODE_LOCATE:
break;
}
updateGUI();
}
/**
* @param euclidianMode
* app mode
*/
public void toolbarModeChanged(int euclidianMode) {
// System.out.println(euclidianMode);
if (euclidianMode != EuclidianConstants.MODE_MOVE
&& euclidianMode != EuclidianConstants.MODE_SELECTION_LISTENER
&& (mode == MODE_ADD || mode == MODE_LOCATE)) {
setMode(MODE_NORMAL);
if (isIniting) {
closeDialog();
}
}
}
/** Handle notification of deleted or renamed geo */
public void updateTraceDialog() {
updateGUI();
}
/**
* Close this
*/
public void closeDialog() {
// System.out.println("closeDialog");
setMode(MODE_NORMAL);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
app.storeUndoInfo();
setCursor(Cursor.getDefaultCursor());
setVisible(false);
// view.table.setTraceSelectionRectangle(null);
// view.getTable().setSelection(null,null,true);
view.repaintView();
}
@Override
public void windowActivated(WindowEvent arg0) {
// nothing to do
}
@Override
public void windowClosed(WindowEvent arg0) {
// nothing to do
}
@Override
public void windowClosing(WindowEvent arg0) {
closeDialog();
}
@Override
public void windowDeactivated(WindowEvent arg0) {
// nothing to do
}
@Override
public void windowDeiconified(WindowEvent arg0) {
// nothing to do
}
@Override
public void windowIconified(WindowEvent arg0) {
// nothing to do
}
@Override
public void windowOpened(WindowEvent arg0) {
// nothing to do
}
// ======================================================
// Cell Renderer
// ======================================================
/**
* Custom cell renderer that displays GeoElement descriptions.
*/
static class MyCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean hasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected,
hasFocus);
if (value != null) {
GeoElement geo = (GeoElement) value;
String text = geo.getLongDescriptionHTML(true, true);
if (text.length() < 100) {
setText(text);
} else {
setText(geo.getNameDescriptionHTML(true, true));
}
} else {
setText(" ");
}
return this;
}
}
}