3434import java .awt .Container ;
3535import java .awt .Dimension ;
3636import java .awt .Font ;
37- import java .awt .Graphics2D ;
37+ import java .awt .Toolkit ;
3838import java .awt .event .ActionEvent ;
39+ import java .awt .event .KeyEvent ;
3940import java .awt .event .MouseAdapter ;
4041import java .awt .event .MouseEvent ;
41- import java .awt .image .BufferedImage ;
4242import java .io .BufferedReader ;
4343import java .io .BufferedWriter ;
4444import java .io .File ;
5555import java .util .regex .Pattern ;
5656
5757import javax .swing .Action ;
58- import javax .swing .ImageIcon ;
5958import javax .swing .JMenu ;
6059import javax .swing .JMenuItem ;
6160import javax .swing .JOptionPane ;
8786import org .fife .ui .rsyntaxtextarea .Style ;
8887import org .fife .ui .rsyntaxtextarea .SyntaxScheme ;
8988import org .fife .ui .rsyntaxtextarea .Theme ;
89+ import org .fife .ui .rsyntaxtextarea .parser .TaskTagParser ;
9090import org .fife .ui .rtextarea .Gutter ;
9191import org .fife .ui .rtextarea .GutterIconInfo ;
9292import org .fife .ui .rtextarea .RTextArea ;
9595import org .fife .ui .rtextarea .RTextAreaEditorKit .InvertSelectionCaseAction ;
9696import org .fife .ui .rtextarea .RTextAreaEditorKit .LineMoveAction ;
9797import org .fife .ui .rtextarea .RTextAreaEditorKit .LowerSelectionCaseAction ;
98+ import org .fife .ui .rtextarea .RTextAreaEditorKit .NextBookmarkAction ;
9899import org .fife .ui .rtextarea .RTextAreaEditorKit .TimeDateAction ;
100+ import org .fife .ui .rtextarea .RTextAreaEditorKit .ToggleBookmarkAction ;
99101import org .fife .ui .rtextarea .RTextAreaEditorKit .UpperSelectionCaseAction ;
100102import org .fife .ui .rtextarea .RTextScrollPane ;
101103import org .fife .ui .rtextarea .RecordableTextAction ;
@@ -184,7 +186,8 @@ public void hyperlinkUpdate(final HyperlinkEvent hle) {
184186 }
185187 }
186188 });
187-
189+ // Add support for TODO, FIXME, HACK
190+ addParser (new TaskTagParser ());
188191 // load preferences
189192 loadPreferences ();
190193
@@ -202,6 +205,11 @@ public void hyperlinkUpdate(final HyperlinkEvent hle) {
202205 if (getActionMap ().get (RSyntaxTextAreaEditorKit .rstaCopyAsStyledTextAction ) != null )
203206 getActionMap ().put (RSyntaxTextAreaEditorKit .rstaCopyAsStyledTextAction , new CopyAsStyledTextAction ());
204207
208+ // Fix conflicts with historical shortcuts: override defaults
209+ getActionMap ().put (RTextAreaEditorKit .rtaNextBookmarkAction , new NextBookMarkActionImpl (RTextAreaEditorKit .rtaNextBookmarkAction , true ));
210+ getActionMap ().put (RTextAreaEditorKit .rtaPrevBookmarkAction , new NextBookMarkActionImpl (RTextAreaEditorKit .rtaPrevBookmarkAction , false ));
211+ getActionMap ().put (RTextAreaEditorKit .rtaToggleBookmarkAction , new ToggleBookmarkActionImpl ());
212+
205213 adjustPopupMenu ();
206214
207215 ToolTipManager .sharedInstance ().registerComponent (this );
@@ -300,37 +308,12 @@ public RTextScrollPane wrappedInScrollbars() {
300308 sp .setIconRowHeaderEnabled (true );
301309 gutter = sp .getGutter ();
302310 gutter .setBookmarkingEnabled (true );
303- updateBookmarkIcon ();
304311 gutter .setShowCollapsedRegionToolTips (true );
305312 gutter .setFoldIndicatorEnabled (true );
313+ GutterUtils .updateIcons (gutter );
306314 return sp ;
307315 }
308316
309- protected void updateBookmarkIcon () {
310- // this will clear existing bookmarks, so we'll need restore existing ones
311- final GutterIconInfo [] stash = gutter .getBookmarks ();
312- gutter .setBookmarkIcon (createBookmarkIcon ());
313- try {
314- for (final GutterIconInfo info : stash )
315- gutter .toggleBookmark (info .getMarkedOffset ());
316- } catch (final BadLocationException ignored ) {
317- JOptionPane .showMessageDialog (this , "Some bookmarks may have been lost." , "Lost Bookmarks" ,
318- JOptionPane .WARNING_MESSAGE );
319- }
320- }
321-
322- private ImageIcon createBookmarkIcon () {
323- final int size = gutter .getLineNumberFont ().getSize ();
324- final BufferedImage image = new BufferedImage (size , size , BufferedImage .TYPE_INT_ARGB );
325- final Graphics2D graphics = image .createGraphics ();
326- graphics .setColor (gutter .getLineNumberColor ());
327- graphics .fillRect (0 , 0 , size , size );
328- graphics .setXORMode (getCurrentLineHighlightColor ());
329- graphics .drawRect (0 , 0 , size - 1 , size - 1 );
330- image .flush ();
331- return new ImageIcon (image );
332- }
333-
334317 RecordableTextAction wordMovement (final String id , final int direction , final boolean select ) {
335318 return new RecordableTextAction (id ) {
336319 private static final long serialVersionUID = 1L ;
@@ -690,8 +673,8 @@ protected void setLanguage(final ScriptLanguage language,
690673 }
691674
692675 if ("None" .equals (languageName ) ) {
693- supportStatus = null ; // no need to update console
694- return ;
676+ supportStatus = "Active language: None" ;
677+ return ; // no need to update console any further
695678 }
696679 String supportLevel = "SciJava supported" ;
697680 // try to get language support for current language, may be null.
@@ -829,7 +812,7 @@ public void increaseFontSize(final float factor) {
829812 if (gutter != null ) {
830813 final float lnSize = size * 0.8f ;
831814 gutter .setLineNumberFont (font .deriveFont (lnSize ));
832- updateBookmarkIcon ( );
815+ GutterUtils . updateIcons ( gutter );
833816 }
834817 Component parent = getParent ();
835818 if (parent instanceof JViewport ) {
@@ -1033,7 +1016,7 @@ private void applyTheme(final Theme th) throws IllegalArgumentException {
10331016 final float existingFontSize = getFontSize ();
10341017 th .apply (this );
10351018 setFontSize (existingFontSize );
1036- updateBookmarkIcon (); // update bookmark icon color
1019+ GutterUtils . updateIcons ( gutter );
10371020 }
10381021
10391022 private static Theme getTheme (final String theme ) throws IllegalArgumentException {
@@ -1198,6 +1181,33 @@ public String getMacroID() {
11981181
11991182 }
12001183
1184+ /** solves hot-key conflicts with historical shortcuts */
1185+ static class NextBookMarkActionImpl extends NextBookmarkAction {
1186+ private static final long serialVersionUID = 1L ;
1187+
1188+ public NextBookMarkActionImpl (String name , boolean forward ) {
1189+ super (name , forward );
1190+ final KeyStroke keystroke = KeyStroke .getKeyStroke (KeyEvent .VK_F2 , (forward ) ? 0 : ActionEvent .SHIFT_MASK );
1191+ setAccelerator (keystroke );
1192+ }
1193+
1194+ }
1195+ /** solves hot-key conflicts with historical shortcuts */
1196+ class ToggleBookmarkActionImpl extends ToggleBookmarkAction {
1197+ private static final long serialVersionUID = 1L ;
1198+
1199+ public ToggleBookmarkActionImpl () {
1200+ super ();
1201+ final KeyStroke keystroke = KeyStroke .getKeyStroke (KeyEvent .VK_F2 , Toolkit .getDefaultToolkit ().getMenuShortcutKeyMask ());
1202+ setAccelerator (keystroke );
1203+ }
1204+
1205+ @ Override
1206+ public void actionPerformedImpl (ActionEvent e , RTextArea textArea ) {
1207+ toggleBookmark ();
1208+ }
1209+ }
1210+
12011211 /** Modified from DecreaseIndentAction */
12021212 static class IncreaseIndentAction extends RecordableTextAction {
12031213
0 commit comments