/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package org.vaadin.dialogs; import java.io.Serializable; import com.vaadin.terminal.gwt.server.JsonPaintTarget; import com.vaadin.ui.Button; import com.vaadin.ui.Label; import com.vaadin.ui.Window; public class ConfirmDialog extends Window { private static final long serialVersionUID = -2363125714643244070L; public interface Factory extends Serializable { ConfirmDialog create(String windowCaption, String message, String okTitle, String cancelTitle); } static final String DEFAULT_WINDOW_CAPTION = "Confirm"; static final String DEFAULT_CANCEL_CAPTION = "Cancel"; static final String DEFAULT_OK_CAPTION = "Ok"; public static final int CONTENT_TEXT_WITH_NEWLINES = -1; public static final int CONTENT_TEXT = Label.CONTENT_TEXT; public static final int CONTENT_PREFORMATTED = Label.CONTENT_PREFORMATTED; public static final int CONTENT_HTML = Label.CONTENT_RAW; public static final int CONTENT_DEFAULT = CONTENT_TEXT_WITH_NEWLINES; /** * Listener for dialog close events. Implement and register an instance of * this interface to dialog to receive close events. * * @author Sami Ekblad * */ public interface Listener extends Serializable { void onClose(ConfirmDialog dialog); } /** * Default dialog factory. * */ private static Factory factoryInstance; /** * Get the ConfirmDialog.Factory used to create and configure the dialog. * * By default the {@link DefaultConfirmDialogFactory} is used. * * @return */ public static Factory getFactory() { if (factoryInstance == null) { factoryInstance = new DefaultConfirmDialogFactory(); } return factoryInstance; } /** * Set the ConfirmDialog.Factory used to create and configure the dialog. * * By default the {@link DefaultConfirmDialogFactory} is used. * * @return */ public static void setFactory(final Factory newFactory) { factoryInstance = newFactory; } /** * Show a modal ConfirmDialog in a window. * * @param parentWindow * @param listener */ public static ConfirmDialog show(final Window parentWindow, final Listener listener) { return show(parentWindow, null, null, null, null, listener); } /** * Show a modal ConfirmDialog in a window. * * @param parentWindow * @param messageLabel * @param listener * @return */ public static ConfirmDialog show(final Window parentWindow, final String message, final Listener listener) { return show(parentWindow, null, message, null, null, listener); } /** * Show a modal ConfirmDialog in a window. * * @param parentWindow * Main level window. * @param windowCaption * Caption for the confirmation dialog window. * @param message * Message to display as window content. * @param okCaption * Caption for the ok button. * @param cancelCaption * Caption for cancel button. * @param listener * Listener for dialog result. * @return */ public static ConfirmDialog show(final Window parentWindow, final String windowCaption, final String message, final String okCaption, final String cancelCaption, final Listener listener) { ConfirmDialog d = getFactory().create(windowCaption, message, okCaption, cancelCaption); d.show(parentWindow, listener, true); return d; } /** * Shows a modal ConfirmDialog in given window and executes Runnable if OK * is chosen. * * @param parentWindow * Main level window. * @param windowCaption * Caption for the confirmation dialog window. * @param message * Message to display as window content. * @param okCaption * Caption for the ok button. * @param cancelCaption * Caption for cancel button. * @param r * Runnable to be run if confirmed * @return */ public static ConfirmDialog show(final Window parentWindow, final String windowCaption, final String message, final String okCaption, final String cancelCaption, final Runnable r) { ConfirmDialog d = getFactory().create(windowCaption, message, okCaption, cancelCaption); d.show(parentWindow, new Listener() { public void onClose(ConfirmDialog dialog) { if (dialog.isConfirmed()) { r.run(); } } }, true); return d; } private Listener confirmListener = null; private boolean isConfirmed = false; private Label messageLabel = null; private Button okBtn = null; private Button cancelBtn = null; private String originalMessageText; private int msgContentMode = CONTENT_TEXT_WITH_NEWLINES; /** * Show confirm dialog. * * @param listener */ public final void show(final Window parentWindow, final Listener listener, final boolean modal) { confirmListener = listener; center(); setModal(modal); parentWindow.addWindow(this); } /** * Did the user confirm the dialog. * * @return */ public final boolean isConfirmed() { return isConfirmed; } public final Listener getListener() { return confirmListener; } protected final void setOkButton(final Button okButton) { okBtn = okButton; } public final Button getOkButton() { return okBtn; } protected final void setCancelButton(final Button cancelButton) { cancelBtn = cancelButton; } public final Button getCancelButton() { return cancelBtn; } protected final void setMessageLabel(final Label message) { messageLabel = message; } public final void setMessage(final String message) { originalMessageText = message; messageLabel .setValue(CONTENT_TEXT_WITH_NEWLINES == msgContentMode ? formatDialogMessage(message) : message); } public final String getMessage() { return originalMessageText; } public final int getContentMode() { return msgContentMode; } public final void setContentMode(final int contentMode) { msgContentMode = contentMode; messageLabel .setContentMode(contentMode == CONTENT_TEXT_WITH_NEWLINES ? CONTENT_TEXT : contentMode); messageLabel .setValue(contentMode == CONTENT_TEXT_WITH_NEWLINES ? formatDialogMessage(originalMessageText) : originalMessageText); } /** * Format the messageLabel by maintaining text only. * * @param text * @return */ protected final String formatDialogMessage(final String text) { return JsonPaintTarget.escapeXML(text).replaceAll("\n", "<br />"); } /** * Set the isConfirmed state. * * Note: this should only be called internally by the listeners. * * @param isConfirmed */ protected final void setConfirmed(final boolean confirmed) { isConfirmed = confirmed; } }