From 8c26e0323ffeab41b3cb4d3767b5ad3867b36e56 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 22 Aug 2021 15:33:29 +0200 Subject: [PATCH] Theme Editor: increment/decrement numbers at caret using `Ctrl+UP`/`Ctrl+DOWN` --- .../themeeditor/FlatSyntaxTextArea.java | 5 ++ .../FlatSyntaxTextAreaActions.java | 59 +++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatSyntaxTextArea.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatSyntaxTextArea.java index ef9cf0f5..3fc8de9f 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatSyntaxTextArea.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatSyntaxTextArea.java @@ -34,6 +34,7 @@ import org.fife.ui.rtextarea.RTextArea; import org.fife.ui.rtextarea.RTextAreaUI; import com.formdev.flatlaf.UIDefaultsLoaderAccessor; import com.formdev.flatlaf.themeeditor.FlatSyntaxTextAreaActions.DuplicateLinesAction; +import com.formdev.flatlaf.themeeditor.FlatSyntaxTextAreaActions.IncrementNumberAction; /** * A text area that supports editing FlatLaf themes. @@ -60,6 +61,8 @@ class FlatSyntaxTextArea ActionMap actionMap = getActionMap(); actionMap.put( FlatSyntaxTextAreaActions.duplicateLinesUpAction, new DuplicateLinesAction( FlatSyntaxTextAreaActions.duplicateLinesUpAction, true ) ); actionMap.put( FlatSyntaxTextAreaActions.duplicateLinesDownAction, new DuplicateLinesAction( FlatSyntaxTextAreaActions.duplicateLinesDownAction, false ) ); + actionMap.put( FlatSyntaxTextAreaActions.incrementNumberAction, new IncrementNumberAction( FlatSyntaxTextAreaActions.incrementNumberAction, true ) ); + actionMap.put( FlatSyntaxTextAreaActions.decrementNumberAction, new IncrementNumberAction( FlatSyntaxTextAreaActions.decrementNumberAction, false ) ); // add editor key strokes InputMap inputMap = getInputMap(); @@ -67,6 +70,8 @@ class FlatSyntaxTextArea int alt = InputEvent.ALT_DOWN_MASK; inputMap.put( KeyStroke.getKeyStroke( KeyEvent.VK_UP, defaultModifier|alt), FlatSyntaxTextAreaActions.duplicateLinesUpAction ); inputMap.put( KeyStroke.getKeyStroke( KeyEvent.VK_DOWN, defaultModifier|alt), FlatSyntaxTextAreaActions.duplicateLinesDownAction ); + inputMap.put( KeyStroke.getKeyStroke( KeyEvent.VK_UP, defaultModifier), FlatSyntaxTextAreaActions.incrementNumberAction ); + inputMap.put( KeyStroke.getKeyStroke( KeyEvent.VK_DOWN, defaultModifier), FlatSyntaxTextAreaActions.decrementNumberAction ); } @Override diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatSyntaxTextAreaActions.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatSyntaxTextAreaActions.java index 308f12e2..60d76f90 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatSyntaxTextAreaActions.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatSyntaxTextAreaActions.java @@ -28,6 +28,10 @@ class FlatSyntaxTextAreaActions { static final String duplicateLinesUpAction = "FlatLaf.DuplicateLinesUpAction"; static final String duplicateLinesDownAction = "FlatLaf.DuplicateLinesDownAction"; + static final String incrementNumberAction = "FlatLaf.IncrementNumberAction"; + static final String decrementNumberAction = "FlatLaf.DecrementNumberAction"; + + //---- class DuplicateLinesAction ----------------------------------------- static class DuplicateLinesAction extends RecordableTextAction @@ -73,4 +77,59 @@ class FlatSyntaxTextAreaActions return getName(); } } + + //---- class IncrementNumberAction ---------------------------------------- + + static class IncrementNumberAction + extends RecordableTextAction + { + private final boolean increment; + + IncrementNumberAction( String name, boolean increment ) { + super( name ); + this.increment = increment; + } + + @Override + public void actionPerformedImpl( ActionEvent e, RTextArea textArea ) { + try { + int caretPosition = textArea.getCaretPosition(); + int start = caretPosition; + int end = caretPosition; + for( int i = caretPosition - 1; i >= 0; i-- ) { + if( !Character.isDigit( textArea.getText( i, 1 ).charAt( 0 ) ) ) + break; + start = i; + } + int length = textArea.getDocument().getLength(); + for( int i = caretPosition; i < length; i++ ) { + if( !Character.isDigit( textArea.getText( i, 1 ).charAt( 0 ) ) ) + break; + end = i + 1; + } + + if( start == end ) + return; + + String str = textArea.getText( start, end - start ); + long number = Long.parseLong( str ); + if( increment ) + number++; + else + number--; + + if( number < 0 ) + return; + + textArea.replaceRange( Long.toString( number ), start, end ); + } catch( BadLocationException | IndexOutOfBoundsException | NumberFormatException ex ) { + ex.printStackTrace(); + } + } + + @Override + public String getMacroID() { + return getName(); + } + } }