/////////////////////////////////////////////////////////////////////////////
// Name:        src/gtk/fontdlg.cpp
// Purpose:     wxFontDialog
// Author:      Robert Roebling
// Copyright:   (c) 1998 Robert Roebling
// Licence:     wxWindows licence
/////////////////////////////////////////////////////////////////////////////

// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"

#if wxUSE_FONTDLG

#include "wx/fontdlg.h"

#ifndef WX_PRECOMP
    #include "wx/intl.h"
#endif

#include "wx/fontutil.h"
#include "wx/gtk/private.h"

//-----------------------------------------------------------------------------
// "response"
//-----------------------------------------------------------------------------

extern "C" {
static void response(GtkDialog* dialog, int response_id, wxFontDialog* win)
{
    int rc = wxID_CANCEL;
    if (response_id == GTK_RESPONSE_OK)
    {
        rc = wxID_OK;
#if GTK_CHECK_VERSION(3,2,0)
        if (gtk_check_version(3,2,0) == nullptr)
        {
            wxNativeFontInfo info;
            info.description = gtk_font_chooser_get_font_desc(GTK_FONT_CHOOSER(dialog));
            win->GetFontData().SetChosenFont(wxFont(info));
        }
        else
#endif
        {
            wxGCC_WARNING_SUPPRESS(deprecated-declarations)
            GtkFontSelectionDialog* sel = GTK_FONT_SELECTION_DIALOG(dialog);
            wxGtkString name(gtk_font_selection_dialog_get_font_name(sel));
            win->GetFontData().SetChosenFont(wxFont(wxString::FromUTF8(name)));
            wxGCC_WARNING_RESTORE()
        }
    }

    if (win->IsModal())
        win->EndModal(rc);
    else
        win->Show(false);
}
}

//-----------------------------------------------------------------------------
// wxFontDialog
//-----------------------------------------------------------------------------

wxIMPLEMENT_DYNAMIC_CLASS(wxFontDialog, wxDialog);

bool wxFontDialog::DoCreate(wxWindow *parent)
{
    parent = GetParentForModalDialog(parent, 0);

    if (!PreCreation( parent, wxDefaultPosition, wxDefaultSize ) ||
        !CreateBase( parent, -1, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE,
                     wxDefaultValidator, wxT("fontdialog") ))
    {
        wxFAIL_MSG( wxT("wxFontDialog creation failed") );
        return false;
    }

    const wxString message(_("Choose font"));
    GtkWindow* gtk_parent = nullptr;
    if (parent)
        gtk_parent = GTK_WINDOW(parent->m_widget);

#if GTK_CHECK_VERSION(3,2,0)
#if GLIB_CHECK_VERSION(2, 34, 0)
    g_type_ensure(PANGO_TYPE_FONT_FACE);
#endif
    if (gtk_check_version(3,2,0) == nullptr)
        m_widget = gtk_font_chooser_dialog_new(message.utf8_str(), gtk_parent);
    else
#endif
    {
        wxGCC_WARNING_SUPPRESS(deprecated-declarations)
        m_widget = gtk_font_selection_dialog_new(message.utf8_str());
        if (gtk_parent)
            gtk_window_set_transient_for(GTK_WINDOW(m_widget), gtk_parent);
        wxGCC_WARNING_RESTORE()
    }
    g_object_ref(m_widget);

    g_signal_connect(m_widget, "response", G_CALLBACK(response), this);

    wxFont font = m_fontData.GetInitialFont();
    if( font.IsOk() )
    {
        const wxNativeFontInfo *info = font.GetNativeFontInfo();

        if ( info )
        {
#if GTK_CHECK_VERSION(3,2,0)
            if (gtk_check_version(3,2,0) == nullptr)
                gtk_font_chooser_set_font_desc(GTK_FONT_CHOOSER(m_widget), info->description);
            else
#endif
            {
                wxGCC_WARNING_SUPPRESS(deprecated-declarations)
                const wxString& fontname = info->ToString();
                GtkFontSelectionDialog* sel = GTK_FONT_SELECTION_DIALOG(m_widget);
                gtk_font_selection_dialog_set_font_name(sel, fontname.utf8_str());
                wxGCC_WARNING_RESTORE()
            }
        }
        else
        {
            // this is not supposed to happen!
            wxFAIL_MSG(wxT("font is ok but no native font info?"));
        }
    }

    return true;
}

wxFontDialog::~wxFontDialog()
{
}

#endif // wxUSE_FONTDLG
