/********************************************************************************************
    Clean OS Windows library module version 1.2.1.
    This module is part of the Clean Object I/O library, version 1.2.1,
    for the Windows platform.
********************************************************************************************/

/********************************************************************************************
    About this module:
    Routines related to standard file selector dialogues.
********************************************************************************************/
#include "cCrossCallFileSelectors_121.h"
#include "util_121.h"
#include "cCrossCall_121.h"

extern GtkWidget *gActiveTopLevelWindow;

void EvalCcRqDIRECTORYDIALOG (CrossCallInfo *pcci)		/* no params;  bool, textptr result; */
{
    GtkWidget *file_selector;
    printf("EvalCcRqDIRECTORYDIALOG\n");
    file_selector = gtk_file_selection_new("Select directory");

    if (gActiveTopLevelWindow)
    {
        gtk_window_set_transient_for(GTK_WINDOW(file_selector), GTK_WINDOW(gActiveTopLevelWindow));
    }

    for (;;)
    {
        if (gtk_dialog_run(GTK_DIALOG(file_selector)) == GTK_RESPONSE_OK)
        {
            gchar *file_name;
            G_CONST_RETURN gchar *fname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(file_selector));
            if (!g_file_test(fname, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))
            {
                GtkWidget *dialog =
                        gtk_message_dialog_new (GTK_WINDOW(file_selector),
                                                GTK_DIALOG_DESTROY_WITH_PARENT,
                                                GTK_MESSAGE_ERROR,
                                                GTK_BUTTONS_OK,
                                                "%s directory not found",
                                                fname);
                 gtk_dialog_run (GTK_DIALOG (dialog));
                 gtk_widget_destroy (dialog);
                 continue;
            }

            file_name = g_strdup(fname);
            gtk_widget_destroy(file_selector);
            MakeReturn2Cci(pcci, gtk_true(), (int64_t) file_name);
            return;
        }
        else
        {
            gtk_widget_destroy(file_selector);
            MakeReturn2Cci(pcci, gtk_false(), (int64_t) NULL);
            return;
        }
    }
}

void EvalCcRqFILEOPENDIALOG (CrossCallInfo *pcci)		/* no params;  bool, textptr result; */
{
    GtkWidget *file_selector;
    printf("EvalCcFILEOPENDIALOG\n");
    file_selector = gtk_file_selection_new("Open");

    if (gActiveTopLevelWindow)
    {
        gtk_widget_set_parent(file_selector, gActiveTopLevelWindow);
        gtk_window_set_transient_for(GTK_WINDOW(file_selector), GTK_WINDOW(gActiveTopLevelWindow));
    }

    for (;;)
    {
        if (gtk_dialog_run(GTK_DIALOG(file_selector)) == GTK_RESPONSE_OK)
        {
            gchar *file_name;
            G_CONST_RETURN gchar *fname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(file_selector));
            if (!g_file_test(fname, G_FILE_TEST_EXISTS))
            {
                GtkWidget *dialog =
                        gtk_message_dialog_new (GTK_WINDOW(file_selector),
                                                GTK_DIALOG_DESTROY_WITH_PARENT,
                                                GTK_MESSAGE_ERROR,
                                                GTK_BUTTONS_OK,
                                                "%s file not found",
                                                fname);
                 gtk_dialog_run (GTK_DIALOG (dialog));
                 gtk_widget_destroy (dialog);
                 continue;
            }

            file_name = g_strdup(fname);
            gtk_widget_destroy(file_selector);
            MakeReturn2Cci(pcci, gtk_true(), (int64_t) file_name);
            return;
        }
        else
        {
            gtk_widget_destroy(file_selector);
            MakeReturn2Cci(pcci, gtk_false(), (int64_t) NULL);
            return;
        }
    }
}

void EvalCcRqFILESAVEDIALOG (CrossCallInfo *pcci)		/* promptptr, nameptr; bool, textptr result; */
{
    GtkWidget *file_selector;
    printf("EvalCcFILESAVEDDIALOG\n");
    file_selector = gtk_file_selection_new((gchar *) pcci->p1);

    if (gActiveTopLevelWindow)
    {
        gtk_widget_set_parent(file_selector, gActiveTopLevelWindow);
        gtk_window_set_transient_for(GTK_WINDOW(file_selector), GTK_WINDOW(gActiveTopLevelWindow));
    }

    gtk_file_selection_set_filename((GtkFileSelection*) file_selector, (gchar *) pcci->p2);

    for (;;)
    {
        if (gtk_dialog_run(GTK_DIALOG(file_selector)) == GTK_RESPONSE_OK)
        {
            gchar *file_name;
            G_CONST_RETURN gchar *fname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(file_selector));
            if (g_file_test(fname, G_FILE_TEST_EXISTS))
            {
                gint res;
                GtkWidget *dialog =
                        gtk_message_dialog_new (GTK_WINDOW(file_selector),
                                                GTK_DIALOG_DESTROY_WITH_PARENT,
                                                GTK_MESSAGE_WARNING,
                                                GTK_BUTTONS_YES_NO,
                                                "%s already exists. Do you want to replace id?",
                                                fname);
                 res = gtk_dialog_run (GTK_DIALOG (dialog));
                 gtk_widget_destroy (dialog);

                 if (res == GTK_RESPONSE_NO) continue;
            }

            file_name = g_strdup(fname);
            gtk_widget_destroy(file_selector);
            MakeReturn2Cci(pcci, gtk_true(), (int64_t) file_name);
            return;
        }
        else
        {
            gtk_widget_destroy(file_selector);
            MakeReturn2Cci(pcci, gtk_false(), (int64_t) NULL);
            return;
        }
    }
}


/*	Install the cross call procedures in the gCrossCallProcedureTable of cCrossCall_121.
*/
OS InstallCrossCallFileSelectors(OS ios)
{
    CrossCallProcedureTable newTable;
    printf("InstallCrossCallFileSelectors\n");

    newTable = EmptyCrossCallProcedureTable ();
    AddCrossCallEntry (newTable, CcRqDIRECTORYDIALOG,EvalCcRqDIRECTORYDIALOG);
    AddCrossCallEntry (newTable, CcRqFILEOPENDIALOG, EvalCcRqFILEOPENDIALOG);
    AddCrossCallEntry (newTable, CcRqFILESAVEDIALOG, EvalCcRqFILESAVEDIALOG);
    AddCrossCallEntries (gCrossCallProcedureTable, newTable);

    return ios;
}