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.Supplier; 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.SupplierFactory; 016import org.nasdanika.common.Util; 017import org.nasdanika.persistence.ConfigurationException; 018import org.nasdanika.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, AdapterFactory adapterFactory) { 032 super(modal, adapterFactory); 033 } 034 035 protected Supplier<Supplier.FunctionResult<Map<EStructuralFeature, HTMLElement<?>>, org.nasdanika.html.bootstrap.Modal>> createModalSupplier(Context context) { 036 return new Supplier<Supplier.FunctionResult<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 Supplier.FunctionResult<Map<EStructuralFeature, HTMLElement<?>>, org.nasdanika.html.bootstrap.Modal> execute(ProgressMonitor progressMonitor) { 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 Supplier.FunctionResult<Map<EStructuralFeature,HTMLElement<?>>, org.nasdanika.html.bootstrap.Modal>(parts, modal); } 089 090 }; 091 } 092 093 @SuppressWarnings({ "unchecked", "rawtypes" }) 094 @Override 095 protected Supplier<org.nasdanika.html.bootstrap.Modal> createBootstrapElementSupplier(Context context) { 096 MapCompoundConsumerFactory<EStructuralFeature,HTMLElement<?>> partsFactory = new MapCompoundConsumerFactory<>("Parts"); 097 org.nasdanika.html.model.bootstrap.Modal semanticElement = getTarget(); 098 099 BootstrapElement header = semanticElement.getHeader(); 100 if (header != null) { 101 partsFactory.put(BootstrapPackage.Literals.MODAL__HEADER, (ConsumerFactory<HTMLElement<?>>) (ConsumerFactory) EObjectAdaptable.adaptToConsumerFactoryNonNull(header, org.nasdanika.html.HTMLElement.class)); 102 } 103 104 BootstrapElement body = semanticElement.getBody(); 105 if (body != null) { 106 partsFactory.put(BootstrapPackage.Literals.MODAL__BODY, (ConsumerFactory<HTMLElement<?>>) (ConsumerFactory) EObjectAdaptable.adaptToConsumerFactoryNonNull(body, org.nasdanika.html.HTMLElement.class)); 107 } 108 109 BootstrapElement footer = semanticElement.getFooter(); 110 if (footer != null) { 111 partsFactory.put(BootstrapPackage.Literals.MODAL__FOOTER, (ConsumerFactory<HTMLElement<?>>) (ConsumerFactory) EObjectAdaptable.adaptToConsumerFactoryNonNull(footer, org.nasdanika.html.HTMLElement.class)); 112 } 113 114 SupplierFactory<Supplier.FunctionResult<Map<EStructuralFeature, HTMLElement<?>>, org.nasdanika.html.bootstrap.Modal>> modalSupplierFactory = this::createModalSupplier; 115 FunctionFactory<Supplier.FunctionResult<Map<EStructuralFeature, HTMLElement<?>>, org.nasdanika.html.bootstrap.Modal>, org.nasdanika.html.bootstrap.Modal> partsFunctionFactory = partsFactory.asResultFunctionFactory(); 116 117 @SuppressWarnings("resource") 118 Consumer<org.nasdanika.html.bootstrap.Modal> dismisserBinder = new Consumer<org.nasdanika.html.bootstrap.Modal>() { 119 120 @Override 121 public double size() { 122 return 1; 123 } 124 125 @Override 126 public String name() { 127 return "Binding dismisser"; 128 } 129 130 @Override 131 public void execute(org.nasdanika.html.bootstrap.Modal modal, ProgressMonitor progressMonitor) { 132 Button dismisser = context.get(HTMLFactory.class, HTMLFactory.INSTANCE).button("x").addClass("close"); 133 modal.getHeader().toHTMLElement().content(dismisser); 134 modal.bindDismisser(dismisser); 135 } 136 137 }; 138 139 Supplier<Modal> modalSupplier = modalSupplierFactory.then(partsFunctionFactory).create(context); 140 if (semanticElement.isDismisser() && header != null) { 141 return modalSupplier.then(dismisserBinder.asFunction()); 142 } 143 return modalSupplier; 144 } 145 146}