/** * */ package net.sourceforge.fenixedu.presentationTier.renderers.inquiries; import java.util.MissingResourceException; import java.util.Properties; import java.util.ResourceBundle; import net.sourceforge.fenixedu.dataTransferObject.inquiries.CheckBoxQuestion; import net.sourceforge.fenixedu.dataTransferObject.inquiries.InquiriesBlock; import net.sourceforge.fenixedu.dataTransferObject.inquiries.InquiriesQuestion; import net.sourceforge.fenixedu.dataTransferObject.inquiries.QuestionHeader; import net.sourceforge.fenixedu.dataTransferObject.inquiries.RadioGroupQuestion; import net.sourceforge.fenixedu.dataTransferObject.inquiries.TextBoxQuestion; import org.apache.commons.lang.StringUtils; import pt.ist.fenixWebFramework.renderers.InputRenderer; import pt.ist.fenixWebFramework.renderers.components.HtmlComponent; import pt.ist.fenixWebFramework.renderers.components.HtmlFormComponent; import pt.ist.fenixWebFramework.renderers.components.HtmlRadioButton; import pt.ist.fenixWebFramework.renderers.components.HtmlRadioButtonGroup; 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.components.HtmlTableCell.CellType; import pt.ist.fenixWebFramework.renderers.contexts.PresentationContext; import pt.ist.fenixWebFramework.renderers.layouts.Layout; import pt.ist.fenixWebFramework.renderers.model.MetaObject; import pt.ist.fenixWebFramework.renderers.model.MetaObjectFactory; import pt.ist.fenixWebFramework.renderers.model.MetaSlot; import pt.ist.fenixWebFramework.renderers.utils.RenderKit; import pt.utl.ist.fenix.tools.util.i18n.Language; /** * @author - Shezad Anavarali (shezad@ist.utl.pt) * */ public class InquiriesQuestionBlockRenderer extends InputRenderer { private final ResourceBundle inquiriesResources = ResourceBundle.getBundle("resources.InquiriesResources", Language .getLocale()); private String columnClasses; public String getColumnClasses() { return columnClasses; } public void setColumnClasses(String columnClasses) { this.columnClasses = columnClasses; } @Override protected Layout getLayout(Object object, Class type) { return new InquiriesQuestionBlockLayout(object); } private class InquiriesQuestionBlockLayout extends Layout { public InquiriesQuestionBlockLayout(Object object) { } @Override public HtmlComponent createComponent(Object object, Class type) { final InquiriesBlock block = (InquiriesBlock) object; final HtmlTable mainTable = new HtmlTable(); if (block.hasHeader()) { createHeaderRow(block.getHeader(), mainTable, block); } MetaObject metaObject = MetaObjectFactory.createObject(block.getQuestions(), RenderKit.getInstance().findSchema( "inquiriesQuestion.answer")); getContext().getViewState().setMetaObject(metaObject); HtmlTableRow questionRow = null; for (MetaSlot metaSlot : metaObject.getAllSlots()) { InquiriesQuestion inquiriesQuestion = (InquiriesQuestion) metaSlot.getMetaObject().getObject(); if (inquiriesQuestion.hasHeader()) { createHeaderRow(inquiriesQuestion.getHeader(), mainTable, block); } if (inquiriesQuestion.getNewRow()) { questionRow = mainTable.createRow(); final HtmlTableCell labelCell = questionRow.createCell(CellType.HEADER); labelCell.setBody(new HtmlText(getResource(inquiriesQuestion.getLabel()) + getQuestionRequiredIndication(inquiriesQuestion) + getQuestionToolTip(inquiriesQuestion.getToolTip()), false)); labelCell.addClass("width300px brightccc"); } PresentationContext newContext = getContext().createSubContext(metaSlot); newContext.setSchema(metaSlot.getSchema() != null ? metaSlot.getSchema().getName() : null); RenderKit kit = RenderKit.getInstance(); HtmlFormComponent formComponent = null; final int scaleHeadersCount = block.hasHeader() ? block.getHeader().getScaleHeadersCount() : 0; if (inquiriesQuestion instanceof TextBoxQuestion) { final TextBoxQuestion textBoxQuestion = (TextBoxQuestion) inquiriesQuestion; newContext.setLayout("inquiries-answer-textbox"); Properties properties = new Properties(metaSlot.getProperties()); properties.put("textArea", textBoxQuestion.isTextArea()); newContext.setProperties(properties); formComponent = (HtmlFormComponent) kit.render(newContext, metaSlot.getObject(), metaSlot.getType()); final HtmlTableCell cell = questionRow.createCell(); cell.setColspan(textBoxQuestion.getAutofit() ? scaleHeadersCount : 1); cell.setBody(formComponent); cell.setClasses("aleft"); } else if (inquiriesQuestion instanceof RadioGroupQuestion) { final RadioGroupQuestion radioGroupQuestion = (RadioGroupQuestion) inquiriesQuestion; newContext.setLayout("inquiries-answer-radiogroup"); Properties properties = new Properties(metaSlot.getProperties()); properties.put("radioGroupChoices", radioGroupQuestion.getChoices()); newContext.setProperties(properties); formComponent = (HtmlFormComponent) kit.render(newContext, metaSlot.getObject(), metaSlot.getType()); for (HtmlRadioButton htmlRadioButton : ((HtmlRadioButtonGroup) formComponent).getRadioButtons()) { htmlRadioButton.bind(metaSlot); questionRow.createCell().setBody(htmlRadioButton); } } else if (inquiriesQuestion instanceof CheckBoxQuestion) { newContext.setLayout("inquiries-answer-checkbox"); // metaSlot.setLayout("inquiries-answer-checkbox"); newContext.setProperties(metaSlot.getProperties()); formComponent = (HtmlFormComponent) kit.render(newContext, metaSlot.getObject(), metaSlot.getType()); final HtmlTableCell cell = questionRow.createCell(); // cell.setColspan(block.getHeader().getScaleHeadersCount()); cell.setBody(formComponent); if (scaleHeadersCount > 1 && inquiriesQuestion.getAutofit()) { questionRow.createCell().setColspan(scaleHeadersCount - 1); } } formComponent.bind(metaSlot); applyStyles(questionRow); } getInputContext().getForm().getCancelButton().setVisible(false); return mainTable; } private void applyStyles(final HtmlTableRow questionRow) { String[] cellClasses = null; if (getColumnClasses() != null) { cellClasses = getColumnClasses().split(",", -1); } if (cellClasses != null) { int cellIndex = 0; for (HtmlTableCell cell : questionRow.getCells()) { String chooseCellClass = cellClasses[cellIndex % cellClasses.length]; if (!chooseCellClass.equals("")) { cell.setClasses(chooseCellClass); } cellIndex++; } } } private String getQuestionToolTip(final InquiriesQuestion inquiriesQuestion) { return (inquiriesQuestion.hasToolTip() ? " [?] " + getResource(inquiriesQuestion.getToolTip()) + "" : StringUtils.EMPTY); } private String getQuestionToolTip(final String tooltip) { return (!StringUtils.isEmpty(tooltip) ? " [?] " + getResource(tooltip) + "" : StringUtils.EMPTY); } private String getQuestionRequiredIndication(final InquiriesQuestion inquiriesQuestion) { return inquiriesQuestion.getRequired() && inquiriesQuestion.getShowRequiredMark() ? " *" : StringUtils.EMPTY; } private String getResource(String label) { try { return inquiriesResources.getString(label); } catch (MissingResourceException e) { } return label; } private void createHeaderRow(final QuestionHeader header, final HtmlTable mainTable, InquiriesBlock block) { final HtmlTableRow headerRow = mainTable.createRow(); final HtmlTableCell firstHeaderCell = headerRow.createCell(CellType.HEADER); firstHeaderCell .setBody(new HtmlText(getResource(header.getTitle()) + getQuestionToolTip(header.getToolTip()), false)); firstHeaderCell.addClass("width300px"); if (header.hasScaleHeaders()) { for (String scale : header.getScaleHeaders()) { HtmlTableCell headerCell = headerRow.createCell(CellType.HEADER); headerCell.setBody(new HtmlText(getResource(scale), false)); headerCell.addClass("acenter valignbottom"); } } else { headerRow.createCell(CellType.HEADER).setColspan(block.getHeader().getScaleHeadersCount()); } } @Override public String getClasses() { return "tstyle2 thlight thleft tdcenter tdwith50px thpadding5px10px"; } } }