home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2001 December / dppcpro1201.iso / Extras / maple / Viewer / WebEQ / MMLViewerInstall.cab / MMLViewerApplet.cab / webeq3 / schema / Box.class (.txt) next >
Encoding:
Java Class File  |  2001-05-24  |  36.4 KB  |  2,225 lines

  1. package webeq3.schema;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.FontMetrics;
  6. import java.awt.Graphics;
  7. import java.io.PrintStream;
  8. import java.util.EmptyStackException;
  9. import java.util.Hashtable;
  10. import java.util.Stack;
  11. import java.util.Vector;
  12. import org.w3c.dom.Attr;
  13. import org.w3c.dom.DOMException;
  14. import org.w3c.dom.Document;
  15. import org.w3c.dom.NamedNodeMap;
  16. import org.w3c.dom.Node;
  17. import org.w3c.dom.NodeList;
  18. import webeq3.action.SyntaxInfo;
  19. import webeq3.app.EEquation;
  20. import webeq3.app.Equation;
  21. import webeq3.constants.AttributeConstants;
  22. import webeq3.constants.ColorDictionary;
  23. import webeq3.constants.EntityNames;
  24. import webeq3.constants.FontMapper;
  25. import webeq3.constants.SemanticConstants;
  26. import webeq3.dom.MathMLDOMAttribute;
  27. import webeq3.dom.MathMLDOMNamedNodeMap;
  28. import webeq3.dom.MathMLDOMNodeList;
  29. import webeq3.dom.MathMLElement;
  30. import webeq3.dom.MathMLMathElement;
  31. import webeq3.editor.Template;
  32. import webeq3.fonts.ExtendedChar;
  33. import webeq3.fonts.FontBroker;
  34. import webeq3.util.OutputHandler;
  35.  
  36. public class Box implements AttributeConstants, SemanticConstants, MathMLMathElement {
  37.    public MathMLDOMNamedNodeMap attribute_map;
  38.    public int type = 1;
  39.    public int kind = 0;
  40.    static final int TO_EM = 0;
  41.    static final int TO_EX = 1;
  42.    static final int TO_PT = 2;
  43.    public Stack[] attribute_stack;
  44.    String[] attributes = new String[86];
  45.    Box parent;
  46.    Box backPtr;
  47.    public Vector children;
  48.    public Equation my_view;
  49.    public Box ppeer = null;
  50.    public ContentBox cpeer = null;
  51.    public int box_id = 0;
  52.    public String udata = "";
  53.    private String udata_old = "";
  54.    public String adata = "";
  55.    ExtendedChar[] data = new ExtendedChar[0];
  56.    protected int left = 0;
  57.    protected int top = 0;
  58.    protected int width = 0;
  59.    protected int height = 0;
  60.    protected int ascent = 0;
  61.    protected int descent = 0;
  62.    public int absleft = 0;
  63.    public int abstop = 0;
  64.    int baseleft = 0;
  65.    int basetop = 0;
  66.    protected int depth = 0;
  67.    // $FF: renamed from: fn java.awt.Font
  68.    protected Font field_0 = null;
  69.    // $FF: renamed from: fm java.awt.FontMetrics
  70.    protected FontMetrics field_1 = null;
  71.    protected Color fgcolor = null;
  72.    protected Color bgcolor = null;
  73.    protected int xheight = 0;
  74.    protected boolean italic = false;
  75.    protected boolean reverse_video = false;
  76.    protected boolean embellished_op = false;
  77.    protected boolean is_spacelike = false;
  78.    protected int semantic_type = 0;
  79.    protected int semantic_form = 0;
  80.    protected int semantic_prec = 0;
  81.    protected int semantic_fencetype = 0;
  82.    protected SyntaxInfo syntax_info = null;
  83.    protected boolean atomic = true;
  84.    public int breakLookAhead = 0;
  85.    int debug = 0;
  86.    // $FF: renamed from: o java.io.PrintStream
  87.    PrintStream field_2;
  88.    protected static Hashtable baseCheck = new Hashtable();
  89.  
  90.    public void setSyntaxInfo(SyntaxInfo var1) {
  91.       this.syntax_info = var1;
  92.    }
  93.  
  94.    public SyntaxInfo getSyntaxInfo() {
  95.       return this.syntax_info;
  96.    }
  97.  
  98.    void stack_init() {
  99.       for(int var1 = 0; var1 < 86; ++var1) {
  100.          this.attribute_stack[var1] = new Stack();
  101.       }
  102.  
  103.       this.attribute_stack[0].push("X");
  104.    }
  105.  
  106.    public Box(Equation var1) {
  107.       this.field_2 = System.out;
  108.       this.my_view = var1;
  109.       this.children = new Vector();
  110.       this.parent = null;
  111.       this.attribute_stack = new Stack[86];
  112.       this.stack_init();
  113.       this.type = 68;
  114.    }
  115.  
  116.    public Box(Box var1) {
  117.       this.field_2 = System.out;
  118.       this.children = new Vector();
  119.       this.parent = var1;
  120.       this.my_view = var1.my_view;
  121.       this.attribute_stack = var1.attribute_stack;
  122.       this.makeAttributeMap();
  123.       this.type = 68;
  124.    }
  125.  
  126.    public Box() {
  127.       this.field_2 = System.out;
  128.       this.children = new Vector();
  129.       this.parent = null;
  130.       this.attribute_stack = null;
  131.       this.type = 68;
  132.    }
  133.  
  134.    public final Box getChild(int var1) {
  135.       try {
  136.          return (Box)this.children.elementAt(var1);
  137.       } catch (Exception var3) {
  138.          return null;
  139.       }
  140.    }
  141.  
  142.    public Box getDisplayChild(int var1) {
  143.       return this.getChild(var1);
  144.    }
  145.  
  146.    public void insertChildAt(Box var1, int var2) {
  147.       var1.setParent(this);
  148.       var1.box_id = var2;
  149.       this.children.insertElementAt(var1, var2);
  150.  
  151.       for(int var3 = var2 + 1; var3 < this.children.size(); this.getChild(var3).box_id = var3++) {
  152.       }
  153.  
  154.    }
  155.  
  156.    public void addChild(Box var1) {
  157.       var1.parent = this;
  158.       var1.box_id = this.children.size();
  159.       this.children.addElement(var1);
  160.    }
  161.  
  162.    public Box removeChildAt(int var1) {
  163.       Box var2 = null;
  164.  
  165.       try {
  166.          if (this.children.size() <= 0) {
  167.             return null;
  168.          }
  169.  
  170.          var2 = this.getChild(var1);
  171.          this.children.removeElementAt(var1);
  172.  
  173.          for(int var3 = var1; var3 < this.children.size(); this.getChild(var3).box_id = var3++) {
  174.          }
  175.       } catch (Exception var4) {
  176.          ((Throwable)var4).printStackTrace();
  177.       }
  178.  
  179.       return var2;
  180.    }
  181.  
  182.    public Box removeChild() {
  183.       return this.removeChildAt(this.children.size() - 1);
  184.    }
  185.  
  186.    public Box setChild(Box var1, int var2) {
  187.       Box var3 = null;
  188.  
  189.       try {
  190.          if (var2 < 0 || this.children.size() <= 0) {
  191.             return null;
  192.          }
  193.  
  194.          var3 = (Box)this.children.elementAt(var2);
  195.          var1.box_id = var2;
  196.          this.children.setElementAt(var1, var2);
  197.       } catch (Exception var5) {
  198.          ((Throwable)var5).printStackTrace();
  199.       }
  200.  
  201.       return var3;
  202.    }
  203.  
  204.    private void moveTail(Box var1, int var2, Box var3) {
  205.       Vector var4 = new Vector();
  206.       Box var5 = null;
  207.       int var6 = var1.getNumChildren();
  208.  
  209.       for(int var7 = var2; var7 < var6; ++var7) {
  210.          var5 = var1.removeChild();
  211.          var5.setParent(var3);
  212.          var4.addElement(var5);
  213.       }
  214.  
  215.       for(int var8 = var4.size() - 1; var8 >= 0; --var8) {
  216.          var3.addChild((Box)var4.elementAt(var8));
  217.       }
  218.  
  219.    }
  220.  
  221.    public Box getParent() {
  222.       return this.parent;
  223.    }
  224.  
  225.    public final void setParent(Box var1) {
  226.       this.parent = var1;
  227.    }
  228.  
  229.    public Box getBackPtr() {
  230.       return this.backPtr;
  231.    }
  232.  
  233.    public Box getCopy() {
  234.       Box var2 = null;
  235.  
  236.       try {
  237.          var2 = (Box)this.getClass().newInstance();
  238.       } catch (Exception var5) {
  239.          System.out.println(var5);
  240.          ((Throwable)var5).printStackTrace();
  241.       }
  242.  
  243.       var2.parent = this.parent;
  244.       var2.backPtr = this;
  245.       var2.my_view = this.my_view;
  246.       var2.attribute_stack = this.attribute_stack;
  247.       var2.attributes = new String[86];
  248.  
  249.       for(int var3 = 0; var3 < 86; ++var3) {
  250.          var2.attributes[var3] = this.attributes[var3];
  251.       }
  252.  
  253.       var2.makeAttributeMap();
  254.       var2.udata = this.udata;
  255.       var2.adata = this.adata;
  256.       var2.semantic_type = this.semantic_type;
  257.       var2.semantic_form = this.semantic_form;
  258.       var2.semantic_prec = this.semantic_prec;
  259.       var2.semantic_fencetype = this.semantic_fencetype;
  260.       var2.embellished_op = this.embellished_op;
  261.       var2.is_spacelike = this.is_spacelike;
  262.       var2.reverse_video = this.reverse_video;
  263.  
  264.       for(int var4 = 0; var4 < this.getNumChildren(); ++var4) {
  265.          Box var1 = this.getChild(var4).getCopy();
  266.          var1.setParent(var2);
  267.          var2.addChild(var1);
  268.       }
  269.  
  270.       return var2;
  271.    }
  272.  
  273.    public static void normalize(Box var0) {
  274.       for(int var1 = 0; var1 < var0.children.size(); ++var1) {
  275.          normalize(var0.getChild(var1));
  276.       }
  277.  
  278.       if (var0.children.size() == 1 && var0.getParent() != null && var0.getClass().getName().equals("webeq3.schema.MRow")) {
  279.          int var2 = var0.box_id;
  280.          var0.getParent().removeChildAt(var0.box_id);
  281.          Box var3 = var0.removeChildAt(0);
  282.  
  283.          for(int var4 = 0; var4 < 86; ++var4) {
  284.             if (var3.attributes[var4] == null || "".equals(var3.attributes[var4])) {
  285.                var3.attributes[var4] = var0.attributes[var4];
  286.             }
  287.          }
  288.  
  289.          var0.getParent().insertChildAt(var3, var2);
  290.       }
  291.  
  292.    }
  293.  
  294.    public void addData(String var1) {
  295.       StringBuffer var3 = new StringBuffer();
  296.       this.adata = this.adata + var1;
  297.  
  298.       for(int var4 = 0; var4 < var1.length(); ++var4) {
  299.          char var2 = var1.charAt(var4);
  300.          if (var2 == '&') {
  301.             int var5 = var1.indexOf(59, var4);
  302.             var3.append(EntityNames.get(var1.substring(var4 + 1, var5)));
  303.             var4 = var5;
  304.          } else {
  305.             var3.append(var2);
  306.          }
  307.       }
  308.  
  309.       this.udata = this.udata + var3;
  310.    }
  311.  
  312.    public int insertData(String var1, int var2) {
  313.       StringBuffer var4 = new StringBuffer();
  314.       if (var2 <= 0) {
  315.          this.adata = var1 + this.adata;
  316.       } else if (var2 >= this.getDataLength()) {
  317.          this.adata = this.adata + var1;
  318.       } else {
  319.          this.adata = this.adata.substring(0, var2) + var1 + this.adata.substring(var2);
  320.       }
  321.  
  322.       for(int var5 = 0; var5 < var1.length(); ++var5) {
  323.          char var3 = var1.charAt(var5);
  324.          if (var3 == '&') {
  325.             int var6 = var1.indexOf(59, var5);
  326.             var4.append(EntityNames.get(var1.substring(var5 + 1, var6)));
  327.             var5 = var6;
  328.          } else {
  329.             var4.append(var3);
  330.          }
  331.       }
  332.  
  333.       if (var2 <= 0) {
  334.          this.udata = var4.toString() + this.udata;
  335.       } else if (var2 >= this.getDataLength()) {
  336.          this.udata = this.udata + var4.toString();
  337.       } else {
  338.          this.udata = this.udata.substring(0, var2) + var4.toString() + this.udata.substring(var2);
  339.       }
  340.  
  341.       return var4.length();
  342.    }
  343.  
  344.    public void setAData(String var1) {
  345.       this.adata = var1;
  346.    }
  347.  
  348.    public void setUData(String var1) {
  349.       this.udata = var1;
  350.    }
  351.  
  352.    public void setData() {
  353.       if (this.udata.length() != this.data.length || !this.udata_old.equals(this.udata)) {
  354.          this.data = new ExtendedChar[this.udata.length()];
  355.  
  356.          for(int var1 = 0; var1 < this.udata.length(); ++var1) {
  357.             this.data[var1] = FontMapper.get(this.udata.charAt(var1));
  358.          }
  359.  
  360.          this.udata_old = this.udata;
  361.       }
  362.  
  363.       if (this.data.length > 10) {
  364.          this.atomic = false;
  365.       }
  366.  
  367.    }
  368.  
  369.    public boolean remove_datum(int var1) {
  370.       if (this.udata.length() <= var1) {
  371.          return false;
  372.       } else {
  373.          ExtendedChar[] var2 = new ExtendedChar[this.data.length - 1];
  374.          System.arraycopy(this.data, 0, var2, 0, var1);
  375.          System.arraycopy(this.data, var1 + 1, var2, var1, this.data.length - 1 - var1);
  376.          this.data = var2;
  377.          String var3 = this.udata.substring(0, var1);
  378.          var3 = var3 + this.udata.substring(var1 + 1);
  379.          this.udata = var3;
  380.          int var4 = 0;
  381.          int var5 = 0;
  382.  
  383.          for(int var7 = 0; var7 < var1; ++var7) {
  384.             char var6 = this.adata.charAt(var4);
  385.             if (var6 == '&') {
  386.                var4 = this.adata.indexOf(59, var4);
  387.             }
  388.  
  389.             ++var4;
  390.          }
  391.  
  392.          char var13 = this.adata.charAt(var4);
  393.          if (var13 == '&') {
  394.             var5 = this.adata.indexOf(59, var4);
  395.          } else {
  396.             var5 = var4;
  397.          }
  398.  
  399.          ++var5;
  400.          var3 = this.adata.substring(0, var4);
  401.          var3 = var3 + this.adata.substring(var5);
  402.          this.adata = var3;
  403.          return true;
  404.       }
  405.    }
  406.  
  407.    public final int getLeft() {
  408.       return this.left;
  409.    }
  410.  
  411.    public final int getTop() {
  412.       return this.top;
  413.    }
  414.  
  415.    public final int getWidth() {
  416.       return this.width;
  417.    }
  418.  
  419.    public final int getHeight() {
  420.       return this.height;
  421.    }
  422.  
  423.    public final int getAscent() {
  424.       return this.ascent;
  425.    }
  426.  
  427.    public final int getDescent() {
  428.       return this.descent;
  429.    }
  430.  
  431.    public final int getXHeight() {
  432.       return this.xheight;
  433.    }
  434.  
  435.    public final int getNumChildren() {
  436.       return this.children.size();
  437.    }
  438.  
  439.    public final int getDataLength() {
  440.       return this.children.size() > 0 ? 1 : this.udata.length();
  441.    }
  442.  
  443.    public final Color getFG() {
  444.       return this.fgcolor;
  445.    }
  446.  
  447.    public final Color getBG() {
  448.       return this.bgcolor;
  449.    }
  450.  
  451.    public final int getBoxID() {
  452.       return this.box_id;
  453.    }
  454.  
  455.    public boolean isItalic() {
  456.       return this.italic;
  457.    }
  458.  
  459.    public boolean isAtomic() {
  460.       return this.atomic;
  461.    }
  462.  
  463.    public boolean isEmbellishedOp() {
  464.       return this.embellished_op;
  465.    }
  466.  
  467.    public boolean isSpaceLike() {
  468.       return this.is_spacelike;
  469.    }
  470.  
  471.    public boolean getReverseVideo() {
  472.       return this.reverse_video;
  473.    }
  474.  
  475.    public boolean isAFence() {
  476.       return this.semantic_type == 6;
  477.    }
  478.  
  479.    public boolean isLFence() {
  480.       return this.semantic_type == 2;
  481.    }
  482.  
  483.    public boolean isRFence() {
  484.       return this.semantic_type == 3;
  485.    }
  486.  
  487.    public boolean isOperand() {
  488.       return this.semantic_type == 5;
  489.    }
  490.  
  491.    public boolean isOperator() {
  492.       return this.semantic_type == 1;
  493.    }
  494.  
  495.    public int getNumDisplayChildren() {
  496.       return this.children.size();
  497.    }
  498.  
  499.    public final void setLeft(int var1) {
  500.       this.left = var1;
  501.    }
  502.  
  503.    public final void setTop(int var1) {
  504.       this.top = var1;
  505.    }
  506.  
  507.    public final void setAttribute(int var1, String var2) {
  508.       if (var1 > -1) {
  509.          this.attributes[var1] = var2;
  510.          MathMLDOMAttribute var3 = new MathMLDOMAttribute(this.my_view, AttributeConstants.attribute_names[var1], var1);
  511.          var3.setValue(var2);
  512.          if (this.attribute_map != null) {
  513.             this.attribute_map.setNamedItem(var3);
  514.          } else {
  515.             this.makeAttributeMap();
  516.          }
  517.       }
  518.  
  519.    }
  520.  
  521.    public final void setAttributeVec(String[] var1) {
  522.       this.attributes = var1;
  523.       this.makeAttributeMap();
  524.    }
  525.  
  526.    public final String[] getAttributeVec() {
  527.       return this.attributes;
  528.    }
  529.  
  530.    public void setReverseVideo(boolean var1) {
  531.       this.reverse_video = var1;
  532.       if (this.backPtr != null) {
  533.          this.backPtr.setReverseVideo(var1);
  534.       }
  535.  
  536.    }
  537.  
  538.    public final int getDataWidth(int var1) {
  539.       int var2 = 0;
  540.       if (var1 <= this.data.length && var1 >= 0) {
  541.          for(int var3 = 0; var3 < var1; ++var3) {
  542.             var2 += this.data[var3].getWidth();
  543.          }
  544.  
  545.          return var2;
  546.       } else {
  547.          System.out.println("Bad position inside Box!: " + var1 + " is not between 0 and " + this.data.length);
  548.          return 0;
  549.       }
  550.    }
  551.  
  552.    Box processMatrixSelection(boolean var1) {
  553.       int var5 = 1000;
  554.       MTable var6 = null;
  555.       int var7 = 1000;
  556.       int var8 = 1000;
  557.       int var9 = -1;
  558.       int var10 = -1;
  559.  
  560.       for(int var11 = this.getNumChildren() - 1; var11 >= 0; --var11) {
  561.          Box var2 = this.getChild(var11);
  562.          boolean var3 = true;
  563.          if (var2.getNumChildren() < var5) {
  564.             var5 = var2.getNumChildren();
  565.          }
  566.  
  567.          for(int var12 = 0; var12 < var2.getNumChildren(); ++var12) {
  568.             if (var2.getChild(var12).getReverseVideo()) {
  569.                var7 = var12 < var7 ? var12 : var7;
  570.                var8 = var11 < var8 ? var11 : var8;
  571.                var9 = var12 > var9 ? var12 : var9;
  572.                var10 = var11 > var10 ? var11 : var10;
  573.                var3 &= true;
  574.             } else {
  575.                var3 = false;
  576.             }
  577.          }
  578.  
  579.          if (var3) {
  580.             if (var6 == null) {
  581.                var6 = new MTable(this);
  582.             }
  583.  
  584.             if (var1) {
  585.                ((Box)var6).insertChildAt(this.removeChildAt(var11), 0);
  586.             } else {
  587.                ((Box)var6).insertChildAt(this.getChild(var11).getCopy(), 0);
  588.             }
  589.          }
  590.       }
  591.  
  592.       if (var6 != null) {
  593.          this.my_view.root.clearSelection();
  594.          var6.savedCursorLeft = var7;
  595.          var6.savedCursorTop = var8;
  596.          return var6;
  597.       } else {
  598.          for(int var17 = var5 - 1; var17 >= 0; --var17) {
  599.             boolean var4 = true;
  600.  
  601.             for(int var13 = 0; var13 < this.getNumChildren(); ++var13) {
  602.                var4 &= this.getChild(var13).getChild(var17).getReverseVideo();
  603.             }
  604.  
  605.             if (var4) {
  606.                if (var6 == null) {
  607.                   var6 = new MTable(this);
  608.  
  609.                   for(int var14 = 0; var14 < this.getNumChildren(); ++var14) {
  610.                      ((Box)var6).addChild(new MTr(var6));
  611.                   }
  612.                }
  613.  
  614.                for(int var20 = 0; var20 < this.getNumChildren(); ++var20) {
  615.                   if (var1) {
  616.                      ((Box)var6).getChild(var20).insertChildAt(this.getChild(var20).removeChildAt(var17), 0);
  617.                   } else {
  618.                      ((Box)var6).getChild(var20).insertChildAt(this.getChild(var20).getChild(var17).getCopy(), 0);
  619.                   }
  620.                }
  621.             }
  622.          }
  623.  
  624.          if (var6 != null) {
  625.             var6.savedCursorLeft = var7;
  626.             var6.savedCursorTop = var8;
  627.             return var6;
  628.          } else if (var7 >= 1000) {
  629.             return null;
  630.          } else {
  631.             if (var6 == null) {
  632.                var6 = new MTable(this);
  633.  
  634.                for(int var18 = 0; var18 <= var10 - var8; ++var18) {
  635.                   ((Box)var6).addChild(new MTr(var6));
  636.                }
  637.             }
  638.  
  639.             for(int var19 = var8; var19 <= var10; ++var19) {
  640.                for(int var21 = var7; var21 <= var9; ++var21) {
  641.                   if (var1) {
  642.                      MTd var15 = new MTd(this.getChild(var19));
  643.                      Template var16 = new Template(var15);
  644.                      ((Box)var15).addChild(var16);
  645.                      ((EEquation)this.my_view).addTemplate(var16);
  646.                      ((EEquation)this.my_view).setCurrentTemplate(var16);
  647.                      ((Box)var6).getChild(var19 - var8).addChild(this.getChild(var19).setChild(var15, var21));
  648.                   } else {
  649.                      ((Box)var6).getChild(var19 - var8).addChild(this.getChild(var19).getChild(var21).getCopy());
  650.                   }
  651.                }
  652.             }
  653.  
  654.             var6.savedCursorLeft = var7;
  655.             var6.savedCursorTop = var8;
  656.             return var6;
  657.          }
  658.       }
  659.    }
  660.  
  661.    public Box cutSelected() {
  662.       if (this.getReverseVideo() && this.getParent() != null) {
  663.          return this.getParent().removeChildAt(this.box_id);
  664.       } else {
  665.          if (this instanceof MTable) {
  666.             Box var1 = this.processMatrixSelection(true);
  667.             if (var1 != null) {
  668.                return var1;
  669.             }
  670.          } else {
  671.             Vector var7 = new Vector();
  672.             int var3 = this.getNumChildren();
  673.  
  674.             for(int var4 = this.getNumChildren() - 1; var4 >= 0; --var4) {
  675.                Box var2 = this.getChild(var4).cutSelected();
  676.                if (var2 != null) {
  677.                   var7.addElement(var2);
  678.                   var3 = var4;
  679.                }
  680.             }
  681.  
  682.             if (var7.size() > 0) {
  683.                if (var7.size() <= 1) {
  684.                   Box var8 = (Box)var7.elementAt(0);
  685.                   return var8;
  686.                }
  687.  
  688.                MRow var5 = new MRow(this);
  689.  
  690.                for(int var6 = var7.size() - 1; var6 >= 0; --var6) {
  691.                   ((Box)var5).addChild((Box)var7.elementAt(var6));
  692.                }
  693.  
  694.                var5.box_id = var3;
  695.                return var5;
  696.             }
  697.          }
  698.  
  699.          return null;
  700.       }
  701.    }
  702.  
  703.    public Box copySelected() {
  704.       if (this.getReverseVideo()) {
  705.          return this.getCopy();
  706.       } else {
  707.          if (this instanceof MTable) {
  708.             Box var1 = this.processMatrixSelection(false);
  709.             if (var1 != null) {
  710.                return var1;
  711.             }
  712.          } else {
  713.             Box var5 = this.getParent();
  714.             var5 = var5 == null ? this : var5;
  715.             MRow var2 = new MRow(var5);
  716.  
  717.             for(int var4 = 0; var4 < this.getNumChildren(); ++var4) {
  718.                Box var3 = this.getChild(var4).copySelected();
  719.                if (var3 != null) {
  720.                   ((Box)var2).addChild(var3);
  721.                }
  722.             }
  723.  
  724.             if (((Box)var2).getNumChildren() > 0) {
  725.                if (((Box)var2).getNumChildren() > 1) {
  726.                   return var2;
  727.                }
  728.  
  729.                return ((Box)var2).removeChild();
  730.             }
  731.          }
  732.  
  733.          return null;
  734.       }
  735.    }
  736.  
  737.    public void clearSelection() {
  738.       this.setReverseVideo(false);
  739.  
  740.       for(int var1 = 0; var1 < this.children.size(); ++var1) {
  741.          this.getChild(var1).clearSelection();
  742.       }
  743.  
  744.       this.my_view.haveSelection = false;
  745.       this.my_view.leftmostSelection = null;
  746.       this.my_view.rightmostSelection = null;
  747.    }
  748.  
  749.    public void print(String var1, OutputHandler var2) {
  750.       this.printSelected(var1, var2, false, false, "", true);
  751.    }
  752.  
  753.    public void print(String var1, OutputHandler var2, boolean var3, String var4) {
  754.       this.printSelected(var1, var2, false, var3, var4, true);
  755.    }
  756.  
  757.    public void printSelected(String var1, OutputHandler var2) {
  758.       this.printSelected(var1, var2, true, false, "", true);
  759.    }
  760.  
  761.    public void printSelected(String var1, OutputHandler var2, boolean var3) {
  762.       this.printSelected(var1, var2, var3, false, "", true);
  763.    }
  764.  
  765.    public void printSelected(String var1, OutputHandler var2, boolean var3, boolean var4, String var5) {
  766.       this.printSelected(var1, var2, var3, var4, var5, false);
  767.    }
  768.  
  769.    public void printSelected(String var1, OutputHandler var2, boolean var3, boolean var4, String var5, boolean var6) {
  770.       this.printSelected(var1, var2, var3, var4, var5, var6, 0);
  771.    }
  772.  
  773.    public void printSelected(String var1, OutputHandler var2, boolean var3, boolean var4, String var5, boolean var6, int var7) {
  774.       if (var3 && !this.reverse_video) {
  775.          for(int var10 = 0; var10 < this.getNumDisplayChildren(); ++var10) {
  776.             this.getDisplayChild(var10).printSelected(var1, var2, var3, var4, var5, var6, var7);
  777.          }
  778.       } else if (var6 && this.cpeer != null) {
  779.          this.cpeer.printSelected(var1, var2, var3, var4, var5, var6, var7);
  780.       } else if (this.children.size() == 0) {
  781.          var2.println(var1 + this.make_head(var4, var5) + "</" + this.make_tag(var5) + ">");
  782.       } else {
  783.          var2.println(var1 + this.make_head(var4, var5));
  784.          String var8 = var1 + "  ";
  785.  
  786.          for(int var9 = 0; var9 < this.getNumChildren(); ++var9) {
  787.             this.getChild(var9).printSelected(var8, var2, var3, var4, var5, var6, var7);
  788.          }
  789.  
  790.          var2.println(var1 + "</" + this.make_tag(var5) + ">");
  791.       }
  792.  
  793.    }
  794.  
  795.    public String make_head() {
  796.       return this.make_head(false, "");
  797.    }
  798.  
  799.    public String make_head(boolean var1, String var2) {
  800.       String var3 = "<" + this.make_tag(var2);
  801.       String var4 = this.getClass().getName();
  802.       if (var4.equals("webeq3.schema.Box") && var1) {
  803.          if (!"".equals(var2)) {
  804.             var3 = var3 + " xmlns:" + var2 + "='http://www.w3.org/1998/Math/MathML' ";
  805.          } else {
  806.             var3 = var3 + " xmlns='http://www.w3.org/1998/Math/MathML' ";
  807.          }
  808.       }
  809.  
  810.       for(int var5 = 0; var5 < 86; ++var5) {
  811.          if (this.attributes[var5] != null && !this.attributes[var5].equals("")) {
  812.             var3 = var3 + " " + AttributeConstants.attribute_names[var5] + "='" + this.attributes[var5] + "'";
  813.          }
  814.       }
  815.  
  816.       return var3 + ">";
  817.    }
  818.  
  819.    public String make_tag() {
  820.       return this.make_tag("");
  821.    }
  822.  
  823.    public String make_tag(String var1) {
  824.       String var2 = this.getClass().getName();
  825.       if (!"".equals(var1) && var1.charAt(var1.length() - 1) != ':') {
  826.          var1 = var1 + ":";
  827.       }
  828.  
  829.       return var2.equals("webeq3.schema.Box") ? var1 + "math" : var1 + var2.substring("webeq3.schema.".length()).toLowerCase();
  830.    }
  831.  
  832.    public String unicodeData(int var1) {
  833.       if (var1 == 2) {
  834.          return this.udata;
  835.       } else if (var1 != 1) {
  836.          return this.adata;
  837.       } else {
  838.          String var2 = "";
  839.  
  840.          for(int var6 = 0; var6 < this.udata.length(); ++var6) {
  841.             char var4 = this.udata.charAt(var6);
  842.             if (var4 > ' ' && var4 < 128) {
  843.                var2 = var2 + var4;
  844.             } else {
  845.                String var3 = "0000" + Integer.toHexString(var4);
  846.                var3 = var3.substring(var3.length() - 4);
  847.                var2 = var2 + "&#x" + var3 + ";";
  848.             }
  849.          }
  850.  
  851.          return var2;
  852.       }
  853.    }
  854.  
  855.    public void printDebug(OutputHandler var1) {
  856.       this.printDebug("", var1);
  857.    }
  858.  
  859.    public void printDebug(String var1, OutputHandler var2) {
  860.       if (this.children.size() == 0) {
  861.          if (!this.getClass().getName().equals("webeq3.schema.MI") && !this.getClass().getName().equals("webeq3.schema.MN") && !this.getClass().getName().equals("webeq3.schema.MO") && !this.getClass().getName().equals("webeq3.schema.MS")) {
  862.             if (this.children.size() == 0) {
  863.                var2.println(var1 + "</" + this.make_tag("") + "> (sf=" + this.semanticForm() + ")");
  864.             }
  865.          } else {
  866.             var2.println(var1 + this.make_head() + this.adata + "</" + this.make_tag() + "> (sf=" + this.semanticForm() + ")");
  867.          }
  868.       } else {
  869.          var2.println(var1 + this.make_head() + " (sf=" + this.semanticForm() + ")");
  870.          String var3 = var1 + "  ";
  871.  
  872.          for(int var4 = 0; var4 < this.getNumChildren(); ++var4) {
  873.             this.getChild(var4).printDebug(var3, var2);
  874.          }
  875.  
  876.          var2.println(var1 + "</" + this.make_tag("") + ">");
  877.       }
  878.  
  879.    }
  880.  
  881.    public void printDebug() {
  882.       this.printDebug("");
  883.    }
  884.  
  885.    public void printDebug(String var1) {
  886.       String var2 = this.getClass().getName();
  887.       var2 = var2.substring(14);
  888.       if (this.children.size() == 0) {
  889.          System.out.print(var1 + "<" + this);
  890.          if (!"".equals(this.adata)) {
  891.             System.out.print(" [" + this.adata + "]");
  892.          }
  893.  
  894.          if (this instanceof ContentBox) {
  895.             System.out.println(" " + ((ContentBox)this).name + "> (color=" + this.getAttributeByIndex(17) + ")");
  896.          } else {
  897.             System.out.println("> (color=" + this.getAttributeByIndex(17) + ")");
  898.          }
  899.       } else {
  900.          System.out.print(var1 + "<" + this);
  901.          if (!"".equals(this.adata)) {
  902.             System.out.print(" [" + this.adata + "]");
  903.          }
  904.  
  905.          if (this instanceof ContentBox) {
  906.             System.out.println(" " + ((ContentBox)this).name + "> (color=" + this.getAttributeByIndex(17) + ")");
  907.          } else {
  908.             System.out.println("> (color=" + this.getAttributeByIndex(17) + ")");
  909.          }
  910.  
  911.          String var3 = var1 + "  ";
  912.  
  913.          for(int var4 = 0; var4 < this.getNumDisplayChildren(); ++var4) {
  914.             this.getDisplayChild(var4).printDebug(var3);
  915.          }
  916.  
  917.          System.out.println(var1 + "</" + var2 + ">");
  918.       }
  919.  
  920.    }
  921.  
  922.    public void diagnostic(Graphics var1, int var2, int var3, int var4) {
  923.       int var5 = var2 + this.my_view.offsetx;
  924.       int var6 = var3 + this.my_view.offsety;
  925.       if (this.debug > 1) {
  926.          switch (var4) {
  927.             case 1:
  928.                var1.setColor(Color.red);
  929.                break;
  930.             case 2:
  931.                var1.setColor(Color.green);
  932.                break;
  933.             case 3:
  934.                var1.setColor(Color.blue);
  935.                break;
  936.             case 4:
  937.                var1.setColor(Color.white);
  938.                break;
  939.             default:
  940.                var1.setColor(Color.black);
  941.          }
  942.  
  943.          var1.drawLine(var5 + this.left, var6 + this.top, var5 + this.left + this.width, var6 + this.top);
  944.          var1.drawLine(var5 + this.left + this.width, var6 + this.top, var5 + this.left + this.width, var6 + this.top + this.height);
  945.          var1.drawLine(var5 + this.left + this.width, var6 + this.top + this.height, var5 + this.left, var6 + this.top + this.height);
  946.          var1.drawLine(var5 + this.left, var6 + this.top + this.height, var5 + this.left, var6 + this.top);
  947.          if (this.debug > 2) {
  948.             System.out.println("-----------------------------------------");
  949.             System.out.print(this.getClass().getName());
  950.             System.out.print(" nchld = " + this.children.size());
  951.             System.out.print(" left = " + this.left);
  952.             System.out.print(" baseleft = " + var2);
  953.             System.out.println(" ofx = " + this.my_view.offsetx);
  954.             System.out.print("width = " + this.width);
  955.             System.out.print(" height = " + this.height);
  956.             System.out.print(" ascent = " + this.ascent);
  957.             System.out.println(" descent = " + this.descent);
  958.          }
  959.  
  960.          var1.setColor(Color.black);
  961.       }
  962.  
  963.    }
  964.  
  965.    public void layout() {
  966.       this.left = 0;
  967.       this.top = 0;
  968.       this.width = 0;
  969.       this.ascent = 0;
  970.       this.descent = 0;
  971.       this.embellished_op = false;
  972.       this.is_spacelike = false;
  973.       this.size();
  974.       this.position();
  975.    }
  976.  
  977.    public void size() {
  978.       this.bgcolor = this.resolveColor(17);
  979.       this.fgcolor = this.resolveColor(4);
  980.       this.setfont(this.depth);
  981.       int var2 = this.children.size();
  982.       if (var2 > 0) {
  983.          this.descent = -1000;
  984.       }
  985.  
  986.       for(int var3 = 0; var3 < var2; ++var3) {
  987.          Box var1 = this.getChild(var3);
  988.          var1.depth = this.depth;
  989.          var1.layout();
  990.          if (this.ascent < var1.getAscent()) {
  991.             this.ascent = var1.getAscent();
  992.          }
  993.  
  994.          if (this.descent < var1.getDescent()) {
  995.             this.descent = var1.getDescent();
  996.          }
  997.  
  998.          this.width += var1.getWidth();
  999.       }
  1000.  
  1001.       this.height = this.ascent + this.descent;
  1002.    }
  1003.  
  1004.    public void position() {
  1005.       int var2 = 0;
  1006.       boolean var3 = false;
  1007.       int var4 = this.children.size();
  1008.  
  1009.       for(int var5 = 0; var5 < var4; ++var5) {
  1010.          Box var1 = this.getChild(var5);
  1011.          var1.setLeft(var2);
  1012.          var1.setTop(this.ascent - var1.getAscent());
  1013.          var2 += var1.getWidth();
  1014.       }
  1015.  
  1016.    }
  1017.  
  1018.    public boolean stretchTo(int var1, int var2) {
  1019.       int var4 = this.children.size();
  1020.       boolean var5 = false;
  1021.  
  1022.       for(int var6 = 0; var6 < var4; ++var6) {
  1023.          Box var3 = this.getChild(var6);
  1024.          if (var3.embellished_op) {
  1025.             var5 |= var3.stretchTo(var1, var2);
  1026.             if (this.ascent < var3.getAscent()) {
  1027.                this.ascent = var3.getAscent();
  1028.             }
  1029.  
  1030.             if (this.descent < var3.getDescent()) {
  1031.                this.descent = var3.getDescent();
  1032.             }
  1033.  
  1034.             if (var5 && var3 instanceof MO) {
  1035.                ((MO)var3).noLayout = true;
  1036.             }
  1037.          }
  1038.       }
  1039.  
  1040.       this.height = this.ascent + this.descent;
  1041.       return var5;
  1042.    }
  1043.  
  1044.    public boolean widthTo(int var1) {
  1045.       boolean var3 = false;
  1046.       int var4 = this.children.size();
  1047.  
  1048.       for(int var5 = 0; var5 < var4; ++var5) {
  1049.          Box var2 = this.getChild(var5);
  1050.          if (var2.embellished_op) {
  1051.             var3 |= var2.widthTo(var1);
  1052.             if (var3 && var2 instanceof MO) {
  1053.                ((MO)var2).noLayout = true;
  1054.             }
  1055.          }
  1056.       }
  1057.  
  1058.       return var3;
  1059.    }
  1060.  
  1061.    public void paint(Graphics var1, int var2, int var3) {
  1062.       int var5 = 0;
  1063.       int var6 = 0;
  1064.       boolean var7 = false;
  1065.       boolean var8 = false;
  1066.       this.paintBackground(var1, var2, var3);
  1067.       if (!MStyle.allowForcedBreaks && !this.my_view.linebreak) {
  1068.          for(int var9 = 0; var9 < this.children.size(); ++var9) {
  1069.             this.getChild(var9).paint(var1, var2 + this.left, var3 + this.top);
  1070.          }
  1071.       } else {
  1072.          if (this.needBGPaint()) {
  1073.             var5 = var3 + this.top + this.my_view.offsety;
  1074.             var6 = this.my_view.getDisplayWidth();
  1075.  
  1076.             for(int var11 = var2 + this.left + this.my_view.offsetx + this.width - var6; var11 > 0; var8 = true) {
  1077.                var5 += 5 + this.my_view.root.getHeight();
  1078.                this.rvPaint(var1, 0, var5, var6, this.height);
  1079.                var11 -= var6 - this.my_view.indent;
  1080.             }
  1081.          }
  1082.  
  1083.          var8 |= this.paintBreakingChildren(var1, var2, var3, 0, this.children.size(), var5);
  1084.          if (var8) {
  1085.             this.paintCleanup(var1, var2 + this.left + this.my_view.offsetx + this.width, var3 + this.top + this.my_view.offsety, this.my_view.getSize().width, this.height);
  1086.          }
  1087.       }
  1088.  
  1089.       this.absleft = var2 + this.left;
  1090.       this.abstop = var3 + this.top;
  1091.    }
  1092.  
  1093.    boolean paintBreakingChildren(Graphics var1, int var2, int var3, int var4, int var5, int var6) {
  1094.       int var11 = this.my_view.getDisplayWidth();
  1095.       boolean var12 = false;
  1096.  
  1097.       for(int var14 = var4; var14 < var5; ++var14) {
  1098.          int var8 = this.my_view.offsety;
  1099.          int var7 = this.my_view.offsetx;
  1100.          int var9 = this.my_view.breaks.size();
  1101.          int var10 = this.getChild(var14).breakLookAhead;
  1102.          Box var13 = this.getChild(var14);
  1103.          var13.paint(var1, var2 + this.left, var3 + this.top);
  1104.          if ((MStyle.allowForcedBreaks || this.my_view.linebreak) && var6 < this.my_view.offsety && this.needBGPaint()) {
  1105.             if (this.bgcolor != null) {
  1106.                if (this.reverse_video) {
  1107.                   var1.setColor(this.fgcolor);
  1108.                } else {
  1109.                   var1.setColor(this.bgcolor);
  1110.                }
  1111.             } else if (this.reverse_video) {
  1112.                var1.setColor(Color.black);
  1113.             }
  1114.  
  1115.             for(int var15 = var3 + this.top + var8; var15 <= var6; var15 += 5 + this.my_view.root.getHeight()) {
  1116.                var1.fillRect(var2 + this.left + var7 + var13.getLeft(), var15, var11, this.height);
  1117.             }
  1118.  
  1119.             for(; var6 < this.my_view.offsety; var12 = true) {
  1120.                var6 += 5 + this.my_view.root.getHeight();
  1121.                int var16 = 0;
  1122.  
  1123.                for(int var17 = 0; var17 < this.my_view.breaks.size(); ++var17) {
  1124.                   if (var13.absleft < Math.abs((Integer)this.my_view.breaks.elementAt(var17))) {
  1125.                      var16 = var17;
  1126.                   }
  1127.                }
  1128.  
  1129.                if ((Integer)this.my_view.breaks.elementAt(var16) < 0) {
  1130.                   var1.fillRect(0, var6, var11, this.height);
  1131.                } else {
  1132.                   var1.fillRect(0, var6, var11, this.height);
  1133.                }
  1134.             }
  1135.  
  1136.             this.my_view.offsetx = var7;
  1137.             this.my_view.offsety = var8;
  1138.  
  1139.             for(int var18 = this.my_view.breaks.size() - 1; var18 >= var9; --var18) {
  1140.                this.my_view.breaks.removeElementAt(var18);
  1141.             }
  1142.  
  1143.             var13.setLookAhead(var10);
  1144.             var13.paint(var1, var2 + this.left, var3 + this.top);
  1145.          }
  1146.       }
  1147.  
  1148.       return var12;
  1149.    }
  1150.  
  1151.    void paintCleanup(Graphics var1, int var2, int var3, int var4, int var5) {
  1152.       Box var6 = this.getParent();
  1153.       Color var7 = var6 == null ? this.bgcolor : var6.bgcolor;
  1154.       if (var6 == null) {
  1155.          Color var10000 = this.fgcolor;
  1156.       } else {
  1157.          Color var10 = var6.fgcolor;
  1158.       }
  1159.  
  1160.       boolean var9 = var6 == null ? this.reverse_video : var6.reverse_video;
  1161.       if (!var7.equals(this.bgcolor) || var9 != this.reverse_video || var6 == null) {
  1162.          if (var6 != null) {
  1163.             if (var9) {
  1164.                var1.setColor(this.fgcolor);
  1165.             } else {
  1166.                var1.setColor(var7);
  1167.             }
  1168.          } else if (var9) {
  1169.             var1.setColor(var7);
  1170.          }
  1171.  
  1172.          var1.fillRect(var2, var3, var4, var5);
  1173.       }
  1174.  
  1175.    }
  1176.  
  1177.    public boolean needBGPaint() {
  1178.       Color var1;
  1179.       boolean var2;
  1180.       if (this.parent == null) {
  1181.          var1 = this.bgcolor;
  1182.          var2 = false;
  1183.       } else {
  1184.          var1 = this.parent.bgcolor == null ? this.bgcolor : this.parent.bgcolor;
  1185.          var2 = this.parent.reverse_video;
  1186.       }
  1187.  
  1188.       return !var1.equals(this.bgcolor) || this.reverse_video != var2;
  1189.    }
  1190.  
  1191.    public void paintBackground(Graphics var1, int var2, int var3) {
  1192.       this.rvPaint(var1, var2 + this.left + this.my_view.offsetx, var3 + this.top + this.my_view.offsety, this.width, this.height);
  1193.    }
  1194.  
  1195.    void rvPaint(Graphics var1, int var2, int var3, int var4, int var5) {
  1196.       if (this.needBGPaint()) {
  1197.          if (this.bgcolor != null) {
  1198.             if (this.reverse_video) {
  1199.                var1.setColor(this.fgcolor);
  1200.             } else {
  1201.                var1.setColor(this.bgcolor);
  1202.             }
  1203.          } else if (this.reverse_video) {
  1204.             var1.setColor(Color.black);
  1205.          }
  1206.  
  1207.          var1.fillRect(var2, var3, var4, var5);
  1208.       }
  1209.  
  1210.    }
  1211.  
  1212.    public void setLookAhead(int var1) {
  1213.       this.breakLookAhead = var1;
  1214.  
  1215.       for(int var2 = 0; var2 < this.children.size(); ++var2) {
  1216.          this.getChild(var2).setLookAhead(var1);
  1217.       }
  1218.  
  1219.    }
  1220.  
  1221.    public String getAttributeString(int var1) {
  1222.       Object var2 = null;
  1223.       String var5;
  1224.       if (this.attributes[var1] != null && this.attributes[var1].length() > 0) {
  1225.          var5 = this.attributes[var1];
  1226.       } else {
  1227.          try {
  1228.             var5 = (String)this.attribute_stack[var1].peek();
  1229.          } catch (EmptyStackException var4) {
  1230.             return AttributeConstants.defaultValue[var1];
  1231.          }
  1232.       }
  1233.  
  1234.       if (var5 != null) {
  1235.          var5.toLowerCase();
  1236.       }
  1237.  
  1238.       return var5.trim();
  1239.    }
  1240.  
  1241.    public String getDefaultAttributeString(int var1) {
  1242.       Object var2 = null;
  1243.  
  1244.       try {
  1245.          var5 = (String)this.attribute_stack[var1].peek();
  1246.       } catch (EmptyStackException var4) {
  1247.          return AttributeConstants.defaultValue[var1];
  1248.       }
  1249.  
  1250.       if (var5 != null) {
  1251.          var5.toLowerCase();
  1252.       }
  1253.  
  1254.       return var5;
  1255.    }
  1256.  
  1257.    public String getRawAttribute(int var1) {
  1258.       return this.attributes[var1];
  1259.    }
  1260.  
  1261.    public String getAttributeByIndex(int var1) {
  1262.       String var2 = this.getAttributeString(var1);
  1263.       if (AttributeConstants.hasUnits[var1] == 'v') {
  1264.          var2 = this.processUnits(var2, 1, var1);
  1265.       } else if (AttributeConstants.hasUnits[var1] == 'h') {
  1266.          var2 = this.processUnits(var2, 0, var1);
  1267.       } else if (AttributeConstants.hasUnits[var1] == 'p') {
  1268.          var2 = this.processUnits(var2, 2, var1);
  1269.       }
  1270.  
  1271.       return var2;
  1272.    }
  1273.  
  1274.    public String getDefaultAttribute(int var1) {
  1275.       String var2 = this.getDefaultAttributeString(var1);
  1276.       if (AttributeConstants.hasUnits[var1] == 'v') {
  1277.          var2 = this.processUnits(var2, 1, var1);
  1278.       } else if (AttributeConstants.hasUnits[var1] == 'h') {
  1279.          var2 = this.processUnits(var2, 0, var1);
  1280.       } else if (AttributeConstants.hasUnits[var1] == 'p') {
  1281.          var2 = this.processUnits(var2, 2, var1);
  1282.       }
  1283.  
  1284.       return var2;
  1285.    }
  1286.  
  1287.    public void setfont(int var1) {
  1288.       var1 = this.resolveDepth(var1);
  1289.       this.set_font_internal(this.my_view.standardPointsize(var1));
  1290.    }
  1291.  
  1292.    public void setrawfont(int var1) {
  1293.       int[] var2 = new int[2];
  1294.       this.my_view.getPointsize(var1, var2);
  1295.       this.set_font_internal(var2[0]);
  1296.    }
  1297.  
  1298.    private void set_font_internal(int var1) {
  1299.       String var2 = null;
  1300.       String var3 = null;
  1301.       String var4 = null;
  1302.       String var5 = this.attributes[82];
  1303.       if (var5 == null || var5.length() == 0) {
  1304.          try {
  1305.             var5 = (String)this.attribute_stack[82].peek();
  1306.          } catch (EmptyStackException var13) {
  1307.             var5 = "";
  1308.          }
  1309.       }
  1310.  
  1311.       if (var5 != null && var5.length() > 0) {
  1312.          if ("normal".equals(var5)) {
  1313.             var2 = "TimesRoman";
  1314.             var3 = "";
  1315.             var4 = "normal";
  1316.          } else if ("bold".equals(var5)) {
  1317.             var2 = "TimesRoman";
  1318.             var3 = "bold";
  1319.             var4 = "normal";
  1320.          } else if ("italic".equals(var5)) {
  1321.             var2 = "TimesRoman";
  1322.             var3 = "normal";
  1323.             var4 = "italic";
  1324.          } else if ("bold-italic".equals(var5)) {
  1325.             var2 = "TimesRoman";
  1326.             var3 = "bold";
  1327.             var4 = "italic";
  1328.          } else if ("sans-serif".equals(var5)) {
  1329.             var2 = "Helvetica";
  1330.             var3 = "normal";
  1331.             var4 = "normal";
  1332.          } else if ("bold-sans-serif".equals(var5)) {
  1333.             var2 = "Helvetica";
  1334.             var3 = "bold";
  1335.             var4 = "normal";
  1336.          } else if ("sans-serif-italic".equals(var5)) {
  1337.             var2 = "Helvetica";
  1338.             var3 = "normal";
  1339.             var4 = "italic";
  1340.          } else if ("sans-serif-bold-italic".equals(var5)) {
  1341.             var2 = "Helvetica";
  1342.             var3 = "bold";
  1343.             var4 = "italic";
  1344.          } else if ("monospace".equals(var5)) {
  1345.             var2 = "Courier";
  1346.             var3 = "normal";
  1347.             var4 = "normal";
  1348.          } else if (!"script".equals(var5) && !"bold-script".equals(var5)) {
  1349.             if (!"fraktur".equals(var5) && !"bold-fraktur".equals(var5)) {
  1350.                if ("double-struck".equals(var5)) {
  1351.                   var2 = "double-struck";
  1352.                   var3 = "normal";
  1353.                   var4 = "normal";
  1354.                }
  1355.             } else {
  1356.                var2 = "fraktur";
  1357.                var4 = "normal";
  1358.                var3 = "bold-fraktur".equals(var5) ? "bold" : "normal";
  1359.             }
  1360.          } else {
  1361.             var2 = "script";
  1362.             var4 = "normal";
  1363.             var3 = "bold-script".equals(var5) ? "bold" : "normal";
  1364.          }
  1365.       } else {
  1366.          try {
  1367.             var2 = "" + (String)this.attribute_stack[3].peek();
  1368.          } catch (EmptyStackException var12) {
  1369.             var2 = AttributeConstants.defaultValue[3];
  1370.          }
  1371.  
  1372.          try {
  1373.             var3 = "" + (String)this.attribute_stack[1].peek();
  1374.          } catch (EmptyStackException var11) {
  1375.             var3 = AttributeConstants.defaultValue[1];
  1376.          }
  1377.  
  1378.          try {
  1379.             var4 = "" + (String)this.attribute_stack[2].peek();
  1380.          } catch (EmptyStackException var10) {
  1381.             var4 = AttributeConstants.defaultValue[2];
  1382.          }
  1383.       }
  1384.  
  1385.       if (this.attributes[82] == null || this.attributes[82].length() == 0) {
  1386.          String var6 = this.attributes[3];
  1387.          if (var6 != null && var6.length() > 0) {
  1388.             var2 = var6;
  1389.          }
  1390.  
  1391.          var6 = this.attributes[1];
  1392.          if (var6 != null && var6.length() > 0) {
  1393.             var3 = var6;
  1394.          }
  1395.  
  1396.          var6 = this.attributes[2];
  1397.          if (var6 != null && var6.length() > 0) {
  1398.             var4 = var6;
  1399.          }
  1400.       }
  1401.  
  1402.       if ("script".equals(var2)) {
  1403.          this.convertFont(0);
  1404.          var2 = "TimesRoman";
  1405.       } else if ("fraktur".equals(var2)) {
  1406.          this.convertFont(1);
  1407.          var2 = "TimesRoman";
  1408.       } else if ("double-struck".equals(var2)) {
  1409.          this.convertFont(2);
  1410.          var2 = "TimesRoman";
  1411.       }
  1412.  
  1413.       int var16 = 0;
  1414.       if ("bold".equals(var3)) {
  1415.          var16 = 1;
  1416.       }
  1417.  
  1418.       if ("italic".equals(var4)) {
  1419.          var16 += 2;
  1420.       } else if (!"normal".equals(var4) && this.data != null && this.data.length == 1) {
  1421.          var16 += 2;
  1422.       }
  1423.  
  1424.       char var7 = this.data != null && this.data.length > 0 ? this.data[0].getChar() : 97;
  1425.       String var8 = var2 + "-p" + var1 + "-s" + var16;
  1426.       if ((var7 < 'A' || var7 > 'Z') && (var7 < 'a' || var7 > 'z') && (!"italic".equals(var4) || var7 < '0' || var7 > '9') && (var7 <= 945 || var7 >= 969)) {
  1427.          int var9 = var16 & -3;
  1428.          var8 = var2 + "-p" + var1 + "-s" + var9;
  1429.          this.field_0 = FontBroker.getFont(var8);
  1430.       } else {
  1431.          this.field_0 = FontBroker.getFont(var8);
  1432.       }
  1433.  
  1434.       if (this.field_0.isItalic()) {
  1435.          this.italic = true;
  1436.       }
  1437.  
  1438.       this.field_1 = this.my_view.getHandler().getComponent().getFontMetrics(this.field_0);
  1439.       this.xheight = (int)(0.63 * (double)this.field_1.getAscent());
  1440.    }
  1441.  
  1442.    private void convertFont(int var1) {
  1443.       int var2 = var1 == 1 ? '\ue4c3' : (var1 == 2 ? '\ue4f7' : (var1 == 0 ? '\ue45b' : 0));
  1444.       int var3 = var1 == 1 ? '\ue4bd' : 0;
  1445.       StringBuffer var4 = new StringBuffer();
  1446.  
  1447.       for(int var5 = 0; var5 < this.udata.length(); ++var5) {
  1448.          if (Character.isUpperCase(this.udata.charAt(var5))) {
  1449.             var4.append((char)(this.udata.charAt(var5) + var2));
  1450.          } else if (var1 == 1 && Character.isLowerCase(this.udata.charAt(var5))) {
  1451.             var4.append((char)(this.udata.charAt(var5) + var3));
  1452.          } else {
  1453.             var4.append(this.udata.charAt(var5));
  1454.          }
  1455.       }
  1456.  
  1457.       this.setUData(var4.toString());
  1458.       this.setData();
  1459.    }
  1460.  
  1461.    public Color resolveColor(int var1) {
  1462.       Color var2 = null;
  1463.       if (this.syntax_info != null) {
  1464.          if ((var1 == 4 || var1 == 79) && this.syntax_info.getFGcolor() != null) {
  1465.             return this.syntax_info.getFGcolor();
  1466.          }
  1467.  
  1468.          if ((var1 == 17 || var1 == 80) && this.syntax_info.getBGcolor() != null) {
  1469.             return this.syntax_info.getBGcolor();
  1470.          }
  1471.       }
  1472.  
  1473.       String var3 = null;
  1474.       if (var1 == 4 || var1 == 79) {
  1475.          var3 = this.getDeprecatedAttributePair(4, 79);
  1476.       }
  1477.  
  1478.       if (var1 == 17 || var1 == 80) {
  1479.          var3 = this.getDeprecatedAttributePair(17, 80);
  1480.       }
  1481.  
  1482.       try {
  1483.          if (ColorDictionary.attribTable.containsKey(var3.toLowerCase())) {
  1484.             var2 = (Color)ColorDictionary.attribTable.get(var3.toLowerCase());
  1485.          } else if (var3.length() == 7 && var3.startsWith("#")) {
  1486.             var2 = new Color(Integer.parseInt(var3.substring(1), 16));
  1487.             ColorDictionary.attribTable.put(var3, var2);
  1488.          } else if (var3.length() == 4 && var3.startsWith("#")) {
  1489.             String var4 = var3.charAt(1) + "0" + var3.charAt(2) + "0" + var3.charAt(3) + "0";
  1490.             var2 = new Color(Integer.parseInt(var4, 16));
  1491.             ColorDictionary.attribTable.put(var3, var2);
  1492.          } else {
  1493.             if (!ColorDictionary.ColorTable.containsKey(var3.toLowerCase())) {
  1494.                var2 = Color.gray;
  1495.                System.out.println("Strange color format: " + var3 + " for attrib " + var1);
  1496.                throw new Exception();
  1497.             }
  1498.  
  1499.             var2 = new Color(Integer.parseInt((String)ColorDictionary.ColorTable.get(var3.toLowerCase()), 16));
  1500.             ColorDictionary.attribTable.put(var3, var2);
  1501.          }
  1502.       } catch (NumberFormatException var6) {
  1503.          System.out.println(var6);
  1504.       } catch (Exception var7) {
  1505.       }
  1506.  
  1507.       return var2;
  1508.    }
  1509.  
  1510.    public String getDeprecatedAttributePair(int var1, int var2) {
  1511.       String var3 = null;
  1512.       if (this.attributes[var2] != null && this.attributes[var2].length() > 0) {
  1513.          var3 = this.attributes[var2];
  1514.       } else if (this.attributes[var1] != null && this.attributes[var1].length() > 0) {
  1515.          var3 = this.attributes[var1];
  1516.       } else {
  1517.          try {
  1518.             var3 = (String)this.attribute_stack[var2].peek();
  1519.          } catch (EmptyStackException var5) {
  1520.          }
  1521.  
  1522.          if (var3 == null || var3.length() == 0) {
  1523.             try {
  1524.                var3 = (String)this.attribute_stack[var1].peek();
  1525.             } catch (EmptyStackException var6) {
  1526.                var3 = AttributeConstants.defaultValue[var2];
  1527.                if (var3 == null || var3.length() == 0) {
  1528.                   var3 = AttributeConstants.defaultValue[var1];
  1529.                }
  1530.             }
  1531.          }
  1532.       }
  1533.  
  1534.       if (var3 != null) {
  1535.          var3.toLowerCase();
  1536.       }
  1537.  
  1538.       return var3.trim();
  1539.    }
  1540.  
  1541.    public int resolveDepth(int var1) {
  1542.       String var2 = this.getAttributeByIndex(20);
  1543.       if (var2.length() > 0) {
  1544.          try {
  1545.             var1 = Integer.parseInt(var2);
  1546.          } catch (NumberFormatException var4) {
  1547.          }
  1548.       }
  1549.  
  1550.       return var1;
  1551.    }
  1552.  
  1553.    public String processUnits(String var1, int var2, int var3) {
  1554.       if ("".equals(var1)) {
  1555.          return "";
  1556.       } else {
  1557.          String var5 = "";
  1558.          float var6 = 1.0F;
  1559.          if (var3 == 9 && var1.trim().equals("infinity")) {
  1560.             return var1;
  1561.          } else {
  1562.             int var4;
  1563.             for(var4 = 0; var4 < var1.length() && !Character.isLetter(var1.charAt(var4)) && var1.charAt(var4) != '%'; ++var4) {
  1564.             }
  1565.  
  1566.             if (var4 == 0) {
  1567.                var5 = var1.toString();
  1568.             } else if (var4 == var1.length()) {
  1569.                var6 = Float.valueOf(var1.trim());
  1570.                var5 = "  ";
  1571.             } else {
  1572.                var5 = var1.substring(var4);
  1573.                var6 = Float.valueOf(var1.substring(0, var4).trim());
  1574.             }
  1575.  
  1576.             return var2 == 2 ? Integer.toString((int)this.convertToEM(var6, var5, var2, var3)) : Float.toString(this.convertToEM(var6, var5, var2, var3));
  1577.          }
  1578.       }
  1579.    }
  1580.  
  1581.    public float convertToEM(float var1, String var2, int var3, int var4) {
  1582.       float var6;
  1583.       int var9;
  1584.       float var5 = 0.0F;
  1585.       var6 = var1;
  1586.       var9 = this.my_view.standardPointsize(this.depth);
  1587.       label127:
  1588.       switch (var2.charAt(0)) {
  1589.          case ' ':
  1590.             return var1;
  1591.          case '%':
  1592.             if (var4 != 14 && var4 != 15 && var4 != 16 && var4 != 5) {
  1593.                String var24 = this.getDefaultAttributeString(var4);
  1594.                if (var24.equals("infinity")) {
  1595.                   return 10000.0F;
  1596.                }
  1597.  
  1598.                var6 = 0.01F * var1 * Float.valueOf(this.getDefaultAttribute(var4));
  1599.                return var6;
  1600.             }
  1601.  
  1602.             int var10;
  1603.             for(var10 = 1; var10 < var2.length() && var2.charAt(var10) == ' '; ++var10) {
  1604.             }
  1605.  
  1606.             if (var2.length() == 1) {
  1607.                var10 = 0;
  1608.             }
  1609.  
  1610.             switch (var2.charAt(var10)) {
  1611.                case 'd':
  1612.                   if (this.field_1 == null) {
  1613.                      this.set_font_internal(this.my_view.standardPointsize(0));
  1614.                   }
  1615.  
  1616.                   int var19 = this.field_1.charWidth('M');
  1617.                   var6 = 0.01F * var1 * (float)this.descent / (float)var19;
  1618.                   break label127;
  1619.                case 'h':
  1620.                   if (this.field_1 == null) {
  1621.                      this.set_font_internal(this.my_view.standardPointsize(0));
  1622.                   }
  1623.  
  1624.                   int var18 = this.field_1.charWidth('M');
  1625.                   var6 = 0.01F * var1 * (float)this.ascent / (float)var18;
  1626.                   break label127;
  1627.                case 'l':
  1628.                   var6 = 0.0F;
  1629.                   break label127;
  1630.                case 'w':
  1631.                   if (this.field_1 == null) {
  1632.                      this.set_font_internal(this.my_view.standardPointsize(0));
  1633.                   }
  1634.  
  1635.                   int var17 = this.field_1.charWidth('M');
  1636.                   var6 = 0.01F * var1 * (float)this.width / (float)var17;
  1637.                   break label127;
  1638.                default:
  1639.                   switch (var4) {
  1640.                      case 5:
  1641.                         var6 = 0.0F;
  1642.                         break label127;
  1643.                      case 14:
  1644.                         if (this.field_1 == null) {
  1645.                            this.set_font_internal(this.my_view.standardPointsize(0));
  1646.                         }
  1647.  
  1648.                         int var22 = this.field_1.charWidth('M');
  1649.                         var6 = 0.01F * var1 * (float)this.width / (float)var22;
  1650.                         break label127;
  1651.                      case 15:
  1652.                         if (this.field_1 == null) {
  1653.                            this.set_font_internal(this.my_view.standardPointsize(0));
  1654.                         }
  1655.  
  1656.                         int var21 = this.field_1.charWidth('M');
  1657.                         var6 = 0.01F * var1 * (float)this.ascent / (float)var21;
  1658.                         break label127;
  1659.                      case 16:
  1660.                         if (this.field_1 == null) {
  1661.                            this.set_font_internal(this.my_view.standardPointsize(0));
  1662.                         }
  1663.  
  1664.                         int var20 = this.field_1.charWidth('M');
  1665.                         var6 = 0.01F * var1 * (float)this.descent / (float)var20;
  1666.                      default:
  1667.                         break label127;
  1668.                   }
  1669.             }
  1670.          case 'c':
  1671.             var6 = 28.3F * var1 / (float)var9;
  1672.             break;
  1673.          case 'd':
  1674.             if (this.field_1 == null) {
  1675.                this.set_font_internal(this.my_view.standardPointsize(0));
  1676.             }
  1677.  
  1678.             int var16 = this.field_1.charWidth('M');
  1679.             var6 = var1 * (float)this.descent / (float)var16;
  1680.             break;
  1681.          case 'e':
  1682.             switch (var2.charAt(1)) {
  1683.                case 'm':
  1684.                   var6 = var1;
  1685.                   break label127;
  1686.                case 'x':
  1687.                   if (this.field_1 == null) {
  1688.                      this.set_font_internal(this.my_view.standardPointsize(0));
  1689.                   }
  1690.  
  1691.                   int var15 = this.field_1.charWidth('M');
  1692.                   int var7 = this.getXHeight();
  1693.                   var6 = var1 * (float)var7 / (float)var15;
  1694.                default:
  1695.                   break label127;
  1696.             }
  1697.          case 'h':
  1698.             if (this.field_1 == null) {
  1699.                this.set_font_internal(this.my_view.standardPointsize(0));
  1700.             }
  1701.  
  1702.             int var14 = this.field_1.charWidth('M');
  1703.             var6 = var1 * (float)this.ascent / (float)var14;
  1704.             break;
  1705.          case 'i':
  1706.             var6 = 72.0F * var1 / (float)var9;
  1707.             break;
  1708.          case 'm':
  1709.             var6 = 2.83F * var1 / (float)var9;
  1710.             break;
  1711.          case 'p':
  1712.             switch (var2.charAt(1)) {
  1713.                case 'c':
  1714.                   var6 = 12.0F * var1 / (float)var9;
  1715.                   break label127;
  1716.                case 't':
  1717.                   var6 = 1.0F * var1 / (float)var9;
  1718.                   break label127;
  1719.                case 'x':
  1720.                   if (this.field_1 == null) {
  1721.                      this.set_font_internal(this.my_view.standardPointsize(0));
  1722.                   }
  1723.  
  1724.                   int var13 = this.field_1.charWidth('M');
  1725.                   var6 = var1 / (float)var13;
  1726.                default:
  1727.                   break label127;
  1728.             }
  1729.          case 'w':
  1730.             if (this.field_1 == null) {
  1731.                this.set_font_internal(this.my_view.standardPointsize(0));
  1732.             }
  1733.  
  1734.             int var8 = this.field_1.charWidth('M');
  1735.             var6 = var1 * (float)this.width / (float)var8;
  1736.             break;
  1737.          default:
  1738.             var6 = var1;
  1739.       }
  1740.  
  1741.       switch (var3) {
  1742.          case 0:
  1743.             return var6;
  1744.          case 1:
  1745.             if (this.field_1 == null) {
  1746.                this.set_font_internal(this.my_view.standardPointsize(0));
  1747.             }
  1748.  
  1749.             int var23 = this.field_1.charWidth('M');
  1750.             int var12 = this.getXHeight();
  1751.             return var6 * (float)var23 / (float)var12;
  1752.          case 2:
  1753.             return var6 * (float)var9;
  1754.          default:
  1755.             return var6;
  1756.       }
  1757.    }
  1758.  
  1759.    public void setSemanticType(int var1) {
  1760.       this.semantic_type = var1;
  1761.    }
  1762.  
  1763.    public void setSemanticForm(int var1) {
  1764.       this.semantic_form = var1;
  1765.    }
  1766.  
  1767.    public void setSemanticPrecedence(int var1) {
  1768.       this.semantic_prec = var1;
  1769.    }
  1770.  
  1771.    public void setSemanticFenceType(int var1) {
  1772.       this.semantic_fencetype = var1;
  1773.    }
  1774.  
  1775.    public int semanticType() {
  1776.       return this.semantic_type;
  1777.    }
  1778.  
  1779.    public int semanticForm() {
  1780.       return this.semantic_form;
  1781.    }
  1782.  
  1783.    public int semanticPrecedence() {
  1784.       return this.semantic_prec;
  1785.    }
  1786.  
  1787.    public int semanticFenceType() {
  1788.       return this.semantic_fencetype;
  1789.    }
  1790.  
  1791.    public String semanticString() {
  1792.       return "{" + this.semantic_type + "}";
  1793.    }
  1794.  
  1795.    protected boolean base_check(Box var1) {
  1796.       String var2 = var1.getClass().getName();
  1797.       return "webeq3.schema.MRow".equals(var2) && var1.embellished_op ? true : baseCheck.containsKey(var2);
  1798.    }
  1799.  
  1800.    public String opLookupString() {
  1801.       Box var1 = this;
  1802.       if (this.embellished_op) {
  1803.          while(this.base_check(var1)) {
  1804.             var1 = var1.getChild(0);
  1805.          }
  1806.       }
  1807.  
  1808.       String var2 = var1.udata;
  1809.       if ("".equals(var1.udata)) {
  1810.          Character var3 = new Character('∩┐╜');
  1811.          var2 = var3.toString();
  1812.       }
  1813.  
  1814.       return var2;
  1815.    }
  1816.  
  1817.    public Node appendChild(Node var1) throws DOMException {
  1818.       if (!(var1 instanceof Box)) {
  1819.          throw new DOMException((short)3, "Appended node must be of type Box.");
  1820.       } else if (this.findChildInTree(this, (Box)var1)) {
  1821.          throw new DOMException((short)3, "This node is already in the tree.");
  1822.       } else {
  1823.          ((Box)var1).my_view = this.my_view;
  1824.          ((Box)var1).parent = this;
  1825.          ((Box)var1).attribute_stack = this.attribute_stack;
  1826.          this.addChild((Box)var1);
  1827.          this.my_view.redraw();
  1828.          this.my_view.applet.repaint();
  1829.          return var1;
  1830.       }
  1831.    }
  1832.  
  1833.    public Node cloneNode(boolean var1) {
  1834.       Box var2 = this.getCopy();
  1835.       if (!var1) {
  1836.          var2.children.removeAllElements();
  1837.       }
  1838.  
  1839.       return var2;
  1840.    }
  1841.  
  1842.    public MathMLElement createMathMLElement(String var1) {
  1843.       return null;
  1844.    }
  1845.  
  1846.    public String getAttribute(String var1) {
  1847.       MathMLDOMAttribute var2 = null;
  1848.       if (this.attribute_map != null) {
  1849.          var2 = (MathMLDOMAttribute)this.attribute_map.getNamedItem(var1);
  1850.       }
  1851.  
  1852.       return var2 != null ? var2.getValue() : "no such attribute";
  1853.    }
  1854.  
  1855.    public void setAttribute(String var1, String var2) throws DOMException {
  1856.       this.setAttributeByName(var1, var2);
  1857.       this.my_view.redraw();
  1858.       this.my_view.applet.repaint();
  1859.    }
  1860.  
  1861.    public void removeAttribute(String var1) throws DOMException {
  1862.       if (this.attribute_map != null && this.attribute_map.getNamedItem(var1) != null) {
  1863.          int var2 = this.my_view.lookupIndex(var1);
  1864.          if (var2 > -1) {
  1865.             AttributeConstants.attribute_names[var2] = "";
  1866.          }
  1867.  
  1868.          if (this.attribute_map != null) {
  1869.             this.attribute_map.removeNamedItem(var1);
  1870.          }
  1871.  
  1872.       } else {
  1873.          throw new DOMException((short)8, "Can't remove attribute: not in attribute list");
  1874.       }
  1875.    }
  1876.  
  1877.    public NamedNodeMap getAttributes() {
  1878.       return this.attribute_map;
  1879.    }
  1880.  
  1881.    public String getAttributeNS(String var1, String var2) {
  1882.       return null;
  1883.    }
  1884.  
  1885.    public void setAttributeNS(String var1, String var2, String var3) throws DOMException {
  1886.    }
  1887.  
  1888.    public void removeAttributeNS(String var1, String var2) throws DOMException {
  1889.    }
  1890.  
  1891.    public Attr getAttributeNode(String var1) {
  1892.       return this.attribute_map != null ? (Attr)this.attribute_map.getNamedItem(var1) : null;
  1893.    }
  1894.  
  1895.    public Attr setAttributeNode(Attr var1) throws DOMException {
  1896.       if (var1 != null) {
  1897.          if (this.my_view.attributeInUse((MathMLDOMAttribute)var1)) {
  1898.             throw new DOMException((short)10, "This attribute node is already in use.");
  1899.          } else {
  1900.             this.setAttributeByName(var1.getName(), var1.getValue());
  1901.             this.my_view.redraw();
  1902.             this.my_view.applet.repaint();
  1903.             return (Attr)this.attribute_map.getNamedItem(var1.getName());
  1904.          }
  1905.       } else {
  1906.          return null;
  1907.       }
  1908.    }
  1909.  
  1910.    public Attr removeAttributeNode(Attr var1) throws DOMException {
  1911.       if (this.attribute_map != null && this.attribute_map.getNamedItem(var1.getName()) != null) {
  1912.          return this.attribute_map != null ? (Attr)this.attribute_map.removeNamedItem(var1.getName()) : null;
  1913.       } else {
  1914.          throw new DOMException((short)8, "Can't remove attribute: not in attribute list");
  1915.       }
  1916.    }
  1917.  
  1918.    public Attr getAttributeNodeNS(String var1, String var2) {
  1919.       return null;
  1920.    }
  1921.  
  1922.    public Attr setAttributeNodeNS(Attr var1) throws DOMException {
  1923.       return null;
  1924.    }
  1925.  
  1926.    public NodeList getChildNodes() {
  1927.       MathMLDOMNodeList var1 = new MathMLDOMNodeList();
  1928.       int var2 = this.children.size();
  1929.  
  1930.       for(int var3 = 0; var3 < var2; ++var3) {
  1931.          var1.addNode((Node)this.children.elementAt(var3));
  1932.       }
  1933.  
  1934.       return var1;
  1935.    }
  1936.  
  1937.    public NodeList getElementsByTagName(String var1) {
  1938.       boolean var2 = false;
  1939.       if (var1.equals("*")) {
  1940.          var2 = true;
  1941.       }
  1942.  
  1943.       MathMLDOMNodeList var3 = new MathMLDOMNodeList();
  1944.       this.makeElementList(this, var3, var1, var2);
  1945.       return var3;
  1946.    }
  1947.  
  1948.    public NodeList getElementsByTagNameNS(String var1, String var2) {
  1949.       return null;
  1950.    }
  1951.  
  1952.    public final Node getFirstChild() {
  1953.       return this.children.size() > 0 ? (Node)this.children.firstElement() : null;
  1954.    }
  1955.  
  1956.    public final Node getLastChild() {
  1957.       return this.children.size() > 0 ? (Node)this.children.lastElement() : null;
  1958.    }
  1959.  
  1960.    public String getLocalName() {
  1961.       return "#element";
  1962.    }
  1963.  
  1964.    public String getNamespaceURI() {
  1965.       return null;
  1966.    }
  1967.  
  1968.    public final Node getNextSibling() {
  1969.       if (this.parent != null) {
  1970.          return this.box_id < this.parent.getNumChildren() - 1 ? this.parent.getChild(this.box_id + 1) : null;
  1971.       } else {
  1972.          return null;
  1973.       }
  1974.    }
  1975.  
  1976.    public String getNodeName() {
  1977.       return "#element";
  1978.    }
  1979.  
  1980.    public final short getNodeType() {
  1981.       return 1;
  1982.    }
  1983.  
  1984.    public String getNodeValue() throws DOMException {
  1985.       return this.adata;
  1986.    }
  1987.  
  1988.    public void setNodeValue(String var1) throws DOMException {
  1989.       this.adata = var1;
  1990.       this.udata = var1;
  1991.       this.setData();
  1992.    }
  1993.  
  1994.    public final Document getOwnerDocument() {
  1995.       return this.my_view;
  1996.    }
  1997.  
  1998.    public final Node getParentNode() {
  1999.       return this.parent;
  2000.    }
  2001.  
  2002.    public final Node getPreviousSibling() {
  2003.       if (this.parent != null) {
  2004.          return this.box_id > 0 ? this.parent.getChild(this.box_id - 1) : null;
  2005.       } else {
  2006.          return null;
  2007.       }
  2008.    }
  2009.  
  2010.    public String getPrefix() {
  2011.       return null;
  2012.    }
  2013.  
  2014.    public void setPrefix(String var1) throws DOMException {
  2015.    }
  2016.  
  2017.    public String getTagName() {
  2018.       return this.make_tag("");
  2019.    }
  2020.  
  2021.    public boolean hasAttribute(String var1) {
  2022.       return this.attribute_map != null && this.attribute_map.getNamedItem(var1) != null;
  2023.    }
  2024.  
  2025.    public boolean hasAttributeNS(String var1, String var2) {
  2026.       return false;
  2027.    }
  2028.  
  2029.    public final boolean hasChildNodes() {
  2030.       return this.children.size() > 0;
  2031.    }
  2032.  
  2033.    public Node insertBefore(Node var1, Node var2) throws DOMException {
  2034.       for(Box var3 = this.parent; var3 != null; var3 = var3.parent) {
  2035.          if (var3 == var1) {
  2036.             throw new DOMException((short)3, "Attempting to insert an ancestor of this node");
  2037.          }
  2038.       }
  2039.  
  2040.       if (var2 != null) {
  2041.          boolean var4 = false;
  2042.  
  2043.          for(int var5 = 0; var5 < this.children.size() && !var4; ++var5) {
  2044.             if (this.children.elementAt(var5) == var2) {
  2045.                var4 = true;
  2046.             }
  2047.          }
  2048.  
  2049.          if (!var4) {
  2050.             throw new DOMException((short)3, "Reference node is not a child of this node");
  2051.          }
  2052.       }
  2053.  
  2054.       if (var2 == null) {
  2055.          return this.appendChild(var1);
  2056.       } else {
  2057.          this.removeChildFromTree(this, (Box)var1);
  2058.          this.children.insertElementAt(var1, this.children.indexOf(var2));
  2059.          this.my_view.redraw();
  2060.          this.my_view.applet.repaint();
  2061.          return var1;
  2062.       }
  2063.    }
  2064.  
  2065.    public void normalize() {
  2066.    }
  2067.  
  2068.    public Node removeChild(Node var1) throws DOMException {
  2069.       if (this.children.removeElement(var1)) {
  2070.          this.my_view.redraw();
  2071.          this.my_view.applet.repaint();
  2072.          return var1;
  2073.       } else {
  2074.          throw new DOMException((short)8, "Child not found");
  2075.       }
  2076.    }
  2077.  
  2078.    public Node replaceChild(Node var1, Node var2) throws DOMException {
  2079.       for(Box var3 = this.parent; var3 != null; var3 = var3.parent) {
  2080.          if (var3 == var1) {
  2081.             throw new DOMException((short)3, "Attempting to replace with an ancestor of this node");
  2082.          }
  2083.       }
  2084.  
  2085.       boolean var4 = false;
  2086.  
  2087.       for(int var5 = 0; var5 < this.children.size() && !var4; ++var5) {
  2088.          if (this.children.elementAt(var5) == var2) {
  2089.             var4 = true;
  2090.          }
  2091.       }
  2092.  
  2093.       if (!var4) {
  2094.          throw new DOMException((short)3, "Node to replace is not a child of this node");
  2095.       } else {
  2096.          this.children.setElementAt(var1, ((Box)var2).box_id);
  2097.          this.my_view.redraw();
  2098.          this.my_view.applet.repaint();
  2099.          return var1;
  2100.       }
  2101.    }
  2102.  
  2103.    public boolean supports(String var1, String var2) {
  2104.       return false;
  2105.    }
  2106.  
  2107.    public MathMLElement getArgument(long var1) {
  2108.       return null;
  2109.    }
  2110.  
  2111.    public MathMLElement setArgument(MathMLElement var1, long var2) {
  2112.       return null;
  2113.    }
  2114.  
  2115.    public MathMLElement insertArgument(MathMLElement var1, long var2) {
  2116.       return null;
  2117.    }
  2118.  
  2119.    public void deleteArgument(long var1) {
  2120.    }
  2121.  
  2122.    public MathMLElement removeArgument(long var1) {
  2123.       return null;
  2124.    }
  2125.  
  2126.    private void makeAttributeMap() {
  2127.       this.attribute_map = new MathMLDOMNamedNodeMap();
  2128.       Object var1 = null;
  2129.  
  2130.       for(int var2 = 0; var2 < 86; ++var2) {
  2131.          String var4;
  2132.          if (this.attributes[var2] != null && this.attributes[var2].length() > 0) {
  2133.             var4 = this.attributes[var2];
  2134.          } else {
  2135.             var4 = null;
  2136.          }
  2137.  
  2138.          if (var4 != null && var4.length() > 0) {
  2139.             MathMLDOMAttribute var3 = new MathMLDOMAttribute(this.my_view, AttributeConstants.attribute_names[var2], var2);
  2140.             var3.setValue(var4);
  2141.             this.attribute_map.addNode(var3);
  2142.          }
  2143.       }
  2144.  
  2145.    }
  2146.  
  2147.    public final void setAttributeByName(String var1, String var2) {
  2148.       if (var1 != null) {
  2149.          int var3 = this.my_view.lookupIndex(var1);
  2150.          if (var3 > -1) {
  2151.             this.setAttribute(var3, var2);
  2152.          } else {
  2153.             MathMLDOMAttribute var4 = new MathMLDOMAttribute(this.my_view, var1, -1);
  2154.             var4.setValue(var2);
  2155.             if (this.attribute_map != null) {
  2156.                this.attribute_map.setNamedItem(var4);
  2157.             } else {
  2158.                this.makeAttributeMap();
  2159.                this.attribute_map.setNamedItem(var4);
  2160.             }
  2161.          }
  2162.       }
  2163.  
  2164.    }
  2165.  
  2166.    private void makeElementList(Box var1, MathMLDOMNodeList var2, String var3, boolean var4) {
  2167.       if (var1 != null) {
  2168.          if (var4 || var1.make_tag("").equals(var3)) {
  2169.             var2.addNode(var1);
  2170.          }
  2171.  
  2172.          if (var1.children.size() > 0) {
  2173.             for(int var5 = 0; var5 < var1.children.size(); ++var5) {
  2174.                Box var6 = (Box)var1.children.elementAt(var5);
  2175.                this.makeElementList(var6, var2, var3, var4);
  2176.             }
  2177.          }
  2178.       }
  2179.  
  2180.    }
  2181.  
  2182.    private void removeChildFromTree(Box var1, Box var2) throws DOMException {
  2183.       if (var2 == var1) {
  2184.          if (var2.parent == null) {
  2185.             throw new DOMException((short)3, "Can't remove a node that doesn't have a parent");
  2186.          }
  2187.  
  2188.          this.parent.removeChild(var2);
  2189.       } else {
  2190.          for(int var3 = 0; var3 < var1.children.size(); ++var3) {
  2191.             Box var4 = (Box)this.children.elementAt(var3);
  2192.             this.removeChildFromTree(var4, var2);
  2193.          }
  2194.       }
  2195.  
  2196.    }
  2197.  
  2198.    private boolean findChildInTree(Box var1, Box var2) {
  2199.       if (var2 == var1) {
  2200.          if (var2.parent != null) {
  2201.             return true;
  2202.          }
  2203.       } else {
  2204.          for(int var3 = 0; var3 < var1.children.size(); ++var3) {
  2205.             Box var4 = (Box)this.children.elementAt(var3);
  2206.             if (this.findChildInTree(var4, var2)) {
  2207.                return true;
  2208.             }
  2209.          }
  2210.       }
  2211.  
  2212.       return false;
  2213.    }
  2214.  
  2215.    static {
  2216.       baseCheck.put("webeq3.schema.MSubsup", baseCheck);
  2217.       baseCheck.put("webeq3.schema.MSub", baseCheck);
  2218.       baseCheck.put("webeq3.schema.MSup", baseCheck);
  2219.       baseCheck.put("webeq3.schema.MUnderover", baseCheck);
  2220.       baseCheck.put("webeq3.schema.MUnder", baseCheck);
  2221.       baseCheck.put("webeq3.schema.MOver", baseCheck);
  2222.       baseCheck.put("webeq3.schema.MFrac", baseCheck);
  2223.    }
  2224. }
  2225.