private void appendZone(Document doc, Element parent, BxZone zone, Object... hints) throws TransformationException { Element node = doc.createElement("Zone"); appendPropertyIfNotNull(doc, node, "ZoneID", zone.getId()); appendBounds(doc, node, "ZoneCorners", zone.getBounds(), hints); appendPropertyIfNotNull(doc, node, "ZoneNext", zone.getNextId()); Element insetsNode = doc.createElement("ZoneInsets"); insetsNode.setAttribute("Top", ""); insetsNode.setAttribute("Bottom", ""); insetsNode.setAttribute("Left", ""); insetsNode.setAttribute("Right", ""); node.appendChild(insetsNode); appendProperty(doc, node, "ZoneLines", ""); if (zone.getLabel() != null) { if (ZONE_LABEL_MAP.get(zone.getLabel()) != null && !ZONE_LABEL_MAP.get(zone.getLabel()).isEmpty()) { appendClassification(doc, node, ZONE_LABEL_MAP.get(zone.getLabel()).toUpperCase(), ""); } else { throw new TransformationException("Writing down an unknown zone label: " + zone.getLabel()); } } for (BxLine line : zone.getLines()) { appendLine(doc, node, line, hints); } parent.appendChild(node); }
private BxPage parsePageNode(Element elem) { BxPage page = new BxPage(); double minX = 0, minY = 0, maxX = 0, maxY = 0; boolean started = false; List<Element> e = getChildren("Zone", elem); for (Element zo : e) { BxZone zon = parseZoneNode(zo); page.addZone(zon); BxBounds zoneBounds = zon.getBounds(); if (!started) { minX = zoneBounds.getX(); minY = zoneBounds.getY(); maxX = zoneBounds.getX() + zoneBounds.getWidth(); maxY = zoneBounds.getY() + zoneBounds.getHeight(); started = true; } if (zoneBounds.getX() < minX) { minX = zoneBounds.getX(); } if (zoneBounds.getX() + zoneBounds.getWidth() > maxX) { maxX = zoneBounds.getX() + zoneBounds.getWidth(); } if (zoneBounds.getY() < minY) { minY = zoneBounds.getY(); } if (zoneBounds.getY() + zoneBounds.getHeight() > maxY) { maxY = zoneBounds.getY() + zoneBounds.getHeight(); } } Collections.sort( page.getZones(), new Comparator() { @Override public int compare(Object t, Object t1) { BxZone z1 = (BxZone) t; BxZone z2 = (BxZone) t1; int ret = Double.compare(z1.getBounds().getY(), z2.getBounds().getY()); if (ret == 0) { ret = Double.compare(z1.getBounds().getX(), z2.getBounds().getX()); } return ret; } }); return page.setBounds(new BxBounds(minX, minY, maxX - minX, maxY - minY)); }