[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:5062] メニューから Directory を開くときにダイアログが出ない



藤井です。

2ch で以下のような書き込みがありました。

381 @ Meadowについて語るスレ その4
> メニューから Open File を選ぶとファイルダイアログが出てくるけど、
> Open Directory を選ぶとミニバッファからの入力になる。

確かにやってみると、上記の通りです。NTEmacs (CVS HEAD)では両方ダイアロ
グが出てきます。

以前に mw32-file-dialog の修正によりファイルダイアログでディレクトリを
選択できるようなっていますが、default-filename がディレクトリだったら
ダイアログを開かずにミニバッファでディレクトリを入力させるという処理が
未だに残っているのが原因ではないでしょうか?

ファイルダイアログでディレクトリが開けるようになっている以上、この処理
は最早不要になっていると考えます。
ですので、削除した方が良いのではないでしょうか。

添付のパッチのように変更すると、メニューから `Open Directory...'
を選択してディレクトリを開くことができるようになりました。

なお、NTEmacs では、`Open Directory...' を選択したときも初期状態として
ファイルの種類として `All Files (*.*)' が選択されています。ディレクト
リを開くメニューを選択している以上、やはりダイログの初期状態では 
`Directory' が選ばれていて欲しいと思います。ですので、上記条件判定を削
除する他に default-directory がディレクトリと判定されたときには 
`Directory' が選択されるようにする処理を追加しています。このため 
file_dialog_callback() も変更しています。

以上ご報告まで

--- src/mw32fns.c.orig	2004-06-07 20:38:03.154625000 +0900
+++ src/mw32fns.c	2004-06-07 21:49:50.952875000 +0900
@@ -8951,7 +8951,8 @@
     {
       OFNOTIFY * notify = (OFNOTIFY *) lParam;
       /* Detect when the Filter dropdown is changed.  */
-      if (notify->hdr.code == CDN_TYPECHANGE)
+      if (notify->hdr.code == CDN_TYPECHANGE 
+	  || notify->hdr.code == CDN_INITDONE)
 	{
 	  HWND dialog = GetParent (hwnd);
 	  HWND edit_control = GetDlgItem (dialog, FILE_NAME_TEXT_FIELD);
@@ -8989,7 +8990,8 @@
   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
   LPTSTR init_dir;
   TCHAR filename[MAX_PATH + 1];
-  int use_dialog_p = 1;
+  int filter_index = 1;
+  OPENFILENAME file_details;
 
   GCPRO5 (prompt, dir, default_filename, mustmatch, file);
   CHECK_STRING (prompt, 0);
@@ -9015,66 +9017,56 @@
 	}
       else
 	{
-	  /* If default_file_name is a directory, don't use the open
-	     file dialog, as it does not support selecting
-	     directories. */
-	  use_dialog_p = 0;
+	  /* If default_file_name is a directory, filter for directory
+	     is selected. */
+	  filename[0] = '\0';
+	  filter_index = 2;	/* 2 means file is a directory */
 	}
     }
   else
     filename[0] = '\0';
 
-  if (use_dialog_p)
-    {
-      OPENFILENAME file_details;
-
-      /* Prevent redisplay.  */
-      specbind (Qinhibit_redisplay, Qt);
-      BLOCK_INPUT;
-
-      bzero (&file_details, sizeof (file_details));
-      file_details.lStructSize = sizeof (file_details);
-      file_details.hwndOwner = FRAME_MW32_WINDOW (f);
-      /* Undocumented Bug in Common File Dialog:
-         If a filter is not specified, shell links are not resolved.  */
-      file_details.lpstrFilter = "All Files (*.*)\0*.*\0Directories\0*|*\0\0";
-      file_details.lpstrFile = filename;
-      file_details.nMaxFile = sizeof (filename) / sizeof (filename[0]);
-      file_details.lpstrInitialDir = init_dir;
-      file_details.lpstrTitle
-	= mw32_encode_lispy_string (Vw32_system_coding_system,
-				    prompt, NULL);
-      file_details.Flags = (OFN_HIDEREADONLY | OFN_NOCHANGEDIR
-			    | OFN_EXPLORER | OFN_ENABLEHOOK);
+  /* Prevent redisplay.  */
+  specbind (Qinhibit_redisplay, Qt);
+  BLOCK_INPUT;
+
+  bzero (&file_details, sizeof (file_details));
+  file_details.lStructSize = sizeof (file_details);
+  file_details.hwndOwner = FRAME_MW32_WINDOW (f);
+  /* Undocumented Bug in Common File Dialog:
+     If a filter is not specified, shell links are not resolved.  */
+  file_details.lpstrFilter = "All Files (*.*)\0*.*\0Directories\0*|*\0\0";
+  file_details.nFilterIndex = filter_index;
+  file_details.lpstrFile = filename;
+  file_details.nMaxFile = sizeof (filename) / sizeof (filename[0]);
+  file_details.lpstrInitialDir = init_dir;
+  file_details.lpstrTitle
+    = mw32_encode_lispy_string (Vw32_system_coding_system,
+				prompt, NULL);
+  file_details.Flags = (OFN_HIDEREADONLY | OFN_NOCHANGEDIR
+			| OFN_EXPLORER | OFN_ENABLEHOOK);
 
-      if (!NILP (mustmatch))
-        file_details.Flags |= OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
+  if (!NILP (mustmatch))
+    file_details.Flags |= OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
 
-      file_details.lpfnHook = (LPOFNHOOKPROC) file_dialog_callback;
+  file_details.lpfnHook = (LPOFNHOOKPROC) file_dialog_callback;
 
-      if (GetOpenFileName (&file_details))
+  if (GetOpenFileName (&file_details))
+    {
+      file = mw32_decode_lispy_string (Vw32_system_coding_system,
+				       filename, 0);
+      file = Fdos_to_unix_filename (file);
+      if (file_details.nFilterIndex == 2)
 	{
-	  file = mw32_decode_lispy_string (Vw32_system_coding_system,
-					   filename, 0);
-          file = Fdos_to_unix_filename (file);
-          if (file_details.nFilterIndex == 2)
-            {
-	      /* "Folder Only" selected - strip dummy file name.  */
-	      file = Ffile_name_directory (file);
-            }
-        }
-      else
-	file = Qnil;
-
-      UNBLOCK_INPUT;
-      file = unbind_to (count, file);
+	  /* "Folder Only" selected - strip dummy file name.  */
+	  file = Ffile_name_directory (file);
+	}
     }
-  /* Open File dialog will not allow folders to be selected, so resort
-     to minibuffer completing reads for directories. */
   else
-    file = Fcompleting_read (prompt, intern ("read-file-name-internal"),
-                             dir, mustmatch, dir, Qfile_name_history,
-                             default_filename, Qnil);
+    file = Qnil;
+
+  UNBLOCK_INPUT;
+  file = unbind_to (count, file);
 
   UNGCPRO;
 


--
藤井 正行 / Masayuki FUJII ( boochang@xxxxxxxxxxxx )