All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.syntax.jedit.InputHandler Maven / Gradle / Ivy

The newest version!
/*
 *  soapUI, copyright (C) 2004-2011 smartbear.com 
 *
 *  soapUI is free software; you can redistribute it and/or modify it under the 
 *  terms of version 2.1 of the GNU Lesser General Public License as published by 
 *  the Free Software Foundation.
 *
 *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
 *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 *  See the GNU Lesser General Public License for more details at gnu.org.
 */

package org.syntax.jedit;

import java.awt.Component;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Enumeration;
import java.util.EventObject;
import java.util.Hashtable;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JPopupMenu;
import javax.swing.text.BadLocationException;

import com.eviware.soapui.SoapUI;
import com.eviware.soapui.support.UISupport;

/**
 * An input handler converts the user's key strokes into concrete actions. It
 * also takes care of macro recording and action repetition.
 * 

* * This class provides all the necessary support code for an input handler, but * doesn't actually do any key binding logic. It is up to the implementations of * this class to do so. * * @author Slava Pestov * @version $Id$ * @see org.syntax.jedit.DefaultInputHandler 08/12/2002 Clipboard actions * (Oliver Henning) */ public abstract class InputHandler extends KeyAdapter { private static boolean useCtrlKeyInsteadOfMenuKey = false; public static void useCtrlKeyInsteadOfMenuKey( boolean b ) { useCtrlKeyInsteadOfMenuKey = b; } public static int getMenuShortcutKeyMask() { if( useCtrlKeyInsteadOfMenuKey ) return InputEvent.CTRL_MASK; else return Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); } /** * If this client property is set to Boolean.TRUE on the text area, the * home/end keys will support 'smart' BRIEF-like behaviour (one press = * start/end of line, two presses = start/end of viewscreen, three presses = * start/end of document). By default, this property is not set. */ public static final String SMART_HOME_END_PROPERTY = "InputHandler.homeEnd"; public static final ActionListener BACKSPACE = new backspace(); public static final ActionListener BACKSPACE_WORD = new backspace_word(); public static final ActionListener DELETE = new delete(); public static final ActionListener DELETE_WORD = new delete_word(); public static final ActionListener END = new end( false ); public static final ActionListener DOCUMENT_END = new document_end( false ); public static final ActionListener SELECT_ALL = new select_all(); public static final ActionListener SELECT_END = new end( true ); public static final ActionListener SELECT_DOC_END = new document_end( true ); public static final ActionListener INSERT_BREAK = new insert_break(); public static final ActionListener INSERT_TAB = new insert_tab(); public static final ActionListener HOME = new home( false ); public static final ActionListener DOCUMENT_HOME = new document_home( false ); public static final ActionListener SELECT_HOME = new home( true ); public static final ActionListener SELECT_DOC_HOME = new document_home( true ); public static final ActionListener NEXT_CHAR = new next_char( false ); public static final ActionListener NEXT_LINE = new next_line( false ); public static final ActionListener NEXT_PAGE = new next_page( false ); public static final ActionListener NEXT_WORD = new next_word( false ); public static final ActionListener SELECT_NEXT_CHAR = new next_char( true ); public static final ActionListener SELECT_NEXT_LINE = new next_line( true ); public static final ActionListener SELECT_NEXT_PAGE = new next_page( true ); public static final ActionListener SELECT_NEXT_WORD = new next_word( true ); public static final ActionListener OVERWRITE = new overwrite(); public static final ActionListener PREV_CHAR = new prev_char( false ); public static final ActionListener PREV_LINE = new prev_line( false ); public static final ActionListener PREV_PAGE = new prev_page( false ); public static final ActionListener PREV_WORD = new prev_word( false ); public static final ActionListener SELECT_PREV_CHAR = new prev_char( true ); public static final ActionListener SELECT_PREV_LINE = new prev_line( true ); public static final ActionListener SELECT_PREV_PAGE = new prev_page( true ); public static final ActionListener SELECT_PREV_WORD = new prev_word( true ); public static final ActionListener REPEAT = new repeat(); public static final ActionListener TOGGLE_RECT = new toggle_rect(); // Clipboard public static final Action CLIP_COPY = new clip_copy(); public static final Action CLIP_PASTE = new clip_paste(); public static final Action CLIP_CUT = new clip_cut(); // Default action public static final ActionListener INSERT_CHAR = new insert_char(); private static Hashtable actions; static { actions = new Hashtable(); actions.put( "backspace", BACKSPACE ); actions.put( "backspace-word", BACKSPACE_WORD ); actions.put( "delete", DELETE ); actions.put( "delete-word", DELETE_WORD ); actions.put( "end", END ); actions.put( "select-all", SELECT_ALL ); actions.put( "select-end", SELECT_END ); actions.put( "document-end", DOCUMENT_END ); actions.put( "select-doc-end", SELECT_DOC_END ); actions.put( "insert-break", INSERT_BREAK ); actions.put( "insert-tab", INSERT_TAB ); actions.put( "home", HOME ); actions.put( "select-home", SELECT_HOME ); actions.put( "document-home", DOCUMENT_HOME ); actions.put( "select-doc-home", SELECT_DOC_HOME ); actions.put( "next-char", NEXT_CHAR ); actions.put( "next-line", NEXT_LINE ); actions.put( "next-page", NEXT_PAGE ); actions.put( "next-word", NEXT_WORD ); actions.put( "select-next-char", SELECT_NEXT_CHAR ); actions.put( "select-next-line", SELECT_NEXT_LINE ); actions.put( "select-next-page", SELECT_NEXT_PAGE ); actions.put( "select-next-word", SELECT_NEXT_WORD ); actions.put( "overwrite", OVERWRITE ); actions.put( "prev-char", PREV_CHAR ); actions.put( "prev-line", PREV_LINE ); actions.put( "prev-page", PREV_PAGE ); actions.put( "prev-word", PREV_WORD ); actions.put( "select-prev-char", SELECT_PREV_CHAR ); actions.put( "select-prev-line", SELECT_PREV_LINE ); actions.put( "select-prev-page", SELECT_PREV_PAGE ); actions.put( "select-prev-word", SELECT_PREV_WORD ); actions.put( "repeat", REPEAT ); actions.put( "toggle-rect", TOGGLE_RECT ); actions.put( "insert-char", INSERT_CHAR ); actions.put( "clipboard-copy", CLIP_COPY ); actions.put( "clipboard-paste", CLIP_PASTE ); actions.put( "clipboard-cut", CLIP_CUT ); } /** * Returns a named text area action. * * @param name * The action name */ public static ActionListener getAction( String name ) { return actions.get( name ); } /** * Returns the name of the specified text area action. * * @param listener * The action */ public static String getActionName( ActionListener listener ) { Enumeration _enum = getActions(); while( _enum.hasMoreElements() ) { String name = ( String )_enum.nextElement(); ActionListener _listener = getAction( name ); if( _listener == listener ) return name; } return null; } /** * Returns an enumeration of all available actions. */ public static Enumeration getActions() { return actions.keys(); } /** * Adds the default key bindings to this input handler. This should not be * called in the constructor of this input handler, because applications * might load the key bindings from a file, etc. */ public abstract void addDefaultKeyBindings(); /** * Adds a key binding to this input handler. * * @param keyBinding * The key binding (the format of this is input-handler specific) * @param action * The action */ public abstract void addKeyBinding( String keyBinding, ActionListener action ); /** * Removes a key binding from this input handler. * * @param keyBinding * The key binding */ public abstract void removeKeyBinding( String keyBinding ); /** * Removes all key bindings from this input handler. */ public abstract void removeAllKeyBindings(); /** * Grabs the next key typed event and invokes the specified action with the * key as a the action command. * * @param action * The action */ public void grabNextKeyStroke( ActionListener listener ) { grabAction = listener; } /** * Returns if repeating is enabled. When repeating is enabled, actions will * be executed multiple times. This is usually invoked with a special key * stroke in the input handler. */ public boolean isRepeatEnabled() { return repeat; } /** * Enables repeating. When repeating is enabled, actions will be executed * multiple times. Once repeating is enabled, the input handler should read a * number from the keyboard. */ public void setRepeatEnabled( boolean repeat ) { this.repeat = repeat; } /** * Returns the number of times the next action will be repeated. */ public int getRepeatCount() { return( repeat ? Math.max( 1, repeatCount ) : 1 ); } /** * Sets the number of times the next action will be repeated. * * @param repeatCount * The repeat count */ public void setRepeatCount( int repeatCount ) { this.repeatCount = repeatCount; } /** * Returns the macro recorder. If this is non-null, all executed actions * should be forwarded to the recorder. */ public InputHandler.MacroRecorder getMacroRecorder() { return recorder; } /** * Sets the macro recorder. If this is non-null, all executed actions should * be forwarded to the recorder. * * @param recorder * The macro recorder */ public void setMacroRecorder( InputHandler.MacroRecorder recorder ) { this.recorder = recorder; } /** * Returns a copy of this input handler that shares the same key bindings. * Setting key bindings in the copy will also set them in the original. */ public abstract InputHandler copy(); /** * Executes the specified action, repeating and recording it as necessary. * * @param listener * The action listener * @param source * The event source * @param actionCommand * The action command */ public void executeAction( ActionListener listener, Object source, String actionCommand ) { // create event ActionEvent evt = new ActionEvent( source, ActionEvent.ACTION_PERFORMED, actionCommand ); // don't do anything if the action is a wrapper // (like EditAction.Wrapper) if( listener instanceof Wrapper ) { listener.actionPerformed( evt ); return; } // remember old values, in case action changes them boolean _repeat = repeat; int _repeatCount = getRepeatCount(); // execute the action if( listener instanceof InputHandler.NonRepeatable ) listener.actionPerformed( evt ); else { for( int i = 0; i < Math.max( 1, repeatCount ); i++ ) listener.actionPerformed( evt ); } // do recording. Notice that we do no recording whatsoever // for actions that grab keys if( grabAction == null ) { if( recorder != null ) { if( !( listener instanceof InputHandler.NonRecordable ) ) { if( _repeatCount != 1 ) recorder.actionPerformed( REPEAT, String.valueOf( _repeatCount ) ); recorder.actionPerformed( listener, actionCommand ); } } // If repeat was true originally, clear it // Otherwise it might have been set by the action, etc if( _repeat ) { repeat = false; repeatCount = 0; } } } /** * Returns the text area that fired the specified event. * * @param evt * The event */ public static JEditTextArea getTextArea( EventObject evt ) { if( evt != null ) { Object o = evt.getSource(); if( o instanceof Component ) { // find the parent text area Component c = ( Component )o; for( ;; ) { if( c instanceof JEditTextArea ) return ( JEditTextArea )c; else if( c == null ) break; if( c instanceof JPopupMenu ) c = ( ( JPopupMenu )c ).getInvoker(); else c = c.getParent(); } } } // this shouldn't happen System.err.println( "BUG: getTextArea() returning null" ); System.err.println( "Report this to Slava Pestov " ); return null; } // protected members /** * If a key is being grabbed, this method should be called with the * appropriate key event. It executes the grab action with the typed * character as the parameter. */ protected void handleGrabAction( KeyEvent evt ) { // Clear it *before* it is executed so that executeAction() // resets the repeat count ActionListener _grabAction = grabAction; grabAction = null; executeAction( _grabAction, evt.getSource(), String.valueOf( evt.getKeyChar() ) ); } // protected members protected ActionListener grabAction; protected boolean repeat; protected int repeatCount; protected InputHandler.MacroRecorder recorder; /** * If an action implements this interface, it should not be repeated. * Instead, it will handle the repetition itself. */ public interface NonRepeatable { } /** * If an action implements this interface, it should not be recorded by the * macro recorder. Instead, it will do its own recording. */ public interface NonRecordable { } /** * For use by EditAction.Wrapper only. * * @since jEdit 2.2final */ public interface Wrapper { } /** * Macro recorder. */ public interface MacroRecorder { void actionPerformed( ActionListener listener, String actionCommand ); } public static class backspace implements ActionListener { public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); if( !textArea.isEditable() ) { textArea.getToolkit().beep(); return; } if( textArea.getSelectionStart() != textArea.getSelectionEnd() ) { textArea.setSelectedText( "" ); } else { int caret = textArea.getCaretPosition(); if( caret == 0 ) { textArea.getToolkit().beep(); return; } try { textArea.getDocument().remove( caret - 1, 1 ); } catch( BadLocationException bl ) { SoapUI.logError( bl ); } } } } public static class backspace_word implements ActionListener { public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); int start = textArea.getSelectionStart(); if( start != textArea.getSelectionEnd() ) { textArea.setSelectedText( "" ); } int line = textArea.getCaretLine(); int lineStart = textArea.getLineStartOffset( line ); int caret = start - lineStart; String lineText = textArea.getLineText( textArea.getCaretLine() ); if( caret == 0 ) { if( lineStart == 0 ) { textArea.getToolkit().beep(); return; } caret-- ; } else { String noWordSep = ( String )textArea.getDocument().getProperty( "noWordSep" ); caret = TextUtilities.findWordStart( lineText, caret, noWordSep ); } try { textArea.getDocument().remove( caret + lineStart, start - ( caret + lineStart ) ); } catch( BadLocationException bl ) { SoapUI.logError( bl ); } } } public static class delete implements ActionListener { public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); if( !textArea.isEditable() ) { textArea.getToolkit().beep(); return; } if( textArea.getSelectionStart() != textArea.getSelectionEnd() ) { textArea.setSelectedText( "" ); } else { int caret = textArea.getCaretPosition(); if( caret == textArea.getDocumentLength() ) { textArea.getToolkit().beep(); return; } try { textArea.getDocument().remove( caret, 1 ); } catch( BadLocationException bl ) { SoapUI.logError( bl ); } } } } public static class delete_word implements ActionListener { public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); int start = textArea.getSelectionStart(); if( start != textArea.getSelectionEnd() ) { textArea.setSelectedText( "" ); } int line = textArea.getCaretLine(); int lineStart = textArea.getLineStartOffset( line ); int caret = start - lineStart; String lineText = textArea.getLineText( textArea.getCaretLine() ); if( caret == lineText.length() ) { if( lineStart + caret == textArea.getDocumentLength() ) { textArea.getToolkit().beep(); return; } caret++ ; } else { String noWordSep = ( String )textArea.getDocument().getProperty( "noWordSep" ); caret = TextUtilities.findWordEnd( lineText, caret, noWordSep ); } try { textArea.getDocument().remove( start, ( caret + lineStart ) - start ); } catch( BadLocationException bl ) { SoapUI.logError( bl ); } } } public static class end implements ActionListener { private boolean select; public end( boolean select ) { this.select = select; } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); int caret = textArea.getCaretPosition(); int lastOfLine = textArea.getLineEndOffset( textArea.getCaretLine() ) - 1; int lastVisibleLine = textArea.getFirstLine() + textArea.getVisibleLines(); if( lastVisibleLine >= textArea.getLineCount() ) { lastVisibleLine = Math.min( textArea.getLineCount() - 1, lastVisibleLine ); } else lastVisibleLine -= 1; // (textArea.getElectricScroll() + 1); int lastVisible = textArea.getLineEndOffset( lastVisibleLine ) - 1; int lastDocument = textArea.getDocumentLength(); if( caret == lastDocument ) { textArea.getToolkit().beep(); return; } else if( !Boolean.TRUE.equals( textArea.getClientProperty( SMART_HOME_END_PROPERTY ) ) ) caret = lastOfLine; else if( caret == lastVisible ) caret = lastDocument; else if( caret == lastOfLine ) caret = lastVisible; else caret = lastOfLine; if( select ) textArea.select( textArea.getMarkPosition(), caret ); else textArea.setCaretPosition( caret ); } } public static class select_all implements ActionListener { public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); textArea.selectAll(); } } public static class document_end implements ActionListener { private boolean select; public document_end( boolean select ) { this.select = select; } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); if( select ) textArea.select( textArea.getMarkPosition(), textArea.getDocumentLength() ); else textArea.setCaretPosition( textArea.getDocumentLength() ); } } public static class home implements ActionListener { private boolean select; public home( boolean select ) { this.select = select; } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); int caret = textArea.getCaretPosition(); int firstLine = textArea.getFirstLine(); int firstOfLine = textArea.getLineStartOffset( textArea.getCaretLine() ); int firstVisibleLine = ( firstLine == 0 ? 0 : firstLine + 1 ); int firstVisible = textArea.getLineStartOffset( firstVisibleLine ); if( caret == 0 ) { textArea.getToolkit().beep(); return; } else if( !Boolean.TRUE.equals( textArea.getClientProperty( SMART_HOME_END_PROPERTY ) ) ) caret = firstOfLine; else if( caret == firstVisible ) caret = 0; else if( caret == firstOfLine ) caret = firstVisible; else caret = firstOfLine; if( select ) textArea.select( textArea.getMarkPosition(), caret ); else textArea.setCaretPosition( caret ); } } public static class document_home implements ActionListener { private boolean select; public document_home( boolean select ) { this.select = select; } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); if( select ) textArea.select( textArea.getMarkPosition(), 0 ); else textArea.setCaretPosition( 0 ); } } public static class insert_break implements ActionListener { public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); if( !textArea.isEditable() ) { textArea.getToolkit().beep(); return; } textArea.setSelectedText( "\n" ); } } public static class insert_tab implements ActionListener { public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); if( !textArea.isEditable() ) { textArea.getToolkit().beep(); return; } textArea.overwriteSetSelectedText( "\t" ); } } public static class next_char implements ActionListener { private boolean select; public next_char( boolean select ) { this.select = select; } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); int caret = textArea.getCaretPosition(); if( caret == textArea.getDocumentLength() ) { textArea.getToolkit().beep(); return; } if( select ) textArea.select( textArea.getMarkPosition(), caret + 1 ); else textArea.setCaretPosition( caret + 1 ); } } public static class next_line implements ActionListener { private boolean select; public next_line( boolean select ) { this.select = select; } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); int caret = textArea.getCaretPosition(); int line = textArea.getCaretLine(); if( line == textArea.getLineCount() - 1 ) { textArea.getToolkit().beep(); return; } int magic = textArea.getMagicCaretPosition(); if( magic == -1 ) { magic = textArea.offsetToX( line, caret - textArea.getLineStartOffset( line ) ); } caret = textArea.getLineStartOffset( line + 1 ) + textArea.xToOffset( line + 1, magic ); if( select ) textArea.select( textArea.getMarkPosition(), caret ); else textArea.setCaretPosition( caret ); textArea.setMagicCaretPosition( magic ); } } public static class next_page implements ActionListener { private boolean select; public next_page( boolean select ) { this.select = select; } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); int lineCount = textArea.getLineCount(); int firstLine = textArea.getFirstLine(); int visibleLines = textArea.getVisibleLines(); int line = textArea.getCaretLine(); firstLine += visibleLines; if( firstLine + visibleLines >= lineCount - 1 ) firstLine = lineCount - visibleLines; textArea.setFirstLine( firstLine ); int caret = textArea.getLineStartOffset( Math.min( textArea.getLineCount() - 1, line + visibleLines ) ); if( select ) textArea.select( textArea.getMarkPosition(), caret ); else textArea.setCaretPosition( caret ); } } public static class next_word implements ActionListener { private boolean select; public next_word( boolean select ) { this.select = select; } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); int caret = textArea.getCaretPosition(); int line = textArea.getCaretLine(); int lineStart = textArea.getLineStartOffset( line ); caret -= lineStart; String lineText = textArea.getLineText( textArea.getCaretLine() ); if( caret == lineText.length() ) { if( lineStart + caret == textArea.getDocumentLength() ) { textArea.getToolkit().beep(); return; } caret++ ; } else { String noWordSep = ( String )textArea.getDocument().getProperty( "noWordSep" ); caret = TextUtilities.findWordEnd( lineText, caret, noWordSep ); } if( select ) textArea.select( textArea.getMarkPosition(), lineStart + caret ); else textArea.setCaretPosition( lineStart + caret ); } } public static class overwrite implements ActionListener { public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); textArea.setOverwriteEnabled( !textArea.isOverwriteEnabled() ); } } public static class prev_char implements ActionListener { private boolean select; public prev_char( boolean select ) { this.select = select; } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); int caret = textArea.getCaretPosition(); if( caret == 0 ) { textArea.getToolkit().beep(); return; } if( select ) textArea.select( textArea.getMarkPosition(), caret - 1 ); else textArea.setCaretPosition( caret - 1 ); } } public static class prev_line implements ActionListener { private boolean select; public prev_line( boolean select ) { this.select = select; } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); int caret = textArea.getCaretPosition(); int line = textArea.getCaretLine(); if( line == 0 ) { textArea.getToolkit().beep(); return; } int magic = textArea.getMagicCaretPosition(); if( magic == -1 ) { magic = textArea.offsetToX( line, caret - textArea.getLineStartOffset( line ) ); } caret = textArea.getLineStartOffset( line - 1 ) + textArea.xToOffset( line - 1, magic ); if( select ) textArea.select( textArea.getMarkPosition(), caret ); else textArea.setCaretPosition( caret ); textArea.setMagicCaretPosition( magic ); } } public static class prev_page implements ActionListener { private boolean select; public prev_page( boolean select ) { this.select = select; } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); int firstLine = textArea.getFirstLine(); int visibleLines = textArea.getVisibleLines(); int line = textArea.getCaretLine(); if( firstLine < visibleLines ) firstLine = visibleLines; textArea.setFirstLine( firstLine - visibleLines ); int caret = textArea.getLineStartOffset( Math.max( 0, line - visibleLines ) ); if( select ) textArea.select( textArea.getMarkPosition(), caret ); else textArea.setCaretPosition( caret ); } } public static class prev_word implements ActionListener { private boolean select; public prev_word( boolean select ) { this.select = select; } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); int caret = textArea.getCaretPosition(); int line = textArea.getCaretLine(); int lineStart = textArea.getLineStartOffset( line ); caret -= lineStart; String lineText = textArea.getLineText( textArea.getCaretLine() ); if( caret == 0 ) { if( lineStart == 0 ) { textArea.getToolkit().beep(); return; } caret-- ; } else { String noWordSep = ( String )textArea.getDocument().getProperty( "noWordSep" ); caret = TextUtilities.findWordStart( lineText, caret, noWordSep ); } if( select ) textArea.select( textArea.getMarkPosition(), lineStart + caret ); else textArea.setCaretPosition( lineStart + caret ); } } public static class repeat implements ActionListener, InputHandler.NonRecordable { public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); textArea.getInputHandler().setRepeatEnabled( true ); String actionCommand = evt.getActionCommand(); if( actionCommand != null ) { textArea.getInputHandler().setRepeatCount( Integer.parseInt( actionCommand ) ); } } } public static class toggle_rect implements ActionListener { public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); textArea.setSelectionRectangular( !textArea.isSelectionRectangular() ); } } public static class insert_char implements ActionListener, InputHandler.NonRepeatable { public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); String str = evt.getActionCommand(); int repeatCount = textArea.getInputHandler().getRepeatCount(); if( textArea.isEditable() ) { StringBuffer buf = new StringBuffer(); for( int i = 0; i < repeatCount; i++ ) buf.append( str ); textArea.overwriteSetSelectedText( buf.toString() ); } else { textArea.getToolkit().beep(); } } } public static class clip_copy extends AbstractAction { public clip_copy() { super( "Copy" ); putValue( Action.ACCELERATOR_KEY, UISupport.getKeyStroke( "menu C" ) ); } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); textArea.copy(); } } public static class clip_paste extends AbstractAction { public clip_paste() { super( "Paste" ); putValue( Action.ACCELERATOR_KEY, UISupport.getKeyStroke( "menu V" ) ); } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); textArea.paste(); } } public static class clip_cut extends AbstractAction { public clip_cut() { super( "Cut" ); putValue( Action.ACCELERATOR_KEY, UISupport.getKeyStroke( "menu X" ) ); } public void actionPerformed( ActionEvent evt ) { JEditTextArea textArea = getTextArea( evt ); textArea.cut(); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy