60
65
static int *autostart_result;
61
66
static char* fontfile;
62
67
static int font_loaded;
64
static struct { char *name; char *pattern; } uilib_filefilter[] = {
65
{ "All files (*.*)", "*.*" },
66
{ "VICE palette files (*.vpl)", "*.vpl" },
67
{ "VICE snapshot files (*.vsf)", "*.vsf" },
68
{ "Disk image files (*.d64;*.d71;*.d80;*.d81;*.d82;*.g64;*.g41;*.x64)",
69
"*.d64;*.d71;*.d80;*.d81;*.d82;*.g64;*.g41;*.x64" },
70
{ "Tape image files (*.t64;*.p00;*.tap;*.prg)",
71
"*.t64;*.p00;*.tap;*.prg" },
72
{ "Zipped files (*.zip;*.bz2;*.gz;*.d6z;*.d7z;*.d8z;*.g6z;*.g4z;*.x6z)",
73
"*.zip;*.bz2;*.gz;*.d6z;*.d7z;*.d8z;*.g6z;*.g4z;*.x6z" },
74
{ "CRT cartridge image files (*.crt)", "*.crt" },
75
{ "Raw cartridge image files (*.bin)", "*.bin" },
76
{ "Flip list files (*.vfl)", "*.vfl" },
68
static char *res_readonly;
70
struct uilib_filefilter_s {
74
typedef struct uilib_filefilter_s uilib_filefilter_t;
76
static uilib_filefilter_t uilib_filefilter[] = {
77
{ TEXT("All files (*.*)"), TEXT("*.*") },
78
{ TEXT("VICE palette files (*.vpl)"), TEXT("*.vpl") },
79
{ TEXT("VICE snapshot files (*.vsf)"), TEXT("*.vsf") },
80
{ TEXT("Disk image files (*.d64;*.d71;*.d80;*.d81;*.d82;*.g64;*.g41;*.x64)"),
81
TEXT("*.d64;*.d71;*.d80;*.d81;*.d82;*.g64;*.g41;*.x64") },
82
{ TEXT("Tape image files (*.t64;*.p00;*.tap;*.prg)"),
83
TEXT("*.t64;*.p00;*.tap;*.prg") },
84
{ TEXT("Zipped files (*.zip;*.bz2;*.gz;*.d6z;*.d7z;*.d8z;*.g6z;*.g4z;*.x6z)"),
85
TEXT("*.zip;*.bz2;*.gz;*.d6z;*.d7z;*.d8z;*.g6z;*.g4z;*.x6z") },
86
{ TEXT("CRT cartridge image files (*.crt)"), TEXT("*.crt") },
87
{ TEXT("Raw cartridge image files (*.bin)"), TEXT("*.bin") },
88
{ TEXT("VICE flip list files (*.vfl)"), TEXT("*.vfl") },
89
{ TEXT("VICE romset files (*.vrs)"), TEXT("*.vrs") },
90
{ TEXT("VICE romset archives (*.vra)"), TEXT("*.vra") },
91
{ TEXT("VICE keymap files (*.vkm)"), TEXT("*.vkm") },
95
struct uilib_fs_style_type_s {
81
96
char *(*content_read_function)(const char *);
82
97
LPOFNHOOKPROC hook_proc;
84
99
char *initialdir_resource;
85
} ui_file_selector_style_type;
102
typedef struct uilib_fs_style_type_s uilib_fs_style_type_t;
87
static UINT APIENTRY tape_hook_proc(HWND hwnd, UINT uimsg, WPARAM wparam,
89
static UINT APIENTRY hook_proc(HWND hwnd, UINT uimsg, WPARAM wparam,
104
static UINT APIENTRY uilib_select_tape_hook_proc(HWND hwnd, UINT uimsg,
105
WPARAM wparam, LPARAM lparam);
106
static UINT APIENTRY uilib_select_hook_proc(HWND hwnd, UINT uimsg,
107
WPARAM wparam, LPARAM lparam);
92
109
static char *read_disk_image_contents(const char *name);
93
110
static char *read_tape_image_contents(const char *name);
94
111
static char *read_disk_or_tape_image_contents(const char *name);
96
static ui_file_selector_style_type styles[NUM_OF_FILE_SELECTOR_STYLES + 1] = {
97
/* FILE_SELECTOR_DEFAULT_STYLE */
113
static uilib_fs_style_type_t styles[UILIB_SELECTOR_STYLES_NUM + 1] = {
114
/* UILIB_SELECTOR_STYLE_DEFAULT */
99
NULL, 0, "InitialDefaultDir" },
100
/* FILE_SELECTOR_TAPE_STYLE */
116
NULL, 0, "InitialDefaultDir", NULL },
117
/* UILIB_SELECTOR_STYLE_TAPE */
101
118
{ read_tape_image_contents,
102
tape_hook_proc, IDD_OPENTAPE_TEMPLATE, "InitialTapeDir" },
103
/* FILE_SELECTOR_DISK_STYLE */
119
uilib_select_tape_hook_proc, IDD_OPENTAPE_TEMPLATE, "InitialTapeDir",
121
/* UILIB_SELECTOR_STYLE_DISK */
104
122
{ read_disk_image_contents,
105
hook_proc, IDD_OPEN_TEMPLATE, "InitialDiskDir" },
106
/* FILE_SELECTOR_DISK_AND_TAPE_STYLE */
123
uilib_select_hook_proc, IDD_OPEN_TEMPLATE, "InitialDiskDir", NULL },
124
/* UILIB_SELECTOR_STYLE_DISK_AND_TAPE */
107
125
{ read_disk_or_tape_image_contents,
108
hook_proc, IDD_OPEN_TEMPLATE, "InitialAutostartDir"},
109
/* FILE_SELECTOR_CART_STYLE */
111
NULL, 0, "InitialCartDir" },
112
/* FILE_SELECTOR_SNAPSHOT_STYLE */
114
NULL, 0, "InitialSnapshotDir" },
115
/* DIR_SELECTOR_EVENT_STYLE */
117
NULL, 0, "EventSnapshotDir" },
126
uilib_select_hook_proc, IDD_OPEN_TEMPLATE, "InitialAutostartDir", NULL },
127
/* UILIB_SELECTOR_STYLE_CART */
129
NULL, 0, "InitialCartDir", NULL },
130
/* UILIB_SELECTOR_STYLE_SNAPSHOT */
132
NULL, 0, "InitialSnapshotDir", NULL },
133
/* UILIB_SELECTOR_STYLE_EVENT_START */
135
NULL, 0, "EventSnapshotDir", "EventStartSnapshot" },
136
/* UILIB_SELECTOR_STYLE_EVENT_END */
138
NULL, 0, "EventSnapshotDir", "EventEndSnapshot" },
118
139
/* DUMMY entry Insert new styles before this */
141
NULL, 0, NULL, NULL }
123
static char *ui_file_selector_initialfile[NUM_OF_FILE_SELECTOR_STYLES];
144
static TCHAR *ui_file_selector_initialfile[UILIB_SELECTOR_STYLES_NUM];
126
147
static char *read_disk_image_contents(const char *name)
325
348
/* Try to use the cbm font */
327
350
hfont = CreateFont(-12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
328
0, 0, "cbm-directory-charset/ck!");
351
0, 0, "cbm-directory-charset/ck!");
330
353
/* maybe there's a better font-definition (FIXME) */
331
354
/* I think it's OK now (Tibor) */
332
355
hfont = CreateFont(-12, -7, 0, 0, 400, 0, 0, 0, 0, 0, 0,
333
DRAFT_QUALITY, FIXED_PITCH | FF_MODERN, NULL);
356
DRAFT_QUALITY, FIXED_PITCH | FF_MODERN, NULL);
336
359
SendDlgItemMessage(hwnd, IDC_PREVIEW, WM_SETFONT,
337
360
(WPARAM)hfont, MAKELPARAM(TRUE, 0));
339
SetDlgItemText(hwnd, IDC_BLANK_IMAGE_NAME, "vice");
340
SetDlgItemText(hwnd, IDC_BLANK_IMAGE_ID, "1a");
362
SetDlgItemText(hwnd, IDC_BLANK_IMAGE_NAME, TEXT("vice"));
363
SetDlgItemText(hwnd, IDC_BLANK_IMAGE_ID, TEXT("1a"));
364
if (res_readonly != NULL) {
366
resources_get_value(res_readonly, &ro);
367
CheckDlgButton(hwnd, IDC_TOGGLE_ATTACH_READONLY,
368
ro ? BST_CHECKED : BST_UNCHECKED);
370
EnableWindow(GetDlgItem(hwnd, IDC_TOGGLE_ATTACH_READONLY), FALSE);
343
if (((OFNOTIFY*)lparam)->hdr.code == CDN_SELCHANGE) {
374
if (((OFNOTIFY *)lparam)->hdr.code == CDN_SELCHANGE) {
344
375
SendMessage(preview, LB_RESETCONTENT, 0, 0);
345
376
if (SendMessage(((OFNOTIFY*)lparam)->hdr.hwndFrom,
346
CDM_GETFILEPATH, 256, (LPARAM)filename) >= 0) {
347
if (!(GetFileAttributes(filename)&FILE_ATTRIBUTE_DIRECTORY)) {
377
CDM_GETFILEPATH, 256, (LPARAM)st_filename) >= 0) {
378
if (!(GetFileAttributes(st_filename)
379
& FILE_ATTRIBUTE_DIRECTORY)) {
348
380
if (read_content_func != NULL) {
381
system_wcstombs(filename, st_filename, 256);
349
382
contents = read_content_func(filename);
350
383
create_content_list(contents, preview);
353
} else if (((OFNOTIFY*)lparam)->hdr.code == CDN_FOLDERCHANGE) {
387
} else if (((OFNOTIFY *)lparam)->hdr.code == CDN_FOLDERCHANGE) {
354
388
SendMessage(preview, LB_RESETCONTENT, 0, 0);
355
389
SetWindowText(GetDlgItem(GetParent(hwnd), 0x0480), "");
360
394
msg_type = LOWORD(wparam);
361
395
switch (msg_type) {
396
case IDC_TOGGLE_ATTACH_READONLY:
398
resources_set_value(res_readonly,
399
(resource_value_t)(IsDlgButtonChecked(hwnd,
400
IDC_TOGGLE_ATTACH_READONLY) == BST_CHECKED));
362
402
case IDC_BLANK_IMAGE:
363
403
if (SendMessage(GetParent(hwnd),
364
CDM_GETSPEC, 256, (LPARAM)filename) <= 1) {
404
CDM_GETSPEC, 256, (LPARAM)st_filename) <= 1) {
365
405
ui_error("Please enter a filename.");
368
if (strchr(filename,'.') == NULL) {
408
if (_tcschr(st_filename, '.') == NULL) {
369
409
append_extension = 1;
370
410
is_it_standard_extension = 1;
372
412
/* Find last dot in name */
373
extension = strrchr(filename, '.');
413
extension = _tcsrchr(st_filename, '.');
376
416
/* Figure out if it's a standard extension */
377
417
for (counter = 0; image_type_name[counter]; counter++) {
378
if (strncasecmp(extension,image_type_name[counter],
418
if (strncasecmp(extension, image_type_name[counter],
379
419
strlen(image_type_name[counter])) == 0) {
380
420
is_it_standard_extension = 1;
391
431
counter = SendMessage(GetDlgItem(hwnd, IDC_BLANK_IMAGE_TYPE),
392
432
CB_GETCURSEL, 0, 0);
393
433
if (append_extension) {
394
strcat(filename,".");
395
strcat(filename,image_type_name[counter]);
434
_tcscat(st_filename, TEXT("."));
435
_tcscat(st_filename, image_type_name[counter]);
397
if (util_file_exists(filename)) {
437
system_wcstombs(filename, st_filename, 256);
438
if (util_file_exists(st_filename)) {
399
ret = ui_messagebox("Overwrite existing image?",
401
MB_YESNO | MB_ICONQUESTION);
440
ret = ui_messagebox(TEXT("Overwrite existing image?"),
441
TEXT("VICE question"),
442
MB_YESNO | MB_ICONQUESTION);
402
443
if (ret != IDYES)
405
446
GetDlgItemText(hwnd, IDC_BLANK_IMAGE_NAME, disk_name, 17);
406
447
GetDlgItemText(hwnd, IDC_BLANK_IMAGE_ID, disk_id, 3);
407
448
format_name = lib_msprintf("%s,%s", disk_name, disk_id);
408
if (vdrive_internal_create_format_disk_image(filename,
449
if (vdrive_internal_create_format_disk_image(st_filename,
409
450
format_name, image_type[counter]) < 0) {
410
451
ui_error("Cannot create image");
411
452
lib_free(format_name);
455
496
switch (HIWORD(wparam)) {
457
if (autostart_result != NULL) {
458
index = SendMessage((HWND)lparam, LB_GETCURSEL, 0, 0);
459
if (SendMessage(GetParent(hwnd),
460
CDM_GETFILEPATH, 256, (LPARAM)filename) >= 0) {
461
*autostart_result = index;
462
SendMessage(GetParent(hwnd), WM_COMMAND,
463
MAKELONG(IDOK,BN_CLICKED),
464
(LPARAM)GetDlgItem(GetParent(hwnd), IDOK));
498
if (autostart_result != NULL) {
499
index = SendMessage((HWND)lparam, LB_GETCURSEL, 0, 0);
500
if (SendMessage(GetParent(hwnd),
501
CDM_GETFILEPATH, 256, (LPARAM)st_filename) >= 0) {
502
*autostart_result = index;
503
SendMessage(GetParent(hwnd), WM_COMMAND,
504
MAKELONG(IDOK,BN_CLICKED),
505
(LPARAM)GetDlgItem(GetParent(hwnd), IDOK));
570
char *ui_select_file(HWND hwnd, const char *title, DWORD filterlist,
571
int style, int *autostart)
616
TCHAR *uilib_select_file_autostart(HWND hwnd, const TCHAR *title,
617
DWORD filterlist, unsigned int type,
618
int style, int *autostart,
619
char *resource_readonly)
573
char name[1024] = "";
575
char filter[UI_LIB_MAX_FILTER_LENGTH];
621
TCHAR st_name[MAX_PATH];
623
char *initialdir = NULL;
576
626
DWORD filterindex;
577
627
OPENFILENAME ofn;
580
631
if (styles[style].initialdir_resource != NULL)
581
632
resources_get_value(styles[style].initialdir_resource,
582
633
(void *)&initialdir);
584
if (ui_file_selector_initialfile[style] != NULL)
585
strcpy(name, ui_file_selector_initialfile[style]);
587
if (style == DIR_SELECTOR_EVENT_STYLE)
588
strcpy(name, "FilenameNotUsed");
635
if (type == UILIB_SELECTOR_TYPE_DIR_EXIST)
636
_tcscpy(st_name, TEXT("FilenameNotUsed"));
638
_tcscpy(st_name, TEXT(""));
640
initialfile = ui_file_selector_initialfile[style];
641
if (styles[style].file_resource != NULL)
642
resources_get_value(styles[style].file_resource,
643
(void *)&initialfile);
645
if (initialfile != NULL)
646
_tcscpy(st_name, initialfile);
590
648
if (fontfile == NULL) {
591
649
fontfile = util_concat(archdep_boot_path(),
659
filter = set_filter(filterlist, &filterindex);
601
661
memset(&ofn, 0, sizeof(ofn));
602
662
ofn.lStructSize = sizeof(ofn);
603
663
ofn.hwndOwner = hwnd;
604
664
ofn.hInstance = winmain_instance;
605
set_filter(filter, filterlist, &filterindex);
606
665
ofn.lpstrFilter = filter;
607
666
ofn.lpstrCustomFilter = NULL;
608
667
ofn.nMaxCustFilter = 0;
609
668
ofn.nFilterIndex = filterindex;
610
ofn.lpstrFile = name;
611
ofn.nMaxFile = sizeof(name);
669
ofn.lpstrFile = st_name;
670
ofn.nMaxFile = sizeof(st_name);
612
671
ofn.lpstrFileTitle = NULL;
613
672
ofn.nMaxFileTitle = 0;
614
673
ofn.lpstrInitialDir = initialdir;
615
674
ofn.lpstrTitle = title;
616
if (styles[style].TemplateID!=0) {
617
ofn.Flags = (OFN_EXPLORER
619
| OFN_NOTESTFILECREATE
675
ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY | OFN_NOTESTFILECREATE
676
| OFN_SHAREAWARE | OFN_ENABLESIZING;
677
if (styles[style].TemplateID != 0) {
678
ofn.Flags |= OFN_ENABLEHOOK | OFN_ENABLETEMPLATE;
624
679
ofn.lpfnHook = styles[style].hook_proc;
625
680
ofn.lpTemplateName = MAKEINTRESOURCE(styles[style].TemplateID);
627
ofn.Flags = (OFN_EXPLORER
629
| OFN_NOTESTFILECREATE
631
682
ofn.lpfnHook = NULL;
632
683
ofn.lpTemplateName = NULL;
634
if (style != DIR_SELECTOR_EVENT_STYLE)
685
if (type == UILIB_SELECTOR_TYPE_FILE_LOAD)
635
686
ofn.Flags |= OFN_FILEMUSTEXIST;
637
688
ofn.nFileOffset = 0;
638
689
ofn.nFileExtension = 0;
639
690
ofn.lpstrDefExt = NULL;
641
read_content_func=styles[style].content_read_function;
642
autostart_result=autostart;
692
read_content_func = styles[style].content_read_function;
693
autostart_result = autostart;
694
res_readonly = resource_readonly;
643
695
vsync_suspend_speed_eval();
644
result = GetOpenFileName(&ofn);
697
if (type == UILIB_SELECTOR_TYPE_FILE_SAVE)
698
result = GetSaveFileName(&ofn);
700
result = GetOpenFileName(&ofn);
645
702
update_filter_history(ofn.nFilterIndex);
705
char *tmpdir, *tmpfile;
647
707
if (ui_file_selector_initialfile[style] != NULL)
648
708
lib_free(ui_file_selector_initialfile[style]);
649
util_fname_split(name, &initialdir,
650
&ui_file_selector_initialfile[style]);
651
resources_set_value(styles[style].initialdir_resource, initialdir);
652
return lib_stralloc(name);
709
system_wcstombs(name, st_name, MAX_PATH);
710
util_fname_split(name, &tmpdir, &tmpfile);
711
if (styles[style].file_resource != NULL)
712
resources_set_value(styles[style].file_resource, tmpfile);
713
ui_file_selector_initialfile[style] = system_mbstowcs_alloc(tmpfile);
714
resources_set_value(styles[style].initialdir_resource, tmpdir);
715
ret = system_wcstombs_alloc(st_name);
726
TCHAR *uilib_select_file(HWND hwnd, const TCHAR *title, DWORD filterlist,
727
unsigned int type, int style)
729
return uilib_select_file_autostart(hwnd, title, filterlist, type, style,
733
void uilib_select_browse(HWND hwnd, const TCHAR *title, DWORD filterlist,
734
unsigned int type, int idc)
738
st_name = uilib_select_file(hwnd, title, filterlist, type,
739
UILIB_SELECTOR_STYLE_DEFAULT);
740
if (st_name != NULL) {
741
SetDlgItemText(hwnd, idc, st_name);
659
746
BOOL CALLBACK GetParentEnumProc(HWND hwnd, LPARAM lParam)
890
void uilib_show_options(HWND param)
894
options = cmdline_options_string();
895
ui_show_text(param, "Command line options",
896
"Which command line options are available?", options);
900
void uilib_shutdown(void)
904
for (i = 0; i < UILIB_SELECTOR_STYLES_NUM; i++)
905
if (ui_file_selector_initialfile[i] != NULL)
906
lib_free(ui_file_selector_initialfile[i]);
911
static uilib_dialogbox_param_t *uilib_dialogbox_param;
913
static BOOL CALLBACK uilib_dialogbox_dialog_proc(HWND hwnd, UINT msg,
914
WPARAM wparam, LPARAM lparam)
918
switch (LOWORD(wparam)) {
920
GetDlgItemText(hwnd, uilib_dialogbox_param->idc_dialog,
921
uilib_dialogbox_param->string, UILIB_DIALOGBOX_MAX);
922
uilib_dialogbox_param->updated = 1;
932
SetDlgItemText(hwnd, uilib_dialogbox_param->idc_dialog,
933
uilib_dialogbox_param->string);
940
void uilib_dialogbox(uilib_dialogbox_param_t *param)
942
uilib_dialogbox_param = param;
943
uilib_dialogbox_param->updated = 0;
944
DialogBox(winmain_instance, (LPCTSTR)(uilib_dialogbox_param->idd_dialog),
945
uilib_dialogbox_param->hwnd, uilib_dialogbox_dialog_proc);