001package org.nasdanika.html.model.bootstrap.gen; 002 003import java.util.LinkedHashMap; 004import java.util.Map; 005 006import org.eclipse.emf.ecore.EStructuralFeature; 007import org.nasdanika.common.BiSupplier; 008import org.nasdanika.common.Consumer; 009import org.nasdanika.common.ConsumerFactory; 010import org.nasdanika.common.Context; 011import org.nasdanika.common.FunctionFactory; 012import org.nasdanika.common.MapCompoundConsumerFactory; 013import org.nasdanika.common.ProgressMonitor; 014import org.nasdanika.common.Supplier; 015import org.nasdanika.common.SupplierFactory; 016import org.nasdanika.common.Util; 017import org.nasdanika.common.persistence.ConfigurationException; 018import org.nasdanika.common.persistence.Marked; 019import org.nasdanika.emf.EObjectAdaptable; 020import org.nasdanika.html.Button; 021import org.nasdanika.html.HTMLElement; 022import org.nasdanika.html.HTMLFactory; 023import org.nasdanika.html.bootstrap.BootstrapFactory; 024import org.nasdanika.html.bootstrap.Breakpoint; 025import org.nasdanika.html.bootstrap.Modal; 026import org.nasdanika.html.model.bootstrap.BootstrapElement; 027import org.nasdanika.html.model.bootstrap.BootstrapPackage; 028 029public class ModalSupplierFactoryAdapter extends BootstrapElementSupplierFactoryAdapter<org.nasdanika.html.model.bootstrap.Modal, org.nasdanika.html.bootstrap.Modal> { 030 031 public ModalSupplierFactoryAdapter(org.nasdanika.html.model.bootstrap.Modal modal) { 032 super(modal); 033 } 034 035 protected Supplier<BiSupplier<Map<EStructuralFeature, HTMLElement<?>>, org.nasdanika.html.bootstrap.Modal>> createModalSupplier(Context context) { 036 return new Supplier<BiSupplier<Map<EStructuralFeature, HTMLElement<?>>, org.nasdanika.html.bootstrap.Modal>>() { 037 038 @Override 039 public double size() { 040 return 1; 041 } 042 043 @Override 044 public String name() { 045 return "Modal"; 046 } 047 048 @Override 049 public BiSupplier<Map<EStructuralFeature, HTMLElement<?>>, org.nasdanika.html.bootstrap.Modal> execute(ProgressMonitor progressMonitor) throws Exception { 050 BootstrapFactory bootstrapFactory = context.get(BootstrapFactory.class, BootstrapFactory.INSTANCE); 051 org.nasdanika.html.bootstrap.Modal modal = bootstrapFactory.modal(); 052 org.nasdanika.html.model.bootstrap.Modal semanticElement = getTarget(); 053 054 modal.centered(semanticElement.isCentered()); 055 modal.scrollable(semanticElement.isScrollable()); 056 057 String size = semanticElement.getSize(); 058 if (!Util.isBlank(size)) { 059 switch (size) { 060 case "small": 061 modal.size(Breakpoint.SMALL); 062 break; 063 case "large": 064 modal.size(Breakpoint.LARGE); 065 break; 066 case "extra-large": 067 modal.size(Breakpoint.EXTRA_LARGE); 068 break; 069 default: 070 throw new ConfigurationException("Unsupported modal size: " + size, EObjectAdaptable.adaptTo(semanticElement, Marked.class)); 071 } 072 } 073 074 Map<EStructuralFeature, HTMLElement<?>> parts = new LinkedHashMap<>(); 075 076 if (semanticElement.getHeader() != null) { 077 parts.put(BootstrapPackage.Literals.MODAL__HEADER, modal.getHeader().toHTMLElement()); 078 } 079 080 if (semanticElement.getBody() != null) { 081 parts.put(BootstrapPackage.Literals.MODAL__BODY, modal.getBody().toHTMLElement()); 082 } 083 084 if (semanticElement.getFooter() != null) { 085 parts.put(BootstrapPackage.Literals.MODAL__FOOTER, modal.getFooter().toHTMLElement()); 086 } 087 088 return new BiSupplier<Map<EStructuralFeature,HTMLElement<?>>, org.nasdanika.html.bootstrap.Modal>() { 089 090 @Override 091 public Map<EStructuralFeature, HTMLElement<?>> getFirst() { 092 return parts; 093 } 094 095 @Override 096 public org.nasdanika.html.bootstrap.Modal getSecond() { 097 return modal; 098 } 099 }; 100 } 101 102 }; 103 } 104 105 @SuppressWarnings({ "unchecked", "rawtypes" }) 106 @Override 107 protected Supplier<org.nasdanika.html.bootstrap.Modal> createBootstrapElementSupplier(Context context) throws Exception { 108 MapCompoundConsumerFactory<EStructuralFeature,HTMLElement<?>> partsFactory = new MapCompoundConsumerFactory<>("Parts"); 109 org.nasdanika.html.model.bootstrap.Modal semanticElement = getTarget(); 110 111 BootstrapElement header = semanticElement.getHeader(); 112 if (header != null) { 113 partsFactory.put(BootstrapPackage.Literals.MODAL__HEADER, (ConsumerFactory<HTMLElement<?>>) (ConsumerFactory) EObjectAdaptable.adaptToConsumerFactoryNonNull(header, org.nasdanika.html.HTMLElement.class)); 114 } 115 116 BootstrapElement body = semanticElement.getBody(); 117 if (body != null) { 118 partsFactory.put(BootstrapPackage.Literals.MODAL__BODY, (ConsumerFactory<HTMLElement<?>>) (ConsumerFactory) EObjectAdaptable.adaptToConsumerFactoryNonNull(body, org.nasdanika.html.HTMLElement.class)); 119 } 120 121 BootstrapElement footer = semanticElement.getFooter(); 122 if (footer != null) { 123 partsFactory.put(BootstrapPackage.Literals.MODAL__FOOTER, (ConsumerFactory<HTMLElement<?>>) (ConsumerFactory) EObjectAdaptable.adaptToConsumerFactoryNonNull(footer, org.nasdanika.html.HTMLElement.class)); 124 } 125 126 SupplierFactory<BiSupplier<Map<EStructuralFeature, HTMLElement<?>>, org.nasdanika.html.bootstrap.Modal>> modalSupplierFactory = this::createModalSupplier; 127 FunctionFactory<BiSupplier<Map<EStructuralFeature, HTMLElement<?>>, org.nasdanika.html.bootstrap.Modal>, org.nasdanika.html.bootstrap.Modal> partsFunctionFactory = partsFactory.asBiSupplierFunctionFactory(); 128 129 @SuppressWarnings("resource") 130 Consumer<org.nasdanika.html.bootstrap.Modal> dismisserBinder = new Consumer<org.nasdanika.html.bootstrap.Modal>() { 131 132 @Override 133 public double size() { 134 return 1; 135 } 136 137 @Override 138 public String name() { 139 return "Binding dismisser"; 140 } 141 142 @Override 143 public void execute(org.nasdanika.html.bootstrap.Modal modal, ProgressMonitor progressMonitor) throws Exception { 144 Button dismisser = context.get(HTMLFactory.class, HTMLFactory.INSTANCE).button("x").addClass("close"); 145 modal.getHeader().toHTMLElement().content(dismisser); 146 modal.bindDismisser(dismisser); 147 } 148 149 }; 150 151 Supplier<Modal> modalSupplier = modalSupplierFactory.then(partsFunctionFactory).create(context); 152 if (semanticElement.isDismisser() && header != null) { 153 return modalSupplier.then(dismisserBinder.asFunction()); 154 } 155 return modalSupplier; 156 } 157 158}