001package org.nasdanika.html.model.bootstrap.gen;
002
003import java.util.List;
004
005import org.eclipse.emf.common.notify.AdapterFactory;
006import org.nasdanika.common.Supplier;
007import org.nasdanika.common.Context;
008import org.nasdanika.common.Function;
009import org.nasdanika.common.ListCompoundSupplierFactory;
010import org.nasdanika.common.ProgressMonitor;
011import org.nasdanika.common.Util;
012import org.nasdanika.emf.EObjectAdaptable;
013import org.nasdanika.html.Button;
014import org.nasdanika.html.HTMLElement;
015import org.nasdanika.html.HTMLFactory;
016import org.nasdanika.html.Tag;
017import org.nasdanika.html.TagName;
018import org.nasdanika.html.model.bootstrap.Carousel;
019
020public class CarouselSupplierFactoryAdapter extends DivSupplierFactoryAdapter<Carousel> {
021        
022        public CarouselSupplierFactoryAdapter(Carousel carousel, AdapterFactory adapterFactory) {
023                super(carousel, adapterFactory);
024        }
025        
026        @Override
027        protected Function<org.nasdanika.html.Tag, org.nasdanika.html.Tag> createConfigureFunction(Context context) {
028                
029                @SuppressWarnings("resource")
030                Function<Supplier.FunctionResult<Tag, List<Object>>, Tag> carouselFunction = new Function<Supplier.FunctionResult<Tag, List<Object>>, Tag>() {
031                        
032                        @Override
033                        public double size() {
034                                return 1;
035                        }
036                        
037                        @Override
038                        public String name() {
039                                return "Carousel";
040                        }
041                        
042                        @Override
043                        public Tag execute(Supplier.FunctionResult<Tag, List<Object>> input, ProgressMonitor progressMonitor) {
044                                Tag tag = input.argument();
045                                tag.addClass("carousel", "slide");
046                                Carousel semanticElement = getTarget();
047                                if (semanticElement.isRide()) {
048                                        tag.attribute("data-ride", "carousel");
049                                }
050                                if (!Util.isBlank(semanticElement.getInterval())) {
051                                        tag.attribute("data-interval", semanticElement.getInterval());
052                                }
053
054                                List<Object> slides = input.result();
055                                HTMLFactory htmlFactory = tag.getFactory();
056                                
057                                Object id = tag.getId();
058                                if (id == null) {
059                                        id = htmlFactory.nextId();
060                                        tag.id(id);
061                                }
062                                
063                                Tag indicatorsList = null;
064                                
065                                // indicator
066                                if (semanticElement.isIndicator()) {
067                                        indicatorsList = htmlFactory.tag(TagName.ol).addClass("carousel-indicators");
068                                        tag.accept(indicatorsList);
069                                }
070                                
071                                Tag carouselInner = htmlFactory.div().addClass("carousel-inner");
072                                tag.accept(carouselInner);
073                                int index = 0;
074                                for (Object slide: slides) {
075                                        carouselInner.accept(slide);
076                                        Tag indicator = null;
077                                        if (indicatorsList != null) {
078                                                indicator = htmlFactory.tag(TagName.li)
079                                                        .attribute("data-target", "#" + id)
080                                                        .attribute("data-slide-to", index);
081                                                indicatorsList.accept(indicator);
082                                        }
083                                        if (index == 0) {
084                                                ((HTMLElement<?>) slide).addClass("active");
085                                                indicator.addClass("active");
086                                        }
087                                        ++index;
088                                }
089                                
090                                // controls
091                                if (semanticElement.isControls()) {
092                                        Button prevButton = htmlFactory.button()
093                                                        .addClass("carousel-control-prev", "border-0")
094                                                        .attribute("type", "button")
095                                                        .attribute("data-target", "#" + id)
096                                                        .attribute("data-slide", "prev");
097                                        
098                                        prevButton.accept(htmlFactory.span().addClass("carousel-control-prev-icon").attribute("aria-hidden", "true"));
099                                        prevButton.accept(htmlFactory.span("Previous").addClass("sr-only"));
100                                        tag.accept(prevButton);
101                                        
102                                        Button nextButton = htmlFactory.button()
103                                                        .addClass("carousel-control-next", "border-0")
104                                                        .attribute("type", "button")
105                                                        .attribute("data-target", "#" + id)
106                                                        .attribute("data-slide", "next");
107                                        
108                                        nextButton.accept(htmlFactory.span().addClass("carousel-control-next-icon").attribute("aria-hidden", "true"));
109                                        nextButton.accept(htmlFactory.span("Next").addClass("sr-only"));
110                                        tag.accept(nextButton);
111                                }
112                                
113                                // crossFade
114                                if (semanticElement.isCrossFade()) {
115                                        tag.addClass("carousel-fade");
116                                }
117                                
118                                return tag;
119                        }
120                };
121                
122                ListCompoundSupplierFactory<Object> slidesFactory = new ListCompoundSupplierFactory<>("Slides", EObjectAdaptable.adaptToSupplierFactoryNonNull(getTarget().getSlides(), Object.class));
123                
124                return super.createConfigureFunction(context).then(slidesFactory.create(context).asFunction()).then(carouselFunction);
125        }
126
127}
128