1 /*=============================================================================
\r
5 ===============================================================================
\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.
\r
8 / Redistribution and use in source and binary forms, with or without
\r
9 / modification, are permitted provided that the following conditions
\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
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
30 #define WINVER 0x400
\r
33 #include <windows.h>
\r
37 #include <mbstring.h>
\r
39 #include <windowsx.h>
\r
40 #include <commctrl.h>
\r
43 #include "resource.h"
\r
45 #include <htmlhelp.h>
\r
49 #undef __MBSWRAPPER_H__
\r
50 #include "mbswrapper.h"
\r
53 /*===== プロトタイプ =====*/
\r
55 static int AddBookMark(char *Path);
\r
56 static int GetBothPath(char *Str, char **Path1, char **Path2);
\r
57 static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
\r
58 static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
\r
60 /*===== 外部参照 =====*/
\r
62 extern HWND hHelpWin;
\r
65 extern HFONT ListFont; /* リストボックスのフォント */
\r
66 extern SIZE BmarkDlgSize;
\r
70 /*----- ブックマークをクリアする ----------------------------------------------
\r
77 *----------------------------------------------------------------------------*/
\r
79 void ClearBookMark(void)
\r
83 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
84 while(GetMenuItemCount(hMenu) > DEFAULT_BMARK_ITEM)
\r
85 DeleteMenu(hMenu, DEFAULT_BMARK_ITEM, MF_BYPOSITION);
\r
90 /*----- カレントディレクトリをブックマークに追加 ------------------------------
\r
93 * int Win : ウインドウ番号 (WIN_xxx)
\r
97 *----------------------------------------------------------------------------*/
\r
99 void AddCurDirToBookMark(int Win)
\r
101 char Buf[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
103 if(Win == WIN_LOCAL)
\r
105 strcpy(Buf, BMARK_MARK_LOCAL);
\r
106 AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);
\r
108 else if(Win == WIN_REMOTE)
\r
110 strcpy(Buf, BMARK_MARK_REMOTE);
\r
111 AskRemoteCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);
\r
115 strcpy(Buf, BMARK_MARK_BOTH);
\r
116 AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);
\r
117 strcat(Buf, BMARK_SEP);
\r
118 AskRemoteCurDir(Buf + strlen(Buf), FMAX_PATH);
\r
125 /*----- ブックマークにパスを登録する ------------------------------------------
\r
132 * FFFTP_SUCCESS/FFFTP_FAIL
\r
133 *----------------------------------------------------------------------------*/
\r
135 static int AddBookMark(char *Path)
\r
142 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
143 MarkID = (GetMenuItemCount(hMenu) - DEFAULT_BMARK_ITEM) + MENU_BMARK_TOP;
\r
144 if(AppendMenu(hMenu, MF_STRING, MarkID, Path) == TRUE)
\r
145 Sts = FFFTP_SUCCESS;
\r
150 /*----- 指定のIDを持つブックマークのパスを返す --------------------------------
\r
154 * char *Local : ローカル側のパスを返すバッファ
\r
155 * char *Remote : リモート側のパスを返すバッファ
\r
156 * int Max : バッファのサイズ
\r
159 * int ステータス (BMARK_TYPE_xxx)
\r
160 *----------------------------------------------------------------------------*/
\r
162 int AskBookMarkText(int MarkID, char *Local, char *Remote, int Max)
\r
165 MENUITEMINFO mInfo;
\r
167 char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
172 memset(Local, NUL, Max);
\r
173 memset(Remote, NUL, Max);
\r
175 Sts = BMARK_TYPE_NONE;
\r
176 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
178 mInfo.cbSize = sizeof(MENUITEMINFO);
\r
179 mInfo.fMask = MIIM_TYPE;
\r
180 mInfo.dwTypeData = Tmp;
\r
181 mInfo.cch = BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN;
\r
182 if(GetMenuItemInfo(hMenu, MarkID, FALSE, &mInfo) == TRUE)
\r
184 Num = GetBothPath(Tmp, &Path1, &Path2);
\r
185 if(strncmp(Tmp, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0)
\r
187 Sts = BMARK_TYPE_LOCAL;
\r
188 strncpy(Local, Path1, Max-1);
\r
190 else if(strncmp(Tmp, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0)
\r
192 Sts = BMARK_TYPE_REMOTE;
\r
193 strncpy(Remote, Path1, Max-1);
\r
195 else if(strncmp(Tmp, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0)
\r
199 strncpy(Local, Path1, Max-1);
\r
200 strncpy(Remote, Path2, Max-1);
\r
201 Sts = BMARK_TYPE_BOTH;
\r
209 /*----- ブックマークの文字列から2つのパスを取り出す --------------------------
\r
213 * char **Local : ローカル側のパスの先頭を返すワーク
\r
214 * char **Remote : リモート側のパスの先頭を返すワーク
\r
217 * int パスの個数 (1 or 2)
\r
221 *----------------------------------------------------------------------------*/
\r
223 static int GetBothPath(char *Str, char **Path1, char **Path2)
\r
229 *Path1 = Str + BMARK_MARK_LEN;
\r
231 Pos = _mbsstr(Str, BMARK_SEP);
\r
236 *Path2 = Pos + BMARK_SEP_LEN;
\r
242 /*----- ブックマークを接続中のホストリストに保存する --------------------------
\r
249 *----------------------------------------------------------------------------*/
\r
251 void SaveBookMark(void)
\r
254 MENUITEMINFO mInfo;
\r
260 char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
263 if(AskConnecting() == YES)
\r
265 if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY)
\r
267 if((Buf = malloc(BOOKMARK_SIZE)) != NULL)
\r
269 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
273 Cnt = GetMenuItemCount(hMenu);
\r
274 for(i = DEFAULT_BMARK_ITEM; i < Cnt; i++)
\r
276 mInfo.cbSize = sizeof(MENUITEMINFO);
\r
277 mInfo.fMask = MIIM_TYPE;
\r
278 mInfo.dwTypeData = Tmp;
\r
279 mInfo.cch = FMAX_PATH;
\r
280 if(GetMenuItemInfo(hMenu, i, TRUE, &mInfo) == TRUE)
\r
282 if(Len + strlen(Tmp) + 2 <= BOOKMARK_SIZE)
\r
285 Pos += strlen(Tmp) + 1;
\r
286 Len += strlen(Tmp) + 1;
\r
293 memset(Buf, NUL, 2);
\r
302 SetHostBookMark(CurHost, Buf, Len);
\r
312 /*----- ホストリストからブックマークを読み込む --------------------------------
\r
319 *----------------------------------------------------------------------------*/
\r
321 void LoadBookMark(void)
\r
326 char Tmp[FMAX_PATH + BMARK_MARK_LEN + 1];
\r
328 if(AskConnecting() == YES)
\r
330 if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY)
\r
332 if((Buf = AskHostBookMark(CurHost)) != NULL)
\r
338 /* 旧フォーマットのための処理 */
\r
339 /* (パスに"L"や"H"がついてない物) */
\r
340 if((strncmp(Pos, BMARK_MARK_LOCAL, BMARK_MARK_LEN) != 0) &&
\r
341 (strncmp(Pos, BMARK_MARK_REMOTE, BMARK_MARK_LEN) != 0) &&
\r
342 (strncmp(Pos, BMARK_MARK_BOTH, BMARK_MARK_LEN) != 0))
\r
344 strcpy(Tmp, BMARK_MARK_REMOTE);
\r
351 Pos += strlen(Pos) + 1;
\r
360 /*----- ブックマーク編集ウインドウ --------------------------------------------
\r
366 * ステータス (YES=実行/NO=取消)
\r
367 *----------------------------------------------------------------------------*/
\r
369 int EditBookMark(void)
\r
373 Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(bmark_dlg), GetMainHwnd(), EditBookMarkProc);
\r
378 /*----- ブックマーク編集ウインドウのコールバック ------------------------------
\r
381 * HWND hDlg : ウインドウハンドル
\r
382 * UINT message : メッセージ番号
\r
383 * WPARAM wParam : メッセージの WPARAM 引数
\r
384 * LPARAM lParam : メッセージの LPARAM 引数
\r
388 *----------------------------------------------------------------------------*/
\r
390 static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
\r
393 MENUITEMINFO mInfo;
\r
396 char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
398 static DIALOGSIZE DlgSize = {
\r
399 { BMARK_NEW, BMARK_SET, BMARK_DEL, BMARK_DOWN, BMARK_UP, IDHELP, BMARK_SIZEGRIP, -1 },
\r
400 { IDOK, BMARK_JUMP, BMARK_SIZEGRIP, -1 },
\r
401 { BMARK_LIST, -1 },
\r
408 case WM_INITDIALOG :
\r
409 if(ListFont != NULL)
\r
410 SendDlgItemMessage(hDlg, BMARK_LIST, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));
\r
412 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
413 Max = GetMenuItemCount(hMenu);
\r
414 for(Cur = DEFAULT_BMARK_ITEM; Cur < Max; Cur++)
\r
416 mInfo.cbSize = sizeof(MENUITEMINFO);
\r
417 mInfo.fMask = MIIM_TYPE;
\r
418 mInfo.dwTypeData = Tmp;
\r
419 mInfo.cch = FMAX_PATH;
\r
420 if(GetMenuItemInfo(hMenu, Cur, TRUE, &mInfo) == TRUE)
\r
421 SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);
\r
423 DlgSizeInit(hDlg, &DlgSize, &BmarkDlgSize);
\r
427 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
430 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
431 PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(Cur+MENU_BMARK_TOP, 0), 0);
\r
432 /* ここに break はない */
\r
437 Max = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0);
\r
438 for(Cur = 0; Cur < Max; Cur++)
\r
440 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
443 AskDlgSize(hDlg, &DlgSize, &BmarkDlgSize);
\r
444 EndDialog(hDlg, YES);
\r
448 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
450 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
451 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES)
\r
453 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
454 SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, Cur, (LPARAM)Tmp);
\r
455 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
462 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES)
\r
464 SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);
\r
465 Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) - 1;
\r
466 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
471 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
473 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
474 if(Cur >= SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0))
\r
475 Cur = max1(0, SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1);
\r
476 if(SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) > 0)
\r
477 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
482 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
486 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
487 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
488 SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, --Cur, (LPARAM)Tmp);
\r
489 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
495 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
497 if(Cur < SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1)
\r
499 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
500 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
501 SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, ++Cur, (LPARAM)Tmp);
\r
502 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
508 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000019);
\r
514 DlgSizeChange(hDlg, &DlgSize, (RECT *)lParam, (int)wParam);
\r
522 /*----- ブックマーク入力ダイアログのコールバック ------------------------------
\r
525 * HWND hDlg : ウインドウハンドル
\r
526 * UINT message : メッセージ番号
\r
527 * WPARAM wParam : メッセージの WPARAM 引数
\r
528 * LPARAM lParam : メッセージの LPARAM 引数
\r
532 *----------------------------------------------------------------------------*/
\r
534 static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
\r
539 char Local[FMAX_PATH+1];
\r
540 char Remote[FMAX_PATH+1];
\r
545 case WM_INITDIALOG :
\r
546 Str = (char *)lParam;
\r
547 SendDlgItemMessage(hDlg, BEDIT_LOCAL, EM_LIMITTEXT, FMAX_PATH-1, 0);
\r
548 SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_LIMITTEXT, FMAX_PATH-1, 0);
\r
549 if(strlen(Str) > BMARK_MARK_LEN)
\r
551 Num = GetBothPath(Str, &Path1, &Path2);
\r
552 if(strncmp(Str, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0)
\r
553 SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1);
\r
554 else if(strncmp(Str, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0)
\r
556 SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path1);
\r
557 /* ホスト側にカーソルを移動しておく */
\r
558 SetFocus(GetDlgItem(hDlg, BEDIT_REMOTE));
\r
559 SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_SETSEL, 0, -1);
\r
562 else if((strncmp(Str, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0) && (Num == 2))
\r
564 SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1);
\r
565 SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path2);
\r
571 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
574 SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Local);
\r
575 SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Remote);
\r
576 if(strlen(Local) > 0)
\r
578 if(strlen(Remote) > 0)
\r
581 strcpy(Str, BMARK_MARK_BOTH);
\r
582 strcat(Str, Local);
\r
583 strcat(Str, BMARK_SEP);
\r
584 strcat(Str, Remote);
\r
589 strcpy(Str, BMARK_MARK_LOCAL);
\r
590 strcat(Str, Local);
\r
592 EndDialog(hDlg, YES);
\r
594 else if(strlen(Remote) > 0)
\r
597 strcpy(Str, BMARK_MARK_REMOTE);
\r
598 strcat(Str, Remote);
\r
599 EndDialog(hDlg, YES);
\r
602 EndDialog(hDlg, NO);
\r
606 EndDialog(hDlg, NO);
\r