@Override
  public void edit(final M model) {
    // guard against multiple calls to edit()
    if (this.model != null) {
      this.model.getItemsChangedEvent().removeListener(itemsChangedListener);
      this.model.getPropertyChangedEvent().removeListener(propertyChangedListener);
    }

    this.model = model;
    model.getItemsChangedEvent().addListener(itemsChangedListener);
    model.getPropertyChangedEvent().addListener(propertyChangedListener);
    enabled = model.getIsChangable();
    setVisible(model.getIsAvailable());
    init(model);
  }