package org.akaza.openclinica.web.pform.widget; import java.util.ArrayList; import java.util.HashMap; import org.akaza.openclinica.bean.submit.CRFVersionBean; import org.akaza.openclinica.bean.submit.ItemBean; import org.akaza.openclinica.bean.submit.ItemFormMetadataBean; import org.akaza.openclinica.bean.submit.ItemGroupBean; import org.akaza.openclinica.bean.submit.SectionBean; import org.akaza.openclinica.dao.submit.ItemGroupDAO; import org.akaza.openclinica.domain.datamap.Section; import org.akaza.openclinica.domain.rule.expression.ExpressionBean; import org.akaza.openclinica.web.pform.OpenRosaXmlGenerator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class WidgetFactory { public static final int TYPE_TEXT = 1; public static final int TYPE_TEXTAREA = 2; public static final int TYPE_CHECKBOX = 3; public static final int TYPE_FILE = 4; public static final int TYPE_RADIO = 5; public static final int TYPE_SINGLE_SELECT = 6; public static final int TYPE_MULTI_SELECT = 7; public static final int TYPE_CALCULATION = 8; public static final int TYPE_GROUP_CALCULATION = 9; public static final int TYPE_INSTANT_CALCULATION = 10; public static final String SECTION_TEXT_TYPE_SUBTITLE = "SUBTITLE"; public static final String SECTION_TEXT_TYPE_INSTRUCTIONS = "INSTRUCTIONS"; protected final Logger log = LoggerFactory.getLogger(WidgetFactory.class); private CRFVersionBean version = null; public WidgetFactory(CRFVersionBean version) { this.version = version; } public Widget getItemWidget(ItemBean item, Integer widgetType, ItemGroupBean itemGroupBean, ItemFormMetadataBean itemFormMetaDataBean, boolean isItemRequired, String responseLayout, String expression) { if (responseLayout.equalsIgnoreCase("vertical")) { switch (widgetType) { case TYPE_TEXT: return new InputWidget(version, item, null, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_SINGLE_SELECT: return new Select1Widget(version, item, Widget.APPEARANCE_MINIMAL, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_RADIO: return new Select1Widget(version, item, Widget.APPEARANCE_FULL, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_MULTI_SELECT: return new SelectWidget(version, item, Widget.APPEARANCE_MINIMAL, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_CHECKBOX: return new SelectWidget(version, item, Widget.APPEARANCE_FULL, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_TEXTAREA: return new InputWidget(version, item, Widget.APPEARANCE_MULTILINE, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_CALCULATION: return new InputWidget(version, item, null, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_GROUP_CALCULATION: return new InputWidget(version, item, null, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); default: log.debug("Unsupported form widget: " + widgetType + " Skipping."); return null; } } else { switch (widgetType) { case TYPE_TEXT: return new InputWidget(version, item, null, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_SINGLE_SELECT: return new Select1Widget(version, item, Widget.APPEARANCE_MINIMAL, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_RADIO: return new Select1Widget(version, item, Widget.APPEARANCE_HORIZONTAL_COMPACT, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_MULTI_SELECT: return new SelectWidget(version, item, Widget.APPEARANCE_MINIMAL, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_CHECKBOX: return new SelectWidget(version, item, Widget.APPEARANCE_HORIZONTAL, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_TEXTAREA: return new InputWidget(version, item, Widget.APPEARANCE_MULTILINE, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_CALCULATION: return new InputWidget(version, item, null, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); case TYPE_GROUP_CALCULATION: return new InputWidget(version, item, null, itemGroupBean, itemFormMetaDataBean, isItemRequired, expression); default: log.debug("Unsupported form widget: " + widgetType + " Skipping."); return null; } } } public Widget getHeaderWidget(ItemBean item, ItemFormMetadataBean itemMetaData, ItemGroupBean itemGroup , String expression) { int widgetType = itemMetaData.getResponseSet().getResponseType().getId(); switch (widgetType) { case TYPE_TEXT: case TYPE_SINGLE_SELECT: case TYPE_RADIO: case TYPE_MULTI_SELECT: case TYPE_CHECKBOX: case TYPE_TEXTAREA: if (itemMetaData.getHeader() != null && !itemMetaData.getHeader().equals("")) return new HeaderWidget(version, item, itemMetaData, itemGroup, null,expression); else { log.debug("No header found for widget: " + widgetType + ". Skipping."); return null; } default: log.debug("Unsupported form widget: " + widgetType + ". Skipping."); return null; } } public Widget getSectionTextWidget(String versionOid, String field, SectionBean section) { switch (field) { case SECTION_TEXT_TYPE_SUBTITLE: if (section.getSubtitle() != null && !section.getSubtitle().equals("")) return new SectionTextWidget(versionOid, section.getSubtitle(), section.getId(), SECTION_TEXT_TYPE_SUBTITLE); else { log.debug("No Subtitle found for Section. Skipping."); return null; } case SECTION_TEXT_TYPE_INSTRUCTIONS: if (section.getInstructions() != null && !section.getSubtitle().equals("")) return new SectionTextWidget(versionOid, section.getInstructions(), section.getId(), SECTION_TEXT_TYPE_INSTRUCTIONS); else { log.debug("No Instructions found for Section. Skipping."); return null; } default: log.debug("Unsupported Section Text widget: " + field + ". Skipping."); return null; } } public Widget getSubHeaderWidget(ItemBean item, ItemFormMetadataBean itemMetaData, ItemGroupBean itemGroup , String expression) { int widgetType = itemMetaData.getResponseSet().getResponseType().getId(); switch (widgetType) { case TYPE_TEXT: case TYPE_SINGLE_SELECT: case TYPE_RADIO: case TYPE_MULTI_SELECT: case TYPE_CHECKBOX: case TYPE_TEXTAREA: if (itemMetaData.getSubHeader() != null && !itemMetaData.getSubHeader().equals("")) return new SubHeaderWidget(version, item, itemMetaData, itemGroup, null,expression); else { log.debug("No SubHeader found for widget: " + widgetType + ". Skipping."); return null; } default: log.debug("Unsupported form widget: " + widgetType + ". Skipping."); return null; } } public Widget getGroupWidget(ItemGroupBean itemGroup, CRFVersionBean version, String expression) { return new GroupWidget(itemGroup, version, expression); } public Widget getSectionWidget(SectionBean section, CRFVersionBean version, String expression) { return new SectionWidget(section, version, expression); } }