OSDN Git Service

Move *.c and *.h files to src
[ffftp/ffftp.git] / src / bookmark.c
diff --git a/src/bookmark.c b/src/bookmark.c
new file mode 100644 (file)
index 0000000..3e89c4e
--- /dev/null
@@ -0,0 +1,633 @@
+/*=============================================================================\r
+*\r
+*                                                              ブックマーク\r
+*\r
+===============================================================================\r
+/ Copyright (C) 1997-2007 Sota. All rights reserved.\r
+/\r
+/ Redistribution and use in source and binary forms, with or without \r
+/ modification, are permitted provided that the following conditions \r
+/ are met:\r
+/\r
+/  1. Redistributions of source code must retain the above copyright \r
+/     notice, this list of conditions and the following disclaimer.\r
+/  2. Redistributions in binary form must reproduce the above copyright \r
+/     notice, this list of conditions and the following disclaimer in the \r
+/     documentation and/or other materials provided with the distribution.\r
+/\r
+/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR \r
+/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES \r
+/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
+/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, \r
+/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
+/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
+/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
+/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
+/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+/============================================================================*/\r
+\r
+// UTF-8対応\r
+//#define WINVER 0x400\r
+\r
+#define        STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <mbstring.h>\r
+#include <malloc.h>\r
+#include <windowsx.h>\r
+#include <commctrl.h>\r
+\r
+#include "common.h"\r
+#include "resource.h"\r
+\r
+#include <htmlhelp.h>\r
+#include "helpid.h"\r
+\r
+// UTF-8対応\r
+#undef __MBSWRAPPER_H__\r
+#include "mbswrapper.h"\r
+\r
+\r
+/*===== プロトタイプ =====*/\r
+\r
+static int AddBookMark(char *Path);\r
+static int GetBothPath(char *Str, char **Path1, char **Path2);\r
+// 64ビット対応\r
+//static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+//static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+\r
+/*===== 外部参照 =====*/\r
+\r
+extern HWND hHelpWin;\r
+\r
+/* 設定値 */\r
+extern HFONT ListFont;         /* リストボックスのフォント */\r
+extern SIZE BmarkDlgSize;\r
+\r
+\r
+\r
+/*----- ブックマークをクリアする ----------------------------------------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void ClearBookMark(void)\r
+{\r
+       HMENU hMenu;\r
+\r
+       hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);\r
+       while(GetMenuItemCount(hMenu) > DEFAULT_BMARK_ITEM)\r
+               DeleteMenu(hMenu, DEFAULT_BMARK_ITEM, MF_BYPOSITION);\r
+       return;\r
+}\r
+\r
+\r
+/*----- カレントディレクトリをブックマークに追加 ------------------------------\r
+*\r
+*      Parameter\r
+*              int Win : ウインドウ番号 (WIN_xxx)\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void AddCurDirToBookMark(int Win)\r
+{\r
+       char Buf[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];\r
+\r
+       if(Win == WIN_LOCAL)\r
+       {\r
+               strcpy(Buf, BMARK_MARK_LOCAL);\r
+               AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);\r
+       }\r
+       else if(Win == WIN_REMOTE)\r
+       {\r
+               strcpy(Buf, BMARK_MARK_REMOTE);\r
+               AskRemoteCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);\r
+       }\r
+       else\r
+       {\r
+               strcpy(Buf, BMARK_MARK_BOTH);\r
+               AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);\r
+               strcat(Buf, BMARK_SEP);\r
+               AskRemoteCurDir(Buf + strlen(Buf), FMAX_PATH);\r
+       }\r
+       AddBookMark(Buf);\r
+       return;\r
+}\r
+\r
+\r
+/*----- ブックマークにパスを登録する ------------------------------------------\r
+*\r
+*      Parameter\r
+*              char *Path : パス名\r
+*\r
+*      Return Value\r
+*              int ステータス\r
+*                      FFFTP_SUCCESS/FFFTP_FAIL\r
+*----------------------------------------------------------------------------*/\r
+\r
+static int AddBookMark(char *Path)\r
+{\r
+       HMENU hMenu;\r
+       int MarkID;\r
+       int Sts;\r
+\r
+       Sts = FFFTP_FAIL;\r
+       hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);\r
+       MarkID = (GetMenuItemCount(hMenu) - DEFAULT_BMARK_ITEM) + MENU_BMARK_TOP;\r
+       if(AppendMenu(hMenu, MF_STRING, MarkID, Path) == TRUE)\r
+               Sts = FFFTP_SUCCESS;\r
+       return(Sts);\r
+}\r
+\r
+\r
+/*----- 指定のIDを持つブックマークのパスを返す --------------------------------\r
+*\r
+*      Parameter\r
+*              int MarkID : ID\r
+*              char *Local : ローカル側のパスを返すバッファ\r
+*              char *Remote : リモート側のパスを返すバッファ\r
+*              int Max : バッファのサイズ\r
+*\r
+*      Return Value\r
+*              int ステータス (BMARK_TYPE_xxx)\r
+*----------------------------------------------------------------------------*/\r
+\r
+int AskBookMarkText(int MarkID, char *Local, char *Remote, int Max)\r
+{\r
+       HMENU hMenu;\r
+       MENUITEMINFO mInfo;\r
+       int Sts;\r
+       char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];\r
+       char *Path1;\r
+       char *Path2;\r
+       int Num;\r
+\r
+       memset(Local, NUL, Max);\r
+       memset(Remote, NUL, Max);\r
+\r
+       Sts = BMARK_TYPE_NONE;\r
+       hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);\r
+\r
+       mInfo.cbSize = sizeof(MENUITEMINFO);\r
+       mInfo.fMask = MIIM_TYPE;\r
+       mInfo.dwTypeData = Tmp;\r
+       mInfo.cch = BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN;\r
+       if(GetMenuItemInfo(hMenu, MarkID, FALSE, &mInfo) == TRUE)\r
+       {\r
+               Num = GetBothPath(Tmp, &Path1, &Path2);\r
+               if(strncmp(Tmp, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0)\r
+               {\r
+                       Sts = BMARK_TYPE_LOCAL;\r
+                       strncpy(Local, Path1, Max-1);\r
+               }\r
+               else if(strncmp(Tmp, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0)\r
+               {\r
+                       Sts = BMARK_TYPE_REMOTE;\r
+                       strncpy(Remote, Path1, Max-1);\r
+               }\r
+               else if(strncmp(Tmp, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0)\r
+               {\r
+                       if(Num == 2)\r
+                       {\r
+                               strncpy(Local, Path1, Max-1);\r
+                               strncpy(Remote, Path2, Max-1);\r
+                               Sts = BMARK_TYPE_BOTH;\r
+                       }\r
+               }\r
+       }\r
+       return(Sts);\r
+}\r
+\r
+\r
+/*----- ブックマークの文字列から2つのパスを取り出す --------------------------\r
+*\r
+*      Parameter\r
+*              char *Str : 文字列\r
+*              char **Local : ローカル側のパスの先頭を返すワーク\r
+*              char **Remote : リモート側のパスの先頭を返すワーク\r
+*\r
+*      Return Value\r
+*              int パスの個数 (1 or 2)\r
+*\r
+*      Note\r
+*              Strの内容を書き換える\r
+*----------------------------------------------------------------------------*/\r
+\r
+static int GetBothPath(char *Str, char **Path1, char **Path2)\r
+{\r
+       char *Pos;\r
+       int Ret;\r
+\r
+       Ret = 1;\r
+       *Path1 = Str + BMARK_MARK_LEN;\r
+\r
+       Pos = _mbsstr(Str, BMARK_SEP);\r
+       if(Pos != NULL)\r
+       {\r
+               Ret = 2;\r
+               *Pos = NUL;\r
+               *Path2 = Pos + BMARK_SEP_LEN;\r
+       }\r
+       return(Ret);\r
+}\r
+\r
+\r
+/*----- ブックマークを接続中のホストリストに保存する --------------------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void SaveBookMark(void)\r
+{\r
+       HMENU hMenu;\r
+       MENUITEMINFO mInfo;\r
+       int i;\r
+       int Cnt;\r
+       char *Buf;\r
+       char *Pos;\r
+       int Len;\r
+       char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];\r
+       int CurHost;\r
+\r
+       if(AskConnecting() == YES)\r
+       {\r
+               if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY)\r
+               {\r
+                       if((Buf = malloc(BOOKMARK_SIZE)) != NULL)\r
+                       {\r
+                               hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);\r
+\r
+                               Pos = Buf;\r
+                               Len = 0;\r
+                               Cnt = GetMenuItemCount(hMenu);\r
+                               for(i = DEFAULT_BMARK_ITEM; i < Cnt; i++)\r
+                               {\r
+                                       mInfo.cbSize = sizeof(MENUITEMINFO);\r
+                                       mInfo.fMask = MIIM_TYPE;\r
+                                       mInfo.dwTypeData = Tmp;\r
+                                       mInfo.cch = FMAX_PATH;\r
+                                       if(GetMenuItemInfo(hMenu, i, TRUE, &mInfo) == TRUE)\r
+                                       {\r
+                                               if(Len + strlen(Tmp) + 2 <= BOOKMARK_SIZE)\r
+                                               {\r
+                                                       strcpy(Pos, Tmp);\r
+                                                       Pos += strlen(Tmp) + 1;\r
+                                                       Len += strlen(Tmp) + 1;\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               if(Pos == Buf)\r
+                               {\r
+                                       memset(Buf, NUL, 2);\r
+                                       Len = 2;\r
+                               }\r
+                               else\r
+                               {\r
+                                       *Pos = NUL;\r
+                                       Len++;\r
+                               }\r
+\r
+                               SetHostBookMark(CurHost, Buf, Len);\r
+\r
+                               free(Buf);\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ホストリストからブックマークを読み込む --------------------------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void LoadBookMark(void)\r
+{\r
+       char *Buf;\r
+       char *Pos;\r
+       int CurHost;\r
+       char Tmp[FMAX_PATH + BMARK_MARK_LEN + 1];\r
+\r
+       if(AskConnecting() == YES)\r
+       {\r
+               if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY)\r
+               {\r
+                       if((Buf = AskHostBookMark(CurHost)) != NULL)\r
+                       {\r
+                               ClearBookMark();\r
+                               Pos = Buf;\r
+                               while(*Pos != NUL)\r
+                               {\r
+                                       /* 旧フォーマットのための処理 */\r
+                                       /* (パスに"L"や"H"がついてない物) */\r
+                                       if((strncmp(Pos, BMARK_MARK_LOCAL, BMARK_MARK_LEN) != 0) &&\r
+                                          (strncmp(Pos, BMARK_MARK_REMOTE, BMARK_MARK_LEN) != 0) &&\r
+                                          (strncmp(Pos, BMARK_MARK_BOTH, BMARK_MARK_LEN) != 0))\r
+                                       {\r
+                                               strcpy(Tmp, BMARK_MARK_REMOTE);\r
+                                               strcat(Tmp, Pos);\r
+                                               AddBookMark(Tmp);\r
+                                       }\r
+                                       else\r
+                                               AddBookMark(Pos);\r
+\r
+                                       Pos += strlen(Pos) + 1;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ブックマーク編集ウインドウ --------------------------------------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              ステータス (YES=実行/NO=取消)\r
+*----------------------------------------------------------------------------*/\r
+\r
+int EditBookMark(void)\r
+{\r
+       int Sts;\r
+\r
+       Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(bmark_dlg), GetMainHwnd(), EditBookMarkProc);\r
+       return(Sts);\r
+}\r
+\r
+\r
+/*----- ブックマーク編集ウインドウのコールバック ------------------------------\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
+*\r
+*      Return Value\r
+*              BOOL TRUE/FALSE\r
+*----------------------------------------------------------------------------*/\r
+\r
+// 64ビット対応\r
+//static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+       HMENU hMenu;\r
+       MENUITEMINFO mInfo;\r
+       int Cur;\r
+       int Max;\r
+       char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];\r
+       // バグ修正\r
+       RECT Rect;\r
+\r
+       static DIALOGSIZE DlgSize = {\r
+               { BMARK_NEW, BMARK_SET, BMARK_DEL, BMARK_DOWN, BMARK_UP, IDHELP, BMARK_SIZEGRIP, -1 },\r
+               { IDOK, BMARK_JUMP, BMARK_SIZEGRIP, -1 },\r
+               { BMARK_LIST, -1 },\r
+               { 0, 0 },\r
+               { 0, 0 }\r
+       };\r
+\r
+       switch (message)\r
+       {\r
+               // バグ修正\r
+               case WM_SIZE :\r
+                       GetWindowRect(hDlg, &Rect);\r
+                       DlgSizeChange(hDlg, &DlgSize, &Rect, 0);\r
+                       RedrawWindow(hDlg, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN);\r
+                       break;\r
+\r
+               case WM_INITDIALOG :\r
+                       if(ListFont != NULL)\r
+                               SendDlgItemMessage(hDlg, BMARK_LIST, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));\r
+\r
+                       hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);\r
+                       Max = GetMenuItemCount(hMenu);\r
+                       for(Cur = DEFAULT_BMARK_ITEM; Cur < Max; Cur++)\r
+                       {\r
+                               mInfo.cbSize = sizeof(MENUITEMINFO);\r
+                               mInfo.fMask = MIIM_TYPE;\r
+                               mInfo.dwTypeData = Tmp;\r
+                               mInfo.cch = FMAX_PATH;\r
+                               if(GetMenuItemInfo(hMenu, Cur, TRUE, &mInfo) == TRUE)\r
+                                       SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);\r
+                       }\r
+                       DlgSizeInit(hDlg, &DlgSize, &BmarkDlgSize);\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case BMARK_JUMP :\r
+                                       if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)\r
+                                               PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(Cur+MENU_BMARK_TOP, 0), 0);\r
+                                       /* ここに break はない */\r
+\r
+                               case IDCANCEL :\r
+                               case IDOK :\r
+                                       ClearBookMark();\r
+                                       Max = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0);\r
+                                       for(Cur = 0; Cur < Max; Cur++)\r
+                                       {\r
+                                               SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);\r
+                                               AddBookMark(Tmp);\r
+                                       }\r
+                                       AskDlgSize(hDlg, &DlgSize, &BmarkDlgSize);\r
+                                       EndDialog(hDlg, YES);\r
+                                       break;\r
+\r
+                               case BMARK_SET :\r
+                                       if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)\r
+                                       {\r
+                                               SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);\r
+                                               if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES)\r
+                                               {\r
+                                                       SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);\r
+                                                       SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, Cur, (LPARAM)Tmp);\r
+                                                       SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);\r
+                                               }\r
+                                       }\r
+                                       break;\r
+\r
+                               case BMARK_NEW :\r
+                                       strcpy(Tmp, "");\r
+                                       if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES)\r
+                                       {\r
+                                               SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);\r
+                                               Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) - 1;\r
+                                               SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);\r
+                                       }\r
+                                       break;\r
+\r
+                               case BMARK_DEL :\r
+                                       if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)\r
+                                       {\r
+                                               SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);\r
+                                               if(Cur >= SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0))\r
+                                                       Cur = max1(0, SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1);\r
+                                               if(SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) > 0)\r
+                                                       SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);\r
+                                       }\r
+                                       break;\r
+\r
+                               case BMARK_UP :\r
+                                       if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)\r
+                                       {\r
+                                               if(Cur > 0)\r
+                                               {\r
+                                                       SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);\r
+                                                       SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);\r
+                                                       SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, --Cur, (LPARAM)Tmp);\r
+                                                       SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);\r
+                                               }\r
+                                       }\r
+                                       break;\r
+\r
+                               case BMARK_DOWN :\r
+                                       if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)\r
+                                       {\r
+                                               if(Cur < SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1)\r
+                                               {\r
+                                                       SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);\r
+                                                       SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);\r
+                                                       SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, ++Cur, (LPARAM)Tmp);\r
+                                                       SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);\r
+                                               }\r
+                                       }\r
+                                       break;\r
+\r
+                               case IDHELP :\r
+                                       hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000019);\r
+                                       break;\r
+                       }\r
+                       return(TRUE);\r
+\r
+               case WM_SIZING :\r
+                       DlgSizeChange(hDlg, &DlgSize, (RECT *)lParam, (int)wParam);\r
+                       return(TRUE);\r
+\r
+       }\r
+       return(FALSE);\r
+}\r
+\r
+\r
+/*----- ブックマーク入力ダイアログのコールバック ------------------------------\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
+*\r
+*      Return Value\r
+*              BOOL TRUE/FALSE\r
+*----------------------------------------------------------------------------*/\r
+\r
+// 64ビット対応\r
+//static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+       static char *Str;\r
+       char *Path1;\r
+       char *Path2;\r
+       char Local[FMAX_PATH+1];\r
+       char Remote[FMAX_PATH+1];\r
+       int Num;\r
+\r
+       switch (iMessage)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       Str = (char *)lParam;\r
+                       SendDlgItemMessage(hDlg, BEDIT_LOCAL, EM_LIMITTEXT, FMAX_PATH-1, 0);\r
+                       SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_LIMITTEXT, FMAX_PATH-1, 0);\r
+                       if(strlen(Str) > BMARK_MARK_LEN)\r
+                       {\r
+                               Num = GetBothPath(Str, &Path1, &Path2);\r
+                               if(strncmp(Str, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0)\r
+                                       SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1);\r
+                               else if(strncmp(Str, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0)\r
+                               {\r
+                                       SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path1);\r
+                                       /* ホスト側にカーソルを移動しておく */\r
+                                       SetFocus(GetDlgItem(hDlg, BEDIT_REMOTE));\r
+                                       SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_SETSEL, 0, -1);\r
+                                       return(FALSE);\r
+                               }\r
+                               else if((strncmp(Str, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0) && (Num == 2))\r
+                               {\r
+                                       SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1);\r
+                                       SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path2);\r
+                               }\r
+                       }\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case IDOK :\r
+                                       SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Local);\r
+                                       SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Remote);\r
+                                       if(strlen(Local) > 0)\r
+                                       {\r
+                                               if(strlen(Remote) > 0)\r
+                                               {\r
+                                                       /* 両方 */\r
+                                                       strcpy(Str, BMARK_MARK_BOTH);\r
+                                                       strcat(Str, Local);\r
+                                                       strcat(Str, BMARK_SEP);\r
+                                                       strcat(Str, Remote);\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       /* ローカルのみ */\r
+                                                       strcpy(Str, BMARK_MARK_LOCAL);\r
+                                                       strcat(Str, Local);\r
+                                               }\r
+                                               EndDialog(hDlg, YES);\r
+                                       }\r
+                                       else if(strlen(Remote) > 0)\r
+                                       {\r
+                                               /* ホストのみ */\r
+                                               strcpy(Str, BMARK_MARK_REMOTE);\r
+                                               strcat(Str, Remote);\r
+                                               EndDialog(hDlg, YES);\r
+                                       }\r
+                                       else\r
+                                               EndDialog(hDlg, NO);\r
+                                       break;\r
+\r
+                               case IDCANCEL :\r
+                                       EndDialog(hDlg, NO);\r
+                                       break;\r
+                       }\r
+                       return(TRUE);\r
+       }\r
+       return(FALSE);\r
+}\r
+\r
+\r