This may well be a fix to the "Improper line wrapping" bug. The fix
is basically that we use our own special ViewFactory, with a new
subclass of LabelView (the view RTFEditorKit uses for the nitty
gritty) that is aware of Tibetan.
There are a couple of nasty hacks still here, and Swing's
documentation for doing what I did was quite poor. I searched the web
for hours, read the Javadocs and the tutorials, and consulted a Swing
reference book, but I still don't have tremendous confidence in this
solution. If it fundamentally doesn't work, though, we have to define
our own first-class Document, Element hierarchy, ViewFactory, Views,
and EditorKit. So let's hope it *does* work fundamentally.
I can't say for sure if this even works, as I have yet to run this
code on a machine where Jskad works properly. I had major trouble
installing the TMW fonts on Linux, and have yet to resolve it, even
after verifying via xlsfonts that the fonts were installed and then
changing TibetanMachineWeb.java to look for them. Because I haven't
tested this yet, a lot of nasty code is tagged 'DLC' and commented
out.
2002-10-28 03:08:04 +00:00
|
|
|
/*
|
|
|
|
The contents of this file are subject to the THDL Open Community License
|
|
|
|
Version 1.0 (the "License"); you may not use this file except in compliance
|
|
|
|
with the License. You may obtain a copy of the License on the THDL web site
|
|
|
|
(http://www.thdl.org/).
|
|
|
|
|
|
|
|
Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
|
|
|
License for the specific terms governing rights and limitations under the
|
|
|
|
License.
|
|
|
|
|
|
|
|
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
|
|
|
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
|
|
|
All Rights Reserved.
|
|
|
|
|
|
|
|
Contributor(s): ______________________________________.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package org.thdl.tib.text;
|
|
|
|
|
2005-07-11 03:10:32 +00:00
|
|
|
import javax.swing.text.ViewFactory;
|
This may well be a fix to the "Improper line wrapping" bug. The fix
is basically that we use our own special ViewFactory, with a new
subclass of LabelView (the view RTFEditorKit uses for the nitty
gritty) that is aware of Tibetan.
There are a couple of nasty hacks still here, and Swing's
documentation for doing what I did was quite poor. I searched the web
for hours, read the Javadocs and the tutorials, and consulted a Swing
reference book, but I still don't have tremendous confidence in this
solution. If it fundamentally doesn't work, though, we have to define
our own first-class Document, Element hierarchy, ViewFactory, Views,
and EditorKit. So let's hope it *does* work fundamentally.
I can't say for sure if this even works, as I have yet to run this
code on a machine where Jskad works properly. I had major trouble
installing the TMW fonts on Linux, and have yet to resolve it, even
after verifying via xlsfonts that the fonts were installed and then
changing TibetanMachineWeb.java to look for them. Because I haven't
tested this yet, a lot of nasty code is tagged 'DLC' and commented
out.
2002-10-28 03:08:04 +00:00
|
|
|
import javax.swing.text.rtf.RTFEditorKit;
|
2006-08-28 01:20:28 +00:00
|
|
|
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 ;
|
This may well be a fix to the "Improper line wrapping" bug. The fix
is basically that we use our own special ViewFactory, with a new
subclass of LabelView (the view RTFEditorKit uses for the nitty
gritty) that is aware of Tibetan.
There are a couple of nasty hacks still here, and Swing's
documentation for doing what I did was quite poor. I searched the web
for hours, read the Javadocs and the tutorials, and consulted a Swing
reference book, but I still don't have tremendous confidence in this
solution. If it fundamentally doesn't work, though, we have to define
our own first-class Document, Element hierarchy, ViewFactory, Views,
and EditorKit. So let's hope it *does* work fundamentally.
I can't say for sure if this even works, as I have yet to run this
code on a machine where Jskad works properly. I had major trouble
installing the TMW fonts on Linux, and have yet to resolve it, even
after verifying via xlsfonts that the fonts were installed and then
changing TibetanMachineWeb.java to look for them. Because I haven't
tested this yet, a lot of nasty code is tagged 'DLC' and commented
out.
2002-10-28 03:08:04 +00:00
|
|
|
|
|
|
|
/** An EditorKit that is cognizant of the line-wrapping rules for
|
|
|
|
* Tibetan text. That is, this class knows about the tsheg and other
|
|
|
|
* Tibetan punctuation.
|
|
|
|
* @author David Chandler */
|
|
|
|
public class TibetanRTFEditorKit extends RTFEditorKit {
|
|
|
|
/** Creates a new TibetanRTFEditorKit. */
|
|
|
|
public TibetanRTFEditorKit() {
|
|
|
|
super();
|
|
|
|
}
|
|
|
|
|
|
|
|
/** the Tibetan-aware ViewFactory */
|
|
|
|
private TibetanRTFViewFactory f = null;
|
|
|
|
|
|
|
|
/** Returns a ViewFactory that is cognizant of Tibetan punctuation
|
|
|
|
* and line-breaking rules. */
|
|
|
|
public ViewFactory getViewFactory() {
|
|
|
|
if (null == f) {
|
|
|
|
f = new TibetanRTFViewFactory(super.getViewFactory());
|
|
|
|
}
|
|
|
|
return f;
|
|
|
|
}
|
2006-08-28 01:20:28 +00:00
|
|
|
|
|
|
|
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 ;
|
|
|
|
}
|
This may well be a fix to the "Improper line wrapping" bug. The fix
is basically that we use our own special ViewFactory, with a new
subclass of LabelView (the view RTFEditorKit uses for the nitty
gritty) that is aware of Tibetan.
There are a couple of nasty hacks still here, and Swing's
documentation for doing what I did was quite poor. I searched the web
for hours, read the Javadocs and the tutorials, and consulted a Swing
reference book, but I still don't have tremendous confidence in this
solution. If it fundamentally doesn't work, though, we have to define
our own first-class Document, Element hierarchy, ViewFactory, Views,
and EditorKit. So let's hope it *does* work fundamentally.
I can't say for sure if this even works, as I have yet to run this
code on a machine where Jskad works properly. I had major trouble
installing the TMW fonts on Linux, and have yet to resolve it, even
after verifying via xlsfonts that the fonts were installed and then
changing TibetanMachineWeb.java to look for them. Because I haven't
tested this yet, a lot of nasty code is tagged 'DLC' and commented
out.
2002-10-28 03:08:04 +00:00
|
|
|
}
|
2006-08-28 01:20:28 +00:00
|
|
|
|