package net.demilich.metastone.gui.common;

import com.sun.javafx.scene.control.skin.ComboBoxListViewSkin;

import javafx.event.EventHandler;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;

public class ComboBoxKeyHandler<T> implements EventHandler<KeyEvent> {

	private static final long WORD_DELAY = 2000;

	private String s;
	private final ComboBox<T> box;
	private long lastKeyPress;

	public ComboBoxKeyHandler(ComboBox<T> box) {
		this.box = box;
		s = "";
	}

	@Override
	public void handle(KeyEvent event) {
		if (System.currentTimeMillis() - WORD_DELAY > lastKeyPress) {
			s = "";
		}
		// handle non alphanumeric keys like backspace, delete etc
		if (event.getCode() == KeyCode.BACK_SPACE && s.length() > 0)
			s = s.substring(0, s.length() - 1);
		else
			s += event.getText();

		lastKeyPress = System.currentTimeMillis();

		if (s.length() == 0) {
			select(0);
			return;
		}

		for (T item : box.getItems()) {

			String name = box.getConverter().toString(item).toLowerCase();
			if (name.startsWith(s)) {
				select(item);
				return;
			}
		}
		// nothing found, reset search string
		s = "";
	}

	private void select(int index) {
		select(box.getItems().get(index));
	}

	@SuppressWarnings("rawtypes")
	private void select(T item) {
		box.getSelectionModel().select(item);
		ListView lv = ((ComboBoxListViewSkin) box.getSkin()).getListView();
		lv.scrollTo(lv.getSelectionModel().getSelectedIndex());
	}

}