From 49913b7dad88e65bca3a0252f10cf0dd1666a75b Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sat, 7 Aug 2021 12:51:00 +0200 Subject: [PATCH] Theme Editor: duplicate lines with `Ctrl+Alt+Up` or `Ctrl+Alt+Down` --- .../themeeditor/FlatSyntaxTextArea.java | 17 +++++ .../FlatSyntaxTextAreaActions.java | 76 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatSyntaxTextAreaActions.java 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 05f7f8b3..2b1a0ee8 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 @@ -18,13 +18,20 @@ package com.formdev.flatlaf.themeeditor; import java.awt.Color; import java.awt.KeyboardFocusManager; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import javax.swing.ActionMap; +import javax.swing.InputMap; +import javax.swing.KeyStroke; import javax.swing.text.BadLocationException; import org.fife.ui.rsyntaxtextarea.TextEditorPane; import org.fife.ui.rsyntaxtextarea.Token; +import org.fife.ui.rtextarea.RTextArea; import com.formdev.flatlaf.UIDefaultsLoaderAccessor; +import com.formdev.flatlaf.themeeditor.FlatSyntaxTextAreaActions.DuplicateLinesAction; /** * A text area that supports editing FlatLaf themes. @@ -43,6 +50,16 @@ class FlatSyntaxTextArea // remove Ctrl+Tab and Ctrl+Shift+Tab focus traversal keys to allow tabbed pane to process them setFocusTraversalKeys( KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.emptySet() ); setFocusTraversalKeys( KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, Collections.emptySet() ); + + ActionMap actionMap = getActionMap(); + actionMap.put( FlatSyntaxTextAreaActions.duplicateLinesUpAction, new DuplicateLinesAction( FlatSyntaxTextAreaActions.duplicateLinesUpAction, true ) ); + actionMap.put( FlatSyntaxTextAreaActions.duplicateLinesDownAction, new DuplicateLinesAction( FlatSyntaxTextAreaActions.duplicateLinesDownAction, false ) ); + + InputMap inputMap = getInputMap(); + int defaultModifier = RTextArea.getDefaultModifier(); + 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 ); } boolean isUseColorOfColorTokens() { 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 new file mode 100644 index 00000000..308f12e2 --- /dev/null +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatSyntaxTextAreaActions.java @@ -0,0 +1,76 @@ +/* + * Copyright 2021 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.formdev.flatlaf.themeeditor; + +import java.awt.event.ActionEvent; +import javax.swing.text.BadLocationException; +import org.fife.ui.rtextarea.RTextArea; +import org.fife.ui.rtextarea.RecordableTextAction; + +/** + * @author Karl Tauber + */ +class FlatSyntaxTextAreaActions +{ + static final String duplicateLinesUpAction = "FlatLaf.DuplicateLinesUpAction"; + static final String duplicateLinesDownAction = "FlatLaf.DuplicateLinesDownAction"; + + static class DuplicateLinesAction + extends RecordableTextAction + { + private final boolean up; + + public DuplicateLinesAction( String name, boolean up ) { + super( name ); + this.up = up; + } + + @Override + public void actionPerformedImpl( ActionEvent e, RTextArea textArea ) { + try { + int selStartLine = textArea.getLineOfOffset( textArea.getSelectionStart() ); + int selEndLine = textArea.getLineOfOffset( textArea.getSelectionEnd() ); + + int linesStart = textArea.getLineStartOffset( selStartLine ); + int linesEnd = textArea.getLineEndOffset( selEndLine ); + + String linesText = textArea.getText( linesStart, linesEnd - linesStart ); + if( !linesText.endsWith( "\n" ) ) + linesText += "\n"; + + textArea.replaceRange( linesText, linesStart, linesStart ); + + if( up ) + textArea.select( linesStart, linesStart + linesText.length() - 1 ); + else { + int newSelStart = linesStart + linesText.length(); + int newSelEnd = newSelStart + linesText.length(); + if( linesText.endsWith( "\n" ) ) + newSelEnd--; + textArea.select( newSelStart, newSelEnd ); + } + } catch( BadLocationException ex ) { + ex.printStackTrace(); + } + } + + @Override + public String getMacroID() { + return getName(); + } + } +}