blob: d3ab6dd9cf6a66ca9c941d8c2c57b49d034ace01 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002, 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
******************************************************************************/
/**
* This class contains static listener functions for common events.
*/
qx.Class.define( "org.eclipse.swt.EventUtil", {
statics : {
_suspended : false,
setSuspended : function( value ) {
this._suspended = value;
},
getSuspended : function() {
return this._suspended;
},
DOUBLE_CLICK_TIME : 500,
_capturingWidget : null,
_lastMouseDown : {
widget : null,
button : "",
x : -1,
y : -1,
mouseUpCount : 0
},
_shiftKey : false,
_ctrlKey : false,
_altKey : false,
_metaKey : false,
eventTimestamp : function() {
var init = org.eclipse.rwt.System.getInstance();
return new Date().getTime() - init.getStartupTime();
},
widgetDefaultSelected : function( evt ) {
if( !org.eclipse.swt.EventUtil.getSuspended() ) {
var widgetManager = org.eclipse.swt.WidgetManager.getInstance();
var id = widgetManager.findIdByWidget( evt.getTarget() );
var req = org.eclipse.swt.Request.getInstance();
req.addEvent( "org.eclipse.swt.events.widgetDefaultSelected", id );
org.eclipse.swt.EventUtil.addWidgetSelectedModifier();
req.send();
}
},
widgetSelected : function( evt ) {
var widgetManager = org.eclipse.swt.WidgetManager.getInstance();
var req = org.eclipse.swt.Request.getInstance();
var id = widgetManager.findIdByWidget( evt.getTarget() );
var left = evt.getTarget().getLeft();
var top = evt.getTarget().getTop();
var width = evt.getTarget().getWidth();
var height = evt.getTarget().getHeight();
org.eclipse.swt.EventUtil.doWidgetSelected( id, left, top, width, height );
},
doWidgetSelected : function( id, left, top, width, height ) {
if( !org.eclipse.swt.EventUtil.getSuspended() ) {
var req = org.eclipse.swt.Request.getInstance();
req.addEvent( "org.eclipse.swt.events.widgetSelected", id );
org.eclipse.swt.EventUtil.addWidgetSelectedModifier();
req.addParameter( id + ".bounds.x", left );
req.addParameter( id + ".bounds.y", top );
req.addParameter( id + ".bounds.width", width );
req.addParameter( id + ".bounds.height", height );
req.send();
}
},
addWidgetSelectedModifier : function() {
if( !org.eclipse.swt.EventUtil.getSuspended() ) {
var modifier = org.eclipse.swt.EventUtil._getKeyModifier();
if( modifier !== "" ) {
var req = org.eclipse.swt.Request.getInstance();
req.addParameter( "org.eclipse.swt.events.widgetSelected.modifier", modifier );
}
}
},
_getKeyModifier : function() {
var modifier = "";
var commandKey
= org.eclipse.rwt.Client.getPlatform() === "mac" && org.eclipse.swt.EventUtil._metaKey;
if( org.eclipse.swt.EventUtil._shiftKey ) {
modifier += "shift,";
}
if( org.eclipse.swt.EventUtil._ctrlKey || commandKey ) {
modifier += "ctrl,";
}
if( org.eclipse.swt.EventUtil._altKey ) {
modifier += "alt,";
}
return modifier;
},
focusGained : function( evt ) {
if( !org.eclipse.swt.EventUtil.getSuspended() ) {
// [if] The focusControl parameter is added in the request in Shell.js
var req = org.eclipse.swt.Request.getInstance();
req.send();
}
},
focusLost : function( evt ) {
if( !org.eclipse.swt.EventUtil.getSuspended() ) {
// [if] The focusControl parameter is added in the request in Shell.js
var req = org.eclipse.swt.Request.getInstance();
req.send();
}
},
///////////////////////
// Mouse event handling
mouseDown : function( evt ) {
if( !org.eclipse.swt.EventUtil.getSuspended()
&& org.eclipse.swt.EventUtil._isRelevantMouseEvent( this, evt ) )
{
// disabled capturing as it interferes with Combo capturing
// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=262171
//// from now on, redirect mouse event to this widget
//this.setCapture( true );
org.eclipse.swt.EventUtil._capturingWidget = this;
// Add parameters for double-click event
if( org.eclipse.swt.EventUtil._isDoubleClick( this, evt ) ) {
org.eclipse.swt.EventUtil._clearLastMouseDown();
org.eclipse.swt.EventUtil._mouseDoubleClickParams( this, evt );
} else {
// Store relevant data of current event to detect double-clicks
var lastMouseDown = org.eclipse.swt.EventUtil._lastMouseDown;
lastMouseDown.widget = this;
lastMouseDown.button = evt.getButton();
lastMouseDown.x = evt.getPageX();
lastMouseDown.y = evt.getPageY();
lastMouseDown.mouseUpCount = 0;
qx.client.Timer.once( org.eclipse.swt.EventUtil._clearLastMouseDown,
this,
org.eclipse.swt.EventUtil.DOUBLE_CLICK_TIME );
}
// Collect request parameters and send
org.eclipse.swt.EventUtil._mouseDownParams( this, evt );
var req = org.eclipse.swt.Request.getInstance();
req.send();
}
},
mouseUp : function( evt ) {
if( !org.eclipse.swt.EventUtil.getSuspended()
&& org.eclipse.swt.EventUtil._isRelevantMouseEvent( this, evt ) )
{
// disabled capturing as it interferes with Combo capturing
// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=262171
//// release mouse event capturing
//this.setCapture( false );
org.eclipse.swt.EventUtil._capturingWidget = null;
// increase number of mouse-up events since last stored mouse down
org.eclipse.swt.EventUtil._lastMouseDown.mouseUpCount += 1;
// Add mouse-up request parameter
org.eclipse.swt.EventUtil._mouseUpParams( this, evt );
var req = org.eclipse.swt.Request.getInstance();
req.send();
}
},
/**
* Determines whether the event is relevant (i.e. should be sent) for the
* given widget.
* @param widget - the listening widget
* @param evt - the mouse event
*/
_isRelevantMouseEvent : function( widget, evt ) {
var result = true;
if( widget !== org.eclipse.swt.EventUtil._capturingWidget
&& widget !== evt.getOriginalTarget() )
{
// find parent control and ensure that it is the same as the widget-
// parameter. Otherwise the mouse event is ignored.
var widgetManager = org.eclipse.swt.WidgetManager.getInstance();
var target = evt.getOriginalTarget();
var control = widgetManager.findControl( target );
result = widget === control;
}
return result;
},
_clearLastMouseDown : function() {
var lastMouseDown = org.eclipse.swt.EventUtil._lastMouseDown;
lastMouseDown.widget = null;
lastMouseDown.button = "";
lastMouseDown.mouseUpCount = 0;
lastMouseDown.x = -1;
lastMouseDown.y = -1;
},
_isDoubleClick : function( widget, evt ) {
// TODO [rh] compare last position with current position and don't
// report double-click if deviation is too big
var lastMouseDown = org.eclipse.swt.EventUtil._lastMouseDown;
return lastMouseDown.mouseUpCount === 1
&& lastMouseDown.widget === widget
&& lastMouseDown.button === qx.event.type.MouseEvent.C_BUTTON_LEFT
&& lastMouseDown.button === evt.getButton();
},
_mouseDownParams : function( widget, evt ) {
var id = org.eclipse.swt.WidgetManager.getInstance().findIdByWidget( widget );
var req = org.eclipse.swt.Request.getInstance();
var button = org.eclipse.swt.EventUtil._determineMouseButton( evt );
var modifier = org.eclipse.swt.EventUtil._getKeyModifier();
req.addEvent( "org.eclipse.swt.events.mouseDown", id );
req.addParameter( "org.eclipse.swt.events.mouseDown.button", button );
req.addParameter( "org.eclipse.swt.events.mouseDown.x", evt.getPageX() );
req.addParameter( "org.eclipse.swt.events.mouseDown.y", evt.getPageY() );
req.addParameter( "org.eclipse.swt.events.mouseDown.time", this.eventTimestamp() );
if( modifier !== "" ) {
req.addParameter( "org.eclipse.swt.events.mouseDown.modifier", modifier );
}
},
_mouseUpParams : function( widget, evt ) {
var id = org.eclipse.swt.WidgetManager.getInstance().findIdByWidget( widget );
var req = org.eclipse.swt.Request.getInstance();
var button = org.eclipse.swt.EventUtil._determineMouseButton( evt );
var modifier = org.eclipse.swt.EventUtil._getKeyModifier();
req.addEvent( "org.eclipse.swt.events.mouseUp", id );
req.addParameter( "org.eclipse.swt.events.mouseUp.button", button );
req.addParameter( "org.eclipse.swt.events.mouseUp.x", evt.getPageX() );
req.addParameter( "org.eclipse.swt.events.mouseUp.y", evt.getPageY() );
req.addParameter( "org.eclipse.swt.events.mouseUp.time", this.eventTimestamp() );
if( modifier !== "" ) {
req.addParameter( "org.eclipse.swt.events.mouseUp.modifier", modifier );
}
},
_mouseDoubleClickParams : function( widget, evt ) {
var id = org.eclipse.swt.WidgetManager.getInstance().findIdByWidget( widget );
var req = org.eclipse.swt.Request.getInstance();
var modifier = org.eclipse.swt.EventUtil._getKeyModifier();
req.addEvent( "org.eclipse.swt.events.mouseDoubleClick", id );
req.addParameter( "org.eclipse.swt.events.mouseDoubleClick.button",
org.eclipse.swt.EventUtil._determineMouseButton( evt ) );
req.addParameter( "org.eclipse.swt.events.mouseDoubleClick.x",
evt.getPageX() );
req.addParameter( "org.eclipse.swt.events.mouseDoubleClick.y",
evt.getPageY() );
req.addParameter( "org.eclipse.swt.events.mouseDoubleClick.time",
this.eventTimestamp() );
if( modifier !== "" ) {
req.addParameter( "org.eclipse.swt.events.mouseDoubleClick.modifier",
modifier );
}
},
/**
* Returns an integer value that represents the button property from the
* given mouse event.
* 0 = unknown
* 1 = left button
* 2 = middle button
* 3 = right button
*/
_determineMouseButton : function( evt ) {
var result = 0;
switch( evt.getButton() ) {
case qx.event.type.MouseEvent.C_BUTTON_LEFT:
result = 1;
break;
case qx.event.type.MouseEvent.C_BUTTON_MIDDLE:
result = 2;
break;
case qx.event.type.MouseEvent.C_BUTTON_RIGHT:
result = 3;
break;
}
return result;
},
helpRequested : function( evt ) {
if( evt.getKeyIdentifier() === "F1" ) {
// stop further handling and default handling by the browser
evt.stopPropagation();
evt.preventDefault();
// send help request to server
var widget = evt.getTarget();
var widgetManager = org.eclipse.swt.WidgetManager.getInstance();
var id = widgetManager.findIdByWidget( widget );
if( id === null ) {
// find parent control for the widget that received the event in case
// it wasn't the control itself that received the event
widget = widgetManager.findControl( widget );
id = widgetManager.findIdByWidget( widget );
}
if( id != null ) {
var req = org.eclipse.swt.Request.getInstance();
req.addEvent( "org.eclipse.swt.events.help", id );
req.send();
}
}
},
menuDetectedByKey : function( evt ) {
if( evt.getKeyIdentifier() === "Apps" ) {
// stop further handling and default handling by the browser
evt.stopPropagation();
evt.preventDefault();
var x = qx.event.type.MouseEvent.getPageX();
var y = qx.event.type.MouseEvent.getPageY();
org.eclipse.swt.EventUtil.sendMenuDetected( evt.getTarget(), x, y );
}
},
menuDetectedByMouse : function( evt ) {
if( evt.getButton() === qx.event.type.MouseEvent.C_BUTTON_RIGHT ) {
// stop further handling and default handling by the browser
evt.stopPropagation();
evt.preventDefault();
var x = evt.getPageX();
var y = evt.getPageY();
org.eclipse.swt.EventUtil.sendMenuDetected( evt.getTarget(), x, y );
}
},
sendMenuDetected : function( widget, x, y ) {
if( !org.eclipse.swt.EventUtil.getSuspended() ) {
// send menu detect request to server
var widgetManager = org.eclipse.swt.WidgetManager.getInstance();
// find parent control for the widget that received the event in case
// it wasn't the control itself that received the event
while( widget != null && !widgetManager.isControl( widget ) ) {
widget = widget.getParent ? widget.getParent() : null;
}
var id = widgetManager.findIdByWidget( widget );
if( id != null ) {
var req = org.eclipse.swt.Request.getInstance();
req.addEvent( "org.eclipse.swt.events.menuDetect", id );
req.addParameter( "org.eclipse.swt.events.menuDetect.x", x );
req.addParameter( "org.eclipse.swt.events.menuDetect.y", y );
req.send();
}
}
}
}
} );