01: package dinamica;
02:
03: /**
04: * Prints recordset in tabular format using
05: * horizontal direction, meaning that each row
06: * from the recordset will fill a cell until
07: * the maximum nimber of cells is reached, then
08: * a new row will be appended to the table. It may
09: * be used to print products catalog with pictures
10: * and things like that.<br><br>
11: * The Actions using this class are supposed to be INCLUDED
12: * by other Actions, using the include marker ${inc:/action/xyz?param=value},
13: * it was not designed to produce a complete page, just a part of it,
14: * a grid with horizontal data direction, to be more specific. Actions
15: * using this Output class must define the following elements in config.xml,
16: * under the root element:<br><br>
17: * <xmp>
18: * <row-template>row.htm</row-template>
19: * <col-template>col.htm</col-template>
20: * <cols>3</cols>
21: * <hgrid-recordset>myRecordset.sql</hgrid-recordset>
22: * </xmp>
23: * <br><br>
24: * Of course you can adjust these elements's values to
25: * meet your requirements.
26: * <br><br>
27: * Most of the time, the Action using this Output class
28: * will require only one recordset, which must be created
29: * by the parent Action (the one that includes the others)
30: * and saved into a request attribute, which means that this
31: * class must retrieve the recordset from the request
32: * object.
33: * <br><br>
34: * This class requires a basic template (defined in the output block in config.xml),
35: * like any other text-based output that inherits from dinamica.GenericOutput,
36: * invokes super.print() before proceeding to create its own output. This template
37: * should contain the surrounding HTML code for the table, and a dummy marker
38: * named ${hgrid} where the actual generated HGrid will be printed.
39: * <br><br>
40: * Creation date: 09/07/2005
41: * (c) 2005 Martin Cordova<br>
42: * This code is released under the LGPL license<br>
43: * Dinamica Framework - http://www.martincordova.com<br>
44: * @author Martin Cordova (dinamica@martincordova.com)
45: */
46: public class HGridOutput extends GenericOutput {
47:
48: public void print(TemplateEngine te, GenericTransaction data)
49: throws Throwable {
50:
51: //read config values
52: String rsName = getConfig().getConfigValue("hgrid-recordset");
53: int cols = Integer.parseInt(getConfig().getConfigValue("cols"));
54: Recordset rs = (Recordset) getRequest().getAttribute(rsName);
55: String tRow = getResource(getConfig().getConfigValue(
56: "row-template"));
57: String tCol = getResource(getConfig().getConfigValue(
58: "col-template"));
59:
60: //navigate recordset and create String containing
61: //hgrid body
62: StringBuffer hgrid = new StringBuffer();
63: rs.top();
64: for (int k = 0; k < rs.getRecordCount(); k = k + cols) {
65: StringBuffer colsBuf = new StringBuffer();
66: for (int i = 0; i < cols; i++) {
67: if (k + i == rs.getRecordCount()) {
68: for (int j = i; j < cols; j++) {
69: colsBuf.append("<td></td>");
70: }
71: break;
72: }
73: rs.setRecordNumber(k + i);
74: TemplateEngine t = new TemplateEngine(getContext(),
75: getRequest(), tCol);
76: t.replace(rs, " ");
77: colsBuf.append(t.toString());
78: }
79: hgrid.append(StringUtil.replace(tRow, "${cols}", colsBuf
80: .toString()));
81: }
82:
83: //replace hgrid body into main template
84: te.replace("${hgrid}", hgrid.toString());
85:
86: // let parent class execute normal processing of config.xml
87: super.print(te, data);
88:
89: }
90: }
|