package com.twasyl.slideshowfx.engine.presentation.configuration;
import com.twasyl.slideshowfx.engine.template.configuration.SlideTemplate;
import javafx.scene.image.Image;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.logging.Logger;
/**
* Represents a slide of the presentation. The slide is composed of:
* <ul>
* <li>a {@link SlideTemplate template} with allows to know from which template it has been created ;</li>
* <li>an {@link #getId() id} which represents an internal ID for the sliden, not the HTML one ;</li>
* <li>a {@link #getSlideNumber() number} ;</li>
* <li>a {@link #getThumbnail() thumbnail} which is like a screenshot of the slide in order to display it in
* the SlideshowFX' UI ;</li>
* <li>a collection of {@link #getElements() elements} which correspond to all dynamic elements of the slide </li>
* </ul>
*
* @author Thierry Wasylczenko
* @version 1.0.0
* @since SlideshowFX 1.0
*/
public class Slide {
private static final Logger LOGGER = Logger.getLogger(Slide.class.getName());
private SlideTemplate template;
private String id;
private String slideNumber;
private Image thumbnail;
private final Set<SlideElement> elements = new HashSet<>();
public Slide() {
}
public Slide(String slideNumber) {
this.slideNumber = slideNumber;
}
public Slide(SlideTemplate template, String slideNumber) {
this.template = template;
this.slideNumber = slideNumber;
}
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public SlideTemplate getTemplate() { return template; }
public void setTemplate(SlideTemplate template) { this.template = template; }
public String getSlideNumber() { return slideNumber; }
public void setSlideNumber(String slideNumber) { this.slideNumber = slideNumber; }
public Image getThumbnail() { return thumbnail; }
public void setThumbnail(Image thumbnail) { this.thumbnail = thumbnail; }
/**
* The elements contained in the slide.
* @return The collection containing the slide elements.
*/
public Set<SlideElement> getElements() { return elements; }
/**
* Search for an {@link SlideElement element} with the given {@code id}.
* @param id The ID of the element to look for.
* @return The {@link SlideElement element} with the given ID or {@code null} if it is not found.
* @throws NullPointerException If the given ID is {@code null}.
*/
public SlideElement getElement(final String id) throws NullPointerException {
Optional<SlideElement> element = this.getElements().stream().filter(e -> id.equals(e.getId())).findFirst();
return element.isPresent() ? element.get() : null;
}
/**
* Update the slide element identified by its {@code elementId} with the provided content.
* The given content should not be given in Base64.
* @param elementId The ID of the element to update.
* @param code The code corresponding to the markup syntax used to define the original content.
* @param originalContent The original content if the element.
* @param htmlContent The HTML content of this element.
* @return The element that has been updated.
*/
public SlideElement updateElement(String elementId, String code, String originalContent, String htmlContent) {
SlideElement updatedElement = null;
Optional<SlideElement> slideElement = getElements().stream()
.filter(element -> element.getId().equals(elementId))
.findFirst();
if(slideElement.isPresent()) {
slideElement.get().setOriginalContentCode(code);
slideElement.get().setOriginalContent(originalContent);
slideElement.get().setHtmlContent(htmlContent);
updatedElement = slideElement.get();
} else {
SlideElement se = new SlideElement();
se.setId(elementId);
se.setOriginalContentCode(code);
se.setOriginalContent(originalContent);
se.setHtmlContent(htmlContent);
getElements().add(se);
updatedElement = se;
}
return updatedElement;
}
}