107 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| webix.protoUI({
 | |
| 	name:"codemirror-editor",
 | |
| 	defaults:{
 | |
| 		mode:"javascript",
 | |
| 		lineNumbers:true,
 | |
| 		matchBrackets:true,
 | |
| 		theme:"default"
 | |
| 	},
 | |
| 	$init:function(config){
 | |
| 		this.$view.innerHTML = "<textarea style='width:100%;height:100%;'></textarea>";
 | |
| 		this.$ready.push(this._render_cm_editor);
 | |
| 	},
 | |
| 	_render_cm_editor:function(){
 | |
| 		webix.require("codemirror/lib/codemirror.css");
 | |
| 		var deps = [
 | |
| 			"codemirror/lib/codemirror.js"
 | |
| 		];
 | |
| 
 | |
| 		if (this.config.mode == "htmlmixed"){
 | |
| 			deps.push("codemirror/mode/xml/xml.js");
 | |
| 			deps.push("codemirror/mode/css/css.js");
 | |
| 			deps.push("codemirror/mode/javascript/javascript.js");
 | |
| 		}
 | |
| 
 | |
| 		deps.push("codemirror/mode/"+this.config.mode+"/"+this.config.mode+".js");
 | |
| 		webix.require(deps, this._render_when_ready, this);
 | |
| 	},
 | |
| 
 | |
| 	_render_when_ready:function(){
 | |
| 		this.editor = CodeMirror.fromTextArea(this.$view.firstChild, {
 | |
| 			mode: this.config.mode,
 | |
| 			lineNumbers: this.config.lineNumbers,
 | |
| 			matchBrackets: this.config.matchBrackets,
 | |
| 			theme: this.config.theme
 | |
| 		});
 | |
| 
 | |
| 		this.setValue(this.config.value);
 | |
| 		if (this._focus_await)
 | |
| 			this.focus();
 | |
| 	},
 | |
| 
 | |
| 	_set_inner_size:function(){
 | |
| 		if (!this.editor || !this.$width) return;
 | |
| 
 | |
| 		this._updateScrollSize();
 | |
| 		this.editor.scrollTo(0,0); //force repaint, mandatory for IE
 | |
| 	},
 | |
| 	_updateScrollSize:function(){
 | |
| 		var box = this.editor.getWrapperElement();
 | |
| 		var height = (this.$height || 0) + "px";
 | |
| 
 | |
| 		box.style.height = height;
 | |
| 		box.style.width = (this.$width || 0) + "px";
 | |
| 
 | |
| 		var scroll = this.editor.getScrollerElement();
 | |
| 		if (scroll.style.height != height){
 | |
| 			scroll.style.height = height;
 | |
| 			this.editor.refresh();
 | |
| 		}
 | |
| 	},
 | |
| 	$setSize:function(x,y){
 | |
| 		if (webix.ui.view.prototype.$setSize.call(this, x, y)){
 | |
| 			this._set_inner_size();
 | |
| 		}
 | |
| 	},
 | |
| 
 | |
| 	setValue:function(value){
 | |
| 		if(!value && value !== 0)
 | |
| 			value = "";
 | |
| 
 | |
| 		this.config.value = value;
 | |
| 		if(this.editor){
 | |
| 			this.editor.setValue(value);
 | |
| 			//by default - clear editor's undo history when setting new value
 | |
| 			if(!this.config.preserveUndoHistory)
 | |
| 				this.editor.clearHistory();
 | |
| 			this._updateScrollSize();
 | |
| 		}
 | |
| 	},
 | |
| 
 | |
| 	getValue:function(){
 | |
| 		return this.editor?this.editor.getValue():this.config.value;
 | |
| 	},
 | |
| 
 | |
| 	focus:function(){
 | |
| 		this._focus_await = true;
 | |
| 		if (this.editor)
 | |
| 			this.editor.focus();
 | |
| 	},
 | |
| 
 | |
| 	getEditor:function(){
 | |
| 		return this.editor;
 | |
| 	},
 | |
| 
 | |
| 
 | |
| 	//undo, redo, etc
 | |
| 	undo:function(){
 | |
| 		this.editor.undo();
 | |
| 	},
 | |
| 	redo:function(){
 | |
| 		this.editor.redo();
 | |
| 	},
 | |
| 	undoLength:function(){
 | |
| 		return this.editor.historySize().undo;
 | |
| 	}
 | |
| }, webix.ui.view);
 |