package org.geogebra.web.web.gui.view.data;
import org.geogebra.common.gui.view.data.DataAnalysisModel;
import org.geogebra.common.gui.view.data.StatisticsModel;
import org.geogebra.common.gui.view.data.StatisticsModel.IStatisticsModelListener;
import org.geogebra.web.html5.main.AppW;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.ListBox;
/**
*
* Extended JPanel that displays: (1) summary statistics for the current data
* set (2) interactive panels for performing statistical inference with the
* current data set
*
* @author G. Sturr
*
*/
public class StatisticsPanelW extends FlowPanel implements StatPanelInterfaceW,
IStatisticsModelListener {
private static final String SEPARATOR = "-------------------";
private StatisticsModel model;
// inference mode selection
private ListBox lbInferenceMode;
// panels
private BasicStatTableW statTable;
private OneVarInferencePanelW oneVarInferencePanel;
// private LinearRegressionPanelW regressionPanel;
private TwoVarInferencePanelW twoVarInferencePanel;
private ANOVATableW anovaTable;
private MultiVarStatPanelW minMVStatPanel;
private FlowPanel selectionPanel;
private FlowPanel inferencePanel;
// ggb fields
private DataAnalysisViewW statDialog;
private AppW app;
private DataAnalysisModel daModel;
/*************************************
* Constructor
*
* @param app
* @param statDialog
*/
public StatisticsPanelW(AppW app, DataAnalysisViewW statDialog) {
this.app = app;
this.statDialog = statDialog;
this.daModel = statDialog.getModel();
model = new StatisticsModel(app, daModel, this);
// create the sub-panels
createSelectionPanel();
createStatTable();
if (statTable != null) {
inferencePanel = new FlowPanel();
inferencePanel.add(statTable);
add(selectionPanel);
add(inferencePanel);
setLabels();
}
}
/**
* Creates a table to display summary statistics for the current data set(s)
*/
private void createStatTable() {
// create a statTable according to dialog type
if (daModel.getMode() == DataAnalysisModel.MODE_ONEVAR) {
statTable = new BasicStatTableW(app, statDialog);
} else if (daModel.getMode() == DataAnalysisModel.MODE_REGRESSION) {
statTable = new BasicStatTableW(app, statDialog);
} else if (daModel.getMode() == DataAnalysisModel.MODE_MULTIVAR) {
statTable = new MultiVarStatPanelW(app, statDialog);
}
}
/**
* Reconfigures the panel layout according to the current selected inference
* mode
*/
private void setInferencePanel() {
if (inferencePanel == null) {
return;
}
inferencePanel.clear();
switch (model.getSelectedMode()) {
case StatisticsModel.INFER_TTEST:
case StatisticsModel.INFER_ZTEST:
case StatisticsModel.INFER_ZINT:
case StatisticsModel.INFER_TINT:
inferencePanel.add(getOneVarInferencePanel());
break;
case StatisticsModel.INFER_TTEST_2MEANS:
case StatisticsModel.INFER_TINT_2MEANS:
inferencePanel.add(getTwoVarInferencePanel(true));
break;
case StatisticsModel.INFER_TTEST_PAIRED:
case StatisticsModel.INFER_TINT_PAIRED:
inferencePanel.add(getTwoVarInferencePanel(false));
break;
case StatisticsModel.INFER_ANOVA:
inferencePanel.add(getAnovaTable());
inferencePanel.add(getMinMVStatPanel());
break;
default:
inferencePanel.add(statTable);
}
statDialog.updateStatDataPanelVisibility();
}
private void createSelectionPanel() {
createInferenceTypeComboBox();
selectionPanel = new FlowPanel();
selectionPanel.add(lbInferenceMode);
}
private ANOVATableW getAnovaTable() {
if (anovaTable == null) {
anovaTable = new ANOVATableW(app, statDialog);
}
return anovaTable;
}
private OneVarInferencePanelW getOneVarInferencePanel() {
if (oneVarInferencePanel == null) {
oneVarInferencePanel = new OneVarInferencePanelW(app, statDialog);
}
return oneVarInferencePanel;
}
private TwoVarInferencePanelW getTwoVarInferencePanel() {
if (twoVarInferencePanel == null) {
twoVarInferencePanel = new TwoVarInferencePanelW(app, statDialog);
}
return twoVarInferencePanel;
}
private TwoVarInferencePanelW getTwoVarInferencePanel(boolean pooled) {
TwoVarInferencePanelW p = getTwoVarInferencePanel();
p.setEnablePooled(pooled);
return p;
}
private MultiVarStatPanelW getMinMVStatPanel() {
if (minMVStatPanel == null) {
minMVStatPanel = new MultiVarStatPanelW(app, statDialog);
}
minMVStatPanel.setMinimalTable(true);
return minMVStatPanel;
}
/**
* Creates the JComboBox that selects inference mode
*/
private void createInferenceTypeComboBox() {
if (lbInferenceMode == null) {
lbInferenceMode = new ListBox();
lbInferenceMode.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
actionPerformed(lbInferenceMode);
}
});
} else {
lbInferenceMode.clear();
}
model.fillInferenceModes();
}
@Override
public void setLabels() {
statTable.setLabels();
}
@Override
public void updatePanel() {
// System.out.println("============= update stat panel");
if (statTable == null) {
return;
}
statTable.updatePanel();
model.update();
// this.setMinimumSize(this.getPreferredSize());
statDialog.updateStatDataPanelVisibility();
}
public void actionPerformed(Object source) {
int idx = lbInferenceMode.getSelectedIndex();
if (source == lbInferenceMode
&& idx != -1) {
model.selectInferenceMode(lbInferenceMode.getValue(idx));
setInferencePanel();
updatePanel();
}
}
@Override
public void addInferenceMode(String item) {
lbInferenceMode.addItem(item);
}
@Override
public void selectInferenceMode(String item) {
for (int idx=0; idx < lbInferenceMode.getItemCount(); idx++) {
String s = lbInferenceMode.getItemText(idx);
if (s.equals(item)) {
lbInferenceMode.setSelectedIndex(idx);
return;
}
}
lbInferenceMode.setSelectedIndex(0);
}
@Override
public String getSeparator() {
return SEPARATOR;
}
@Override
public void updateOneVarInference(int mode) {
getOneVarInferencePanel().setSelectedPlot(mode);
getOneVarInferencePanel().updatePanel();
}
@Override
public void updateTwoVarInference(int mode) {
getTwoVarInferencePanel().setSelectedInference(mode);
getTwoVarInferencePanel().updatePanel();
}
@Override
public void updateAnovaTable() {
getAnovaTable().updatePanel();
getMinMVStatPanel().updatePanel();
}
public double estimateHeight(int rows) {
switch (model.getSelectedMode()) {
case StatisticsModel.INFER_TTEST:
case StatisticsModel.INFER_ZTEST:
case StatisticsModel.INFER_ZINT:
case StatisticsModel.INFER_TINT:
// inferencePanel.add(getOneVarInferencePanel());
return 150;
case StatisticsModel.INFER_TTEST_2MEANS:
case StatisticsModel.INFER_TINT_2MEANS:
// /inferencePanel.add(getTwoVarInferencePanel(true));
return 320;
case StatisticsModel.INFER_TTEST_PAIRED:
case StatisticsModel.INFER_TINT_PAIRED:
// inferencePanel.add(getTwoVarInferencePanel(false));
return 320;
case StatisticsModel.INFER_ANOVA:
return 200 + rows * 20;
default:
return 70 + rows * 20;
}
}
}