/******************************************************************************* * Copyright (c) 2008, 2010 Innoopract Informationssysteme GmbH. * 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: * Innoopract Informationssysteme GmbH - initial API and implementation * EclipseSource - ongoing development ******************************************************************************/ package org.eclipse.swt.events; import java.util.ArrayList; import junit.framework.TestCase; import org.eclipse.rwt.Fixture; import org.eclipse.rwt.internal.lifecycle.DisplayUtil; import org.eclipse.rwt.internal.lifecycle.JSConst; import org.eclipse.rwt.internal.service.RequestParams; import org.eclipse.rwt.lifecycle.PhaseId; import org.eclipse.rwt.lifecycle.WidgetUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.*; public class MouseEvent_Test extends TestCase { private static final String MOUSE_DOWN = "mouseDown|"; private static final String MOUSE_UP = "mouseUp|"; private static final String MOUSE_DOUBLE_CLICK = "mouseDoubleClick|"; private String log; protected void setUp() throws Exception { Fixture.setUp(); Fixture.fakePhase( PhaseId.PROCESS_ACTION ); log = ""; } protected void tearDown() throws Exception { Fixture.tearDown(); } public void testAddRemoveListener() { MouseListener listener = new MouseListener() { public void mouseDoubleClick( MouseEvent e ) { log += MOUSE_DOUBLE_CLICK; } public void mouseDown( MouseEvent e ) { log += MOUSE_DOWN; } public void mouseUp( MouseEvent e ) { log += MOUSE_UP; } }; Display display = new Display(); Composite shell = new Shell( display, SWT.NONE ); MouseEvent.addListener( shell, listener ); MouseEvent event; event = new MouseEvent( shell, MouseEvent.MOUSE_DOWN ); event.processEvent(); event = new MouseEvent( shell, MouseEvent.MOUSE_UP ); event.processEvent(); event = new MouseEvent( shell, MouseEvent.MOUSE_DOUBLE_CLICK ); event.processEvent(); assertEquals( MOUSE_DOWN + MOUSE_UP + MOUSE_DOUBLE_CLICK, log ); log = ""; MouseEvent.removeListener( shell, listener ); event = new MouseEvent( shell, MouseEvent.MOUSE_DOWN ); event.processEvent(); assertEquals( "", log ); } public void testAddRemoveUntypedListener() { final java.util.List log = new ArrayList(); Display display = new Display(); Control control = new Shell( display, SWT.NONE ); Listener listener = new Listener() { public void handleEvent( Event event ) { log.add( event ); } }; // MouseDown control.addListener( SWT.MouseDown, listener ); MouseEvent event; event = new MouseEvent( control, MouseEvent.MOUSE_DOWN ); event.processEvent(); Event firedEvent = ( Event )log.get( 0 ); assertEquals( SWT.MouseDown, firedEvent.type ); log.clear(); control.removeListener( SWT.MouseDown, listener ); event = new MouseEvent( control, MouseEvent.MOUSE_DOWN ); event.processEvent(); assertEquals( 0, log.size() ); // MouseUp control.addListener( SWT.MouseUp, listener ); event = new MouseEvent( control, MouseEvent.MOUSE_UP ); event.processEvent(); firedEvent = ( Event )log.get( 0 ); assertEquals( SWT.MouseUp, firedEvent.type ); log.clear(); control.removeListener( SWT.MouseUp, listener ); event = new MouseEvent( control, MouseEvent.MOUSE_UP ); event.processEvent(); assertEquals( 0, log.size() ); // MouseDoubleCLick control.addListener( SWT.MouseDoubleClick, listener ); event = new MouseEvent( control, MouseEvent.MOUSE_DOUBLE_CLICK ); event.processEvent(); firedEvent = ( Event )log.get( 0 ); assertEquals( SWT.MouseDoubleClick, firedEvent.type ); log.clear(); control.removeListener( SWT.MouseDoubleClick, listener ); event = new MouseEvent( control, MouseEvent.MOUSE_DOUBLE_CLICK ); event.processEvent(); assertEquals( 0, log.size() ); } public void testTypedMouseEventOrder() { final java.util.List events = new ArrayList(); Display display = new Display(); Shell shell = new Shell( display ); shell.setLocation( 100, 100 ); shell.open(); shell.addMouseListener( new MouseListener() { public void mouseDoubleClick( final MouseEvent event ) { events.add( event ); } public void mouseDown( final MouseEvent event ) { events.add( event ); } public void mouseUp( final MouseEvent event ) { events.add( event ); } } ); String displayId = DisplayUtil.getId( display ); String shellId = WidgetUtil.getId( shell ); int shellX = shell.getLocation().x; int shellY = shell.getLocation().y; // Simulate request that sends a mouseDown + mouseUp sequence Fixture.fakeResponseWriter(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); fakeMouseDownRequest( shellId, shellX + 24, shellY + 24 ); fakeMouseUpRequest( shellId, shellX + 24, shellY + 24 ); Fixture.executeLifeCycleFromServerThread(); assertEquals( 2, events.size() ); MouseEvent mouseEvent = ( ( MouseEvent )events.get( 0 ) ); assertEquals( MouseEvent.MOUSE_DOWN, mouseEvent.getID() ); assertSame( shell, mouseEvent.widget ); assertEquals( 1, mouseEvent.button ); assertEquals( 22, mouseEvent.x ); assertEquals( 22, mouseEvent.y ); mouseEvent = ( ( MouseEvent )events.get( 1 ) ); assertEquals( MouseEvent.MOUSE_UP, mouseEvent.getID() ); assertSame( shell, mouseEvent.widget ); assertEquals( 1, mouseEvent.button ); assertEquals( 22, mouseEvent.x ); assertEquals( 22, mouseEvent.y ); assertTrue( ( mouseEvent.stateMask & SWT.BUTTON1 ) != 0 ); // Simulate request that sends a mouseDown + mouseUp + dblClick sequence events.clear(); Fixture.fakeResponseWriter(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); fakeMouseDownRequest( shellId, shellX + 24, shellY + 24 ); fakeMouseUpRequest( shellId, shellX + 24, shellY + 24 ); fakeMouseDoubleClickRequest( shellId, shellX + 24, shellY + 24 ); Fixture.executeLifeCycleFromServerThread(); assertEquals( 3, events.size() ); mouseEvent = ( ( MouseEvent )events.get( 0 ) ); assertEquals( MouseEvent.MOUSE_DOWN, mouseEvent.getID() ); assertSame( shell, mouseEvent.widget ); assertEquals( 1, mouseEvent.button ); assertEquals( 22, mouseEvent.x ); assertEquals( 22, mouseEvent.y ); assertTrue( ( mouseEvent.stateMask & SWT.BUTTON1 ) != 0 ); mouseEvent = ( ( MouseEvent )events.get( 1 ) ); assertEquals( MouseEvent.MOUSE_DOUBLE_CLICK, mouseEvent.getID() ); assertSame( shell, mouseEvent.widget ); assertEquals( 1, mouseEvent.button ); assertEquals( 22, mouseEvent.x ); assertEquals( 22, mouseEvent.y ); assertTrue( ( mouseEvent.stateMask & SWT.BUTTON1 ) != 0 ); mouseEvent = ( ( MouseEvent )events.get( 2 ) ); assertEquals( MouseEvent.MOUSE_UP, mouseEvent.getID() ); assertSame( shell, mouseEvent.widget ); assertEquals( 1, mouseEvent.button ); assertEquals( 22, mouseEvent.x ); assertEquals( 22, mouseEvent.y ); assertTrue( ( mouseEvent.stateMask & SWT.BUTTON1 ) != 0 ); } public void testUntypedMouseEventOrder() { final java.util.List events = new ArrayList(); Display display = new Display(); Shell shell = new Shell( display ); shell.setLocation( 100, 100 ); shell.open(); shell.addListener( SWT.MouseDown, new Listener() { public void handleEvent( final Event event ) { events.add( event ); } } ); shell.addListener( SWT.MouseUp, new Listener() { public void handleEvent( final Event event ) { events.add( event ); } } ); shell.addListener( SWT.MouseDoubleClick, new Listener() { public void handleEvent( final Event event ) { events.add( event ); } } ); String displayId = DisplayUtil.getId( display ); String shellId = WidgetUtil.getId( shell ); int shellX = shell.getLocation().x; int shellY = shell.getLocation().y; // Simulate request that sends a mouseDown + mouseUp sequence Fixture.fakeResponseWriter(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); fakeMouseDownRequest( shellId, shellX + 24, shellY + 24 ); fakeMouseUpRequest( shellId, shellX + 24, shellY + 24 ); Fixture.executeLifeCycleFromServerThread(); assertEquals( 2, events.size() ); Event mouseEvent = ( ( Event )events.get( 0 ) ); assertEquals( SWT.MouseDown, mouseEvent.type ); assertSame( shell, mouseEvent.widget ); assertEquals( 1, mouseEvent.button ); assertEquals( 22, mouseEvent.x ); assertEquals( 22, mouseEvent.y ); mouseEvent = ( ( Event )events.get( 1 ) ); assertEquals( SWT.MouseUp, mouseEvent.type ); assertSame( shell, mouseEvent.widget ); assertEquals( 1, mouseEvent.button ); assertEquals( 22, mouseEvent.x ); assertEquals( 22, mouseEvent.y ); // Simulate request that sends a mouseDown + mouseUp + dblClick sequence events.clear(); Fixture.fakeResponseWriter(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); fakeMouseDownRequest( shellId, shellX + 24, shellY + 24 ); fakeMouseUpRequest( shellId, shellX + 24, shellY + 24 ); fakeMouseDoubleClickRequest( shellId, shellX + 24, shellY + 24 ); Fixture.executeLifeCycleFromServerThread(); assertEquals( 3, events.size() ); mouseEvent = ( ( Event )events.get( 0 ) ); assertEquals( SWT.MouseDown, mouseEvent.type ); assertSame( shell, mouseEvent.widget ); assertEquals( 1, mouseEvent.button ); assertEquals( 22, mouseEvent.x ); assertEquals( 22, mouseEvent.y ); mouseEvent = ( ( Event )events.get( 1 ) ); assertEquals( SWT.MouseDoubleClick, mouseEvent.type ); assertSame( shell, mouseEvent.widget ); assertEquals( 1, mouseEvent.button ); assertEquals( 22, mouseEvent.x ); assertEquals( 22, mouseEvent.y ); mouseEvent = ( ( Event )events.get( 2 ) ); assertEquals( SWT.MouseUp, mouseEvent.type ); assertSame( shell, mouseEvent.widget ); assertEquals( 1, mouseEvent.button ); assertEquals( 22, mouseEvent.x ); assertEquals( 22, mouseEvent.y ); } public void testNoMouseEventOutsideClientArea() { final java.util.List events = new ArrayList(); Display display = new Display(); Shell shell = new Shell( display ); Menu menuBar = new Menu( shell, SWT.BAR ); shell.setMenuBar( menuBar ); shell.setLocation( 100, 100 ); shell.open(); shell.addMouseListener( new MouseListener() { public void mouseDoubleClick( final MouseEvent event ) { events.add( event ); } public void mouseDown( final MouseEvent event ) { events.add( event ); } public void mouseUp( final MouseEvent event ) { events.add( event ); } } ); String displayId = DisplayUtil.getId( display ); String shellId = WidgetUtil.getId( shell ); int shellX = shell.getLocation().x; int shellY = shell.getLocation().y; // Simulate request that sends a mouseDown + mouseUp on shell border Fixture.fakeResponseWriter(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); fakeMouseDownRequest( shellId, shellX + 1, shellY + 1 ); fakeMouseUpRequest( shellId, shellX + 1, shellY + 1 ); Fixture.executeLifeCycleFromServerThread(); assertEquals( 2, shell.getBorderWidth() ); assertEquals( 0, events.size() ); events.clear(); // Simulate request that sends a mouseDown + mouseUp on shell titlebar Fixture.fakeResponseWriter(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); fakeMouseDownRequest( shellId, shellX + 10, shellY + 10 ); fakeMouseUpRequest( shellId, shellX + 10, shellY + 10 ); Fixture.executeLifeCycleFromServerThread(); assertEquals( 0, events.size() ); events.clear(); // Simulate request that sends a mouseDown + mouseUp on shell menubar Fixture.fakeResponseWriter(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); fakeMouseDownRequest( shellId, shellX + 24, shellY + 24 ); fakeMouseUpRequest( shellId, shellX + 24, shellY + 24 ); Fixture.executeLifeCycleFromServerThread(); assertEquals( 0, events.size() ); } public void testNoMouseEventOnScrollBars() { final java.util.List events = new ArrayList(); Display display = new Display(); Shell shell = new Shell( display ); Table table = new Table( shell, SWT.NONE ); table.setSize( 100, 100 ); for( int i = 0; i < 50; i++ ) { new TableItem( table, SWT.NONE); } table.addMouseListener( new MouseListener() { public void mouseDoubleClick( final MouseEvent event ) { events.add( event ); } public void mouseDown( final MouseEvent event ) { events.add( event ); } public void mouseUp( final MouseEvent event ) { events.add( event ); } } ); assertEquals( new Rectangle( 0, 0, 84, 100 ), table.getClientArea() ); String displayId = DisplayUtil.getId( display ); String tableId = WidgetUtil.getId( table ); // Simulate request that sends a mouseDown + mouseUp on scrollbar Fixture.fakeResponseWriter(); Fixture.fakeRequestParam( RequestParams.UIROOT, displayId ); fakeMouseDownRequest( tableId, 90, 10 ); fakeMouseUpRequest( tableId, 90, 10 ); Fixture.executeLifeCycleFromServerThread(); assertEquals( 0, events.size() ); } private static void fakeMouseDoubleClickRequest( final String shellId, final int x, final int y ) { Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_DOUBLE_CLICK, shellId ); Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_DOUBLE_CLICK_BUTTON, "1" ); Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_DOUBLE_CLICK_X, String.valueOf( x ) ); Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_DOUBLE_CLICK_Y, String.valueOf( y ) ); Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_DOUBLE_CLICK_TIME, "0" ); } private static void fakeMouseUpRequest( final String shellId, final int x, final int y ) { Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_UP, shellId ); Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_UP_BUTTON, "1" ); Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_UP_X, String.valueOf( x ) ); Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_UP_Y, String.valueOf( y ) ); Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_UP_TIME, "0" ); } private static void fakeMouseDownRequest( final String shellId, final int x, final int y ) { Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_DOWN, shellId ); Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_DOWN_BUTTON, "1" ); Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_DOWN_X, String.valueOf( x ) ); Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_DOWN_Y, String.valueOf( y ) ); Fixture.fakeRequestParam( JSConst.EVENT_MOUSE_DOWN_TIME, "0" ); } }