Skip to content

Commit 0efc024

Browse files
committed
Merge branch 'boards-cputype'
2 parents c6efad5 + 9125436 commit 0efc024

File tree

3 files changed

+200
-23
lines changed

3 files changed

+200
-23
lines changed

app/src/processing/app/Base.java

Lines changed: 161 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,15 +1107,17 @@ public void onBoardOrPortChange() {
11071107
}
11081108

11091109

1110-
public void rebuildBoardsMenu(JMenu menu) {
1110+
public void rebuildBoardsMenu(JMenu boardsMenu, final JMenu cpuTypeMenu) {
11111111
String selPackage = Preferences.get("target_package");
11121112
String selPlatform = Preferences.get("target_platform");
11131113
String selBoard = Preferences.get("board");
1114-
1115-
menu.removeAll();
1114+
String selBoardContainer = Preferences.get("board_container");
1115+
1116+
boardsMenu.removeAll();
11161117
boolean first = true;
11171118

1118-
ButtonGroup group = new ButtonGroup();
1119+
ButtonGroup boardsButtonGroup = new ButtonGroup();
1120+
ButtonGroup cpuTypesButtonGroup = new ButtonGroup();
11191121

11201122
// Cycle through all packages
11211123
for (TargetPackage targetPackage : packages.values()) {
@@ -1128,43 +1130,181 @@ public void rebuildBoardsMenu(JMenu menu) {
11281130

11291131
// Add a title for each group of boards
11301132
if (!first)
1131-
menu.add(new JSeparator());
1132-
first = false;
1133+
boardsMenu.add(new JSeparator());
1134+
first = false;
11331135
JMenuItem separator = new JMenuItem(targetPlatform.getPreferences().get("name"));
11341136
separator.setEnabled(false);
1135-
menu.add(separator);
1137+
boardsMenu.add(separator);
11361138

11371139
// 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);
11391164

1140-
// Setup a menu item for the current board
1141-
String boardName = boards.get(board).get("name");
11421165
@SuppressWarnings("serial")
1143-
AbstractAction action = new AbstractAction(boardName) {
1166+
final AbstractAction selectBoardAction = new AbstractAction(boardAttributes.get("cpu")) {
11441167
public void actionPerformed(ActionEvent actionevent) {
11451168
Preferences.set("target_package", (String) getValue("package"));
11461169
Preferences.set("target_platform", (String) getValue("platform"));
11471170
Preferences.set("board", (String) getValue("board"));
1148-
1171+
11491172
onBoardOrPortChange();
11501173
Sketch.buildSettingChanged();
11511174
rebuildImportMenu(Editor.importMenu);
11521175
rebuildExamplesMenu(Editor.examplesMenu);
11531176
}
11541177
};
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);
11621212
}
1163-
group.add(item);
1164-
menu.add(item);
11651213
}
11661214
}
11671215
}
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;
11681308
}
11691309

11701310
public void rebuildProgrammerMenu(JMenu menu) {

app/src/processing/app/Editor.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ public class Editor extends JFrame implements RunnerListener {
9797
// actually used are determined by the preferences, which are shared)
9898
static JMenu boardsMenu;
9999
static JMenu serialMenu;
100+
static JMenu cpuTypeMenu;
100101

101102
static SerialMenuListener serialMenuListener;
102103
static SerialMonitor serialMonitor;
@@ -179,7 +180,8 @@ public void windowActivated(WindowEvent e) {
179180
fileMenu.insert(examplesMenu, 3);
180181
sketchMenu.insert(importMenu, 4);
181182
toolsMenu.insert(boardsMenu, numTools);
182-
toolsMenu.insert(serialMenu, numTools + 1);
183+
toolsMenu.insert(cpuTypeMenu, numTools + 1);
184+
toolsMenu.insert(serialMenu, numTools + 2);
183185
}
184186

185187
// added for 1.0.5
@@ -190,6 +192,7 @@ public void windowDeactivated(WindowEvent e) {
190192
fileMenu.remove(examplesMenu);
191193
sketchMenu.remove(importMenu);
192194
toolsMenu.remove(boardsMenu);
195+
toolsMenu.remove(cpuTypeMenu);
193196
toolsMenu.remove(serialMenu);
194197
}
195198
});
@@ -680,12 +683,14 @@ public void actionPerformed(ActionEvent e) {
680683

681684
if (boardsMenu == null) {
682685
boardsMenu = new JMenu(_("Board"));
683-
base.rebuildBoardsMenu(boardsMenu);
686+
cpuTypeMenu = new JMenu(_("CPUType"));
687+
base.rebuildBoardsMenu(boardsMenu, cpuTypeMenu);
684688
//Debug: rebuild imports
685689
importMenu.removeAll();
686690
base.rebuildImportMenu(importMenu);
687691
}
688692
menu.add(boardsMenu);
693+
menu.add(cpuTypeMenu);
689694

690695
if (serialMenuListener == null)
691696
serialMenuListener = new SerialMenuListener();

0 commit comments

Comments
 (0)