Package de.agilecoders.wicket.samples.pages

Source Code of de.agilecoders.wicket.samples.pages.IssuesPage$ParentNavbar

package de.agilecoders.wicket.samples.pages;

import de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapLink;
import de.agilecoders.wicket.core.markup.html.bootstrap.button.ButtonBehavior;
import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationMessage;
import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
import de.agilecoders.wicket.core.markup.html.bootstrap.components.PopoverBehavior;
import de.agilecoders.wicket.core.markup.html.bootstrap.components.PopoverConfig;
import de.agilecoders.wicket.core.markup.html.bootstrap.components.RichPopoverBehavior;
import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.ModalCloseButton;
import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.TextContentModal;
import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.AbstractNavbarComponent;
import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.ImmutableNavbarComponent;
import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.Navbar;
import de.agilecoders.wicket.core.markup.html.bootstrap.navbar.NavbarAjaxLink;
import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.ColorPickerConfig;
import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.ColorPickerTextField;
import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.DateTextField;
import de.agilecoders.wicket.samples.components.issues.CustomNavbarForm;
import org.apache.wicket.Component;
import org.apache.wicket.Page;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.event.IEvent;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.time.Duration;
import org.wicketstuff.annotation.mount.MountPath;

import java.io.Serializable;
import java.util.Date;

/**
* The {@code BaseCssPage}
*
* @author miha
* @version 1.0
*/
@MountPath(value = "/issues")
public class IssuesPage extends BasePage {

    /**
     * Construct.
     *
     * @param parameters the current page parameters.
     */
    public IssuesPage(PageParameters parameters) {
        super(parameters);


        add(new NotificationPanel("feedback").hideAfter(Duration.seconds(5)));

        // issue #80
        add(new ParentNavbar("navbar-parent"),
            new SubNavbar("navbar-child"));

        // issue #88
        add(createDatePickerForm("datepicker-form"));

        // issue #-1
        add(new Navbar("navbar-form").addComponents(new AbstractNavbarComponent(Navbar.ComponentPosition.LEFT) {
            @Override
            public Component create(String markupId) {
                return new CustomNavbarForm(markupId);
            }
        }));

        // issue #90
        Modal<String> modal = newModalDialog("endless-modal").setUseCloseHandler(true).setFadeIn(true).setUseKeyboard(true);
        Label button = new Label("open-endless-modal", "Open Modal Dialog");
        modal.addOpenerAttributesTo(button);
        add(modal, button);

        // issue #93
        add(new Label("popover", "Popover (hover, top)").add(new PopoverBehavior(
                Model.of("title"),
                Model.of("content"),
                new PopoverConfig().withHoverTrigger().withPlacement(TooltipConfig.Placement.top)
        )));

        add(new Label("richpopover", "Popover (hover, top)").add(new RichPopoverBehavior(
                Model.of("title"),
                new PopoverConfig().withHoverTrigger().withPlacement(TooltipConfig.Placement.top)
        ) {

            @Override
            public Component newBodyComponent(String markupId) {
                Label label = new Label(markupId, Model.of("<h2>rich content</h2><a href=\"http://wb.agilecoders.de\">Link</a>"));
                label.setEscapeModelStrings(false);

                return label;
            }
        }));

        // issue #102
        add(new BootstrapLink<Page>("link", Model.<Page>of(this)) {
            @Override
            public void onClick() {
                getSession().success(new NotificationMessage(Model.of("link 1 clicked"), Model.of("issue #102:"), true));
                setResponsePage(getModelObject());
            }
        }.setLabel(Model.of("Link 1")));
        add(new BootstrapLink<Page>("link-danger", Model.<Page>of(this), Buttons.Type.Danger) {
            @Override
            public void onClick() {
                getSession().success(new NotificationMessage(Model.of("link 2 <u>clicked</u>"), Model.of("issue #102:"), true).escapeModelStrings(false));
                setResponsePage(getModelObject());
            }
        }.setLabel(Model.of("Link 2")));

        add(createColorPickerForm("colorpicker-form"));
    }

    private Modal<String> newModalDialog(String markupId) {
        final Modal<String> modal = new TextContentModal(markupId, Model.of("Issue #90"));
        modal.addButton(new ModalCloseButton());

        return modal;
    }

    private DateBean dateBean = new DateBean();

    /**
     * creates a form that contains a datepicker.
     *
     * @param markupId The components markup id
     * @return new form
     */
    public Form<?> createDatePickerForm(final String markupId) {
        Form<DateBean> form = new Form<DateBean>(markupId,
                                                 new CompoundPropertyModel<DateBean>(
                                                         new PropertyModel<DateBean>(this, "dateBean")));
        add(form);
        DateTextField dueDate = new DateTextField("dueDate");
        form.add(dueDate);

        form.add(new AjaxSubmitLink("submit", form) {
            private static final long serialVersionUID = -2647897814406807218L;

            @Override
            protected void onInitialize() {
                super.onInitialize();

                add(new ButtonBehavior());
            }

            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                System.out.print(dateBean);
                target.appendJavaScript("alert('DateBean.dueDate is: " + dateBean.getDueDate() + "');");
            }
        });

