blob: dec0cad823fcaae831822b78350ea6aac2ae434f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2018 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
******************************************************************************/
rwt.qx.Class.define( "rwt.widgets.util.MenuManager", {
extend : rwt.util.ObjectManager,
statics : {
getInstance : function() {
return rwt.runtime.Singletons.get( rwt.widgets.util.MenuManager );
}
},
members : {
// Note: This function is called on alle mousedown and mouseup events,
// and also on "esc" and "tab" key-events and on window-blur.
update : function( target, eventType ) {
var menus = this.getAll();
var isMouseDown = eventType == "mousedown";
var isMouseUp = eventType == "mouseup";
var isMouseEvent = isMouseDown || isMouseUp;
var eventHasTarget = target != null;
var targetHasMenu = eventHasTarget
&& target.getMenu
&& target.getMenu() != null;
var targetMenuBar = this._getMenuBar( target );
for ( var hash in menus ) {
var menu = menus[ hash ];
var hide = false;
// 1. AutoHide supported?
if ( menu.getAutoHide() ) {
// Gathering data
var targetIsOpener = menu.getOpener() === target;
var isContextMenu =
!( menu.getOpener() instanceof rwt.widgets.MenuItem );
var notSameMenuBar = targetMenuBar != this._getMenuBar( menu );
// 2. Global event like keydown or blur?
if ( !eventHasTarget || !isMouseEvent ) {
hide = true;
}
// 3. Click on another menubar?
if( isMouseDown && notSameMenuBar ) {
hide = true;
}
// 4. Click on the opener of a context menu?
if( isMouseDown && isContextMenu && targetIsOpener ) {
hide = true;
}
// Ignore other events that are handled by the menu itself
if( !targetHasMenu && !targetIsOpener ) {
// 5. mousedown somwhere outside the menu
if ( isMouseDown && !menu.isSubElement( target ) ) {
hide = true;
}
// 6. Execute of an menuItem
if ( isMouseUp
&& menu.isSubElement( target, true )
&& target.isEnabled()
&& target.getParentMenu().isPressed() )
{
hide = true;
}
}
}
if( hide ) {
menu.hide();
}
}
},
_getMenuBar : function( widget ) {
var menu = null;
var menuBar = null;
if( widget instanceof rwt.widgets.MenuItem ) {
menu = widget.getParentMenu();
} else {
if( widget instanceof rwt.widgets.Menu
|| widget instanceof rwt.widgets.MenuBar
) {
menu = widget;
}
}
while ( menuBar == null && menu != null ) {
if( menu instanceof rwt.widgets.MenuBar ) {
menuBar = menu;
} else {
var hasOpener =
menu.getOpener() instanceof rwt.widgets.MenuItem;
menu = hasOpener ? menu.getOpener().getParentMenu() : null;
}
}
return menuBar;
}
}
} );