Mercurial > hg > xemacs-beta
comparison src/dialog-msw.c @ 673:685b588e92d8
[xemacs-hg @ 2001-10-30 05:13:26 by andyp]
merge of windows 21.4.5 codeline
author | andyp |
---|---|
date | Tue, 30 Oct 2001 05:13:31 +0000 |
parents | fdefd0186b75 |
children | a307f9a2021d |
comparison
equal
deleted
inserted
replaced
672:42a8626b741e | 673:685b588e92d8 |
---|---|
330 { FNERR_INVALIDFILENAME, "FNERR_INVALIDFILENAME" }, | 330 { FNERR_INVALIDFILENAME, "FNERR_INVALIDFILENAME" }, |
331 { FNERR_SUBCLASSFAILURE, "FNERR_SUBCLASSFAILURE" }, | 331 { FNERR_SUBCLASSFAILURE, "FNERR_SUBCLASSFAILURE" }, |
332 { FRERR_BUFFERLENGTHZERO, "FRERR_BUFFERLENGTHZERO" }, | 332 { FRERR_BUFFERLENGTHZERO, "FRERR_BUFFERLENGTHZERO" }, |
333 }; | 333 }; |
334 | 334 |
335 struct param_data { | |
336 char* fname; | |
337 char* unknown_fname; | |
338 int validate; | |
339 }; | |
340 | |
341 static int | |
342 CALLBACK handle_directory_proc (HWND hwnd, UINT msg, | |
343 LPARAM lParam, LPARAM lpData) | |
344 { | |
345 TCHAR szDir[MAX_PATH]; | |
346 struct param_data* pd = (struct param_data*)lpData; | |
347 | |
348 switch(msg) { | |
349 case BFFM_INITIALIZED: | |
350 // WParam is TRUE since you are passing a path. | |
351 // It would be FALSE if you were passing a pidl. | |
352 SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)pd->fname); | |
353 break; | |
354 | |
355 case BFFM_SELCHANGED: | |
356 // Set the status window to the currently selected path. | |
357 if (SHGetPathFromIDList((LPITEMIDLIST) lParam, szDir)) { | |
358 SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)szDir); | |
359 } | |
360 break; | |
361 | |
362 case BFFM_VALIDATEFAILED: | |
363 if (pd->validate) | |
364 return TRUE; | |
365 else | |
366 pd->unknown_fname = xstrdup((char*)lParam); | |
367 break; | |
368 | |
369 default: | |
370 break; | |
371 } | |
372 return 0; | |
373 } | |
374 | |
375 static Lisp_Object | |
376 handle_directory_dialog_box (struct frame *f, Lisp_Object keys) | |
377 { | |
378 Lisp_Object ret = Qnil; | |
379 BROWSEINFO bi; | |
380 LPITEMIDLIST pidl; | |
381 LPMALLOC pMalloc; | |
382 struct param_data pd; | |
383 | |
384 xzero(pd); | |
385 xzero(bi); | |
386 | |
387 bi.lParam = (LPARAM)&pd; | |
388 bi.hwndOwner = FRAME_MSWINDOWS_HANDLE (f); | |
389 bi.pszDisplayName = 0; | |
390 bi.pidlRoot = 0; | |
391 bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT | BIF_EDITBOX; | |
392 bi.lpfn = handle_directory_proc; | |
393 | |
394 LOCAL_FILE_FORMAT_TO_TSTR (Fexpand_file_name (build_string (""), Qnil), | |
395 (char*)pd.fname); | |
396 | |
397 { | |
398 EXTERNAL_PROPERTY_LIST_LOOP_3 (key, value, keys) | |
399 { | |
400 if (EQ (key, Q_title)) | |
401 { | |
402 CHECK_STRING (value); | |
403 LISP_STRING_TO_EXTERNAL (value, bi.lpszTitle, Qmswindows_tstr); | |
404 } | |
405 else if (EQ (key, Q_initial_directory)) | |
406 LOCAL_FILE_FORMAT_TO_TSTR (Fexpand_file_name (value, Qnil), | |
407 pd.fname); | |
408 else if (EQ (key, Q_initial_filename)) | |
409 ; /* do nothing */ | |
410 else if (EQ (key, Q_file_must_exist)) | |
411 { | |
412 if (!NILP (value)) { | |
413 pd.validate = TRUE; | |
414 bi.ulFlags |= BIF_VALIDATE; | |
415 } | |
416 else | |
417 bi.ulFlags &= ~BIF_VALIDATE; | |
418 } | |
419 else | |
420 invalid_constant ("Unrecognized directory-dialog keyword", key); | |
421 } | |
422 } | |
423 | |
424 if (SHGetMalloc(&pMalloc) == NOERROR) | |
425 { | |
426 pidl = SHBrowseForFolder(&bi); | |
427 if (pidl) { | |
428 TCHAR* szDir = alloca (MAX_PATH); | |
429 | |
430 if (SHGetPathFromIDList(pidl, szDir)) { | |
431 ret = tstr_to_local_file_format (szDir); | |
432 } | |
433 | |
434 pMalloc->lpVtbl->Free(pMalloc, pidl); | |
435 pMalloc->lpVtbl->Release(pMalloc); | |
436 return ret; | |
437 } | |
438 else if (pd.unknown_fname != 0) { | |
439 ret = tstr_to_local_file_format (pd.unknown_fname); | |
440 xfree(pd.unknown_fname); | |
441 } | |
442 | |
443 } | |
444 else | |
445 signal_error (Qdialog_box_error, | |
446 "Unable to create folder browser", | |
447 make_int (0)); | |
448 return ret; | |
449 } | |
450 | |
335 static Lisp_Object | 451 static Lisp_Object |
336 handle_file_dialog_box (struct frame *f, Lisp_Object keys) | 452 handle_file_dialog_box (struct frame *f, Lisp_Object keys) |
337 { | 453 { |
338 OPENFILENAME ofn; | 454 OPENFILENAME ofn; |
455 | |
339 char fnbuf[8000]; | 456 char fnbuf[8000]; |
340 | 457 |
341 xzero (ofn); | 458 xzero (ofn); |
342 ofn.lStructSize = sizeof (ofn); | 459 ofn.lStructSize = sizeof (ofn); |
460 ofn.Flags = OFN_EXPLORER; | |
343 ofn.hwndOwner = FRAME_MSWINDOWS_HANDLE (f); | 461 ofn.hwndOwner = FRAME_MSWINDOWS_HANDLE (f); |
344 ofn.lpstrFile = fnbuf; | 462 ofn.lpstrFile = fnbuf; |
345 ofn.nMaxFile = sizeof (fnbuf) / XETCHAR_SIZE; | 463 ofn.nMaxFile = sizeof (fnbuf) / XETCHAR_SIZE; |
346 xetcscpy (fnbuf, XETEXT ("")); | 464 xetcscpy (fnbuf, XETEXT ("")); |
347 | 465 |
674 mswindows_make_dialog_box_internal (struct frame* f, Lisp_Object type, | 792 mswindows_make_dialog_box_internal (struct frame* f, Lisp_Object type, |
675 Lisp_Object keys) | 793 Lisp_Object keys) |
676 { | 794 { |
677 if (EQ (type, Qfile)) | 795 if (EQ (type, Qfile)) |
678 return handle_file_dialog_box (f, keys); | 796 return handle_file_dialog_box (f, keys); |
797 else if (EQ (type, Qdirectory)) | |
798 return handle_directory_dialog_box (f, keys); | |
679 else if (EQ (type, Qquestion)) | 799 else if (EQ (type, Qquestion)) |
680 return handle_question_dialog_box (f, keys); | 800 return handle_question_dialog_box (f, keys); |
681 else if (EQ (type, Qprint)) | 801 else if (EQ (type, Qprint)) |
682 return mswindows_handle_print_dialog_box (f, keys); | 802 return mswindows_handle_print_dialog_box (f, keys); |
683 else if (EQ (type, Qpage_setup)) | 803 else if (EQ (type, Qpage_setup)) |