forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCodeHintList.js
More file actions
1 lines (1 loc) · 8.64 KB
/
Copy pathCodeHintList.js
File metadata and controls
1 lines (1 loc) · 8.64 KB
1
define(function(require,exports,module){const KeyBindingManager=require("command/KeyBindingManager"),Menus=require("command/Menus"),KeyEvent=require("utils/KeyEvent"),StringUtils=require("utils/StringUtils"),ValidationUtils=require("utils/ValidationUtils"),ViewUtils=require("utils/ViewUtils"),PopUpManager=require("widgets/PopUpManager"),Mustache=require("thirdparty/mustache/mustache"),CodeHintListHTML=require("text!htmlContent/code-hint-list.html"),SELECTION_REASON={KEYBOARD_NAV:"KeyboardNav",SESSION_START:"sessionStart"};function CodeHintList(editor,insertHintOnTab,maxResults){this.hints=[],this.selectedIndex=-1,this.maxResults=ValidationUtils.isIntegerInRange(maxResults,1,1e3)?maxResults:50,this.opened=!1,this.editor=editor,this.insertHintOnTab=insertHintOnTab,this.pendingText="",this.handleSelect=null,this.handleClose=null,this.$hintMenu=$("<li class='dropdown codehint-menu'></li>").append($("<a href='#' class='dropdown-toggle' data-toggle='dropdown'></a>").hide()).append("<ul class='dropdown-menu'></ul>"),this._keydownHook=this._keydownHook.bind(this)}CodeHintList.prototype._setSelectedIndex=function(index,reason){var items=this.$hintMenu.find("li.code-hints-list-item");if(index=Math.max(-1,Math.min(index,items.length-1)),reason&&reason.source===SELECTION_REASON.KEYBOARD_NAV&&(this._userNavigated=!0),items.find("a.highlight").removeClass("highlight"),this.selectedIndex=index,-1!==this.selectedIndex){var $item=$(items[this.selectedIndex]),$view=this.$hintMenu.find("ul.dropdown-menu");$item.find("a").addClass("highlight"),ViewUtils.scrollElementIntoView($view,$item,!1),this.handleHighlight&&this.handleHighlight($item.find("a"),this.$hintMenu.find("#codehint-desc"),reason)}},CodeHintList.prototype.addPendingText=function(text){this.pendingText+=text},CodeHintList.prototype.removePendingText=function(text){0===this.pendingText.indexOf(text)&&(this.pendingText=this.pendingText.slice(text.length))},CodeHintList.prototype._buildListView=function(hintObj){var self=this,match=hintObj.match,selectInitial=hintObj.selectInitial,view={hints:[]},_addHint;if(this.hints=hintObj.hints,this.hints.handleWideResults=hintObj.handleWideResults,this.enableDescription=hintObj.enableDescription,_addHint=match?function(name){var displayName=name.replace(new RegExp(StringUtils.regexEscape(match),"i"),"<span class='matched-hint'>$&</span>");view.hints.push({formattedHint:"<span class='brackets-hints'>"+displayName+"</span>"})}:function(hint){view.hints.push({formattedHint:hint.jquery?"":hint})},this.$hintMenu.find("li.code-hints-list-item").remove(),0===this.hints.length)this.handleClose&&this.handleClose();else{this.hints.some(function(item,index){if(index>=self.maxResults)return!0;_addHint(item)});var $ul=this.$hintMenu.find("ul.dropdown-menu"),$parent=$ul.parent();$ul.remove().append(Mustache.render(CodeHintListHTML,view)),$ul.children("li").each(function(index,element){var hint=self.hints[index],$element=$(element);$element.data("hint",hint),hint.jquery&&$element.find(".codehint-item").append(hint)}),$ul.on("click","li",function(e){e.stopPropagation(),self.handleSelect&&self.handleSelect($(this).data("hint"))}),this.hints.handleWideResults&&$ul.find("li a").addClass("wide-result"),$parent.append($ul),this.enableDescription&&($parent.find("#codehint-desc").remove(),$parent.append("<div id='codehint-desc' class='dropdown-menu quiet-scrollbars'></div>"),$ul.addClass("withDesc")),this._setSelectedIndex(selectInitial?0:-1,{source:SELECTION_REASON.SESSION_START})}},CodeHintList.prototype._calcHintListLocation=function(){var cursor=this.editor._codeMirror.cursorCoords(),posTop=cursor.bottom,posLeft=cursor.left,textHeight=this.editor.getTextHeight(),$window=$(window),$menuWindow=this.$hintMenu.children("ul"),$descElement=this.$hintMenu.find("#codehint-desc"),descOverhang=1===$descElement.length?$descElement.height():0,menuHeight=$menuWindow.outerHeight()+descOverhang,bottomOverhang;posTop+menuHeight-$window.height()>0&&(posTop-=textHeight+2+menuHeight),posTop-=30;var menuWidth=$menuWindow.width(),availableWidth=menuWidth,rightOverhang=posLeft+menuWidth-$window.width();rightOverhang>0?posLeft=Math.max(0,posLeft-rightOverhang):this.hints.handleWideResults&&(availableWidth=menuWidth+Math.abs(rightOverhang));var descOffset=this.$hintMenu.find("ul.dropdown-menu")[0].getBoundingClientRect().height;return 0===descOffset&&(descOffset=menuHeight-descOverhang),this.$hintMenu.find("#codehint-desc").css("margin-top",descOffset-1),{left:posLeft,top:posTop,width:availableWidth}},CodeHintList.prototype.isHandlingKeyCode=function(keyCodeOrEvent){var keyCode="object"==typeof keyCodeOrEvent?keyCodeOrEvent.keyCode:keyCodeOrEvent,ctrlKey="object"==typeof keyCodeOrEvent&&keyCodeOrEvent.ctrlKey;return keyCode===KeyEvent.DOM_VK_UP||keyCode===KeyEvent.DOM_VK_DOWN||keyCode===KeyEvent.DOM_VK_PAGE_UP||keyCode===KeyEvent.DOM_VK_PAGE_DOWN||keyCode===KeyEvent.DOM_VK_RETURN||keyCode===KeyEvent.DOM_VK_CONTROL||keyCode===KeyEvent.DOM_VK_ESCAPE||ctrlKey&&keyCode===KeyEvent.DOM_VK_SPACE||keyCode===KeyEvent.DOM_VK_TAB&&this.insertHintOnTab},CodeHintList.prototype._keydownHook=function(event,isFakeKeydown){var keyCode,self=this;function _rotateSelection(distance){var len=Math.min(self.hints.length,self.maxResults),pos;self.selectedIndex<0?pos=distance>0?distance-1:len-1:(pos=self.selectedIndex,pos=distance>0?pos===len-1?0:Math.min(pos+distance,len-1):0===pos?len-1:Math.max(pos+distance,0)),self._setSelectedIndex(pos,{source:SELECTION_REASON.KEYBOARD_NAV,event:event})}function _itemsPerPage(){var itemsPerPage=1,$items=self.$hintMenu.find("li.code-hints-list-item"),$view=self.$hintMenu.find("ul.dropdown-menu"),itemHeight;return 0!==$items.length&&(itemHeight=$($items[0]).height())&&(itemsPerPage=Math.floor($view.height()/itemHeight),itemsPerPage=Math.max(1,Math.min(itemsPerPage,$items.length))),itemsPerPage}if(!this.isOpen())return this.handleClose(),!1;if(("keydown"===event.type||isFakeKeydown)&&this.isHandlingKeyCode(event)){if(keyCode=event.keyCode,event.keyCode===KeyEvent.DOM_VK_ESCAPE)return event.stopImmediatePropagation(),this.handleClose(),!1;if(event.shiftKey&&(event.keyCode===KeyEvent.DOM_VK_UP||event.keyCode===KeyEvent.DOM_VK_DOWN||event.keyCode===KeyEvent.DOM_VK_PAGE_UP||event.keyCode===KeyEvent.DOM_VK_PAGE_DOWN))return this.handleClose(),!1;if(keyCode===KeyEvent.DOM_VK_UP)_rotateSelection.call(this,-1);else if(keyCode===KeyEvent.DOM_VK_DOWN||event.ctrlKey&&keyCode===KeyEvent.DOM_VK_SPACE)_rotateSelection.call(this,1);else if(keyCode===KeyEvent.DOM_VK_PAGE_UP)_rotateSelection.call(this,-_itemsPerPage());else if(keyCode===KeyEvent.DOM_VK_PAGE_DOWN)_rotateSelection.call(this,_itemsPerPage());else{if(-1===this.selectedIndex||!(keyCode===KeyEvent.DOM_VK_RETURN||keyCode===KeyEvent.DOM_VK_TAB&&this.insertHintOnTab))return!1;if(this.pendingText)return!1;$(this.$hintMenu.find("li.code-hints-list-item")[this.selectedIndex]).trigger("click")}return event.stopImmediatePropagation(),event.preventDefault(),!0}return!1},CodeHintList.prototype.isOpen=function(){return this.opened&&!this.$hintMenu.hasClass("open")&&(this.opened=!1),this.opened},CodeHintList.prototype.open=function(hintObj){if(Menus.closeAll(),this._buildListView(hintObj),this.hints.length){$("#codehint-menu-bar > ul").append(this.$hintMenu);var hintPos=this._calcHintListLocation();this.$hintMenu.addClass("open").css({left:hintPos.left,top:hintPos.top,width:hintPos.width+"px"}),this.opened=!0,KeyBindingManager.addGlobalKeydownHook(this._keydownHook)}},CodeHintList.prototype.update=function(hintObj){this.$hintMenu.addClass("apply-transition");var prevText=null;if(this._userNavigated&&this.selectedIndex>=0){var $prevSel=this.$hintMenu.find("li.code-hints-list-item").eq(this.selectedIndex).find(".brackets-hints").first();$prevSel.length&&(prevText=$prevSel.text())}if(this._buildListView(hintObj),prevText){var matchIndex=-1;this.$hintMenu.find("li.code-hints-list-item").each(function(i,li){if($(li).find(".brackets-hints").first().text()===prevText)return matchIndex=i,!1}),matchIndex>=0&&this._setSelectedIndex(matchIndex)}if(this.hints.length){var hintPos=this._calcHintListLocation();this.$hintMenu.css({left:hintPos.left,top:hintPos.top,width:hintPos.width+"px"})}},CodeHintList.prototype.callMoveUp=function(event){this._keydownHook(event,!0)},CodeHintList.prototype.close=function(){this.opened=!1,this.$hintMenu&&(this.$hintMenu.removeClass("open"),PopUpManager.removePopUp(this.$hintMenu),this.$hintMenu.remove()),KeyBindingManager.removeGlobalKeydownHook(this._keydownHook)},CodeHintList.prototype.onSelect=function(callback){this.handleSelect=callback},CodeHintList.prototype.onHighlight=function(callback){this.handleHighlight=callback},CodeHintList.prototype.onClose=function(callback){this.handleClose=callback},exports._SELECTION_REASON=SELECTION_REASON,exports.CodeHintList=CodeHintList});