SequenceDiagram/web/lib/show-hint.js

1 line
8.6 KiB
JavaScript

!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(t){"use strict";function i(t,i){this.cm=t,this.options=i,this.widget=null,this.debounce=0,this.tick=0,this.startPos=this.cm.getCursor("start"),this.startLen=this.cm.getLine(this.startPos.line).length-this.cm.getSelection().length;var e=this;t.on("cursorActivity",this.activityFunc=function(){e.cursorActivity()})}function e(t){return"string"==typeof t?t:t.text}function n(t,i){for(;i&&i!=t;){if("LI"===i.nodeName.toUpperCase()&&i.parentNode==t)return i;i=i.parentNode}}function o(i,o){this.completion=i,this.data=o,this.picked=!1;var s=this,h=i.cm,l=h.getInputField().ownerDocument,a=l.defaultView||l.parentWindow,u=this.hints=l.createElement("ul"),f=i.cm.options.theme;u.className="CodeMirror-hints "+f,this.selectedHint=o.selectedHint||0;for(var p=o.list,d=0;d<p.length;++d){var m=u.appendChild(l.createElement("li")),g=p[d],v=c+(d!=this.selectedHint?"":" "+r);null!=g.className&&(v=g.className+" "+v),m.className=v,g.render?g.render(m,o,g):m.appendChild(l.createTextNode(g.displayText||e(g))),m.hintId=d}var y=h.cursorCoords(i.options.alignWithWord?o.from:null),w=y.left,H=y.bottom,k=!0;u.style.left=w+"px",u.style.top=H+"px";var C=a.innerWidth||Math.max(l.body.offsetWidth,l.documentElement.offsetWidth),b=a.innerHeight||Math.max(l.body.offsetHeight,l.documentElement.offsetHeight);(i.options.container||l.body).appendChild(u);var A=u.getBoundingClientRect(),x=A.bottom-b,S=u.scrollHeight>u.clientHeight+1,T=h.getScrollInfo();if(x>0){var M=A.bottom-A.top;if(y.top-(y.bottom-A.top)-M>0)u.style.top=(H=y.top-M)+"px",k=!1;else if(M>b){u.style.height=b-5+"px",u.style.top=(H=y.bottom-A.top)+"px";var F=h.getCursor();o.from.ch!=F.ch&&(y=h.cursorCoords(F),u.style.left=(w=y.left)+"px",A=u.getBoundingClientRect())}}var N=A.right-C;if(N>0&&(A.right-A.left>C&&(u.style.width=C-5+"px",N-=A.right-A.left-C),u.style.left=(w=y.left-N)+"px"),S)for(var E=u.firstChild;E;E=E.nextSibling)E.style.paddingRight=h.display.nativeBarWidth+"px";if(h.addKeyMap(this.keyMap=function(t,i){function e(t,e){var o;o="string"!=typeof e?function(t){return e(t,i)}:n.hasOwnProperty(e)?n[e]:e,s[t]=o}var n={Up:function(){i.moveFocus(-1)},Down:function(){i.moveFocus(1)},PageUp:function(){i.moveFocus(1-i.menuSize(),!0)},PageDown:function(){i.moveFocus(i.menuSize()-1,!0)},Home:function(){i.setFocus(0)},End:function(){i.setFocus(i.length-1)},Enter:i.pick,Tab:i.pick,Esc:i.close},o=t.options.customKeys,s=o?{}:n;if(o)for(var c in o)o.hasOwnProperty(c)&&e(c,o[c]);var r=t.options.extraKeys;if(r)for(var c in r)r.hasOwnProperty(c)&&e(c,r[c]);return s}(i,{moveFocus:function(t,i){s.changeActive(s.selectedHint+t,i)},setFocus:function(t){s.changeActive(t)},menuSize:function(){return s.screenAmount()},length:p.length,close:function(){i.close()},pick:function(){s.pick()},data:o})),i.options.closeOnUnfocus){var O;h.on("blur",this.onBlur=function(){O=setTimeout(function(){i.close()},100)}),h.on("focus",this.onFocus=function(){clearTimeout(O)})}return h.on("scroll",this.onScroll=function(){var t=h.getScrollInfo(),e=h.getWrapperElement().getBoundingClientRect(),n=H+T.top-t.top,o=n-(a.pageYOffset||(l.documentElement||l.body).scrollTop);if(k||(o+=u.offsetHeight),o<=e.top||o>=e.bottom)return i.close();u.style.top=n+"px",u.style.left=w+T.left-t.left+"px"}),t.on(u,"dblclick",function(t){var i=n(u,t.target||t.srcElement);i&&null!=i.hintId&&(s.changeActive(i.hintId),s.pick())}),t.on(u,"click",function(t){var e=n(u,t.target||t.srcElement);e&&null!=e.hintId&&(s.changeActive(e.hintId),i.options.completeOnSingleClick&&s.pick())}),t.on(u,"mousedown",function(){setTimeout(function(){h.focus()},20)}),t.signal(o,"select",p[this.selectedHint],u.childNodes[this.selectedHint]),!0}function s(t,i,e,n){if(t.async)t(i,n,e);else{var o=t(i,e);o&&o.then?o.then(n):n(o)}}var c="CodeMirror-hint",r="CodeMirror-hint-active";t.showHint=function(t,i,e){if(!i)return t.showHint(e);e&&e.async&&(i.async=!0);var n={hint:i};if(e)for(var o in e)n[o]=e[o];return t.showHint(n)},t.defineExtension("showHint",function(e){e=function(t,i,e){var n=t.options.hintOptions,o={};for(var s in a)o[s]=a[s];if(n)for(var s in n)void 0!==n[s]&&(o[s]=n[s]);if(e)for(var s in e)void 0!==e[s]&&(o[s]=e[s]);return o.hint.resolve&&(o.hint=o.hint.resolve(t,i)),o}(this,this.getCursor("start"),e);var n=this.listSelections();if(!(n.length>1)){if(this.somethingSelected()){if(!e.hint.supportsSelection)return;for(var o=0;o<n.length;o++)if(n[o].head.line!=n[o].anchor.line)return}this.state.completionActive&&this.state.completionActive.close();var s=this.state.completionActive=new i(this,e);s.options.hint&&(t.signal(this,"startCompletion",this),s.update(!0))}}),t.defineExtension("closeHint",function(){this.state.completionActive&&this.state.completionActive.close()});var h=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},l=window.cancelAnimationFrame||clearTimeout;i.prototype={close:function(){this.active()&&(this.cm.state.completionActive=null,this.tick=null,this.cm.off("cursorActivity",this.activityFunc),this.widget&&this.data&&t.signal(this.data,"close"),this.widget&&this.widget.close(),t.signal(this.cm,"endCompletion",this.cm))},active:function(){return this.cm.state.completionActive==this},pick:function(i,n){var o=i.list[n];o.hint?o.hint(this.cm,i,o):this.cm.replaceRange(e(o),o.from||i.from,o.to||i.to,"complete"),t.signal(i,"pick",o),this.close()},cursorActivity:function(){this.debounce&&(l(this.debounce),this.debounce=0);var t=this.cm.getCursor(),i=this.cm.getLine(t.line);if(t.line!=this.startPos.line||i.length-t.ch!=this.startLen-this.startPos.ch||t.ch<this.startPos.ch||this.cm.somethingSelected()||!t.ch||this.options.closeCharacters.test(i.charAt(t.ch-1)))this.close();else{var e=this;this.debounce=h(function(){e.update()}),this.widget&&this.widget.disable()}},update:function(t){if(null!=this.tick){var i=this,e=++this.tick;s(this.options.hint,this.cm,this.options,function(n){i.tick==e&&i.finishUpdate(n,t)})}},finishUpdate:function(i,e){this.data&&t.signal(this.data,"update");var n=this.widget&&this.widget.picked||e&&this.options.completeSingle;this.widget&&this.widget.close(),this.data=i,i&&i.list.length&&(n&&1==i.list.length?this.pick(i,0):(this.widget=new o(this,i),t.signal(i,"shown")))}},o.prototype={close:function(){if(this.completion.widget==this){this.completion.widget=null,this.hints.parentNode.removeChild(this.hints),this.completion.cm.removeKeyMap(this.keyMap);var t=this.completion.cm;this.completion.options.closeOnUnfocus&&(t.off("blur",this.onBlur),t.off("focus",this.onFocus)),t.off("scroll",this.onScroll)}},disable:function(){this.completion.cm.removeKeyMap(this.keyMap);var t=this;this.keyMap={Enter:function(){t.picked=!0}},this.completion.cm.addKeyMap(this.keyMap)},pick:function(){this.completion.pick(this.data,this.selectedHint)},changeActive:function(i,e){if(i>=this.data.list.length?i=e?this.data.list.length-1:0:i<0&&(i=e?0:this.data.list.length-1),this.selectedHint!=i){var n=this.hints.childNodes[this.selectedHint];n&&(n.className=n.className.replace(" "+r,"")),(n=this.hints.childNodes[this.selectedHint=i]).className+=" "+r,n.offsetTop<this.hints.scrollTop?this.hints.scrollTop=n.offsetTop-3:n.offsetTop+n.offsetHeight>this.hints.scrollTop+this.hints.clientHeight&&(this.hints.scrollTop=n.offsetTop+n.offsetHeight-this.hints.clientHeight+3),t.signal(this.data,"select",this.data.list[this.selectedHint],n)}},screenAmount:function(){return Math.floor(this.hints.clientHeight/this.hints.firstChild.offsetHeight)||1}},t.registerHelper("hint","auto",{resolve:function(i,e){var n,o=i.getHelpers(e,"hint");if(o.length){var c=function(t,i,e){function n(o){if(o==c.length)return i(null);s(c[o],t,e,function(t){t&&t.list.length>0?i(t):n(o+1)})}var c=function(t,i){if(!t.somethingSelected())return i;for(var e=[],n=0;n<i.length;n++)i[n].supportsSelection&&e.push(i[n]);return e}(t,o);n(0)};return c.async=!0,c.supportsSelection=!0,c}return(n=i.getHelper(i.getCursor(),"hintWords"))?function(i){return t.hint.fromList(i,{words:n})}:t.hint.anyword?function(i,e){return t.hint.anyword(i,e)}:function(){}}}),t.registerHelper("hint","fromList",function(i,e){var n,o=i.getCursor(),s=i.getTokenAt(o),c=t.Pos(o.line,s.start),r=o;s.start<o.ch&&/\w/.test(s.string.charAt(o.ch-s.start-1))?n=s.string.substr(0,o.ch-s.start):(n="",c=o);for(var h=[],l=0;l<e.words.length;l++){var a=e.words[l];a.slice(0,n.length)==n&&h.push(a)}if(h.length)return{list:h,from:c,to:r}}),t.commands.autocomplete=t.showHint;var a={hint:t.hint.auto,completeSingle:!0,alignWithWord:!0,closeCharacters:/[\s()\[\]{};:>,]/,closeOnUnfocus:!0,completeOnSingleClick:!0,container:null,customKeys:null,extraKeys:null};t.defineOption("hintOptions",null)});