public void handleListChange(ListChangeEvent event) {
   ListDiffEntry[] differences = event.diff.getDifferences();
   for (int i = 0; i < differences.length; i++) {
     ListDiffEntry entry = differences[i];
     if (entry.isAddition()) {
       listenerSupport.hookListener(entry.getElement());
     } else {
       listenerSupport.unhookListener(entry.getElement());
     }
   }
 }
 /**
  * * (non-Javadoc) * * @see
  * org.eclipse.jface.databinding.viewers.ObservableListContentProvider#inputChanged
  * (org.eclipse.jface.viewers.Viewer, * java.lang.Object, java.lang.Object)
  */
 @SuppressWarnings("unchecked")
 @Override
 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
   listenerSupport.unhookAllTargets();
   if (observableList != null) {
     observableList.removeListChangeListener(listener);
     observableList = null;
   }
   super.inputChanged(viewer, oldInput, newInput);
   this.viewer = (StructuredViewer) viewer;
   observableList = (ObservableList) newInput;
   if (observableList != null) {
     observableList.addListChangeListener(listener);
     for (Iterator iterator = observableList.iterator(); iterator.hasNext(); ) {
       listenerSupport.hookListener(iterator.next());
     }
   }
 }
  protected void firstListenerAdded() {
    PropertyChangeListener listener =
        new PropertyChangeListener() {
          public void propertyChange(java.beans.PropertyChangeEvent event) {
            if (!updating) {
              final ValueDiff diff =
                  Diffs.createValueDiff(event.getOldValue(), event.getNewValue());
              getRealm()
                  .exec(
                      new Runnable() {
                        public void run() {
                          fireValueChange(diff);
                        }
                      });
            }
          }
        };

    if (listenerSupport == null) {
      listenerSupport = new ListenerSupport(listener, propertyDescriptor.getName());
    }

    listenerSupport.hookListener(object);
  }
 private void unhookListener() {
   if (listenerSupport != null) {
     listenerSupport.dispose();
   }
 }