package org.geogebra.web.web.gui.view.data;
import org.geogebra.common.euclidian.event.KeyEvent;
import org.geogebra.common.euclidian.event.KeyHandler;
import org.geogebra.common.gui.view.data.TwoVarInferenceModel;
import org.geogebra.common.gui.view.data.TwoVarInferenceModel.TwoVarInferenceListener;
import org.geogebra.common.gui.view.data.TwoVarInferenceModel.UpdatePanel;
import org.geogebra.common.kernel.geos.GeoList;
import org.geogebra.common.main.Localization;
import org.geogebra.web.html5.gui.inputfield.AutoCompleteTextFieldW;
import org.geogebra.web.html5.gui.util.LayoutUtilW;
import org.geogebra.web.html5.main.AppW;
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.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
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.ListBox;
public class TwoVarInferencePanelW extends FlowPanel implements StatPanelInterfaceW,
TwoVarInferenceListener, UpdatePanel {
private AppW app;
private DataAnalysisViewW daView;
private StatTableW resultTable;
private ListBox lbTitle1, lbTitle2, lbAltHyp;
private Label lblTitle1, lblTitle2, lblHypParameter, lblTailType, lblNull,
lblConfLevel, lblResultHeader;
private AutoCompleteTextFieldW fldNullHyp;
private FlowPanel resultPanel;
private CheckBox ckEqualVariances;
private AutoCompleteTextFieldW fldConfLevel;
private boolean isIniting;
private FlowPanel testPanel;
private FlowPanel intPanel;
private FlowPanel mainPanel;
private FlowPanel samplePanel;
private TwoVarStatPanelW twoStatPanel;
private TwoVarInferenceModel model;
private boolean enablePooled;
private CheckBox ckPooled;
private Localization loc;
/**
* Construct a TwoVarInference panel
*/
public TwoVarInferencePanelW(AppW app, DataAnalysisViewW view) {
isIniting = true;
this.app = app;
this.loc = app.getLocalization();
this.daView = view;
model = new TwoVarInferenceModel(app, this);
this.createGUIElements();
this.updateGUI();
this.setLabels();
setStyleName("daTwoVarInference");
isIniting = false;
this.enablePooled = false;
}
// ============================================================
// Create GUI
// ============================================================
private void createGUIElements() {
// components
lbTitle1 = new ListBox();
lbTitle2 = new ListBox();
lbTitle1.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
actionPerformed(lbTitle1);
}
});
lbTitle2.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
actionPerformed(lbTitle2);
}
});
lblTitle1 = new Label();
lblTitle2 = new Label();
ckPooled = new CheckBox();
ckPooled.addStyleName("ckPooled");
ckPooled.setValue(false);
ckPooled.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange(ValueChangeEvent<Boolean> event) {
model.setPooled(ckPooled.getValue());
}
});
ckEqualVariances = new CheckBox();
lbAltHyp = new ListBox();
lbAltHyp.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
actionPerformed(lbAltHyp);
}
});
lblNull = new Label();
lblHypParameter = new Label();
lblTailType = new Label();
fldNullHyp = new AutoCompleteTextFieldW(4, app);
fldNullHyp.setText("" + 0);
fldNullHyp.addKeyHandler(new KeyHandler(){
@Override
public void keyReleased(KeyEvent e) {
if (e.isEnterKey()) {
doTextFieldActionPerformed(fldNullHyp);
}
}});
fldNullHyp.addBlurHandler(new BlurHandler() {
@Override
public void onBlur(BlurEvent event) {
doTextFieldActionPerformed(fldNullHyp);
}
});
lblConfLevel = new Label();
fldConfLevel = new AutoCompleteTextFieldW(4, app);
fldConfLevel.setColumns(4);
fldConfLevel.addKeyHandler(new KeyHandler(){
@Override
public void keyReleased(KeyEvent e) {
if (e.isEnterKey()) {
doTextFieldActionPerformed(fldConfLevel);
}
}});
fldConfLevel.addBlurHandler(new BlurHandler() {
@Override
public void onBlur(BlurEvent event) {
doTextFieldActionPerformed(fldConfLevel);
}
});
lblResultHeader = new Label();
// test panel
testPanel = new FlowPanel();
testPanel.add(LayoutUtilW.panelRow(lblNull, lblHypParameter));
testPanel.add(LayoutUtilW.panelRow(lblTailType, lbAltHyp));
intPanel = new FlowPanel();
intPanel.add(LayoutUtilW.panelRow(lblConfLevel, fldConfLevel));
twoStatPanel = new TwoVarStatPanelW(app, daView, model.isPairedData(), this);
samplePanel = new FlowPanel();
samplePanel.add(twoStatPanel);
// Result panel
resultTable = new StatTableW();
model.setResults();
resultPanel = new FlowPanel();
resultPanel.add(resultTable);
// main panel
mainPanel = new FlowPanel();
add(ckPooled);
add(mainPanel);
}
private void updateMainPanel() {
mainPanel.clear();
// layout
if (model.isTest()) {
mainPanel.add(testPanel);
} else {
mainPanel.add(intPanel);
}
mainPanel.add(samplePanel);
// mainPanel.add(ckEqualVariances,c);
mainPanel.add(resultPanel);
// resultTable.getTable().setRowHeight(
// twoStatPanel.getTable().getRowHeight());
}
// ============================================================
// Updates and Event Handlers
// ============================================================
private void updateGUI() {
if (model.isTest()) {
lblHypParameter.setText(model.getNullHypName() + " = 0");
}
// ckEqualVariances.setVisible(
// selectedPlot == StatisticsModel.INFER_TINT_2MEANS
// || selectedPlot == StatisticsModel.INFER_TTEST_2MEANS);
ckEqualVariances.setValue(model.isPooled());
updateNumberField(fldNullHyp, model.getHypMean());
updateNumberField(fldConfLevel, model.getConfLevel());
updateCBAlternativeHyp();
model.setResults();
model.updateResults();
updateMainPanel();
twoStatPanel.updatePanel();
}
/** Helper method for updateGUI() */
private void updateNumberField(AutoCompleteTextFieldW fld, double n) {
fld.setText(daView.format(n));
}
private void updateCBAlternativeHyp() {
lbAltHyp.clear();
model.fillAlternateHyp();
}
public void setSelectedInference(int selectedPlot) {
model.setSelectedInference(selectedPlot);
if (!isIniting) {
model.setResults();
this.twoStatPanel.setTable(model.isPairedData());
}
updateGUI();
}
@Override
public void setLabels() {
lblResultHeader.setText(loc.getMenu("Result") + ": ");
lblTitle1.setText(loc.getMenu("Sample1") + ": ");
lblTitle2.setText(loc.getMenu("Sample2") + ": ");
lblNull.setText(loc.getMenu("NullHypothesis") + ": ");
lblTailType.setText(loc.getMenu("AlternativeHypothesis") + ": ");
// lblCI.setText("Interval Estimate");
lblConfLevel.setText(loc.getMenu("ConfidenceLevel") + ": ");
// btnCalc.setText(loc.getMenu("Calculate"));
ckEqualVariances.setText(loc.getMenu("EqualVariance"));
ckPooled.setText(loc.getMenu("Pooled"));
}
@Override
public void updatePanel() {
model.updateResults();
updateGUI();
}
public void actionPerformed(Object source) {
if (source instanceof AutoCompleteTextFieldW) {
doTextFieldActionPerformed((AutoCompleteTextFieldW) source);
}
else if (source == lbAltHyp) {
model.applyTail(lbAltHyp.getSelectedIndex());
}
else if (source == lbTitle1 || source == lbTitle2) {
model.updateResults();
}
else if (source == ckEqualVariances) {
model.setPooled(ckEqualVariances.getValue());
}
}
private void doTextFieldActionPerformed(AutoCompleteTextFieldW source) {
if (isIniting) {
return;
}
Double value = Double.parseDouble(source.getText().trim());
if (source == fldConfLevel) {
model.setConfLevel(value);
updateGUI();
}
if (source == fldNullHyp) {
model.setHypMean(value);
updateGUI();
}
}
private Integer[] selectedDataIndex() {
return twoStatPanel.getSelectedDataIndex();
}
@Override
public void setStatTable(int row, String[] rowNames, int length,
String[] columnNames) {
resultTable.setStatTable(1, null, columnNames.length, columnNames);
}
@Override
public void setFormattedValueAt(double value, int row, int col) {
resultTable.setValueAt(daView.format(value), row, col);
}
@Override
public GeoList getDataSelected() {
return daView.getController().getDataSelected();
}
@Override
public int getSelectedDataIndex(int idx) {
return selectedDataIndex()[idx];
}
@Override
public double[] getValueArray(GeoList list) {
return daView.getController().getValueArray(list);
}
@Override
public void addAltHypItem(String name, String tail, double value) {
lbAltHyp.addItem(name + " " + tail + " " + daView.format(value));
}
@Override
public void selectAltHyp(int idx) {
lbAltHyp.setSelectedIndex(idx);
}
public boolean isEnablePooled() {
return enablePooled;
}
public void setEnablePooled(boolean enablePooled) {
this.enablePooled = enablePooled;
ckPooled.setVisible(enablePooled);
}
}