1
/* Hey EMACS -*- linux-c -*- */
2
/* $Id: filesel.c 1455 2005-05-31 18:38:03Z roms $ */
4
/* TiEmu - an TI emulator
6
* Copyright (c) 2000-2001, Thomas Corvazier, Romain Lievin
7
* Copyright (c) 2001-2003, Romain Lievin
8
* Copyright (c) 2003, Julien Blache
9
* Copyright (c) 2004, Romain Li�vin
10
* Copyright (c) 2005, Romain Li�vin, Kevin Kofler
12
* This program is free software; you can redistribute it and/or modify
13
* it under the terms of the GNU General Public License as published by
14
* the Free Software Foundation; either version 2 of the License, or
15
* (at your option) any later version.
16
* This program is distributed in the hope that it will be useful,
17
* but WITHOUT ANY WARRANTY; without even the implied warranty of
18
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
* GNU General Public License for more details. *
20
* You should have received a copy of the GNU General Public License
21
* along with this program; if not, write to the Free Software
22
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
46
/* Single file selectors */
48
static gchar *fname = NULL;
49
static gint action = 0;
51
static void store_filename(GtkFileSelection * file_selector,
54
fname = g_strdup((gchar *)gtk_file_selection_get_filename(GTK_FILE_SELECTION(user_data)));
58
static void cancel_filename(GtkButton * button, gpointer user_data)
64
// GTK 1.x/2.x (x < 4)
65
static const gchar* create_fsel_1(gchar *dirname, gchar *filename, gchar *ext, gboolean save)
69
fs = gtk_file_selection_new("Select a file...");
71
gtk_file_selection_set_filename (GTK_FILE_SELECTION(fs), dirname);
72
gtk_file_selection_complete(GTK_FILE_SELECTION(fs), filename ? filename : ext);
74
g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button),
75
"clicked", G_CALLBACK(store_filename), fs);
77
g_signal_connect(GTK_OBJECT
78
(GTK_FILE_SELECTION(fs)->cancel_button),
79
"clicked", G_CALLBACK(cancel_filename), fs);
81
g_signal_connect_swapped(GTK_OBJECT
82
(GTK_FILE_SELECTION(fs)->ok_button),
84
G_CALLBACK(gtk_widget_destroy),
87
g_signal_connect_swapped(GTK_OBJECT
88
(GTK_FILE_SELECTION(fs)->cancel_button),
89
"clicked", G_CALLBACK(gtk_widget_destroy),
95
for(action = 0; !action; )
102
static const gchar* create_fsel_2(gchar *dirname, gchar *filename, gchar *ext, gboolean save)
105
GtkFileFilter *filter;
111
dialog = gtk_file_chooser_dialog_new (
112
save ? "Save File" : "Open File",
114
save ? GTK_FILE_CHOOSER_ACTION_SAVE : GTK_FILE_CHOOSER_ACTION_OPEN,
115
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
116
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
119
// set default folder
120
path = g_path_get_dirname(dirname);
121
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), path);
126
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename);
129
filter = gtk_file_filter_new();
130
sarray = g_strsplit(ext, ";", -1);
131
for(i = 0; sarray[i] != NULL; i++)
132
gtk_file_filter_add_pattern (filter, sarray[i]);
134
gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);
138
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
139
fname = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
142
gtk_widget_destroy (dialog);
148
static const gchar* create_fsel_3(gchar *dirname, gchar *filename, gchar *ext, gboolean save)
152
char lpstrFile[1024] = "\0";
153
char lpstrFilter[256];
159
memset (&o, 0, sizeof(OPENFILENAME));
161
// set default filename
163
strcpy(lpstrFile, filename);
166
sarray = g_strsplit(ext, "|", -1);
167
for(n = 0; sarray[n] != NULL; n++);
169
for(i = 0, p = lpstrFilter; i < n; i++)
171
strcpy(p, sarray[i]);
172
p += strlen(sarray[i]);
175
strcpy(p, sarray[i]);
176
p += strlen(sarray[i]);
183
o.lStructSize = sizeof (o);
184
o.lpstrFilter = lpstrFilter; //"All\0*.*\0Text\0*.TXT\0";
185
o.lpstrFile = lpstrFile;
186
o.nMaxFile = sizeof(lpstrFile);
187
o.lpstrInitialDir = dirname;
188
o.Flags = 0x02000000 | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY |
189
OFN_NOCHANGEDIR | OFN_EXPLORER | OFN_LONGNAMES | OFN_NONETWORKBUTTON;
194
if(!GetSaveFileName(&o))
195
return filename = NULL;
199
if(!GetOpenFileName(&o))
200
return filename = NULL;
203
return fname = g_strdup(lpstrFile);
210
static const gchar* create_fsel_4(gchar *dirname, gchar *filename, gchar *ext, gboolean save)
214
gchar *extspaces = g_strdup(ext);
217
while ((p = strchr(p, ';'))) *p = ' ';
222
dirname = g_strconcat(dirname, filename, NULL);
223
fname = sp_kde_get_write_filename(dirname, extspaces, _("Save file"));
226
fname = sp_kde_get_open_filename(dirname, extspaces, _("Open file"));
236
const gchar *create_fsel(gchar *dirname, gchar *filename, gchar *ext, gboolean save)
239
if(options.fs_type == 2)
243
if(options.fs_type == 3)
246
//printf("%i: <%s> <%s> <%s> %i\n", options.fs_type, dirname, filename, ext, save);
248
switch(options.fs_type)
250
case 0: return create_fsel_1(dirname, filename, ext, save);
251
case 1: return create_fsel_2(dirname, filename, ext, save);
252
case 2: return create_fsel_3(dirname, filename, ext, save);
253
case 3: return create_fsel_4(dirname, filename, ext, save);
254
default: return NULL;
260
/* Multiple files selectors */
262
static gchar** filenames = NULL;
263
static gint actions = 0;
265
static void store_filenames(GtkFileSelection * file_selector,
268
filenames = gtk_file_selection_get_selections(GTK_FILE_SELECTION(user_data));
272
static void cancel_filenames(GtkButton * button, gpointer user_data)
278
// GTK 1.x/2.x (x < 4)
279
static gchar** create_fsels_1(gchar *dirname, gchar *filename, gchar *ext)
283
fs = gtk_file_selection_new("Select a file...");
285
gtk_file_selection_set_select_multiple(GTK_FILE_SELECTION(fs), TRUE);
286
gtk_file_selection_set_filename (GTK_FILE_SELECTION(fs), dirname);
287
gtk_file_selection_complete(GTK_FILE_SELECTION(fs), filename ? filename : ext);
289
g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button),
290
"clicked", G_CALLBACK(store_filenames), fs);
292
g_signal_connect(GTK_OBJECT
293
(GTK_FILE_SELECTION(fs)->cancel_button),
294
"clicked", G_CALLBACK(cancel_filenames), fs);
296
g_signal_connect_swapped(GTK_OBJECT
297
(GTK_FILE_SELECTION(fs)->ok_button),
299
G_CALLBACK(gtk_widget_destroy),
302
g_signal_connect_swapped(GTK_OBJECT
303
(GTK_FILE_SELECTION(fs)->cancel_button),
304
"clicked", G_CALLBACK(gtk_widget_destroy),
308
for(actions = 0; !actions; )
315
static gchar** create_fsels_2(gchar *dirname, gchar *filename, gchar *ext)
318
GtkFileFilter *filter;
324
dialog = gtk_file_chooser_dialog_new ("Open File",
326
GTK_FILE_CHOOSER_ACTION_OPEN,
327
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
328
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
331
// set default folder
332
path = g_path_get_dirname(dirname);
333
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), path);
336
// set multiple selection
337
gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);
341
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename);
344
filter = gtk_file_filter_new();
345
sarray = g_strsplit(ext, ";", -1);
346
for(i = 0; sarray[i] != NULL; i++)
347
gtk_file_filter_add_pattern (filter, sarray[i]);
349
gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);
353
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
358
// convert list into string array
359
list = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER (dialog));
360
filenames = g_malloc0(g_slist_length(list)+1);
362
for(p = list, q = filenames; p; p = g_slist_next(p), q++)
364
*q = g_malloc0(strlen(p->data) + 1);
371
gtk_widget_destroy (dialog);
377
static gchar** create_fsels_3(gchar *dirname, gchar *filename, gchar *ext)
381
char lpstrFile[1024] = "\0";
382
char lpstrFilter[256];
388
memset (&o, 0, sizeof(OPENFILENAME));
390
// set default filename
392
strncpy(lpstrFile, filename, sizeof(lpstrFile));
395
sarray = g_strsplit(ext, "|", -1);
396
for(n = 0; sarray[n] != NULL; n++);
398
for(i = 0, p = lpstrFilter; i < n; i++)
400
strcpy(p, sarray[i]);
401
p += strlen(sarray[i]);
404
strcpy(p, sarray[i]);
405
p += strlen(sarray[i]);
412
o.lStructSize = sizeof (o);
413
o.lpstrFilter = lpstrFilter; //"All\0*.*\0Text\0*.TXT\0";
414
o.lpstrFile = lpstrFile; //"C:\msvc\tilp\0foo.txt\0bar.txt"
415
o.nMaxFile = sizeof(lpstrFile);
416
o.lpstrInitialDir = dirname;
417
o.Flags = 0x02000000 | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY |
418
OFN_NOCHANGEDIR | OFN_EXPLORER | OFN_LONGNAMES | OFN_NONETWORKBUTTON |
419
OFN_ALLOWMULTISELECT;
422
if(!GetOpenFileName(&o))
426
// converts resulting string
427
for(p = lpstrFile, i=0; *p; p += strlen(p)+1, i++)
429
if(i) // skip directory
431
filenames = g_realloc(filenames, (i+1) * sizeof(gchar *));
432
filenames[i-1] = g_strconcat(lpstrFile, G_DIR_SEPARATOR_S, p, NULL);
436
// one file selected ?
439
filenames = g_malloc(2 * sizeof(gchar *));
440
filenames[0] = g_strdup(lpstrFile);
444
filenames[i-1] = NULL;
452
static gchar** create_fsels_4(gchar *dirname, gchar *filename, gchar *ext)
456
gchar *extspaces = g_strdup(ext);
458
while ((p = strchr(p, ';'))) *p = ' ';
459
filenames = sp_kde_get_open_filenames(dirname, extspaces, _("Open file"));
468
gchar** create_fsels(gchar *dirname, gchar *filename, gchar *ext)
471
if(options.fs_type == 2)
475
if(options.fs_type == 3)
478
//printf("%i: <%s> <%s> <%s>\n", options.fs_type, dirname, filename, ext);
480
switch(options.fs_type)
482
case 0: return create_fsels_1(dirname, filename, ext);
483
case 1: return create_fsels_2(dirname, filename, ext);
484
case 2: return create_fsels_3(dirname, filename, ext);
485
case 3: return create_fsels_4(dirname, filename, ext);
486
default: return NULL;