@@ -1107,15 +1107,17 @@ public void onBoardOrPortChange() {
1107
1107
}
1108
1108
1109
1109
1110
- public void rebuildBoardsMenu (JMenu menu ) {
1110
+ public void rebuildBoardsMenu (JMenu boardsMenu , final JMenu cpuTypeMenu ) {
1111
1111
String selPackage = Preferences .get ("target_package" );
1112
1112
String selPlatform = Preferences .get ("target_platform" );
1113
1113
String selBoard = Preferences .get ("board" );
1114
-
1115
- menu .removeAll ();
1114
+ String selBoardContainer = Preferences .get ("board_container" );
1115
+
1116
+ boardsMenu .removeAll ();
1116
1117
boolean first = true ;
1117
1118
1118
- ButtonGroup group = new ButtonGroup ();
1119
+ ButtonGroup boardsButtonGroup = new ButtonGroup ();
1120
+ ButtonGroup cpuTypesButtonGroup = new ButtonGroup ();
1119
1121
1120
1122
// Cycle through all packages
1121
1123
for (TargetPackage targetPackage : packages .values ()) {
@@ -1128,43 +1130,181 @@ public void rebuildBoardsMenu(JMenu menu) {
1128
1130
1129
1131
// Add a title for each group of boards
1130
1132
if (!first )
1131
- menu .add (new JSeparator ());
1132
- first = false ;
1133
+ boardsMenu .add (new JSeparator ());
1134
+ first = false ;
1133
1135
JMenuItem separator = new JMenuItem (targetPlatform .getPreferences ().get ("name" ));
1134
1136
separator .setEnabled (false );
1135
- menu .add (separator );
1137
+ boardsMenu .add (separator );
1136
1138
1137
1139
// For every platform cycle through all boards
1138
- for (String board : targetPlatform .getOrderedBoards ()) {
1140
+ for (String boardID : targetPlatform .getOrderedBoards ()) {
1141
+
1142
+ PreferencesMap boardAttributes = boards .get (boardID );
1143
+ final String boardContainer = boardAttributes .get ("container" );
1144
+
1145
+ AbstractAction filterCPUTypeMenuAction = new AbstractAction () {
1146
+
1147
+ @ Override
1148
+ public void actionPerformed (ActionEvent e ) {
1149
+ Preferences .set ("board_container" , (String ) getValue ("board_container" ));
1150
+
1151
+ cpuTypeMenu .setEnabled (true );
1152
+
1153
+ for (int i = 0 ; i < cpuTypeMenu .getItemCount (); i ++) {
1154
+ JMenuItem cpuTypeMenuItem = cpuTypeMenu .getItem (i );
1155
+ boolean visible = boardContainer .equals (cpuTypeMenuItem .getAction ().getValue ("board_container" ));
1156
+ cpuTypeMenuItem .setVisible (visible );
1157
+ }
1158
+
1159
+ JMenuItem selectSelectedOrFirstVisibleMenuItem = selectVisibleSelectedOrFirstMenuItem (cpuTypeMenu );
1160
+ selectSelectedOrFirstVisibleMenuItem .doClick ();
1161
+ }
1162
+ };
1163
+ filterCPUTypeMenuAction .putValue ("board_container" , boardContainer );
1139
1164
1140
- // Setup a menu item for the current board
1141
- String boardName = boards .get (board ).get ("name" );
1142
1165
@ SuppressWarnings ("serial" )
1143
- AbstractAction action = new AbstractAction (boardName ) {
1166
+ final AbstractAction selectBoardAction = new AbstractAction (boardAttributes . get ( "cpu" ) ) {
1144
1167
public void actionPerformed (ActionEvent actionevent ) {
1145
1168
Preferences .set ("target_package" , (String ) getValue ("package" ));
1146
1169
Preferences .set ("target_platform" , (String ) getValue ("platform" ));
1147
1170
Preferences .set ("board" , (String ) getValue ("board" ));
1148
-
1171
+
1149
1172
onBoardOrPortChange ();
1150
1173
Sketch .buildSettingChanged ();
1151
1174
rebuildImportMenu (Editor .importMenu );
1152
1175
rebuildExamplesMenu (Editor .examplesMenu );
1153
1176
}
1154
1177
};
1155
- action .putValue ("package" , packageName );
1156
- action .putValue ("platform" , platformName );
1157
- action .putValue ("board" , board );
1158
- JMenuItem item = new JRadioButtonMenuItem (action );
1159
- if (packageName .equals (selPackage ) &&
1160
- platformName .equals (selPlatform ) && board .equals (selBoard )) {
1161
- item .setSelected (true );
1178
+ selectBoardAction .putValue ("package" , packageName );
1179
+ selectBoardAction .putValue ("platform" , platformName );
1180
+ selectBoardAction .putValue ("board" , boardID );
1181
+ selectBoardAction .putValue ("board_container" , boardContainer );
1182
+
1183
+ if (boardContainer != null ) {
1184
+ findOrCreateBoardContainerMenu (boardsMenu , boardsButtonGroup , boardContainer , filterCPUTypeMenuAction );
1185
+
1186
+ JMenuItem item = new JRadioButtonMenuItem (selectBoardAction );
1187
+ cpuTypesButtonGroup .add (item );
1188
+ cpuTypeMenu .add (item );
1189
+ } else {
1190
+ AbstractAction selectBoardWithoutContainerAction = new AbstractAction (boardAttributes .get ("name" )) {
1191
+
1192
+ @ Override
1193
+ public void actionPerformed (ActionEvent e ) {
1194
+ cpuTypeMenu .setEnabled (false );
1195
+ Preferences .unset ("board_container" );
1196
+ selectBoardAction .actionPerformed (e );
1197
+ }
1198
+
1199
+ @ Override
1200
+ public Object getValue (String key ) {
1201
+ return selectBoardAction .getValue (key );
1202
+ }
1203
+
1204
+ @ Override
1205
+ public void putValue (String key , Object newValue ) {
1206
+ selectBoardAction .putValue (key , newValue );
1207
+ }
1208
+ };
1209
+ JMenuItem item = new JRadioButtonMenuItem (selectBoardWithoutContainerAction );
1210
+ boardsButtonGroup .add (item );
1211
+ boardsMenu .add (item );
1162
1212
}
1163
- group .add (item );
1164
- menu .add (item );
1165
1213
}
1166
1214
}
1167
1215
}
1216
+
1217
+ JMenuItem selectedBoardMenu = selectMenuItemByBoardContainer (boardsMenu , selBoardContainer );
1218
+ if (selectedBoardMenu == null ) {
1219
+ selectedBoardMenu = selectMenuItemByBoardPackagePlatform (boardsMenu , selBoard , selPackage , selPlatform );
1220
+ if (selectedBoardMenu == null ) {
1221
+ selectedBoardMenu = selectFirstEnabledMenuItem (boardsMenu );
1222
+ }
1223
+ }
1224
+ selectedBoardMenu .doClick ();
1225
+
1226
+ if (cpuTypeMenu .isEnabled ()) {
1227
+ JMenuItem selectedCPUTypeMenu ;
1228
+ if (selBoard == null ) {
1229
+ selectedCPUTypeMenu = selectFirstEnabledMenuItem (cpuTypeMenu );
1230
+ } else {
1231
+ selectedCPUTypeMenu = selectMenuItemByBoardPackagePlatform (cpuTypeMenu , selBoard , selPackage , selPlatform );
1232
+ if (selectedCPUTypeMenu == null ) {
1233
+ selectedCPUTypeMenu = selectFirstEnabledMenuItem (cpuTypeMenu );
1234
+ }
1235
+ }
1236
+ selectedCPUTypeMenu .doClick ();
1237
+ }
1238
+ }
1239
+
1240
+ private static JMenuItem selectVisibleSelectedOrFirstMenuItem (JMenu menu ) {
1241
+ JMenuItem firstVisible = null ;
1242
+ for (int i = 0 ; i < menu .getItemCount (); i ++) {
1243
+ JMenuItem item = menu .getItem (i );
1244
+ if (item != null && item .isVisible ()) {
1245
+ if (item .isSelected ()) {
1246
+ return item ;
1247
+ }
1248
+ if (firstVisible == null ) {
1249
+ firstVisible = item ;
1250
+ }
1251
+ }
1252
+ }
1253
+
1254
+ if (firstVisible != null ) {
1255
+ return firstVisible ;
1256
+ }
1257
+
1258
+ throw new IllegalStateException ("Menu has no enabled items" );
1259
+ }
1260
+
1261
+ private static JMenuItem selectFirstEnabledMenuItem (JMenu menu ) {
1262
+ for (int i = 0 ; i < menu .getItemCount (); i ++) {
1263
+ JMenuItem item = menu .getItem (i );
1264
+ if (item != null && item .isEnabled ()) {
1265
+ return item ;
1266
+ }
1267
+ }
1268
+ throw new IllegalStateException ("Menu has no enabled items" );
1269
+ }
1270
+
1271
+ private static JMenuItem selectMenuItemByBoardContainer (JMenu menu , String boardContainer ) {
1272
+ if (boardContainer == null ) {
1273
+ return null ;
1274
+ }
1275
+
1276
+ for (int i = 0 ; i < menu .getItemCount (); i ++) {
1277
+ JMenuItem item = menu .getItem (i );
1278
+ if (item != null && item .getAction () != null && boardContainer .equals (item .getAction ().getValue ("board_container" ))) {
1279
+ return item ;
1280
+ }
1281
+ }
1282
+ return null ;
1283
+ }
1284
+
1285
+ private static JMenuItem selectMenuItemByBoardPackagePlatform (JMenu menu , String selBoard , String selPackage , String selPlatform ) {
1286
+ for (int i = 0 ; i < menu .getItemCount (); i ++) {
1287
+ JMenuItem item = menu .getItem (i );
1288
+ if (item != null && item .getAction () != null && selBoard .equals (item .getAction ().getValue ("board" ))
1289
+ && selPackage .equals (item .getAction ().getValue ("package" )) && selPlatform .equals (item .getAction ().getValue ("platform" ))) {
1290
+ return item ;
1291
+ }
1292
+ }
1293
+ return null ;
1294
+ }
1295
+
1296
+ private JMenuItem findOrCreateBoardContainerMenu (JMenu boardsMenu , ButtonGroup boardsButtonGroup , String boardContainerName , AbstractAction boardMenuAction ) {
1297
+ for (int i = 0 ; i < boardsMenu .getItemCount (); i ++ ) {
1298
+ JMenuItem boardContainer = boardsMenu .getItem (i );
1299
+ if (boardContainer != null && boardContainerName .equals (boardContainer .getText ())) {
1300
+ return boardContainer ;
1301
+ }
1302
+ }
1303
+ JMenuItem item = new JRadioButtonMenuItem (boardMenuAction );
1304
+ item .setText (boardContainerName );
1305
+ boardsButtonGroup .add (item );
1306
+ boardsMenu .add (item );
1307
+ return item ;
1168
1308
}
1169
1309
1170
1310
public void rebuildProgrammerMenu (JMenu menu ) {
0 commit comments