Skip to content

Commit ac86811

Browse files
hansonrhansonr
authored andcommitted
JMenu implementing .isSelected(), .setSelected() properly
1 parent bbaf8e6 commit ac86811

File tree

3 files changed

+74
-46
lines changed

3 files changed

+74
-46
lines changed

sources/net.sf.j2s.java.core/src/swingjs/jquery/JQueryUI.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,20 @@
66
*
77
* Note that if you change one of the JavaScript files in this directory,
88
* the transpiler will not transfer it to the site directory unless you touch this java file.
9+
* Just add and remove a space before the package command.
910
*
1011
* @author Bob Hanson
1112
*
1213
*
1314
*/
1415
public class JQueryUI {
15-
public JQueryUI() {
16-
int j = 1;
17-
}
1816
static {
1917

2018
/**
2119
*
2220
*
2321
* @j2sNative
24-
*
22+
*
2523
if (!jQuery.ui)
2624
try{
2725
(function(e,t){function i(t,n){var r,i,o,u=t.nodeName.toLowerCase();return"area"===u?(r=t.parentNode,i=r.name,!t.href||!i||r.nodeName.toLowerCase()!=="map"?!1:(o=e("img[usemap=#"+i+"]")[0],!!o&&s(o))):(/input|select|textarea|button|object/.test(u)?!t.disabled:"a"===u?t.href||n:n)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().andSelf().filter(function(){return e.css(this,"visibility")==="hidden"}).length}var n=0,r=/^ui-id-\d+$/;e.ui=e.ui||{};if(e.ui.version)return;e.extend(e.ui,{version:"1.9.2",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({_focus:e.fn.focus,focus:function(t,n){return typeof t=="number"?this.each(function(){var r=this;setTimeout(function(){e(r).focus(),n&&n.call(r)},t)}):this._focus.apply(this,arguments)},scrollParent:function(){var t;return e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?t=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):t=this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(n){if(n!==t)return this.css("zIndex",n);if(this.length){var r=e(this[0]),i,s;while(r.length&&r[0]!==document){i=r.css("position");if(i==="absolute"||i==="relative"||i==="fixed"){s=parseInt(r.css("zIndex"),10);if(!isNaN(s)&&s!==0)return s}r=r.parent()}}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++n)})},removeUniqueId:function(){return this.each(function(){r.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(n){return!!e.data(n,t)}}):function(t,n,r){return!!e.data(t,r[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var n=e.attr(t,"tabindex"),r=isNaN(n);return(r||n>=0)&&i(t,!r)}}),e(function(){var t=document.body,n=t.appendChild(n=document.createElement("div"));n.offsetHeight,e.extend(n.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),e.support.minHeight=n.offsetHeight===100,e.support.selectstart="onselectstart"in n,t.removeChild(n).style.display="none"}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(n,r){function u(t,n,r,s){return e.each(i,function(){n-=parseFloat(e.css(t,"padding"+this))||0,r&&(n-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(n-=parseFloat(e.css(t,"margin"+this))||0)}),n}var i=r==="Width"?["Left","Right"]:["Top","Bottom"],s=r.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+r]=function(n){return n===t?o["inner"+r].call(this):this.each(function(){e(this).css(s,u(this,n)+"px")})},e.fn["outer"+r]=function(t,n){return typeof t!="number"?o["outer"+r].call(this,t):this.each(function(){e(this).css(s,u(this,t,!0,n)+"px")})}}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(n){return arguments.length?t.call(this,e.camelCase(n)):t.call(this)}}(e.fn.removeData)),function(){var t=/msie ([\w.]+)/.exec(navigator.userAgent.toLowerCase())||[];e.ui.ie=t.length?!0:!1,e.ui.ie6=parseFloat(t[1],10)===6}(),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,n,r){var i,s=e.ui[t].prototype;for(i in r)s.plugins[i]=s.plugins[i]||[],s.plugins[i].push([n,r[i]])},call:function(e,t,n){var r,i=e.plugins[t];if(!i||!e.element[0].parentNode||e.element[0].parentNode.nodeType===11)return;for(r=0;r<i.length;r++)e.options[i[r][0]]&&i[r][1].apply(e.element,n)}},contains:e.contains,hasScroll:function(t,n){if(e(t).css("overflow")==="hidden")return!1;var r=n&&n==="left"?"scrollLeft":"scrollTop",i=!1;return t[r]>0?!0:(t[r]=1,i=t[r]>0,t[r]=0,i)},isOverAxis:function(e,t,n){return e>t&&e<t+n},isOver:function(t,n,r,i,s,o){return e.ui.isOverAxis(t,r,s)&&e.ui.isOverAxis(n,i,o)}})

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

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,14 @@ try{
7070
if (!a.hasClass("j2s-popup-menu")) {
7171
me._closeSubmenus(a.parent());
7272
}
73+
var m = a;
7374
a = a.find(".a");
7475
a[0] && a[0].focus();
7576
var n=e(t.currentTarget).closest(".ui-j2smenu-item");
7677
n.siblings().children(".ui-state-active").removeClass("ui-state-active");
7778
t.stopPropagation();
7879
me.focus(t,n);
80+
t = m;
7981
break;
8082
case "onrelease":
8183
case "onpress":
@@ -133,44 +135,54 @@ try{
133135
case "onblur":
134136
me.timer = delayMe(me, function(){e.contains(me.element[0],me.document[0].activeElement)||me.collapseAll(t)});
135137
break;
138+
case "_activate":
139+
me.active.is(".ui-state-disabled")||(me.active.children(".a[aria-haspopup='true']").length?me.expand(t):me.select(t));
140+
break;
141+
case "_startOpening":
142+
if(t.attr("aria-hidden")!=="true") {
143+
return;
144+
}
145+
me.timer=delayMe(me, function(){me._closeSubmenus(),me._openSubmenu(t);},me.delay);
146+
return;
147+
case "_hideAllMenus":
148+
// trigger Java to deselect these - the JMenu class
149+
t = me.element.find(".ui-j2smenu[aria-hidden!=true]").attr("aria-hidden","true").parent();
150+
if (!t[0])
151+
return;
152+
break;
136153
case "_openSubmenu":
137154
n||(n = me.active || me.activeMenu);
138155
if (n.is(".ui-state-disabled"))
139156
return;
140-
141157
n = e.extend({of:n},me.options.position);
142-
143158
var ui = me.activeMenu && me.activeMenu[0] && me.activeMenu[0]["data-ui"];
144-
ui && ui.processJ2SMenuCmd$OA([trigger,me,e,t,n,why]);
145-
146-
159+
ui && ui.processJ2SMenuCmd$OA([trigger,me,e,t.parent(),n,why]);
147160
clearMe(me.timer, trigger);
148161
me.refresh("_openSubmenu",n);
149162
var v = me.element.find(".ui-j2smenu").not(t.parents(".ui-j2smenu"));
150163
doCmd("_hide", me, e, v);
151-
v.attr("aria-hidden","true");
152164
try {
165+
// required if menu has been modified
166+
doCmd("_show", me, e, me.activeMenu);
153167
doCmd("_show", me, e, t);
154168
t.removeAttr("aria-hidden").attr("aria-expanded","true").position(n);
155169
} catch(err){
156170
System.out.println("j2sMenu error: " + err);
157171
}
158172
return;
159-
case "_activate":
160-
me.active.is(".ui-state-disabled")||(me.active.children(".a[aria-haspopup='true']").length?me.expand(t):me.select(t));
161-
break;
162-
case "_startOpening":
163-
if(t.attr("aria-hidden")!=="true")return;
164-
me.timer=delayMe(me, function(){me._closeSubmenus(),me._openSubmenu(t);},me.delay);
165-
return;
166173
case "_closeSubmenus":
174+
var a = me.active;
175+
if (a && a[0] && a[0]["data-component"].uiClassID != "MenuUI")
176+
return;
167177
t||(t=me.active?me.active.parent():me.element);
168-
t.closest("ul").find(".ui-state-active").removeClass("ui-state-active");
178+
var m = t.closest("ul").find(".ui-state-active")
179+
m.removeClass("ui-state-active");
169180
var v = t.find(".ui-j2smenu");
170181
if (!v.length)
171182
return;
172183
doCmd("_hide", me, e, v);
173184
v.attr("aria-hidden","true").attr("aria-expanded","false");
185+
t = v.parent();
174186
break;
175187
case "_move":
176188
var a = n[0];
@@ -187,6 +199,8 @@ try{
187199
t.show();
188200
break;
189201
case "_hide":
202+
if (!t[0])
203+
return;
190204
t.hide();
191205
break;
192206
case "expand":
@@ -217,6 +231,7 @@ try{
217231
((u=e(t&&t.target)).hasClass("ui-j2smenu-node") || u.hasClass("ui-j2smenu"))
218232
))
219233
return;
234+
doCmd("_hideAllMenus", me, e);
220235
//System.err.println("collapseAll " + me.uuid);
221236
clearMe(me.timer, trigger),
222237
me.timer = delayMe(me,
@@ -233,6 +248,7 @@ try{
233248
}, me.delay);
234249
break;
235250
case "focus":
251+
//System.out.println("j2smenu " + document.activeElement.id);
236252
me.blur(t,t&&t.type==="focus");
237253
me._scrollIntoView(n);
238254
me.active=n.first();
@@ -246,22 +262,30 @@ try{
246262
u.length&&/^mouse/.test(t.type)&&me._startOpening(u);
247263
me.activeMenu=n.parent();
248264
me._trigger("focus",t,{item:n});
265+
t = n;
266+
//System.out.println("j2smenu " + document.activeElement.id);
249267
break;
250268
case "blur":
269+
//System.out.println("j2smenu " + document.activeElement.id);
251270
if (me.active && t && typeof n == "undefined" && t.relatedTarget && t.relatedTarget.getAttribute("role") != "presentation") {
252271
doCmd("_hide", me, t, me.element);
253272
}
254273
n||clearMe(me.timer, trigger);
255274
if(!me.active)return;
256-
me.active.removeClass("ui-state-focus"),
257-
me.active.children(".a").removeClass("ui-state-focus"),
258-
me.active=null,
259-
me._trigger("blur",t,{item:me.active});
275+
me.active.removeClass("ui-state-focus");
276+
me.active.children(".a").removeClass("ui-state-focus");
277+
var a = me.active;
278+
me.active=null;
279+
me._trigger("blur",t,{item:a});
280+
t = a;
281+
//System.out.println("j2smenu " + document.activeElement.id);
260282
break;
261283
case "select":
262284
me.active=me.active||e(t.target).closest(".ui-j2smenu-item");
263285
me.active.has(".ui-j2smenu").length||me.collapseAll(t,!0);
264-
me._trigger("select",t,{item:me.active})
286+
me._trigger("select",t,{item:me.active});
287+
if (!t[0])
288+
return;
265289
break;
266290
case "refresh":
267291
n=me.options.icons.submenu;

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSPopupMenuUI.java

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import java.awt.event.KeyEvent;
3636
import java.awt.event.KeyListener;
3737
import java.awt.event.MouseEvent;
38-
import java.awt.peer.PopupMenuPeer;
3938
import java.beans.PropertyChangeEvent;
4039

4140
import javax.swing.InputMap;
@@ -48,7 +47,6 @@
4847
import javax.swing.MenuElement;
4948
import javax.swing.MenuSelectionManager;
5049
import javax.swing.UIManager;
51-
import javax.swing.event.MenuEvent;
5250
import javax.swing.event.MenuKeyEvent;
5351
import javax.swing.event.MenuKeyListener;
5452

@@ -1150,33 +1148,28 @@ public static void processJ2SMenuCmd(Object[] data) {
11501148
JQueryObject m = j2smenu.activeMenu;
11511149
String mid = (/** @j2sNative m && m[0] && m[0].id || */
11521150
null);
1153-
System.out.println("JSPopupMenuUI processing " + (np++) + " " + trigger + " for " + mid);
1151+
String id = (/** @j2sNative t && t[0] && t[0].id || */null);
1152+
String text = (/** @j2sNative t && t[0] && (t[0]["data-component"] && t[0]["data-component"].text ||
1153+
t[0]["data-ui"] && t[0]["data-ui"].jc.text) || */null);
11541154
JMenu menu = null;
1155-
JSComponentUI ui;
1156-
1155+
JSComponentUI ui, mui = (/** @j2sNative m[0]["data-ui"] || */null);
1156+
boolean debug = false;
11571157
switch (trigger) {
11581158
case "_openSubmenu":
1159-
/**
1160-
* @j2sNative ui = t[0].parentElement["data-ui"];
1161-
* menu = ui && ui.jc;
1162-
*/
1163-
if (menu != null)
1164-
menu.setSelected(true);
1159+
updateMenuSelection(t, true);
11651160
break;
11661161
case "_closeSubmenus":
1167-
/**
1168-
* @j2sNative ui = t[0].parentElement["data-ui"];
1169-
* menu = ui && ui.jc;
1170-
*/
1171-
if (menu != null)
1172-
menu.setSelected(false);
1162+
updateMenuSelection(t, false);
11731163
break;
1164+
case "onover":
1165+
case "onover1":
1166+
case "onover2":
1167+
case "onover3":
11741168
case "_activate":
11751169
case "_hide":
11761170
case "_move":
11771171
case "_show":
11781172
case "_startOpening":
1179-
case "blur":
11801173
case "clearOut":
11811174
case "collapse":
11821175
case "expand":
@@ -1187,10 +1180,7 @@ public static void processJ2SMenuCmd(Object[] data) {
11871180
case "onclick_out":
11881181
case "onfocus":
11891182
case "onleave":
1190-
case "onover":
1191-
case "onover1":
1192-
case "onover2":
1193-
case "onover3":
1183+
case "blur":
11941184
case "onpress":
11951185
case "onrelease":
11961186
case "refresh":
@@ -1205,10 +1195,26 @@ public static void processJ2SMenuCmd(Object[] data) {
12051195
j2smenu.options.jPopupMenu.visible = false;
12061196
((JComponent) j2smenu.options.jPopupMenu.getInvoker()).getRootPane().requestFocus();
12071197
break;
1198+
case "_hideAllMenus":
1199+
updateMenuSelection(t, false);
1200+
break;
12081201
}
1202+
if (debug)
1203+
System.out.println("JSPopupMenuUI processing " + (np++) + " " + trigger + " for " + id + " " + text);
1204+
}
1205+
1206+
@SuppressWarnings("null")
1207+
private static void updateMenuSelection(Object t, boolean isOpen) {
1208+
// t is JMenu.ui.domNode[] from jQuery
1209+
for (int i = /** @j2sNative t.length || */0; --i >= 0;) {
1210+
JMenu p = /** @j2sNative t[i]["data-component"] || */null;
1211+
if (p.isSelected() != isOpen)
1212+
p.setSelected(isOpen);
1213+
}
1214+
12091215
}
12101216

1211-
public boolean isPopupTrigger(MouseEvent e) {
1217+
public boolean isPopupTrigger(MouseEvent e) {
12121218
return e.isPopupTrigger();
12131219
}
12141220

0 commit comments

Comments
 (0)