@@ -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