4 Virtual Floppy Drive for Windows
6 Open image GUI utility function
8 Copyright (c) 2003-2005 Ken Kato
12 #pragma message(__FILE__": Compiled as C++ for testing purpose.")
15 #define WIN32_LEAN_AND_MEAN
18 #pragma warning(push,3)
31 #include "vfdmsg_lib.h"
39 #define FALLBACK_IMAGE_FILTER \
40 "Common image files (bin,dat,fdd,flp,ima,img,vfd)\0" \
41 "*.bin;*.dat;*.fdd;*.flp;*.ima;*.img;*.vfd\0" \
42 "Zip compressed image (imz,zip)\0*.imz;*.zip\0" \
43 "All files (*.*)\0*.*\0"
45 #define FALLBACK_IMAGE_TITLE "Open Virtual Floppy Image"
50 static INT CALLBACK
OpenDialogProc(
56 static void OnInit(HWND hDlg
, ULONG nDevice
);
57 static void OnImage(HWND hDlg
, HWND hEdit
);
58 static void OnBrowse(HWND hDlg
);
59 static void OnDiskType(HWND hDlg
, HWND hRadio
);
60 static void OnMediaType(HWND hDlg
, HWND hCombo
);
61 static void OnProtect(HWND hDlg
, HWND hCheck
);
62 static DWORD
OnOK(HWND hDlg
);
65 // Show Open Image dialog box
67 DWORD WINAPI
VfdGuiOpen(
71 switch (DialogBoxParam(
73 MAKEINTRESOURCE(IDD_OPENDIALOG
),
82 return ERROR_CANCELLED
;
85 return GetLastError();
90 // Open image dialog procedure
92 INT CALLBACK
OpenDialogProc(
100 OnInit(hDlg
, lParam
);
105 case MAKELONG(IDC_IMAGEFILE
, EN_CHANGE
):
106 OnImage(hDlg
, (HWND
)lParam
);
113 case IDC_DISKTYPE_FILE
:
114 case IDC_DISKTYPE_RAM
:
115 OnDiskType(hDlg
, (HWND
)lParam
);
118 case MAKELONG(IDC_MEDIATYPE
, CBN_SELCHANGE
):
119 OnMediaType(hDlg
, (HWND
)lParam
);
122 case IDC_OPEN_PROTECTED
:
123 OnProtect(hDlg
, (HWND
)lParam
);
127 if (OnOK(hDlg
) == ERROR_SUCCESS
) {
128 EndDialog(hDlg
, IDOK
);
133 EndDialog(hDlg
, IDCANCEL
);
139 ShowContextMenu(hDlg
, (HWND
)wParam
, lParam
);
144 LPHELPINFO info
= (LPHELPINFO
)lParam
;
146 if (info
->iContextType
== HELPINFO_WINDOW
) {
147 ShowHelpWindow(hDlg
, info
->iCtrlId
);
157 // Initialize the Open Image dialog
165 // Store the device number
167 SetWindowLong(hDlg
, GWL_USERDATA
, nDevice
);
169 // Store default file size
171 SetWindowLong(hDlg
, DWL_USER
, INVALID_FILE_SIZE
);
173 // Set dialog window title
175 SetControlText(hDlg
, 0, MSG_OPEN_TITLE
);
177 // Set control captions
179 SetControlText(hDlg
, IDC_IMAGEFILE_LABEL
, MSG_IMAGEFILE_ACCEL
);
180 SetControlText(hDlg
, IDC_IMAGEDESC_LABEL
, MSG_DESCRIPTION_LABEL
);
181 SetControlText(hDlg
, IDC_BROWSE
, MSG_BROWSE_BUTTON
);
182 SetControlText(hDlg
, IDC_DISKTYPE_LABEL
, MSG_DISKTYPE_LABEL
);
183 SetControlText(hDlg
, IDC_MEDIATYPE_LABEL
, MSG_MEDIATYPE_ACCEL
);
184 SetControlText(hDlg
, IDC_OPEN_PROTECTED
, MSG_MENU_PROTECT
);
185 SetControlText(hDlg
, IDOK
, MSG_CREATE_BUTTON
);
186 SetControlText(hDlg
, IDCANCEL
, MSG_CANCEL_BUTTON
);
188 // select RAM disk as default
190 CheckRadioButton(hDlg
, IDC_DISKTYPE_FILE
,
191 IDC_DISKTYPE_RAM
, IDC_DISKTYPE_RAM
);
193 // setup media type combo list
195 for (i
= 1; i
< VFD_MEDIA_MAX
; i
++) {
196 SendDlgItemMessage(hDlg
, IDC_MEDIATYPE
,
197 CB_ADDSTRING
, 0, (LPARAM
)VfdMediaTypeName(i
));
200 // select 1.44MB as the default
202 SendDlgItemMessage(hDlg
, IDC_MEDIATYPE
, CB_SELECTSTRING
,
203 (WPARAM
)-1, (LPARAM
)VfdMediaTypeName(VFD_MEDIA_F3_1P4
));
205 // set up other controls
207 OnImage(hDlg
, GetDlgItem(hDlg
, IDC_IMAGEFILE
));
211 // Path is changed -- check if the file exists
220 VFD_FILETYPE file_type
;
221 VFD_MEDIA media_type
;
223 DWORD ret
= ERROR_SUCCESS
;
225 // Store default file size
227 SetWindowLong(hDlg
, DWL_USER
, INVALID_FILE_SIZE
);
229 // get currently selected media type
231 media_type
= (VFD_MEDIA
)(SendDlgItemMessage(
232 hDlg
, IDC_MEDIATYPE
, CB_GETCURSEL
, 0, 0) + 1);
234 // clear hint and description text
236 SetDlgItemText(hDlg
, IDC_IMAGEFILE_DESC
, NULL
);
237 SetDlgItemText(hDlg
, IDC_IMAGEFILE_HINT
, NULL
);
239 // get file name and file information
241 if (GetWindowText(hEdit
, buf
, sizeof(buf
))) {
243 ret
= VfdCheckImageFile(
244 buf
, &file_attr
, &file_type
, &image_size
);
246 if (ret
== ERROR_SUCCESS
) {
248 // use media type from image size
250 media_type
= VfdLookupMedia(image_size
);
252 else if (ret
== ERROR_FILE_NOT_FOUND
) {
255 // use the parent directory attributes
259 if ((p
= strrchr(buf
, '\\')) != NULL
) {
263 file_attr
= GetFileAttributes(buf
);
265 if (file_attr
== INVALID_FILE_ATTRIBUTES
) {
266 // directory access error
267 EnableWindow(GetDlgItem(hDlg
, IDOK
), FALSE
);
268 SetDlgItemText(hDlg
, IDC_IMAGEFILE_DESC
, SystemMessage(ret
));
272 file_attr
&= ~(FILE_ATTRIBUTE_READONLY
| FILE_ATTRIBUTE_DIRECTORY
);
273 image_size
= INVALID_FILE_SIZE
;
274 file_type
= VFD_FILETYPE_RAW
;
278 EnableWindow(GetDlgItem(hDlg
, IDOK
), FALSE
);
279 SetDlgItemText(hDlg
, IDC_IMAGEFILE_DESC
, SystemMessage(ret
));
283 // make file description text
285 VfdMakeFileDesc(buf
, sizeof(buf
),
286 file_type
, image_size
, file_attr
);
288 // set file description
290 SetDlgItemText(hDlg
, IDC_IMAGEFILE_DESC
, buf
);
294 // filename is empty - RAM disk
297 image_size
= INVALID_FILE_SIZE
;
298 file_type
= VFD_FILETYPE_NONE
;
300 SetDlgItemText(hDlg
, IDC_IMAGEFILE_DESC
, "RAM");
303 // store the image size
305 SetWindowLong(hDlg
, DWL_USER
, image_size
);
307 // setup disktype controls
309 if (file_type
!= VFD_FILETYPE_RAW
||
310 (file_attr
& (FILE_ATTRIBUTE_READONLY
| FILE_ATTRIBUTE_COMPRESSED
| FILE_ATTRIBUTE_ENCRYPTED
))) {
312 // file cannot be opened directly -- RAM mode is forced
314 CheckRadioButton(hDlg
, IDC_DISKTYPE_FILE
,
315 IDC_DISKTYPE_RAM
, IDC_DISKTYPE_RAM
);
317 EnableWindow(GetDlgItem(hDlg
, IDC_DISKTYPE_FILE
), FALSE
);
320 EnableWindow(GetDlgItem(hDlg
, IDC_DISKTYPE_FILE
), TRUE
);
323 // set OK button text
325 if (image_size
== INVALID_FILE_SIZE
) {
326 // file does not exist - OK button is "Create"
328 SetControlText(hDlg
, IDOK
, MSG_CREATE_BUTTON
);
331 // file exists - OK button is "Open"
333 SetControlText(hDlg
, IDOK
, MSG_OPEN_BUTTON
);
338 SendDlgItemMessage(hDlg
, IDC_MEDIATYPE
,
339 CB_SETCURSEL
, media_type
- 1, 0);
341 OnMediaType(hDlg
, GetDlgItem(hDlg
, IDC_MEDIATYPE
));
345 // Show open file dialog box
357 // prepare title and filter text
359 title
= ModuleMessage(MSG_OPEN_TITLE
);
361 filter
= ModuleMessage(MSG_OPEN_FILTER
);
374 // get current file name from the control
376 ZeroMemory(file
, sizeof(file
));
377 ZeroMemory(dir
, sizeof(dir
));
379 len
= GetDlgItemText(hDlg
, IDC_IMAGEFILE
, file
, sizeof(file
));
381 if (len
&& file
[len
- 1] == '\\') {
383 ZeroMemory(file
, sizeof(file
));
386 // prepare OPENFILENAME structure
388 ZeroMemory(&ofn
, sizeof(ofn
));
390 ofn
.lStructSize
= IS_WINDOWS_NT() ?
391 OPENFILENAME_SIZE_VERSION_400
: sizeof(ofn
);
393 ofn
.hwndOwner
= hDlg
;
394 ofn
.lpstrFilter
= filter
? filter
: FALLBACK_IMAGE_FILTER
;
395 ofn
.lpstrFile
= file
;
396 ofn
.nMaxFile
= sizeof(file
);
397 ofn
.lpstrInitialDir
= dir
;
398 ofn
.lpstrTitle
= title
? title
: FALLBACK_IMAGE_TITLE
;
399 ofn
.Flags
= OFN_ENABLESIZING
| OFN_HIDEREADONLY
| OFN_PATHMUSTEXIST
;
401 // show the open file dialog box
403 if (GetOpenFileName(&ofn
)) {
404 SetDlgItemText(hDlg
, IDC_IMAGEFILE
, file
);
405 SetFocus(GetDlgItem(hDlg
, IDC_IMAGEFILE
));
408 // release text buffers
420 // Disk type is changed
426 UNREFERENCED_PARAMETER(hDlg
);
427 UNREFERENCED_PARAMETER(hRadio
);
431 // Media type is changed
437 VFD_MEDIA media_type
;
441 image_size
= GetWindowLong(hDlg
, DWL_USER
);
443 if (image_size
== INVALID_FILE_SIZE
) {
447 media_type
= (VFD_MEDIA
)(SendMessage(
448 hCombo
, CB_GETCURSEL
, 0, 0) + 1);
450 if (media_type
== 0) {
454 media_size
= VfdGetMediaSize(media_type
);
456 if (media_size
> image_size
) {
457 // selected media is too large
458 SetControlText(hDlg
, IDC_IMAGEFILE_HINT
, MSG_FILE_TOO_SMALL
);
459 EnableWindow(GetDlgItem(hDlg
, IDOK
), FALSE
);
462 else if (media_size
< image_size
) {
463 SetControlText(hDlg
, IDC_IMAGEFILE_HINT
, MSG_SIZE_MISMATCH
);
466 SetDlgItemText(hDlg
, IDC_IMAGEFILE_HINT
, NULL
);
469 EnableWindow(GetDlgItem(hDlg
, IDOK
), TRUE
);
473 // Write Protect check box is clicked
479 UNREFERENCED_PARAMETER(hDlg
);
480 UNREFERENCED_PARAMETER(hCheck
);
484 // Create / open an image
489 CHAR file_name
[MAX_PATH
];
490 VFD_DISKTYPE disk_type
;
491 VFD_MEDIA media_type
;
492 VFD_FLAGS image_flags
;
498 if (IsDlgButtonChecked(hDlg
, IDC_DISKTYPE_FILE
) == BST_CHECKED
) {
499 disk_type
= VFD_DISKTYPE_FILE
;
502 disk_type
= VFD_DISKTYPE_RAM
;
505 // get the media type
507 media_type
= (VFD_MEDIA
)(SendDlgItemMessage(
508 hDlg
, IDC_MEDIATYPE
, CB_GETCURSEL
, 0, 0) + 1);
510 // get the protect flag
512 if (IsDlgButtonChecked(hDlg
, IDC_OPEN_PROTECTED
) == BST_CHECKED
) {
513 image_flags
= VFD_FLAG_WRITE_PROTECTED
;
519 // get the image name to create
521 if (GetDlgItemText(hDlg
, IDC_IMAGEFILE
, file_name
, sizeof(file_name
))) {
525 if (GetWindowLong(hDlg
, DWL_USER
) == INVALID_FILE_SIZE
) {
527 // create a new image
529 ret
= VfdCreateImageFile(
530 file_name
, media_type
, VFD_FILETYPE_RAW
, FALSE
);
532 if (ret
!= ERROR_SUCCESS
) {
540 hDevice
= VfdOpenDevice(GetWindowLong(hDlg
, GWL_USERDATA
));
542 if (hDevice
== INVALID_HANDLE_VALUE
) {
543 ret
= GetLastError();
548 hDevice
, file_name
, disk_type
, media_type
, image_flags
);
550 CloseHandle(hDevice
);
553 if (ret
!= ERROR_SUCCESS
) {
555 // show error message
557 MessageBox(hDlg
, SystemMessage(ret
),
558 VFD_MSGBOX_TITLE
, MB_ICONSTOP
);