package fr.openwide.core.showcase.web.application.others.page;
import java.util.Collection;
import java.util.List;
import javax.annotation.Nullable;
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import com.google.common.base.Predicate;
import fr.openwide.core.commons.util.functional.SerializablePredicate;
import fr.openwide.core.commons.util.functional.Suppliers2;
import fr.openwide.core.showcase.core.business.user.model.User;
import fr.openwide.core.showcase.core.business.user.service.IUserService;
import fr.openwide.core.showcase.web.application.util.template.MainTemplate;
import fr.openwide.core.showcase.web.application.widgets.component.UserSelect2ListMultipleChoice;
import fr.openwide.core.wicket.more.condition.Condition;
import fr.openwide.core.wicket.more.link.descriptor.IPageLinkDescriptor;
import fr.openwide.core.wicket.more.link.descriptor.builder.LinkDescriptorBuilder;
import fr.openwide.core.wicket.more.markup.html.basic.EnclosureContainer;
import fr.openwide.core.wicket.more.markup.html.basic.PlaceholderContainer;
import fr.openwide.core.wicket.more.model.CollectionCopyModel;
import fr.openwide.core.wicket.more.model.GenericEntityModel;
public class HideableComponentsPage extends MainTemplate {
private static final long serialVersionUID = -1538563562722555674L;
@SpringBean
private IUserService userService;
public static final IPageLinkDescriptor linkDescriptor() {
return LinkDescriptorBuilder.start()
.page(HideableComponentsPage.class);
}
public HideableComponentsPage(PageParameters parameters) {
super(parameters);
IModel<String> model = new Model<String>(null);
List<User> choicesList = userService.list();
IModel<List<User>> collectionModel = CollectionCopyModel.custom(Suppliers2.<User>arrayListAsList(), GenericEntityModel.<User>factory());
final MarkupContainer updatedContainer = new WebMarkupContainer("updatedContainer");
updatedContainer.setOutputMarkupId(true);
add(updatedContainer);
add(new Form<Void>("form")
.add(new TextField<String>("modelField", model)
.setLabel(new ResourceModel("hideableComponents.model.form.modelField"))
.add(new OnChangeAjaxBehavior() {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
target.add(updatedContainer);
}
})
)
.add(new UserSelect2ListMultipleChoice("collectionModelField", collectionModel, choicesList)
.setLabel(new ResourceModel("hideableComponents.model.form.collectionModelField"))
.add(new OnChangeAjaxBehavior() {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
target.add(updatedContainer);
}
})
)
);
// Model-based hideable components
Component enclosureContainer = new EnclosureContainer("enclosureContainer")
.condition(Condition.modelNotNull(model).or(Condition.collectionModelNotEmpty(collectionModel)));
Component enclosureBehaviorComponent = new Label("enclosureBehaviorComponent", new ResourceModel("hideableComponents.model.enclosureBehavior"))
.add(Condition.modelNotNull(model).or(Condition.collectionModelNotEmpty(collectionModel)).thenShow());
updatedContainer.add(
new PlaceholderContainer("placeholderContainer")
.condition(Condition.modelNotNull(model).or(Condition.collectionModelNotEmpty(collectionModel))),
new Label("placeholderBehaviorComponent", new ResourceModel("hideableComponents.model.placeholderBehavior"))
.add(Condition.modelNotNull(model).and(Condition.collectionModelNotEmpty(collectionModel)).thenHide()),
enclosureContainer,
enclosureBehaviorComponent
);
// Predicate-based hideable components
Predicate<Collection<?>> moreThanOneElementPredicate = new SerializablePredicate<Collection<?>>() {
private static final long serialVersionUID = 1L;
@Override
public boolean apply(@Nullable Collection<?> input) {
return input != null && input.size() > 1;
}
};
updatedContainer.add(
new EnclosureContainer("moreThanOneElementEnclosureContainer").condition(Condition.predicate(collectionModel, moreThanOneElementPredicate)),
new PlaceholderContainer("moreThanOneElementPlaceholderContainer").condition(Condition.predicate(collectionModel, moreThanOneElementPredicate))
);
// Component-based hideable components
updatedContainer.add(
new EnclosureContainer("enclosuresVisibleContainer")
.condition(Condition.componentsAnyVisible(enclosureContainer, enclosureBehaviorComponent)),
new PlaceholderContainer("enclosuresInvisibleContainer")
.condition(Condition.componentsAnyVisible(enclosureContainer, enclosureBehaviorComponent))
);
}
@Override
protected Class<? extends WebPage> getFirstMenuPage() {
return HideableComponentsPage.class;
}
@Override
protected Class<? extends WebPage> getSecondMenuPage() {
return null;
}
}