--- /dev/null
+/*=============================================================================\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