package org.geogebra.web.web.gui.view.data;
import java.util.ArrayList;
import org.geogebra.common.gui.view.data.DataAnalysisModel;
import org.geogebra.common.gui.view.data.DataAnalysisModel.Regression;
import org.geogebra.common.gui.view.data.DataVariable.GroupType;
import org.geogebra.common.gui.view.data.StatTableModel;
import org.geogebra.common.gui.view.data.StatTableModel.Stat;
import org.geogebra.common.gui.view.data.StatTableModel.StatTableListener;
import org.geogebra.common.kernel.algos.AlgoElement;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoList;
import org.geogebra.common.kernel.geos.GeoNumeric;
import org.geogebra.web.html5.main.AppW;
import com.google.gwt.user.client.ui.FlowPanel;
/**
* Displays statistics for DataAnalysisView when in one variable or regression
* mode.
*
* @author G. Sturr
*
*/
public class BasicStatTableW extends FlowPanel implements StatPanelInterfaceW,
StatTableListener {
private StatTableModel model;
protected DataAnalysisViewW daView;
protected StatTableW statTable;
public BasicStatTableW(AppW app, DataAnalysisViewW statDialog) {
this(app, statDialog, true);
} // END constructor
public BasicStatTableW(AppW app, DataAnalysisViewW statDialog,
boolean defaultModel) {
this.daView = statDialog;
setStyleName("daStatistics");
if (defaultModel) {
setModel(new StatTableModel(app, this));
}
}
public void setModel(StatTableModel model) {
this.model = model;
initStatTable();
}
protected void initStatTable() {
statTable = new StatTableW();
statTable.setStatTable(getModel().getRowCount(), getModel().getRowNames(),
getColumnCount(), getModel().getColumnNames());
clear();
add(statTable);
}
public String[] getRowNames() {
return getModel().getRowNames();
}
public String[] getColumnNames() {
return getModel().getColumnNames();
}
public int getRowCount() {
return getModel().getRowCount() - 1;
}
public int getColumnCount() {
return 2;
}
// =======================================================
/**
* Evaluates all statistics for the selected data list. If data source is
* not valid, the result cells are set blank.
*
*/
@Override
public void updatePanel() {
// App.printStacktrace("update stat panel");
GeoList dataList = getDataSelected();
GeoElement geoRegression = getRegressionModel();
// when the regression mode is NONE geoRegression is a dummy linear
// model, so reset it to null
if (getRegressionMode().equals(Regression.NONE)) {
geoRegression = null;
}
double value;
statTable.setStatTable(getModel().getRowCount(), getModel()
.getRowNames(), getColumnCount(), getModel()
.getColumnNames());
ArrayList<Stat> list = getModel().getStatList();
for (int row = 0; row < list.size(); row++) {
for (int column = 1; column < getColumnCount(); column++) {
Stat stat = list.get(row);
if (isValidData() && stat != Stat.NULL) {
AlgoElement algo = getAlgo(stat, dataList, geoRegression);
if (algo != null) {
getModel().getConstruction().removeFromConstructionList(algo);
value = ((GeoNumeric) algo.getGeoElements()[0])
.getDouble();
setValueAt(value, row, 1);
}
}
}
}
}
protected AlgoElement getAlgo(Stat algoName, GeoList dataList,
GeoElement geoRegression) {
return getModel().getAlgo(algoName, dataList, geoRegression);
}
protected AlgoElement getAlgoRawData(Stat stat, GeoList dataList,
GeoElement geoRegression) {
return getModel().getAlgoRawData(stat, dataList, geoRegression);
}
protected AlgoElement getAlgoFrequency(Stat stat, GeoList frequencyData,
GeoElement geoRegression) {
return getModel().getAlgoFrequency(stat, frequencyData, geoRegression);
}
protected AlgoElement getAlgoClass(StatTableModel.Stat stat,
GeoList frequencyData, GeoElement geoRegression) {
return getModel().getAlgoClass(stat, frequencyData, geoRegression);
}
@Override
public void setLabels() {
statTable.setLabels(getModel().getRowNames(), getModel().getColumnNames(), false);
}
@Override
public GeoList getDataSelected() {
return daView.getController().getDataSelected();
}
@Override
public GeoElement getRegressionModel() {
return daView.getRegressionModel();
}
@Override
public DataAnalysisModel.Regression getRegressionMode() {
return daView.getModel().getRegressionMode();
}
@Override
public boolean isValidData() {
return daView.getController().isValidData();
}
@Override
public void setValueAt(double value, int row, int col) {
statTable.setValueAt(daView.getModel().format(value), row,
col);
}
@Override
public boolean isViewValid() {
return daView == null || daView.getDataSource() == null;
}
@Override
public int getMode() {
return daView.getModel().getMode();
}
@Override
public GroupType groupType() {
return daView.groupType();
}
@Override
public boolean isNumericData() {
return daView.getDataSource().isNumericData();
}
public StatTableModel getModel() {
return model;
}
}