package net.sourceforge.fenixedu.presentationTier.renderers; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.ResourceBundle; import java.util.Set; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; import java.util.Map.Entry; import net.sourceforge.fenixedu.dataTransferObject.administrativeOffice.studentEnrolment.StudentOptionalEnrolmentBean; import net.sourceforge.fenixedu.domain.Branch; import net.sourceforge.fenixedu.domain.CurricularCourse; import net.sourceforge.fenixedu.domain.CurricularCourseScope; import net.sourceforge.fenixedu.domain.DegreeCurricularPlan; import net.sourceforge.fenixedu.domain.DegreeModuleScope; import net.sourceforge.fenixedu.domain.ExecutionSemester; import net.sourceforge.fenixedu.domain.degreeStructure.Context; import net.sourceforge.fenixedu.domain.degreeStructure.CourseGroup; import org.apache.commons.beanutils.BeanComparator; import pt.ist.fenixWebFramework.renderers.InputRenderer; import pt.ist.fenixWebFramework.renderers.components.HtmlBlockContainer; import pt.ist.fenixWebFramework.renderers.components.HtmlComponent; import pt.ist.fenixWebFramework.renderers.components.HtmlLink; import pt.ist.fenixWebFramework.renderers.components.HtmlTable; import pt.ist.fenixWebFramework.renderers.components.HtmlTableCell; import pt.ist.fenixWebFramework.renderers.components.HtmlTableRow; import pt.ist.fenixWebFramework.renderers.components.HtmlText; import pt.ist.fenixWebFramework.renderers.layouts.Layout; import pt.ist.fenixWebFramework.renderers.utils.RenderUtils; public class DegreeCurricularPlanOptionalEnrolmentsRenderer extends InputRenderer { private final ResourceBundle academicAdminOfficeResources = ResourceBundle.getBundle("resources.AcademicAdminOffice"); private Integer initialWidth = 70; private Integer widthDecreasePerLevel = 3; private String tablesClasses = "showinfo3 mvert0"; private String groupRowClasses = "bgcolor2"; private String curricularCoursesToEnrol = "smalltxt, smalltxt aright, smalltxt aright, aright"; private String linkFormat; private String linkFormatted; public Integer getInitialWidth() { return initialWidth; } public void setInitialWidth(Integer initialWidth) { this.initialWidth = initialWidth; } public Integer getWidthDecreasePerLevel() { return widthDecreasePerLevel; } public void setWidthDecreasePerLevel(Integer widthDecreasePerLevel) { this.widthDecreasePerLevel = widthDecreasePerLevel; } public String getTablesClasses() { return tablesClasses; } public void setTablesClasses(String tablesClasses) { this.tablesClasses = tablesClasses; } public String getGroupRowClasses() { return groupRowClasses; } public void setGroupRowClasses(String groupRowClasses) { this.groupRowClasses = groupRowClasses; } private String[] getCurricularCourseClasses() { return curricularCoursesToEnrol.split(","); } public void setCurricularCourseClasses(String curricularCoursesToEnrol) { this.curricularCoursesToEnrol = curricularCoursesToEnrol; } private String getCurricularCourseNameClasses() { return getCurricularCourseClasses()[0]; } private String getCurricularCourseYearClasses() { return getCurricularCourseClasses()[1]; } private String getCurricularCourseEctsClasses() { return getCurricularCourseClasses()[2]; } private String getCurricularCourseLinkClasses() { return getCurricularCourseClasses()[3]; } public String getLinkFormat() { return linkFormat; } public void setLinkFormat(String linkFormat) { this.linkFormat = linkFormat; } public DegreeCurricularPlanOptionalEnrolmentsRenderer() { super(); } @Override protected Layout getLayout(Object object, Class type) { return new DegreeCurricularPlanOptionalEnrolmentsLayout(); } private String getLinkFormatted(Object object) { return RenderUtils.getFormattedProperties(getLinkFormat(), object); } private class DegreeCurricularPlanOptionalEnrolmentsLayout extends Layout { private StudentOptionalEnrolmentBean studentOptionalEnrolmentBean = null; @Override public HtmlComponent createComponent(Object object, Class type) { linkFormatted = getLinkFormatted(object); studentOptionalEnrolmentBean = (StudentOptionalEnrolmentBean) object; HtmlBlockContainer container = new HtmlBlockContainer(); if (studentOptionalEnrolmentBean == null) { return new HtmlText(); } linkFormatted = RenderUtils.getFormattedProperties(getLinkFormat(), studentOptionalEnrolmentBean); if (studentOptionalEnrolmentBean.getDegreeCurricularPlan().isBoxStructure()) { generateCourseGroup(container, studentOptionalEnrolmentBean.getDegreeCurricularPlan().getRoot(), 0); } else { generateDCP(container, 0); } return container; } private void generateCourseGroup(HtmlBlockContainer blockContainer, CourseGroup courseGroup, int depth) { final HtmlTable groupTable = new HtmlTable(); blockContainer.addChild(groupTable); groupTable.setClasses(getTablesClasses()); groupTable.setStyle("width: " + (getInitialWidth() - depth) + "em; margin-left: " + depth + "em;"); final HtmlTableRow htmlTableRow = groupTable.createRow(); htmlTableRow.setClasses(getGroupRowClasses()); htmlTableRow.createCell().setBody(new HtmlText(courseGroup.getName())); final List childCourseGroupContexts = courseGroup.getValidChildContexts(CourseGroup.class, getExecutionSemester()); final List childCurricularCourseContexts = courseGroup.getValidChildContexts(CurricularCourse.class, getExecutionSemester()); Collections.sort(childCourseGroupContexts, new BeanComparator("childOrder")); Collections.sort(childCurricularCourseContexts, new BeanComparator("childOrder")); generateCurricularCourses(blockContainer, childCurricularCourseContexts, depth + getWidthDecreasePerLevel()); for (Context context : childCourseGroupContexts) { generateCourseGroup(blockContainer, (CourseGroup) context.getChildDegreeModule(), depth + getWidthDecreasePerLevel()); } } private ExecutionSemester getExecutionSemester() { return studentOptionalEnrolmentBean.getExecutionPeriod(); } private void generateCurricularCourses(HtmlBlockContainer blockContainer, List contexts, int depth) { final HtmlTable table = new HtmlTable(); blockContainer.addChild(table); table.setClasses(getTablesClasses()); table.setStyle("width: " + (getInitialWidth() - depth) + "em; margin-left: " + depth + "em;"); for (Context context : contexts) { final CurricularCourse curricularCourse = (CurricularCourse) context.getChildDegreeModule(); if (!curricularCourse.isOptionalCurricularCourse()) { final HtmlTableRow htmlTableRow = table.createRow(); HtmlTableCell cellName = htmlTableRow.createCell(); cellName.setClasses(getCurricularCourseNameClasses()); cellName.setBody(new HtmlText(curricularCourse.getName(getExecutionSemester()))); // Year final HtmlTableCell yearCell = htmlTableRow.createCell(); yearCell.setClasses(getCurricularCourseYearClasses()); yearCell.setBody(new HtmlText(context.getCurricularPeriod().getFullLabel())); // Ects final HtmlTableCell ectsCell = htmlTableRow.createCell(); ectsCell.setClasses(getCurricularCourseEctsClasses()); final StringBuilder ects = new StringBuilder(); ects.append(curricularCourse.getEctsCredits(getExecutionSemester())).append(" ").append( academicAdminOfficeResources.getString("credits.abbreviation")); ectsCell.setBody(new HtmlText(ects.toString())); // link inscrição final HtmlTableCell linkTableCell = htmlTableRow.createCell(); linkTableCell.setClasses(getCurricularCourseLinkClasses()); final HtmlLink htmlLink = new HtmlLink(); linkTableCell.setBody(htmlLink); htmlLink.setText(academicAdminOfficeResources.getString("link.option.enrol.curricular.course")); htmlLink.setUrl(linkFormatted); htmlLink.setParameter("optionalCCID", context.getChildDegreeModule().getIdInternal()); } } } private void generateDCP(HtmlBlockContainer container, int depth) { Map> branchMap = getBranchMap(studentOptionalEnrolmentBean .getDegreeCurricularPlan(), getExecutionSemester()); for (Entry> entry : branchMap.entrySet()) { generateBranch(container, entry.getKey(), entry.getValue(), depth + getWidthDecreasePerLevel()); } } private void generateBranch(HtmlBlockContainer container, final Branch branch, final Set scopes, int depth) { final HtmlTable groupTable = new HtmlTable(); container.addChild(groupTable); groupTable.setClasses(getTablesClasses()); groupTable.setStyle("width: " + (getInitialWidth() - depth) + "em; margin-left: " + depth + "em;"); final HtmlTableRow htmlTableRow = groupTable.createRow(); htmlTableRow.setClasses(getGroupRowClasses()); String name = branch.getName().trim(); if (name.length() == 0) { name = "Tronco Comum"; } htmlTableRow.createCell().setBody(new HtmlText(name)); generateBranchScopes(container, scopes, depth + getWidthDecreasePerLevel()); } private void generateBranchScopes(HtmlBlockContainer container, final Set scopes, int depth) { final HtmlTable table = new HtmlTable(); container.addChild(table); table.setClasses(getTablesClasses()); table.setStyle("width: " + (getInitialWidth() - depth) + "em; margin-left: " + depth + "em;"); for (DegreeModuleScope scope : scopes) { final HtmlTableRow htmlTableRow = table.createRow(); HtmlTableCell cellName = htmlTableRow.createCell(); cellName.setClasses(getCurricularCourseNameClasses()); cellName.setBody(new HtmlText(scope.getCurricularCourse().getName(getExecutionSemester()))); // Year final HtmlTableCell yearCell = htmlTableRow.createCell(); yearCell.setClasses(getCurricularCourseYearClasses()); yearCell.setBody(new HtmlText(RenderUtils.getResourceString("ACADEMIC_OFFICE_RESOURCES", "label.scope.curricular.semester", new Object[] { scope.getCurricularYear(), scope.getCurricularSemester() }))); // Ects final HtmlTableCell ectsCell = htmlTableRow.createCell(); ectsCell.setClasses(getCurricularCourseEctsClasses()); final StringBuilder ects = new StringBuilder(); ects.append(scope.getCurricularCourse().getEctsCredits(getExecutionSemester())).append(" ").append( academicAdminOfficeResources.getString("credits.abbreviation")); ectsCell.setBody(new HtmlText(ects.toString())); // link inscrição final HtmlTableCell linkTableCell = htmlTableRow.createCell(); linkTableCell.setClasses(getCurricularCourseLinkClasses()); final HtmlLink htmlLink = new HtmlLink(); linkTableCell.setBody(htmlLink); htmlLink.setText(academicAdminOfficeResources.getString("link.option.enrol.curricular.course")); htmlLink.setUrl(linkFormatted); htmlLink.setParameter("optionalCCID", scope.getCurricularCourse().getIdInternal()); } } private Map> getBranchMap(final DegreeCurricularPlan degreeCurricularPlan, final ExecutionSemester executionSemester) { final Map> branchMap = new TreeMap>( new BeanComparator("name")); for (final CurricularCourse curricularCourse : degreeCurricularPlan.getCurricularCoursesSet()) { for (final CurricularCourseScope scope : curricularCourse.getScopesSet()) { if (scope.isActiveForExecutionPeriod(executionSemester)) { addToMap(branchMap, scope); } } } return branchMap; } private void addToMap(Map> branchMap, CurricularCourseScope scope) { SortedSet list = branchMap.get(scope.getBranch()); if (list == null) { list = new TreeSet( DegreeModuleScope.COMPARATOR_BY_CURRICULAR_YEAR_AND_SEMESTER_AND_CURRICULAR_COURSE_NAME); branchMap.put(scope.getBranch(), list); } list.add(scope.getDegreeModuleScopeCurricularCourseScope()); } } }