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:
dchandler 2003-06-08 23:12:52 +00:00
parent 212414edef
commit 70b31558fa

View file

@ -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