public static TreeItem getMatchingItem(Object data, SynchronizedTreeViewer viewer) {
   if (data == null) return null;
   if (data instanceof EmptyElement) {
     data = ((EmptyElement) data).getRepresentedMissingElement();
   }
   TreeItem item = (TreeItem) viewer.findItem(data);
   if (item != null && !item.isDisposed()) {
     if (item.getParentItem() != null && !item.getParentItem().getExpanded()) {
       return null;
     }
     return item;
   }
   // look in the given viewer for any EmptyElement instances
   // that represent the given data
   TreeItem[] items = viewer.getTree().getItems();
   EmptyElement empty = locateEmptyElement(items, data);
   if (empty != null) {
     return (TreeItem) viewer.findItem(empty);
   }
   return null;
 }