@@ -70,37 +70,53 @@ J2S.__makeMenu = function(){};
7070 } , me . delay ) ;
7171
7272 }
73+
74+ var myMenuItem = function ( t ) { return $ ( t ) . closest ( ".ui-j2smenu-item" ) }
75+ var myMenuBar = function ( t ) { return $ ( t ) . closest ( ".j2s-menuBar-menu" ) }
76+ var myMenu = function ( t ) { return $ ( t ) . closest ( ".ui-j2smenu" ) }
77+ var isPopupMenu = function ( t ) { return t && t . is ( ".ui-j2s-popup-menu" ) }
78+ var isDisabled = function ( t ) { return t && t . is ( ".ui-state-disabled" ) }
79+ var isMenu = function ( t ) { return t && ( t . has ( ".ui-j2smenu" ) . length > 0 ) }
80+
7381 var doCmd = function ( trigger , me , t , n , why ) {
82+
83+ var debug = function ( ) { }
84+
85+ debug ( "j2sMenu trigger " + trigger + " " + ( me . active && me . active [ 0 ] . innerText . split ( "\n" ) . join ( "-" ) ) )
86+
7487 why || ( why = "" ) ;
7588 var event = t ;
76- var target = ( ! t || ! t . target ? null : $ ( t . target ) . closest ( ".ui-j2smenu-item" ) [ 0 ] ) ;
89+ var target = ( ! t || ! t . target ? null : myMenuItem ( t . target ) [ 0 ] ) ;
90+
7791 switch ( trigger ) {
7892 case "onoutn" :
7993 me . _closeMe ( ) ;
8094 break ;
8195 case "onmoven" :
96+ me . clickoutDisabled = false ;
8297 if ( $ ( target ) . hasClass ( "ui-j2smenu" ) ) {
8398 // this is the most likely way we will leave, via a mousemove on the border
8499 me . _closeMe ( ) ;
85100 break ;
86101 }
87102 case "onmovep" :
88103 case "onovern" :
104+ me . clickoutDisabled = false ;
89105 me . _stopT ( trigger ) ;
90106 if ( ! t ) return ;
91107 // BH 2018
92108 // -- added stopPropagation
93109 // -- changed to mouseover from mouseenter, since we have children
94- var a = e ( target ) . closest ( "li" )
110+ var a = myMenuItem ( target )
95111 if ( a . hasClass ( ".ui-state-focus" ) )
96112 return ;
97113 if ( ! a . hasClass ( "j2s-popup-menu" ) ) {
98114 me . _closeSubmenus ( a . parent ( ) ) ;
99115 }
100116 var m = a ;
101- a = a . find ( ".a" ) ;
117+ //testing a = a.find(".a");
102118 a [ 0 ] && a [ 0 ] . focus ( ) ;
103- var n = e ( t . currentTarget ) . closest ( ".ui-j2smenu-item" ) ;
119+ var n = myMenuItem ( t . currentTarget ) ;
104120 n . siblings ( ) . children ( ".ui-state-active" ) . removeClass ( "ui-state-active" ) ;
105121 t . stopPropagation ( ) ;
106122 me . setFocus ( t , n ) ;
@@ -109,13 +125,16 @@ J2S.__makeMenu = function(){};
109125 case "onrelease" :
110126 case "onpress" :
111127 case "onclick" :
112- var n = e ( target ) . closest ( ".ui-j2smenu-item" ) ;
113- if ( n . has ( ".ui-state-disabled" ) . length )
128+ var n = myMenuItem ( target ) ;
129+ if ( isDisabled ( n ) )
114130 return ;
115- if ( trigger != "onclick" )
131+ if ( isDisabled ( n . first ( ) ) || trigger != "onclick" )
116132 break ;
117133 me . select ( t ) ;
118- if ( n . has ( ".ui-j2smenu" ) . length ) {
134+ var doOpen = isPopupMenu ( n . first ( ) ) ;
135+ if ( doOpen ) {
136+ // must disable clickout in progress, or a click here will close all menus just after expanding
137+ me . clickoutDisabled = true ;
119138 me . expand ( t ) ;
120139 } else {
121140 if ( ! me . element . is ( ":focus" ) ) {
@@ -131,20 +150,24 @@ J2S.__makeMenu = function(){};
131150 me . _stopT ( "clearClickOut" ) ;
132151 return ;
133152 case "setClickOut" :
153+ if ( me . clickoutDisabled )
154+ return ;
134155 if ( outActive )
135156 doCmd ( "clearClickOut" , outActive ) ;
136157 setTimeout ( function ( ) {
158+ if ( me . clickoutDisabled )
159+ return ;
137160 outActive = me ;
138161 me . _on ( me . document , { "click" :function ( t ) { doCmd ( "onclick_out" , me , $ , t ) , n = ! 1 } } ) ;
139162 } , CLICK_OUT_DELAY ) ;
140163 return ;
141164 case "onclick_out" :
142- if ( outActive != me || ! someMenuOpen ( e ) ) {
165+ if ( me . clickoutDisabled || outActive != me || ! someMenuOpen ( ) ) {
166+ me . clickoutDisabled = false ;
143167 doCmd ( "clearClickOut" , me ) ;
144168 return ;
145169 }
146- e ( target ) . closest ( ".j2s-menuBar-menu" ) . length == 0
147- && ( e ( target ) . closest ( ".ui-j2smenu" ) . length || me . collapseAll ( t ) ) ;
170+ myMenuBar ( target ) . length == 0 && ( myMenu ( target ) . length || me . collapseAll ( t ) ) ;
148171 return ;
149172 case "onleave" :
150173 me . _closeMe ( "onleave" ) ;
@@ -156,10 +179,10 @@ J2S.__makeMenu = function(){};
156179 me . timer = delayMe ( me , function ( ) { closeOnLeave ( me , t ) } ) ;
157180 break ;
158181 case "_activate" :
159- me . active . is ( ".ui-state-disabled" ) || ( me . active . children ( ".a[aria-haspopup='true']" ) . length ?me . expand ( t ) :me . select ( t ) ) ;
182+ isDisabled ( me . active ) || ( me . active . children ( ".a[aria-haspopup='true']" ) . length ?me . expand ( t ) :me . select ( t ) ) ;
160183 break ;
161184 case "_startOpening" :
162- if ( t . attr ( "aria-hidden" ) !== "true" ) {
185+ if ( t . attr ( "aria-hidden" ) !== "true" && t . css ( 'display' ) !== 'none' ) {
163186 return ;
164187 }
165188 me . closed = false ;
@@ -177,7 +200,7 @@ J2S.__makeMenu = function(){};
177200 break ;
178201 case "_openSubmenu" :
179202 n || ( n = me . active || me . activeMenu ) ;
180- if ( n . is ( ".ui-state-disabled" ) )
203+ if ( isDisabled ( n ) )
181204 return ;
182205 n = e . extend ( { of :n } , me . options . position ) ;
183206 var ui = me . activeMenu && me . activeMenu [ 0 ] && me . activeMenu [ 0 ] [ "data-ui" ] ;
@@ -231,7 +254,7 @@ J2S.__makeMenu = function(){};
231254 t . hide ( ) ;
232255 break ;
233256 case "expand" :
234- if ( ! someMenuOpen ( ) || me . active && me . active . is ( ".ui-state-disabled" ) )
257+ if ( ! someMenuOpen ( ) || isDisabled ( me . active ) )
235258 return ;
236259 n = me . active && me . active . children ( ".ui-j2smenu" ) . children ( ".ui-j2smenu-item" ) . first ( ) ;
237260 if ( n && n . length ) {
@@ -254,35 +277,26 @@ J2S.__makeMenu = function(){};
254277 }
255278 break ;
256279 case "collapseAll" :
257- // e jQuery
258- // t event
259- var u ;
260- if ( me . closed
261- //
262- // || !n && (!someMenuOpen() ||
263- // ((u=e(t&&target)).hasClass("ui-j2smenu-node") || u.hasClass("ui-j2smenu"))
264- // )
265- //
266- )
280+ if ( me . closed || me . clickoutDisabled ) {
267281 return ;
282+ }
268283 doCmd ( "_hidePopupMenu" , me ) ;
269284 clearMe ( me . timer , trigger ) ,
270285 setCollapseTimer ( me , t )
271286 break ;
272287 case "setFocus" :
273288 var a = n . first ( ) ;
274- if ( a [ 0 ] == ( me . active && me . active [ 0 ] ) )
289+ var u = n . children ( ".ui-j2smenu" ) ;
290+ var subIsActive = ( a [ 0 ] == ( me . active && me . active [ 0 ] ) ) ;
291+ if ( u . length == 0 && subIsActive )
275292 return ;
276293 me . unsetFocus ( t , t && t . type === "focus" , "fromSetFocus" ) ;
277294 me . _scrollIntoView ( n ) ;
278295 me . active = a ;
279296 var r = me . active . addClass ( "ui-state-focus" ) ;
280- var r = me . active . children ( ".a" ) . addClass ( "ui-state-focus" ) ;
297+ //testing var r=me.active.children(".a").addClass("ui-state-focus");
281298 me . options . role && me . element . attr ( "aria-activedescendant" , r . attr ( "id" ) ) ;
282- me . active . parent ( ) . closest ( ".ui-j2smenu-item" ) . children ( ".a:first" ) . addClass ( "ui-state-active" ) ;
283- // no! t&&t.type==="keydown"?me._closeSubmenus() : me.timer=delayMe(me,
284- // function(){me._closeSubmenus()},me.delay);
285- var u = n . children ( ".ui-j2smenu" ) ;
299+ myMenuItem ( me . active . parent ( ) ) . children ( ".a:first" ) . addClass ( "ui-state-active" ) ;
286300 u . length && / ^ m o u s e / . test ( t . type ) && me . _startOpening ( u ) ;
287301 me . activeMenu = n . parent ( ) ;
288302 me . _trigger ( "focus" , t , { item :n } ) ;
@@ -295,15 +309,20 @@ J2S.__makeMenu = function(){};
295309 n || clearMe ( me . timer ) ;
296310 if ( ! me . active ) return ;
297311 me . active . removeClass ( "ui-state-focus" ) ;
298- me . active . children ( ".a" ) . removeClass ( "ui-state-focus" ) ;
312+ // testing me.active.children(".a").removeClass("ui-state-focus");
299313 var a = me . active ;
300314 me . active = null ;
301315 me . _trigger ( "blur" , t , { item :a } ) ;
302316 t = a ;
303317 break ;
304318 case "select" :
305- me . active = me . active || e ( target ) . closest ( ".ui-j2smenu-item" ) ;
306- me . active . has ( ".ui-j2smenu" ) . length || me . collapseAll ( t , ! 0 ) ;
319+ me . active = me . active || myMenuItem ( target ) ;
320+ if ( isMenu ( me . active ) ) {
321+ // the anchor element is the first child.
322+ me . clickoutDisabled = ! me . active . children ( ) . first ( ) . is ( ".ui-state-active" ) ;
323+ } else {
324+ me . collapseAll ( t , ! 0 ) ;
325+ }
307326 me . _trigger ( "select" , t , { item :me . active } ) ;
308327 if ( ! t [ 0 ] ) {
309328 return ;
@@ -387,23 +406,19 @@ $.widget("ui.j2smenu",{
387406 . bind ( "click" + this . eventNamespace , e . proxy ( function ( e ) { this . options . disabled && e . preventDefault ( ) } , this ) ) ,
388407 this . options . disabled && this . element . addClass ( "ui-state-disabled" ) . attr ( "aria-disabled" , "true" ) ,
389408 this . _on ( {
390- "mousedown .ui-j2smenu-item > .a" : function ( t ) { doCmd ( "onpress" , this , t ) } ,
391- "mouseup .ui-j2smenu-item > .a" : function ( t ) { doCmd ( "onrelease" , this , t ) } ,
392- "click .ui-state-disabled > .a" : function ( t ) { t . preventDefault ( ) } ,
393- "click .ui-j2smenu-item:has(.a)" : function ( t ) { doCmd ( "onclick" , this , t ) ; } ,
394- "mousemove .swingjsPopupMenu " :function ( t ) { doCmd ( "onmovep" , this , t , 0 ) ; } ,
395- // "mouseout .swingjsPopupMenu ":function(t){ doCmd("onoutp",this,t,0); },
396- // "mouseover .ui-j2smenu-item": function(t){ doCmd("onoveri",this,t,1); },
397- mouseleave : function ( t ) { doCmd ( "onleave" , this , t ) ; } ,
398- "mouseleave .ui-j2smenu" : function ( t ) { doCmd ( "onleave" , this , t ) ; } ,
399- // "mouseout .ui-j2smenu-item > .a": function(t){ doCmd("onoutn",this,t) },
400- // "mouseover .ui-j2smenu-item > .a": function(t){ doCmd("onmoven",this,t) },
401- "mousemove .ui-j2smenu-node" :function ( t ) { doCmd ( "onmoven" , this , t , 0 ) ; } ,
402- "mouseout .ui-j2smenu-node" :function ( t ) { doCmd ( "onoutn" , this , t , 0 ) ; } ,
403- "mouseover .ui-j2smenu-node" :function ( t ) { doCmd ( "onovern" , this , t , 0 ) ; } ,
404- focus : function ( t , n ) { doCmd ( "onfocus" , this , t , n ) ; } ,
405- blur : function ( t ) { doCmd ( "onblur" , this , t ) } ,
406- keydown :"_keydown"
409+ "click .ui-state-disabled > .a" : function ( t ) { t . preventDefault ( ) } ,
410+ "click .ui-j2smenu-item:has(.a)" : function ( t ) { doCmd ( "onclick" , this , t ) ; } ,
411+ "mousedown .ui-j2smenu-item > .a" : function ( t ) { doCmd ( "onpress" , this , t ) } ,
412+ "mouseup .ui-j2smenu-item > .a" : function ( t ) { doCmd ( "onrelease" , this , t ) } ,
413+ "mousemove .swingjsPopupMenu " : function ( t ) { doCmd ( "onmovep" , this , t , 0 ) ; } ,
414+ "mouseleave .ui-j2smenu" : function ( t ) { doCmd ( "onleave" , this , t ) ; } ,
415+ "mousemove .ui-j2smenu-node" : function ( t ) { doCmd ( "onmoven" , this , t , 0 ) ; } ,
416+ "mouseout .ui-j2smenu-node" : function ( t ) { doCmd ( "onoutn" , this , t , 0 ) ; } ,
417+ "mouseover .ui-j2smenu-node" : function ( t ) { doCmd ( "onovern" , this , t , 0 ) ; } ,
418+ mouseleave : function ( t ) { doCmd ( "onleave" , this , t ) ; } ,
419+ blur : function ( t ) { doCmd ( "onblur" , this , t ) } ,
420+ focus : function ( t , n ) { doCmd ( "onfocus" , this , t , n ) ; } ,
421+ keydown : "_keydown"
407422 } ) ,
408423 this . refresh ( "create" ) ;
409424 } ,
@@ -446,7 +461,7 @@ $.widget("ui.j2smenu",{
446461 this . collapse ( t ) ;
447462 break ;
448463 case e . ui . keyCode . RIGHT :
449- this . active && ! this . active . is ( ".ui-state-disabled" ) && this . expand ( t ) ;
464+ this . active && ! isDisabled ( this . active ) && this . expand ( t ) ;
450465 break ;
451466 case e . ui . keyCode . ENTER :
452467 case e . ui . keyCode . SPACE :
@@ -517,9 +532,10 @@ Swing.__getMenuStyle = function(applet) { return '\
517532 .swingjsPopupMenu .a{color:#222;font-size:10px;}\
518533 .swingjsPopupMenu input[type="checkbox"]{vertical-align:middle;}\
519534 .swingjsPopupMenu,.swingjsPopupMenu .ui-j2smenu{list-style:none;padding:2px;margin:0;display:block;outline:none;box-shadow:1px 1px 5px rgba(50,50,50,0.75)}\
520- .swingjsPopupMenu .ui-j2smenu{margin-top:-3px;position:absolute}\
521- .swingjsPopupMenu .ui-j2smenu-item{cursor:pointer;margin:0 0 0 0;padding:0;width:100%}\
522- .swingjsPopupMenu .a:focus{outline:none;cursor:pointer;margin:0 0 0 0;padding:0;width:90%}\
535+ .swingjsPopupMenu .ui-j2s-menuBar-menu:focus{outline:none;background:#d0e5f5}\
536+ .swingjsPopupMenu .ui-j2smenu{outline:none;margin-top:-3px;position:absolute}\
537+ .swingjsPopupMenu .ui-j2smenu-item{outline:none;cursor:pointer;margin:0 0 0 0;padding:0.1em;width:100%}\
538+ .swingjsPopupMenu .a:focus{outline:none;cursor:pointer;margin:0 0 0 0;padding:0.1em;width:90%}\
523539 .swingjsPopupMenu .ui-j2smenu-divider{margin:3px 1px;height:0;transform:translateY(-4px);position:absolute;font-size:0;line-height:0px;border-width:2px 0 0 0;width:93%;}\
524540 .swingjsPopupMenu .ui-j2smenu-item .a{display:block;padding:0.05em 0.4em;white-space:nowrap;border:1px solid transparent}\
525541 .swingjsPopupMenu .ui-j2smenu-icons{position:relative}\
@@ -652,4 +668,4 @@ Swing.disposeMenu = function(menu) {
652668} ) ( J2S . Swing , J2S . __$ ) ;
653669
654670
655- // end of j2sMenu.js 2020.01.25
671+ // end of j2sMenu.js 2020.05.15 2020. 01.25
0 commit comments