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