2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 06:39:11 +00:00
fhem-mirror/fhem/www/codemirror/show-hint.js
rapster d618ddc172 www/codemirror/*:
- feature: codemirror modules now loaded by default: search.js, comment.js
                 dialog.js, autorefresh.js, searchcursor.js, dialog.css
             codemirror search & replace is now activated by default.
                 to use this feature now you must only load in fhemweb
                 attribute 'JavaScripts' the codemirror/fhem_codemirror.js file
             new extraKeys for 'TAB', 'Shift+Tab', 'STRG+Q', 'STRG+UP',
                 and 'STRG+DOWN' are added.
             codemirror default parameters are now:
                 indentUnit:4, indentWithTabs:false, autoCloseBrackets:false,
                 matchBrackets:true, autofocus:true, theme:"blackboard",
                 lineNumbers:true, autoRefresh:true
               this can be overwritten with fhemweb attribute 'codemirrorParam'
  - updated: codemirror version to 5.8 
             the default codemirror javascript files are now minified


git-svn-id: https://svn.fhem.de/fhem/trunk@9668 2b470e98-0d58-463d-a4d8-8e2adae1ed80
2015-10-25 16:53:17 +00:00

18 lines
8.5 KiB
JavaScript

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