private void getInput(Control c) {
   if (InInput) {
     return;
   }
   if (klickedCell == null) {
     return;
   }
   XViewerColumn xCol =
       xv.getXViewerFactory()
           .getDefaultXViewerColumn(((XViewerColumn) klickedColumn.getData()).getId());
   if (xCol instanceof ExtendedViewerColumn) {
     ExtendedViewerColumn extendedCol = (ExtendedViewerColumn) xCol;
     CellEditDescriptor ced =
         extendedCol.getCellEditDescriptorMap().get(klickedCell.getElement().getClass());
     if (ced == null || ced.getControl() == null) {
       return;
     }
     InInput = true;
     try {
       converter.getInput(c, ced, klickedCell.getElement());
       xv.refresh(klickedCell.getElement());
     } catch (Exception ex) {
       InInput = false;
     }
     InInput = false;
   }
 }
 private boolean getNeighbor(int directionMask, boolean sameLevel) {
   try {
     if (klickedCell == null) {
       return false;
     }
     Point cellPosition = new Point(klickedCell.getBounds().x, klickedCell.getBounds().y);
     klickedCell = xv.getCell(cellPosition).getNeighbor(directionMask, sameLevel);
     klickedColumn =
         xv.getColumnUnderMouseClick(
             new Point(klickedCell.getBounds().x, klickedCell.getBounds().y));
     XViewerColumn xColumn =
         xv.getXViewerFactory()
             .getDefaultXViewerColumn(((XViewerColumn) klickedColumn.getData()).getId());
     if (xColumn instanceof ExtendedViewerColumn) {
       ExtendedViewerColumn extendedColumn = (ExtendedViewerColumn) xColumn;
       CellEditDescriptor ced =
           extendedColumn.getCellEditDescriptorMap().get(klickedCell.getElement().getClass());
       if (ced == null) {
         return getNeighbor(directionMask, sameLevel);
       }
       if (ced.getControl() == null) {
         return getNeighbor(directionMask, sameLevel);
       }
     } else {
       return getNeighbor(directionMask, sameLevel);
     }
     return true;
   } catch (Exception ex) {
     return false;
   }
 }
 private void setInput(Control c) {
   if (klickedCell == null) {
     return;
   }
   XViewerColumn xCol =
       xv.getXViewerFactory()
           .getDefaultXViewerColumn(((XViewerColumn) klickedColumn.getData()).getId());
   if (xCol instanceof ExtendedViewerColumn) {
     ExtendedViewerColumn extendedCol = (ExtendedViewerColumn) xCol;
     CellEditDescriptor ced =
         extendedCol.getCellEditDescriptorMap().get(klickedCell.getElement().getClass());
     if (ced == null || ced.getControl() == null) {
       return;
     }
     converter.setInput(c, ced, klickedCell.getElement());
   }
   c.setBounds(klickedCell.getBounds());
 }
    @Override
    public void handleEvent(Event event) {
      if (klickedColumn == null || klickedCell == null) {
        return;
      }

      final Control c;
      try {
        XViewerColumn xColumn =
            xv.getXViewerFactory()
                .getDefaultXViewerColumn(((XViewerColumn) klickedColumn.getData()).getId());
        if (xColumn instanceof ExtendedViewerColumn) {
          ExtendedViewerColumn extendedColumn = (ExtendedViewerColumn) xColumn;
          CellEditDescriptor ced =
              extendedColumn.getCellEditDescriptorMap().get(klickedCell.getElement().getClass());
          if (ced != null) {
            if (ced.getControl() == null) {
              return;
            }
            if (ced.getAction() != null) {
              if (!ced.getAction().isEnabled()) {
                return;
              }
            }
            c = factory.createControl(ced, xv);
            if (c == null) {
              return;
            }
          } else {
            return;
          }
        } else {
          return;
        }

        if (((TreeItem) event.item) != null) {
          Listener myListener =
              new Listener() {
                @Override
                public void handleEvent(final Event e) {
                  switch (e.type) {
                    case SWT.FocusOut:
                      // set new value
                      getInput(c);
                      c.dispose();
                      break;
                    case SWT.Verify:
                      c.setBounds(klickedCell.getBounds());
                      break;
                    case SWT.Traverse:
                      boolean neighbor = false;
                      switch (e.detail) {
                        case SWT.TRAVERSE_RETURN:
                          // set new value
                          getInput(c);
                          // $FALL-THROUGH$
                        case SWT.TRAVERSE_ESCAPE:
                          c.dispose();
                          e.doit = false;
                          break;
                        case SWT.TRAVERSE_TAB_NEXT:
                          getInput(c);
                          neighbor = getNeighbor(ViewerCell.RIGHT, true);
                          e.doit = false;
                          c.dispose();
                          Event eN = new Event();
                          eN.type = SWT.Selection;
                          eN.widget = xv.getTree();
                          if (neighbor) {
                            eN.item = klickedCell.getItem();
                          }
                          doHandleEvent(eN);
                          break;
                        case SWT.TRAVERSE_TAB_PREVIOUS:
                          getInput(c);
                          neighbor = getNeighbor(ViewerCell.LEFT, true);
                          e.doit = false;
                          c.dispose();
                          Event eP = new Event();
                          eP.type = SWT.Selection;
                          eP.widget = xv.getTree();
                          if (neighbor) {
                            eP.item = klickedCell.getItem();
                          }
                          doHandleEvent(eP);
                          break;
                      }
                  }
                }
              };
          c.addListener(SWT.FocusOut, myListener);
          c.addListener(SWT.Traverse, myListener);
          c.addListener(SWT.Verify, myListener);
          // set old value
          setInput(c);
          c.setFocus();
        }
      } catch (Exception ex) {
        return;
      }
    }