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}