package org.nocket.gen.page.visitor;
import gengui.domain.DomainObjectReference;
import gengui.guiadapter.ElementNotFoundException;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.util.visit.IVisit;
import org.apache.wicket.util.visit.IVisitor;
import org.nocket.component.table.GenericDataTablePanel;
import org.nocket.gen.domain.element.DomainElementI;
import org.nocket.gen.page.GeneratedBinding;
import org.nocket.gen.page.element.BodyElement;
import org.nocket.gen.page.element.ButtonElement;
import org.nocket.gen.page.element.CheckboxInputElement;
import org.nocket.gen.page.element.ContainerElement;
import org.nocket.gen.page.element.DivElement;
import org.nocket.gen.page.element.FeedbackElement;
import org.nocket.gen.page.element.FileDownloadElement;
import org.nocket.gen.page.element.FileInputElement;
import org.nocket.gen.page.element.FormElement;
import org.nocket.gen.page.element.GroupTabbedPanelElement;
import org.nocket.gen.page.element.HeaderLinkElement;
import org.nocket.gen.page.element.HeaderScriptElement;
import org.nocket.gen.page.element.ImageElement;
import org.nocket.gen.page.element.LabelElement;
import org.nocket.gen.page.element.LinkElement;
import org.nocket.gen.page.element.ModalElement;
import org.nocket.gen.page.element.PasswordInputElement;
import org.nocket.gen.page.element.PromptElement;
import org.nocket.gen.page.element.RadioInputElement;
import org.nocket.gen.page.element.RepeatingPanelElement;
import org.nocket.gen.page.element.SelectElement;
import org.nocket.gen.page.element.TableElement;
import org.nocket.gen.page.element.TextAreaElement;
import org.nocket.gen.page.element.TextInputElement;
import org.nocket.gen.page.element.UnknownPageElementI;
import org.nocket.gen.page.visitor.bind.BindingVisitor;
import org.nocket.gen.page.visitor.bind.builder.InterceptingBindingBuilder;
import org.nocket.gen.page.visitor.registry.PageRegistryVisitor;
public class GeneratedBindingVisitor extends AbstractPageElementVisitor {
private final List<PageElementVisitorI> visitors = new ArrayList<PageElementVisitorI>();
public GeneratedBindingVisitor(GeneratedBinding parent, PageElementVisitorI... additionalVisitors) {
super(parent.getContext());
visitors.add(new BindingVisitor(parent.getContext(), new InterceptingBindingBuilder(parent.getInterceptors())));
visitors.add(new PageRegistryVisitor(parent.getContext()));
for(PageElementVisitorI visitor : additionalVisitors) {
visitors.add(visitor);
}
}
@Override
public void visitModal(ModalElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitFeedback(FeedbackElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitForm(FormElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitTextInput(TextInputElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitPasswordInput(PasswordInputElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitFileInput(FileInputElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitFileDownload(FileDownloadElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitTextArea(TextAreaElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitLabel(LabelElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitPrompt(PromptElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitCheckboxInput(CheckboxInputElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitRadioInput(RadioInputElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitSelect(SelectElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitImage(ImageElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitLink(LinkElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitTable(TableElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitButton(ButtonElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitContainerOpen(ContainerElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitContainerClose() {
for (PageElementVisitorI visitor : visitors) {
visitor.visitContainerClose();
}
}
@Override
public void visitUnknown(UnknownPageElementI<?> e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void finish(List<DomainElementI<DomainObjectReference>> unboundDomainElements)
throws ElementNotFoundException {
for (PageElementVisitorI visitor : visitors) {
visitor.finish(unboundDomainElements);
}
htmlizeTableHeaders(getContext().getPage());
if (unboundDomainElements.size() > 0) {
throw new ElementNotFoundException(unboundDomainElements.get(0).getWicketId());
}
}
protected void htmlizeTableHeaders(MarkupContainer page) {
page.visitChildren(GenericDataTablePanel.class, new IVisitor<GenericDataTablePanel<?>, Component>() {
@Override
public void component(GenericDataTablePanel<?> table, IVisit<Component> visit) {
table.htmlizeTableHeaders();
}
});
}
@Override
public void visitRepeatingPanel(RepeatingPanelElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitHeaderLink(HeaderLinkElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitHeaderScript(HeaderScriptElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitBody(BodyElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitGroupTabbedPanel(GroupTabbedPanelElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
@Override
public void visitDiv(DivElement e) {
for (PageElementVisitorI visitor : visitors) {
e.accept(visitor);
}
}
}