/**
* 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.
*/
package org.olat.gui.demo.guidemo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItemContainer;
import org.olat.core.gui.components.form.flexible.elements.FormLink;
import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement.Layout;
import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
import org.olat.core.gui.components.form.flexible.impl.FormEvent;
import org.olat.core.gui.components.form.flexible.impl.elements.FormLinkImpl;
import org.olat.core.gui.components.form.flexible.impl.elements.MultipleSelectionElementImpl;
import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnModel;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModel;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelImpl;
import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent;
import org.olat.core.gui.components.table.BaseTableDataModelWithoutFilter;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
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;
/**
*
* @author guretzki
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*/
public class GuiDemoFlexiTablesController extends FormBasicController {
private FlexiTableDataModel<Row> tableDataModel;
public GuiDemoFlexiTablesController(UserRequest ureq, WindowControl wControl) {
super(ureq, wControl, "flexitable");
initForm(ureq);
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
FlexiTableColumnModel tableColumnModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("guidemo.table.header1", 0));
tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("guidemo.table.header2", 1));
tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("guidemo.table.header3", 2));
tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("guidemo.table.header4", 3));
tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("guidemo.table.header5", 4));
// column 6 : Image depending on True/False value / center alignment
FlexiColumnModel exampleCustomColumnModel = new DefaultFlexiColumnModel("guidemo.table.header6", 5);
exampleCustomColumnModel.setCellRenderer(new ExampleCustomFlexiCellRenderer() );
exampleCustomColumnModel.setAlignment(FlexiColumnModel.ALIGNMENT_CENTER);
tableColumnModel.addFlexiColumnModel(exampleCustomColumnModel);
// column 7 : Link
tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("guidemo.table.header7", 6));
tableDataModel = new FlexiTableDataModelImpl<Row>(new SampleFlexiTableModel(formLayout), tableColumnModel);
uifactory.addTableElement(getWindowControl(), "gui-demo", tableDataModel, getTranslator(), formLayout);
uifactory.addFormSubmitButton("ok", formLayout);
}
protected void doDispose() {
//
}
@Override
protected boolean validateFormLogic(UserRequest ureq) {
boolean isInputValid = true;
//do some validation here
return isInputValid && super.validateFormLogic(ureq);
}
@Override
protected void formInnerEvent(UserRequest ureq, org.olat.core.gui.components.form.flexible.FormItem source, FormEvent event) {
System.out.println("TEST formInnerEvent");
}
@Override
protected void formOK(UserRequest ureq) {
Object obj = tableDataModel.getValueAt(0, 2);
if(obj instanceof MultipleSelectionElement) {
MultipleSelectionElement selection = (MultipleSelectionElement)obj;
System.out.println(selection.getSelectedKeys());
}
fireEvent(ureq, Event.DONE_EVENT);
}
@Override
protected void formResetted(UserRequest ureq) {
fireEvent(ureq, Event.CANCELLED_EVENT);
}
/**
* Example legacy (non-flexi-table) table-model.
* @author guretzki
*/
private class SampleFlexiTableModel extends BaseTableDataModelWithoutFilter<Row> {
private final int COLUMN_COUNT = 7;
private final List<Row> entries;
public SampleFlexiTableModel(FormItemContainer formContainer) {
int iEntries = 50;
entries = new ArrayList<Row>(iEntries);
for (int i=0; i < iEntries; i++) {
entries.add(new Row(i, formContainer));
}
}
public int getColumnCount() {
return COLUMN_COUNT;
}
public int getRowCount() {
return entries.size();
}
public Object getValueAt(int row, int col) {
Row entry = entries.get(row);
switch(col) {
case 0: return entry.getCol1();
case 1: return entry.getCol2();
case 2: return entry.getSelection3();
case 3: return entry.getCol4();
case 4: return entry.getCol5();
case 5: return entry.getCol6();
case 6: return entry.getCol7();
default: return entry;
}
}
}
private class Row {
private final String col1;
private final String col2;
private final MultipleSelectionElement selection3;
private final String col4;
private final Date col5;
private final Boolean col6;
private final FormLink col7;
public Row(int i, FormItemContainer formContainer) {
// column 1 : string
col1 = "Flexi Lorem" + i;
// column 2 : string
col2 = "Ipsum" + i;
// column 3 : checkbox
selection3 = new MultipleSelectionElementImpl("checkbox", Layout.vertical);
String[] keys = new String[] { "ison", "isOff" };
String[] values = new String[] { "on", "off" };
selection3.setKeysAndValues(keys, values);
selection3.select("ison", true);
formContainer.add(UUID.randomUUID().toString(), selection3);
// column 4 : Integer
col4 = Integer.toString(i);
// column 5 : Date
col5 = new Date();
// column 6 : Boolean value => custom rendered with two images
col6 = ((i % 2 == 0) ? Boolean.TRUE : Boolean.FALSE);
// column 7: Action Link
FormLinkImpl link = new FormLinkImpl("choose");
link.setUserObject(Integer.valueOf(i));
link.addActionListener(FormEvent.ONCLICK);
col7 = link;
}
public String getCol1() {
return col1;
}
public String getCol2() {
return col2;
}
public MultipleSelectionElement getSelection3() {
return selection3;
}
public String getCol4() {
return col4;
}
public Date getCol5() {
return col5;
}
public Boolean getCol6() {
return col6;
}
public FormLink getCol7() {
return col7;
}
}
/**
* Example for custom cell renderer. Add one of two images depending on a
* boolean value.
* @author guretzki
*/
private class ExampleCustomFlexiCellRenderer implements FlexiCellRenderer {
@Override
public void render(Renderer renderer, StringOutput target, Object cellValue, int row,
FlexiTableComponent source, URLBuilder ubu, Translator translator) {
if (cellValue instanceof Boolean) {
if ( ((Boolean)cellValue).booleanValue() ) {
target.append("<img src=\"");
Renderer.renderStaticURI(target, "images/openolat/openolat_logo_16.png");
target.append("\" alt=\"An image within a table...\" />");
} else {
target.append("<img src=\"");
Renderer.renderStaticURI(target, "images/openolat/bug.png");
target.append("\" alt=\"An image within a table...\" />");
}
}
}
}
}