/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <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 the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <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>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.modules.qpool.ui;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.olat.core.CoreSpringFactory;
import org.olat.core.commons.persistence.ResultInfos;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItem;
import org.olat.core.gui.components.form.flexible.FormItemContainer;
import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement;
import org.olat.core.gui.components.form.flexible.elements.FormLink;
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.FormLayoutContainer;
import org.olat.core.gui.components.form.flexible.impl.elements.table.BooleanCellRenderer;
import org.olat.core.gui.components.form.flexible.impl.elements.table.CSSIconFlexiCellRenderer;
import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
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.FlexiTableRendererType;
import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.table.TableDataModel;
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.translator.Translator;
import org.olat.core.util.Util;
import org.olat.modules.qpool.Pool;
import org.olat.modules.qpool.QPoolService;
import org.olat.modules.qpool.ui.events.QPoolSelectionEvent;
import org.olat.modules.qpool.ui.metadata.MetadatasController;
/**
*
* Select the list of pools
*
* Initial date: 15.04.2013<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class PoolsController extends FormBasicController {
private FormLink selectButton;
private Object userObject;
private PoolDataModel model;
private FlexiTableElement poolTable;
private final QPoolService qpoolService;
public PoolsController(UserRequest ureq, WindowControl wControl) {
super(ureq, wControl, "pools");
setTranslator(Util.createPackageTranslator(MetadatasController.class, ureq.getLocale(), getTranslator()));
qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
initForm(ureq);
}
public Object getUserObject() {
return userObject;
}
public void setUserObject(Object userObject) {
this.userObject = userObject;
}
@Override
protected void doDispose() {
//
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
//add the table
FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, Cols.id.i18nKey(), Cols.id.ordinal(), true, "key"));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, Cols.publicPool.i18nKey(), Cols.publicPool.ordinal(),
true, "publicPool", FlexiColumnModel.ALIGNMENT_LEFT,
new BooleanCellRenderer(
new CSSIconFlexiCellRenderer("o_public"),
new CSSIconFlexiCellRenderer("o_private"))
));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.name.i18nKey(), Cols.name.ordinal(), true, "name"));
columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("select", translate("select"), "select-pool"));
model = new PoolDataModel(columnsModel, getTranslator());
poolTable = uifactory.addTableElement(getWindowControl(), "pools", model, getTranslator(), formLayout);
poolTable.setMultiSelect(true);
poolTable.setRendererType(FlexiTableRendererType.classic);
reloadModel();
FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
buttonsCont.setRootForm(mainForm);
formLayout.add(buttonsCont);
selectButton = uifactory.addFormLink("select", buttonsCont, Link.BUTTON);
uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
}
private void reloadModel() {
ResultInfos<Pool> pools = qpoolService.getPools(0, -1);
model.setObjects(pools.getObjects());
poolTable.reset();
}
@Override
protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
if(source == poolTable) {
if(event instanceof SelectionEvent) {
SelectionEvent se = (SelectionEvent)event;
if("select-pool".equals(se.getCommand())) {
Pool row = model.getObject(se.getIndex());
fireEvent(ureq, new QPoolSelectionEvent(Collections.singletonList(row)));
}
}
} else if(source == selectButton) {
Set<Integer> selectIndexes = poolTable.getMultiSelectedIndex();
if(!selectIndexes.isEmpty()) {
List<Pool> rows = new ArrayList<Pool>(selectIndexes.size());
for(Integer index:selectIndexes) {
Pool row = model.getObject(index.intValue());
rows.add(row);
}
fireEvent(ureq, new QPoolSelectionEvent(rows));
}
}
super.formInnerEvent(ureq, source, event);
}
protected void doShare() {
}
@Override
protected void formOK(UserRequest ureq) {
//
}
@Override
protected void formCancelled(UserRequest ureq) {
fireEvent(ureq, Event.CANCELLED_EVENT);
}
private enum Cols {
id("pool.key"),
publicPool("pool.public"),
name("pool.name");
private final String i18nKey;
private Cols(String i18nKey) {
this.i18nKey = i18nKey;
}
public String i18nKey() {
return i18nKey;
}
}
private static class PoolDataModel implements FlexiTableDataModel<Pool>, TableDataModel<Pool> {
private List<Pool> rows;
private FlexiTableColumnModel columnModel;
private final Translator translator;
public PoolDataModel(FlexiTableColumnModel columnModel, Translator translator) {
this.columnModel = columnModel;
this.translator = translator;
}
@Override
public FlexiTableColumnModel getTableColumnModel() {
return columnModel;
}
@Override
public void setTableColumnModel(FlexiTableColumnModel tableColumnModel) {
this.columnModel = tableColumnModel;
}
@Override
public boolean isSelectable(int row) {
return true;
}
@Override
public int getRowCount() {
return rows == null ? 0 : rows.size();
}
@Override
public boolean isRowLoaded(int row) {
return rows != null && row < rows.size();
}
@Override
public Pool getObject(int row) {
return rows.get(row);
}
@Override
public void setObjects(List<Pool> objects) {
rows = new ArrayList<Pool>(objects);
}
@Override
public int getColumnCount() {
return columnModel.getColumnCount();
}
@Override
public PoolDataModel createCopyWithEmptyList() {
return new PoolDataModel(columnModel, translator);
}
@Override
public Object getValueAt(int row, int col) {
Pool item = getObject(row);
switch(Cols.values()[col]) {
case id: return item.getKey();
case publicPool: return new Boolean(item.isPublicPool());
case name: return item.getName();
default: return "";
}
}
}
}