001package org.nasdanika.html.model.bootstrap.gen; 002 003import java.util.List; 004 005import org.eclipse.emf.common.notify.AdapterFactory; 006import org.nasdanika.common.BiSupplier; 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) throws Exception { 028 029 @SuppressWarnings("resource") 030 Function<BiSupplier<Tag, List<Object>>, Tag> carouselFunction = new Function<BiSupplier<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(BiSupplier<Tag, List<Object>> input, ProgressMonitor progressMonitor) throws Exception { 044 Tag tag = input.getFirst(); 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.getSecond(); 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