package org.geogebra.web.web.gui.dialog.options;
import org.geogebra.common.euclidian.EuclidianView;
import org.geogebra.common.euclidian.event.KeyEvent;
import org.geogebra.common.euclidian.event.KeyHandler;
import org.geogebra.common.gui.SetLabels;
import org.geogebra.common.gui.dialog.options.model.AxisModel;
import org.geogebra.common.gui.dialog.options.model.AxisModel.IAxisModelListener;
import org.geogebra.common.main.Localization;
import org.geogebra.web.html5.event.FocusListenerW;
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.web.gui.util.ComboBoxW;
import org.geogebra.web.web.gui.util.NumberListBox;
import org.geogebra.web.web.gui.view.algebra.InputPanelW;
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.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 AxisPanel extends FlowPanel implements SetLabels, IAxisModelListener {
private AxisModel model;
protected CheckBox cbShowAxis, cbAxisNumber, cbManualTicks,
cbPositiveAxis,
cbDrawAtBorder, cbAllowSelection;
protected NumberListBox ncbTickDist;
protected ListBox lbTickStyle;
private ComboBoxW comboAxisLabel, comboUnitLabel;
protected AutoCompleteTextFieldW tfCross;
private Label crossAt;
private Label axisTicks;
private Label axisLabel;
private Label axisUnitLabel;
private AppW app;
protected EuclidianView view;
private Localization loc;
/******************************************************
* @param app
* @param view
* @param axis
*/
public AxisPanel(AppW app, EuclidianView view, int axis, boolean view3D) {
this.app = app;
this.loc = app.getLocalization();
this.view = view;
model = new AxisModel(app, view, axis, this);
this.addStyleName("axisPanel");
String strAxisEn = model.getAxisName();
// this.setBorder(LayoutUtil.titleBorder(loc.getMenu(strAxisEn)));
// show axis
cbShowAxis = new CheckBox(loc.getMenu("Show" + strAxisEn));
cbShowAxis.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
model.showAxis(cbShowAxis.getValue());
}});
// show numbers
cbAxisNumber = new CheckBox(loc.getMenu("ShowAxisNumbers"));
cbAxisNumber.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
model.showAxisNumbers(cbAxisNumber.getValue());
}});
// show positive axis only
cbPositiveAxis = new CheckBox(loc.getMenu("PositiveDirectionOnly"));
cbPositiveAxis.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
model.applyPositiveAxis(cbPositiveAxis.getValue());
}});
// allow axis selection
cbAllowSelection = new CheckBox(loc.getMenu("SelectionAllowed"));
cbAllowSelection.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
model.applyAllowSelection(cbAllowSelection.getValue());
}
});
// ticks
axisTicks = new Label(loc.getMenu("AxisTicks") + ":");
lbTickStyle = new ListBox();
model.fillTicksCombo();
lbTickStyle.addChangeHandler(new ChangeHandler(){
@Override
public void onChange(ChangeEvent event) {
int type = lbTickStyle.getSelectedIndex();
model.applyTickStyle(type);
// view.updateBackground();
// updatePanel();
}});
FlowPanel showTicksPanel = new FlowPanel();
showTicksPanel.add(axisTicks);
showTicksPanel.add(lbTickStyle);
// distance
cbManualTicks = new CheckBox(loc.getMenu("TickDistance") + ":");
cbManualTicks.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
boolean isTickDistanceOn = cbManualTicks.getValue();
model.applyTickDistance(isTickDistanceOn);
ncbTickDist.setEnabled(isTickDistanceOn);
if (isTickDistanceOn) {
model.applyTickDistance(ncbTickDist.getValue());
}
}});
ncbTickDist = new NumberListBox(app){
@Override
protected void onValueChange(String value) {
model.applyTickDistance(ncbTickDist.getValue());
}};
FlowPanel distancePanel = new FlowPanel();
distancePanel.add(cbManualTicks);
distancePanel.add(ncbTickDist);
// axis and unit label
comboAxisLabel = new ComboBoxW(app) {
@Override
protected void onValueChange(String value) {
String text = comboAxisLabel.getValue().trim();
model.applyAxisLabel(text);
}};
comboAxisLabel.setEnabled(true);
model.fillAxisCombo();
axisLabel = new Label(loc.getMenu("AxisLabel") + ":");
axisUnitLabel = new Label(loc.getMenu("AxisUnitLabel") + ":");
comboUnitLabel = new ComboBoxW(app) {
@Override
protected void onValueChange(String value) {
String text = comboUnitLabel.getValue().trim();
model.applyUnitLabel(text);
}};
model.fillUnitLabel();
comboUnitLabel.setEnabled(true);
FlowPanel labelPanel = new FlowPanel();
labelPanel.add(axisLabel);
labelPanel.add(comboAxisLabel);
FlowPanel unitPanel = new FlowPanel();
unitPanel.add(axisUnitLabel);
unitPanel.add(comboUnitLabel);
// cross at and stick to edge
InputPanelW input = new InputPanelW(null, app, 1, -1, true);
tfCross = input.getTextComponent();
tfCross.setAutoComplete(false);
tfCross.removeSymbolTable();
tfCross.addKeyHandler(new KeyHandler() {
@Override
public void keyReleased(KeyEvent e) {
if (e.isEnterKey()) {
model.applyCrossing(tfCross.getText());
}
}});
tfCross.addFocusListener(new FocusListenerW(this){
@Override
protected void wrapFocusLost(){
model.applyCrossing(tfCross.getText());
}
});
crossAt = new Label(loc.getMenu("CrossAt") + ":");
cbDrawAtBorder = new CheckBox(loc.getMenu("StickToEdge"));
cbDrawAtBorder.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
model.applyDrawAtBorder(cbDrawAtBorder.getValue());
}});
FlowPanel crossPanel = LayoutUtilW.panelRow(crossAt, tfCross, cbDrawAtBorder);
cbShowAxis.setStyleName("checkBoxPanel");
cbAxisNumber.setStyleName("checkBoxPanel");
cbPositiveAxis.setStyleName("checkBoxPanel");
distancePanel.setStyleName("listBoxPanel");
showTicksPanel.setStyleName("listBoxPanel");
labelPanel.setStyleName("listBoxPanel");
unitPanel.setStyleName("listBoxPanel");
tfCross.setStyleName("numberInput");
cbAllowSelection.setStyleName("checkBoxPanel");
// add all panels
add(cbShowAxis);
add(cbAxisNumber);
add(cbPositiveAxis);
add(distancePanel);
add(showTicksPanel);
add(labelPanel);
add(unitPanel);
if (!view3D){
add(crossPanel);
}
add(cbAllowSelection);
updatePanel();
}
public void updateView(EuclidianView view) {
this.view = view;
model.setView(view);
}
public void updatePanel() {
int axis = model.getAxis();
cbAxisNumber.setValue(view.getShowAxesNumbers()[axis]);
cbManualTicks
.setValue(!view.isAutomaticAxesNumberingDistance()[axis]);
ncbTickDist.setSelectedId(model.getAxisDistance());
ncbTickDist.setEnabled(cbManualTicks.getValue());
comboAxisLabel.setSelectedId(view.getAxesLabels(true)[axis]);
comboUnitLabel.setSelectedId(view.getAxesUnitLabels()[axis]);
int type = view.getAxesTickStyles()[axis];
lbTickStyle.setSelectedIndex(type);
// cbShowAxis.setSelected(axis == 0 ? view.getShowXaxis() :
// view.getShowYaxis());
setShowAxis(view.getShowAxis(axis));
if (view.getDrawBorderAxes()[axis]) {
tfCross.setText("");
} else {
tfCross.setText("" + view.getAxesCross()[axis]);
}
tfCross.setVisible(!view.getDrawBorderAxes()[axis]);
cbPositiveAxis.setValue(view.getPositiveAxes()[axis]);
cbDrawAtBorder.setValue(view.getDrawBorderAxes()[axis]);
cbAllowSelection.setValue(getModel().isSelectionAllowed());
}
public void setShowAxis(boolean value) {
cbShowAxis.setValue(value);
}
@Override
public void setLabels() {
String strAxisEn = model.getAxisName();
// this.setBorder(LayoutUtil.titleBorder(loc.getMenu(strAxisEn)));
// this.setBorder(LayoutUtil.titleBorder(null));
cbShowAxis.setText(loc.getMenu("Show" + strAxisEn));
cbAxisNumber.setText(loc.getMenu("ShowAxisNumbers"));
cbManualTicks.setText(loc.getMenu("TickDistance") + ":");
axisTicks.setText(loc.getMenu("AxisTicks") + ":");
cbPositiveAxis.setText(loc.getMenu("PositiveDirectionOnly"));
axisLabel.setText(loc.getMenu("AxisLabel") + ":");
axisUnitLabel.setText(loc.getMenu("AxisUnitLabel") + ":");
crossAt.setText(loc.getMenu("CrossAt") + ":");
cbDrawAtBorder.setText(loc.getMenu("StickToEdge"));
cbAllowSelection.setText(loc.getMenu("SelectionAllowed"));
}
protected double parseDouble(String text) {
if (text == null || "".equals(text)) {
return Double.NaN;
}
return app.getKernel().getAlgebraProcessor().evaluateToDouble(text);
}
protected String getString() {
return model.getAxisName();
}
//
// public void updateFont() {
// Font font = app.getPlainFont();
//
// setFont(font);
//
// cbShowAxis.setFont(font);
// cbAxisNumber.setFont(font);
// cbManualTicks.setFont(font);
// axisTicks.setFont(font);
// cbPositiveAxis.setFont(font);
// axisLabel.setFont(font);
// axisUnitLabel.setFont(font);
// crossAt.setFont(font);
// stickToEdge.setFont(font);
//
// ncbTickDist.setFont(font);
//
// lbTickStyle.setFont(font);
// lbAxisLabel.setFont(font);
// lbUnitLabel.setFont(font);
//
// tfCross.setFont(font);
// }
@Override
public void addTickItem(String item) {
lbTickStyle.addItem(item);
}
@Override
public void addAxisLabelItem(String item) {
comboAxisLabel.addItem(item == null ? "": item);
}
@Override
public void addUnitLabelItem(String item) {
comboUnitLabel.addItem(item == null ? "": item);
}
@Override
public void setCrossText(String text) {
tfCross.setText(text);
}
public AxisModel getModel() {
return model;
}
}