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