@@ -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,162 @@ 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
+ selectBoardAction .actionPerformed (e );
1196
+ }
1197
+ };
1198
+ JMenuItem item = new JRadioButtonMenuItem (selectBoardWithoutContainerAction );
1199
+ boardsButtonGroup .add (item );
1200
+ boardsMenu .add (item );
1162
1201
}
1163
- group .add (item );
1164
- menu .add (item );
1165
1202
}
1166
1203
}
1167
1204
}
1205
+
1206
+ JMenuItem selectedBoardMenu ;
1207
+ if (selBoardContainer == null ) {
1208
+ selectedBoardMenu = selectFirstEnabledMenuItem (boardsMenu );
1209
+ } else {
1210
+ selectedBoardMenu = selectMenuItemByBoardContainer (boardsMenu , selBoardContainer );
1211
+ }
1212
+ selectedBoardMenu .doClick ();
1213
+
1214
+ if (cpuTypeMenu .isEnabled ()) {
1215
+ JMenuItem selectedCPUTypeMenu ;
1216
+ if (selBoard == null ) {
1217
+ selectedCPUTypeMenu = selectFirstEnabledMenuItem (cpuTypeMenu );
1218
+ } else {
1219
+ selectedCPUTypeMenu = selectMenuItemByBoardPackagePlatform (cpuTypeMenu , selBoard , selPackage , selPlatform );
1220
+ }
1221
+ selectedCPUTypeMenu .doClick ();
1222
+ }
1223
+ }
1224
+
1225
+ private static JMenuItem selectVisibleSelectedOrFirstMenuItem (JMenu menu ) {
1226
+ JMenuItem firstVisible = null ;
1227
+ for (int i = 0 ; i < menu .getItemCount (); i ++) {
1228
+ JMenuItem item = menu .getItem (i );
1229
+ if (item != null && item .isVisible ()) {
1230
+ if (item .isSelected ()) {
1231
+ return item ;
1232
+ }
1233
+ if (firstVisible == null ) {
1234
+ firstVisible = item ;
1235
+ }
1236
+ }
1237
+ }
1238
+
1239
+ if (firstVisible != null ) {
1240
+ return firstVisible ;
1241
+ }
1242
+
1243
+ throw new IllegalStateException ("Menu has no enabled items" );
1244
+ }
1245
+
1246
+ private static JMenuItem selectFirstEnabledMenuItem (JMenu menu ) {
1247
+ for (int i = 0 ; i < menu .getItemCount (); i ++) {
1248
+ JMenuItem item = menu .getItem (i );
1249
+ if (item != null && item .isEnabled ()) {
1250
+ return item ;
1251
+ }
1252
+ }
1253
+ throw new IllegalStateException ("Menu has no enabled items" );
1254
+ }
1255
+
1256
+ private static JMenuItem selectMenuItemByBoardContainer (JMenu menu , String boardContainer ) {
1257
+ for (int i = 0 ; i < menu .getItemCount (); i ++) {
1258
+ JMenuItem item = menu .getItem (i );
1259
+ if (item != null && item .getAction () != null && boardContainer .equals (item .getAction ().getValue ("board_container" ))) {
1260
+ return item ;
1261
+ }
1262
+ }
1263
+ return selectFirstEnabledMenuItem (menu );
1264
+ }
1265
+
1266
+ private static JMenuItem selectMenuItemByBoardPackagePlatform (JMenu menu , String selBoard , String selPackage , String selPlatform ) {
1267
+ for (int i = 0 ; i < menu .getItemCount (); i ++) {
1268
+ JMenuItem item = menu .getItem (i );
1269
+ if (item != null && item .getAction () != null && selBoard .equals (item .getAction ().getValue ("board" ))
1270
+ && selPackage .equals (item .getAction ().getValue ("package" )) && selPlatform .equals (item .getAction ().getValue ("platform" ))) {
1271
+ return item ;
1272
+ }
1273
+ }
1274
+ return selectFirstEnabledMenuItem (menu );
1275
+ }
1276
+
1277
+ private JMenuItem findOrCreateBoardContainerMenu (JMenu boardsMenu , ButtonGroup boardsButtonGroup , String boardContainerName , AbstractAction boardMenuAction ) {
1278
+ for (int i = 0 ; i < boardsMenu .getItemCount (); i ++ ) {
1279
+ JMenuItem boardContainer = boardsMenu .getItem (i );
1280
+ if (boardContainer != null && boardContainerName .equals (boardContainer .getText ())) {
1281
+ return boardContainer ;
1282
+ }
1283
+ }
1284
+ JMenuItem item = new JRadioButtonMenuItem (boardMenuAction );
1285
+ item .setText (boardContainerName );
1286
+ boardsButtonGroup .add (item );
1287
+ boardsMenu .add (item );
1288
+ return item ;
1168
1289
}
1169
1290
1170
1291
public void rebuildProgrammerMenu (JMenu menu ) {
0 commit comments