package org.geogebra.web.web.gui.view.data;
import java.util.ArrayList;
import org.geogebra.common.euclidian.event.KeyEvent;
import org.geogebra.common.euclidian.event.KeyHandler;
import org.geogebra.common.gui.view.data.OneVarModel;
import org.geogebra.common.gui.view.data.StatisticsModel;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.geos.GeoList;
import org.geogebra.web.html5.gui.inputfield.AutoCompleteTextFieldW;
import org.geogebra.web.html5.gui.util.LayoutUtilW;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.html5.main.LocalizationW;
import org.geogebra.web.web.gui.view.algebra.InputPanelW;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
/**
* Extended JPanel that contains interactive sub-panels for performing one
* variable inference with the current data set.
*
* @author G. Sturr
*
*/
public class OneVarInferencePanelW extends FlowPanel implements ClickHandler, BlurHandler, StatPanelInterfaceW {
// ggb fields
private AppW app;
private Kernel kernel;
private DataAnalysisViewW statDialog;
private StatTableW resultTable;
// GUI
private Label lblHypParameter, lblTailType, lblNull, lblConfLevel,lblSigma, lblResultHeader;
private Button btnCalculate;
private AutoCompleteTextFieldW fldNullHyp, fldConfLevel, fldSigma;
private RadioButton btnLeft, btnRight, btnTwo;
private ListBox lbAltHyp;
private FlowPanel testPanel, intPanel, mainPanel, resultPanel;
private FlowPanel sigmaPanel;
private int fieldWidth = 6;
// statistics
// flags
private boolean isIniting;
private boolean isTest = true;
private boolean isZProcedure;
private LocalizationW loc;
private boolean enablePooled;
private final OneVarModel model;
private class ParamKeyHandler implements KeyHandler {
private Object source;
public ParamKeyHandler(Object source) {
this.source = source;
}
@Override
public void keyReleased(KeyEvent e) {
if (e.isEnterKey()) {
actionPerformed(source);
}
}
}
private class ParamBlurHandler implements BlurHandler {
private Object source;
public ParamBlurHandler(Object source) {
this.source = source;
}
@Override
public void onBlur(BlurEvent event) {
actionPerformed(source);
}
}
/***************************************
* Construct a OneVarInference panel
*/
public OneVarInferencePanelW(AppW app, DataAnalysisViewW statDialog) {
isIniting = true;
this.app = app;
this.loc = (LocalizationW)app.getLocalization();
this.kernel = app.getKernel();
this.model = new OneVarModel();
this.statDialog = statDialog;
this.statDialog.getController().loadDataLists(true);
this.createGUIElements();
this.updateGUI();
this.setLabels();
isIniting = false;
}
//============================================================
// Create GUI
//============================================================
private void createGUIElements(){
btnLeft = new RadioButton(OneVarModel.tail_left);
btnRight = new RadioButton(OneVarModel.tail_right);
btnTwo = new RadioButton(OneVarModel.tail_two);
FlowPanel group = new FlowPanel();
group.add(btnLeft);
group.add(btnRight);
group.add(btnTwo);
btnLeft.addClickHandler(this);
btnRight.addClickHandler(this);
btnTwo.addClickHandler(this);
btnTwo.setValue(true);
lbAltHyp = new ListBox();
lbAltHyp.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
actionPerformed(lbAltHyp);
}
});
lblNull = new Label();
lblNull.setStyleName("panelTitle");
lblHypParameter = new Label();
lblTailType = new Label();
lblTailType.setStyleName("panelTitle");
fldNullHyp = (new InputPanelW(app, -1, false)).getTextComponent();
fldNullHyp.setColumns(fieldWidth);
fldNullHyp.setText("" + 0);
fldNullHyp.addKeyHandler(new ParamKeyHandler(fldNullHyp));
fldNullHyp.addBlurHandler(new ParamBlurHandler(fldNullHyp));
lblConfLevel = new Label();
lblConfLevel.setStyleName("panelTitle");
fldConfLevel = (new InputPanelW(app, -1, false)).getTextComponent();
fldConfLevel.setColumns(fieldWidth);
fldConfLevel.addKeyHandler(new ParamKeyHandler(fldConfLevel));
fldConfLevel.addBlurHandler(new ParamBlurHandler(fldConfLevel));
lblSigma = new Label();
fldSigma = (new InputPanelW(app, -1, false)).getTextComponent();
fldSigma.setColumns(fieldWidth);
fldSigma.addKeyHandler(new ParamKeyHandler(fldSigma));
fldSigma.addBlurHandler(new ParamBlurHandler(fldSigma));
btnCalculate = new Button();
lblResultHeader = new Label();
lblResultHeader.setStyleName("panelTitle");
sigmaPanel = new FlowPanel();
sigmaPanel.add(LayoutUtilW.panelRowIndent(lblSigma, fldSigma));
// // test panel
testPanel = new FlowPanel();
testPanel.add(lblNull);
testPanel.add(LayoutUtilW.panelRowIndent(lblHypParameter, fldNullHyp));
testPanel.add(lblTailType);
testPanel.add(LayoutUtilW.panelRowIndent(lbAltHyp));
// // CI panel
intPanel = new FlowPanel();
intPanel.add(lblConfLevel);
intPanel.add(fldConfLevel);
//
// // result panel
resultTable = new StatTableW();
resultTable.setStyleName("daStatistics");
setResultTable();
resultPanel = new FlowPanel();
resultPanel.add(lblResultHeader);
resultPanel.add(resultTable);
//
//
//
// main panel
mainPanel = new FlowPanel();
add(mainPanel);
add(resultPanel);
}
private void updateMainPanel(){
mainPanel.clear();
if(isZProcedure) {
mainPanel.add(sigmaPanel);
}
if(isTest) {
mainPanel.add(testPanel);
}
else {
mainPanel.add(intPanel);
}
mainPanel.add(resultPanel);
}
private void setResultTable(){
ArrayList<String> nameList = model.getNameList(loc);
String[] rowNames = new String[nameList.size()];
nameList.toArray(rowNames);
resultTable.setStatTable(rowNames.length, rowNames, 2, null);
}
private void updateResultTable(){
evaluate();
String cInt = statDialog.format(model.getMean()) + " \u00B1 "
+ statDialog.format(model.getMe());
switch (model.selectedPlot) {
default:
// do nothing
break;
case StatisticsModel.INFER_ZTEST:
resultTable.setValueAt(statDialog.format(model.getP()), 0, 1);
resultTable.setValueAt(statDialog.format(model.getTestStat()), 1, 1);
resultTable.setValueAt("", 2, 1);
resultTable.setValueAt(statDialog.format(model.getN()), 3, 1);
resultTable.setValueAt(statDialog.format(model.getMean()), 4, 1);
break;
case StatisticsModel.INFER_TTEST:
resultTable.setValueAt(statDialog.format(model.getP()), 0, 1);
resultTable.setValueAt(statDialog.format(model.getTestStat()), 1, 1);
resultTable.setValueAt(statDialog.format(model.getDf()), 2, 1);
resultTable.setValueAt(statDialog.format(model.getSe()), 3, 1);
resultTable.setValueAt("", 4, 1);
resultTable.setValueAt(statDialog.format(model.getN()), 5, 1);
resultTable.setValueAt(statDialog.format(model.getMean()), 6, 1);
break;
case StatisticsModel.INFER_ZINT:
resultTable.setValueAt(cInt,0,1);
resultTable.setValueAt(statDialog.format(model.getLower()), 1, 1);
resultTable.setValueAt(statDialog.format(model.getUpper()), 2, 1);
resultTable.setValueAt(statDialog.format(model.getMe()), 3, 1);
resultTable.setValueAt("", 4, 1);
resultTable.setValueAt(statDialog.format(model.getN()), 5, 1);
resultTable.setValueAt(statDialog.format(model.getMean()), 6, 1);
break;
case StatisticsModel.INFER_TINT:
resultTable.setValueAt(cInt,0,1);
resultTable.setValueAt(statDialog.format(model.getLower()), 1, 1);
resultTable.setValueAt(statDialog.format(model.getUpper()), 2, 1);
resultTable.setValueAt(statDialog.format(model.getMe()), 3, 1);
resultTable.setValueAt(statDialog.format(model.getDf()), 4, 1);
resultTable.setValueAt(statDialog.format(model.getSe()), 5, 1);
resultTable.setValueAt("", 6, 1);
resultTable.setValueAt(statDialog.format(model.getN()), 7, 1);
resultTable.setValueAt(statDialog.format(model.getMean()), 8, 1);
break;
}
}
//============================================================
// Updates and Event Handlers
//============================================================
@Override
public void setLabels() {
lblHypParameter.setText(loc.getMenu("HypothesizedMean.short") + " = " );
lblNull.setText(loc.getMenu("NullHypothesis") + ": ");
lblTailType.setText(loc.getMenu("AlternativeHypothesis") + ": ");
lblConfLevel.setText(loc.getMenu("ConfidenceLevel") + ": ");
lblResultHeader.setText(loc.getMenu("Result") + ": ");
lblSigma.setText(loc.getMenu("StandardDeviation.short") + " = ");
btnCalculate.setText(loc.getMenu("Calculate"));
}
/** Helper method for updateGUI() */
private void updateNumberField(AutoCompleteTextFieldW fld, double n){
fld.setText(statDialog.format(n));
//fld.setCaretPosition(0);
}
private void updateGUI(){
isTest = (model.selectedPlot == StatisticsModel.INFER_ZTEST
|| model.selectedPlot == StatisticsModel.INFER_TTEST);
isZProcedure = model.selectedPlot == StatisticsModel.INFER_ZTEST
|| model.selectedPlot == StatisticsModel.INFER_ZINT;
updateNumberField(fldNullHyp, model.hypMean);
updateNumberField(fldConfLevel, model.confLevel);
updateNumberField(fldSigma, model.sigma);
updateCBAlternativeHyp();
setResultTable();
updateResultTable();
updateMainPanel();
}
private void updateCBAlternativeHyp(){
lbAltHyp.clear();
lbAltHyp.addItem(loc.getMenu("HypothesizedMean.short") + " "
+ OneVarModel.tail_right + " "
+ statDialog.format(model.hypMean));
lbAltHyp.addItem(loc.getMenu("HypothesizedMean.short") + " "
+ OneVarModel.tail_left
+ " " + statDialog.format(model.hypMean));
lbAltHyp.addItem(loc.getMenu("HypothesizedMean.short") + " "
+ OneVarModel.tail_two
+ " " + statDialog.format(model.hypMean));
if (model.tail == OneVarModel.tail_right) {
lbAltHyp.setSelectedIndex(0);
} else if (model.tail == OneVarModel.tail_left) {
lbAltHyp.setSelectedIndex(1);
} else {
lbAltHyp.setSelectedIndex(2);
}
}
public void actionPerformed(Object source) {
if(isIniting) {
return;
}
if (source instanceof AutoCompleteTextFieldW) {
doTextFieldActionPerformed((AutoCompleteTextFieldW)source);
}
else if(source == lbAltHyp){
if(lbAltHyp.getSelectedIndex() == 0) {
model.tail = OneVarModel.tail_right;
} else if(lbAltHyp.getSelectedIndex() == 1) {
model.tail = OneVarModel.tail_left;
} else {
model.tail = OneVarModel.tail_two;
}
evaluate();
updateResultTable();
}
}
private void doTextFieldActionPerformed(AutoCompleteTextFieldW source) {
if(isIniting) {
return;
}
Double value = model.evaluateExpression(kernel,
source.getText().trim());
if(source == fldConfLevel){
model.confLevel = value;
evaluate();
updateGUI();
}
else if(source == fldNullHyp){
model.hypMean = value;
evaluate();
updateGUI();
}
else if(source == fldSigma){
model.sigma = value;
evaluate();
updateGUI();
}
}
public void setSelectedPlot(int selectedPlot){
model.selectedPlot = selectedPlot;
updateGUI();
}
@Override
public void updatePanel(){
evaluate();
updateGUI();
updateResultTable();
}
//============================================================
// Computation
//============================================================
private void evaluate(){
GeoList dataList = statDialog.getController().getDataSelected();
double[] sample = statDialog.getController().getValueArray(dataList);
model.evaluate(sample);
}
//============================================================
// GUI Utilities
//============================================================
public void onFocus(FocusEvent event) {
// TODO Auto-generated method stub
}
@Override
public void onClick(ClickEvent event) {
actionPerformed(event.getSource());
}
@Override
public void onBlur(BlurEvent event) {
// TODO Auto-generated method stub
doTextFieldActionPerformed((AutoCompleteTextFieldW)(event.getSource()));
}
public boolean isEnablePooled() {
return enablePooled;
}
public void setEnablePooled(boolean enablePooled) {
this.enablePooled = enablePooled;
}
}