@Override protected void initChildren(Element eThis) throws OmException { Node nPrevious = eThis.getPreviousSibling(); if (nPrevious != null && nPrevious instanceof Text) { String sText = ((Text) nPrevious).getData(); if (sText.length() > 0 && Character.isWhitespace(sText.charAt(sText.length() - 1))) bSpaceBefore = true; } Node nAfter = eThis.getNextSibling(); if (nAfter != null && nAfter instanceof Text) { String sText = ((Text) nAfter).getData(); if (sText.length() > 0 && Character.isWhitespace(sText.charAt(0))) bSpaceAfter = true; } List<Place> lPlaces = new LinkedList<Place>(); int iPlace = 0; StringBuffer sbText = new StringBuffer(); for (Node n = eThis.getFirstChild(); n != null; n = n.getNextSibling()) { if (n instanceof Element) { Element eplace = (Element) n; if (!eplace.getTagName().equals("eplace")) throw new OmFormatException("<equation> may only contain text and <eplace> tags"); Element[] aeChildren = XML.getChildren(eplace); QComponent qcChild; boolean bImplicit = false; if (aeChildren.length != 1) // Treats more than one child as inside <t> { qcChild = getQDocument().build(this, eplace, "t"); bImplicit = true; } else // Treats single child as specific component (auto-sizing works) qcChild = getQDocument().build(this, aeChildren[0], null); addChild(qcChild); // Must be stored in standard child array so it // can be found etc. // See if width/height is specified int iWidth, iHeight; if (eplace.hasAttribute("width") && eplace.hasAttribute("height")) { try { iWidth = Integer.parseInt(eplace.getAttribute("width")); iHeight = Integer.parseInt(eplace.getAttribute("height")); } catch (NumberFormatException nfe) { throw new OmFormatException("<equation> <eplace>: width= and height= must be integers"); } } else { Dimension d = qcChild.getApproximatePixelSize(); if (d == null) throw new OmFormatException( "<equation> <eplace>: Except for components that support automatic " + "size estimation and fixing, <eplace> must include width= and height="); iWidth = d.width; iHeight = d.height; } Place p = new Place(); p.sID = "p" + (iPlace++); p.qc = qcChild; p.iWidth = iWidth; p.iHeight = iHeight; p.bImplicit = bImplicit; if (!eplace.hasAttribute("label")) throw new OmFormatException("<equation> <eplace>: Must include label="); if (eplace.hasAttribute("label")) p.sLabel = eplace.getAttribute("label"); else p.sLabel = null; if (eplace.hasAttribute("for")) p.sLabelFor = eplace.getAttribute("for"); else if (qcChild instanceof Labelable) p.sLabelFor = qcChild.getID(); lPlaces.add(p); // Add in the equation format text representing the placeholder sbText.append("\\placeholder{" + p.sID + "}{" + p.iWidth + "," + p.iHeight + "}"); } else if (n instanceof Text) { sbText.append(n.getNodeValue()); } } sEquation = sbText.toString(); apPlaces = lPlaces.toArray(new Place[0]); }