Skip to content

Commit

Permalink
Handle nested submenus of the Tools menu
Browse files Browse the repository at this point in the history
There is some code that, for each submenu under Tools, shows the
selected item in the label of the submenu itself (e.g. before opening
the submenu). This was done whenever the Tools menu is opened and
iterated over all the items in the submenu to identify the s

Previously, this code only looked at direct children of the submenu.
Now, this code also looks through submenus recursively, to keep the code
working even when items are divided over sub-submenus.

This makes a small behaviour change: previously, the first selected item
with a non-zero label was used. Now, the first selected item is used,
which makes the code a bit cleaner. I cannot quickly see any case where
the first selected item would have an empty text (and even more that
there is *another* selected item), so this check seems unnecessary. If
this case would occur nonetheless, it would only mean the selected item
is not displayed in the tools menu, nothing would otherwise break.
  • Loading branch information
matthijskooijman committed Feb 3, 2020
1 parent 67f35ce commit f0c007d
Showing 1 changed file with 17 additions and 9 deletions.
26 changes: 17 additions & 9 deletions app/src/processing/app/Editor.java
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,20 @@ private JMenu buildToolsMenu() {
toolsMenu.add(item);

toolsMenu.addMenuListener(new StubMenuListener() {
public JMenuItem getSelectedItemRecursive(JMenu menu) {
int count = menu.getItemCount();
for (int i=0; i < count; i++) {
JMenuItem item = menu.getItem(i);

if ((item instanceof JMenu))
item = getSelectedItemRecursive((JMenu)item);

if (item != null && item.isSelected())
return item;
}
return null;
}

public void menuSelected(MenuEvent e) {
//System.out.println("Tools menu selected.");
populatePortMenu();
Expand All @@ -772,15 +786,9 @@ public void menuSelected(MenuEvent e) {
String basename = name;
int index = name.indexOf(':');
if (index > 0) basename = name.substring(0, index);
String sel = null;
int count = menu.getItemCount();
for (int i=0; i < count; i++) {
JMenuItem item = menu.getItem(i);
if (item != null && item.isSelected()) {
sel = item.getText();
if (sel != null) break;
}
}

JMenuItem item = getSelectedItemRecursive(menu);
String sel = item != null ? item.getText() : null;
if (sel == null) {
if (!name.equals(basename)) menu.setText(basename);
} else {
Expand Down

0 comments on commit f0c007d

Please sign in to comment.