/**
* 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.faces.components.degreeStructure;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import org.fenixedu.academic.domain.ExecutionSemester;
import org.fenixedu.academic.domain.ExecutionYear;
import org.fenixedu.academic.domain.curricularRules.CurricularRule;
import org.fenixedu.academic.domain.degreeStructure.Context;
import org.fenixedu.academic.domain.degreeStructure.DegreeModule;
import org.fenixedu.academic.predicate.AcademicPredicates;
import org.fenixedu.academic.util.Bundle;
import org.fenixedu.academic.util.CurricularRuleLabelFormatter;
import org.fenixedu.bennu.core.i18n.BundleUtil;
import org.fenixedu.commons.i18n.I18N;
public class UIDegreeModule extends UIInput {
public static final String COMPONENT_TYPE = "org.fenixedu.academic.ui.faces.components.degreeStructure.UIDegreeModule";
public static final String COMPONENT_FAMILY = "org.fenixedu.academic.ui.faces.components.degreeStructure.UIDegreeModule";
protected DegreeModule degreeModule;
protected Context previousContext;
protected ExecutionYear executionYear;
protected ExecutionSemester lastExecutionPeriod;
protected Boolean toEdit;
protected Boolean showRules = Boolean.FALSE;
protected int depth;
protected String tabs;
protected String module;
protected String currentPage;
protected Boolean expandable;
protected FacesContext facesContext;
protected ResponseWriter writer;
protected static final int BASE_DEPTH = UIDegreeCurricularPlan.ROOT_DEPTH + 1;
public UIDegreeModule() {
super();
this.setRendererType(null);
}
public UIDegreeModule(DegreeModule degreeModule, Context previousContext, Boolean toEdit, Boolean showRules, int depth,
String tabs, ExecutionYear executionYear, String module, String currentPage, Boolean expandable) {
this();
this.degreeModule = degreeModule;
this.previousContext = previousContext;
this.toEdit = toEdit;
this.showRules = showRules;
this.depth = depth;
this.tabs = tabs;
this.executionYear = executionYear;
if (this.executionYear == null) {
// this.executionYear = ExecutionYear.readCurrentExecutionYear();
this.executionYear = ExecutionYear.readLastExecutionYear();
}
this.lastExecutionPeriod = this.executionYear.getLastExecutionPeriod();
this.module = module;
this.currentPage = currentPage;
this.expandable = expandable;
}
@Override
public String getFamily() {
return UIDegreeModule.COMPONENT_FAMILY;
}
@Override
public void encodeBegin(FacesContext facesContext) throws IOException {
if (!isRendered()) {
return;
}
setFromAttributes();
if (this.degreeModule.isLeaf()) {
new UICurricularCourse(this.degreeModule, null, this.toEdit, this.showRules, this.depth, this.tabs,
this.executionYear, this.module, null, false).encodeBegin(facesContext);
} else if (!this.degreeModule.isLeaf()) {
new UICourseGroup(this.degreeModule, null, this.toEdit, this.showRules, this.depth, this.tabs, Boolean.FALSE,
Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, null, this.module, this.currentPage, this.expandable)
.encodeBegin(facesContext);
}
}
private void setFromAttributes() {
if (this.degreeModule == null) {
this.degreeModule = (DegreeModule) this.getAttributes().get("degreeModule");
}
if (this.toEdit == null) {
this.toEdit = (Boolean) this.getAttributes().get("toEdit");
}
if (this.tabs == null) {
this.depth = UIDegreeModule.BASE_DEPTH;
this.tabs = "";
}
}
private static final String CODE_NAME_SEPARATOR = " - ";
protected void appendCodeAndName() throws IOException {
final String code = degreeModule.getCode();
if (code != null) {
writer.append(code).append(CODE_NAME_SEPARATOR);
}
writer.append(degreeModule.getNameI18N(lastExecutionPeriod).getContent());
}
protected void encodeLink(String page, String aditionalParameters, boolean blank, String... bundleKeys) throws IOException {
writer.startElement("a", this);
encodeLinkHref(page, aditionalParameters, blank);
for (String bundleKey : bundleKeys) {
writer.write(BundleUtil.getString(Bundle.BOLONHA, bundleKey));
}
writer.endElement("a");
}
protected void encodeLinkHref(String page, String aditionalParameters, boolean blank) throws IOException {
Map<String, String> requestParameterMap = this.facesContext.getExternalContext().getRequestParameterMap();
StringBuilder href = new StringBuilder();
href.append(page).append("?");
if (requestParameterMap.get("degreeID") != null) {
href.append("degreeID=").append(requestParameterMap.get("degreeID")).append("&");
}
Object dcpId = null;
if (requestParameterMap.get("degreeCurricularPlanID") != null) {
dcpId = requestParameterMap.get("degreeCurricularPlanID");
} else if (requestParameterMap.get("dcpId") != null) {
dcpId = requestParameterMap.get("dcpId");
}
href.append("degreeCurricularPlanID=").append(dcpId);
if (this.executionYear != null) {
href.append("&executionYearID=").append(this.executionYear.getExternalId());
} else if (requestParameterMap.get("executionPeriodOID") != null) {
href.append("&executionPeriodOID=").append(requestParameterMap.get("executionPeriodOID"));
}
if (aditionalParameters != null) {
href.append(aditionalParameters);
}
href.append("&organizeBy=").append(requestParameterMap.get("organizeBy"));
href.append("&showRules=").append(requestParameterMap.get("showRules"));
href.append("&hideCourses=").append(requestParameterMap.get("hideCourses"));
href.append("&action=").append(requestParameterMap.get("action"));
writer.writeAttribute("href", href.toString(), null);
if (blank) {
writer.writeAttribute("target", "_blank", null);
}
}
protected void encodeCurricularRules() throws IOException {
List<CurricularRule> curricularRulesToEncode = new ArrayList<CurricularRule>();
for (CurricularRule curricularRule : this.degreeModule.getVisibleCurricularRules(this.executionYear)) {
if (curricularRule.appliesToContext(this.previousContext)) {
curricularRulesToEncode.add(curricularRule);
}
}
if (!curricularRulesToEncode.isEmpty()) {
writer.startElement("tr", this);
writer.startElement("td", this);
writer.writeAttribute("colspan", (this.toEdit) ? "6" : "5", null);
writer.writeAttribute("style", "padding:0; margin: 0;", null);
writer.startElement("table", this);
writer.writeAttribute("class", "smalltxt noborder", null);
writer.writeAttribute("style", "width: 100%;", null);
for (CurricularRule curricularRule : curricularRulesToEncode) {
writer.startElement("tr", this);
encodeCurricularRule(curricularRule);
if (this.toEdit && loggedPersonCanManageDegreeCurricularPlans()) {
encodeCurricularRuleOptions(curricularRule);
}
writer.endElement("tr");
}
writer.endElement("table");
writer.endElement("td");
writer.endElement("tr");
}
}
private void encodeCurricularRule(CurricularRule curricularRule) throws IOException {
writer.startElement("td", this);
if (!this.toEdit) {
writer.writeAttribute("colspan", "2", null);
}
writer.writeAttribute("style", "color: #888;", null);
writer.append(CurricularRuleLabelFormatter.getLabel(curricularRule, I18N.getLocale()));
writer.endElement("td");
}
private void encodeCurricularRuleOptions(CurricularRule curricularRule) throws IOException {
writer.startElement("td", this);
writer.writeAttribute("class", "aright", null);
if (loggedPersonCanManageDegreeCurricularPlans()) {
if (this.executionYear != null) {
encodeLink(module + "/curricularRules/editCurricularRule.faces",
"&curricularRuleID=" + curricularRule.getExternalId(), false, "edit");
writer.append(", ");
}
encodeLink(module + "/curricularRules/deleteCurricularRule.faces",
"&curricularRuleID=" + curricularRule.getExternalId(), false, "delete");
}
writer.endElement("td");
}
protected Boolean loggedPersonCanManageDegreeCurricularPlans() {
return AcademicPredicates.MANAGE_DEGREE_CURRICULAR_PLANS.evaluate(degreeModule.getDegree());
}
}