/** * (C) Copyright 2013 Jabylon (http://www.jabylon.org) and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.jabylon.rest.ui.wicket.components; import java.util.ArrayList; import java.util.List; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.feedback.FeedbackMessage; import org.apache.wicket.feedback.FeedbackMessages; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.border.Border; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.util.iterator.ComponentHierarchyIterator; public class ControlGroup extends Border { private static final long serialVersionUID = 7523670767478562406L; private Label label; private Label help; private FeedbackMessage feedback; private Label feedbackLabel; private Label extra; public ControlGroup(final String id) { this(id, Model.of(""), Model.of("")); } public ControlGroup(final String id, final IModel<String> label) { this(id, label, Model.of("")); } public ControlGroup(final String id, final IModel<String> label, final IModel<String> help) { super(id, Model.of("")); this.label = new Label("label", label); this.help = new Label("help", help); this.extra = new Label("extra-label", ""); extra.setVisible(false); this.feedbackLabel = new Label("feedback", Model.of("")); addToBorder(this.label, this.help, this.feedbackLabel, this.extra); } public void setExtraLabel(IModel<String> model) { extra.setVisible(model.getObject()!=null && !model.getObject().isEmpty()); extra.setDefaultModel(model); } @Override protected void onInitialize() { super.onInitialize(); final List<FormComponent<?>> formComponents = collectFormComponents(); for (FormComponent<?> formComponent : formComponents) { formComponent.setOutputMarkupId(true); } final int size = formComponents.size(); if (size > 0) { FormComponent<?> formComponent = formComponents.get(size - 1); label.add(new AttributeModifier("for", formComponent.getMarkupId())); } } @SuppressWarnings({ "unchecked", "rawtypes" }) protected List<FormComponent<?>> collectFormComponents() { ComponentHierarchyIterator visitor = getBodyContainer().visitChildren(FormComponent.class); List components = new ArrayList(); while (visitor.hasNext()) { Component next = visitor.next(); components.add(next); } return components; } @Override protected void onConfigure() { super.onConfigure(); feedback = findWorstMessage(); if(feedback!=null) { feedbackLabel.setDefaultModel(Model.of(feedback.getMessage())); } else { feedbackLabel.setDefaultModel(Model.of("")); } hideIfEmpty(help); hideIfEmpty(feedbackLabel); } private void hideIfEmpty(Label component) { Object content = component.getDefaultModelObject(); component.setVisible(content!=null && !content.toString().isEmpty()); } @Override protected void onComponentTag(ComponentTag tag) { super.onComponentTag(tag); String stateClass = getStateClass(feedback); tag.put("class", "control-group" + stateClass); } protected FeedbackMessage findWorstMessage() { List<FormComponent<?>> components = collectFormComponents(); FeedbackMessage worst = null; int worstLevel = 0; for (FormComponent<?> formComponent : components) { if(!formComponent.hasFeedbackMessage()) continue; FeedbackMessages messages = formComponent.getFeedbackMessages(); if(messages!=null) { for (FeedbackMessage message : messages) { if(message.getLevel()>worstLevel) { worstLevel = message.getLevel(); worst = message; } } } } return worst; } protected String getStateClass(FeedbackMessage message) { if(message==null) return ""; switch (message.getLevel()) { case FeedbackMessage.INFO: return " info"; case FeedbackMessage.SUCCESS: return " success"; case FeedbackMessage.WARNING: return " warning"; case FeedbackMessage.ERROR: return " error"; default: break; } return ""; } }