-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathDropdownEventHandler.js
More file actions
1 lines (1 loc) · 4.29 KB
/
DropdownEventHandler.js
File metadata and controls
1 lines (1 loc) · 4.29 KB
1
define(function(require,exports,module){var KeyBindingManager=require("command/KeyBindingManager"),KeyEvent=require("utils/KeyEvent"),PopUpManager=require("widgets/PopUpManager"),ViewUtils=require("utils/ViewUtils");function DropdownEventHandler($list,selectionCallback,closeCallback,keyDownCallback){this.$list=$list,this.$items=$list.find("li"),this.selectionCallback=selectionCallback,this.closeCallback=closeCallback,this.keyDownCallback=keyDownCallback,this.scrolling=!1,this._selectedIndex=-1}DropdownEventHandler.prototype.open=function(){var self=this;function _keydownHook(event){var keyCode;if("keydown"===event.type){if((keyCode=event.keyCode)===KeyEvent.DOM_VK_TAB)self.close();else if(keyCode===KeyEvent.DOM_VK_UP)self._tryToSelect(-1===self._selectedIndex?-1:self._selectedIndex-1,-1);else if(keyCode===KeyEvent.DOM_VK_DOWN)self._tryToSelect(-1===self._selectedIndex?0:self._selectedIndex+1,1);else if(keyCode===KeyEvent.DOM_VK_PAGE_UP)self._tryToSelect((self._selectedIndex||0)-self._itemsPerPage(),-1,!0);else if(keyCode===KeyEvent.DOM_VK_PAGE_DOWN)self._tryToSelect((self._selectedIndex||0)+self._itemsPerPage(),1,!0);else if(keyCode===KeyEvent.DOM_VK_HOME)self._tryToSelect(0,1);else if(keyCode===KeyEvent.DOM_VK_END)self._tryToSelect(self.$items.length-1,-1);else{if(-1===self._selectedIndex||keyCode!==KeyEvent.DOM_VK_RETURN)return!!self.keyDownCallback&&self.keyDownCallback(event);self._selectionHandler()}return event.stopImmediatePropagation(),event.preventDefault(),!0}return!1}function closeCallback(){KeyBindingManager.removeGlobalKeydownHook(_keydownHook),self._cleanup()}KeyBindingManager.addGlobalKeydownHook(_keydownHook),this.$list&&(this._registerMouseEvents(),PopUpManager.addPopUp(this.$list,closeCallback,!0,{closeCurrentPopups:!0}))},DropdownEventHandler.prototype.close=function(){this.$list&&PopUpManager.removePopUp(this.$list)},DropdownEventHandler.prototype._cleanup=function(){this.$list&&this.$list.off(".dropdownEventHandler"),this.closeCallback&&this.closeCallback()},DropdownEventHandler.prototype._tryToSelect=function(index,direction,noWrap){var len=this.$items.length;noWrap?index<0?(index=0,direction=1):index>=len&&(index=len-1,direction=-1):(index%=len)<0&&(index+=len);var $item=this.$items.eq(index);$item.hasClass("divider")||$item.hasClass("sticky-li-top")||$item.find("a.disabled").length||!$item.is(":visible")?this._tryToSelect(index+direction,direction,noWrap):this._setSelectedIndex(index,!0)},DropdownEventHandler.prototype._itemsPerPage=function(){var itemsPerPage=1,itemHeight;return 0!==this.$items.length&&(itemHeight=$(this.$items[0]).height())&&(itemsPerPage=Math.floor(this.$list.height()/itemHeight),itemsPerPage=Math.max(1,Math.min(itemsPerPage,this.$items.length))),itemsPerPage},DropdownEventHandler.prototype._selectionHandler=function(){if(-1!==this._selectedIndex){var $link=this.$items.eq(this._selectedIndex).find("a");this._clickHandler($link)}},DropdownEventHandler.prototype._clickHandler=function($link){this.selectionCallback&&this.$list&&$link&&($link.hasClass("disabled")||(this.selectionCallback($link),PopUpManager.removePopUp(this.$list)))},DropdownEventHandler.prototype._setSelectedIndex=function(index,scrollIntoView){if(index=Math.max(-1,Math.min(index,this.$items.length-1)),-1!==this._selectedIndex&&this.$items.eq(this._selectedIndex).find("a").removeClass("selected"),this._selectedIndex=index,-1!==this._selectedIndex){var $item=this.$items.eq(this._selectedIndex);$item.find("a").addClass("selected"),scrollIntoView&&(this.scrolling=!0,ViewUtils.scrollElementIntoView(this.$list,$item,!1))}},DropdownEventHandler.prototype._registerMouseEvents=function(){var self=this;this.$list.on("click.dropdownEventHandler","a",function(){self._clickHandler($(this))}).on("mouseover.dropdownEventHandler","a",function(e){if(self.scrolling)self.scrolling=!1;else{var $link=$(e.currentTarget),$item=$link.closest("li"),viewOffset=self.$list.offset(),elementOffset=$item.offset();$link.hasClass("disabled")||elementOffset.top<viewOffset.top+self.$list.height()&&viewOffset.top<=elementOffset.top&&self._setSelectedIndex(self.$items.index($item),!1)}})},DropdownEventHandler.prototype.reRegisterMouseHandlers=function($list){this.$list&&(this.$list.off(".dropdownEventHandler"),this.$list=$list,this.$items=$list.find("li"),this._registerMouseEvents())},exports.DropdownEventHandler=DropdownEventHandler});