org.opensingular.lib.wicket.util.util.IBehaviorsMixin.java Source code

Java tutorial

Introduction

Here is the source code for org.opensingular.lib.wicket.util.util.IBehaviorsMixin.java

Source

/*
 * Copyright (C) 2016 Singular Studios (a.k.a Atom Tecnologia) - www.opensingular.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.opensingular.lib.wicket.util.util;

import java.io.Serializable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.opensingular.lib.wicket.util.jquery.JQuery;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice;
import org.apache.wicket.markup.html.form.CheckGroup;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.RadioChoice;
import org.apache.wicket.markup.html.form.RadioGroup;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

import org.opensingular.lib.commons.lambda.IBiConsumer;
import org.opensingular.lib.commons.lambda.IConsumer;
import org.opensingular.lib.commons.lambda.IFunction;
import org.opensingular.lib.commons.lambda.IPredicate;
import org.opensingular.lib.commons.lambda.ISupplier;
import org.opensingular.lib.wicket.util.behavior.FormChoiceAjaxUpdateBehavior;
import org.opensingular.lib.wicket.util.behavior.FormComponentAjaxUpdateBehavior;
import org.opensingular.lib.wicket.util.behavior.IAjaxUpdateConfiguration;

import static org.opensingular.lib.wicket.util.util.Shortcuts.$b;

@SuppressWarnings("serial")
public interface IBehaviorsMixin extends Serializable {

    default AttributeAppender attrAppender(String attribute, Serializable valueOrModel, String separator) {
        return attrAppender(attribute, valueOrModel, separator, Model.of(Boolean.TRUE));
    }

    default AttributeAppender attrAppender(String attribute, Serializable valueOrModel, String separator,
            IModel<Boolean> enabledModel) {
        return new AttributeAppender(attribute,
                (valueOrModel instanceof IModel<?>) ? (IModel<?>) valueOrModel : Model.of(valueOrModel),
                separator) {
            @Override
            public boolean isEnabled(Component component) {
                return Boolean.TRUE.equals(enabledModel.getObject());
            }
        };
    }

    default AttributeModifier attrRemover(String attribute, Serializable patternToRemove, boolean isolateWord) {
        return new AttributeModifier(attribute, patternToRemove) {
            @Override
            protected String newValue(String currentValue, String replacementValue) {
                String regex = (isolateWord) ? "\\b" + replacementValue + "\\b" : replacementValue;
                return currentValue.replaceAll(regex, "");
            }
        };
    }

    default AttributeModifier attr(String attribute, Serializable valueOrModel) {
        return attr(attribute, valueOrModel, Model.of(Boolean.TRUE));
    }

    default AttributeModifier attr(String attribute, Serializable valueOrModel, IModel<Boolean> enabledModel) {
        return new AttributeModifier(attribute,
                (valueOrModel instanceof IModel<?>) ? (IModel<?>) valueOrModel : Model.of(valueOrModel)) {
            @Override
            public boolean isEnabled(Component component) {
                return enabledModel.getObject();
            }
        };
    }

    default AttributeAppender classAppender(Serializable valueOrModel) {
        return classAppender(valueOrModel, Model.of(Boolean.TRUE));
    }

    default AttributeAppender classAppender(Serializable valueOrModel, IModel<Boolean> enabledModel) {
        return attrAppender("class", valueOrModel, " ", enabledModel);
    }

    default Behavior renderBodyOnly(IModel<Boolean> renderBodyOnly) {
        return new Behavior() {
            @Override
            public void onConfigure(Component component) {
                component.setRenderBodyOnly(renderBodyOnly.getObject());
            }
        };
    }

    default Behavior notVisibleIf(ISupplier<Boolean> model) {
        return new Behavior() {
            @Override
            public void onConfigure(Component component) {
                component.setVisible(!model.get());
            }
        };
    }

    default Behavior visibleIf(ISupplier<Boolean> model) {
        return new Behavior() {
            @Override
            public void onConfigure(Component component) {
                component.setVisible(model.get());
            }
        };
    }

    default <T> Behavior visibleIfModelObject(IPredicate<T> predicate) {
        return new Behavior() {
            @Override
            @SuppressWarnings("unchecked")
            public void onConfigure(Component component) {
                component.setVisible(predicate.test((T) component.getDefaultModelObject()));
            }
        };
    }

    default Behavior visibleIf(IModel<Boolean> model) {
        return new Behavior() {
            @Override
            public void onConfigure(Component component) {
                component.setVisible(model.getObject());
            }
        };
    }

    default Behavior visibleIfAlso(Component otherComponent) {
        return new Behavior() {
            @Override
            public void onConfigure(Component component) {
                component.setVisible(otherComponent.isVisibleInHierarchy());
            }
        };
    }

    default Behavior enabledIf(IModel<Boolean> model) {
        return new Behavior() {
            @Override
            public void onConfigure(Component component) {
                component.setEnabled(model.getObject());
            }
        };
    }

    default Behavior onConfigure(IConsumer<Component> onConfigure) {
        return new Behavior() {
            @Override
            public void onConfigure(Component component) {
                IConsumer.noopIfNull(onConfigure).accept(component);
            }
        };
    }

    default Behavior onComponentTag(IBiConsumer<Component, ComponentTag> onComponentTag) {
        return new Behavior() {
            @Override
            public void onComponentTag(Component component, ComponentTag tag) {
                IBiConsumer.noopIfNull(onComponentTag).accept(component, tag);
            }
        };
    }

    default <C extends Component> IAjaxUpdateConfiguration<C> addAjaxUpdate(C component) {
        return addAjaxUpdate(component, null);
    }

    @SuppressWarnings("unchecked")
    default <C extends Component> IAjaxUpdateConfiguration<C> addAjaxUpdate(C component,
            IBiConsumer<AjaxRequestTarget, Component> onUpdate) {

        final Behavior behavior;

        if (component instanceof RadioChoice<?> || component instanceof CheckBoxMultipleChoice<?>
                || component instanceof RadioGroup<?> || component instanceof CheckGroup<?>) {
            behavior = new FormChoiceAjaxUpdateBehavior(onUpdate);
            component.add(behavior);

        } else if (component instanceof FormComponent<?>) {
            behavior = new FormComponentAjaxUpdateBehavior("change", onUpdate);
            component.add(behavior);

        } else {
            return null;
        }

        return (IAjaxUpdateConfiguration<C>) behavior;
    }

    default Behavior on(String event, IFunction<Component, CharSequence> scriptFunction) {
        return onReadyScript(comp -> String.format("Wicket.Event.add('%s', '%s', function(event) { %s; });",
                comp.getMarkupId(), event, scriptFunction.apply(comp)));
    }

    default Behavior onReadyScript(ISupplier<CharSequence> scriptSupplier) {
        return onReadyScript(comp -> scriptSupplier.get());
    }

    default Behavior onReadyScript(IFunction<Component, CharSequence> scriptFunction) {
        return onReadyScript(scriptFunction, comp -> comp.isVisibleInHierarchy() && comp.isEnabledInHierarchy());
    }

    default Behavior onReadyScript(IFunction<Component, CharSequence> scriptFunction,
            IFunction<Component, Boolean> isEnabled) {
        return new Behavior() {
            @Override
            public void renderHead(Component component, IHeaderResponse response) {
                response.render(OnDomReadyHeaderItem.forScript(
                        "" + "(function(){" + "'use strict';" + scriptFunction.apply(component) + "})();"));
            }

            @Override
            public boolean isEnabled(Component component) {
                return isEnabled.apply(component);
            }
        };
    }

    default Behavior onEnterDelegate(Component newTarget, String originalTargetEvent) {
        return $b.onReadyScript(c -> JQuery.on(c, "keypress",
                "if((e.keyCode || e.which) == 13){"
                        + (originalTargetEvent != null ? "$(e.target).trigger('" + originalTargetEvent + "');" : "")
                        + "e.preventDefault(); " + JQuery.$(newTarget) + ".click();}"));
    }

}