Theme Editor: duplicate lines with Ctrl+Alt+Up or Ctrl+Alt+Down

This commit is contained in:
Karl Tauber
2021-08-07 12:51:00 +02:00
parent 3eeeb9e00b
commit 49913b7dad
2 changed files with 93 additions and 0 deletions

View File

@@ -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() {

View File

@@ -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();
}
}
}