package org.geogebra.desktop.gui.view.spreadsheet;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Image;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.border.Border;
import javax.swing.table.DefaultTableCellRenderer;
import org.geogebra.common.awt.GColor;
import org.geogebra.common.awt.GPoint;
import org.geogebra.common.gui.view.spreadsheet.CellFormat;
import org.geogebra.common.gui.view.spreadsheet.MyTableInterface;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.StringTemplate;
import org.geogebra.common.kernel.geos.GeoBoolean;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoImage;
import org.geogebra.common.kernel.geos.GeoList;
import org.geogebra.common.kernel.geos.GeoText;
import org.geogebra.common.util.IndexHTMLBuilder;
import org.geogebra.common.util.debug.Log;
import org.geogebra.desktop.awt.GColorD;
import org.geogebra.desktop.gui.MyImageD;
import org.geogebra.desktop.main.AppD;
public class MyCellRendererD extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
// ggb fields
private AppD app;
private Kernel kernel;
// private SpreadsheetView view;
private MyTableInterface myTable;
// LaTeX
private ImageIcon latexIcon, emptyIcon;
private String latexStr;
// Cell formats
private CellFormat formatHandler;
private GPoint cellPoint;
private Integer alignment = -1;
private Integer fontStyle;
boolean isCustomBGColor;
// Borders (not implemented yet)
private Border cellPadding = BorderFactory.createEmptyBorder(2, 5, 2, 5);
// Rendering objects for lists, buttons and booleans
private JCheckBox checkBox;
private JButton button;
private JComboBox comboBox;
private DefaultComboBoxModel cbModel;
private Color bgColor;
// Cell geo
private GeoElement geo;
/*********************************************************
* Constructor
*
* @param app
* @param view
* @param formatHandler
*/
public MyCellRendererD(MyTableInterface table) {
this.myTable = table;
app = (AppD) myTable.getApplication();
kernel = app.getKernel();
formatHandler = (CellFormat) myTable.getCellFormatHandler();
// Add horizontal padding
setBorder(BorderFactory.createEmptyBorder(2, 5, 2, 5));
// The cell renderer extends JLabel...its icon is used to display LaTeX.
latexIcon = new ImageIcon();
emptyIcon = new ImageIcon();
cellPoint = new GPoint(); // used for cell format calls
// Rendering for booleans, buttons and lists
checkBox = new JCheckBox();
button = new JButton();
comboBox = new JComboBox();
comboBox.setRenderer(new MyListCellRenderer());
cbModel = new DefaultComboBoxModel();
comboBox.setModel(cbModel);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
setBorder(cellPadding);
cellPoint.setLocation(column, row);
setIcon(emptyIcon);
setIconTextGap(0);
// Set visible formats ... do this before exit with null geo
// ==================================================
// set default background color (adjust later if geo exists)
Object c = formatHandler.getCellFormat(column, row,
CellFormat.FORMAT_BGCOLOR);
if (c instanceof GColor) {
GColor col = (GColor) c;
bgColor = GColorD.getAwtColor(col);
} else {
bgColor = null;
// Log.error("problem " + ((c == null) ? "null" : "" +
// c.getClass()));
}
// bgColor = GColorD.getAwtColor(((GColor) formatHandler
// .getCellFormat(column, row, CellFormat.FORMAT_BGCOLOR));
if (bgColor == null) {
isCustomBGColor = false;
bgColor = table.getBackground();
} else {
isCustomBGColor = true;
}
setBackground(bgColor);
// Get the cell geo, exit if null
// ==================================================
if (value != null) {
geo = (GeoElement) value;
} else {
setText("");
return this;
}
// use special rendering for buttons, booleans and lists
// =======================================================
if (myTable.allowSpecialEditor() && kernel
.getAlgebraStyleSpreadsheet() == Kernel.ALGEBRA_STYLE_VALUE) {
if (geo.isGeoBoolean()) {
checkBox.setBackground(table.getBackground());
checkBox.setHorizontalAlignment(CENTER);
checkBox.setEnabled(geo.isIndependent());
if (geo.isLabelVisible()) {
// checkBox.setText(geo.getCaption());
}
checkBox.setSelected(((GeoBoolean) geo).getBoolean());
return checkBox;
}
if (geo.isGeoButton()) {
// button.setBackground(table.getBackground());
button.setHorizontalAlignment(CENTER);
button.setText(geo.getCaption(StringTemplate.defaultTemplate));
button.setForeground(GColorD.getAwtColor(geo.getObjectColor()));
return button;
}
if (geo.isGeoList()) {
GeoList list = (GeoList) geo;
comboBox.setBackground(table.getBackground());
cbModel.removeAllElements();
if (list.size() > 0)
{
cbModel.addElement(list.get(list.getSelectedIndex()));
// comboBox.setSelected(((GeoBoolean)geo).getBoolean());
}
return comboBox;
}
}
// ===============================================
// (end special rendering)
// Set text according to algebra style
// ===============================================
String text = null;
if (!geo.isEmptySpreadsheetCell()) {
if (geo.isIndependent()) {
text = geo.toValueString(StringTemplate.defaultTemplate);
} else {
switch (kernel.getAlgebraStyleSpreadsheet()) {
default:
case Kernel.ALGEBRA_STYLE_VALUE:
text = geo.toValueString(StringTemplate.defaultTemplate);
break;
case Kernel.ALGEBRA_STYLE_DESCRIPTION:
IndexHTMLBuilder builder = new IndexHTMLBuilder(true);
GeoElement
.convertIndicesToHTML(
geo.getDefinitionDescription(
StringTemplate.defaultTemplate),
builder);
text = builder.toString();
break;
case Kernel.ALGEBRA_STYLE_DEFINITION:
builder = new IndexHTMLBuilder(true);
GeoElement.convertIndicesToHTML(
geo.getDefinition(StringTemplate.defaultTemplate),
builder);
text = builder.toString();
break;
}
}
}
// Set font
// ===============================================
fontStyle = (Integer) formatHandler.getCellFormat(cellPoint.x,
cellPoint.y, CellFormat.FORMAT_FONTSTYLE);
if (fontStyle == null) {
fontStyle = Font.PLAIN;
}
setText(text);
setFont(app.getFontCanDisplayAwt(text, fontStyle));
// Set foreground and background color
// ===============================================
// use geo bgColor if there is no format bgColor
if (geo.getBackgroundColor() != null && !isCustomBGColor) {
bgColor = GColorD.getAwtColor(geo.getBackgroundColor());
isCustomBGColor = true;
}
// adjust selection color when there is a bgColor
if (geo.doHighlighting()) {
if (isCustomBGColor) {
bgColor = bgColor.darker();
} else {
bgColor = MyTableD.SELECTED_BACKGROUND_COLOR;
}
}
// for testing
// if(geo.isEmptySpreadsheetCell()){
// bgColor = MyTableD.SELECTED_BACKGROUND_COLOR_HEADER;
// }
setBackground(bgColor);
setForeground(GColorD.getAwtColor(geo.getLabelColor()));
// Set horizontal alignment
// ===============================================
alignment = (Integer) formatHandler.getCellFormat(cellPoint.x,
cellPoint.y, CellFormat.FORMAT_ALIGN);
if (alignment != null) {
setHorizontalAlignment(alignment);
} else if (geo.isGeoText()) {
setHorizontalAlignment(SwingConstants.LEFT);
} else {
setHorizontalAlignment(SwingConstants.RIGHT);
}
// Set icons for LaTeX and images
// ===============================================
if (geo.isGeoImage()) {
if (((MyImageD) ((GeoImage) geo).getFillImage()).isSVG()) {
Log.error(
"SVG not supported in the spreadsheet in desktop yet");
} else {
Image im = ((MyImageD) ((GeoImage) geo).getFillImage())
.getImage();
latexIcon.setImage(im);
setIcon(latexIcon);
}
setHorizontalAlignment(SwingConstants.CENTER);
setText("");
} else {
boolean isSerif = false;
if (geo.isDefined()
&& kernel.getAlgebraStyle() == Kernel.ALGEBRA_STYLE_VALUE) {
latexStr = geo.getFormulaString(StringTemplate.latexTemplate,
true);
if (geo.isLaTeXDrawableGeo()) {
try {
if (geo.isGeoText()) {
isSerif = ((GeoText) geo).isSerifFont();
}
// System.out.println(latexStr);
app.getDrawEquation().drawLatexImageIcon(app, latexIcon,
latexStr, getFont(), isSerif,
GColorD.getAwtColor(geo.getAlgebraColor()),
bgColor);
setIcon(latexIcon);
setText("");
} catch (Exception e) {
Log.debug("error in drawing latex" + e);
}
}
}
}
return this;
}
// ======================================================
// ComboBox Cell Renderer
// ======================================================
/**
* Custom cell renderer that displays GeoElement descriptions.
*/
private static class MyListCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean hasFocus) {
setBackground(Color.WHITE);
JLabel lbl = (JLabel) super.getListCellRendererComponent(list,
value, index, isSelected, hasFocus);
lbl.setHorizontalAlignment(LEFT);
if (value != null) {
GeoElement geo = (GeoElement) value;
if (geo.isGeoText()) {
setText(geo.toValueString(StringTemplate.defaultTemplate));
} else {
setText(geo.getLabel(StringTemplate.defaultTemplate));
}
} else {
setText(" ");
}
return lbl;
}
}
/*
* // Set border // (not finished ... border cell formats need coding) //
* traceBorder = (Integer) formatHandler.getCellFormat(cellPoint, //
* CellFormat.FORMAT_TRACING);
*
* if (traceBorder != null){
*
* switch (traceBorder){ case CellFormat.BORDER_STYLE_ALL:
* setBorder(BorderFactory.createCompoundBorder(bAll, cellPadding)); break;
* case CellFormat.BORDER_STYLE_TOP:
* setBorder(BorderFactory.createCompoundBorder(bTop, cellPadding)); break;
* case CellFormat.BORDER_STYLE_LEFT:
* setBorder(BorderFactory.createCompoundBorder(bLeft, cellPadding)); break;
* case CellFormat.BORDER_STYLE_BOTTOM:
* setBorder(BorderFactory.createCompoundBorder(bBottom, cellPadding));
* break; case CellFormat.BORDER_STYLE_RIGHT:
* setBorder(BorderFactory.createCompoundBorder(bRight, cellPadding));
* break;
*
* }
*
* }else{ setBorder(cellPadding); }
*/
}