New component: Autocomplete for TextField

hi , its working on vaadin 7?

[code]
public class CAutoSuggest extends VerticalLayout {

// layout for popupview content, vertical
private VerticalLayout popUpLayout;
// autosuggestfld, field where listener triggers the popup to be shown
private CTextField autoSuggestFld;
// resultstable that shows the filtered values
private Table resultsTable;
// filterfld used to filter search request
private CTextField filterFld;
// popupview
private PopupView popupView;
private boolean isSearchOn = true;
private boolean tableRowSelected = false;
private List<AutoSuggestResultBean> resultset;
private String inputValue;
private AutoSuggestResultsetBuilder autoSuggestResultsetBuilder;
private boolean valueChanged = false;

public CAutoSuggest() {
    initAutoSuggestFld();
    initTable();
    initFilterFld();
    initPopUpLayout();
    initPopUpView();
    registerListeners();

    addComponent(autoSuggestFld);
    addComponent(popupView);
}

private void registerListeners() {
    registerAutoSuggestFldListeners();
    registerResultsTableListeners();
    registerPopUpViewListeners();
    registerFilterFldListeners();
}

private boolean filterFldListening = true;

private void registerFilterFldListeners() {
    filterFld.addListener(new ValueChangeListener() {

        @Override
        public void valueChange(ValueChangeEvent event) {
            if (valueChanged == true && filterFldListening) {
                inputValue = (String) event.getProperty().getValue();
                resultset = autoSuggestResultsetBuilder.getResultset();
                setResultsTableValues();
                valueChanged = false;
            }
        }
    });
    filterFld.addListener(new TextChangeListener() {

        @Override
        public void textChange(TextChangeEvent event) {
            if (filterFldListening) {
                inputValue = event.getText();
                resultset = autoSuggestResultsetBuilder.getResultset();
                setResultsTableValues();
            }
        }
    });
}

public interface AutoSuggestResultsetBuilder {
    public List<AutoSuggestResultBean> getResultset();
}

public void setResultsTableValues(
        AutoSuggestResultsetBuilder autoSuggestResultsetBuilder) {
    this.autoSuggestResultsetBuilder = autoSuggestResultsetBuilder;
}

private void registerPopUpViewListeners() {
    popupView.addListener(new PopupVisibilityListener() {
        public void popupVisibilityChange(PopupVisibilityEvent event) {
            if (!event.isPopupVisible()) {
                if (!tableRowSelected) {
                    autoSuggestListening = false;
                    autoSuggestFld.setValue("");
                    autoSuggestListening = true;
                }
                tableRowSelected = false;
                filterFldListening = false;
                filterFld.setValue("");
                filterFldListening = true;
            }
        }
    });
}

private void registerResultsTableListeners() {
    resultsTable.addListener(new ValueChangeListener() {
        public void valueChange(ValueChangeEvent event) {
            Object value = resultsTable.getValue();
            if (value != null) {
                autoSuggestListening = false;
                autoSuggestFld.setValue(resultsTable
                        .getContainerProperty(value, "value").getValue()
                        .toString());
                autoSuggestListening = true;
                tableRowSelected = true;
                popupView.setPopupVisible(false);
                filterFldListening = false;
                filterFld.setValue("");
                filterFldListening = true;
            }
        }
    });
}

private boolean autoSuggestListening = true;

private void registerAutoSuggestFldListeners() {
    autoSuggestFld.addListener(new TextChangeListener() {
        public void textChange(TextChangeEvent event) {
            if (event.getText().length() > 0 && isSearchOn
                    && autoSuggestListening) {
                popupView.setPopupVisible(true);
                valueChanged = true;
                filterFld.setValue(event.getText());
                filterFld.focus();
                filterFld.setCursorPosition(autoSuggestFld
                        .getCursorPosition());
            }
        }
    });
}

private void initTable() {
    resultsTable = new Table();
    resultsTable.setSelectable(true);
    resultsTable.addContainerProperty("id", String.class, null);
    resultsTable.addContainerProperty("value", String.class, null);
    resultsTable.setWidth("200px");
    resultsTable.setImmediate(true);
    resultsTable.setColumnHeaderMode(Table.COLUMN_HEADER_MODE_HIDDEN);
    resultsTable.setVisibleColumns(new Object { "value" });
}

public void setResultsTableValues(List<AutoSuggestResultBean> values) {
    resultsTable.removeAllItems();
    for (AutoSuggestResultBean bean : values) {
        Object item = resultsTable.addItem();
        resultsTable.getContainerProperty(item, "id")
                .setValue(bean.getId());
        resultsTable.getContainerProperty(item, "value").setValue(
                bean.getValue());
    }
}

public void setResultsTableValues() {
    resultsTable.removeAllItems();
    for (AutoSuggestResultBean bean : resultset) {
        Object item = resultsTable.addItem();
        resultsTable.getContainerProperty(item, "id")
                .setValue(bean.getId());
        resultsTable.getContainerProperty(item, "value").setValue(
                bean.getValue());
    }
}

private void initAutoSuggestFld() {
    autoSuggestFld = new CTextField();
    autoSuggestFld.setWidth("100px");
    autoSuggestFld.setImmediate(true);
}

private void initFilterFld() {
    filterFld = new CTextField();
    filterFld.setWidth("200px");
    filterFld.setImmediate(true);
}

private void initPopUpLayout() {
    popUpLayout = new VerticalLayout();
    popUpLayout.setWidth("200px");
    popUpLayout.addComponent(filterFld);
    popUpLayout.addComponent(resultsTable);
}

private void initPopUpView() {
    popupView = new PopupView(null, popUpLayout);
    popupView.setHideOnMouseOut(false);
}

public VerticalLayout getPopUpLayout() {
    return popUpLayout;
}

public CTextField getAutoSuggestFld() {
    return autoSuggestFld;
}

public Table getResultsTable() {
    return resultsTable;
}

public CTextField getFilterFld() {
    return filterFld;
}

public PopupView getPopupView() {
    return popupView;
}

public boolean isSearchOn() {
    return isSearchOn;
}

public void setSearchOn(boolean isSearchOn) {
    this.isSearchOn = isSearchOn;
}

public void setMaxLength(int maxLength) {
    this.autoSuggestFld.setMaxLength(maxLength);
    this.filterFld.setMaxLength(maxLength);
}

public String getInputValue() {
    return inputValue;
}

}

public class AutoSuggestResultBean {

private String id;
private String value;

public AutoSuggestResultBean() {
    super();
}

public AutoSuggestResultBean(String id, String value) {
    this();
    this.id = id;
    this.value = value;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getValue() {
    return value;
}

public void setValue(String value) {
    this.value = value;
}

}
[/code]When implementing:

CAutoSuggest workOrderSuggestFld = new CAutoSuggest();
        workOrderSuggestFld
                .setResultsTableValues(new AutoSuggestResultsetBuilder() {

                    @Override
                    public List<AutoSuggestResultBean> getResultset() {
                        
                        return myMethodReturnsAListOfAutoSuggestResultBean();
                    }
                })

This works currently, it’s not an addon, just customized a few classes. Would be really happy if someone could improve the code. By the way built with vaadin 6. Just change the listeners and I guess it’ll work for vaadin 7.

15501.java (522 Bytes)
15502.java (6.75 KB)
15503.java (2.34 KB)

I’v been a problem with this component, when I use like this :

field.setValue(“Any value”)

The field stay empty.

anybody have this problems with this ?