📄 popmenu.js
字号:
display:'none',
position:'absolute',
'margin-left':'-8px',
right:0,
height:'16px',
width:'16px',
'z-index':'10',
bottom:0,
background: linb.UI.$bg('icons.gif', 'no-repeat -66px -244px', true)
},
'CHECKBOX, CHECKBOX-checked':{
cursor:'pointer',
'vertical-align':'middle',
width:'16px',
height:'16px'
},
CAPTION:{
'vertical-align':'middle',
'padding-left':'6px'
},
RULER:{
width:'100px',
'font-size':0,
'line-height':0
},
ADD:{
position:'absolute',
top:'3px',
right:0,
width:'80px',
'padding-right':'20px',
'text-align':'right',
'z-index':'10'
},
SUB:{
position:'absolute',
top:'4px',
right:0,
width:'8px',
height:'16px',
background: linb.UI.$bg('icons.gif', 'no-repeat -200px -70px', true)
}
},
Behaviors:{
ITEM:{
onMouseover:function(profile, e, src){
var sms='$subPopMenuShowed',
all='$allPops',
hl='$highLight',
showp='$showpops',
popgrp='$popGrp';
//for stop second trigger by focus event
if(profile[hl] == src)return;
var properties = profile.properties,
item = profile.getItemByDom(src),
itemId = item.id,
Cancel = false,
pop,popp,t;
//if sub pop menu showed
if(t=profile[sms]){
//if the showed menu is self
if(t == _.get(profile,[all,itemId]))
Cancel=true;
else{
t.hide();
profile[sms] = null;
}
}
if(!Cancel){
if(t=profile[hl])
linb([t]).tagClass( '-mouseover',false);
profile[hl] = src;
linb([src]).tagClass('-mouseover');
//don't fire events here
try{src.focus()}catch(e){}
}
if(!Cancel && item.sub){
if(_.isArr(item.sub) && item.sub.length){
profile[all] = profile[all] || {};
//no create
if(!(pop = profile[all][itemId])){
pop = (new linb.UI.PopMenu({position:'absolute', items:item.sub, autoHide:profile.properties.autoHide})).render(true);
pop.onMenuSelected(function(pro, item, src){
profile.boxing().onMenuSelected(profile, item, src);
});
popp=pop.get(0);
//set pool to parent
popp.$hideMenuPool = profile.$hideMenuPool || profile.getSubNode('POOL');
profile[all][itemId] = pop;
//collect
profile[showp] = profile[showp] || [profile];
popp[showp] = profile[showp];
profile[showp].push(popp);
}else popp=pop.get(0);
//input a copy of root for group trigger
profile[popgrp].push(popp.root.get(0));
popp[popgrp] = profile[popgrp];
//set parent pop
popp.$parentPopMenu = profile;
profile.$childPopMenu = popp;
pop.pop(src, 2);
profile[sms] = pop;
}else
if(profile.onShowSubMenu){
var r=profile['$sub:'+item.id];
if(r && r['linb.UI'] && !r.isEmpty()){}
else
r=profile.boxing().onShowSubMenu(profile, item, src);
if(r && r['linb.UI'] && !r.isEmpty()){
profile[sms] = r;
r=r.reBoxing();
r.onMouseout(function(p,e,src){
profile.box._mouseout(profile, e, src);
},null,-1);
profile[popgrp].push(r.get(0));
r.popToTop(src,2,profile._conainer);
}
}
}
},
onMouseout:function(profile, e, src){
var properties = profile.properties,
item = profile.getItemByDom(src),
itemId = item.id,
action = true,
t;
//if cursor move to submenu, keep the hover face
if(t=profile.$subPopMenuShowed){
var node = e.toElement||e.relatedTarget,
target = t.get(0).root.get(0);
try{
do{
if(node==target)
return;
}while((node && (node=node.parentNode)))
}catch(a){}
}
linb([src]).tagClass('-mouseover',false);
profile.$highLight = null;
},
onClick:function(profile, e, src){
var prop = profile.properties,
item = profile.getItemByDom(src),
itemId = item.id;
if(prop.disabled || item.disabled)return false;
if(!item.sub){
if(item.type=='checkbox')
profile.getSubNodeByItemId('CHECKBOX',item.id).tagClass('-checked', item.value = !item.value);
if(profile.onMenuSelected)profile.boxing().onMenuSelected(profile, item, src);
if(prop.hideAfterClick){
linb([src]).tagClass('-mouseover',false);
//hide all parent pop
_.asyRun(function(){
var p=profile,q;
while(p){
p.boxing().hide();
p=(q=p).$parentPopMenu;
q.$parentPopMenu = q.$subPopMenuShowed = null;
}
//reset
profile.$subPopMenuShowed = null;
profile.$popGrp.length=0;
},100);
}
}
return false;
},
onFocus:function(profile, e, src){
var box = profile.getSubNode('BOX'),
top=box.scrollTop(), h=box.scrollHeight(),
n = linb([src]).offsetTop();
if(n<top || n>top+h)
linb(src).offsetTop(top);
linb(src).onMouseover();
},
onKeydown : function(profile, e, src){
var item = profile.getItemByDom(src),
items = profile.properties.items,
key = linb.Event.getKey(e)[0],
itemId = item.id,
flag,r,tid,node,t;
switch(key){
case 'up':
r=true;
flag=false;
_.arr.each(items,function(o,i){
if(o.type == 'split')return;
if(flag){
tid=o.id;
return r=false;
}
if(o.id == itemId)flag=true;
},null,true);
//last
if(r)tid=items[items.length-1].id;
node = profile.getSubNodeByItemId('ITEM', tid).get(0);
break;
case 'down':
r=true;
flag=false;
_.arr.each(items,function(o,i){
if(o.type == 'split')return;
if(flag){
tid=o.id;
return r=false;
}
if(o.id == itemId)flag=true;
});
//first
if(r)tid=items[0].id;
node = profile.getSubNodeByItemId('ITEM', tid).get(0);
break;
case 'left':
if(t=profile.$parentPopMenu){
if(t=profile.$parentPopMenu.$highLight)
node = t;
}
break;
case 'right':
if((t=profile.$subPopMenuShowed) && t == profile.$allPops[itemId])
t.activate();
break;
}
if(node&&node.tagName)try{node.focus()}catch(e){}
}
},
TOP:{
onMouseover:function(profile, e, src){
profile.$scrollToTop=true;
profile.boxing()._scrollToTop();
},
onMouseout:function(profile, e, src){
profile.$scrollToTop=false;
profile.$scrollStep=null;
},
onClick:function(profile, e, src){
profile.$scrollStep=1000;
}
},
BOTTOM:{
onMouseover:function(profile, e, src){
profile.$scrollTobottom=true;
profile.boxing()._scrollToBottom();
},
onMouseout:function(profile, e, src){
profile.$scrollTobottom=false;
profile.$scrollStep=null;
},
onClick:function(profile, e, src){
profile.$scrollStep=1000;
}
},
ITEMS:{
beforeKeydown:function(profile, e){
var key=linb.Event.getKey(e)[0];
if(key=='tab' || key=='enter')
return true;
else if(key=='esc'){
//top
do{
profile.boxing().hide();
}while(profile = profile.$parentPopMenu)
return false;
}else return false;
}
},
BORDER:{
onMouseout:function(profile, e, src){
profile.box._mouseout(profile, e, src);
}
}
},
DataModel:({
dock:null,
tabindex:null,
tips:null,
border:null,
resizer:null,
shadow:true,
_maxHeight:260,
_maxWidth:300,
left:-10000,
hideAfterClick:true,
autoHide:false,
height:100,
//opera needs more space for initialize
width:300,
position:'absolute',
$hborder:1,
$vborder:1
}),
EventHandlers:{
onShowSubMenu:function(profile, item, src){},
beforeHide:function(profile){},
onHide:function(profile){},
onMenuSelected:function(profile, item, src){}
},
RenderTrigger:function(){
this.boxing()._adjustSize();
},
_mouseout:function(profile, e, src){
if(profile.properties.autoHide){
var p1=linb.Event.getPos(e),
size, p2, b;
_.arr.each(profile.$popGrp,function(o){
o=linb([o]);
p2=o.offset();
size=o.cssSize();
if(p1.left>p2.left && p1.top>p2.top && p1.left<p2.left+size.width && p1.top<p2.top+size.height)
return b=1;
});
if(!b){
while(b=profile.$parentPopMenu)profile=b;
profile.boxing().hide();
profile.$popGrp.length=0;
}
}
},
_prepareItem:function(profile, item){
item.add = item.add || '';
item.displayAdd = item.add?'':'display:none';
item.tagClass = item.sub?'':'display:none';
item.type=item.type||'button';
if(item.type=='checkbox'){
item.checkboxCls =profile.getClass('CHECKBOX', item.value?'-checked':'');
}
},
_onresize:function(profile,width,height){
var size = arguments.callee.upper.apply(this,arguments);
profile.getSubNode('BOX').cssSize(size);
}
}
});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -