5555import java .util .regex .Pattern ;
5656
5757import javax .swing .Action ;
58+ import javax .swing .ButtonGroup ;
5859import javax .swing .JMenu ;
5960import javax .swing .JMenuItem ;
6061import javax .swing .JOptionPane ;
6162import javax .swing .JPopupMenu ;
63+ import javax .swing .JRadioButtonMenuItem ;
6264import javax .swing .JScrollPane ;
6365import javax .swing .JViewport ;
6466import javax .swing .KeyStroke ;
67+ import javax .swing .SwingUtilities ;
6568import javax .swing .ToolTipManager ;
6669import javax .swing .UIManager ;
6770import javax .swing .event .DocumentEvent ;
@@ -137,6 +140,7 @@ public class EditorPane extends RSyntaxTextArea implements DocumentListener {
137140 private boolean autoCompletionWithoutKey ;
138141 private String supportStatus ;
139142 private final ErrorParser errorHighlighter ;
143+ private final JMenu noneLangSyntaxMenu ;
140144
141145
142146 @ Parameter
@@ -210,6 +214,7 @@ public void hyperlinkUpdate(final HyperlinkEvent hle) {
210214 getActionMap ().put (RTextAreaEditorKit .rtaPrevBookmarkAction , new NextBookMarkActionImpl (RTextAreaEditorKit .rtaPrevBookmarkAction , false ));
211215 getActionMap ().put (RTextAreaEditorKit .rtaToggleBookmarkAction , new ToggleBookmarkActionImpl ());
212216
217+ noneLangSyntaxMenu = geSyntaxForNoneLang ();
213218 adjustPopupMenu ();
214219
215220 ToolTipManager .sharedInstance ().registerComponent (this );
@@ -274,6 +279,8 @@ private void adjustPopupMenu() {
274279 popup .add (menu );
275280 menu .add (getMenuItem ("Open URL Under Cursor" , new OpenLinkUnderCursor ()));
276281 menu .add (getMenuItem ("Search the Web for Selected Text" , new SearchWebOnSelectedText ()));
282+ popup .addSeparator ();
283+ popup .add (noneLangSyntaxMenu );
277284 }
278285
279286 private JMenuItem getMenuItem (final String label , final RecordableTextAction a ) {
@@ -285,6 +292,36 @@ private JMenuItem getMenuItem(final String label, final RecordableTextAction a)
285292 return item ;
286293 }
287294
295+ private JMenu geSyntaxForNoneLang () {
296+ final JMenu menu = new JMenu ("Non-executable Syntax" );
297+ menu .setToolTipText ("Markup languages when scripting language is none" );
298+ final ButtonGroup bg = new ButtonGroup ();
299+ menu .add (getSyntaxItem (bg , "None" , SYNTAX_STYLE_NONE ));
300+ bg .getElements ().nextElement ().setSelected (true ); //select none
301+ menu .addSeparator ();
302+ menu .add (getSyntaxItem (bg , "CSS" , SYNTAX_STYLE_CSS ));
303+ menu .add (getSyntaxItem (bg , "HTML" , SYNTAX_STYLE_HTML ));
304+ menu .add (getSyntaxItem (bg , "JSON" , SYNTAX_STYLE_JSON ));
305+ //menu.add(getSyntaxItem(bg, "sh", SYNTAX_STYLE_UNIX_SHELL));
306+ menu .add (getSyntaxItem (bg , "XML" , SYNTAX_STYLE_XML ));
307+ return menu ;
308+ }
309+
310+ private JMenuItem getSyntaxItem (final ButtonGroup bg , final String label , final String syntaxId ) {
311+ final JRadioButtonMenuItem item = new JRadioButtonMenuItem (label );
312+ bg .add (item );
313+ item .addActionListener (e -> {
314+ if (getCurrentLanguage () == null ) {
315+ setSyntaxEditingStyle (syntaxId );
316+ } else {
317+ log .error ("[BUG] Unknown state: Non-executable syntaxes cannot be applied to valid languages" );
318+ bg .getElements ().nextElement ().setSelected (true ); //select none
319+ setSyntaxEditingStyle (SYNTAX_STYLE_NONE );
320+ }
321+ });
322+ return item ;
323+ }
324+
288325 @ Override
289326 public void setTabSize (final int width ) {
290327 if (getTabSize () != width ) super .setTabSize (width );
@@ -672,6 +709,7 @@ protected void setLanguage(final ScriptLanguage language,
672709 setText (header += getText ());
673710 }
674711
712+ noneLangSyntaxMenu .setEnabled (language == null );
675713 if ("None" .equals (languageName ) ) {
676714 supportStatus = "Active language: None" ;
677715 return ; // no need to update console any further
0 commit comments