Skip to content

Commit e5a0f95

Browse files
committed
JTabbedPane and JPopupMenu tweaks.
1 parent 5cc4bee commit e5a0f95

File tree

8 files changed

+72
-50
lines changed

8 files changed

+72
-50
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20240102050937
1+
20240106163105
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
20240102050937
1+
20240106163105
-15 Bytes
Binary file not shown.

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import swingjs.JSUtil;
44

55
//based on jQuery UI - v1.9.2 - 2015-05-28
6+
7+
// BH 2023.01.07 updated j2sMenu.js for better touch with delayed menu closure detecting mouse
8+
69
/**
710
* This class checks for jQuery.ui having been loaded and loads it if it has not
811
* been loaded. It provides three static methods used in

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

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ J2S.__makeMenu = function() {
1010
// run once; set to NOP
1111
J2S.__makeMenu = function(){};
1212

13+
14+
var MODE_UNKNOWN = 0;
15+
var MODE_TOUCH = 1;
16+
var MODE_MOUSE = 2;
17+
1318
var outActive;
1419
var vart;
1520

@@ -112,7 +117,7 @@ J2S.__makeMenu = function(){};
112117
var a = myMenuItem(target)
113118
if (a.hasClass(".ui-state-focus"))
114119
return;
115-
if (!a.hasClass("j2s-popup-menu")) {
120+
if (!a.hasClass("j2s-popup-menu") && !a.hasClass("ui-j2smenu-node")) {
116121
me._closeSubmenus(a.parent());
117122
}
118123
var m = a;
@@ -146,7 +151,8 @@ J2S.__makeMenu = function(){};
146151
me.element.trigger("setFocus",[!0]);
147152
me.active&&me.active.parents(".ui-j2smenu").length===1&&clearMe(me.timer, trigger);
148153
}
149-
doCmd("collapseAll", me, 0, 1);
154+
if (me.mouseState != MODE_TOUCH)
155+
doCmd("collapseAll", me, 0, 1);
150156
}
151157
break;
152158
case "clearClickOut":
@@ -175,7 +181,8 @@ J2S.__makeMenu = function(){};
175181
myMenuBar(target).length == 0 && (myMenu(target).length||me.collapseAll(t));
176182
return;
177183
case "onleave":
178-
me._closeMe("onleave");
184+
if (me.mouseState != MODE_TOUCH)
185+
me._closeMe("onleave");
179186
return;
180187
case "onfocus":
181188
n||me.setFocus(t,me.active||me.element.children(".ui-j2smenu-item").eq(0));
@@ -197,6 +204,7 @@ J2S.__makeMenu = function(){};
197204
return;
198205
case "_hidePopupMenu":
199206
// trigger Java to deselect these - the JMenu class
207+
me.mouseState = MODE_UNKNOWN; // unknown
200208
t = me.element.find(".ui-j2smenu[aria-hidden!=true]").attr("aria-hidden","true").parent();
201209
var a = me;
202210
doCmd("_hide", a, a.element);
@@ -287,15 +295,24 @@ J2S.__makeMenu = function(){};
287295
}
288296
break;
289297
case "collapseAll":
290-
return; // fails for Tracker touch
291-
if (me.closed || me.clickoutDisabled) {
292-
return;
293-
}
294-
doCmd("_hidePopupMenu", me);
295-
clearMe(me.timer, trigger),
296-
setCollapseTimer(me, t)
298+
// touch needs this setTimeout to delay close action until touch is processed
299+
setTimeout(function() {
300+
if (me.closed || me.clickoutDisabled) {
301+
return;
302+
}
303+
doCmd("_hidePopupMenu", me);
304+
clearMe(me.timer, trigger),
305+
setCollapseTimer(me, t)
306+
}, 100);
297307
break;
298308
case "setFocus":
309+
me.clickoutDisabled = true;
310+
// we determine this to be a touch because a
311+
// focus from DOWN is made before a focus from OVER or MOVE
312+
if (event.type == "pointermove" || event.type == "pointerover")
313+
me.mouseState = MODE_MOUSE;// TODO menu only
314+
else if (event.type == "pointerdown" && me.mouseState == MODE_UNKNOWN)
315+
me.mouseState = MODE_TOUCH;
299316
var a = n.first();
300317
var u=n.children(".ui-j2smenu");
301318
var subIsActive = (a[0] == (me.active && me.active[0]));
@@ -327,6 +344,9 @@ J2S.__makeMenu = function(){};
327344
t = a;
328345
break;
329346
case "select":
347+
if (me.mouseMode == MODE_MOUSE) {
348+
return;
349+
}
330350
me.active=me.active||myMenuItem(target);
331351
if (isMenu(me.active)) {
332352
// the anchor element is the first child.
@@ -509,7 +529,7 @@ $.widget("ui.j2smenu",{
509529
setCloseTimer(this);
510530
},
511531

512-
532+
mouseState:MODE_UNKNOWN,
513533

514534
_activate:function(t){ doCmd("_activate", this, t); },
515535
_startOpening: function(t){ doCmd("_startOpening", this, t); },

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -871,13 +871,13 @@ public Object createValue(UIDefaults table) {
871871
//
872872
// ** TabbedBane value objects
873873

874-
Object tabbedPaneTabInsets = new InsetsUIResource(2, 4, 2, 4);
874+
Object tabbedPaneTabInsets = new InsetsUIResource(2, 4, 1, 4); // 3 px shorter
875875

876876
Object tabbedPaneTabPadInsets = new InsetsUIResource(2, 2, 2, 1);// selected tab size
877877

878-
Object tabbedPaneTabAreaInsets = new InsetsUIResource(3, 2, 0, 2);
878+
Object tabbedPaneTabAreaInsets = new InsetsUIResource(0, 2, 0, 2);
879879

880-
Object tabbedPaneContentBorderInsets = new InsetsUIResource(2, 2, 3, 3);
880+
Object tabbedPaneContentBorderInsets = new InsetsUIResource(1, 2, 5, 3);
881881

882882
// *** Text value objects
883883

@@ -1380,7 +1380,7 @@ public Object createValue(UIDefaults table) {
13801380
// "Menu.checkIcon", menuItemCheckIcon,
13811381
// "Menu.arrowIcon", menuArrowIcon,
13821382
// "Menu.menuPopupOffsetX", new Integer(0),
1383-
// "Menu.menuPopupOffsetY", new Integer(0),
1383+
"Menu.menuPopupOffsetY", new Integer(-3),// moves popup menus just a bit higher
13841384
// "Menu.submenuPopupOffsetX", new Integer(0),
13851385
// "Menu.submenuPopupOffsetY", new Integer(0),
13861386
// "Menu.shortcutKeys", new int[] {KeyEvent.ALT_MASK},
@@ -1693,7 +1693,7 @@ public Object createValue(UIDefaults table) {
16931693
// which is zero by default
16941694
"TabbedPane.tabsOverlapBorder",
16951695
Boolean.FALSE,
1696-
// "TabbedPane.selectionFollowsFocus", Boolean.TRUE,
1696+
"TabbedPane.selectionFollowsFocus", Boolean.FALSE,
16971697

16981698
"TabbedPane.labelShift",
16991699
1,

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

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,9 @@ abstract class JSSwingMenu {
102102

103103
class Options {
104104
JPopupMenu jPopupMenu;
105-
int delay;
106-
boolean disabled;
107-
JQueryObject focus, blur, select;
108105
}
109106

110-
JQueryObject active, activeMenu, element;
107+
JQueryObject activeMenu;
111108
Options options;
112109
abstract void disposeMenu(JPopupMenu menu);
113110
abstract void hideMenu(JPopupMenu menu);
@@ -218,10 +215,6 @@ protected void uninstallListeners() {
218215

219216
@Override
220217
public void setVisible(boolean b) {
221-
//System.out.println("jspopupmenu setvis " + b);
222-
// TODO: We are not setting vis false when closing
223-
//if (b && menu != null && menu.isVisible())
224-
//b = false;
225218
hideMenusAndToolTip();
226219
if (b) {
227220
if (isTainted || menu == null || outerNode == null || DOMNode.firstChild(outerNode) == null) {
@@ -574,8 +567,6 @@ public void menuKeyReleased(MenuKeyEvent e) {
574567
//
575568
@Override
576569
public void keyTyped(KeyEvent e) {
577-
// TODO Auto-generated method stub
578-
579570
}
580571

581572
@Override
@@ -585,8 +576,6 @@ public void keyPressed(KeyEvent e) {
585576

586577
@Override
587578
public void keyReleased(KeyEvent e) {
588-
// TODO Auto-generated method stub
589-
590579
}
591580
}
592581

@@ -1184,7 +1173,16 @@ public boolean isJSPopupVisible() {
11841173
// private static int np=0;
11851174

11861175
/**
1187-
* from j2sMenu.js
1176+
*
1177+
* From j2sMenu.js.
1178+
*
1179+
* Processes only a few of the many actions generated there, specifically mouse
1180+
* enter, move, and exit.
1181+
*
1182+
* Handles all menu and submenu open/close/collapse-all actions.
1183+
*
1184+
* Does NOT process mouse down/up or click events, which are all taken care of
1185+
* by J2S mouse action methods.
11881186
*
11891187
* @param data
11901188
*/
@@ -1202,12 +1200,8 @@ public static void processJ2SMenuCmd(Object[] data) {
12021200
String id = (base == null ? null : (String) DOMNode.getAttr(base, "id"));
12031201
JComponent c = (base == null ? null : (JComponent) DOMNode.getAttr(base, "data-component"));
12041202
JSComponentUI tui = (base == null ? null : (JSComponentUI) DOMNode.getAttr(base, "data-ui"));
1205-
JMenu menu = null;
1206-
// JSComponentUI myui = (/** @j2sNative m[0]["data-ui"] || */null);
1207-
1203+
JMenu menu = null;
12081204
int eventID = 0;
1209-
1210-
// System.out.println("pm " + trigger);
12111205
switch (trigger) {
12121206
case "_hidePopupMenu":
12131207
case "_hide":
@@ -1259,7 +1253,6 @@ public static void processJ2SMenuCmd(Object[] data) {
12591253
break;
12601254
case "unsetFocus":
12611255
hideTooltip();
1262-
//System.out.println("pm unfocus " + id);
12631256
eventID = MouseEvent.MOUSE_EXITED;
12641257
break;
12651258
case "_openSubmenu":
@@ -1310,34 +1303,28 @@ public static void closeAllMenus() {
13101303

13111304
@Override
13121305
public void mouseClicked(MouseEvent e) {
1313-
// TODO Auto-generated method stub
1314-
13151306
}
13161307

13171308
@Override
13181309
public void mousePressed(MouseEvent e) {
1319-
// TODO Auto-generated method stub
1320-
13211310
}
13221311

13231312
@Override
13241313
public void mouseReleased(MouseEvent e) {
1325-
// TODO Auto-generated method stub
1326-
13271314
}
13281315

13291316
@Override
13301317
public void mouseEntered(MouseEvent e) {
1331-
// TODO Auto-generated method stub
1332-
13331318
}
13341319

13351320
@SuppressWarnings("unused")
13361321
@Override
13371322
public void mouseExited(MouseEvent e) {
13381323
try {
13391324
if (/**
1340-
* @j2sNative e.bdata.jqevent.target.className.indexOf("j2smenu") >= 0 ||
1325+
* @j2sNative
1326+
* e.bdata.jqevent.target.className.indexOf("j2smenu") >= 0
1327+
* || e.bdata.jqevent.target.id.indexOf("MenuBar") >= 0 ||
13411328
*/
13421329
false)
13431330
return;

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,8 +1317,11 @@ protected void paintTabBackground(Graphics g, int tabPlacement,
13171317
int tabIndex,
13181318
int x, int y, int w, int h,
13191319
boolean isSelected ) {
1320-
g.setColor(!isSelected || selectedColor == null?
1321-
tabPane.getBackgroundAt(tabIndex) : selectedColor);
1320+
// BH SwingJS adjustment here -
1321+
g.setColor(!isSelected ?
1322+
tabPane.getBackgroundAt(tabIndex) : selectedColor == null ?
1323+
tabPane.getComponentAt(tabIndex).getBackground()
1324+
: selectedColor);
13221325
switch(tabPlacement) {
13231326
case LEFT:
13241327
g.fillRect(x+1, y+1, w-1, h-3);
@@ -1404,6 +1407,10 @@ protected void paintContentBorderTopEdge(Graphics g, int tabPlacement,
14041407
getTabBounds(selectedIndex, calcRect);
14051408

14061409
g.setColor(lightHighlight);
1410+
1411+
Color sColor = (selectedIndex < 0 ? null : selectedColor == null ?
1412+
tabPane.getComponentAt(selectedIndex).getBackground()
1413+
: selectedColor);
14071414

14081415
// Draw unbroken line if tabs are not on TOP, OR
14091416
// selected tab is not in run adjacent to content, OR
@@ -1416,7 +1423,11 @@ protected void paintContentBorderTopEdge(Graphics g, int tabPlacement,
14161423
} else {
14171424
// Break line to show visual connection to selected tab
14181425
g.drawLine(x, y, selRect.x - 1, y);
1419-
if (selRect.x + selRect.width < x + w - 2) {
1426+
int sw = Math.min(selRect.x + selRect.width, x + w - 2);
1427+
g.setColor(sColor);
1428+
g.drawLine(selRect.x, y, sw, y);
1429+
if (sw < x + w - 2) {
1430+
g.setColor(lightHighlight);
14201431
g.drawLine(selRect.x + selRect.width, y,
14211432
x+w-2, y);
14221433
} else {
@@ -2059,7 +2070,8 @@ void setFocusIndex(int index, boolean repaint) {
20592070
focusIndex = index;
20602071
repaintTab(focusIndex);
20612072
}
2062-
else {
2073+
else
2074+
{
20632075
focusIndex = index;
20642076
}
20652077
}

0 commit comments

Comments
 (0)