package org.fugazi.qls.gui;
import org.fugazi.ql.ast.form.Form;
import org.fugazi.ql.ast.statement.IfStatement;
import org.fugazi.ql.gui.GUIBuilder;
import org.fugazi.ql.gui.ui_element.ui_questions.UIQuestion;
import org.fugazi.qls.ast.question.QLSQuestion;
import org.fugazi.qls.ast.segment.Page;
import org.fugazi.qls.ast.segment.Section;
import org.fugazi.qls.ast.stylesheet.stylesheet_data.QLSStyleSheetDataStorage;
import org.fugazi.qls.gui.ui_segment.UIPage;
import org.fugazi.qls.gui.ui_segment.UISection;
import org.fugazi.qls.gui.widget.QLSWidgetsFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class StyledGUIBuilder extends GUIBuilder {
private final Map<UISection, List<UIQuestion>> visibleQuestionsPerSection;
private final Map<UIQuestion, UISection> parentSections;
private final Map<UIPage, List<UISection>> visibleSectionsPerPage;
private final Map<UISection, UIPage> parentPages;
public StyledGUIBuilder(
Form _form,
QLSStyleSheetDataStorage _qlsData)
{
super(_form, new QLSWidgetsFactory(_qlsData), new QLSUIFormManager(_form.getName()));
this.visibleQuestionsPerSection = new HashMap<>();
this.parentSections = new HashMap<>();
this.visibleSectionsPerPage = new HashMap<>();
this.parentPages = new HashMap<>();
this.prepareForm(_qlsData);
}
/**
* =====================
* Form updates
* =====================
*/
@Override
protected void updateForm(Map<UIQuestion, List<IfStatement>> _questionsWithConditionState) {
if (_questionsWithConditionState == null)
return;
QLSUIFormManager formManager = (QLSUIFormManager) this.uiFormManager;
for (UIQuestion uiQuestion : _questionsWithConditionState.keySet()) {
if (this.isQuestionStateTrue(_questionsWithConditionState, uiQuestion)) {
this.setQuestionVisible(uiQuestion, formManager);
} else {
this.unsetQuestionVisible(uiQuestion, formManager);
}
}
}
/**
* =====================
* Element visbility methods
* =====================
*/
private void setQuestionVisible(UIQuestion _uiQuestion, QLSUIFormManager _formManager) {
UISection uiSection = this.parentSections.get(_uiQuestion);
UIPage uiPage = this.parentPages.get(uiSection);
this.addVisibleSectionToPage(uiSection, uiPage, _formManager);
this.addVisibleQuestionToSection(_uiQuestion, uiSection, _formManager);
_formManager.addQuestion(_uiQuestion);
}
private void unsetQuestionVisible(UIQuestion _uiQuestion, QLSUIFormManager _formManager) {
UISection parentSection = this.parentSections.get(_uiQuestion);
this.removeVisibleQuestionFromSection(_uiQuestion, parentSection, _formManager);
List<UIQuestion> visibleQuestions = this.visibleQuestionsPerSection.get(parentSection);
if (visibleQuestions != null && visibleQuestions.isEmpty()) {
UIPage parentPage = this.parentPages.get(parentSection);
this.removeVisibleSectionFromPage(parentSection, parentPage, _formManager);
List<UISection> visibleSections = this.visibleSectionsPerPage.get(parentPage);
if (visibleSections != null && visibleSections.isEmpty()) {
this.removeVisiblePage(parentPage, _formManager);
}
}
}
private void addVisibleQuestionToSection(
UIQuestion _uiQuestion, UISection _section, QLSUIFormManager _formManager) {
List<UIQuestion> visibleQuestions = this.visibleQuestionsPerSection.get(_section);
if (visibleQuestions == null) {
visibleQuestions = new ArrayList<>();
}
if (!visibleQuestions.contains(_uiQuestion)) {
visibleQuestions.add(_uiQuestion);
this.visibleQuestionsPerSection.put(_section, visibleQuestions);
}
_formManager.addSection(_section);
}
private void removeVisibleQuestionFromSection(
UIQuestion _uiQuestion, UISection _section, QLSUIFormManager _formManager) {
List<UIQuestion> visibleQuestions = this.visibleQuestionsPerSection.get(_section);
if (visibleQuestions != null && visibleQuestions.contains(_uiQuestion)) {
visibleQuestions.remove(_uiQuestion);
this.visibleQuestionsPerSection.put(_section, visibleQuestions);
}
_formManager.removeQuestion(_uiQuestion);
}
private void addVisibleSectionToPage(
UISection _section, UIPage _uiPage, QLSUIFormManager _formManager) {
List<UISection> visibleSections = this.visibleSectionsPerPage.get(_uiPage);
if (visibleSections == null) {
visibleSections = new ArrayList<>();
}
if (!visibleSections.contains(_section)) {
visibleSections.add(_section);
this.visibleSectionsPerPage.put(_uiPage, visibleSections);
}
_formManager.addPage(_uiPage);
}
private void removeVisibleSectionFromPage(
UISection _section, UIPage _uiPage, QLSUIFormManager _formManager) {
List<UISection> visibleSections = this.visibleSectionsPerPage.get(_uiPage);
if (visibleSections != null && visibleSections.contains(_section)) {
visibleSections.remove(_section);
this.visibleSectionsPerPage.put(_uiPage, visibleSections);
}
_formManager.removeSection(_section);
}
private void removeVisiblePage(UIPage _page, QLSUIFormManager _formManager){
_formManager.removePage(_page);
}
/**
* =====================
* Initial form preparation
* =====================
*/
private void prepareForm(QLSStyleSheetDataStorage _qlsData) {
int pageIndex = 0;
for (Page page : _qlsData.getPages()) {
List<Section> sections = page.getSections();
UIPage uiPage = new UIPage(page.getName(), pageIndex, sections.size());
pageIndex++;
int sectionIndex = 0;
for (Section section : sections) {
List<QLSQuestion> questions = section.getQuestions();
UISection uiSection = this.prepareSection(uiPage, section.getName(), sectionIndex);
sectionIndex++;
for (QLSQuestion question : questions) {
this.prepareQuestion(question, uiSection);
}
}
}
}
private void prepareQuestion(QLSQuestion _question, UISection _section) {
UIQuestion uiQuestion = this.getUIQuestionById(
_question.getIdName(), this.questionsWithConditions
);
this.parentSections.put(uiQuestion, _section);
}
private UISection prepareSection(UIPage _page, String _name, int _index) {
UISection uiSection = new UISection(_page, _name, _index);
this.parentPages.put(uiSection, _page);
return uiSection;
}
}