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);
    }
  }