001: package com.xoetrope.export;
002:
003: import com.xoetrope.export.html.HTMLFreeFormItem;
004: import com.xoetrope.export.pdf.PdfExporter;
005: import com.xoetrope.export.xl.XLFreeFormItem;
006: import java.util.ArrayList;
007: import java.util.Enumeration;
008: import java.util.Properties;
009: import java.util.Vector;
010: import javax.swing.JTable;
011: import javax.swing.table.TableModel;
012: import net.xoetrope.xml.XmlElement;
013: import net.xoetrope.xml.nanoxml.NanoXmlElement;
014: import net.xoetrope.xui.XProject;
015: import net.xoetrope.xui.data.XBaseModel;
016: import net.xoetrope.xui.helper.XTranslator;
017:
018: /**
019: * Creates an Export based on a template declaration.
020: *
021: * <p> Copyright (c) Xoetrope Ltd., 2001-2006, This software is licensed under
022: * the GNU Public License (GPL), please see license.txt for more details. If
023: * you make commercial use of this software you must purchase a commercial
024: * license from Xoetrope.</p>
025: * <p> $Revision: 1.10 $</p>
026: */
027: public class TemplateExporter {
028: private XBaseModel rootModel;
029: private Exporter exporter;
030: private XTranslator translator;
031:
032: private int exportType;
033: private ArrayList marginList;
034: private boolean marginsSet;
035:
036: public TemplateExporter(XProject currentProject, Object instance,
037: String name, int type) {
038: this (currentProject, instance, XMLHelper.readXml(
039: currentProject, name), type, null);
040: }
041:
042: public TemplateExporter(XProject currentProject, Object instance,
043: XmlElement rootElement, int type, ArrayList marginList) {
044: translator = currentProject.getTranslator();
045: exportType = type;
046:
047: exporter = exporter.getExporter(currentProject, instance, type);
048:
049: if (marginList != null) {
050: PdfExporter pdfExporter = (PdfExporter) exporter;
051: pdfExporter.setProperties(marginList);
052: }
053:
054: Vector children = rootElement.getChildren();
055: int numChildren = children.size();
056: for (int i = 0; i < numChildren; i++) {
057: XmlElement childEle = (XmlElement) children.get(i);
058: processBlock(exporter, childEle, type);
059: }
060: }
061:
062: // 19-10-06 Sets the margin properties of the pdf
063: public void setPdfProperties(ArrayList marginList) {
064: this .marginList = marginList;
065: }
066:
067: protected void processBlock(Exporter exporter, XmlElement block,
068: int exportType) {
069: boolean include = true;
070: String includeStr = block.getAttribute("include");
071: if (includeStr != null)
072: include = ((Boolean) exporter.evaluate(includeStr))
073: .booleanValue();
074:
075: if (include)
076: writeBlock(block, exportType);
077: }
078:
079: protected void writeBlock(XmlElement block, int type) {
080: String exportType = block.getAttribute("exporter");
081: String tag = block.getName();
082: if (exportType == null)
083: exportType = tag;
084:
085: if ("type".equals(tag)) {
086: // Output blocks matching the content type of the exporter
087: Vector blocks = block.getChildren();
088: int numChildren = blocks.size();
089: for (int i = 0; i < numChildren; i++) {
090: XmlElement childEle = (XmlElement) blocks.get(i);
091: if (childEle.getName().equals("type")) {
092: String id = childEle.getAttribute("content");
093: if (id.equals(exporter.getContentType()))
094: writeBlock(childEle, type);
095: }
096: }
097: } else if ("Table".equals(exportType)) {
098: TableBlock tableExport = exporter.getTableBlock();
099: Vector rows = block.getChildren();
100: int numRows = rows.size();
101: for (int row = 0; row < numRows; row++) {
102: XmlElement rowEle = (XmlElement) rows.get(row);
103: RowBlock rowBlock = tableExport.addRow();
104: Vector cells = rowEle.getChildren();
105: int numCells = cells.size();
106: for (int cell = 0; cell < numCells; cell++) {
107: XmlElement cellEle = (XmlElement) cells.get(cell);
108: int colspan = XMLHelper.getAttribAsInt(cellEle,
109: "colspan", 1);
110: int rowspan = XMLHelper.getAttribAsInt(cellEle,
111: "rowspan", 1);
112: String text = cellEle.getAttribute("value");
113: String style = cellEle.getAttribute("style");
114: Block cellBlockItem;
115: if ((text != null) && (text.indexOf("${") > -1)) {
116: String bindingText = text.substring(2, text
117: .length() - 1);
118: text = exporter.evaluatePath(bindingText);
119: String attrib = cellEle.getAttribute("attrib");
120: cellBlockItem = rowBlock.addCell(tableExport
121: .getDataBinding(bindingText, attrib)
122: .get(), style, colspan, rowspan);
123: } else {
124: text = translator.translate(text);
125: cellBlockItem = rowBlock.addCell(text, style,
126: colspan, rowspan);
127: }
128: setItemAttribs(cellEle, (Block) cellBlockItem);
129: }
130: }
131: exporter.addBlock(tableExport);
132: } else if ("TableModel".equals(exportType)) {
133: String includeheader = block.getAttribute("includeheader");
134: TableModelBlock tmExporter = exporter.getTableModelBlock();
135: String table = block.getAttribute("table");
136: String tableWidth = block.getAttribute("width");
137: String tableModel = block.getAttribute("tablemodel");
138: String style = block.getAttribute("style");
139: String headerStyle = block.getAttribute("headerstyle");
140: tmExporter.setTableStyle(style);
141: tmExporter.setHeaderStyle(headerStyle);
142: tmExporter.setWidth(tableWidth);
143: JTable tableComp = (JTable) exporter.evaluate(table);
144: TableModel tableMdl = null;
145: if (tableModel != null)
146: tableMdl = (TableModel) exporter.evaluate(tableModel);
147: tmExporter.exportModel(tableComp, tableMdl,
148: includeheader == null ? false : (includeheader
149: .compareTo("true") == 0));
150: exporter.addBlock(tmExporter);
151: } else if ("ArrayArray".equals(exportType)) {
152: String includeheader = block.getAttribute("includeheader");
153: ArrayArrayBlock aaExporter = exporter.getArrayArrayBlock();
154: String table = block.getAttribute("table");
155: String tableWidth = block.getAttribute("width");
156: String tableModel = block.getAttribute("tablemodel");
157: String style = block.getAttribute("style");
158: String headerStyle = block.getAttribute("headerstyle");
159: aaExporter.setTableStyle(style);
160: aaExporter.setHeaderStyle(headerStyle);
161: aaExporter.setWidth(tableWidth);
162: ArrayList tableComp = (ArrayList) exporter.evaluate(table);
163: aaExporter.exportModel(tableComp,
164: includeheader == null ? false : (includeheader
165: .compareTo("true") == 0));
166: exporter.addBlock(aaExporter);
167: } else if ("FreeForm".equals(exportType)
168: || "p".equals(exportType)) {
169: Block freeFormExport = exporter.getFreeFormBlock();
170: Vector items = block.getChildren();
171: int numItems = items.size();
172: for (int item = 0; item < numItems; item++) {
173: XmlElement itemEle = (XmlElement) items.get(item);
174: exportBlockItem(itemEle, freeFormExport, type);
175: }
176: String tagName = block.getName();
177: String value = block.getContent();
178: value = exporter.evaluatePath(value);
179: String style = block.getAttribute("style");
180: freeFormExport.setTag(tagName);
181: freeFormExport.setValue(value);
182: freeFormExport.setStyle(style);
183: setItemAttribs(block, freeFormExport);
184: exporter.addBlock((Block) freeFormExport);
185: }
186: }
187:
188: private Block exportBlockItem(XmlElement element, Block parentItem,
189: int type) {
190: String tagName = element.getAttribute("tag");
191: String tag = element.getName();
192: if (tagName == null)
193: tagName = tag;
194: String value = exporter.evaluate(element.getAttribute("value"))
195: .toString();
196: String style = exporter.evaluate(element.getAttribute("style"))
197: .toString();
198: if (value.length() == 0)
199: value = element.getContent();
200:
201: Block blockItem = null;
202: if (type == Exporter.HTML_EXPORTER)
203: blockItem = parentItem.append(tagName);
204: else if (type == Exporter.XL_EXPORTER)
205: blockItem = parentItem.append(tagName);
206: else
207: blockItem = parentItem.append(tagName);
208:
209: blockItem.setValue(value);
210: blockItem.setStyle(style);
211: setItemAttribs(element, blockItem);
212:
213: Vector items = element.getChildren();
214: int numItems = items.size();
215: for (int item = 0; item < numItems; item++) {
216: XmlElement childEle = (XmlElement) items.get(item);
217: exportBlockItem(childEle, blockItem, type);
218: }
219:
220: return blockItem;
221: }
222:
223: private void setItemAttribs(XmlElement itemEle, Block blockItem) {
224: for (int attrib = 0; attrib < itemEle.getAttributeCount(); attrib++) {
225: Properties props = ((NanoXmlElement) itemEle).getElement()
226: .getAttributes();
227: Enumeration attribKeys = props.keys();
228: while (attribKeys.hasMoreElements()) {
229: String attribKey = (String) attribKeys.nextElement();
230: if (attribKey.equals("value")
231: || attribKey.equals("style")
232: || attribKey.equals("colspan")
233: || attribKey.equals("rowspan"))
234: continue;
235: else {
236: String attribValue = exporter.evaluate(
237: (String) props.get(attribKey)).toString();
238: blockItem.setAttrib(attribKey, attribValue);
239: }
240: }
241: }
242: }
243:
244: public void writeToFile(String filename) {
245: exporter.export(filename);
246: }
247: }
|