org.dcm4chee.wizard.common.component.secure.ConfirmationWindow.java Source code

Java tutorial

Introduction

Here is the source code for org.dcm4chee.wizard.common.component.secure.ConfirmationWindow.java

Source

/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (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.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is part of dcm4che, an implementation of DICOM(TM) in
 * Java(TM), hosted at https://github.com/dcm4che.
 *
 * The Initial Developer of the Original Code is
 * Agfa Healthcare.
 * Portions created by the Initial Developer are Copyright (C) 2012
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 * See @authors listed below
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

package org.dcm4chee.wizard.common.component.secure;

import org.apache.wicket.Page;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.apache.wicket.request.resource.ResourceReference;
import org.dcm4chee.wizard.common.component.MainWebPage;

/**
 * @author Franz Willer <franz.willer@gmail.com>
 * @author Robert David <robert.david@agfa.com>
 */
public abstract class ConfirmationWindow<T> extends ModalWindow {

    private static final long serialVersionUID = 1L;

    public static final String FOCUS_ON_CONFIRM = "content:confirm";
    public static final String FOCUS_ON_DECLINE = "content:decline";
    public static final String FOCUS_ON_CANCEL = "content:cancel";

    public static final int UNCONFIRMED = 0;
    public static final int CONFIRMED = 1;
    public static final int DECLINED = 2;
    public static final int CANCELED = 3;

    private T userObject;
    private String focusElementId;

    private IModel<?> remark, confirm, decline, cancel;

    protected boolean hasStatus;
    private boolean showCancel = false;
    private int state = UNCONFIRMED;

    public ConfirmationPanel messageWindowPanel;

    private static final ResourceReference baseCSS = new PackageResourceReference(MainWebPage.class,
            "base-style.css");

    public ConfirmationWindow(String id, String titleResource) {
        this(id);
        setTitle(new ResourceModel(titleResource));
    }

    public ConfirmationWindow(String id) {

        this(id, new ResourceModel("yesBtn"), new ResourceModel("noBtn"), new ResourceModel("cancelBtn"));

        setCloseButtonCallback(new CloseButtonCallback() {

            private static final long serialVersionUID = 1L;

            public boolean onCloseButtonClicked(AjaxRequestTarget target) {
                messageWindowPanel.msg = null;
                close(target);
                return true;
            }
        });
        setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {

            private static final long serialVersionUID = 1L;

            public void onClose(AjaxRequestTarget target) {
                getPage().setOutputMarkupId(true);
                target.add(getPage());
            }
        });
    }

    public ConfirmationWindow(String id, IModel<?> confirm, IModel<?> decline, IModel<?> cancel) {
        super(id);
        this.confirm = confirm;
        this.decline = decline;
        this.cancel = cancel;
        initContent();
    }

    protected void initContent() {
        setInitialWidth(400);
        setInitialHeight(300);

        messageWindowPanel = new ConfirmationPanel("panel");

        setPageCreator(new ModalWindow.PageCreator() {

            private static final long serialVersionUID = 1L;

            public Page createPage() {
                return new ConfirmationPage();
            }
        });
    }

    public void onConfirmation(AjaxRequestTarget target, T userObject) {
    };

    public void onDecline(AjaxRequestTarget target, T userObject) {
    }

    public void onCancel(AjaxRequestTarget target, T userObject) {
    }

    public void onOk(AjaxRequestTarget target) {
    }

    @Override
    public void show(final AjaxRequestTarget target) {
        hasStatus = false;
        super.show(target);
        if (focusElementId != null)
            target.focusComponent(this.get(focusElementId));
    }

    public void confirm(AjaxRequestTarget target, IModel<?> msg, T userObject) {
        confirm(target, msg, userObject, FOCUS_ON_DECLINE);
    }

    public void confirm(AjaxRequestTarget target, IModel<?> msg, T userObject, String focusElementId) {
        confirm(target, msg, userObject, focusElementId, false);
    }

    public void confirm(AjaxRequestTarget target, IModel<?> msg, T userObject, String focusElementId,
            boolean showCancel) {
        this.messageWindowPanel.msg = msg;
        this.userObject = userObject;
        this.focusElementId = focusElementId;
        this.showCancel = showCancel;
        show(target);
    }

    public void confirmWithCancel(AjaxRequestTarget target, IModel<?> msg, T userObject) {
        confirm(target, msg, userObject, FOCUS_ON_CANCEL, true);
    }

    public void setStatus(IModel<?> statusMsg) {
        messageWindowPanel.msg = statusMsg;
        hasStatus = true;
    }

    public void setRemark(IModel<?> remark) {
        this.remark = remark;
    }

    public T getUserObject() {
        return userObject;
    }

    public int getState() {
        return state;
    }

    public class ConfirmationPage extends SecureSessionCheckPage {

        private static final long serialVersionUID = 1L;

        public ConfirmationPage() {
            add(messageWindowPanel);
        }

        @Override
        public void renderHead(IHeaderResponse response) {
            super.renderHead(response);
            if (ConfirmationWindow.baseCSS != null)
                response.render(CssHeaderItem.forReference(ConfirmationWindow.baseCSS));
        }
    }

    public class ConfirmationPanel extends Panel {

        private static final long serialVersionUID = 1L;

        private IndicatingAjaxLink<Object> confirmBtn;
        private AjaxLink<Object> okBtn;

        private IModel<?> msg;
        private Label msgLabel;
        private Label remarkLabel;

        private boolean logout = false;

        public ConfirmationPanel(String id) {
            super(id);

            add((msgLabel = new Label("msg", new AbstractReadOnlyModel<Object>() {

                private static final long serialVersionUID = 1L;

                @Override
                public Object getObject() {
                    return msg == null ? null : msg.getObject();
                }
            })).setOutputMarkupId(true).setEscapeModelStrings(false));

            add((remarkLabel = new Label("remark", new AbstractReadOnlyModel<Object>() {

                private static final long serialVersionUID = 1L;

                @Override
                public Object getObject() {
                    return remark == null ? null : remark.getObject();
                }
            }) {
                private static final long serialVersionUID = 1L;

                @Override
                public boolean isVisible() {
                    return !hasStatus;
                }

            }).setOutputMarkupId(true));

            confirmBtn = new IndicatingAjaxLink<Object>("confirm") {

                private static final long serialVersionUID = 1L;

                @Override
                public void onClick(AjaxRequestTarget target) {
                    try {
                        onConfirmation(target, userObject);
                        state = CONFIRMED;
                        if (hasStatus) {
                            target.add(ConfirmationPanel.this);
                        } else {
                            msg = null;
                            close(target);
                        }
                    } catch (Exception x) {
                        logout = true;
                        setStatus(new Model<String>(x.getMessage()));
                        target.add(ConfirmationPanel.this);
                    }
                }

                @Override
                public boolean isVisible() {
                    return !hasStatus;
                }
            };
            confirmBtn.add(new Label("confirmLabel", confirm));
            confirmBtn.setOutputMarkupId(true);
            add(confirmBtn);

            add(new AjaxLink<Object>("decline") {

                private static final long serialVersionUID = 1L;

                @Override
                public void onClick(AjaxRequestTarget target) {
                    onDecline(target, userObject);
                    state = DECLINED;
                    if (hasStatus) {
                        target.add(ConfirmationPanel.this);
                    } else {
                        msg = null;
                        close(target);
                    }
                }

                @Override
                public boolean isVisible() {
                    return !hasStatus;
                }
            }.add(new Label("declineLabel", decline)));

            add(new AjaxLink<Object>("cancel") {
                private static final long serialVersionUID = 1L;

                @Override
                public void onClick(AjaxRequestTarget target) {
                    onCancel(target, userObject);
                    state = CANCELED;
                    msg = null;
                    close(target);
                }

                @Override
                public boolean isVisible() {
                    return !hasStatus && showCancel;
                }
            }.add(new Label("cancelLabel", cancel)));

            add(okBtn = new IndicatingAjaxLink<Object>("ok") {

                private static final long serialVersionUID = 1L;

                @Override
                public void onClick(AjaxRequestTarget target) {
                    if (logout)
                        onConfirmation(target, userObject);
                    else
                        onOk(target);
                    msg = null;
                    close(target);
                }

                @Override
                public boolean isVisible() {
                    return hasStatus;
                }
            });
            getOkBtn().add(new Label("okLabel", new ResourceModel("okBtn")));
            getOkBtn().setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true);
            this.setOutputMarkupId(true);
        }

        /**
         * Return always true because ModalWindow.beforeRender set visibility of
         * content to false!
         */
        @Override
        public boolean isVisible() {
            return true;
        }

        public AjaxLink<Object> getOkBtn() {
            return okBtn;
        }

        public Label getMsgLabel() {
            return msgLabel;
        }

        public Label getRemarkLabel() {
            return remarkLabel;
        }
    }

    public ConfirmationPanel getMessageWindowPanel() {
        return messageWindowPanel;
    }
}