/******************************************************************************* * Copyright (c) 2014 antoniomariasanchez at gmail.com. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * antoniomaria - initial API and implementation ******************************************************************************/ package net.sf.gazpachoquest.questionnaires.views; import java.util.List; import javax.annotation.security.RolesAllowed; import javax.inject.Inject; import javax.resource.NotSupportedException; import net.sf.gazpachoquest.api.QuestionnaireResource; import net.sf.gazpachoquest.dto.QuestionDTO; import net.sf.gazpachoquest.dto.QuestionnaireDefinitionDTO; import net.sf.gazpachoquest.dto.QuestionnairePageDTO; import net.sf.gazpachoquest.dto.SectionDTO; import net.sf.gazpachoquest.jaas.auth.RespondentAccount; import net.sf.gazpachoquest.questionnaires.components.question.QuestionComponent; import net.sf.gazpachoquest.questionnaires.components.question.QuestionFactory; import net.sf.gazpachoquest.questionnaires.resource.GazpachoResource; import net.sf.gazpachoquest.types.Language; import net.sf.gazpachoquest.types.NavigationAction; import net.sf.gazpachoquest.types.RenderingMode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.vaadin.addon.cdiproperties.annotation.ButtonProperties; import com.vaadin.cdi.CDIView; import com.vaadin.navigator.View; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.Page; import com.vaadin.server.Responsive; import com.vaadin.server.VaadinServletService; import com.vaadin.server.WebBrowser; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Panel; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.Reindeer; @CDIView(QuestionnaireView.NAME) @RolesAllowed(RespondentAccount.DEFAULT_ROLE_NAME) public class QuestionnaireView extends CustomComponent implements View, ClickListener { private static final long serialVersionUID = -4474306191162456568L; public static final String NAME = "questionnaire"; private static Logger logger = LoggerFactory.getLogger(QuestionnaireView.class); @Inject @GazpachoResource private QuestionnaireResource questionnaireResource; @Inject private QuestionFactory QuestionFactory; private Integer questionnaireId; private VerticalLayout questionsLayout; @Inject @ButtonProperties(caption = "Next") private Button nextButton; @Inject @ButtonProperties(caption = "Previous") private Button previousButton; private RenderingMode renderingMode; private Language preferredLanguage; private Boolean sectionInfoVisible; public void update(QuestionnairePageDTO page) { questionsLayout.removeAllComponents(); List<SectionDTO> sections = page.getSections(); for (SectionDTO sectionDTO : sections) { if (sectionInfoVisible && page.isSectionInfoAvailable()) { final Label sectionTile = new Label(sectionDTO.getLanguageSettings().getTitle()); sectionTile.addStyleName(Reindeer.LABEL_H2); questionsLayout.addComponent(sectionTile); } List<QuestionDTO> questions = sectionDTO.getQuestions(); for (QuestionDTO questionDTO : questions) { QuestionComponent questionComponent; try { questionComponent = QuestionFactory.build(questionnaireId, questionDTO); questionsLayout.addComponent(questionComponent); } catch (NotSupportedException e) { logger.warn(e.getMessage()); } } } HorizontalLayout buttonsLayout = new HorizontalLayout(); if (page.getMetadata().isNotFirst()) { previousButton.addClickListener(this); buttonsLayout.addComponent(previousButton); } if (page.getMetadata().isNotLast()) { nextButton.addClickListener(this); buttonsLayout.addComponent(nextButton); } questionsLayout.addComponent(buttonsLayout); } @Override public void enter(ViewChangeEvent event) { logger.debug("Entering {} view ", QuestionnaireView.NAME); addStyleName(Reindeer.LAYOUT_BLUE); addStyleName("questionnaires"); WebBrowser webBrowser = Page.getCurrent().getWebBrowser(); Integer screenWidth = webBrowser.getScreenWidth(); Integer heightWidth = webBrowser.getScreenHeight(); logger.debug("Browser screen settings {} x {}", screenWidth, heightWidth); if (heightWidth <= 480) { renderingMode = RenderingMode.QUESTION_BY_QUESTION; } // centralLayout.addStyleName("questionnaires"); // new Responsive(centralLayout); RespondentAccount respondent = (RespondentAccount) VaadinServletService.getCurrentServletRequest() .getUserPrincipal(); if (respondent.hasPreferredLanguage()) { preferredLanguage = Language.fromString(respondent.getPreferredLanguage()); } else { preferredLanguage = Language.fromLocale(webBrowser.getLocale()); } questionnaireId = respondent.getGrantedquestionnaireIds().iterator().next(); logger.debug("Trying to fetch questionnair identified with id = {} ", questionnaireId); QuestionnaireDefinitionDTO definition = questionnaireResource.getDefinition(questionnaireId); sectionInfoVisible = definition.isSectionInfoVisible(); QuestionnairePageDTO page = questionnaireResource.getPage(questionnaireId, renderingMode, preferredLanguage, NavigationAction.ENTERING); logger.debug("Displaying page {}/{} with {} questions", page.getMetadata().getNumber(), page.getMetadata() .getCount(), page.getQuestions().size()); questionsLayout = new VerticalLayout(); update(page); Label questionnaireTitle = new Label(definition.getLanguageSettings().getTitle()); questionnaireTitle.addStyleName(Reindeer.LABEL_H1); VerticalLayout mainLayout = new VerticalLayout(); mainLayout.setSizeFull(); mainLayout.setMargin(true); mainLayout.addComponent(questionnaireTitle); mainLayout.addComponent(questionsLayout); // Add the responsive capabilities to the components Panel centralLayout = new Panel(); centralLayout.setContent(mainLayout); centralLayout.setSizeFull(); centralLayout.getContent().setSizeUndefined(); Responsive.makeResponsive(questionnaireTitle); setCompositionRoot(centralLayout); setSizeFull(); } private HorizontalLayout createHeader() { final HorizontalLayout layout = new HorizontalLayout(); layout.setWidth("100%"); layout.setMargin(true); layout.setSpacing(true); final Label title = new Label("Activiti + Vaadin - A Match Made in Heaven"); title.addStyleName(Reindeer.LABEL_H1); layout.addComponent(title); layout.setExpandRatio(title, 1.0f); Label currentUser = new Label(); currentUser.setSizeUndefined(); layout.addComponent(currentUser); layout.setComponentAlignment(currentUser, Alignment.MIDDLE_RIGHT); Button logout = new Button("Logout"); logout.addStyleName(Reindeer.BUTTON_SMALL); // logout.addListener(createLogoutButtonListener()); layout.addComponent(logout); layout.setComponentAlignment(logout, Alignment.MIDDLE_RIGHT); return layout; } @Override public void buttonClick(ClickEvent event) { if (nextButton.equals(event.getButton())) { QuestionnairePageDTO page = questionnaireResource.getPage(questionnaireId, renderingMode, preferredLanguage, NavigationAction.NEXT); update(page); } else { QuestionnairePageDTO page = questionnaireResource.getPage(questionnaireId, renderingMode, preferredLanguage, NavigationAction.PREVIOUS); update(page); } } }