| /******************************************************************************* |
| * Copyright (c) 2001, 2007 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.wst.xsd.ui.internal.adt.design; |
| |
| import org.eclipse.draw2d.FigureCanvas; |
| import org.eclipse.draw2d.PositionConstants; |
| import org.eclipse.draw2d.geometry.Point; |
| import org.eclipse.draw2d.geometry.Rectangle; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.GraphicalEditPart; |
| import org.eclipse.gef.GraphicalViewer; |
| import org.eclipse.gef.ui.actions.ActionRegistry; |
| import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.KeyEvent; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.wst.xsd.ui.internal.adt.design.editpolicies.KeyBoardAccessibilityEditPolicy; |
| import org.eclipse.wst.xsd.ui.internal.common.actions.OpenInNewEditor; |
| |
| /** |
| * This key handler is designed to be re-used by both the WSDL and XSD editor |
| */ |
| public class BaseGraphicalViewerKeyHandler extends GraphicalViewerKeyHandler |
| { |
| public BaseGraphicalViewerKeyHandler(GraphicalViewer viewer) |
| { |
| super(viewer); |
| } |
| |
| public boolean keyPressed(KeyEvent event) |
| { |
| int direction = -1; |
| boolean isAltDown = (event.stateMask & SWT.ALT) != 0; |
| boolean isCtrlDown = (event.stateMask & SWT.CTRL) != 0; |
| switch (event.keyCode) |
| { |
| case SWT.ARROW_LEFT : { |
| direction = PositionConstants.WEST; |
| break; |
| } |
| case SWT.ARROW_RIGHT : { |
| direction = PositionConstants.EAST; |
| break; |
| } |
| case SWT.ARROW_UP : { |
| direction = isAltDown ? KeyBoardAccessibilityEditPolicy.OUT_TO_PARENT : PositionConstants.NORTH; |
| break; |
| } |
| case SWT.ARROW_DOWN : { |
| direction = isAltDown ? KeyBoardAccessibilityEditPolicy.IN_TO_FIRST_CHILD : PositionConstants.SOUTH; |
| break; |
| } |
| } |
| |
| if (direction != -1) |
| { |
| GraphicalEditPart focusEditPart = getFocusEditPart(); |
| KeyBoardAccessibilityEditPolicy policy = (KeyBoardAccessibilityEditPolicy)focusEditPart.getEditPolicy(KeyBoardAccessibilityEditPolicy.KEY); |
| |
| if (policy != null) |
| { |
| EditPart target = policy.getRelativeEditPart(focusEditPart, direction); |
| if (target != null) |
| { |
| if(isCtrlDown) { |
| |
| IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); |
| Object keyboardDrag = editor.getAdapter(IKeyboardDrag.class); |
| if (keyboardDrag instanceof IKeyboardDrag) { |
| ((IKeyboardDrag) keyboardDrag).performKeyboardDrag(focusEditPart, direction); |
| return true; |
| } |
| } |
| else { |
| navigateTo(target, event); |
| return true; |
| } |
| } |
| } |
| } |
| |
| switch (event.keyCode) |
| { |
| case SWT.PAGE_DOWN : |
| { |
| if (scrollPage(event, PositionConstants.SOUTH)) |
| return true; |
| } |
| case SWT.PAGE_UP : |
| { |
| if (scrollPage(event, PositionConstants.NORTH)) |
| return true; |
| } |
| case SWT.F3 : |
| case SWT.CR : |
| { |
| IWorkbench workbench = PlatformUI.getWorkbench(); |
| IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow(); |
| IEditorPart editorPart = workbenchWindow.getActivePage().getActiveEditor(); |
| ActionRegistry registry = (ActionRegistry) editorPart.getAdapter(ActionRegistry.class); |
| if (registry != null) |
| { |
| IAction action = registry.getAction(OpenInNewEditor.ID); |
| if (action != null) |
| action.run(); |
| } |
| } |
| /* |
| case SWT.F5 : |
| { |
| IEditorPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); |
| if (part != null) |
| { |
| EditorModeManager manager = (EditorModeManager)part.getAdapter(EditorModeManager.class); |
| EditorMode[] modes = manager.getModes(); |
| EditorMode mode = manager.getCurrentMode(); |
| List list = Arrays.asList(modes); |
| int index = list.indexOf(mode); |
| int nextIndex = index + 1; |
| if (nextIndex < modes.length) |
| { |
| mode = (EditorMode)list.get(nextIndex); |
| } |
| else |
| { |
| mode = (EditorMode)list.get(0); |
| } |
| if (mode != manager.getCurrentMode()) |
| { |
| manager.setCurrentMode(mode); |
| } |
| } |
| return true; |
| }*/ |
| } |
| return super.keyPressed(event); |
| } |
| |
| private boolean scrollPage(KeyEvent event, int direction) |
| { |
| if (!(getViewer().getControl() instanceof FigureCanvas)) |
| return false; |
| FigureCanvas figCanvas = (FigureCanvas) getViewer().getControl(); |
| Point loc = figCanvas.getViewport().getViewLocation(); |
| Rectangle area = figCanvas.getViewport().getClientArea(Rectangle.SINGLETON).scale(.8); |
| if (direction == PositionConstants.NORTH) |
| { |
| figCanvas.scrollToY(loc.y - area.height); |
| } |
| else |
| { |
| figCanvas.scrollToY(loc.y + area.height); |
| } |
| return true; |
| } |
| } |