package org.geogebra.web.web.gui.view.functioninspector; import java.util.List; import org.geogebra.common.euclidian.event.KeyEvent; import org.geogebra.common.euclidian.event.KeyHandler; import org.geogebra.common.main.App; import org.geogebra.web.html5.gui.inputfield.AutoCompleteTextFieldW; import org.geogebra.web.web.gui.view.algebra.InputPanelW; import org.geogebra.web.web.gui.view.functioninspector.GridModel.DataCell; import org.geogebra.web.web.gui.view.functioninspector.GridModel.IGridListener; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; public class InspectorTableW extends FlexTable implements IGridListener { private static final int HEADER_ROW = 0; private GridModel model; private int selectedRow; private AutoCompleteTextFieldW cellEditor; private KeyHandler keyHandler; private BlurHandler blurHandler; public InspectorTableW(App app, int col) { super(); setStyleName("inspectorTable"); setWidth("100%"); setModel(new GridModel(col, this)); selectedRow = 1; RowFormatter rf = getRowFormatter(); rf.setStyleName(HEADER_ROW, "inspectorTableHeader"); InputPanelW input = new InputPanelW(app, -1, false); cellEditor = input.getTextComponent(); cellEditor.setStyleName("inspectorTableEditor"); keyHandler = null; blurHandler = null; addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { Cell cell = getCellForEvent(event); if (cell == null) { return; } updateRowStyle(cell, "selected"); } }); cellEditor.addKeyHandler(new KeyHandler() { @Override public void keyReleased(KeyEvent e) { if (keyHandler != null) { keyHandler.keyReleased(e); } } }); cellEditor.addBlurHandler(new BlurHandler() { @Override public void onBlur(BlurEvent event) { if (blurHandler != null) { blurHandler.onBlur(event); } } }); } public Double getDoubleEdited() { if (cellEditor == null) { return null; } Double value = null; try { value = Double.parseDouble(cellEditor.getText()); } catch (NumberFormatException e) { e.printStackTrace(); } return value; } private void setEditorInCell(int row, int col) { if (row == -1 || col == -1) { return; } DataCell data = model.getData(row - 1, col); cellEditor.setText(data == null ? "": data.toString()); setWidget(row, col, cellEditor); } private void updateRowStyle(Cell cell, String style) { if (cell == null) { return; } int row = cell.getRowIndex(); if (row == HEADER_ROW) { // Header row cannot be selected. return; } clearSelectedRowStyle(); RowFormatter rf = getRowFormatter(); rf.setStyleName(row, style); selectedRow = row; } public void clearSelectedRowStyle() { if (selectedRow < getRowCount()) { // making sure it is not removed meanwile getRowFormatter().setStyleName(selectedRow, ""); } } @Override public void updateHeader(int col, String title) { setCellWidget(HEADER_ROW, col, "inspectorTableHeader", title); } @Override public void updateDataCell(int row, int col, DataCell value) { // Cells at row 0 are headers. updateCell(row + 1, col, value); } protected void updateCell(int row, int col, DataCell value) { //App.debug(TABLE_PREFIX + "updating cell at row: " + row // + " col: " + col); Widget widget = getWidget(row, col); if (widget != null) { if (widget == cellEditor) { ((AutoCompleteTextFieldW)widget).setText(value.toString()); } else { ((Label)widget).setText(value.toString()); } } else { setCellWidget(row, col, "inspectorTableData", value); } } protected void setCellWidget(int row, int col, String style, DataCell cell) { Widget w = null; if (cell.isEditable()) { cellEditor.setText(cell.toString()); w = cellEditor; } else { w = new Label(cell.toString()); } getCellFormatter().setStyleName(row, col, style); setWidget(row, col, w); } protected void setCellWidget(int row, int col, String style, String text) { Label label = new Label(text); getCellFormatter().setStyleName(row, col, style); setWidget(row, col, label); } public GridModel getModel() { return model; } public void setModel(GridModel model) { this.model = model; } @Override public void addRow(List<DataCell> row) { int numRows = getRowCount(); int col = 0; for (DataCell cell: row) { setCellWidget(numRows, col, "inspectorTableData", cell); col++; } } @Override public void setHeaders(String[] headers) { int col = 0; for (String title: headers) { updateHeader(col, title); col++; } } public int getSelectedRow() { return selectedRow; } public void setSelectedRow(int idx) { RowFormatter rf = getRowFormatter(); clearSelectedRowStyle(); this.selectedRow = idx + 1; // 0 is the header rf.setStyleName(selectedRow, "selected"); } @Override public void removeLastCell(int row) { removeCell(row, model.getColumnCount()); } @Override public void removeLastRow() { removeRow(getRowCount() -1); // App.debug("[TABLE] rowCount: " + getRowCount()); } @Override public void removeColumn() { for (int row=0; row < getRowCount(); row++) { removeLastCell(row); } } @Override public void appendColumn(String name) { int col = getCellCount(HEADER_ROW); addCell(HEADER_ROW); setCellWidget(HEADER_ROW, col, "inspectorTableHeader", name); for (int row = 1; row < getRowCount(); row++) { setCellWidget(row, col, "inspectorTableData", ""); } } public void setCellEditable(int row, int col) { model.setCellEditable(row, col); setEditorInCell(row + 1, col); } public KeyHandler getKeyHandler() { return keyHandler; } public void addKeyHandler(KeyHandler keyHandler) { this.keyHandler = keyHandler; } public BlurHandler getBlurHandler() { return blurHandler; } public void addBlurHandler(BlurHandler blurHandler) { this.blurHandler = blurHandler; } }