Skip to content

Commit 11afbd2

Browse files
committed
j2sMenu fixes for clicking on JMenu closing all; should be ignored
1 parent ef10f2f commit 11afbd2

File tree

1 file changed

+72
-56
lines changed
  • sources/net.sf.j2s.java.core/src/swingjs/jquery

1 file changed

+72
-56
lines changed

sources/net.sf.j2s.java.core/src/swingjs/jquery/j2sMenu.js

Lines changed: 72 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -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&&/^mouse/.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

Comments
 (0)