blob: 0943d0bc6b1bc781fc5480782522c2cbda941c64 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2012 Innoopract Informationssysteme GmbH 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:
* Innoopract Informationssysteme GmbH - initial API and implementation
* EclipseSource - ongoing development
******************************************************************************/
package org.eclipse.swt.events;
import static org.eclipse.rap.rwt.lifecycle.WidgetUtil.getId;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.eclipse.rap.rwt.internal.protocol.ClientMessageConst;
import org.eclipse.rap.rwt.lifecycle.PhaseId;
import org.eclipse.rap.rwt.testfixture.Fixture;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Widget;
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
public class MouseEvent_Test extends TestCase {
private static class LoggingListener implements Listener {
private final List<Object> events;
private LoggingListener( List<Object> events ) {
this.events = events;
}
public void handleEvent( Event event ) {
events.add( event );
}
}
private static class LoggingMouseListener implements MouseListener {
private final List<Object> events;
private LoggingMouseListener( List<Object> events ) {
this.events = events;
}
public void mouseDoubleClick( MouseEvent event ) {
events.add( event );
}
public void mouseDown( MouseEvent event ) {
events.add( event );
}
public void mouseUp( MouseEvent event ) {
events.add( event );
}
}
private Display display;
private Shell shell;
private List<Object> events;
@Override
protected void setUp() throws Exception {
Fixture.setUp();
Fixture.fakePhase( PhaseId.PROCESS_ACTION );
display = new Display();
shell = new Shell( display );
events = new LinkedList<Object>();
}
@Override
protected void tearDown() throws Exception {
Fixture.tearDown();
}
public void testUntypedEventConstructor() throws Exception {
Event event = new Event();
event.display = display;
event.widget = mock( Widget.class );
event.time = 4711;
event.data = new Object();
event.button = 2;
event.x = 10;
event.y = 20;
event.stateMask = 23;
event.count = 8;
MouseEvent mouseEvent = new MouseEvent( event );
EventTestHelper.assertFieldsEqual( mouseEvent, event );
}
public void testAddListener() {
MouseListener listener = mock( MouseListener.class );
shell.addMouseListener( listener );
shell.notifyListeners( SWT.MouseDown, new Event() );
shell.notifyListeners( SWT.MouseUp, new Event() );
shell.notifyListeners( SWT.MouseDoubleClick, new Event() );
verify( listener ).mouseDown( any( MouseEvent.class ) );
verify( listener ).mouseUp( any( MouseEvent.class ) );
verify( listener ).mouseDoubleClick( any( MouseEvent.class ) );
}
public void testRemoveListener() {
MouseListener listener = mock( MouseListener.class );
shell.addMouseListener( listener );
shell.removeMouseListener( listener );
shell.notifyListeners( SWT.MouseDown, new Event() );
verify( listener, never() ).mouseDown( any( MouseEvent.class ) );
}
public void testAddRemoveUntypedListener() {
Listener listener = new LoggingListener( events );
// MouseDown
shell.addListener( SWT.MouseDown, listener );
shell.notifyListeners( SWT.MouseDown, new Event() );
Event firedEvent = ( Event )events.get( 0 );
assertEquals( SWT.MouseDown, firedEvent.type );
events.clear();
shell.removeListener( SWT.MouseDown, listener );
shell.notifyListeners( SWT.MouseDown, new Event() );
assertEquals( 0, events.size() );
// MouseUp
shell.addListener( SWT.MouseUp, listener );
shell.notifyListeners( SWT.MouseUp, new Event() );
firedEvent = ( Event )events.get( 0 );
assertEquals( SWT.MouseUp, firedEvent.type );
events.clear();
shell.removeListener( SWT.MouseUp, listener );
shell.notifyListeners( SWT.MouseUp, new Event() );
assertEquals( 0, events.size() );
// MouseDoubleCLick
shell.addListener( SWT.MouseDoubleClick, listener );
shell.notifyListeners( SWT.MouseDoubleClick, new Event() );
firedEvent = ( Event )events.get( 0 );
assertEquals( SWT.MouseDoubleClick, firedEvent.type );
events.clear();
shell.removeListener( SWT.MouseDoubleClick, listener );
shell.notifyListeners( SWT.MouseDoubleClick, new Event() );
assertEquals( 0, events.size() );
}
public void testTypedMouseEventOrderWithClick() {
MouseListener mouseListener = mock( MouseListener.class );
shell.setLocation( 100, 100 );
shell.open();
shell.addMouseListener( mouseListener );
int eventX = shell.getLocation().x + shell.getClientArea().x + 1;
int eventY = shell.getLocation().y + shell.getClientArea().y + 1;
// Simulate request that sends a mouseDown + mouseUp sequence
Fixture.fakeNewRequest( display );
fakeMouseDownRequest( shell, eventX, eventY );
fakeMouseUpRequest( shell, eventX, eventY );
Fixture.readDataAndProcessAction( display );
InOrder inOrder = inOrder( mouseListener );
ArgumentCaptor<MouseEvent> downCaptor = ArgumentCaptor.forClass( MouseEvent.class );
inOrder.verify( mouseListener ).mouseDown( downCaptor.capture() );
MouseEvent mouseDown = downCaptor.getValue();
assertSame( shell, mouseDown.widget );
assertEquals( 1, mouseDown.button );
assertEquals( 15, mouseDown.x );
assertEquals( 53, mouseDown.y );
assertEquals( 1, mouseDown.count );
ArgumentCaptor<MouseEvent> upCaptor = ArgumentCaptor.forClass( MouseEvent.class );
inOrder.verify( mouseListener ).mouseUp( upCaptor.capture() );
MouseEvent mouseUp = upCaptor.getValue();
assertSame( shell, mouseUp.widget );
assertEquals( 1, mouseUp.button );
assertEquals( 15, mouseUp.x );
assertEquals( 53, mouseUp.y );
assertTrue( ( mouseUp.stateMask & SWT.BUTTON1 ) != 0 );
assertEquals( 1, mouseUp.count );
}
public void testTypedMouseEventOrderWithDoubleClick() {
MouseListener mouseListener = mock( MouseListener.class );
shell.setLocation( 100, 100 );
shell.open();
shell.addMouseListener( mouseListener );
int eventX = shell.getLocation().x + shell.getClientArea().x + 1;
int eventY = shell.getLocation().y + shell.getClientArea().y + 1;
// Simulate request that sends a mouseDown + mouseUp + dblClick sequence
Fixture.fakeNewRequest( display );
fakeMouseDownRequest( shell, eventX, eventY );
fakeMouseUpRequest( shell, eventX, eventY );
fakeMouseDoubleClickRequest( shell, eventX, eventY );
Fixture.readDataAndProcessAction( display );
InOrder inOrder = inOrder( mouseListener );
ArgumentCaptor<MouseEvent> downCaptor = ArgumentCaptor.forClass( MouseEvent.class );
inOrder.verify( mouseListener ).mouseDown( downCaptor.capture() );
MouseEvent mouseDown = downCaptor.getValue();
assertSame( shell, mouseDown.widget );
assertEquals( 1, mouseDown.button );
assertEquals( 15, mouseDown.x );
assertEquals( 53, mouseDown.y );
assertEquals( 2, mouseDown.count );
ArgumentCaptor<MouseEvent> doubleClickCaptor = ArgumentCaptor.forClass( MouseEvent.class );
inOrder.verify( mouseListener ).mouseDoubleClick( doubleClickCaptor.capture() );
MouseEvent mouseDoubleClick = doubleClickCaptor.getValue();
assertSame( shell, mouseDoubleClick.widget );
assertEquals( 1, mouseDoubleClick.button );
assertEquals( 15, mouseDoubleClick.x );
assertEquals( 53, mouseDoubleClick.y );
assertTrue( ( mouseDoubleClick.stateMask & SWT.BUTTON1 ) != 0 );
assertEquals( 2, mouseDoubleClick.count );
ArgumentCaptor<MouseEvent> upCaptor = ArgumentCaptor.forClass( MouseEvent.class );
inOrder.verify( mouseListener ).mouseUp( upCaptor.capture() );
MouseEvent mouseUp = upCaptor.getValue();
assertSame( shell, mouseUp.widget );
assertEquals( 1, mouseUp.button );
assertEquals( 15, mouseUp.x );
assertEquals( 53, mouseUp.y );
assertTrue( ( mouseUp.stateMask & SWT.BUTTON1 ) != 0 );
assertEquals( 2, mouseUp.count );
}
public void testUntypedMouseEventOrderWithClick() {
shell.setLocation( 100, 100 );
shell.open();
shell.addListener( SWT.MouseDown, new LoggingListener( events ) );
shell.addListener( SWT.MouseUp, new LoggingListener( events ) );
shell.addListener( SWT.MouseDoubleClick, new LoggingListener( events ) );
int eventX = shell.getLocation().x + shell.getClientArea().x + 1;
int eventY = shell.getLocation().y + shell.getClientArea().y + 1;
// Simulate request that sends a mouseDown + mouseUp sequence
Fixture.fakeNewRequest( display );
fakeMouseDownRequest( shell, eventX, eventY );
fakeMouseUpRequest( shell, eventX, eventY );
Fixture.readDataAndProcessAction( display );
assertEquals( 2, events.size() );
Event mouseEvent = ( ( Event )events.get( 0 ) );
assertEquals( SWT.MouseDown, mouseEvent.type );
assertSame( shell, mouseEvent.widget );
assertEquals( 1, mouseEvent.button );
assertEquals( 15, mouseEvent.x );
assertEquals( 53, mouseEvent.y );
mouseEvent = ( ( Event )events.get( 1 ) );
assertEquals( SWT.MouseUp, mouseEvent.type );
assertSame( shell, mouseEvent.widget );
assertEquals( 1, mouseEvent.button );
assertEquals( 15, mouseEvent.x );
assertEquals( 53, mouseEvent.y );
}
public void testUntypedMouseEventOrderWithDoubleClick() {
shell.setBounds( 100, 100, 200, 200 );
shell.open();
shell.addListener( SWT.MouseDown, new LoggingListener( events ) );
shell.addListener( SWT.MouseUp, new LoggingListener( events ) );
shell.addListener( SWT.MouseDoubleClick, new LoggingListener( events ) );
int eventX = shell.getLocation().x + shell.getClientArea().x + 1;
int eventY = shell.getLocation().y + shell.getClientArea().y + 1;
// Simulate request that sends a mouseDown + mouseUp + dblClick sequence
Fixture.fakeNewRequest( display );
fakeMouseDownRequest( shell, eventX, eventY );
fakeMouseUpRequest( shell, eventX, eventY );
fakeMouseDoubleClickRequest( shell, eventX, eventY );
Fixture.readDataAndProcessAction( display );
assertEquals( 3, events.size() );
Event mouseDown = ( ( Event )events.get( 0 ) );
assertEquals( SWT.MouseDown, mouseDown.type );
assertSame( shell, mouseDown.widget );
assertEquals( 1, mouseDown.button );
assertEquals( 15, mouseDown.x );
assertEquals( 53, mouseDown.y );
Event mouseDoubleClick = ( ( Event )events.get( 1 ) );
assertEquals( SWT.MouseDoubleClick, mouseDoubleClick.type );
assertSame( shell, mouseDoubleClick.widget );
assertEquals( 1, mouseDoubleClick.button );
assertEquals( 15, mouseDoubleClick.x );
assertEquals( 53, mouseDoubleClick.y );
Event mouseUp = ( ( Event )events.get( 2 ) );
assertEquals( SWT.MouseUp, mouseUp.type );
assertSame( shell, mouseUp.widget );
assertEquals( 1, mouseUp.button );
assertEquals( 15, mouseUp.x );
assertEquals( 53, mouseUp.y );
}
public void testNoMouseEventOutsideClientArea() {
Menu menuBar = new Menu( shell, SWT.BAR );
shell.setMenuBar( menuBar );
shell.setLocation( 100, 100 );
shell.open();
shell.addMouseListener( new LoggingMouseListener( events ) );
int shellX = shell.getLocation().x;
int shellY = shell.getLocation().y;
// Simulate request that sends a mouseDown + mouseUp on shell border
Fixture.fakeNewRequest( display );
fakeMouseDownRequest( shell, shellX + 1, shellY + 1 );
fakeMouseUpRequest( shell, shellX + 1, shellY + 1 );
Fixture.readDataAndProcessAction( display );
assertEquals( 1, shell.getBorderWidth() );
assertEquals( 0, events.size() );
events.clear();
// Simulate request that sends a mouseDown + mouseUp on shell titlebar
Fixture.fakeNewRequest( display );
fakeMouseDownRequest( shell, shellX + 10, shellY + 10 );
fakeMouseUpRequest( shell, shellX + 10, shellY + 10 );
Fixture.readDataAndProcessAction( display );
assertEquals( 0, events.size() );
events.clear();
// Simulate request that sends a mouseDown + mouseUp on shell menubar
Fixture.fakeNewRequest( display );
fakeMouseDownRequest( shell, shellX + 24, shellY + 24 );
fakeMouseUpRequest( shell, shellX + 24, shellY + 24 );
Fixture.readDataAndProcessAction( display );
assertEquals( 0, events.size() );
}
public void testNoMouseEventOnScrollBars() {
Table table = createTableWithMouseListener();
assertEquals( new Rectangle( 0, 0, 90, 100 ), table.getClientArea() );
// Simulate request that sends a mouseDown + mouseUp on scrollbar
Fixture.fakeNewRequest( display );
fakeMouseDownRequest( table, 93, 50 );
fakeMouseUpRequest( table, 93, 50 );
Fixture.readDataAndProcessAction( display );
assertEquals( 0, events.size() );
}
public void testMouseSelectionEventsOrder() {
MouseListener mouseListener = mock( MouseListener.class );
SelectionListener selectionListener = mock( SelectionListener.class );
Table table = createTableWithMouseListener();
Fixture.fakeNewRequest( display );
fakeMouseDownRequest( table, 30, 50 );
fakeMouseDoubleClickRequest( table, 30, 50 );
fakeMouseUpRequest( table, 30, 50 );
fakeSelectionRequest( table, table.getItem( 1 ) );
table.addMouseListener( mouseListener );
table.addSelectionListener( selectionListener );
Fixture.readDataAndProcessAction( display );
InOrder inOrder = inOrder( selectionListener, mouseListener );
inOrder.verify( mouseListener ).mouseDown( any( MouseEvent.class ) );
inOrder.verify( mouseListener ).mouseDoubleClick( any( MouseEvent.class ) );
inOrder.verify( selectionListener ).widgetSelected( any( SelectionEvent.class ) );
inOrder.verify( mouseListener ).mouseUp( any( MouseEvent.class ) );
}
public void testMouseMenuDetectEventsOrder() {
MouseListener mouseListener = mock( MouseListener.class );
MenuDetectListener menuDetectListener = mock( MenuDetectListener.class );
Table table = createTableWithMouseListener();
Fixture.fakeNewRequest( display );
fakeMouseDownRequest( table, 30, 50 );
fakeMouseUpRequest( table, 30, 50 );
fakeMenuDetectRequest( table, 30, 50 );
table.addMouseListener( mouseListener );
table.addMenuDetectListener( menuDetectListener );
Fixture.readDataAndProcessAction( display );
InOrder inOrder = inOrder( menuDetectListener, mouseListener );
inOrder.verify( mouseListener ).mouseDown( any( MouseEvent.class ) );
inOrder.verify( menuDetectListener ).menuDetected( any( MenuDetectEvent.class ) );
inOrder.verify( mouseListener ).mouseUp( any( MouseEvent.class ) );
}
private Table createTableWithMouseListener() {
Table result = new Table( shell, SWT.NONE );
result.setSize( 100, 100 );
for( int i = 0; i < 5; i++ ) {
new TableItem( result, SWT.NONE);
}
result.addMouseListener( new LoggingMouseListener( events ) );
return result;
}
private static void fakeSelectionRequest( Widget widget, Widget item ) {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put( ClientMessageConst.EVENT_PARAM_ITEM, getId( item ) );
Fixture.fakeNotifyOperation( getId( widget ),
ClientMessageConst.EVENT_WIDGET_SELECTED,
parameters );
}
private static void fakeMenuDetectRequest( Widget widget, int x, int y ) {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put( ClientMessageConst.EVENT_PARAM_X, Integer.valueOf( x ) );
parameters.put( ClientMessageConst.EVENT_PARAM_Y, Integer.valueOf( y ) );
Fixture.fakeNotifyOperation( getId( widget ),
ClientMessageConst.EVENT_MENU_DETECT,
parameters );
}
private static void fakeMouseDoubleClickRequest( Widget widget, int x, int y ) {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put( ClientMessageConst.EVENT_PARAM_BUTTON, Integer.valueOf( 1 ) );
parameters.put( ClientMessageConst.EVENT_PARAM_X, Integer.valueOf( x ) );
parameters.put( ClientMessageConst.EVENT_PARAM_Y, Integer.valueOf( y ) );
parameters.put( ClientMessageConst.EVENT_PARAM_TIME, Integer.valueOf( 0 ) );
Fixture.fakeNotifyOperation( getId( widget ),
ClientMessageConst.EVENT_MOUSE_DOUBLE_CLICK,
parameters );
}
private static void fakeMouseUpRequest( Widget widget, int x, int y ) {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put( ClientMessageConst.EVENT_PARAM_BUTTON, Integer.valueOf( 1 ) );
parameters.put( ClientMessageConst.EVENT_PARAM_X, Integer.valueOf( x ) );
parameters.put( ClientMessageConst.EVENT_PARAM_Y, Integer.valueOf( y ) );
parameters.put( ClientMessageConst.EVENT_PARAM_TIME, Integer.valueOf( 0 ) );
Fixture.fakeNotifyOperation( getId( widget ), ClientMessageConst.EVENT_MOUSE_UP, parameters );
}
private static void fakeMouseDownRequest( Widget widget, int x, int y ) {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put( ClientMessageConst.EVENT_PARAM_BUTTON, Integer.valueOf( 1 ) );
parameters.put( ClientMessageConst.EVENT_PARAM_X, Integer.valueOf( x ) );
parameters.put( ClientMessageConst.EVENT_PARAM_Y, Integer.valueOf( y ) );
parameters.put( ClientMessageConst.EVENT_PARAM_TIME, Integer.valueOf( 0 ) );
Fixture.fakeNotifyOperation( getId( widget ), ClientMessageConst.EVENT_MOUSE_DOWN, parameters );
}
}