        return form;
    }

    /**
     * creates a form that contains a colorpicker.
     *
     * @param markupId The components markup id
     * @return new form
     */
    public Form<?> createColorPickerForm(final String markupId) {

        final FeedbackPanel colorPickerFeedback = new FeedbackPanel("colorPickerFeedback");
        colorPickerFeedback.setOutputMarkupId(true);
        add(colorPickerFeedback);

        Form<Void> form = new Form<Void>(markupId);
        add(form);

        ColorPickerConfig config = new ColorPickerConfig();
        config.setComponent(true);
        config.setAjaxUpdate(true);
        final ColorPickerTextField colorPicker = new ColorPickerTextField("colorPicker", Model.of(""), config) {
            @Override
            protected void onChange(AjaxRequestTarget target, String color) {
                super.onChange(target, color);

                success("Selected color is: " + color);
                target.add(colorPickerFeedback);
            }
        };
        form.add(colorPicker);

        form.add(new AjaxSubmitLink("submit", form) {
            private static final long serialVersionUID = -2647897814406807218L;

            @Override
            protected void onInitialize() {
                super.onInitialize();

                add(new ButtonBehavior());
            }

            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                success("Selected color is: " + colorPicker.getModelObject());
                target.add(colorPickerFeedback);
            }
        });

        return form;
    }

    public static class DateBean implements Serializable {
        private static final long serialVersionUID = 7570029514918506580L;

        private Date dueDate;

        public DateBean() {
            this(new Date());
        }

        public DateBean(Date dueDate) {
            this.dueDate = dueDate;
        }

        public Date getDueDate() {
            return dueDate;
        }

        public void setDueDate(Date dueDate) {
            this.dueDate = dueDate;
        }

        /*
           * (non-Javadoc)
           *
           * @see java.lang.Object#toString()
           */
        @Override
        public String toString() {
            return "DateBean [dueDate=" + dueDate + "]";
        }
    }

    @Override
    protected boolean hasNavigation() {
        return true;
    }

    private static final class SubNavbar extends Navbar {

        private final IModel<SubNavGroup> group = Model.of(SubNavGroup.NONE);

        public SubNavbar(final String componentId) {
            super(componentId);

            setInverted(true);
            setOutputMarkupId(true);

            addComponents(
                    new ImmutableNavbarComponent(new NavbarAjaxLink<String>(Model.of("button a")) {
                        @Override
                        public void onClick(AjaxRequestTarget target) {
                            target.appendJavaScript("alert('button A clicked');");
                        }

                        @Override
                        public boolean isVisible() {
                            return SubNavGroup.A.equals(group.getObject());
                        }
                    }, ComponentPosition.LEFT),
                    new ImmutableNavbarComponent(new NavbarAjaxLink<String>(Model.of("button b")) {
                        @Override
                        public void onClick(AjaxRequestTarget target) {
                            target.appendJavaScript("alert('button B clicked');");
                        }

                        @Override
                        public boolean isVisible() {
                            return SubNavGroup.B.equals(group.getObject());
                        }
                    }, ComponentPosition.LEFT)
            );
        }

        /**
         * @see org.apache.wicket.Component#onEvent(org.apache.wicket.event.IEvent)
         */
        @Override
        public void onEvent(IEvent<?> event) {
            super.onEvent(event);

            if (event.getPayload() instanceof ToggleSubNavbarState) {
                ToggleSubNavbarState stateEvent = (ToggleSubNavbarState) event.getPayload();

                group.setObject(stateEvent.getGroup());

                stateEvent.getTarget().add(this);
            }
        }
    }

    private static final class ParentNavbar extends Navbar {
        public ParentNavbar(final String componentId) {
            super(componentId);

            setInverted(false);
            setOutputMarkupId(true);

            addComponents(
                    new ImmutableNavbarComponent(new NavbarAjaxLink<String>(Model.of("button group a")) {
                        @Override
                        public void onClick(AjaxRequestTarget target) {
                            send(getPage(), Broadcast.BREADTH, new ToggleSubNavbarState(target, SubNavGroup.A));
                        }
                    }, ComponentPosition.LEFT),
                    new ImmutableNavbarComponent(new NavbarAjaxLink<String>(Model.of("button group b")) {
                        @Override
                        public void onClick(AjaxRequestTarget target) {
                            send(getPage(), Broadcast.BREADTH, new ToggleSubNavbarState(target, SubNavGroup.B));
                        }
                    }, ComponentPosition.LEFT)
            );
        }
    }

    private enum SubNavGroup {
        NONE, A, B
    }

    private static final class ToggleSubNavbarState {
        private final AjaxRequestTarget target;
        private final SubNavGroup group;

        /**
         * Constructor
         *
         * @param target
         */
        public ToggleSubNavbarState(AjaxRequestTarget target, SubNavGroup group) {
            this.target = target;
            this.group = group;
        }

        /**
         * @return nav bar button group id
         */
        public SubNavGroup getGroup() {
            return group;
        }

        /**
         * @return ajax request target
         */
        public AjaxRequestTarget getTarget() {
            return target;
        }
    }

}
TOP

Related Classes of de.agilecoders.wicket.samples.pages.IssuesPage$ParentNavbar

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.