/********************************************************************************************
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;
}