Skip to content

Commit 78ab9ae

Browse files
committed
C++ std dropdown: gray out unsupported standards, insert into footer tab bar properly
1 parent 6e11aad commit 78ab9ae

2 files changed

Lines changed: 41 additions & 28 deletions

File tree

mode/CppMode.jar

555 Bytes
Binary file not shown.

src/java/CppEditor.java

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -71,44 +71,57 @@ private void addStdDropdown(EditorFooter ef) {
7171
Container tabBar = (versionLabel != null) ? versionLabel.getParent() : null;
7272
if (tabBar == null) return;
7373

74-
// Load saved preference or detect from g++
7574
Preferences prefs = Preferences.userNodeForPackage(CppEditor.class);
76-
String savedStd = prefs.get(PREF_KEY, null);
77-
String currentStd = (savedStd != null) ? savedStd
78-
: processing.mode.cpp.CppBuild.bestCppStd("g++");
75+
String gpp = "g++";
76+
String bestStd = processing.mode.cpp.CppBuild.bestCppStd(gpp);
77+
String savedStd = prefs.get(PREF_KEY, bestStd);
78+
79+
int bestIdx = 0;
80+
for (int i = 0; i < CPP_STDS.length; i++)
81+
if (CPP_STDS[i].equals(bestStd)) { bestIdx = i; break; }
82+
final int maxIdx = bestIdx;
7983

8084
stdCombo = new JComboBox<>(CPP_STDS);
81-
stdCombo.setSelectedItem(currentStd);
85+
stdCombo.setRenderer(new javax.swing.DefaultListCellRenderer() {
86+
@Override
87+
public java.awt.Component getListCellRendererComponent(
88+
JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
89+
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
90+
int checkIdx = index < 0 ? stdCombo.getSelectedIndex() : index;
91+
boolean supported = checkIdx <= maxIdx;
92+
setEnabled(supported);
93+
setForeground(supported ? list.getForeground() : java.awt.Color.GRAY);
94+
return this;
95+
}
96+
});
97+
98+
String toSelect = bestStd;
99+
for (int i = 0; i <= bestIdx; i++)
100+
if (CPP_STDS[i].equals(savedStd)) { toSelect = savedStd; break; }
101+
stdCombo.setSelectedItem(toSelect);
82102
stdCombo.setFont(versionLabel.getFont());
83103
stdCombo.setFocusable(false);
84-
stdCombo.setToolTipText("C++ standard version");
85-
stdCombo.addActionListener(e -> {
86-
String selected = (String) stdCombo.getSelectedItem();
87-
prefs.put(PREF_KEY, selected);
88-
});
104+
stdCombo.setToolTipText("C++ standard — grayed out = not supported by your g++");
89105

90-
// Position just left of the version label
91-
tabBar.setLayout(null);
92-
tabBar.add(stdCombo);
93-
tabBar.addComponentListener(new java.awt.event.ComponentAdapter() {
94-
@Override public void componentResized(java.awt.event.ComponentEvent e) {
95-
positionStdCombo(tabBar, versionLabel);
96-
}
106+
stdCombo.addActionListener(e -> {
107+
int sel = stdCombo.getSelectedIndex();
108+
if (sel > maxIdx) { stdCombo.setSelectedIndex(maxIdx); return; }
109+
prefs.put(PREF_KEY, (String) stdCombo.getSelectedItem());
97110
});
98-
SwingUtilities.invokeLater(() -> positionStdCombo(tabBar, versionLabel));
99-
}
100111

101-
private void positionStdCombo(Container tabBar, JLabel versionLabel) {
102-
if (stdCombo == null || !versionLabel.isShowing()) return;
103-
Point vpos = SwingUtilities.convertPoint(versionLabel, 0, 0, tabBar);
104-
Dimension pref = stdCombo.getPreferredSize();
105-
int h = tabBar.getHeight();
106-
int y = (h - pref.height) / 2;
107-
int x = vpos.x - pref.width - 8;
108-
if (x > 0) stdCombo.setBounds(x, y, pref.width, pref.height);
112+
JPanel wrapper = new JPanel(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 4, 0));
113+
wrapper.setOpaque(false);
114+
wrapper.add(stdCombo);
115+
116+
int versionIdx = -1;
117+
for (int i = 0; i < tabBar.getComponentCount(); i++)
118+
if (tabBar.getComponent(i) == versionLabel) { versionIdx = i; break; }
119+
if (versionIdx >= 0) tabBar.add(wrapper, versionIdx);
120+
else tabBar.add(wrapper);
121+
tabBar.revalidate();
122+
tabBar.repaint();
109123
}
110124

111-
/** Returns the selected C++ standard for use in CppBuild. */
112125
public String getSelectedCppStd() {
113126
if (stdCombo != null) return (String) stdCombo.getSelectedItem();
114127
Preferences prefs = Preferences.userNodeForPackage(CppEditor.class);

0 commit comments

Comments
 (0)