package org.jnect.demo.incquery.gef3d.camera; import java.util.logging.Logger; import org.eclipse.draw3d.ui.camera.CameraInputHandler; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef3d.tools.AbstractTool3D; import org.eclipse.gef3d.tools.CameraTool; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; /** * This tool controls the camera. The actual camera control happens in an instance of {@link CameraInputHandler} and * this class only delegates SWT events to that class. * * @author Jens von Pilgrim * @author Kristian Duske * @author istvanrath * modifications: * - wire customcamerahandler in */ public class CustomCameraTool extends AbstractTool3D { @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(CameraTool.class.getName()); /** * The camera input handler. */ protected CustomCameraInputHandler m_handler; /** * The camera preference distributor. */ protected CustomCameraPreferenceDistributor m_prefDistributor; private Cursor m_pushedCursor; /** * {@inheritDoc} * * @see org.eclipse.gef.tools.AbstractTool#activate() */ @Override public void activate() { super.activate(); if (m_handler == null) m_handler = new CustomCameraInputHandler(); if (m_prefDistributor == null) m_prefDistributor = new CustomCameraPreferenceDistributor(m_handler); m_prefDistributor.start(); } /** * {@inheritDoc} * * @see org.eclipse.gef.tools.AbstractTool#deactivate() */ @Override public void deactivate() { super.deactivate(); m_prefDistributor.stop(); } /** * {@inheritDoc} * * @see org.eclipse.gef.tools.AbstractTool#getCommandName() */ @Override protected String getCommandName() { return "Camera Tool"; } private int getStateMask(Input i_input) { int stateMask = 0; if (i_input.isAltKeyDown()) stateMask |= SWT.ALT; if (i_input.isControlKeyDown()) stateMask |= SWT.CONTROL; if (i_input.isShiftKeyDown()) stateMask |= SWT.SHIFT; if (i_input.isModKeyDown(SWT.MOD1)) stateMask |= SWT.MOD1; if (i_input.isModKeyDown(SWT.MOD2)) stateMask |= SWT.MOD2; if (i_input.isModKeyDown(SWT.MOD3)) stateMask |= SWT.MOD3; if (i_input.isModKeyDown(SWT.MOD4)) stateMask |= SWT.MOD4; if (i_input.isMouseButtonDown(SWT.BUTTON1)) stateMask |= SWT.BUTTON1; if (i_input.isMouseButtonDown(SWT.BUTTON2)) stateMask |= SWT.BUTTON2; if (i_input.isMouseButtonDown(SWT.BUTTON3)) stateMask |= SWT.BUTTON3; if (i_input.isMouseButtonDown(SWT.BUTTON4)) stateMask |= SWT.BUTTON4; if (i_input.isMouseButtonDown(SWT.BUTTON5)) stateMask |= SWT.BUTTON5; return stateMask; } /** * {@inheritDoc} * * @see org.eclipse.gef.tools.AbstractTool#handleButtonDown(int) */ @Override protected boolean handleButtonDown(int i_button) { setCursor(SWT.CURSOR_CROSS); m_handler.setScene(getScene()); Input3D input = getCurrentInput3D(); m_handler.buttonDown(i_button, getStateMask(input), input.getRealMouseLocation().x, input.getRealMouseLocation().y); return true; } /** * {@inheritDoc} * * @see org.eclipse.gef.tools.AbstractTool#handleButtonUp(int) */ @Override protected boolean handleButtonUp(int i_button) { restoreCursor(); m_handler.setScene(getScene()); Input3D input = getCurrentInput3D(); m_handler.buttonUp(i_button, getStateMask(input), input.getRealMouseLocation().x, input.getRealMouseLocation().y); return true; } /** * {@inheritDoc} * * @see org.eclipse.gef.tools.AbstractTool#handleDoubleClick(int) */ @Override protected boolean handleDoubleClick(int i_button) { m_handler.setScene(getScene()); Input3D input = getCurrentInput3D(); m_handler.doubleClick(i_button, getStateMask(input), input.getRealMouseLocation().x, input.getRealMouseLocation().y); return true; } /** * {@inheritDoc} * * @see org.eclipse.gef.tools.AbstractTool#handleDrag() */ @Override protected boolean handleDrag() { m_handler.setScene(getScene()); Input3D input = getCurrentInput3D(); m_handler.mouseMove(getStateMask(input), input.getRealMouseLocation().x, input.getRealMouseLocation().y); return true; } /** * {@inheritDoc} * * @see org.eclipse.gef.tools.AbstractTool#handleKeyDown(org.eclipse.swt.events.KeyEvent) */ @Override protected boolean handleKeyDown(KeyEvent i_e) { m_handler.setScene(getScene()); m_handler.keyDown(i_e); return true; } /** * {@inheritDoc} * * @see org.eclipse.gef.tools.AbstractTool#handleKeyUp(org.eclipse.swt.events.KeyEvent) */ @Override protected boolean handleKeyUp(KeyEvent i_e) { m_handler.setScene(getScene()); m_handler.keyUp(i_e); return true; } /** * {@inheritDoc} * * @see org.eclipse.gef.tools.AbstractTool#handleNativeDragFinished(org.eclipse.swt.dnd.DragSourceEvent) */ @Override protected boolean handleNativeDragFinished(DragSourceEvent i_event) { restoreCursor(); m_handler.setScene(getScene()); Input3D input = getCurrentInput3D(); m_handler.nativeDragFinished(input.getRealMouseLocation().x, input.getRealMouseLocation().y); return true; } /** * {@inheritDoc} * * @see org.eclipse.gef.tools.AbstractTool#handleNativeDragStarted(org.eclipse.swt.dnd.DragSourceEvent) */ @Override protected boolean handleNativeDragStarted(DragSourceEvent i_event) { setCursor(SWT.CURSOR_CROSS); m_handler.setScene(getScene()); Input3D input = getCurrentInput3D(); m_handler.nativeDragStarted(input.getRealMouseLocation().x, input.getRealMouseLocation().y); return true; } /** * {@inheritDoc} * * @see org.eclipse.gef.tools.AbstractTool#keyUp(org.eclipse.swt.events.KeyEvent, org.eclipse.gef.EditPartViewer) */ @Override public void keyUp(KeyEvent i_evt, EditPartViewer i_viewer) { super.keyUp(i_evt, i_viewer); m_handler.setScene(getScene()); m_handler.keyUp(i_evt); } /** * {@inheritDoc} * * @see org.eclipse.gef.tools.AbstractTool#mouseWheelScrolled(org.eclipse.swt.widgets.Event, * org.eclipse.gef.EditPartViewer) */ @Override public void mouseWheelScrolled(Event i_event, EditPartViewer i_viewer) { super.mouseWheelScrolled(i_event, i_viewer); m_handler.setScene(getScene()); m_handler.mouseWheelScrolled(i_event.count); } private void restoreCursor() { if (m_pushedCursor != null) { Control ctrl = getCurrentViewer().getControl(); ctrl.setCursor(m_pushedCursor); m_pushedCursor = null; } } private void setCursor(int i_cursorId) { // save current cursor Control ctrl = getCurrentViewer().getControl(); while (ctrl != null) { if (ctrl.getCursor() != null) { m_pushedCursor = ctrl.getCursor(); break; } ctrl = ctrl.getParent(); } m_pushedCursor = getCurrentViewer().getControl().getDisplay().getSystemCursor(SWT.CURSOR_ARROW); // hide cursor and save position ctrl = getCurrentViewer().getControl(); Display display = ctrl.getDisplay(); Cursor cursor = display.getSystemCursor(i_cursorId); ctrl.setCursor(cursor); } }