previous/next word functionality, ctrl+left/right, shift+ctrl+left/right.
This commit is contained in:
parent
3cad3f1ec8
commit
de3e9a1dd0
1 changed files with 142 additions and 0 deletions
|
@ -20,6 +20,13 @@ package org.thdl.tib.text;
|
||||||
|
|
||||||
import javax.swing.text.ViewFactory;
|
import javax.swing.text.ViewFactory;
|
||||||
import javax.swing.text.rtf.RTFEditorKit;
|
import javax.swing.text.rtf.RTFEditorKit;
|
||||||
|
import javax.swing.text.DefaultEditorKit ;
|
||||||
|
import javax.swing.Action ;
|
||||||
|
import javax.swing.text.TextAction ;
|
||||||
|
import javax.swing.text.JTextComponent ;
|
||||||
|
import javax.swing.text.BadLocationException ;
|
||||||
|
import java.awt.event.ActionEvent ;
|
||||||
|
import org.thdl.tib.text.TibetanMachineWeb ;
|
||||||
|
|
||||||
/** An EditorKit that is cognizant of the line-wrapping rules for
|
/** An EditorKit that is cognizant of the line-wrapping rules for
|
||||||
* Tibetan text. That is, this class knows about the tsheg and other
|
* Tibetan text. That is, this class knows about the tsheg and other
|
||||||
|
@ -42,4 +49,139 @@ public class TibetanRTFEditorKit extends RTFEditorKit {
|
||||||
}
|
}
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TmwNextWordAction extends TextAction
|
||||||
|
{
|
||||||
|
boolean selecting = false ;
|
||||||
|
|
||||||
|
public TmwNextWordAction ( String actionName, boolean select )
|
||||||
|
{
|
||||||
|
super ( actionName ) ;
|
||||||
|
selecting = select ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void actionPerformed ( ActionEvent e )
|
||||||
|
{
|
||||||
|
JTextComponent target = getTextComponent ( e ) ;
|
||||||
|
int offset = target.getCaretPosition () ;
|
||||||
|
offset = findNextBreakable ( target, offset ) ;
|
||||||
|
if ( -1 != offset )
|
||||||
|
{
|
||||||
|
if ( !selecting )
|
||||||
|
target.setCaretPosition ( offset + 1 ) ;
|
||||||
|
else
|
||||||
|
target.moveCaretPosition ( offset + 1 ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TmwPrevWordAction extends TextAction
|
||||||
|
{
|
||||||
|
boolean selecting = false ;
|
||||||
|
|
||||||
|
public TmwPrevWordAction ( String actionName, boolean select )
|
||||||
|
{
|
||||||
|
super ( actionName ) ;
|
||||||
|
selecting = select ;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void actionPerformed ( ActionEvent e )
|
||||||
|
{
|
||||||
|
JTextComponent target = getTextComponent ( e ) ;
|
||||||
|
int offset = target.getCaretPosition () ;
|
||||||
|
offset = findPrevBreakable ( target, offset ) ;
|
||||||
|
if ( -1 != offset )
|
||||||
|
{
|
||||||
|
if ( !selecting )
|
||||||
|
target.setCaretPosition ( offset ) ;
|
||||||
|
else
|
||||||
|
target.moveCaretPosition ( offset ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action [] getActions ()
|
||||||
|
{
|
||||||
|
Action [] actions = super.getActions () ;
|
||||||
|
|
||||||
|
for ( int i = 0; i < actions.length; i++ )
|
||||||
|
{
|
||||||
|
String actionName = (String)actions [i].getValue ( Action.NAME ) ;
|
||||||
|
boolean select = false ;
|
||||||
|
|
||||||
|
if ( actionName.equals ( DefaultEditorKit.nextWordAction ) ||
|
||||||
|
( select = actionName.equals ( DefaultEditorKit.selectionNextWordAction ) ) )
|
||||||
|
{
|
||||||
|
actions [i] = new TmwNextWordAction ( actionName, select ) ;
|
||||||
|
}
|
||||||
|
else if ( actionName.equals ( DefaultEditorKit.previousWordAction ) ||
|
||||||
|
( select = actionName.equals ( DefaultEditorKit.selectionPreviousWordAction ) ) )
|
||||||
|
{
|
||||||
|
actions [i] = new TmwPrevWordAction ( actionName, select ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return actions ;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int findNextBreakable ( JTextComponent target, int offset )
|
||||||
|
{
|
||||||
|
int lastOffset = target.getDocument ().getLength () - 1 ;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
char curChar ;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
curChar = target.getText ( offset++, 1 ).charAt ( 0 ) ;
|
||||||
|
}
|
||||||
|
while ( TibetanMachineWeb.isTMWFontCharBreakable ( curChar ) && offset <= lastOffset ) ;
|
||||||
|
|
||||||
|
while ( offset <= lastOffset )
|
||||||
|
{
|
||||||
|
curChar = target.getText ( offset, 1 ).charAt ( 0 ) ;
|
||||||
|
if ( TibetanMachineWeb.isTMWFontCharBreakable ( curChar ) )
|
||||||
|
return offset ;
|
||||||
|
|
||||||
|
offset++ ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( BadLocationException e )
|
||||||
|
{
|
||||||
|
lastOffset = -1 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lastOffset ;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int findPrevBreakable ( JTextComponent target, int offset )
|
||||||
|
{
|
||||||
|
int lastOffset = target.getDocument ().getLength () ;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
char curChar ;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
curChar = target.getText ( offset--, 1 ).charAt ( 0 ) ;
|
||||||
|
}
|
||||||
|
while ( TibetanMachineWeb.isTMWFontCharBreakable ( curChar ) && offset >= 0 ) ;
|
||||||
|
|
||||||
|
while ( offset >= 0 )
|
||||||
|
{
|
||||||
|
curChar = target.getText ( offset, 1 ).charAt ( 0 ) ;
|
||||||
|
if ( TibetanMachineWeb.isTMWFontCharBreakable ( curChar ) )
|
||||||
|
return offset ;
|
||||||
|
|
||||||
|
offset-- ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( BadLocationException e )
|
||||||
|
{
|
||||||
|
lastOffset = -1 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lastOffset ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue