OSDN Git Service

Modify documents.
[ffftp/ffftp.git] / bookmark.c
1 /*=============================================================================\r
2 *\r
3 *                                                               ブックマーク\r
4 *\r
5 ===============================================================================\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
7 /\r
8 / Redistribution and use in source and binary forms, with or without \r
9 / modification, are permitted provided that the following conditions \r
10 / are met:\r
11 /\r
12 /  1. Redistributions of source code must retain the above copyright \r
13 /     notice, this list of conditions and the following disclaimer.\r
14 /  2. Redistributions in binary form must reproduce the above copyright \r
15 /     notice, this list of conditions and the following disclaimer in the \r
16 /     documentation and/or other materials provided with the distribution.\r
17 /\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR \r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES \r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, \r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
28 /============================================================================*/\r
29 \r
30 // UTF-8対応\r
31 //#define WINVER 0x400\r
32 \r
33 #define STRICT\r
34 // IPv6対応\r
35 #include <winsock2.h>\r
36 #include <windows.h>\r
37 #include <stdio.h>\r
38 #include <stdlib.h>\r
39 #include <string.h>\r
40 #include <mbstring.h>\r
41 #include <malloc.h>\r
42 #include <windowsx.h>\r
43 #include <commctrl.h>\r
44 \r
45 #include "common.h"\r
46 #include "resource.h"\r
47 \r
48 #include <htmlhelp.h>\r
49 #include "helpid.h"\r
50 \r
51 // UTF-8対応\r
52 #undef __MBSWRAPPER_H__\r
53 #include "mbswrapper.h"\r
54 \r
55 \r
56 /*===== プロトタイプ =====*/\r
57 \r
58 static int AddBookMark(char *Path);\r
59 static int GetBothPath(char *Str, char **Path1, char **Path2);\r
60 // 64ビット対応\r
61 //static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
62 //static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
63 static INT_PTR CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
64 static INT_PTR CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
65 \r
66 /*===== 外部参照 =====*/\r
67 \r
68 extern HWND hHelpWin;\r
69 \r
70 /* 設定値 */\r
71 extern HFONT ListFont;          /* リストボックスのフォント */\r
72 extern SIZE BmarkDlgSize;\r
73 \r
74 \r
75 \r
76 /*----- ブックマークをクリアする ----------------------------------------------\r
77 *\r
78 *       Parameter\r
79 *               なし\r
80 *\r
81 *       Return Value\r
82 *               なし\r
83 *----------------------------------------------------------------------------*/\r
84 \r
85 void ClearBookMark(void)\r
86 {\r
87         HMENU hMenu;\r
88 \r
89         hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);\r
90         while(GetMenuItemCount(hMenu) > DEFAULT_BMARK_ITEM)\r
91                 DeleteMenu(hMenu, DEFAULT_BMARK_ITEM, MF_BYPOSITION);\r
92         return;\r
93 }\r
94 \r
95 \r
96 /*----- カレントディレクトリをブックマークに追加 ------------------------------\r
97 *\r
98 *       Parameter\r
99 *               int Win : ウインドウ番号 (WIN_xxx)\r
100 *\r
101 *       Return Value\r
102 *               なし\r
103 *----------------------------------------------------------------------------*/\r
104 \r
105 void AddCurDirToBookMark(int Win)\r
106 {\r
107         char Buf[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];\r
108 \r
109         if(Win == WIN_LOCAL)\r
110         {\r
111                 strcpy(Buf, BMARK_MARK_LOCAL);\r
112                 AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);\r
113         }\r
114         else if(Win == WIN_REMOTE)\r
115         {\r
116                 strcpy(Buf, BMARK_MARK_REMOTE);\r
117                 AskRemoteCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);\r
118         }\r
119         else\r
120         {\r
121                 strcpy(Buf, BMARK_MARK_BOTH);\r
122                 AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);\r
123                 strcat(Buf, BMARK_SEP);\r
124                 AskRemoteCurDir(Buf + strlen(Buf), FMAX_PATH);\r
125         }\r
126         AddBookMark(Buf);\r
127         return;\r
128 }\r
129 \r
130 \r
131 /*----- ブックマークにパスを登録する ------------------------------------------\r
132 *\r
133 *       Parameter\r
134 *               char *Path : パス名\r
135 *\r
136 *       Return Value\r
137 *               int ステータス\r
138 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
139 *----------------------------------------------------------------------------*/\r
140 \r
141 static int AddBookMark(char *Path)\r
142 {\r
143         HMENU hMenu;\r
144         int MarkID;\r
145         int Sts;\r
146 \r
147         Sts = FFFTP_FAIL;\r
148         hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);\r
149         MarkID = (GetMenuItemCount(hMenu) - DEFAULT_BMARK_ITEM) + MENU_BMARK_TOP;\r
150         if(AppendMenu(hMenu, MF_STRING, MarkID, Path) == TRUE)\r
151                 Sts = FFFTP_SUCCESS;\r
152         return(Sts);\r
153 }\r
154 \r
155 \r
156 /*----- 指定のIDを持つブックマークのパスを返す --------------------------------\r
157 *\r
158 *       Parameter\r
159 *               int MarkID : ID\r
160 *               char *Local : ローカル側のパスを返すバッファ\r
161 *               char *Remote : リモート側のパスを返すバッファ\r
162 *               int Max : バッファのサイズ\r
163 *\r
164 *       Return Value\r
165 *               int ステータス (BMARK_TYPE_xxx)\r
166 *----------------------------------------------------------------------------*/\r
167 \r
168 int AskBookMarkText(int MarkID, char *Local, char *Remote, int Max)\r
169 {\r
170         HMENU hMenu;\r
171         MENUITEMINFO mInfo;\r
172         int Sts;\r
173         char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];\r
174         char *Path1;\r
175         char *Path2;\r
176         int Num;\r
177 \r
178         memset(Local, NUL, Max);\r
179         memset(Remote, NUL, Max);\r
180 \r
181         Sts = BMARK_TYPE_NONE;\r
182         hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);\r
183 \r
184         mInfo.cbSize = sizeof(MENUITEMINFO);\r
185         mInfo.fMask = MIIM_TYPE;\r
186         mInfo.dwTypeData = Tmp;\r
187         mInfo.cch = BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN;\r
188         if(GetMenuItemInfo(hMenu, MarkID, FALSE, &mInfo) == TRUE)\r
189         {\r
190                 Num = GetBothPath(Tmp, &Path1, &Path2);\r
191                 if(strncmp(Tmp, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0)\r
192                 {\r
193                         Sts = BMARK_TYPE_LOCAL;\r
194                         strncpy(Local, Path1, Max-1);\r
195                 }\r
196                 else if(strncmp(Tmp, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0)\r
197                 {\r
198                         Sts = BMARK_TYPE_REMOTE;\r
199                         strncpy(Remote, Path1, Max-1);\r
200                 }\r
201                 else if(strncmp(Tmp, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0)\r
202                 {\r
203                         if(Num == 2)\r
204                         {\r
205                                 strncpy(Local, Path1, Max-1);\r
206                                 strncpy(Remote, Path2, Max-1);\r
207                                 Sts = BMARK_TYPE_BOTH;\r
208                         }\r
209                 }\r
210         }\r
211         return(Sts);\r
212 }\r
213 \r
214 \r
215 /*----- ブックマークの文字列から2つのパスを取り出す --------------------------\r
216 *\r
217 *       Parameter\r
218 *               char *Str : 文字列\r
219 *               char **Local : ローカル側のパスの先頭を返すワーク\r
220 *               char **Remote : リモート側のパスの先頭を返すワーク\r
221 *\r
222 *       Return Value\r
223 *               int パスの個数 (1 or 2)\r
224 *\r
225 *       Note\r
226 *               Strの内容を書き換える\r
227 *----------------------------------------------------------------------------*/\r
228 \r
229 static int GetBothPath(char *Str, char **Path1, char **Path2)\r
230 {\r
231         char *Pos;\r
232         int Ret;\r
233 \r
234         Ret = 1;\r
235         *Path1 = Str + BMARK_MARK_LEN;\r
236 \r
237         Pos = _mbsstr(Str, BMARK_SEP);\r
238         if(Pos != NULL)\r
239         {\r
240                 Ret = 2;\r
241                 *Pos = NUL;\r
242                 *Path2 = Pos + BMARK_SEP_LEN;\r
243         }\r
244         return(Ret);\r
245 }\r
246 \r
247 \r
248 /*----- ブックマークを接続中のホストリストに保存する --------------------------\r
249 *\r
250 *       Parameter\r
251 *               なし\r
252 *\r
253 *       Return Value\r
254 *               なし\r
255 *----------------------------------------------------------------------------*/\r
256 \r
257 void SaveBookMark(void)\r
258 {\r
259         HMENU hMenu;\r
260         MENUITEMINFO mInfo;\r
261         int i;\r
262         int Cnt;\r
263         char *Buf;\r
264         char *Pos;\r
265         int Len;\r
266         char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];\r
267         int CurHost;\r
268 \r
269         if(AskConnecting() == YES)\r
270         {\r
271                 if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY)\r
272                 {\r
273                         if((Buf = malloc(BOOKMARK_SIZE)) != NULL)\r
274                         {\r
275                                 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);\r
276 \r
277                                 Pos = Buf;\r
278                                 Len = 0;\r
279                                 Cnt = GetMenuItemCount(hMenu);\r
280                                 for(i = DEFAULT_BMARK_ITEM; i < Cnt; i++)\r
281                                 {\r
282                                         mInfo.cbSize = sizeof(MENUITEMINFO);\r
283                                         mInfo.fMask = MIIM_TYPE;\r
284                                         mInfo.dwTypeData = Tmp;\r
285                                         mInfo.cch = FMAX_PATH;\r
286                                         if(GetMenuItemInfo(hMenu, i, TRUE, &mInfo) == TRUE)\r
287                                         {\r
288                                                 if(Len + strlen(Tmp) + 2 <= BOOKMARK_SIZE)\r
289                                                 {\r
290                                                         strcpy(Pos, Tmp);\r
291                                                         Pos += strlen(Tmp) + 1;\r
292                                                         Len += strlen(Tmp) + 1;\r
293                                                 }\r
294                                         }\r
295                                 }\r
296 \r
297                                 if(Pos == Buf)\r
298                                 {\r
299                                         memset(Buf, NUL, 2);\r
300                                         Len = 2;\r
301                                 }\r
302                                 else\r
303                                 {\r
304                                         *Pos = NUL;\r
305                                         Len++;\r
306                                 }\r
307 \r
308                                 SetHostBookMark(CurHost, Buf, Len);\r
309 \r
310                                 free(Buf);\r
311                         }\r
312                 }\r
313         }\r
314         return;\r
315 }\r
316 \r
317 \r
318 /*----- ホストリストからブックマークを読み込む --------------------------------\r
319 *\r
320 *       Parameter\r
321 *               なし\r
322 *\r
323 *       Return Value\r
324 *               なし\r
325 *----------------------------------------------------------------------------*/\r
326 \r
327 void LoadBookMark(void)\r
328 {\r
329         char *Buf;\r
330         char *Pos;\r
331         int CurHost;\r
332         char Tmp[FMAX_PATH + BMARK_MARK_LEN + 1];\r
333 \r
334         if(AskConnecting() == YES)\r
335         {\r
336                 if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY)\r
337                 {\r
338                         if((Buf = AskHostBookMark(CurHost)) != NULL)\r
339                         {\r
340                                 ClearBookMark();\r
341                                 Pos = Buf;\r
342                                 while(*Pos != NUL)\r
343                                 {\r
344                                         /* 旧フォーマットのための処理 */\r
345                                         /* (パスに"L"や"H"がついてない物) */\r
346                                         if((strncmp(Pos, BMARK_MARK_LOCAL, BMARK_MARK_LEN) != 0) &&\r
347                                            (strncmp(Pos, BMARK_MARK_REMOTE, BMARK_MARK_LEN) != 0) &&\r
348                                            (strncmp(Pos, BMARK_MARK_BOTH, BMARK_MARK_LEN) != 0))\r
349                                         {\r
350                                                 strcpy(Tmp, BMARK_MARK_REMOTE);\r
351                                                 strcat(Tmp, Pos);\r
352                                                 AddBookMark(Tmp);\r
353                                         }\r
354                                         else\r
355                                                 AddBookMark(Pos);\r
356 \r
357                                         Pos += strlen(Pos) + 1;\r
358                                 }\r
359                         }\r
360                 }\r
361         }\r
362         return;\r
363 }\r
364 \r
365 \r
366 /*----- ブックマーク編集ウインドウ --------------------------------------------\r
367 *\r
368 *       Parameter\r
369 *               なし\r
370 *\r
371 *       Return Value\r
372 *               ステータス (YES=実行/NO=取消)\r
373 *----------------------------------------------------------------------------*/\r
374 \r
375 int EditBookMark(void)\r
376 {\r
377         int Sts;\r
378 \r
379         Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(bmark_dlg), GetMainHwnd(), EditBookMarkProc);\r
380         return(Sts);\r
381 }\r
382 \r
383 \r
384 /*----- ブックマーク編集ウインドウのコールバック ------------------------------\r
385 *\r
386 *       Parameter\r
387 *               HWND hDlg : ウインドウハンドル\r
388 *               UINT message : メッセージ番号\r
389 *               WPARAM wParam : メッセージの WPARAM 引数\r
390 *               LPARAM lParam : メッセージの LPARAM 引数\r
391 *\r
392 *       Return Value\r
393 *               BOOL TRUE/FALSE\r
394 *----------------------------------------------------------------------------*/\r
395 \r
396 // 64ビット対応\r
397 //static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
398 static INT_PTR CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
399 {\r
400         HMENU hMenu;\r
401         MENUITEMINFO mInfo;\r
402         int Cur;\r
403         int Max;\r
404         char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];\r
405         // バグ修正\r
406         RECT Rect;\r
407 \r
408         static DIALOGSIZE DlgSize = {\r
409                 { BMARK_NEW, BMARK_SET, BMARK_DEL, BMARK_DOWN, BMARK_UP, IDHELP, BMARK_SIZEGRIP, -1 },\r
410                 { IDOK, BMARK_JUMP, BMARK_SIZEGRIP, -1 },\r
411                 { BMARK_LIST, -1 },\r
412                 { 0, 0 },\r
413                 { 0, 0 }\r
414         };\r
415 \r
416         switch (message)\r
417         {\r
418                 // バグ修正\r
419                 case WM_SIZE :\r
420                         GetWindowRect(hDlg, &Rect);\r
421                         DlgSizeChange(hDlg, &DlgSize, &Rect, 0);\r
422                         RedrawWindow(hDlg, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN);\r
423                     break;\r
424 \r
425                 case WM_INITDIALOG :\r
426                         if(ListFont != NULL)\r
427                                 SendDlgItemMessage(hDlg, BMARK_LIST, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));\r
428 \r
429                         hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);\r
430                         Max = GetMenuItemCount(hMenu);\r
431                         for(Cur = DEFAULT_BMARK_ITEM; Cur < Max; Cur++)\r
432                         {\r
433                                 mInfo.cbSize = sizeof(MENUITEMINFO);\r
434                                 mInfo.fMask = MIIM_TYPE;\r
435                                 mInfo.dwTypeData = Tmp;\r
436                                 mInfo.cch = FMAX_PATH;\r
437                                 if(GetMenuItemInfo(hMenu, Cur, TRUE, &mInfo) == TRUE)\r
438                                         SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);\r
439                         }\r
440                         DlgSizeInit(hDlg, &DlgSize, &BmarkDlgSize);\r
441                     return(TRUE);\r
442 \r
443                 case WM_COMMAND :\r
444                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
445                         {\r
446                                 case BMARK_JUMP :\r
447                                         if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)\r
448                                                 PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(Cur+MENU_BMARK_TOP, 0), 0);\r
449                                         /* ここに break はない */\r
450 \r
451                                 case IDCANCEL :\r
452                                 case IDOK :\r
453                                         ClearBookMark();\r
454                                         Max = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0);\r
455                                         for(Cur = 0; Cur < Max; Cur++)\r
456                                         {\r
457                                                 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);\r
458                                                 AddBookMark(Tmp);\r
459                                         }\r
460                                         AskDlgSize(hDlg, &DlgSize, &BmarkDlgSize);\r
461                                         EndDialog(hDlg, YES);\r
462                                         break;\r
463 \r
464                                 case BMARK_SET :\r
465                                         if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)\r
466                                         {\r
467                                                 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);\r
468                                                 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES)\r
469                                                 {\r
470                                                         SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);\r
471                                                         SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, Cur, (LPARAM)Tmp);\r
472                                                         SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);\r
473                                                 }\r
474                                         }\r
475                                         break;\r
476 \r
477                                 case BMARK_NEW :\r
478                                         strcpy(Tmp, "");\r
479                                         if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES)\r
480                                         {\r
481                                                 SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);\r
482                                                 Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) - 1;\r
483                                                 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);\r
484                                         }\r
485                                         break;\r
486 \r
487                                 case BMARK_DEL :\r
488                                         if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)\r
489                                         {\r
490                                                 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);\r
491                                                 if(Cur >= SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0))\r
492                                                         Cur = max1(0, SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1);\r
493                                                 if(SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) > 0)\r
494                                                         SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);\r
495                                         }\r
496                                         break;\r
497 \r
498                                 case BMARK_UP :\r
499                                         if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)\r
500                                         {\r
501                                                 if(Cur > 0)\r
502                                                 {\r
503                                                         SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);\r
504                                                         SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);\r
505                                                         SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, --Cur, (LPARAM)Tmp);\r
506                                                         SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);\r
507                                                 }\r
508                                         }\r
509                                         break;\r
510 \r
511                                 case BMARK_DOWN :\r
512                                         if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)\r
513                                         {\r
514                                                 if(Cur < SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1)\r
515                                                 {\r
516                                                         SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);\r
517                                                         SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);\r
518                                                         SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, ++Cur, (LPARAM)Tmp);\r
519                                                         SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);\r
520                                                 }\r
521                                         }\r
522                                         break;\r
523 \r
524                                 case IDHELP :\r
525                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000019);\r
526                                         break;\r
527                         }\r
528                         return(TRUE);\r
529 \r
530                 case WM_SIZING :\r
531                         DlgSizeChange(hDlg, &DlgSize, (RECT *)lParam, (int)wParam);\r
532                     return(TRUE);\r
533 \r
534         }\r
535     return(FALSE);\r
536 }\r
537 \r
538 \r
539 /*----- ブックマーク入力ダイアログのコールバック ------------------------------\r
540 *\r
541 *       Parameter\r
542 *               HWND hDlg : ウインドウハンドル\r
543 *               UINT message : メッセージ番号\r
544 *               WPARAM wParam : メッセージの WPARAM 引数\r
545 *               LPARAM lParam : メッセージの LPARAM 引数\r
546 *\r
547 *       Return Value\r
548 *               BOOL TRUE/FALSE\r
549 *----------------------------------------------------------------------------*/\r
550 \r
551 // 64ビット対応\r
552 //static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
553 static INT_PTR CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
554 {\r
555         static char *Str;\r
556         char *Path1;\r
557         char *Path2;\r
558         char Local[FMAX_PATH+1];\r
559         char Remote[FMAX_PATH+1];\r
560         int Num;\r
561 \r
562         switch (iMessage)\r
563         {\r
564                 case WM_INITDIALOG :\r
565                         Str = (char *)lParam;\r
566                         SendDlgItemMessage(hDlg, BEDIT_LOCAL, EM_LIMITTEXT, FMAX_PATH-1, 0);\r
567                         SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_LIMITTEXT, FMAX_PATH-1, 0);\r
568                         if(strlen(Str) > BMARK_MARK_LEN)\r
569                         {\r
570                                 Num = GetBothPath(Str, &Path1, &Path2);\r
571                                 if(strncmp(Str, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0)\r
572                                         SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1);\r
573                                 else if(strncmp(Str, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0)\r
574                                 {\r
575                                         SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path1);\r
576                                         /* ホスト側にカーソルを移動しておく */\r
577                                         SetFocus(GetDlgItem(hDlg, BEDIT_REMOTE));\r
578                                         SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_SETSEL, 0, -1);\r
579                                         return(FALSE);\r
580                                 }\r
581                                 else if((strncmp(Str, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0) && (Num == 2))\r
582                                 {\r
583                                         SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1);\r
584                                         SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path2);\r
585                                 }\r
586                         }\r
587                         return(TRUE);\r
588 \r
589                 case WM_COMMAND :\r
590                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
591                         {\r
592                                 case IDOK :\r
593                                         SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Local);\r
594                                         SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Remote);\r
595                                         if(strlen(Local) > 0)\r
596                                         {\r
597                                                 if(strlen(Remote) > 0)\r
598                                                 {\r
599                                                         /* 両方 */\r
600                                                         strcpy(Str, BMARK_MARK_BOTH);\r
601                                                         strcat(Str, Local);\r
602                                                         strcat(Str, BMARK_SEP);\r
603                                                         strcat(Str, Remote);\r
604                                                 }\r
605                                                 else\r
606                                                 {\r
607                                                         /* ローカルのみ */\r
608                                                         strcpy(Str, BMARK_MARK_LOCAL);\r
609                                                         strcat(Str, Local);\r
610                                                 }\r
611                                                 EndDialog(hDlg, YES);\r
612                                         }\r
613                                         else if(strlen(Remote) > 0)\r
614                                         {\r
615                                                 /* ホストのみ */\r
616                                                 strcpy(Str, BMARK_MARK_REMOTE);\r
617                                                 strcat(Str, Remote);\r
618                                                 EndDialog(hDlg, YES);\r
619                                         }\r
620                                         else\r
621                                                 EndDialog(hDlg, NO);\r
622                                         break;\r
623 \r
624                                 case IDCANCEL :\r
625                                         EndDialog(hDlg, NO);\r
626                                         break;\r
627                         }\r
628             return(TRUE);\r
629         }\r
630         return(FALSE);\r
631 }\r
632 \r
633 \r