/**
   * Traverses to the closest EditPart in the given list that is also in the given direction.
   *
   * @param event the KeyEvent for the keys that were pressed to trigger this traversal
   * @param direction PositionConstants.* indicating the direction in which to traverse
   */
  boolean navigateNextSibling(KeyEvent event, int direction, List<?> list) {
    IEntityPart epStart = getFocusEntityPart();
    if (epStart instanceof ITextualEntityPart) {
      ITextualEntityPart textualEntityPart = (ITextualEntityPart) epStart;
      ITextualFigure textualFigure = textualEntityPart.getTextualFigure();
      String text = textualFigure.getText();
      int line = CaretUtils.getLineFromPosition(text, textualEntityPart.getCaretPosition());
      int lines = CaretUtils.getCaretLines(text);
      if ((direction == PositionConstants.WEST && textualEntityPart.getCaretPosition() > 0)
          || (direction == PositionConstants.EAST
              && textualEntityPart.getCaretPosition() < textualEntityPart.getCaretPositions())) {
        int position =
            textualEntityPart.getCaretPosition() + (direction == PositionConstants.WEST ? -1 : 1);
        CaretUpdater.sheduleSyncUpdate(
            getViewer(), textualEntityPart.getModelEntity(), position, true);
        return true;
      } else if ((direction == PositionConstants.NORTH && line > 0)
          || (direction == PositionConstants.SOUTH && line < lines)) {
        int dy =
            FigureUtilities.getFontMetrics(textualFigure.getFont()).getHeight()
                * (direction == PositionConstants.NORTH ? -1 : 1);
        Point location = textualFigure.getCaretBounds().getCenter().translate(0, dy);
        CaretUpdater.sheduleSyncUpdate(
            getViewer(), textualEntityPart.getModelEntity(), location, true);
        textualEntityPart.updateCaret(location);
        return true;
      }
    }
    if (!(epStart instanceof IGraphicalEntityPart)) return false;
    IFigure figure = ((IGraphicalEntityPart) epStart).getFigure();
    Point pStart = getNavigationPoint(figure);
    figure.translateToAbsolute(pStart);
    EditPart next =
        findSibling(
            list, pStart, direction, epStart); // parent.findSibling(pStart, direction, epStart);
    while (next == null) {
      if (!(epStart.getParent() instanceof IGraphicalEntityPart)) return false;

      epStart = (IGraphicalEntityPart) epStart.getParent();
      if (epStart == getViewer().getContents()
          || epStart.getParent() == getViewer().getContents()
          || epStart.getParent() == null) return false;

      list = epStart.getParent().getChildren();
      next = findSibling(list, pStart, direction, epStart);
    }

    // next = next.enter(pStart, direction, epStart);1+2
    navigateTo(next, event);
    return true;
  }
  public boolean navigateView(KeyEvent event, int direction) {
    EditPoint focusPoint = getEditPoint();
    IGEFEditorKit editorKit = (IGEFEditorKit) focusPoint.focus.getModelEntity().wGetEditorKit();
    IKeyHandler keyHandler = editorKit.getKeyHandler();
    // FIXME workaround for a bug in navigation actions
    if (focusPoint.focus instanceof ITextualEntityPart) {
      ITextualEntityPart part = (ITextualEntityPart) focusPoint.focus;
      int start = part.getSelectionStart();
      int end = part.getSelectionEnd();
      if (start != -1 && end != -1) {
        CaretUpdater.sheduleSyncUpdate(
            part.getViewer(),
            part.getModelTextEntity(),
            direction == PositionConstants.WEST ? start : end,
            true);
        return true;
      } else {
        CaretUpdater.sheduleSyncUpdate(
            part.getViewer(), part.getModelTextEntity(), part.getCaretPosition(), true);
      }
    }
    editPoint = keyHandler.findNeighbour(this, focusPoint, direction);

    if (editPoint == null) return navigateNextSibling(event, direction);

    navigateTo(editPoint.focus, event);
    return true;
  }