Package org.fenixedu.academic.ui.renderers.degreeStructure

Source Code of org.fenixedu.academic.ui.renderers.degreeStructure.DegreeCurricularPlanYearsLayout

/**
* 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 java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import org.fenixedu.academic.domain.CurricularCourse;
import org.fenixedu.academic.domain.DegreeCurricularPlan;
import org.fenixedu.academic.domain.curricularPeriod.CurricularPeriod;
import org.fenixedu.academic.domain.degreeStructure.Context;
import org.fenixedu.academic.domain.degreeStructure.CourseGroup;

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;

class DegreeCurricularPlanYearsLayout extends DegreeCurricularPlanLayout {

    private Map<CurricularPeriod, Collection<Context>> contextsToDrawInNextPeriod =
            new HashMap<CurricularPeriod, Collection<Context>>();

    protected DegreeCurricularPlanYearsLayout(final DegreeCurricularPlanRenderer degreeCurricularPlanRenderer) {
        super(degreeCurricularPlanRenderer);
    }

    @Override
    protected void draw(DegreeCurricularPlan degreeCurricularPlan, HtmlTable mainTable) {

        final CurricularPeriod degreeStructure = degreeCurricularPlan.getDegreeStructure();

        for (final CurricularPeriod curricularPeriod : degreeStructure.getSortedChilds()) {
            /*
             * NOTE: Assuming structure Year - Semesters, and all courses are
             * connected to semesters apart from course regime
             */
            drawTopCurricularPeriods(curricularPeriod, mainTable, 0);
        }
    }

    private void drawTopCurricularPeriods(CurricularPeriod curricularPeriod, HtmlTable mainTable, int level) {

        if (curricularPeriod.getChildsSet().isEmpty()) {
            return;
        }

        for (final CurricularPeriod child : curricularPeriod.getSortedChilds()) {
            drawCurricularPeriodRow(mainTable, child, level);
            drawContexts(child, mainTable, level + 1);

            if (contextsToDrawInNextPeriod.containsKey(child)) {
                drawExtraContextsInNextPeriod(child, mainTable, level + 1);
            }
        }
    }

    private void drawCurricularPeriodRow(HtmlTable mainTable, final CurricularPeriod child, int level) {
        final HtmlTableRow groupRow = mainTable.createRow();
        groupRow.setClasses(getCourseGroupRowClass());
        addTabsToRow(groupRow, level);

        // curricular period full label
        final HtmlTableCell cell1 = groupRow.createCell();
        cell1.setClasses(getLabelCellClass());
        cell1.setBody(new HtmlText(child.getFullLabel()));
        cell1.setColspan(getMaxColSpanForTextOnGroupsWithChilds());

        // Group
        final HtmlTableCell cell2 = groupRow.createCell();
        cell2.setClasses(getLabelCellClass());
        cell2.setBody(new HtmlText(getLabel("label.degreeCurricularPlan.renderer.group")));

        final HtmlTableCell cell3 = groupRow.createCell();
        cell3.setClasses(getLabelCellClass());
        cell3.setColspan(getMaxLineSize() - getMaxColSpanForTextOnGroupsWithChilds() - 1);

    }

    private void drawContexts(CurricularPeriod child, HtmlTable mainTable, int level) {
        for (final Context context : getSortedContextsByCurricularCourseName(child)) {
            if (!hasExecutionInterval() || context.isValid(getExecutionInterval())) {
                drawContext(context, mainTable, level);
            }
        }
    }

    private Collection<Context> getSortedContextsByCurricularCourseName(final CurricularPeriod period) {
        final List<Context> contexts = new ArrayList<Context>(period.getContextsWithCurricularCourses());
        Collections.sort(contexts, Context.COMPARATOR_BY_DEGREE_MODULE_NAME);
        return contexts;
    }

    private void drawContext(Context context, HtmlTable mainTable, int level) {

        final HtmlTableRow row = mainTable.createRow();
        addTabsToRow(row, level);
        row.setClasses(getCurricularCourseRowClass());

        final CurricularCourse curricularCourse = (CurricularCourse) context.getChildDegreeModule();

        drawCurricularCourseName(curricularCourse, row, isCurricularCourseLinkable(), level);
        drawCourseGroupName(context.getParentCourseGroup(), row, level);

        if (curricularCourse.isOptionalCurricularCourse()) {
            drawOptionalCellInformation(row);
        } else {
            drawRegime(curricularCourse, row);
            drawCourseLoad(curricularCourse, context.getCurricularPeriod(), row);
            drawEctsCredits(curricularCourse, context.getCurricularPeriod(), row);
        }

        drawCurricularRulesRows(curricularCourse, null, mainTable, level + 1);

        if (curricularCourse.isAnual(getExecutionInterval()) && context.getCurricularPeriod().getChildOrder() == 1) {
            addContextToProcessInNextPeriod(context, context.getCurricularPeriod().getNext());
        }
    }

    private void addContextToProcessInNextPeriod(Context context, CurricularPeriod period) {

        Collection<Context> collection = contextsToDrawInNextPeriod.get(period);
        if (collection == null) {
            contextsToDrawInNextPeriod.put(period, collection = new HashSet<Context>());
        }
        collection.add(context);
    }

    private void drawCourseGroupName(CourseGroup parentCourseGroup, HtmlTableRow row, int level) {
        final HtmlTableCell cell = row.createCell();
        cell.setClasses(getCurriclarCourseCellClass());
        cell.setBody(new HtmlText(parentCourseGroup.getName()));
    }

    private void drawExtraContextsInNextPeriod(CurricularPeriod period, HtmlTable mainTable, int level) {

        for (final Context context : contextsToDrawInNextPeriod.get(period)) {
            final HtmlTableRow row = mainTable.createRow();
            addTabsToRow(row, level);
            row.setClasses(getCurricularCourseRowClass());

            final CurricularCourse curricularCourse = (CurricularCourse) context.getChildDegreeModule();

            drawCurricularCourseName(curricularCourse, row, false, level);
            drawCourseGroupName(context.getParentCourseGroup(), row, level);

            if (curricularCourse.isOptionalCurricularCourse()) {
                drawOptionalCellInformation(row);
            } else {
                drawRegime(curricularCourse, row);
                drawCourseLoad(curricularCourse, period, row);
                drawEctsCredits(curricularCourse, period, row);
            }

            drawCurricularRulesRows(curricularCourse, null, mainTable, level + 1);
        }

    }
}
TOP

Related Classes of org.fenixedu.academic.ui.renderers.degreeStructure.DegreeCurricularPlanYearsLayout

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.