1 package jimm.datavision.layout; 2 import jimm.datavision.*; 3 import jimm.datavision.field.*; 4 import jimm.util.StringUtils; 5 import java.io.*; 6 import java.util.*; 7 8 13 class DocBookCol { 14 15 Field field; 16 double x; 17 double width; 18 19 22 DocBookCol(Field field, double x, double width) { 23 this.field = field; 24 this.x = x; 25 this.width = width; 26 } 27 28 31 void output(PrintWriter out) { 32 if (field == null || !field.isVisible()) { 33 out.println("<entry></entry>"); 34 return; 35 } 36 37 String str = field.toString(); 38 39 Format format = field.getFormat(); 40 out.print("<entry align=\"" + Format.alignToString(format.getAlign()) 41 + "\">"); 42 43 if (format.isBold()) out.print("<emphasis role=\"bold\">"); 45 if (format.isItalic()) out.print("<replaceable>"); 46 48 out.print(StringUtils.escapeXML(str)); 49 50 if (format.isItalic()) out.print("</replaceable>"); 52 if (format.isBold()) out.print("</emphasis>"); 53 55 out.println("</entry>"); 56 } 57 58 } 59 60 64 public class DocBookLE extends SortedLayoutEngine { 65 66 protected HashMap sectionCols; 67 68 73 public DocBookLE(PrintWriter out) { 74 super(out); 75 } 76 77 80 protected void doStart() { 81 sectionCols = new HashMap(); 82 out.println("<!DOCTYPE informaltable PUBLIC \"-//OASIS//DTD DocBook V3.1//EN\">"); 83 out.println("<!-- Generated by DataVision version " + info.Version 84 + " -->"); 85 out.println("<!-- " + info.URL + " -->"); 86 out.println("<informaltable colsep=\"1\" rowsep=\"1\">"); 87 } 88 89 92 protected void doEnd() { 93 out.println("</informaltable>"); 94 } 95 96 99 protected void doStartPage() { 100 if (pageNumber > 1) 102 out.println("<beginpage pagenum=\"" + pageNumber + "\">"); 103 out.println("<!-- ======== Page " + pageNumber + " ======== -->"); 104 } 105 106 111 protected void doOutputSection(Section sect) { 112 Collection cols = calcSectionCols(sect); 113 if (cols.isEmpty()) 114 return; 115 116 out.println("<tgroup cols=" + cols.size() + ">"); 117 118 int i = 1; 120 for (Iterator iter = cols.iterator(); iter.hasNext(); ++i) { 121 DocBookCol col = (DocBookCol)iter.next(); 122 out.println("<colspec colname=c" + i + " colwidth=\"" 123 + col.width + "\">"); 124 } 125 126 out.println("<tbody>"); 128 out.println("<row>"); 129 for (Iterator iter = cols.iterator(); iter.hasNext(); ++i) { 130 DocBookCol col = (DocBookCol)iter.next(); 131 col.output(out); 132 } 133 out.println("</row>"); 134 out.println("</tbody>"); 135 136 out.println("</tgroup>"); 137 } 138 139 142 protected void doOutputField(Field field) {} 143 144 147 protected void doOutputImage(ImageField image) {} 148 149 152 protected void doOutputLine(Line line) {} 153 154 160 protected Collection calcSectionCols(Section sect) { 161 Collection cols = null; 162 if ((cols = (Collection)sectionCols.get(sect)) != null) 163 return cols; 164 165 cols = new ArrayList(); 166 double x = 0; 167 for (Iterator iter = sect.fields(); iter.hasNext(); ) { 169 Field f = (Field)iter.next(); 170 Rectangle bounds = f.getBounds(); 171 if (bounds.x > x) { 172 cols.add(new DocBookCol(null, x, bounds.x - x)); 173 x = bounds.x; 174 } 175 cols.add(new DocBookCol(f, bounds.x, bounds.width)); 176 x += bounds.width; 177 } 178 179 sectionCols.put(sect, cols); 180 return cols; 181 } 182 183 } 184 | Popular Tags |