private void setSelectItemEvents(final boolean async, final ObjectNameIdResolver resolver) { final ListModel model = listModel; model .getItemsChangedEvent() .addListener( new ChangedModelItemEventHandler(this, model) { public String getItemName(Object o) { return resolver.getItemName(o); } public String getItemId(Object o) { return resolver.getItemId(o); } }); model .getSelectedItemChangedEvent() .addListener( new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { if (async && getForm() == null) return; GWT.log("Item changed: " + getTitle() + " Changed to: " + model.getSelectedItem()); if (model.getSelectedItem() != null) setValue(resolver.getItemId(model.getSelectedItem())); else if (getDisplayValue() != null) setValue((String) null); // Clear the selected item } }); addChangedHandler( new BoxSelectItemChanged(model) { String getItemId(Object o) { return resolver.getItemId(o); } }); model .getPropertyChangedEvent() .addListener( new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { if (async && getForm() == null) return; String property = ((PropertyChangedEventArgs) args).PropertyName; if (property.equals("IsChangable")) { if (!model.getIsChangable()) { setShowDisabled(true); setDisabled(true); } else { setDisabled(false); } } else if (property.equals("IsAvailable")) { if (!model.getIsAvailable()) { hide(); } else { show(); } } else if (property.equals("IsValid")) { if (!listModel.getIsValid()) { setTextBoxStyle("selectBoxInvalid"); if (listModel.getInvalidityReasons() != null && listModel.getInvalidityReasons().size() > 0) { setTooltip( "<nobr>" + listModel.getInvalidityReasons().iterator().next() + "</nobr>"); setHoverStyle("gridToolTipStyle"); setHoverWidth(1); setHoverDelay(100); } } else { setTextBoxStyle("engineSelectItem"); setTooltip(""); } } } }); if (!async) { model.getItemsChangedEvent().raise(model, EventArgs.Empty); model.getSelectedItemChangedEvent().raise(model, EventArgs.Empty); } }