34
34
import processing .app .debug .TargetPackage ;
35
35
import processing .app .debug .TargetPlatform ;
36
36
import processing .app .helpers .FileUtils ;
37
+ import processing .app .helpers .Maps ;
37
38
import processing .app .helpers .PreferencesMap ;
38
39
import processing .app .helpers .filefilters .OnlyDirs ;
39
40
import processing .app .helpers .filefilters .OnlyFilesWithExtension ;
41
+ import processing .app .tools .MapWithSubkeys ;
40
42
import processing .app .tools .ZipDeflater ;
41
43
import processing .core .*;
42
44
import static processing .app .I18n ._ ;
@@ -1121,18 +1123,19 @@ public void onBoardOrPortChange() {
1121
1123
editor .onBoardOrPortChange ();
1122
1124
}
1123
1125
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
+
1126
1129
String selPackage = Preferences .get ("target_package" );
1127
1130
String selPlatform = Preferences .get ("target_platform" );
1128
1131
String selBoard = Preferences .get ("board" );
1129
- String selBoardContainer = Preferences .get ("board_container" );
1130
1132
1131
- boardsMenu .removeAll ();
1132
1133
boolean first = true ;
1133
1134
1135
+ List <JMenuItem > menuItemsToClickAfterStartup = new LinkedList <JMenuItem >();
1136
+
1134
1137
ButtonGroup boardsButtonGroup = new ButtonGroup ();
1135
- ButtonGroup cpuTypesButtonGroup = new ButtonGroup ();
1138
+ Map < String , ButtonGroup > buttonGroupsMap = new HashMap < String , ButtonGroup > ();
1136
1139
1137
1140
// Cycle through all packages
1138
1141
for (TargetPackage targetPackage : packages .values ()) {
@@ -1142,115 +1145,160 @@ public void rebuildBoardsMenu(JMenu boardsMenu, final JMenu cpuTypeMenu, final E
1142
1145
for (TargetPlatform targetPlatform : targetPackage .platforms ()) {
1143
1146
String platformName = targetPlatform .getName ();
1144
1147
Map <String , PreferencesMap > boards = targetPlatform .getBoards ();
1148
+
1149
+ if (targetPlatform .getPreferences ().get ("name" ) == null || targetPlatform .getBoards ().isEmpty ()) {
1150
+ continue ;
1151
+ }
1145
1152
1146
1153
// Add a title for each group of boards
1147
- if (!first )
1154
+ if (!first ) {
1148
1155
boardsMenu .add (new JSeparator ());
1149
- first = false ;
1156
+ }
1157
+ first = false ;
1158
+
1150
1159
JMenuItem separator = new JMenuItem (targetPlatform .getPreferences ().get ("name" ));
1151
1160
separator .setEnabled (false );
1152
1161
boardsMenu .add (separator );
1153
1162
1154
1163
// For every platform cycle through all boards
1155
- for (String boardID : targetPlatform .getOrderedBoards ()) {
1164
+ for (final String boardID : targetPlatform .getBoards (). keySet ()) {
1156
1165
1157
1166
PreferencesMap boardAttributes = boards .get (boardID );
1158
- final String boardContainer = boardAttributes .get ("container" );
1159
1167
1160
- AbstractAction filterCPUTypeMenuAction = new AbstractAction () {
1168
+ AbstractAction action = new AbstractAction (boardAttributes . get ( "name" ) ) {
1161
1169
1162
1170
@ Override
1163
1171
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 ) {
1183
1172
Preferences .set ("target_package" , (String ) getValue ("package" ));
1184
1173
Preferences .set ("target_platform" , (String ) getValue ("platform" ));
1185
1174
Preferences .set ("board" , (String ) getValue ("board" ));
1175
+
1176
+ filterVisibilityOfSubsequentBoardMenus ((String ) getValue ("board" ), 1 , e );
1186
1177
1187
1178
onBoardOrPortChange ();
1188
1179
Sketch .buildSettingChanged ();
1189
1180
rebuildImportMenu (Editor .importMenu , editor );
1190
1181
rebuildExamplesMenu (Editor .examplesMenu );
1191
1182
}
1183
+
1192
1184
};
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 );
1197
1189
1198
- if (boardContainer != null ) {
1199
- findOrCreateBoardContainerMenu (boardsMenu , boardsButtonGroup , boardContainer , filterCPUTypeMenuAction );
1190
+ JRadioButtonMenuItem item = new JRadioButtonMenuItem (action );
1191
+ boardsMenu .add (item );
1192
+ boardsButtonGroup .add (item );
1200
1193
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
+ }
1222
1245
}
1223
- };
1224
- JMenuItem item = new JRadioButtonMenuItem (selectBoardWithoutContainerAction );
1225
- boardsButtonGroup .add (item );
1226
- boardsMenu .add (item );
1246
+ }
1227
1247
}
1228
1248
}
1229
1249
}
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 , "" ));
1237
1258
}
1238
1259
}
1239
- selectedBoardMenu . doClick ();
1260
+ }
1240
1261
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 );
1249
1276
}
1250
1277
}
1251
- selectedCPUTypeMenu .doClick ();
1252
1278
}
1253
1279
}
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
+ }
1254
1302
1255
1303
private static JMenuItem selectVisibleSelectedOrFirstMenuItem (JMenu menu ) {
1256
1304
JMenuItem firstVisible = null ;
@@ -1283,45 +1331,6 @@ private static JMenuItem selectFirstEnabledMenuItem(JMenu menu) {
1283
1331
throw new IllegalStateException ("Menu has no enabled items" );
1284
1332
}
1285
1333
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
-
1325
1334
public void rebuildProgrammerMenu (JMenu menu ) {
1326
1335
menu .removeAll ();
1327
1336
ButtonGroup group = new ButtonGroup ();
@@ -1809,10 +1818,22 @@ static public TargetPlatform getCurrentTargetPlatformFromPackage(String pack) {
1809
1818
return getTargetPlatform (pack , Preferences .get ("target_platform" ));
1810
1819
}
1811
1820
1812
- static public PreferencesMap getBoardPreferences () {
1821
+ static public Map < String , String > getBoardPreferences () {
1813
1822
TargetPlatform target = getTargetPlatform ();
1814
1823
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 ;
1816
1837
}
1817
1838
1818
1839
static public File getSketchbookFolder () {
0 commit comments