From 6c3c1c09b104eca53b3a5a513fad13d12cc184b7 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 12 Apr 2021 13:02:08 +0200 Subject: [PATCH 1/2] Make Custom menus scrollable Fixes #11416 The patch on MenuScroller.java is needed to avoid a clash between custom menus with the same label. This behaviour artificially increases the amount of objects that the scroller will calculate. Eg. if two boards share the same custom menu, that menu will contain the properties for both the boards (since it's parsed twice). --- app/src/processing/app/Base.java | 1 + app/src/processing/app/tools/MenuScroller.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 732a8b02e..4578038f3 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -1473,6 +1473,7 @@ public class Base { customMenu.putClientProperty("platform", getPlatformUniqueId(targetPlatform)); customMenu.putClientProperty("removeOnWindowDeactivation", true); boardsCustomMenus.add(customMenu); + MenuScroller.setScrollerFor(customMenu); } } } diff --git a/app/src/processing/app/tools/MenuScroller.java b/app/src/processing/app/tools/MenuScroller.java index 9e9aacbca..9acaa8548 100644 --- a/app/src/processing/app/tools/MenuScroller.java +++ b/app/src/processing/app/tools/MenuScroller.java @@ -16,6 +16,7 @@ import java.awt.event.ActionListener; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.awt.event.KeyEvent; +import java.util.Arrays; /** * A class that provides scrolling capabilities to a long menu dropdown or @@ -539,7 +540,7 @@ public class MenuScroller { } private void setMenuItems() { - menuItems = menu.getComponents(); + menuItems = Arrays.stream(menu.getComponents()).filter(x -> x.isVisible()).toArray(Component[]::new); if (keepVisibleIndex >= topFixedCount && keepVisibleIndex <= menuItems.length - bottomFixedCount && (keepVisibleIndex > firstIndex + scrollCount From cb1b845fbd1354a9c6b163f2aa996e94e9e6013b Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sun, 25 Apr 2021 23:14:25 +0200 Subject: [PATCH 2/2] Preserve all menu items for restoring when the menu is closed --- app/src/processing/app/tools/MenuScroller.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/processing/app/tools/MenuScroller.java b/app/src/processing/app/tools/MenuScroller.java index 9acaa8548..d934a4583 100644 --- a/app/src/processing/app/tools/MenuScroller.java +++ b/app/src/processing/app/tools/MenuScroller.java @@ -34,6 +34,7 @@ public class MenuScroller { private JPopupMenu menu; private Component[] menuItems; + private Component[] allMenuItems; private MenuScrollItem upItem; private MenuScrollItem downItem; private final MenuScrollListener menuListener = new MenuScrollListener(); @@ -540,7 +541,8 @@ public class MenuScroller { } private void setMenuItems() { - menuItems = Arrays.stream(menu.getComponents()).filter(x -> x.isVisible()).toArray(Component[]::new); + allMenuItems = menu.getComponents(); + menuItems = Arrays.stream(allMenuItems).filter(x -> x.isVisible()).toArray(Component[]::new); if (keepVisibleIndex >= topFixedCount && keepVisibleIndex <= menuItems.length - bottomFixedCount && (keepVisibleIndex > firstIndex + scrollCount @@ -555,7 +557,7 @@ public class MenuScroller { private void restoreMenuItems() { menu.removeAll(); - for (Component component : menuItems) { + for (Component component : allMenuItems) { menu.add(component); } }