/**
* Copyright © 2002 Instituto Superior Técnico
*
* This file is part of FenixEdu Academic.
*
* FenixEdu Academic is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FenixEdu Academic is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>.
*/
package org.fenixedu.academic.ui.renderers.degreeStructure;
import org.fenixedu.academic.domain.CurricularCourse;
import org.fenixedu.academic.domain.DegreeCurricularPlan;
import org.fenixedu.academic.domain.ExecutionSemester;
import org.fenixedu.academic.domain.curricularPeriod.CurricularPeriod;
import org.fenixedu.academic.domain.degreeStructure.Context;
import org.fenixedu.academic.domain.degreeStructure.CourseGroup;
import org.fenixedu.academic.util.CurricularPeriodLabelFormatter;
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;
public class DegreeCurricularPlanGroupsLayout extends DegreeCurricularPlanLayout {
public DegreeCurricularPlanGroupsLayout(DegreeCurricularPlanRenderer degreeCurricularPlanRenderer) {
super(degreeCurricularPlanRenderer);
}
@Override
protected void draw(final DegreeCurricularPlan degreeCurricularPlan, final HtmlTable main) {
drawCourseGroupRow(degreeCurricularPlan.getRoot(), null, main, 0);
}
private void drawCourseGroupRow(final CourseGroup courseGroup, final Context previous, final HtmlTable main, int level) {
drawCourseGroupName(courseGroup, main, level);
drawCurricularRulesRows(courseGroup, previous, main, level + 1);
drawCurricularCourseRows(courseGroup, main, level + 1);
drawCourseGroupRows(courseGroup, main, level + 1);
}
private void drawCourseGroupRows(final CourseGroup courseGroup, final HtmlTable main, int level) {
for (final Context context : courseGroup.getSortedOpenChildContextsWithCourseGroups(getExecutionInterval())) {
drawCourseGroupRow((CourseGroup) context.getChildDegreeModule(), context, main, level);
}
}
private void drawCourseGroupName(final CourseGroup courseGroup, final HtmlTable mainTable, final int level) {
final HtmlTableRow groupRow = mainTable.createRow();
groupRow.setClasses(getCourseGroupRowClass());
addTabsToRow(groupRow, level);
final HtmlTableCell cell = groupRow.createCell();
cell.setClasses(getLabelCellClass());
cell.setBody(new HtmlText(courseGroup.getNameI18N().getContent()));
if (showCourses() && courseGroup.hasAnyChildContextWithCurricularCourse()) {
cell.setColspan(getMaxColSpanForTextOnGroupsWithChilds() - level);
drawCurricularPeriodHeader(groupRow);
drawCourseLoadHeader(groupRow);
drawEctsCreditsHeader(groupRow);
} else {
cell.setColspan(getMaxLineSize() - level);
}
}
private void drawCurricularPeriodHeader(final HtmlTableRow row) {
final HtmlTableCell cell = row.createCell();
cell.setClasses(getCourseLoadCellClass());
cell.setColspan(2);
cell.setText(getLabel("label.degreeCurricularPlan.renderer.curricular.period"));
}
private void drawCourseLoadHeader(final HtmlTableRow row) {
final HtmlTableCell cell = row.createCell();
cell.setClasses(getCourseLoadCellClass());
cell.setText(getLabel("label.degreeCurricularPlan.renderer.course.load"));
}
private void drawEctsCreditsHeader(final HtmlTableRow row) {
final HtmlTableCell cell = row.createCell();
cell.setClasses(getEctsCreditsCellClass());
cell.setText(getLabel("label.degreeCurricularPlan.renderer.ects"));
}
private void drawCurricularCourseRows(final CourseGroup courseGroup, final HtmlTable main, int level) {
if (showCourses()) {
for (final Context context : courseGroup.getSortedOpenChildContextsWithCurricularCourses(getExecutionInterval())) {
drawCurricularCourseRow(context, main, level);
}
}
}
private void drawCurricularCourseRow(final Context context, final HtmlTable main, int level) {
final HtmlTableRow row = main.createRow();
addTabsToRow(row, level);
row.setClasses(getCurricularCourseRowClass());
final CurricularCourse curricularCourse = (CurricularCourse) context.getChildDegreeModule();
if (curricularCourse.isOptionalCurricularCourse()) {
drawCurricularCourseName(curricularCourse, row, false, level);
drawContextInformation(context.getCurricularPeriod(), row);
drawOptionalCellInformation(row);
} else if (curricularCourse.isSemestrial(getExecutionInterval())) {
drawCurricularCourseName(curricularCourse, row, isCurricularCourseLinkable(), level);
drawContextInformation(context.getCurricularPeriod(), row);
drawRegime(curricularCourse, row);
drawCourseLoad(curricularCourse, context.getCurricularPeriod(), row);
drawEctsCredits(curricularCourse, context.getCurricularPeriod(), row);
} else {
drawAnualCurricularCourseRow(context, row, level);
}
drawCurricularRulesRows(curricularCourse, context, main, level);
}
private void drawAnualCurricularCourseRow(final Context context, final HtmlTableRow row, final int level) {
final CurricularCourse curricularCourse = (CurricularCourse) context.getChildDegreeModule();
if (curricularCourse.getCompetenceCourse() != null) {
if (curricularCourse.getCompetenceCourse().hasOneCourseLoad(getExecutionInterval())) {
drawCurricularCourseName(curricularCourse, row, isCurricularCourseLinkable(), level);
drawContextInformation(context.getCurricularPeriod(), row);
drawRegime(curricularCourse, row);
drawCourseLoad(curricularCourse, context.getCurricularPeriod(), row);
drawEctsCredits(curricularCourse, context.getCurricularPeriod(), row);
} else {
final CurricularPeriod firstCP = context.getCurricularPeriod();
final ExecutionSemester firstES = getExecutionInterval().getExecutionSemesterFor(firstCP.getChildOrder());
drawCurricularCourseName(curricularCourse, row, isCurricularCourseLinkable(), level);
drawContextInformation(firstCP, row);
drawRegime(curricularCourse, row);
drawCourseLoad(curricularCourse, firstCP, firstES, row);
drawEctsCredits(curricularCourse, firstCP, firstES, row);
final CurricularPeriod secondCP = context.getCurricularPeriod().getNext();
final ExecutionSemester secondES = getExecutionInterval().getExecutionSemesterFor(secondCP.getChildOrder());
drawCurricularCourseName(curricularCourse, row, false, level);
drawContextInformation(secondCP, row);
drawRegime(curricularCourse, row);
drawCourseLoad(curricularCourse, secondCP, secondES, row);
drawEctsCredits(curricularCourse, secondCP, secondES, row);
}
} else {
drawCurricularCourseName(curricularCourse, row, isCurricularCourseLinkable(), level);
drawContextInformation(context.getCurricularPeriod(), row);
drawRegime(curricularCourse, row);
drawCourseLoad(curricularCourse, context.getCurricularPeriod(), row);
drawEctsCredits(curricularCourse, context.getCurricularPeriod(), row);
}
}
private void drawContextInformation(final CurricularPeriod period, final HtmlTableRow row) {
final HtmlTableCell cell = row.createCell();
cell.setClasses(getCurricularPeriodCellClass());
cell.setText(CurricularPeriodLabelFormatter.getFullLabel(period, true));
}
private void drawCourseLoad(final CurricularCourse course, final CurricularPeriod period, final ExecutionSemester interval,
final HtmlTableRow row) {
final HtmlTableCell cell = row.createCell();
cell.setClasses(getCourseLoadCellClass());
if (course.isOptionalCurricularCourse()) {
cell.setText(EMPTY_CELL);
} else {
final StringBuilder builder = new StringBuilder();
builder.append(getLabel("label.degreeCurricularPlan.renderer.acronym.contact.load")).append("-");
builder.append(roundValue(course.getContactLoad(period, interval))).append(" ");
builder.append(getLabel("label.degreeCurricularPlan.renderer.acronym.autonomous.work")).append("-");
builder.append(course.getAutonomousWorkHours(period, interval).toString()).append(" ");
builder.append(getLabel("label.degreeCurricularPlan.renderer.acronym.total.load")).append("-");
builder.append(course.getTotalLoad(period, interval));
cell.setText(builder.toString());
}
cell.setTitle(getLabel("label.degreeCurricularPlan.renderer.title.course.load"));
}
private void drawEctsCredits(final CurricularCourse course, final CurricularPeriod period, final ExecutionSemester interval,
final HtmlTableRow row) {
final HtmlTableCell cell = row.createCell();
cell.setClasses(getEctsCreditsCellClass());
cell.setText(course.isOptionalCurricularCourse() ? EMPTY_CELL : course.getEctsCredits(period, interval).toString());
}
}