/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
* <p>
*/
package org.olat.core.gui.components.form.flexible.impl.elements.table;
import org.olat.core.commons.persistence.SortKey;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.ComponentRenderer;
import org.olat.core.gui.components.form.flexible.FormItem;
import org.olat.core.gui.components.form.flexible.impl.Form;
import org.olat.core.gui.components.form.flexible.impl.FormJSHelper;
import org.olat.core.gui.components.form.flexible.impl.NameValuePair;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.render.RenderResult;
import org.olat.core.gui.render.Renderer;
import org.olat.core.gui.render.StringOutput;
import org.olat.core.gui.render.URLBuilder;
import org.olat.core.gui.translator.Translator;
import org.olat.core.util.StringHelper;
/**
* Render the table as a long HTML table
* @author Christian Guretzki
*/
class FlexiTableClassicRenderer extends AbstractFlexiTableRenderer implements ComponentRenderer {
@Override
public void render(Renderer renderer, StringOutput target, Component source, URLBuilder ubu,
Translator translator, RenderResult renderResult, String[] args) {
super.render(renderer, target, source, ubu, translator, renderResult, args);
}
@Override
protected void renderHeaders(StringOutput target, FlexiTableComponent ftC, Translator translator) {
FlexiTableElementImpl ftE = ftC.getFlexiTableElement();
FlexiTableDataModel<?> dataModel = ftE.getTableDataModel();
FlexiTableColumnModel columnModel = dataModel.getTableColumnModel();
target.append("<thead><tr>");
if(ftE.isMultiSelect()) {
// render as checkbox icon to minimize used space for header
String choice = translator.translate("table.header.choice");
target.append("<th><i class='o_icon o_icon_checkbox_checked o_icon-lg' title=\"").append(choice).append("\"> </i></th>");
}
int cols = columnModel.getColumnCount();
for(int i=0; i<cols; i++) {
FlexiColumnModel fcm = columnModel.getColumnModel(i);
if(ftE.isColumnModelVisible(fcm)) {
renderHeader(target, ftC, fcm, translator);
}
}
target.append("</tr></thead>");
}
private void renderHeader(StringOutput sb, FlexiTableComponent ftC, FlexiColumnModel fcm, Translator translator) {
String header = getHeader(fcm, translator);
sb.append("<th>");
// sort is not defined
if (!fcm.isSortable() || fcm.getSortKey() == null) {
sb.append(header);
} else {
FlexiTableElementImpl ftE = ftC.getFlexiTableElement();
Boolean asc = null;
String sortKey = fcm.getSortKey();
SortKey[] orderBy = ftE.getOrderBy();
if(orderBy != null && orderBy.length > 0) {
for(int i=orderBy.length; i-->0; ) {
if(sortKey.equals(orderBy[i].getKey())) {
asc = new Boolean(orderBy[i].isAsc());
}
}
}
Form theForm = ftE.getRootForm();
if(asc == null) {
sb.append("<a class='o_orderby' href=\"javascript:")
.append(FormJSHelper.getXHRFnCallFor(theForm, ftC.getFormDispatchId(), 1, true, true, true,
new NameValuePair("sort", sortKey), new NameValuePair("asc", "asc")))
.append("\">");
} else if(asc.booleanValue()) {
sb.append("<a class='o_orderby o_orderby_asc' href=\"javascript:")
.append(FormJSHelper.getXHRFnCallFor(theForm, ftC.getFormDispatchId(), 1, true, true, true,
new NameValuePair("sort", sortKey), new NameValuePair("asc", "desc")))
.append("\">");
} else {
sb.append("<a class='o_orderby o_orderby_desc' href=\"javascript:")
.append(FormJSHelper.getXHRFnCallFor(theForm, ftC.getFormDispatchId(), 1, true, true, true,
new NameValuePair("sort", sortKey), new NameValuePair("asc", "asc")))
.append("\">");
}
sb.append(header).append("</a>");
}
sb.append("</th>");
}
private String getHeader(FlexiColumnModel fcm, Translator translator) {
String header;
if(StringHelper.containsNonWhitespace(fcm.getHeaderLabel())) {
header = fcm.getHeaderLabel();
} else {
header = translator.translate(fcm.getHeaderKey());
}
return header;
}
@Override
protected void renderRow(Renderer renderer, StringOutput target, FlexiTableComponent ftC, String rowIdPrefix,
int row, URLBuilder ubu, Translator translator, RenderResult renderResult) {
FlexiTableElementImpl ftE = ftC.getFlexiTableElement();
FlexiTableColumnModel columnsModel = ftE.getTableDataModel().getTableColumnModel();
int numOfCols = columnsModel.getColumnCount();
Form theForm = ftE.getRootForm();
// use alternating css class
int numOfColumns = 0;
target.append("<tr id='").append(rowIdPrefix).append(row).append("'");
if(ftE.getCssDelegate() != null) {
String cssClass = ftE.getCssDelegate().getRowCssClass(FlexiTableRendererType.classic, row);
if(StringHelper.containsNonWhitespace(cssClass)) {
target.append(" class='").append(cssClass).append("'");
}
}
target.append(">");
if(ftE.isMultiSelect()) {
target.append("<td>")
.append("<input type='checkbox' name='tb_ms' value='").append(rowIdPrefix).append(row).append("'")
.append(" onclick=\"javascript:")
.append(FormJSHelper.getXHRFnCallFor(theForm, ftC.getFormDispatchId(), 1, false, false, false,
new NameValuePair("chkbox", Integer.toString(row))))
.append(";\"");
if(ftE.isMultiSelectedIndex(row)) {
target.append(" checked='checked'");
}
boolean selectable = ftE.getTableDataModel().isSelectable(row);
if(!selectable) {
target.append(" disabled='disabled'");
}
target.append("/></td>");
}
for (int j = 0; j<numOfCols; j++) {
FlexiColumnModel fcm = columnsModel.getColumnModel(j);
if(ftE.isColumnModelVisible(fcm)) {
renderCell(renderer, target, ftC, fcm, row, ubu, translator, renderResult);
numOfColumns++;
}
}
target.append("</tr>");
if(ftE.isDetailsExpended(row)) {
target.append("<tr id='").append(rowIdPrefix).append(row)
.append("_details' class='o_table_row_details'>");
VelocityContainer container = ftE.getDetailsRenderer();
Object rowObject = ftE.getTableDataModel().getObject(row);
container.contextPut("row", rowObject);
FlexiTableComponentDelegate cmpDelegate = ftE.getComponentDelegate();
if(cmpDelegate != null) {
Iterable<Component> cmps = cmpDelegate.getComponents(row, rowObject);
if(cmps != null) {
for(Component cmp:cmps) {
container.put(cmp.getComponentName(), cmp);
}
}
}
if(ftE.isMultiSelect()) {
target.append("<td></td>");
}
target.append("<td colspan='").append(numOfColumns).append("'>");
container.getHTMLRendererSingleton().render(renderer, target, container, ubu, translator, renderResult, null);
container.contextRemove("row");
target.append("</td></tr>");
}
}
private void renderCell(Renderer renderer, StringOutput target, FlexiTableComponent ftC, FlexiColumnModel fcm,
int row, URLBuilder ubu, Translator translator, RenderResult renderResult) {
FlexiTableElementImpl ftE = ftC.getFlexiTableElement();
FlexiTableDataModel<?> dataModel = ftE.getTableDataModel();
int alignment = fcm.getAlignment();
String cssClass = (alignment == FlexiColumnModel.ALIGNMENT_LEFT ? "text-left" : (alignment == FlexiColumnModel.ALIGNMENT_RIGHT ? "text-right" : "text-center"));
target.append("<td class=\"").append(cssClass).append(" ")
.append("o_dnd_label", ftE.getColumnIndexForDragAndDropLabel() == fcm.getColumnIndex())
.append("\">");
int columnIndex = fcm.getColumnIndex();
Object cellValue = columnIndex >= 0 ?
dataModel.getValueAt(row, columnIndex) : null;
if (cellValue instanceof FormItem) {
FormItem formItem = (FormItem)cellValue;
formItem.setTranslator(translator);
if(ftE.getRootForm() != formItem.getRootForm()) {
formItem.setRootForm(ftE.getRootForm());
}
ftE.addFormItem(formItem);
if(formItem.isVisible()) {
formItem.getComponent().getHTMLRendererSingleton().render(renderer, target, formItem.getComponent(),
ubu, translator, renderResult, null);
}
} else if(cellValue instanceof Component) {
Component cmp = (Component)cellValue;
cmp.setTranslator(translator);
if(cmp.isVisible()) {
cmp.getHTMLRendererSingleton().render(renderer, target, cmp,
ubu, translator, renderResult, null);
}
} else {
fcm.getCellRenderer().render(renderer, target, cellValue, row, ftC, ubu, translator);
}
target.append("</td>");
}
}