Skip to content

Commit 9b7f473

Browse files
committed
new boards menu with custom submenus
https://code.google.com/p/arduino/issues/detail?id=257
1 parent cf4d72c commit 9b7f473

File tree

8 files changed

+397
-205
lines changed

8 files changed

+397
-205
lines changed

app/src/processing/app/Base.java

Lines changed: 139 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@
3434
import processing.app.debug.TargetPackage;
3535
import processing.app.debug.TargetPlatform;
3636
import processing.app.helpers.FileUtils;
37+
import processing.app.helpers.Maps;
3738
import processing.app.helpers.PreferencesMap;
3839
import processing.app.helpers.filefilters.OnlyDirs;
3940
import processing.app.helpers.filefilters.OnlyFilesWithExtension;
41+
import processing.app.tools.MapWithSubkeys;
4042
import processing.app.tools.ZipDeflater;
4143
import processing.core.*;
4244
import static processing.app.I18n._;
@@ -1121,18 +1123,19 @@ public void onBoardOrPortChange() {
11211123
editor.onBoardOrPortChange();
11221124
}
11231125

1124-
1125-
public void rebuildBoardsMenu(JMenu boardsMenu, final JMenu cpuTypeMenu, final Editor editor) {
1126+
public void rebuildBoardsMenu(JMenu toolsMenu, final Editor editor) {
1127+
JMenu boardsMenu = makeOrGetBoardMenu(toolsMenu, "Board");
1128+
11261129
String selPackage = Preferences.get("target_package");
11271130
String selPlatform = Preferences.get("target_platform");
11281131
String selBoard = Preferences.get("board");
1129-
String selBoardContainer = Preferences.get("board_container");
11301132

1131-
boardsMenu.removeAll();
11321133
boolean first = true;
11331134

1135+
List<JMenuItem> menuItemsToClickAfterStartup = new LinkedList<JMenuItem>();
1136+
11341137
ButtonGroup boardsButtonGroup = new ButtonGroup();
1135-
ButtonGroup cpuTypesButtonGroup = new ButtonGroup();
1138+
Map<String, ButtonGroup> buttonGroupsMap = new HashMap<String, ButtonGroup>();
11361139

11371140
// Cycle through all packages
11381141
for (TargetPackage targetPackage : packages.values()) {
@@ -1142,115 +1145,160 @@ public void rebuildBoardsMenu(JMenu boardsMenu, final JMenu cpuTypeMenu, final E
11421145
for (TargetPlatform targetPlatform : targetPackage.platforms()) {
11431146
String platformName = targetPlatform.getName();
11441147
Map<String, PreferencesMap> boards = targetPlatform.getBoards();
1148+
1149+
if (targetPlatform.getPreferences().get("name") == null || targetPlatform.getOrderedBoards().isEmpty()) {
1150+
continue;
1151+
}
11451152

11461153
// Add a title for each group of boards
1147-
if (!first)
1154+
if (!first) {
11481155
boardsMenu.add(new JSeparator());
1149-
first = false;
1156+
}
1157+
first = false;
1158+
11501159
JMenuItem separator = new JMenuItem(targetPlatform.getPreferences().get("name"));
11511160
separator.setEnabled(false);
11521161
boardsMenu.add(separator);
11531162

11541163
// For every platform cycle through all boards
1155-
for (String boardID : targetPlatform.getOrderedBoards()) {
1164+
for (final String boardID : targetPlatform.getOrderedBoards()) {
11561165

11571166
PreferencesMap boardAttributes = boards.get(boardID);
1158-
final String boardContainer = boardAttributes.get("container");
11591167

1160-
AbstractAction filterCPUTypeMenuAction = new AbstractAction() {
1168+
AbstractAction action = new AbstractAction(boardAttributes.get("name")) {
11611169

11621170
@Override
11631171
public void actionPerformed(ActionEvent e) {
1164-
Preferences.set("board_container", (String) getValue("board_container"));
1165-
1166-
cpuTypeMenu.setEnabled(true);
1167-
1168-
for (int i = 0; i < cpuTypeMenu.getItemCount(); i++) {
1169-
JMenuItem cpuTypeMenuItem = cpuTypeMenu.getItem(i);
1170-
boolean visible = boardContainer.equals(cpuTypeMenuItem.getAction().getValue("board_container"));
1171-
cpuTypeMenuItem.setVisible(visible);
1172-
}
1173-
1174-
JMenuItem selectSelectedOrFirstVisibleMenuItem = selectVisibleSelectedOrFirstMenuItem(cpuTypeMenu);
1175-
selectSelectedOrFirstVisibleMenuItem.doClick();
1176-
}
1177-
};
1178-
filterCPUTypeMenuAction.putValue("board_container", boardContainer);
1179-
1180-
@SuppressWarnings("serial")
1181-
final AbstractAction selectBoardAction = new AbstractAction(boardAttributes.get("cpu")) {
1182-
public void actionPerformed(ActionEvent actionevent) {
11831172
Preferences.set("target_package", (String) getValue("package"));
11841173
Preferences.set("target_platform", (String) getValue("platform"));
11851174
Preferences.set("board", (String) getValue("board"));
1175+
1176+
filterVisibilityOfSubsequentBoardMenus((String) getValue("board"), 1, e);
11861177

11871178
onBoardOrPortChange();
11881179
Sketch.buildSettingChanged();
11891180
rebuildImportMenu(Editor.importMenu, editor);
11901181
rebuildExamplesMenu(Editor.examplesMenu);
11911182
}
1183+
11921184
};
1193-
selectBoardAction.putValue("package", packageName);
1194-
selectBoardAction.putValue("platform", platformName);
1195-
selectBoardAction.putValue("board", boardID);
1196-
selectBoardAction.putValue("board_container", boardContainer);
1185+
action.putValue("properties", boardAttributes);
1186+
action.putValue("board", boardID);
1187+
action.putValue("package", packageName);
1188+
action.putValue("platform", platformName);
11971189

1198-
if (boardContainer != null) {
1199-
findOrCreateBoardContainerMenu(boardsMenu, boardsButtonGroup, boardContainer, filterCPUTypeMenuAction);
1190+
JRadioButtonMenuItem item = new JRadioButtonMenuItem(action);
1191+
boardsMenu.add(item);
1192+
boardsButtonGroup.add(item);
12001193

1201-
JMenuItem item = new JRadioButtonMenuItem(selectBoardAction);
1202-
cpuTypesButtonGroup.add(item);
1203-
cpuTypeMenu.add(item);
1204-
} else {
1205-
AbstractAction selectBoardWithoutContainerAction = new AbstractAction(boardAttributes.get("name")) {
1206-
1207-
@Override
1208-
public void actionPerformed(ActionEvent e) {
1209-
cpuTypeMenu.setEnabled(false);
1210-
Preferences.unset("board_container");
1211-
selectBoardAction.actionPerformed(e);
1212-
}
1213-
1214-
@Override
1215-
public Object getValue(String key) {
1216-
return selectBoardAction.getValue(key);
1217-
}
1218-
1219-
@Override
1220-
public void putValue(String key, Object newValue) {
1221-
selectBoardAction.putValue(key, newValue);
1194+
if (selBoard.equals(action.getValue("board")) && selPackage.equals(action.getValue("package"))
1195+
&& selPlatform.equals(action.getValue("platform"))) {
1196+
menuItemsToClickAfterStartup.add(item);
1197+
}
1198+
1199+
if (targetPlatform.getCustomMenus() != null) {
1200+
List<String> customMenuIDs = new LinkedList<String>(targetPlatform.getCustomMenus().getKeys());
1201+
for (int i = 0; i < customMenuIDs.size(); i++) {
1202+
final String customMenuID = customMenuIDs.get(i);
1203+
JMenu menu = makeOrGetBoardMenu(toolsMenu, _(targetPlatform.getCustomMenus().getValueOf(customMenuID)));
1204+
MapWithSubkeys customMenu = targetPlatform.getCustomMenus().get(customMenuID);
1205+
if (customMenu.getKeys().contains(boardID)) {
1206+
MapWithSubkeys boardCustomMenu = customMenu.get(boardID);
1207+
final int currentIndex = i + 1 + 1; //plus 1 to skip the first board menu, plus 1 to keep the custom menu next to this one
1208+
for (final String customMenuOption : boardCustomMenu.getKeys()) {
1209+
action = new AbstractAction(_(boardCustomMenu.getValueOf(customMenuOption))) {
1210+
1211+
@Override
1212+
public void actionPerformed(ActionEvent e) {
1213+
Preferences.set("target_package", (String) getValue("package"));
1214+
Preferences.set("target_platform", (String) getValue("platform"));
1215+
Preferences.set("board", (String) getValue("board"));
1216+
Preferences.set("custom_" + customMenuID, boardID + "_" + (String) getValue("custom_menu_option"));
1217+
1218+
filterVisibilityOfSubsequentBoardMenus((String) getValue("board"), currentIndex, e);
1219+
1220+
onBoardOrPortChange();
1221+
Sketch.buildSettingChanged();
1222+
rebuildImportMenu(Editor.importMenu, editor);
1223+
rebuildExamplesMenu(Editor.examplesMenu);
1224+
}
1225+
};
1226+
action.putValue("properties", boardCustomMenu.getValues());
1227+
action.putValue("board", boardID);
1228+
action.putValue("custom_menu_option", customMenuOption);
1229+
action.putValue("package", packageName);
1230+
action.putValue("platform", platformName);
1231+
1232+
if (!buttonGroupsMap.containsKey(customMenuID)) {
1233+
buttonGroupsMap.put(customMenuID, new ButtonGroup());
1234+
}
1235+
1236+
item = new JRadioButtonMenuItem(action);
1237+
menu.add(item);
1238+
buttonGroupsMap.get(customMenuID).add(item);
1239+
1240+
String selectedCustomMenuEntry = Preferences.get("custom_" + customMenuID);
1241+
if (selBoard.equals(boardID) && (boardID + "_" + customMenuOption).equals(selectedCustomMenuEntry)) {
1242+
menuItemsToClickAfterStartup.add(item);
1243+
}
1244+
}
12221245
}
1223-
};
1224-
JMenuItem item = new JRadioButtonMenuItem(selectBoardWithoutContainerAction);
1225-
boardsButtonGroup.add(item);
1226-
boardsMenu.add(item);
1246+
}
12271247
}
12281248
}
12291249
}
1230-
}
1231-
1232-
JMenuItem selectedBoardMenu = selectMenuItemByBoardContainer(boardsMenu, selBoardContainer);
1233-
if (selectedBoardMenu == null) {
1234-
selectedBoardMenu = selectMenuItemByBoardPackagePlatform(boardsMenu, selBoard, selPackage, selPlatform);
1235-
if (selectedBoardMenu == null) {
1236-
selectedBoardMenu = selectFirstEnabledMenuItem(boardsMenu);
1250+
1251+
if (menuItemsToClickAfterStartup.isEmpty()) {
1252+
menuItemsToClickAfterStartup.add(selectFirstEnabledMenuItem(boardsMenu));
1253+
}
1254+
1255+
for (JMenuItem menuItemToClick : menuItemsToClickAfterStartup) {
1256+
menuItemToClick.setSelected(true);
1257+
menuItemToClick.getAction().actionPerformed(new ActionEvent(this, -1, ""));
12371258
}
12381259
}
1239-
selectedBoardMenu.doClick();
1260+
}
12401261

1241-
if (cpuTypeMenu.isEnabled()) {
1242-
JMenuItem selectedCPUTypeMenu;
1243-
if (selBoard == null) {
1244-
selectedCPUTypeMenu = selectFirstEnabledMenuItem(cpuTypeMenu);
1245-
} else {
1246-
selectedCPUTypeMenu = selectMenuItemByBoardPackagePlatform(cpuTypeMenu, selBoard, selPackage, selPlatform);
1247-
if (selectedCPUTypeMenu == null) {
1248-
selectedCPUTypeMenu = selectFirstEnabledMenuItem(cpuTypeMenu);
1262+
private static void filterVisibilityOfSubsequentBoardMenus(String boardID, int fromIndex, ActionEvent originatingEvent) {
1263+
for (int i = fromIndex; i < Editor.boardsMenus.size(); i++) {
1264+
JMenu menu = Editor.boardsMenus.get(i);
1265+
for (int m = 0; m < menu.getItemCount(); m++) {
1266+
JMenuItem menuItem = menu.getItem(m);
1267+
menuItem.setVisible(menuItem.getAction().getValue("board").equals(boardID));
1268+
}
1269+
menu.setEnabled(ifThereAreVisibleItemsOn(menu));
1270+
1271+
if (menu.isEnabled()) {
1272+
JMenuItem visibleSelectedOrFirstMenuItem = selectVisibleSelectedOrFirstMenuItem(menu);
1273+
if (!visibleSelectedOrFirstMenuItem.isSelected()) {
1274+
visibleSelectedOrFirstMenuItem.setSelected(true);
1275+
visibleSelectedOrFirstMenuItem.getAction().actionPerformed(originatingEvent);
12491276
}
12501277
}
1251-
selectedCPUTypeMenu.doClick();
12521278
}
12531279
}
1280+
1281+
private static boolean ifThereAreVisibleItemsOn(JMenu menu) {
1282+
for (int i = 0; i < menu.getItemCount(); i++) {
1283+
if (menu.getItem(i).isVisible()) {
1284+
return true;
1285+
}
1286+
}
1287+
return false;
1288+
}
1289+
1290+
private JMenu makeOrGetBoardMenu(JMenu toolsMenu, String label) {
1291+
String i18nLabel = _(label);
1292+
for (JMenu menu : Editor.boardsMenus) {
1293+
if (i18nLabel.equals(menu.getText())) {
1294+
return menu;
1295+
}
1296+
}
1297+
JMenu menu = new JMenu(i18nLabel);
1298+
Editor.boardsMenus.add(menu);
1299+
toolsMenu.add(menu);
1300+
return menu;
1301+
}
12541302

12551303
private static JMenuItem selectVisibleSelectedOrFirstMenuItem(JMenu menu) {
12561304
JMenuItem firstVisible = null;
@@ -1283,45 +1331,6 @@ private static JMenuItem selectFirstEnabledMenuItem(JMenu menu) {
12831331
throw new IllegalStateException("Menu has no enabled items");
12841332
}
12851333

1286-
private static JMenuItem selectMenuItemByBoardContainer(JMenu menu, String boardContainer) {
1287-
if (boardContainer == null) {
1288-
return null;
1289-
}
1290-
1291-
for (int i = 0; i < menu.getItemCount(); i++) {
1292-
JMenuItem item = menu.getItem(i);
1293-
if (item != null && item.getAction() != null && boardContainer.equals(item.getAction().getValue("board_container"))) {
1294-
return item;
1295-
}
1296-
}
1297-
return null;
1298-
}
1299-
1300-
private static JMenuItem selectMenuItemByBoardPackagePlatform(JMenu menu, String selBoard, String selPackage, String selPlatform) {
1301-
for (int i = 0; i < menu.getItemCount(); i++) {
1302-
JMenuItem item = menu.getItem(i);
1303-
if (item != null && item.getAction() != null && selBoard.equals(item.getAction().getValue("board"))
1304-
&& selPackage.equals(item.getAction().getValue("package")) && selPlatform.equals(item.getAction().getValue("platform"))) {
1305-
return item;
1306-
}
1307-
}
1308-
return null;
1309-
}
1310-
1311-
private JMenuItem findOrCreateBoardContainerMenu(JMenu boardsMenu, ButtonGroup boardsButtonGroup, String boardContainerName, AbstractAction boardMenuAction) {
1312-
for (int i = 0; i < boardsMenu.getItemCount(); i++ ) {
1313-
JMenuItem boardContainer = boardsMenu.getItem(i);
1314-
if (boardContainer != null && boardContainerName.equals(boardContainer.getText())) {
1315-
return boardContainer;
1316-
}
1317-
}
1318-
JMenuItem item = new JRadioButtonMenuItem(boardMenuAction);
1319-
item.setText(boardContainerName);
1320-
boardsButtonGroup.add(item);
1321-
boardsMenu.add(item);
1322-
return item;
1323-
}
1324-
13251334
public void rebuildProgrammerMenu(JMenu menu) {
13261335
menu.removeAll();
13271336
ButtonGroup group = new ButtonGroup();
@@ -1809,10 +1818,22 @@ static public TargetPlatform getCurrentTargetPlatformFromPackage(String pack) {
18091818
return getTargetPlatform(pack, Preferences.get("target_platform"));
18101819
}
18111820

1812-
static public PreferencesMap getBoardPreferences() {
1821+
static public Map<String, String> getBoardPreferences() {
18131822
TargetPlatform target = getTargetPlatform();
18141823
String board = Preferences.get("board");
1815-
return target.getBoards().get(board);
1824+
Map<String, String> boardPreferences = Maps.merge(target.getBoards().get(board), new LinkedHashMap<String, String>());
1825+
if (target.getCustomMenus() != null) {
1826+
for (String customMenuID : target.getCustomMenus().getKeys()) {
1827+
MapWithSubkeys boardCustomMenu = target.getCustomMenus().get(customMenuID).get(board);
1828+
String selectedCustomMenuEntry = Preferences.get("custom_" + customMenuID);
1829+
if (boardCustomMenu != null && selectedCustomMenuEntry != null && selectedCustomMenuEntry.startsWith(board)) {
1830+
String menuEntryId = selectedCustomMenuEntry.substring(selectedCustomMenuEntry.indexOf("_") + 1);
1831+
Maps.merge(boardCustomMenu.get(menuEntryId).getValues(), boardPreferences);
1832+
boardPreferences.put("name", boardPreferences.get("name") + ", " + boardCustomMenu.getValueOf(menuEntryId));
1833+
}
1834+
}
1835+
}
1836+
return boardPreferences;
18161837
}
18171838

18181839
static public File getSketchbookFolder() {

0 commit comments

Comments
 (0)