/*******************************************************************************
 * Copyright (c) 2004, 2007 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.internal.intro.impl.util;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.intro.impl.Messages;

/**
 * Utiliy class for Pop-Up dialogs. This is an NL enabled utility class (ie: you
 * do not have to NL enable the message before calling the methods here if you
 * are calling one of the methids that takes an id as a parameter).
 */

public class DialogUtil {

    /**
     * Displays core error dialog with a message from the Core error status
     * object, and a user message. <br>
     * The user message is logged using Log.logError().
     */
    public static void displayCoreErrorDialog(Shell parent, String msg,
            CoreException coreEx) {

        if (msg == null)
            msg = coreEx.getMessage();
        String title = Messages.MessageDialog_errorTitle;
        if (parent == null)
            parent = getActiveShell();
        IStatus status = coreEx.getStatus();
        ErrorDialog.openError(parent, title, msg, status);
        Log.error(msg, coreEx);
    }

    /**
     * Displays error dialog with the given message. <br>
     */
    public static void displayErrorMessage(Shell parent, String msg,
            Throwable ex) {
        String title = Messages.MessageDialog_errorTitle;
        if (parent == null)
            parent = getActiveShell();
        MessageDialog.openError(parent, title, msg);
        Log.error(msg, ex);
    }


    /**
     * Displays error dialog with a message. <br>
     * The user message is formatted with the passed variables. Also logs the
     * error using Log.logError().
     */
    public static void displayErrorMessage(Shell parent, String msg,
            Object[] variables, Throwable ex) {
        if (msg == null)
            return;
        if (variables != null)
            msg = NLS.bind(msg, variables);
        displayErrorMessage(parent, msg, ex);
    }

    /**
     * Displays warning dialog with a given message. <br>
     * also logs the info using Log.logWarning(). msg error message to display
     * and log.
     */
    public static void displayWarningMessage(Shell parent, String msg) {
        String title = Messages.MessageDialog_warningTitle;
        if (parent == null)
            parent = getActiveShell();
        MessageDialog.openWarning(parent, title, msg);
        Log.warning(msg);
    }

    /**
     * Displays warning dialog with a message. <br>
     * also logs the info using Log.logWarning().
     */
    public static void displayWarningMessage(Shell parent, String msg,
            Object[] variables) {
        if (msg == null)
            return;
        if (variables != null)
            msg = NLS.bind(msg, variables);
        displayWarningMessage(parent, msg);
    }

    /**
     * Displays info dialog with a message. Also logs the info using
     * Log.logInfo().
     */
    public static void displayInfoMessage(Shell parent, String msg) {
        String title = Messages.MessageDialog_infoTitle;
        if (parent == null)
            parent = getActiveShell();
        MessageDialog.openInformation(parent, title, msg);
        Log.info(msg);

    }

    /**
     * Displays info dialog with a message. Also logs the info using
     * Log.logInfo().
     */
    public static void displayInfoMessage(Shell parent, String msg,
            Object[] variables) {
        if (msg == null)
            return;
        if (variables != null)
            msg = NLS.bind(msg, variables);
        displayInfoMessage(parent, msg);
    }

    public static IWorkbenchWindow getActiveWorkbenchWindow() {
        return PlatformUI.getWorkbench().getActiveWorkbenchWindow();
    }

    /**
     * Utility method to best find the active shell.
     */
    public static Shell getActiveShell() {
        Display display = getCurrentDisplay();
        Shell activeShell = display.getActiveShell();
        if (activeShell == null)
            return getActiveWorkbenchWindow().getShell();
        return activeShell;
    }

    /**
     * Utility method to best find the active Display.
     */
    public static Display getCurrentDisplay() {
        Display display = Display.getCurrent();
        if (display != null)
            return display;
        return Display.getDefault();
    }

}
