package net.sourceforge.fenixedu.presentationTier.renderers;
import pt.ist.fenixWebFramework.renderers.OutputRenderer;
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.HtmlText;
import pt.ist.fenixWebFramework.renderers.components.state.ViewDestination;
import pt.ist.fenixWebFramework.renderers.layouts.Layout;
import pt.ist.fenixWebFramework.renderers.utils.RenderUtils;
import net.sourceforge.fenixedu.domain.elections.DelegateElectionCandidacyPeriod;
import net.sourceforge.fenixedu.domain.elections.DelegateElectionPeriod;
import net.sourceforge.fenixedu.domain.elections.DelegateElectionVotingPeriod;
public class DelegateElectionPeriodLinkRenderer extends OutputRenderer {
private static final String DEFAULT_FORMAT = "dd/MM/yyyy";
private String linkFormat;
private boolean contextRelative;
private boolean moduleRelative;
private String destination;
private String bundle;
private String pastPeriodClasses;
private String currentPeriodClasses;
private String dateHtmlSeparator;
private String dateFormat;
private String periodCreateLabel;
private boolean isPeriodCreateLabelKey;
private String pastPeriodCreateLabel;
private boolean isPastPeriodCreateLabelKey;
private String pastPeriodLabel;
private boolean isPastPeriodLabelKey;
private String votingPeriodPostLabel;
private boolean isVotingPeriodPostLabelKey;
private String candidacyPeriodPreLabel;
private boolean isCandidacyPeriodPreLabelKey;
private String candidacyPeriodPostLabel;
private boolean isCandidacyPeriodPostLabelKey;
private String votingPeriodPreLabel;
private boolean isVotingPeriodPreLabelKey;
public String getDateHtmlSeparator() {
return dateHtmlSeparator;
}
public void setDateHtmlSeparator(String dateHtmlSeparator) {
this.dateHtmlSeparator = dateHtmlSeparator;
}
public String getDateFormat() {
return (dateFormat != null ? dateFormat : DEFAULT_FORMAT);
}
public void setDateFormat(String dateFormat) {
this.dateFormat = dateFormat;
}
/**
* This property allows you to specify the candidacy period
* post label. (Ex.: candidatos)
*
* @property
*/
public String getCandidacyPeriodPostLabel() {
return candidacyPeriodPostLabel;
}
public void setCandidacyPeriodPostLabel(String candidacyPeriodPostLabel) {
this.candidacyPeriodPostLabel = candidacyPeriodPostLabel;
}
public boolean isCandidacyPeriodPostLabelKey() {
return isCandidacyPeriodPostLabelKey;
}
public void setIsCandidacyPeriodPostLabelKey(boolean isCandidacyPeriodPostLabelKey) {
this.isCandidacyPeriodPostLabelKey = isCandidacyPeriodPostLabelKey;
}
/**
* This property allows you to specify the voting period
* post label. (Ex.: votos)
*
* @property
*/
public String getVotingPeriodPostLabel() {
return votingPeriodPostLabel;
}
public void setVotingPeriodPostLabel(String votingPeriodPostLabel) {
this.votingPeriodPostLabel = votingPeriodPostLabel;
}
public boolean isVotingPeriodPostLabelKey() {
return isVotingPeriodPostLabelKey;
}
public void setIsVotingPeriodPostLabelKey(boolean isVotingPeriodPostLabelKey) {
this.isVotingPeriodPostLabelKey = isVotingPeriodPostLabelKey;
}
/**
* This property allows you to specify the candidacy period
* pre label. (Ex.: Candidaturas:)
*
* @property
*/
public String getCandidacyPeriodPreLabel() {
return candidacyPeriodPreLabel;
}
public void setCandidacyPeriodPreLabel(String candidacyPeriodPreLabel) {
this.candidacyPeriodPreLabel = candidacyPeriodPreLabel;
}
public boolean isCandidacyPeriodPreLabelKey() {
return isCandidacyPeriodPreLabelKey;
}
public void setIsCandidacyPeriodPreLabelKey(boolean isCandidacyPeriodPreLabelKey) {
this.isCandidacyPeriodPreLabelKey = isCandidacyPeriodPreLabelKey;
}
/**
* This property allows you to specify the voting period
* pre label. (Ex.: Período de votação:)
*
* @property
*/
public String getVotingPeriodPreLabel() {
return votingPeriodPreLabel;
}
public void setVotingPeriodPreLabel(String votingPeriodPreLabel) {
this.votingPeriodPreLabel = votingPeriodPreLabel;
}
public boolean isVotingPeriodPreLabelKey() {
return isVotingPeriodPreLabelKey;
}
public void setIsVotingPeriodPreLabelKey(boolean isVotingPeriodPreLabelKey) {
this.isVotingPeriodPreLabelKey = isVotingPeriodPreLabelKey;
}
/**
* This property allows you to specify a past period
* label. (Ex.: Período terminado:)
*
* @property
*/
public String getPastPeriodLabel() {
return pastPeriodLabel;
}
public void setPastPeriodLabel(String pastPeriodLabel) {
this.pastPeriodLabel = pastPeriodLabel;
}
public boolean isPastPeriodLabelKey() {
return isPastPeriodLabelKey;
}
public void setIsPastPeriodLabelKey(boolean isPastPeriodLabelKey) {
this.isPastPeriodLabelKey = isPastPeriodLabelKey;
}
/**
* This property allows you to specify a period
* create link label. (Ex.: Definir período)
*
* @property
*/
public String getPeriodCreateLabel() {
return periodCreateLabel;
}
public void setPeriodCreateLabel(String periodCreateLabel) {
this.periodCreateLabel = periodCreateLabel;
}
public boolean isPeriodCreateLabelKey() {
return isPeriodCreateLabelKey;
}
public void setIsPeriodCreateLabelKey(boolean isPeriodCreateLabelKey) {
this.isPeriodCreateLabelKey = isPeriodCreateLabelKey;
}
/**
* This property allows you to specify the past period
* create link label. (Ex.: Definir outro período)
*
* @property
*/
public String getPastPeriodCreateLabel() {
return pastPeriodCreateLabel;
}
public void setPastPeriodCreateLabel(String pastPeriodCreateLabel) {
this.pastPeriodCreateLabel = pastPeriodCreateLabel;
}
public boolean isPastPeriodCreateLabelKey() {
return isPastPeriodCreateLabelKey;
}
public void setIsPastPeriodCreateLabelKey(boolean isPastPeriodCreateLabelKey) {
this.isPastPeriodCreateLabelKey = isPastPeriodCreateLabelKey;
}
public String getLinkFormat() {
return this.linkFormat;
}
/**
* This property allows you to specify the format of the final link. In this
* format you can use properties of the object being presented. For example:
*
*
* format="/some/action.do?oid=${id}"
*
*
* @see RenderUtils#getFormattedProperties(String, Object)
* @property
*/
public void setLinkFormat(String linkFormat) {
this.linkFormat = linkFormat;
}
public boolean isContextRelative() {
return this.contextRelative;
}
/**
* Indicates that the link specified should be relative to the context of the
* application and not to the current module. This also overrides the module
* if a destination is specified.
*
* @property
*/
public void setContextRelative(boolean contextRelative) {
this.contextRelative = contextRelative;
}
public boolean isModuleRelative() {
return this.moduleRelative;
}
/**
* Allows you to choose if the generated link is relative to the current module. Note that
* if the link is not context relative then it also isn't module relative.
*
* @property
*/
public void setModuleRelative(boolean moduleRelative) {
this.moduleRelative = moduleRelative;
}
public String getDestination() {
return this.destination;
}
/**
* This property is an alternative to the use of the
* {@link #setLinkFormat(String) linkFormat}. With this property you can
* specify the name of the view state destination that will be used. This
* property allows you to select the concrete destination in each context
* were this configuration is used.
*
* @property
*/
public void setDestination(String destination) {
this.destination = destination;
}
public String getBundle() {
return this.bundle;
}
/**
* The bundle were the {@link #setKey(String) key} will be fetched.
*
* @property
*/
public void setBundle(String bundle) {
this.bundle = bundle;
}
public String getCurrentPeriodClasses() {
return currentPeriodClasses;
}
public void setCurrentPeriodClasses(String currentPeriodClasses) {
this.currentPeriodClasses = currentPeriodClasses;
}
public String getPastPeriodClasses() {
return pastPeriodClasses;
}
public void setPastPeriodClasses(String pastPeriodClasses) {
this.pastPeriodClasses = pastPeriodClasses;
}
@Override
protected Layout getLayout(Object object, Class type) {
return new Layout() {
@Override
public HtmlComponent createComponent(Object object, Class type) {
if (getContext().getParentContext() != null) {
Object targetObject = getContext().getParentContext().getMetaObject().getObject(); //Election
HtmlLink link = getLink(targetObject);
HtmlBlockContainer container = new HtmlBlockContainer();
DelegateElectionPeriod electionPeriod = (DelegateElectionPeriod) object;
if(electionPeriod.isCandidacyPeriod() && getVotingPeriodPostLabel() != null) {
//Showing voting periods but no voting period created. Show candidacy period.
String createLabel = (isPeriodCreateLabelKey() ? RenderUtils.getResourceString(getBundle(),
getPeriodCreateLabel()) : getPeriodCreateLabel());
HtmlBlockContainer linkContainer = new HtmlBlockContainer();
link.setBody(new HtmlText(createLabel));
linkContainer.addChild(link);
container.addChild(linkContainer);
String preLabel = getElectionPeriodPreLabel(electionPeriod);
String postLabel = getElectionPeriodPostLabel(electionPeriod);
HtmlText periodResume = new HtmlText(getPeriodResume(electionPeriod, preLabel, postLabel, true), false);
periodResume.setClasses(getPastPeriodClasses()); //Classes for candidacy period
container.addChild(periodResume);
return container;
}
else {
if (electionPeriod.isPastPeriod()) {
if(electionPeriod.isCandidacyPeriod()) {
String createLabel = (isPastPeriodCreateLabelKey() ? RenderUtils.getResourceString(getBundle(),
getPastPeriodCreateLabel()) : getPastPeriodCreateLabel());
HtmlBlockContainer linkContainer = new HtmlBlockContainer();
link.setBody(new HtmlText(createLabel));
linkContainer.addChild(link);
container.addChild(linkContainer);
}
String pastPeriodLabel = (isPastPeriodLabelKey() ? RenderUtils.getResourceString(getBundle(), getPastPeriodLabel()) : getPastPeriodLabel());
String postLabel = getElectionPeriodPostLabel(electionPeriod);
HtmlText periodResume = new HtmlText(getPeriodResume(electionPeriod, pastPeriodLabel, postLabel, true), false);
periodResume.setClasses(getPastPeriodClasses()); //Classes for past periods
container.addChild(periodResume);
return container;
}
else if (electionPeriod.isCurrentPeriod()){
String postLabel = getElectionPeriodPostLabel(electionPeriod);
String periodResume = getPeriodResume(electionPeriod, null, postLabel, true);
link.setBody(new HtmlText(periodResume, false));
link.setClasses(getCurrentPeriodClasses()); //Classes for current periods
container.addChild(link);
return container;
}
else {
String periodResume = getPeriodResume(electionPeriod, null, null, false);
link.setBody(new HtmlText(periodResume, false));
link.setClasses(getClasses()); //Default classes
container.addChild(link);
return container;
}
}
}
return new HtmlText();
}
private HtmlLink getLink(Object usedObject) {
HtmlLink link = new HtmlLink();
String url;
if (getDestination() != null) {
ViewDestination destination = getContext().getViewState().getDestination(
getDestination());
if (destination != null) {
link.setModule(destination.getModule());
url = destination.getPath();
} else {
url = "#";
}
} else {
if (getLinkFormat() != null) {
url = getLinkFormat();
} else {
url = "#";
}
}
link.setUrl(RenderUtils.getFormattedProperties(url, usedObject));
link.setModuleRelative(isModuleRelative());
link.setContextRelative(isContextRelative());
return link;
}
private String getPeriodResume(DelegateElectionPeriod electionPeriod, String preLabel, String postLabel, boolean isLongResume) {
preLabel = (preLabel != null ? preLabel + ": " : "");
postLabel = (postLabel != null ? " " + postLabel : "");
String shortResume = electionPeriod.getStartDate().toString(getDateFormat()) + getDateHtmlSeparator() +
electionPeriod.getEndDate().toString(getDateFormat());
String longResume = null;
if(electionPeriod instanceof DelegateElectionCandidacyPeriod){
longResume = "(" + ((DelegateElectionCandidacyPeriod)electionPeriod).getDelegateElection().getCandidatesCount() + postLabel + ")";
}
else{
longResume = "(" + ((DelegateElectionVotingPeriod)electionPeriod).getDelegateElection().getVotesCount() + postLabel + ")";
}
return (isLongResume ? preLabel + shortResume + "
" + longResume : preLabel + shortResume);
}
private String getElectionPeriodPostLabel(DelegateElectionPeriod electionPeriod){
String postLabel;
if(electionPeriod.isCandidacyPeriod()) {
postLabel = (isCandidacyPeriodPostLabelKey() ? RenderUtils.getResourceString(getBundle(), getCandidacyPeriodPostLabel()) : getCandidacyPeriodPostLabel());
}
else {
postLabel = (isVotingPeriodPostLabelKey() ? RenderUtils.getResourceString(getBundle(), getVotingPeriodPostLabel()) : getVotingPeriodPostLabel());
}
return postLabel;
}
private String getElectionPeriodPreLabel(DelegateElectionPeriod electionPeriod){
String preLabel;
if(electionPeriod.isCandidacyPeriod()) {
preLabel = (isCandidacyPeriodPreLabelKey() ? RenderUtils.getResourceString(getBundle(), getCandidacyPeriodPreLabel()) : getCandidacyPeriodPreLabel());
}
else {
preLabel = (isVotingPeriodPreLabelKey() ? RenderUtils.getResourceString(getBundle(), getVotingPeriodPreLabel()) : getVotingPeriodPreLabel());
}
return preLabel;
}
};
}
}