org.apache.ace.webui.vaadin.component.ConfirmationDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.ace.webui.vaadin.component.ConfirmationDialog.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.ace.webui.vaadin.component;

import com.vaadin.event.ShortcutAction.KeyCode;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.themes.Reindeer;

/**
 * Provides a confirmation dialog, based on code found on <a
 * href="https://vaadin.com/forum/-/message_boards/view_message/17883">this forum posting</a>.
 */
public class ConfirmationDialog extends Window implements ClickListener {

    /**
     * Callback class for a {@link ConfirmationDialog}.
     */
    public static interface Callback {
        /**
         * Called upon pressing a button.
         * 
         * @param buttonName
         *            the name of the button that was clicked, never <code>null</code>.
         */
        void onDialogResult(String buttonName);
    }

    public static final String YES = "Yes";
    public static final String NO = "No";
    public static final String CANCEL = "Cancel";

    private final Callback m_callback;

    /**
     * Provides a Yes/No confirmation dialog.
     * 
     * @param caption
     *            the caption of this dialog, cannot be <code>null</code>;
     * @param message
     *            the message to display, may be <code>null</code> to omit the message;
     * @param callback
     *            the callback to call for each pressed button.
     */
    public ConfirmationDialog(String caption, String message, Callback callback) {
        this(caption, message, callback, YES, YES, NO);
    }

    /**
     * Provides a confirmation dialog with a custom set of buttons.
     * 
     * @param caption
     *            the caption of this dialog, cannot be <code>null</code>;
     * @param message
     *            the message to display, may be <code>null</code> to omit the message;
     * @param callback
     *            the callback to call for each pressed button;
     * @param buttonNames
     *            the names of the buttons to display.
     */
    public ConfirmationDialog(String caption, String message, Callback callback, String defaultButton,
            String... buttonNames) {
        super(caption);

        if (buttonNames == null || buttonNames.length <= 1) {
            throw new IllegalArgumentException("Need at least one button name!");
        }
        if (callback == null) {
            throw new IllegalArgumentException("Need a callback!");
        }

        m_callback = callback;

        setWidth("30em");
        setModal(true);

        VerticalLayout layout = (VerticalLayout) getContent();
        layout.setMargin(true);
        layout.setSpacing(true);

        addComponents(message, defaultButton, buttonNames);
    }

    /**
     * @see com.vaadin.ui.Button.ClickListener#buttonClick(com.vaadin.ui.Button.ClickEvent)
     */
    public void buttonClick(ClickEvent event) {
        Window parent = getParent();
        if (parent != null) {
            parent.removeWindow(this);
            parent.focus();
        }

        AbstractComponent comp = (AbstractComponent) event.getComponent();
        m_callback.onDialogResult((String) comp.getData());
    }

    /**
     * Adds all components to this dialog.
     * 
     * @param message
     *            the optional message to display, can be <code>null</code>;
     * @param buttonNames
     *            the names of the buttons to add, never <code>null</code> or empty.
     */
    protected void addComponents(String message, String defaultButton, String... buttonNames) {
        if (message != null) {
            addComponent(new Label(message));
        }

        GridLayout gl = new GridLayout(buttonNames.length + 1, 1);
        gl.setSpacing(true);
        gl.setWidth("100%");

        gl.addComponent(new Label(" "));
        gl.setColumnExpandRatio(0, 1.0f);

        for (String buttonName : buttonNames) {
            Button button = new Button(buttonName, this);
            button.setData(buttonName);
            if (defaultButton != null && defaultButton.equals(buttonName)) {
                button.setStyleName(Reindeer.BUTTON_DEFAULT);
                button.setClickShortcut(KeyCode.ENTER);
                // Request focus in this window...
                button.focus();
            }
            gl.addComponent(button);
        }

        addComponent(gl);
    }
}