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}