package org.geogebra.desktop.cas.view;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JTable;
import org.geogebra.common.awt.GColor;
import org.geogebra.common.kernel.StringTemplate;
import org.geogebra.common.kernel.geos.GeoCasCell;
import org.geogebra.desktop.awt.GColorD;
import org.geogebra.desktop.gui.inputfield.AutoCompleteTextFieldD;
import org.geogebra.desktop.gui.inputfield.MyTextFieldD;
import org.geogebra.desktop.main.AppD;
/**
* CAS cell component
*/
public abstract class CASTableCell extends JPanel {
private static final long serialVersionUID = 1L;
/** input panel */
protected CASInputPanel inputPanel;
/** output panel */
protected CASOutputPanel outputPanel;
/** dummy label used to get preferred size; */
protected MyTextFieldD dummyField;
/** application */
protected AppD app;
/** CAS view */
protected CASViewD view;
/**
* @param view
* CAS view
*/
public CASTableCell(CASViewD view) {
this.view = view;
this.app = view.getApp();
setLayout(new BorderLayout(5, 5));
setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 5));
setBackground(Color.white);
inputPanel = new CASInputPanel(app);
inputPanel.getInputArea().setColoringLabels(true);
dummyField = new MyTextFieldD(app);
// The inputPanel needs to have variable width so that it fits the
// JScrollPane
// viewport when in editing mode but also can grow to the size of its
// text content when not in editing mode. This way the horizontal
// scollbars
// can be used to view long non-editing fields but the current editor
// field can
// be shown clipped and scrollable with arrow keys.
//
// Width is set with the setInputPanelWidth method. The cell editor
// calls this to adjust
// the width to fit the viewport. The cell renderer calls it to expand
// it to its maximum
// width.
//
// To make this work, inputPanel is put in WEST where width can be
// controlled.
// and an invisible dummy field is put in CENTER to get a preferred
// size.
JPanel northPanel = new JPanel(new BorderLayout());
northPanel.setBackground(this.getBackground());
northPanel.add(dummyField, BorderLayout.CENTER);
northPanel.add(inputPanel, app.getLocalization().borderWest());
dummyField.setVisible(false);
outputPanel = new CASOutputPanel(view.getApp());
add(northPanel, BorderLayout.NORTH);
add(outputPanel, BorderLayout.CENTER);
// add(showHideControl, app.borderEast());
return;
}
/**
* Overrides getPreferredSize so that it reports the preferred size if this
* input label was completely drawn and not clipped for the editor.
*/
@Override
public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.width = Math.max(d.width, dummyField.getPreferredSize().width);
return d;
}
/**
* @return input panel height
*/
public int getInputPanelHeight() {
return inputPanel.getHeight();
}
/**
* @return output panel height
*/
public int getOutputPanelHeight() {
return outputPanel.getHeight();
}
/**
* Sets the width of the input panel. Use width = -1 to set width to the
* full input string length.
*
* @param width
* desired width
*/
public void setInputPanelWidth(int width) {
Dimension d = dummyField.getPreferredSize();
// use the parameter width - 15 pixels to correct for border padding
if (width > 0) {
d.width = width - 15;
}
inputPanel.setPreferredSize(d);
}
/**
* Fill this component with input / output of given CAS cell
*
* @param cellValue
* CAS cell
*/
public void setValue(GeoCasCell cellValue) {
// set input panel
// #5119
String input = cellValue.getInput(StringTemplate.numericDefault);
inputPanel.setInput(input);
if (cellValue.isUseAsText()) {
inputPanel.setCommentColor(
GColorD.getAwtColor(cellValue.getObjectColor()));
} else {
inputPanel.setCommentColor(GColorD.getAwtColor(GColor.BLACK));
}
outputPanel.setForeground(cellValue.getAlgebraColor());
dummyField.setText(inputPanel.getInput());
// set output panel
boolean showOutput = cellValue.showOutput();
outputPanel.setVisible(showOutput);
if (showOutput) {
// show eval command (e.g. "Substitute") in output cell
String evalCmdLocal = cellValue.getCommandAndComment();
// #5119
outputPanel.setOutput(
cellValue.getOutput(StringTemplate.numericDefault),
cellValue.getLaTeXOutput(), evalCmdLocal,
cellValue.isError(), cellValue.getAlgebraColor(),
cellValue.getKernel().getApplication());
}
}
/**
* @param c
* color for input
*/
public void setInputColor(Color c) {
inputPanel.setForeground(c);
}
/**
* @param table
* CAS table
* @param row
* row index
*/
void updateTableRowHeight(JTable table, int row) {
if (isVisible()) {
Dimension prefSize = getPreferredSize();
if (prefSize != null) {
setSize(prefSize);
if (table.getRowHeight(row) != prefSize.height) {
table.setRowHeight(row, prefSize.height);
}
}
}
}
/**
* @return input text
*/
public String getInput() {
return inputPanel.getInput();
}
/**
* change directly the text in the Input field of the cell
*
* @param input
* the input string
*/
public void setInput(String input) {
if (input != null) {
inputPanel.setInput(input);
}
}
/**
*
* @return true if the InputArea has been set focused successfully, false
* otherwise
*/
public boolean setInputAreaFocused() {
return inputPanel.setInputAreaFocused();
}
/**
* @return input component
*/
public AutoCompleteTextFieldD getInputArea() {
return inputPanel.getInputArea();
}
@Override
public void setFont(Font ft) {
super.setFont(ft);
if (inputPanel != null) {
inputPanel.setFont(ft);
}
if (dummyField != null) {
dummyField.setFont(ft);
}
if (outputPanel != null) {
outputPanel.setFont(ft);
}
}
/**
* Updates autocomplete dictionary
*/
public void setLabels() {
inputPanel.setLabels();
}
public void setOrientation() {
inputPanel.setOrientation();
outputPanel.setOrientation();
}
}