📄 texteditor.js
字号:
/*support
tab: to 4 space
enter: add head space
{enter: add head+4 space
}:add head-4 space
*/
Class("linb.UI.TextEditor", ["linb.UI.Widget","linb.absValue"] ,{
Instance:{
activate:function(){
var profile = this.get(0);
profile.getSubNode('INPUT').focus();
return this;
},
_setCtrlValue:function(value){
if(_.isNull(value) || !_.exists(value))value='';
return this.each(function(profile){
var node=profile.getSubNode('INPUT').get(0);
if(node.value.replace(/(\r\n|\r)/g, "\n")!=value.replace(/(\r\n|\r)/g, "\n")){
var st=node.scrollTop;
node.value=value;
node.scrollTop=st;
}
});
},
_getCtrlValue:function(value){
var profile = this.get(0);
return profile.getSubNode('INPUT').attr('value').replace(/(\r\n|\r)/g, "\n").replace(/( +)(\n)/g, "$2").replace(/\t/g, " ");
}
},
Initialize:function(){
//modify default template for shell
var t = this.getTemplate();
_.merge(t.FRAME.BORDER,{
BOX:{
tagName:'div',
INPUT:{
tagName:'textarea',
tabindex:'{tabindex}',
style:'{_css}'
}
},
BAK1:{},
BAK2:{tagName:'div'}
},'all');
this.setTemplate(t);
},
Static:{
Appearances:{
BOX:{
width:'100%',
height:'100%',
left:0,
top:0,
//for firefox bug: cursor not show
position:'absolute',
overflow:linb.browser.gek?'auto':'',
'z-index':'10'
},
INPUT:{
'font-family': 'Courier New, Courier, monospace',
'font-size':'12px',
'line-height':'14px',
position:'absolute',
'background-color':'#fff',
left:0,
top:0,
border:0,
margin:0,
padding:0,
overflow:'auto',
'overflow-y':(linb.browser.gek||linb.browser.ie)?'auto':'',
'overflow-x':(linb.browser.gek||linb.browser.ie)?'hidden':''
},
'BAK1, BAK2':{
'font-family': 'Courier New, Courier, monospace',
'font-size':'12px',
position:'absolute',
visibility:'hidden',
left:'-10000px',
top:'-10000px'
}
},
Behaviors:{
INPUT:{
onFocus:function(profile,e,src){
profile.box._onchange(profile,src);
},
onChange:function(profile, e, src){
profile.boxing().setUIValue(src.value);
profile.box._onchange(profile,src);
},
afterKeydown:function(profile, e, src){
var pro=profile.properties,str,t;
if(pro.disabled || pro.readonly)return;
if(profile.$change)delete profile.$change;
var key = linb.Event.getKey(e),
k=key[0];
switch(k){
case 'tab':
var r=linb([src]).caret(),
sel=src.value.slice(r[0],r[1]);
if(/(\n|\r)/.test(sel)){
//previous
str=src.value.slice(0,r[0]);
if(sel.charAt(0)!='\n' && sel.charAt(0)!='\r'){
//change sel
sel=str.slice(r[0]=str.lastIndexOf('\n'))+sel;
}
//
if(linb.browser.ie){
t= (t=str.match(/\r/g))?t.length:0;
r[0]-=t;
t= (t=(src.value.slice(0,r[1])).match(/\r/g))?t.length:0;
r[1]-=t;
}
//re caret
linb([src]).caret(r[0],r[1]);
if(key[2]){
sel=sel.replace(/(\n|\n\r) /g,'$1');
}else{
sel=sel.replace(/(\n|\n\r)/g,'$1 ');
}
//insert
profile.box.insertAtCaret(profile,sel);
r[1]=r[0]+sel.length;
if(linb.browser.ie){
t= (t=sel.match(/\r/g))?t.length:0;
r[1]-=t;
}
//caret
linb([src]).caret(r[0],r[1]);
}else{
if(key[2]){
linb([src]).caret(r[0]-4,r[0]-4);
r[0]-=4;
r[1]-=4;
}else{
profile.box.insertAtCaret(profile,' ');
r[0]+=4;
r[1]+=4;
}
}
profile.$pos=r;
return false;
case 'enter':
var paras = profile.box.getParas(profile);
str = paras[1];
var len = str.length - _.str.ltrim(str).length;
if(str.charAt(str.length-1)=="{")
len +=4;
if(len){
profile.box.insertAtCaret(profile, '\n'+_.str.repeat(' ',len));
profile.$enter=true;
return false;
}
break;
default:
if(profile.tips){
profile.tips.destroy();
profile.tips=null;
}
}
},
afterKeypress:function(profile, e, src){
if(profile.properties.disabled || profile.properties.readonly)return;
var key = linb.Event.getKey(e), k=key[0];
var me=arguments.callee, map=me.map || (me.map={space:1,enter:1,backspace:1,tab:1,"delete":1});
if(k.length==1 || map[k])
profile.$change=true;
switch(k){
case 'tab':
if(linb.browser.opr)
_.asyRun(function(){
linb([src]).caret(profile.$pos[0], profile.$pos[1]);
});
return false;
case 'enter':
if(profile.$enter){
delete profile.$enter;
return false;
}
case '}':
if(key[2]){
var paras = profile.box.getParas(profile);
var
loc = paras[0],
str = paras[1],
pos=paras[2],
input=paras[3];
if(/ {4}$/.test(str)){
var st=linb(src).scrollTop();
input.value =
input.value.substr(0,loc).replace(/ {4}$/,'}') +
input.value.substr(loc, input.value.length);
//fire event manully
linb(input).onChange();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -