/** * <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.coach.ui; import java.util.List; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.stack.PopEvent; import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.table.ColumnDescriptor; import org.olat.core.gui.components.table.CustomRenderColumnDescriptor; import org.olat.core.gui.components.table.DefaultColumnDescriptor; import org.olat.core.gui.components.table.TableController; import org.olat.core.gui.components.table.TableDataModel; import org.olat.core.gui.components.table.TableEvent; import org.olat.core.gui.components.table.TableGuiConfiguration; import org.olat.core.gui.components.velocity.VelocityContainer; 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.control.controller.BasicController; import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.util.resource.OresHelper; import org.olat.modules.assessment.ui.ScoreCellRenderer; import org.olat.modules.coach.CoachingService; import org.olat.modules.coach.model.CourseStatEntry; import org.olat.modules.coach.ui.CoursesTableDataModel.Columns; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.springframework.beans.factory.annotation.Autowired; /** * * Description:<br> * Overview of all students under the scrutiny of a coach. * * <P> * Initial Date: 8 févr. 2012 <br> * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ public class CourseListController extends BasicController implements Activateable2 { private final TooledStackedPanel stackPanel; private final TableController tableCtr; private final VelocityContainer mainVC; private CourseController courseCtrl; private boolean hasChanged = false; @Autowired private CoachingService coachingService; @Autowired private RepositoryManager repositoryManager; public CourseListController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel) { super(ureq, wControl); this.stackPanel = stackPanel; stackPanel.addListener(this); TableGuiConfiguration tableConfig = new TableGuiConfiguration(); tableConfig.setTableEmptyMessage(translate("error.no.found")); tableConfig.setDownloadOffered(true); tableConfig.setPreferencesOffered(true, "courseListController"); tableCtr = new TableController(tableConfig, ureq, getWindowControl(), null, null, null, null, true, getTranslator()); tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.course.name", Columns.name.ordinal(), "select", getLocale())); tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.countStudents", Columns.countStudents.ordinal(), null, getLocale())); tableCtr.addColumnDescriptor(new CustomRenderColumnDescriptor("table.header.login", Columns.initialLaunch.ordinal(), null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, new LightIconRenderer())); tableCtr.addColumnDescriptor(new CustomRenderColumnDescriptor("table.header.passed", Columns.countPassed.ordinal(), null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, new ProgressRenderer(false, getTranslator()))); tableCtr.addColumnDescriptor(new CustomRenderColumnDescriptor("table.header.averageScore", Columns.averageScore.ordinal(), null, getLocale(), ColumnDescriptor.ALIGNMENT_RIGHT, new ScoreCellRenderer())); listenTo(tableCtr); loadModel(); mainVC = createVelocityContainer("course_list"); mainVC.put("coursTable", tableCtr.getInitialComponent()); putInitialPanel(mainVC); } private void loadModel() { List<CourseStatEntry> courseStatistics = coachingService.getCoursesStatistics(getIdentity()); TableDataModel<CourseStatEntry> model = new CoursesTableDataModel(courseStatistics); tableCtr.setTableDataModel(model); } private void reloadModel() { if(hasChanged) { loadModel(); hasChanged = false; } } @Override protected void doDispose() { stackPanel.removeListener(this); } @Override protected void event(UserRequest ureq, Component source, Event event) { if(source == stackPanel) { if(event instanceof PopEvent) { PopEvent pe = (PopEvent)event; if(pe.getController() == courseCtrl && hasChanged) { reloadModel(); } } } } @Override protected void event(UserRequest ureq, Controller source, Event event) { if(source == tableCtr) { if(event instanceof TableEvent) { TableEvent e = (TableEvent) event; if("select".equals(e.getActionId())) { CourseStatEntry courseStat = (CourseStatEntry)tableCtr.getTableDataModel().getObject(e.getRowId()); selectCourse(ureq, courseStat); } } } else if (source == courseCtrl) { if(event == Event.CHANGED_EVENT) { hasChanged = true; } else if("next.course".equals(event.getCommand())) { nextCourse(ureq); } else if("previous.course".equals(event.getCommand())) { previousCourse(ureq); } } super.event(ureq, source, event); } @Override public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(entries == null || entries.isEmpty()) return; ContextEntry ce = entries.get(0); OLATResourceable ores = ce.getOLATResourceable(); if("RepositoryEntry".equals(ores.getResourceableTypeName())) { Long repoKey = ores.getResourceableId(); for(int i=tableCtr.getRowCount(); i-->0; ) { CourseStatEntry courseStat = (CourseStatEntry)tableCtr.getTableDataModel().getObject(i); if(repoKey.equals(courseStat.getRepoKey())) { selectCourse(ureq, courseStat); if(courseCtrl != null) { courseCtrl.activate(ureq, entries.subList(1, entries.size()), ce.getTransientState()); } break; } } } } private void previousCourse(UserRequest ureq) { CourseStatEntry currentEntry = courseCtrl.getEntry(); int previousIndex = tableCtr.getIndexOfSortedObject(currentEntry) - 1; if(previousIndex < 0 || previousIndex >= tableCtr.getRowCount()) { previousIndex = tableCtr.getRowCount() - 1; } CourseStatEntry previousEntry = (CourseStatEntry)tableCtr.getSortedObjectAt(previousIndex); selectCourse(ureq, previousEntry); } private void nextCourse(UserRequest ureq) { CourseStatEntry currentEntry = courseCtrl.getEntry(); int nextIndex = tableCtr.getIndexOfSortedObject(currentEntry) + 1; if(nextIndex < 0 || nextIndex >= tableCtr.getRowCount()) { nextIndex = 0; } CourseStatEntry nextEntry = (CourseStatEntry)tableCtr.getSortedObjectAt(nextIndex); selectCourse(ureq, nextEntry); } private void selectCourse(UserRequest ureq, CourseStatEntry courseStat) { removeAsListenerAndDispose(courseCtrl); courseCtrl = null; RepositoryEntry re = repositoryManager.lookupRepositoryEntry(courseStat.getRepoKey(), false); if(re != null) { OLATResourceable ores = OresHelper.createOLATResourceableInstance(RepositoryEntry.class, re.getKey()); WindowControl bwControl = addToHistory(ureq, ores, null); int index = tableCtr.getIndexOfSortedObject(courseStat); courseCtrl = new CourseController(ureq, bwControl, stackPanel, re, courseStat, index, tableCtr.getRowCount()); listenTo(courseCtrl); stackPanel.popUpToRootController(ureq); stackPanel.pushController(re.getDisplayname(), courseCtrl); } } }