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); } }