package org.sikuli.slides.driver;
import java.util.List;
import org.sikuli.api.Target;
import org.sikuli.slides.api.models.ImageElement;
import org.sikuli.slides.api.models.Slide;
import org.sikuli.slides.api.models.SlideElement;
import org.sikuli.slides.api.sikuli.ContextImageTarget;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DefaultUISpecInterpreter implements SlideSpecInterpreter {
static Logger log = LoggerFactory.getLogger(DefaultUISpecInterpreter.class);
@Override
public SlideSpec interpret(Slide slide) {
SlideSpec page = new SlideSpec();
// find all targets
List<SlideElement> targetElements = slide.select().isTarget().all();
// for each target element, create a context target
for (SlideElement targetElement : targetElements){
ImageElement imageElement = (ImageElement) slide.select().intersects(targetElement).isImage().first();
if (imageElement == null)
continue;
Target target = interpret(slide, targetElement);
if (target == null)
continue;
SlideElement labelElement = slide.select().intersects(targetElement).hasText().first();
if (labelElement == null)
continue;
DefaultWidget element = new DefaultWidget(target, labelElement.getText());
page.add(element);
log.trace("added to spec: " + element);
}
return page;
}
public Target interpret(Slide slide, SlideElement targetElement) {
ImageElement imageElement = (ImageElement) slide.select().intersects(targetElement).isImage().first();
if (imageElement == null)
return null;
Target target = createTarget(imageElement, targetElement);
if (target == null)
return null;
return target;
}
Target createTarget(ImageElement imageElement, SlideElement targetElement){
if (imageElement == null || targetElement == null)
return null;
int w = imageElement.getCx();
int h = imageElement.getCy();
if (w <= 0 || h <= 0)
return null;
double xmax = 1.0 * (targetElement.getOffx() + targetElement.getCx() - imageElement.getOffx()) / w;
double ymax = 1.0 * (targetElement.getOffy() + targetElement.getCy() - imageElement.getOffy()) / h;
double xmin = 1.0 * (targetElement.getOffx() - imageElement.getOffx()) / w;
double ymin = 1.0 * (targetElement.getOffy() - imageElement.getOffy()) / h;
xmax = Math.min(1.0, xmax);
ymax = Math.min(1.0, ymax);
xmin = Math.max(0, xmin);
ymin = Math.max(0, ymin);
return new ContextImageTarget(imageElement.getSource(), xmin, ymin, xmax, ymax);
}
}