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