public void testRemovesListenerAfterLastListenerIsRemoved() throws Exception {
    ListChangeEventTracker listener = new ListChangeEventTracker();
    list.addListChangeListener(listener);

    assertTrue(bean.changeSupport.hasListeners(propertyName));
    list.removeListChangeListener(listener);
    assertFalse(bean.changeSupport.hasListeners(propertyName));
  }
  private void removed(E input) {
    listeners.elementRemoved(input);

    IObservableList<E> observable = elementToObservable.remove(input);
    if (observable != null) {
      observable.removeListChangeListener(listChangeListener);
      for (E element : observable) {
        removed(element);
      }
      observable.dispose();
    }
  }
  /** @param list */
  private void setInput(IObservableList list) {

    if (list == null) {
      list = new WritableList(SWTObservables.getRealm(Display.getDefault()));
    }

    if (observableList != null) {
      observableList.removeListChangeListener(listener);
    }

    knownElements.clear();

    observableList = list;

    knownElements.addAll(list);

    observableList.addListChangeListener(listener);
  }
 public void dispose() {
   observableList.removeListChangeListener(listener);
 }