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; }
/** * 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; }