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
31 //#define WINVER 0x400
\r
34 #include <windows.h>
\r
38 #include <mbstring.h>
\r
40 #include <windowsx.h>
\r
41 #include <commctrl.h>
\r
44 #include "resource.h"
\r
46 #include <htmlhelp.h>
\r
50 #undef __MBSWRAPPER_H__
\r
51 #include "mbswrapper.h"
\r
54 /*===== プロトタイプ =====*/
\r
56 static int AddBookMark(char *Path);
\r
57 static int GetBothPath(char *Str, char **Path1, char **Path2);
\r
58 static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
\r
59 static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);
\r
61 /*===== 外部参照 =====*/
\r
63 extern HWND hHelpWin;
\r
66 extern HFONT ListFont; /* リストボックスのフォント */
\r
67 extern SIZE BmarkDlgSize;
\r
71 /*----- ブックマークをクリアする ----------------------------------------------
\r
78 *----------------------------------------------------------------------------*/
\r
80 void ClearBookMark(void)
\r
84 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
85 while(GetMenuItemCount(hMenu) > DEFAULT_BMARK_ITEM)
\r
86 DeleteMenu(hMenu, DEFAULT_BMARK_ITEM, MF_BYPOSITION);
\r
91 /*----- カレントディレクトリをブックマークに追加 ------------------------------
\r
94 * int Win : ウインドウ番号 (WIN_xxx)
\r
98 *----------------------------------------------------------------------------*/
\r
100 void AddCurDirToBookMark(int Win)
\r
102 char Buf[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
104 if(Win == WIN_LOCAL)
\r
106 strcpy(Buf, BMARK_MARK_LOCAL);
\r
107 AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);
\r
109 else if(Win == WIN_REMOTE)
\r
111 strcpy(Buf, BMARK_MARK_REMOTE);
\r
112 AskRemoteCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);
\r
116 strcpy(Buf, BMARK_MARK_BOTH);
\r
117 AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH);
\r
118 strcat(Buf, BMARK_SEP);
\r
119 AskRemoteCurDir(Buf + strlen(Buf), FMAX_PATH);
\r
126 /*----- ブックマークにパスを登録する ------------------------------------------
\r
133 * FFFTP_SUCCESS/FFFTP_FAIL
\r
134 *----------------------------------------------------------------------------*/
\r
136 static int AddBookMark(char *Path)
\r
143 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
144 MarkID = (GetMenuItemCount(hMenu) - DEFAULT_BMARK_ITEM) + MENU_BMARK_TOP;
\r
145 if(AppendMenu(hMenu, MF_STRING, MarkID, Path) == TRUE)
\r
146 Sts = FFFTP_SUCCESS;
\r
151 /*----- 指定のIDを持つブックマークのパスを返す --------------------------------
\r
155 * char *Local : ローカル側のパスを返すバッファ
\r
156 * char *Remote : リモート側のパスを返すバッファ
\r
157 * int Max : バッファのサイズ
\r
160 * int ステータス (BMARK_TYPE_xxx)
\r
161 *----------------------------------------------------------------------------*/
\r
163 int AskBookMarkText(int MarkID, char *Local, char *Remote, int Max)
\r
166 MENUITEMINFO mInfo;
\r
168 char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
173 memset(Local, NUL, Max);
\r
174 memset(Remote, NUL, Max);
\r
176 Sts = BMARK_TYPE_NONE;
\r
177 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
179 mInfo.cbSize = sizeof(MENUITEMINFO);
\r
180 mInfo.fMask = MIIM_TYPE;
\r
181 mInfo.dwTypeData = Tmp;
\r
182 mInfo.cch = BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN;
\r
183 if(GetMenuItemInfo(hMenu, MarkID, FALSE, &mInfo) == TRUE)
\r
185 Num = GetBothPath(Tmp, &Path1, &Path2);
\r
186 if(strncmp(Tmp, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0)
\r
188 Sts = BMARK_TYPE_LOCAL;
\r
189 strncpy(Local, Path1, Max-1);
\r
191 else if(strncmp(Tmp, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0)
\r
193 Sts = BMARK_TYPE_REMOTE;
\r
194 strncpy(Remote, Path1, Max-1);
\r
196 else if(strncmp(Tmp, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0)
\r
200 strncpy(Local, Path1, Max-1);
\r
201 strncpy(Remote, Path2, Max-1);
\r
202 Sts = BMARK_TYPE_BOTH;
\r
210 /*----- ブックマークの文字列から2つのパスを取り出す --------------------------
\r
214 * char **Local : ローカル側のパスの先頭を返すワーク
\r
215 * char **Remote : リモート側のパスの先頭を返すワーク
\r
218 * int パスの個数 (1 or 2)
\r
222 *----------------------------------------------------------------------------*/
\r
224 static int GetBothPath(char *Str, char **Path1, char **Path2)
\r
230 *Path1 = Str + BMARK_MARK_LEN;
\r
232 Pos = _mbsstr(Str, BMARK_SEP);
\r
237 *Path2 = Pos + BMARK_SEP_LEN;
\r
243 /*----- ブックマークを接続中のホストリストに保存する --------------------------
\r
250 *----------------------------------------------------------------------------*/
\r
252 void SaveBookMark(void)
\r
255 MENUITEMINFO mInfo;
\r
261 char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
264 if(AskConnecting() == YES)
\r
266 if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY)
\r
268 if((Buf = malloc(BOOKMARK_SIZE)) != NULL)
\r
270 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
274 Cnt = GetMenuItemCount(hMenu);
\r
275 for(i = DEFAULT_BMARK_ITEM; i < Cnt; i++)
\r
277 mInfo.cbSize = sizeof(MENUITEMINFO);
\r
278 mInfo.fMask = MIIM_TYPE;
\r
279 mInfo.dwTypeData = Tmp;
\r
280 mInfo.cch = FMAX_PATH;
\r
281 if(GetMenuItemInfo(hMenu, i, TRUE, &mInfo) == TRUE)
\r
283 if(Len + strlen(Tmp) + 2 <= BOOKMARK_SIZE)
\r
286 Pos += strlen(Tmp) + 1;
\r
287 Len += strlen(Tmp) + 1;
\r
294 memset(Buf, NUL, 2);
\r
303 SetHostBookMark(CurHost, Buf, Len);
\r
313 /*----- ホストリストからブックマークを読み込む --------------------------------
\r
320 *----------------------------------------------------------------------------*/
\r
322 void LoadBookMark(void)
\r
327 char Tmp[FMAX_PATH + BMARK_MARK_LEN + 1];
\r
329 if(AskConnecting() == YES)
\r
331 if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY)
\r
333 if((Buf = AskHostBookMark(CurHost)) != NULL)
\r
339 /* 旧フォーマットのための処理 */
\r
340 /* (パスに"L"や"H"がついてない物) */
\r
341 if((strncmp(Pos, BMARK_MARK_LOCAL, BMARK_MARK_LEN) != 0) &&
\r
342 (strncmp(Pos, BMARK_MARK_REMOTE, BMARK_MARK_LEN) != 0) &&
\r
343 (strncmp(Pos, BMARK_MARK_BOTH, BMARK_MARK_LEN) != 0))
\r
345 strcpy(Tmp, BMARK_MARK_REMOTE);
\r
352 Pos += strlen(Pos) + 1;
\r
361 /*----- ブックマーク編集ウインドウ --------------------------------------------
\r
367 * ステータス (YES=実行/NO=取消)
\r
368 *----------------------------------------------------------------------------*/
\r
370 int EditBookMark(void)
\r
374 Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(bmark_dlg), GetMainHwnd(), EditBookMarkProc);
\r
379 /*----- ブックマーク編集ウインドウのコールバック ------------------------------
\r
382 * HWND hDlg : ウインドウハンドル
\r
383 * UINT message : メッセージ番号
\r
384 * WPARAM wParam : メッセージの WPARAM 引数
\r
385 * LPARAM lParam : メッセージの LPARAM 引数
\r
389 *----------------------------------------------------------------------------*/
\r
391 static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
\r
394 MENUITEMINFO mInfo;
\r
397 char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1];
\r
399 static DIALOGSIZE DlgSize = {
\r
400 { BMARK_NEW, BMARK_SET, BMARK_DEL, BMARK_DOWN, BMARK_UP, IDHELP, BMARK_SIZEGRIP, -1 },
\r
401 { IDOK, BMARK_JUMP, BMARK_SIZEGRIP, -1 },
\r
402 { BMARK_LIST, -1 },
\r
409 case WM_INITDIALOG :
\r
410 if(ListFont != NULL)
\r
411 SendDlgItemMessage(hDlg, BMARK_LIST, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));
\r
413 hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU);
\r
414 Max = GetMenuItemCount(hMenu);
\r
415 for(Cur = DEFAULT_BMARK_ITEM; Cur < Max; Cur++)
\r
417 mInfo.cbSize = sizeof(MENUITEMINFO);
\r
418 mInfo.fMask = MIIM_TYPE;
\r
419 mInfo.dwTypeData = Tmp;
\r
420 mInfo.cch = FMAX_PATH;
\r
421 if(GetMenuItemInfo(hMenu, Cur, TRUE, &mInfo) == TRUE)
\r
422 SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);
\r
424 DlgSizeInit(hDlg, &DlgSize, &BmarkDlgSize);
\r
428 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
431 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
432 PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(Cur+MENU_BMARK_TOP, 0), 0);
\r
433 /* ここに break はない */
\r
438 Max = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0);
\r
439 for(Cur = 0; Cur < Max; Cur++)
\r
441 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
444 AskDlgSize(hDlg, &DlgSize, &BmarkDlgSize);
\r
445 EndDialog(hDlg, YES);
\r
449 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
451 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
452 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES)
\r
454 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
455 SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, Cur, (LPARAM)Tmp);
\r
456 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
463 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES)
\r
465 SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);
\r
466 Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) - 1;
\r
467 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
472 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
474 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
475 if(Cur >= SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0))
\r
476 Cur = max1(0, SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1);
\r
477 if(SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) > 0)
\r
478 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
483 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
487 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
488 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
489 SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, --Cur, (LPARAM)Tmp);
\r
490 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
496 if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR)
\r
498 if(Cur < SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1)
\r
500 SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp);
\r
501 SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0);
\r
502 SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, ++Cur, (LPARAM)Tmp);
\r
503 SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0);
\r
509 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000019);
\r
515 DlgSizeChange(hDlg, &DlgSize, (RECT *)lParam, (int)wParam);
\r
523 /*----- ブックマーク入力ダイアログのコールバック ------------------------------
\r
526 * HWND hDlg : ウインドウハンドル
\r
527 * UINT message : メッセージ番号
\r
528 * WPARAM wParam : メッセージの WPARAM 引数
\r
529 * LPARAM lParam : メッセージの LPARAM 引数
\r
533 *----------------------------------------------------------------------------*/
\r
535 static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
\r
540 char Local[FMAX_PATH+1];
\r
541 char Remote[FMAX_PATH+1];
\r
546 case WM_INITDIALOG :
\r
547 Str = (char *)lParam;
\r
548 SendDlgItemMessage(hDlg, BEDIT_LOCAL, EM_LIMITTEXT, FMAX_PATH-1, 0);
\r
549 SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_LIMITTEXT, FMAX_PATH-1, 0);
\r
550 if(strlen(Str) > BMARK_MARK_LEN)
\r
552 Num = GetBothPath(Str, &Path1, &Path2);
\r
553 if(strncmp(Str, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0)
\r
554 SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1);
\r
555 else if(strncmp(Str, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0)
\r
557 SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path1);
\r
558 /* ホスト側にカーソルを移動しておく */
\r
559 SetFocus(GetDlgItem(hDlg, BEDIT_REMOTE));
\r
560 SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_SETSEL, 0, -1);
\r
563 else if((strncmp(Str, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0) && (Num == 2))
\r
565 SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1);
\r
566 SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path2);
\r
572 switch(GET_WM_COMMAND_ID(wParam, lParam))
\r
575 SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Local);
\r
576 SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Remote);
\r
577 if(strlen(Local) > 0)
\r
579 if(strlen(Remote) > 0)
\r
582 strcpy(Str, BMARK_MARK_BOTH);
\r
583 strcat(Str, Local);
\r
584 strcat(Str, BMARK_SEP);
\r
585 strcat(Str, Remote);
\r
590 strcpy(Str, BMARK_MARK_LOCAL);
\r
591 strcat(Str, Local);
\r
593 EndDialog(hDlg, YES);
\r
595 else if(strlen(Remote) > 0)
\r
598 strcpy(Str, BMARK_MARK_REMOTE);
\r
599 strcat(Str, Remote);
\r
600 EndDialog(hDlg, YES);
\r
603 EndDialog(hDlg, NO);
\r
607 EndDialog(hDlg, NO);
\r