package word.w2004.elements;
import word.api.interfaces.IElement;
import word.w2004.elements.tableElements.ITableItemStrategy;
import word.w2004.elements.tableElements.TableEle;
import word.w2004.elements.tableElements.TableFactoryMethod;
/**
* @author leonardo_correa
*
*/
public class Table implements IElement {
StringBuilder txt = new StringBuilder("");
private boolean hasBeenCalledBefore = false; // if getContent has already
// been called, I cached the
// result for future
// invocations
private boolean isRepeatTableHeaderOnEveryPage = false;
public String getContent() {
if ("".equals(txt.toString())) {
return "";
}
if (hasBeenCalledBefore) {
return txt.toString();
} else {
hasBeenCalledBefore = true;
}
ITableItemStrategy tableDef = TableFactoryMethod.getInstance()
.getTableItem(TableEle.TABLE_DEF);
txt.insert(0, tableDef.getTop());
txt.append("\n" + tableDef.getBottom());
return txt.toString();
}
/*
* Use this method when you need to apply style to the cell.
* You have to provide the Paragraph with any format you wish to apply.
* */
public void addTableEle(TableEle tableEle, Paragraph... cols) {
if(cols != null && cols.length > 0){
StringBuilder th = new StringBuilder("");
ITableItemStrategy item = TableFactoryMethod.getInstance().getTableItem(tableEle);
processMiddleForParagraph(th, item, cols);
joinTopMiddleBottom(th, item);
}
}
/*
* Use this method when you simply need a String without any format and style.
* The string will be wrapped by a Paragraph element.
* */
public void addTableEle(TableEle tableEle, String... cols) {
if (cols != null && cols.length > 0) {
StringBuilder th = new StringBuilder("");
ITableItemStrategy item = TableFactoryMethod.getInstance().getTableItem(tableEle);
for (int i = 0; i < cols.length; i++) {
//if(!"".equals(cols[i])){
th.append("\n" + item.getMiddle().replace("{value}", cols[i]));
//}
}
joinTopMiddleBottom(th, item);
}
}
/**
* Adds the repeat header code if this.isRepeatTableHeaderOnEveryPage is
* true. If not, it removes {tblHeader} placeholder.
*
* @param th
* @return the final string
*/
private String setUpRepeatTableHeaderOnEveryPage(StringBuilder th) {
String res = th.toString();
if (this.isRepeatTableHeaderOnEveryPage) {
res = res.replace("{tblHeader}",
" \n<w:trPr>\n <w:tblHeader/>\n </w:trPr>\n ");
}
// clean up placeholder
res = res.replace("{tblHeader}", "");
return res;
}
/***
* if you want to repeat the table header when the table takes more than one
* page. Default is false.
*/
public void setRepeatTableHeaderOnEveryPage() {
this.isRepeatTableHeaderOnEveryPage = true;
}
/***
* This is for situation where you pass the Paragraph so template can't have one
* */
private void processMiddleForParagraph(StringBuilder th,
ITableItemStrategy item, Paragraph... cols) {
String templateWithoutParagraph =
" <w:tc> "
+"\n <w:tcPr> "
+"\n <w:tcW w:w=\"4258\" w:type=\"dxa\"/> "
+"\n </w:tcPr> "
+"\n {value} "
+"\n </w:tc> "
;
for (int i = 0; i < cols.length; i++) {
if(cols[i] != null && cols[i].getContent() != ""){
th.append("\n" + templateWithoutParagraph.replace("{value}", cols[i].getContent()));
} else {
//th.append("\n" + this.getMyMiddle().replace("{value}", ""));
th.append("\n" + item.getMiddle().replace("{value}", Paragraph.with("").create().getContent() ));
}
}
}
/***
* It puts together top, middle and bottom and updates the final String object.
**/
private void joinTopMiddleBottom(StringBuilder th, ITableItemStrategy item) {
if(!"".equals(th.toString())){
th.insert(0, item.getTop());
th.append(item.getBottom());
}
String finalResult = setUpRepeatTableHeaderOnEveryPage(th);
txt.append(finalResult);//final result appended
}
}