package org.geogebra.web.web.gui.util;
import org.geogebra.common.euclidian.event.KeyEvent;
import org.geogebra.common.euclidian.event.KeyHandler;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.web.html5.event.FocusListenerW;
import org.geogebra.web.html5.gui.inputfield.AutoCompleteTextFieldW;
import org.geogebra.web.html5.gui.inputfield.AutoCompleteTextFieldW.InsertHandler;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.web.gui.advanced.client.datamodel.ListDataModel;
import org.geogebra.web.web.gui.advanced.client.datamodel.ListModelEvent;
import org.geogebra.web.web.gui.advanced.client.ui.widget.ComboBox;
import org.geogebra.web.web.gui.advanced.client.ui.widget.combo.DropDownPosition;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.user.client.ui.PopupPanel;
/**
* Combo box
*/
public abstract class ComboBoxW extends ComboBox<ListDataModel> {
private static final int DEFAULT_VISIBLE_ROWS = 10;
private static final String DEFAULT_WIDTH = "90px";
/**
* @param app
* application
*/
public ComboBoxW(AppW app) {
super(app);
setCustomTextAllowed(true);
setDropDownPosition(DropDownPosition.UNDER);
setEnterAction(EnterAction.DO_NOTHING);
setVisibleRows(DEFAULT_VISIBLE_ROWS);
setWidth(DEFAULT_WIDTH);
this.prepareChoiceButton();
this.setChoiceButtonVisible(true);
addCloseHandler(new CloseHandler<PopupPanel>() {
@Override
public void onClose(CloseEvent<PopupPanel> event) {
onValueChange(getValue());
}
});
addKeyDownHandler(new KeyDownHandler(){
@Override
public void onKeyDown(KeyDownEvent event) {
if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
onValueChange(getValue());
}
}});
//
final AutoCompleteTextFieldW tf = getSelectedValue();
tf.addStyleName("AutoCompleteTextFieldW");
tf.addFocusListener(new FocusListenerW(this) {
@Override
public void onFocus(FocusEvent event) {
super.onFocus(event);
}
@Override
public void onBlur(BlurEvent event) {
onValueChange(tf.getText());
super.onBlur(event);
}
});
tf.addKeyHandler(new KeyHandler() {
@Override
public void keyReleased(KeyEvent e) {
if (e.isEnterKey()) {
onValueChange(tf.getText());
}
}
});
tf.addInsertHandler(new InsertHandler() {
@Override
public void onInsert(String text) {
ComboBoxW.this.onValueChange(text);
}
});
}
@Override
protected void select(ListModelEvent event) {
if (isListPanelOpened()) {
return;
}
super.select(event);
}
/**
* @param value
* changed value
*/
protected abstract void onValueChange(String value);
/**
* @param item
* new item
*/
public void addItem(String item) {
getModel().add(item, item);
}
/**
* @param id
* item description
* @param item
* item (used for color)
*/
public void addItem(String id, GeoElement item) {
getModel().add(id, item);
}
}