Tried to fix a crashing bug that happened when you converted TM->TMW
and then tried to convert that TMW to Wylie. I swear it's Java's problem (see the ugly stack trace in the code and decide for yourself), and I tried replacing rather than inserting-and-then-removing, but it didn't work. I've left these things as options.
This commit is contained in:
parent
212414edef
commit
70b31558fa
1 changed files with 179 additions and 7 deletions
|
@ -154,6 +154,26 @@ public class TibetanDocument extends DefaultStyledDocument {
|
||||||
return insertDuff(tibetanFontSize, pos, glyphs, true);
|
return insertDuff(tibetanFontSize, pos, glyphs, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Replacing can be more efficient than inserting and then
|
||||||
|
removing. This replaces the glyph at position pos with glyph,
|
||||||
|
which is interpreted as a TMW glyph if asTMW is true and a TM
|
||||||
|
glyph otherwise. The font size for the new glyph is
|
||||||
|
fontSize. */
|
||||||
|
private void replaceDuff(int fontSize, int pos,
|
||||||
|
DuffData glyph, boolean asTMW) {
|
||||||
|
MutableAttributeSet mas
|
||||||
|
= ((asTMW)
|
||||||
|
? TibetanMachineWeb.getAttributeSet(glyph.font)
|
||||||
|
: TibetanMachineWeb.getAttributeSetTM(glyph.font));
|
||||||
|
StyleConstants.setFontSize(mas, fontSize);
|
||||||
|
try {
|
||||||
|
replace(pos, 1, glyph.text, mas);
|
||||||
|
} catch (BadLocationException ble) {
|
||||||
|
ThdlDebug.noteIffyCode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private int insertDuff(int fontSize, int pos, DuffData[] glyphs, boolean asTMW) {
|
private int insertDuff(int fontSize, int pos, DuffData[] glyphs, boolean asTMW) {
|
||||||
if (glyphs == null)
|
if (glyphs == null)
|
||||||
return pos;
|
return pos;
|
||||||
|
@ -387,8 +407,17 @@ public class TibetanDocument extends DefaultStyledDocument {
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// leave it as tibetanFontSize
|
// leave it as tibetanFontSize
|
||||||
}
|
}
|
||||||
insertDuff(fontSize, i, toReplaceWith, true);
|
if (replaceInsteadOfInserting()) {
|
||||||
remove(i+1, 1);
|
replaceDuff(fontSize, i, toReplaceWith[0], true);
|
||||||
|
} else {
|
||||||
|
if (insertBefore()) {
|
||||||
|
insertDuff(fontSize, i, toReplaceWith, true);
|
||||||
|
remove(i+1, 1);
|
||||||
|
} else {
|
||||||
|
insertDuff(fontSize, i+1, toReplaceWith, true);
|
||||||
|
remove(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
|
@ -406,7 +435,7 @@ public class TibetanDocument extends DefaultStyledDocument {
|
||||||
it before using this (well, it usually gets it right on its
|
it before using this (well, it usually gets it right on its
|
||||||
own, but just in case). SPEED_FIXME: might be faster to run
|
own, but just in case). SPEED_FIXME: might be faster to run
|
||||||
over the elements, if they are one per font.
|
over the elements, if they are one per font.
|
||||||
@return true on 100% success, false if any exceptional case
|
@return false on 100% success, true if any exceptional case
|
||||||
was encountered
|
was encountered
|
||||||
@param errors if non-null, then notes about all exceptional
|
@param errors if non-null, then notes about all exceptional
|
||||||
cases will be appended to this StringBuffer
|
cases will be appended to this StringBuffer
|
||||||
|
@ -422,7 +451,7 @@ public class TibetanDocument extends DefaultStyledDocument {
|
||||||
as you like it before using this (well, it usually gets it
|
as you like it before using this (well, it usually gets it
|
||||||
right on its own, but just in case). SPEED_FIXME: might be
|
right on its own, but just in case). SPEED_FIXME: might be
|
||||||
faster to run over the elements, if they are one per font.
|
faster to run over the elements, if they are one per font.
|
||||||
@return true on 100% success, false if any exceptional case
|
@return false on 100% success, true if any exceptional case
|
||||||
was encountered
|
was encountered
|
||||||
@param errors if non-null, then notes about all exceptional
|
@param errors if non-null, then notes about all exceptional
|
||||||
cases will be appended to this StringBuffer
|
cases will be appended to this StringBuffer
|
||||||
|
@ -431,10 +460,144 @@ public class TibetanDocument extends DefaultStyledDocument {
|
||||||
return convertTMW_TM(begin, end, false, errors);
|
return convertTMW_TM(begin, end, false, errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** For debugging only. Start with an empty document, and call
|
||||||
|
this on it. You'll get all the TibetanMachine glyphs
|
||||||
|
inserted, in order, into your document. */
|
||||||
|
private void insertAllTMGlyphs() {
|
||||||
|
int font;
|
||||||
|
int ord;
|
||||||
|
DuffData[] equivalent = new DuffData[1];
|
||||||
|
equivalent[0] = new DuffData();
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
for (font = 0; font < 5; font++) {
|
||||||
|
for (ord = 32; ord < 255; ord++) {
|
||||||
|
if (TibetanMachineWeb.mapTMtoTMW(font, ord) != null) {
|
||||||
|
equivalent[0].setData((char)ord, font + 1);
|
||||||
|
try {
|
||||||
|
insertDuff(tibetanFontSize, count++, equivalent, false);
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
System.err.println("nullpointerexception happened: font is " + font + " ord is " + ord);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** This setting determines whether the formatting is preserved,
|
||||||
|
but with infinite loops in it, or is not preserved, but works
|
||||||
|
well. Inserting + removing must be used rather than replacing
|
||||||
|
because you get the same exception otherwise. FIXME: try Java
|
||||||
|
1.5 -- maybe it beats Java 1.4.
|
||||||
|
|
||||||
|
[java] javax.swing.text.StateInvariantError: infinite loop in formatting
|
||||||
|
[java] at javax.swing.text.FlowView$FlowStrategy.layout(FlowView.java:404)
|
||||||
|
[java] at javax.swing.text.FlowView.layout(FlowView.java:182)
|
||||||
|
[java] at javax.swing.text.BoxView.setSize(BoxView.java:379)
|
||||||
|
[java] at javax.swing.text.BoxView.updateChildSizes(BoxView.java:348)
|
||||||
|
[java] at javax.swing.text.BoxView.setSpanOnAxis(BoxView.java:330)
|
||||||
|
[java] at javax.swing.text.BoxView.layout(BoxView.java:682)
|
||||||
|
[java] at javax.swing.text.BoxView.setSize(BoxView.java:379)
|
||||||
|
[java] at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(BasicTextUI.java:1598)
|
||||||
|
[java] at javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:800)
|
||||||
|
[java] at javax.swing.JComponent.getPreferredSize(JComponent.java:1272)
|
||||||
|
[java] at javax.swing.JEditorPane.getPreferredSize(JEditorPane.java:1206)
|
||||||
|
[java] at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:769)
|
||||||
|
[java] at java.awt.Container.layout(Container.java:1017)
|
||||||
|
[java] at java.awt.Container.doLayout(Container.java:1007)
|
||||||
|
[java] at java.awt.Container.validateTree(Container.java:1089)
|
||||||
|
[java] at java.awt.Container.validate(Container.java:1064)
|
||||||
|
[java] at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:353)
|
||||||
|
[java] at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:116)
|
||||||
|
[java] at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
|
||||||
|
[java] at java.awt.EventQueue.dispatchEvent(EventQueue.java:448)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)
|
||||||
|
[java] at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)
|
||||||
|
[java] javax.swing.text.StateInvariantError: infinite loop in formatting
|
||||||
|
[java] at javax.swing.text.FlowView$FlowStrategy.layout(FlowView.java:404)
|
||||||
|
[java] at javax.swing.text.FlowView.layout(FlowView.java:182)
|
||||||
|
[java] at javax.swing.text.BoxView.setSize(BoxView.java:379)
|
||||||
|
[java] at javax.swing.text.BoxView.updateChildSizes(BoxView.java:348)
|
||||||
|
[java] at javax.swing.text.BoxView.setSpanOnAxis(BoxView.java:316)
|
||||||
|
[java] at javax.swing.text.BoxView.layout(BoxView.java:683)
|
||||||
|
[java] at javax.swing.text.BoxView.setSize(BoxView.java:379)
|
||||||
|
[java] at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(BasicTextUI.java:1598)
|
||||||
|
[java] at javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:800)
|
||||||
|
[java] at javax.swing.JComponent.getPreferredSize(JComponent.java:1272)
|
||||||
|
[java] at javax.swing.JEditorPane.getPreferredSize(JEditorPane.java:1206)
|
||||||
|
[java] at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:769)
|
||||||
|
[java] at java.awt.Container.layout(Container.java:1017)
|
||||||
|
[java] at java.awt.Container.doLayout(Container.java:1007)
|
||||||
|
[java] at java.awt.Container.validateTree(Container.java:1089)
|
||||||
|
[java] at java.awt.Container.validate(Container.java:1064)
|
||||||
|
[java] at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:353)
|
||||||
|
[java] at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:116)
|
||||||
|
[java] at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
|
||||||
|
[java] at java.awt.EventQueue.dispatchEvent(EventQueue.java:448)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)
|
||||||
|
[java] at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)
|
||||||
|
[java] javax.swing.text.StateInvariantError: infinite loop in formatting
|
||||||
|
[java] at javax.swing.text.FlowView$FlowStrategy.layout(FlowView.java:404)
|
||||||
|
[java] at javax.swing.text.FlowView.layout(FlowView.java:182)
|
||||||
|
[java] at javax.swing.text.BoxView.setSize(BoxView.java:379)
|
||||||
|
[java] at javax.swing.text.BoxView.updateChildSizes(BoxView.java:348)
|
||||||
|
[java] at javax.swing.text.BoxView.setSpanOnAxis(BoxView.java:316)
|
||||||
|
[java] at javax.swing.text.BoxView.layout(BoxView.java:683)
|
||||||
|
[java] at javax.swing.text.BoxView.setSize(BoxView.java:379)
|
||||||
|
[java] at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(BasicTextUI.java:1598)
|
||||||
|
[java] at javax.swing.plaf.basic.BasicTextUI.modelToView(BasicTextUI.java:934)
|
||||||
|
[java] at javax.swing.text.DefaultCaret.repaintNewCaret(DefaultCaret.java:1044)
|
||||||
|
[java] at javax.swing.text.DefaultCaret$1.run(DefaultCaret.java:1023)
|
||||||
|
[java] at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
|
||||||
|
[java] at java.awt.EventQueue.dispatchEvent(EventQueue.java:448)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)
|
||||||
|
[java] at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)
|
||||||
|
[java] javax.swing.text.StateInvariantError: infinite loop in formatting
|
||||||
|
[java] at javax.swing.text.FlowView$FlowStrategy.layout(FlowView.java:404)
|
||||||
|
[java] at javax.swing.text.FlowView.layout(FlowView.java:182)
|
||||||
|
[java] at javax.swing.text.BoxView.setSize(BoxView.java:379)
|
||||||
|
[java] at javax.swing.text.BoxView.updateChildSizes(BoxView.java:348)
|
||||||
|
[java] at javax.swing.text.BoxView.setSpanOnAxis(BoxView.java:316)
|
||||||
|
[java] at javax.swing.text.BoxView.layout(BoxView.java:683)
|
||||||
|
[java] at javax.swing.text.BoxView.setSize(BoxView.java:379)
|
||||||
|
[java] at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(BasicTextUI.java:1598)
|
||||||
|
[java] at javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:800)
|
||||||
|
[java] at javax.swing.JComponent.getPreferredSize(JComponent.java:1272)
|
||||||
|
[java] at javax.swing.JEditorPane.getPreferredSize(JEditorPane.java:1206)
|
||||||
|
[java] at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:769)
|
||||||
|
[java] at java.awt.Container.layout(Container.java:1017)
|
||||||
|
[java] at java.awt.Container.doLayout(Container.java:1007)
|
||||||
|
[java] at java.awt.Container.validateTree(Container.java:1089)
|
||||||
|
[java] at java.awt.Container.validate(Container.java:1064)
|
||||||
|
[java] at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:353)
|
||||||
|
[java] at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:116)
|
||||||
|
[java] at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
|
||||||
|
[java] at java.awt.EventQueue.dispatchEvent(EventQueue.java:448)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)
|
||||||
|
[java] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)
|
||||||
|
[java] at java.awt.EventDispatchThread.run(EventDispatchThread.java:99) */
|
||||||
|
private static boolean insertBefore() {
|
||||||
|
return !ThdlOptions.getBooleanOption("thdl.insert.rtf.after.not.before");
|
||||||
|
}
|
||||||
|
private static boolean replaceInsteadOfInserting() {
|
||||||
|
return !ThdlOptions.getBooleanOption("thdl.insert.and.remove.instead.of.replacing");
|
||||||
|
}
|
||||||
|
|
||||||
/** Helper function.
|
/** Helper function.
|
||||||
@param errors if non-null, then notes about all exceptional
|
@param errors if non-null, then notes about all exceptional
|
||||||
cases will be appended to this StringBuffer
|
cases will be appended to this StringBuffer
|
||||||
@return true on 100% success, false if any exceptional case
|
@return false on 100% success, true if any exceptional case
|
||||||
was encountered
|
was encountered
|
||||||
@see convertToTMW(int,int)
|
@see convertToTMW(int,int)
|
||||||
@see convertToTM(int,int) */
|
@see convertToTM(int,int) */
|
||||||
|
@ -487,8 +650,17 @@ public class TibetanDocument extends DefaultStyledDocument {
|
||||||
// whereas insert-before doesn't. And we do
|
// whereas insert-before doesn't. And we do
|
||||||
// insert-then-remove because we're guessing
|
// insert-then-remove because we're guessing
|
||||||
// that helps with formatting too.
|
// that helps with formatting too.
|
||||||
insertDuff(fontSize, i+1, equivalent, !toTM);
|
if (replaceInsteadOfInserting()) {
|
||||||
remove(i, 1);
|
replaceDuff(fontSize, i, equivalent[0], !toTM);
|
||||||
|
} else {
|
||||||
|
if (insertBefore()) {
|
||||||
|
insertDuff(fontSize, i, equivalent, !toTM);
|
||||||
|
remove(i+1, 1);
|
||||||
|
} else {
|
||||||
|
insertDuff(fontSize, i+1, equivalent, !toTM);
|
||||||
|
remove(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// DLC FIXME: insert into document a string
|
// DLC FIXME: insert into document a string
|
||||||
// saying "<<[[there's no TM equivalent for
|
// saying "<<[[there's no TM equivalent for
|
||||||
|
|
Loading…
Reference in a new issue