package org.geogebra.web.web.gui.view.data;
import java.util.ArrayList;
import org.geogebra.common.gui.view.data.DataAnalysisModel;
import org.geogebra.common.kernel.StringTemplate;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoPoint;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.html5.main.LocalizationW;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
/** Data panel */
public class DataPanelW extends FlowPanel implements StatPanelInterfaceW,
RequiresResize
{
private DataAnalysisViewW daView;
private DataAnalysisControllerW statController;
private CheckBox cbEnableAll;
private Boolean[] selectionList;
private Label lblHeader;
private LocalizationW loc;
// private static final GColor TABLE_HEADER_COLOR = GeoGebraColorConstants.TABLE_HEADER_COLOR;
private StatTableW dataTable;
private ScrollPanel scrollPane;
private class DataClickHandler implements ClickHandler {
private int index;
public DataClickHandler(int index) {
this.index = index;
}
@Override
public void onClick(ClickEvent event) {
onDataClick(index);
}
}
/*************************************************
* Construct a DataPanel
*
* @param app
* application
* @param statDialog
* data analysis view
*/
public DataPanelW(AppW app, DataAnalysisViewW statDialog) {
this.loc = (LocalizationW) app.getLocalization();
this.daView = statDialog;
this.statController = statDialog.getController();
buildDataTable();
cbEnableAll = new CheckBox("");
cbEnableAll.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
enableAll();
}
});
populateDataTable(statController.getDataArray());
createGUI();
enableAll();
setStyleName("daData");
}
private void buildDataTable() {
dataTable = new StatTableW();
}
private void createGUI() {
scrollPane = new ScrollPanel();
scrollPane.add(dataTable);
lblHeader = new Label();
add(lblHeader);
add(scrollPane);
setLabels();
}
@Override
public void setLabels() {
lblHeader.setText(loc.getMenu("Data"));
}
@Override
public void updatePanel() {
// setRowHeight();
}
//
// public void updateFonts(Font font) {
// // TODO Auto-generated method stub
//
// }
private Boolean[] updateSelectionList(ArrayList<GeoElement> dataArray) {
selectionList = new Boolean[dataArray.size()];
for (int i = 0; i < selectionList.length; ++i) {
selectionList[i] = true;
}
return selectionList;
}
private void populateOneVarDataTable(ArrayList<GeoElement> dataArray) {
String[] titles = daView.getDataTitles();
int maxRows = dataArray.size() + 1;
String[] rowNames = new String[maxRows];
dataTable.setStatTable(maxRows, rowNames, 2, null);
for (int row = 0; row < maxRows - 1; row++) {
CheckBox cb = new CheckBox("" + (row + 1));
cb.addClickHandler(new DataClickHandler(row));
cb.setValue(true);
dataTable.getTable().setWidget(row + 1, 0, cb);
dataTable.setValueAt(
dataArray.get(row).toDefinedValueString(
StringTemplate.defaultTemplate), row + 1, 1);
}
dataTable.getTable().setWidget(0, 0, cbEnableAll);
dataTable.setValueAt(titles[0], 0, 1);
updateSelectionList(dataArray);
}
private void populateRegressionDataTable(ArrayList<GeoElement> dataArray) {
// a data source may be a list of points with a single title
// so we must create a title for the y column
setStyleName("daRegressionData");
String[] titles = daView.getDataTitles();
String[] rowNames = new String[dataArray.size()];
String titleX = titles[0];
String titleY = titles.length == 1 ? titleX : titles[1];
int maxRows = dataArray.size() + 1;
dataTable.setStatTable(maxRows, rowNames, 3, null);
for (int row = 0; row < maxRows - 1; ++row) {
CheckBox cb = new CheckBox("" + (row+1));
cb.addClickHandler(new DataClickHandler(row));
cb.setValue(true);
dataTable.getTable().setWidget(row + 1, 0, cb);
dataTable.setValueAt(
((GeoPoint) (dataArray.get(row))).getInhomX()+"", row+1, 1);
dataTable.setValueAt(
((GeoPoint) (dataArray.get(row))).getInhomY()+"", row+1, 2);
}
dataTable.getTable().setWidget(0, 0, cbEnableAll);
// handle x,y titles
if (daView.getDataSource().isPointData()) {
dataTable.setValueAt(loc.getMenu("Column.X"), 0, 1);
dataTable.setValueAt(loc.getMenu("Column.Y"), 0, 2);
} else {
dataTable.setValueAt(loc.getMenu("Column.X") + ": " + titleX, 0, 1);
dataTable.setValueAt(loc.getMenu("Column.Y") + ": " + titleY, 0, 2);
}
updateSelectionList(dataArray);
}
private void populateDataTable(ArrayList<GeoElement> dataArray) {
if (dataArray == null || dataArray.size() < 1) {
return;
}
//GeoPoint geo = null;
switch (daView.getModel().getMode()) {
case DataAnalysisModel.MODE_ONEVAR:
populateOneVarDataTable(dataArray);
break;
case DataAnalysisModel.MODE_REGRESSION:
populateRegressionDataTable(dataArray);
break;
}
}
//
// /**
// * Loads the data table. Called on data set changes.
// */
// public void loadDataTable(ArrayList<GeoElement> dataArray) {
//
// // load the data model
// populateDataTable(dataArray);
//
// // prepare boolean selection list for the checkboxes
// selectionList = new Boolean[dataArray.size()];
// for (int i = 0; i < dataArray.size(); ++i) {
// selectionList[i] = true;
// }
//
// // create a new header
// rowHeader = new MyRowHeader(this, dataTable);
// scrollPane.setRowHeaderView(rowHeader);
// updateFonts(getFont());
//
// // repaint
// dataTable.repaint();
// rowHeader.repaint();
//
// }
//
// public void ensureTableFill() {
// Container p = getParent();
// DefaultTableModel dataModel = (DefaultTableModel) dataTable.getModel();
// if (dataTable.getHeight() < p.getHeight()) {
// int newRows = (p.getHeight() - dataTable.getHeight())
// / dataTable.getRowHeight();
// dataModel.setRowCount(dataTable.getRowCount() + newRows);
// for (int i = 0; i <= dataTable.getRowCount(); ++i) {
// if (rowHeader.getModel().getElementAt(i) != null)
// ((DefaultListModel) rowHeader.getModel()).add(i, true);
// }
// }
//
// }
// public void actionPerformed(ActionEvent e) {
// if (e.getSource() == btnEnableAll) {
// rowHeader.enableAll();
// btnEnableAll.setEnabled(false);
//
// }
// }
//}
/**
* @param index
* clicked item index
*/
public void onDataClick(int index) {
selectionList[index] = !selectionList[index];
statController.updateSelectedDataList(index,
selectionList[index]);
cbEnableAll.setValue(isAllEnabled());
cbEnableAll.setEnabled(true);
}
/**
* Mark all items as enabled
*/
public void enableAll() {
for (int i = 0; i < selectionList.length; ++i) {
if (!selectionList[i]) {
statController.updateSelectedDataList(i, true);
selectionList[i] = true;
Widget w = dataTable.getTable().getWidget(i + 1, 0);
if (w instanceof CheckBox) {
((CheckBox)w).setValue(true);
}
}
}
cbEnableAll.setValue(true);
cbEnableAll.setEnabled(false);
}
/**
* @return whether all items are selected
*/
public boolean isAllEnabled() {
for (int i = 0; i < selectionList.length; ++i) {
if (!selectionList[i]) {
return false;
}
}
return true;
}
@Override
public void onResize() {
scrollPane.setHeight(getOffsetHeight() - lblHeader.getOffsetHeight() + "px");
}
}