private boolean handleTraverseHandle(KeyEvent e) {
		EditPart focus = getCurrentViewer().getFocusEditPart();
		if (focus.getSelected() == EditPart.SELECTED_NONE)
			return false;
		getCurrentViewer().reveal(focus);

		AccessibleHandleProvider provider;
		provider = (AccessibleHandleProvider) focus
				.getAdapter(AccessibleHandleProvider.class);
		if (provider == null
				|| provider.getAccessibleHandleLocations().isEmpty())
			return false;

		/*
		 * At this point, a handle provider with 1 or more handles has been
		 * obtained
		 */
		setState(STATE_TRAVERSE_HANDLE);
		List locations = provider.getAccessibleHandleLocations();
		// Goto next index, wrapping if necessary
		if (e.character == '.')
			handleIndex = (++handleIndex) % locations.size();
		else
			handleIndex = (--handleIndex + locations.size()) % locations.size();
		if (getLastHandleProvider() != focus) {
			handleIndex = 0;
			setLastHandleProvider(focus);
		}

		Point loc = (Point) locations.get(handleIndex);
		Point current = new Point(getCurrentViewer().getControl().toControl(
				Display.getCurrent().getCursorLocation()));

		if (current.equals(loc)) {
			// The cursor is already at the location that it is to be moved to.
			// So, we
			// move to the next handle instead. If there are no more handles,
			// then we
			// cancel the drag.
			if (locations.size() > 1)
				if (e.character == '.')
					handleIndex = (++handleIndex) % locations.size();
				else
					handleIndex = (--handleIndex + locations.size())
							% locations.size();
			else {
				placeMouseInViewer(loc.getTranslated(6, 6));
				return false;
			}
		}
		placeMouseInViewer((Point) locations.get(handleIndex));
		return true;
	}