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))