Tag de création de tableaux

 

Voici un exemple de balise façilitant la création de tableaux. On lui donne en paramètre in un ptr sur structure de notre choix dont le type est spécifié en paramètre template de la classe table_ptr.

<%:table_ptr<Vector<MonBean> > in=malistedebean; class="client"; id="tabclient"; th="o"; th="Nom"; th="Prénom"; cond=self.begin();%>
<% ALIAS(self.elem,iterator); /* iterator est un itérateur pointant sur un élément de type MonBean */ %>
<% ALIAS(self.odd,odd); %>
<tr class="<%=odd?"odd":"even"%>">
<td><%:a title="effacer"; href="/controleur.C?action=delete&id="+itostring(iterator->getID());%>X<%/a%></td>
<td><%=iterator->getNom()%></td>
<td><%=iterator->getPrenom()</td>
</tr>
<%/table_ptr<Vector<MonBean> > self.next()%>

Le code généré est :

{
table_ptr<Vector<MonBean> > self; self.setin(malistedebean); self.setClass("client"); self.setId("tabclient"); self.setTh("o"); self.setTh("Nom"); self.setTh("Prénom");
self.doStart(request,response);
if ( self.begin() ) do {
ALIAS(self.elem,iterator);
ALIAS(self.odd,odd);
response << "<tr class=\""; response << (odd?"odd":"even"); response << "\">\n";
response << "<td>"; {
a self; a.setTitle("effacer"); a.setHref("/controleur.C?action=delete&id="+itostring(iterator->getID()));
self.doStart(request,response);
if ( true ) do {
response << "X";
} while ( false );
self.doStop(request,response);
}
response << "</td>\n"
"<td>" ; response << ( iterator->getNom() ); response << "</td>\n"
"<td>" ; response << ( iterator->getPrenom() ); response << "</td>\n"
 "</tr>\n";
} while ( self.next() );
self.doStop(request,response);
}

Le code de la classe table_ptr est :

template<class T>
class table_ptr {
ptr<T> in;
int size;
int endUse;

Vector<String> thead;
String class_;
String id;

public:

typename T::iterator elem;
bool odd;

table_ptr() : in(new T()), size(0),
endUse(0), thead(),
class_("standard"), id(""),
elem(in->end()), odd(false) {}

void setTh(const String& str) { thead.push_back(str); }
void setTh(int i) { thead.push_back(itostring(i)); }
void setClass(const String& str) { class_=str; }
void setId(const String& str) { id=str; }
void setIn(ptr<T> v) { in=v; size=v->size(); endUse=size*10; }

bool begin() {
elem=in->begin();
return size != 0;
}

bool next() {
odd=!odd;
return ++elem != in->end();
}

bool end() {
if ( size && --endUse < 0 )
throw OverflowException("self.end() used more than 10 times the"
" set's original size. Did you mean self.next() ?");
return elem != in->end();
}

void doStart(HttpServletRequest& request, HttpServletResponse& response) {
response << "<table id=\""<<id<<"\" class=\""<<class_<<"\">"
<< "<thead>"
<< "<tr>";
for ( Vector<String>::iterator th=thead.begin();
th != thead.end();
++th )
response<< "<th>"<<*th<<"</th>";

response << "</tr>"
<< "</thead>"
<< "<tbody>";
}

void doStop(HttpServletRequest& request, HttpServletResponse& response) {
response << "</tbody>"
<< "</table>";
}
};