package org.qrone.r7.parser;
import java.util.List;
import java.util.Set;
import org.qrone.r7.script.browser.Function;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class HTML5NodeSet implements HTML5Node{
private HTML5Template template;
private Set<Node> set;
public HTML5NodeSet(HTML5Template template, Set<Node> set) {
this.template = template;
this.set = set;
}
public HTML5Node clone(){
return new HTML5NodeSet(template.newTemplate(),set);
}
public HTML5Node first(){
Node node = set.iterator().next();
if(node instanceof Element)
return template.override((Element)node);
return null;
}
private HTML5Node exec(final Delegate f){
for (Node node : set) {
if(node instanceof Element)
f.call(template.override((Element)node));
}
return this;
}
public HTML5Node addClass(final String cls){
return exec(new Delegate() {
public void call(HTML5Element e) {
e.addClass(cls);
}
});
}
public HTML5Node removeClass(final String cls){
return exec(new Delegate() {
public void call(HTML5Element e) {
e.removeClass(cls);
}
});
}
public String attr(final String prop){
return first().attr(prop);
}
public HTML5Node attr(final String prop, final String value){
return exec(new Delegate() {
public void call(HTML5Element e) {
e.attr(prop, value);
}
});
}
public String css(final String prop){
return first().css(prop);
}
public HTML5Node css(final String prop, final String value){
return exec(new Delegate() {
public void call(HTML5Element e) {
e.css(prop, value);
}
});
}
public String html(){
final StringBuilder b = new StringBuilder();
exec(new Delegate() {
public void call(HTML5Element e) {
b.append(e.html());
}
});
return b.toString();
}
public HTML5Node html(final HTML5Template html){
return exec(new Delegate() {
public void call(HTML5Element e) {
e.html(html);
}
});
}
public HTML5Node html(final HTML5Node html){
return exec(new Delegate() {
public void call(HTML5Element e) {
e.html(html);
}
});
}
public HTML5Node html(final Function html){
return exec(new Delegate() {
public void call(HTML5Element e) {
e.html(html);
}
});
}
public HTML5Node html(final String html){
return exec(new Delegate() {
public void call(HTML5Element e) {
e.html(html);
}
});
}
public HTML5Node each(final Function func){
return exec(new Delegate() {
public void call(HTML5Element e) {
func.call(e);
}
});
}
public static interface Delegate{
public void call(HTML5Element e);
}
@Override
public HTML5Node appendChild(final HTML5Node o) {
return exec(new Delegate() {
public void call(HTML5Element e) {
e.appendChild(o);
}
});
}
@Override
public HTML5Node append(final HTML5Node o) {
return exec(new Delegate() {
public void call(HTML5Element e) {
e.append(o);
}
});
}
@Override
public HTML5Node append(final Function o) {
return exec(new Delegate() {
public void call(HTML5Element e) {
e.append(o);
}
});
}
@Override
public HTML5Node append(final String o) {
return exec(new Delegate() {
public void call(HTML5Element e) {
e.append(o);
}
});
}
@Override
public HTML5Node prepend(final HTML5Node o) {
return exec(new Delegate() {
public void call(HTML5Element e) {
e.prepend(o);
}
});
}
@Override
public HTML5Node prepend(final Function o) {
return exec(new Delegate() {
public void call(HTML5Element e) {
e.prepend(o);
}
});
}
@Override
public HTML5Node prepend(final String o) {
return exec(new Delegate() {
public void call(HTML5Element e) {
e.prepend(o);
}
});
}
@Override
public HTML5Node removeChild(final HTML5Node o) {
return exec(new Delegate() {
public void call(HTML5Element e) {
e.removeChild(o);
}
});
}
public HTML5Node remove(HTML5Node node){
return removeChild(node);
}
@Override
public HTML5Node remove() {
return exec(new Delegate() {
public void call(HTML5Element e) {
e.remove();
}
});
}
@Override
public HTML5Node select(String o) {
return template.select(o, this);
}
public Set<Node> get(){
return set;
}
public Set<Node> get(boolean override){
return set;
}
@Override
public HTML5Node repeat(final List l) {
return exec(new Delegate() {
public void call(HTML5Element e) {
e.repeat(l);
}
});
}
@Override
public HTML5Node repeat(final List l, final Function f) {
return exec(new Delegate() {
public void call(HTML5Element e) {
e.repeat(l, f);
}
});
}
@Override
public HTML5Template getDocument() {
return template;
}
}