Develop and Download Open Source Software

Browse Subversion Repository

Contents of /branches/ttcomtester/teraterm/teraterm/dnddlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10521 - (show annotations) (download) (as text)
Fri Jan 20 16:03:38 2023 UTC (13 months, 2 weeks ago) by zmatsuo
File MIME type: text/x-c++src
File size: 10137 byte(s)
add communication test tool
1 /*
2 * (C) 2005- TeraTerm Project
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 /* TERATERM.EXE, drag and drop dialog */
30 #include "dnddlg.h"
31
32 #include <windowsx.h>
33 #include <stdio.h> // for _snprintf_s
34
35 #include "tt_res.h"
36
37 #include "i18n.h"
38 #include "ttlib.h"
39 #include "dlglib.h"
40
41 struct DrapDropDlgParam {
42 const wchar_t *TargetFilename;
43 enum drop_type DropType;
44 unsigned char DropTypePaste;
45 bool ScpEnable;
46 char *ScpSendDirPtr;
47 int ScpSendDirSize;
48 bool SendfileEnable;
49 bool SendfileBinary;
50 int RemaingFileCount;
51 bool DoSameProcess;
52 bool DoSameProcessNextDrop;
53 bool DoNotShowDialogEnable;
54 bool DoNotShowDialog;
55 const char *UILanguageFile;
56 };
57
58 struct DrapDropDlgData {
59 DrapDropDlgParam *Param;
60 };
61
62 static LRESULT CALLBACK OnDragDropDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
63 {
64 static const DlgTextInfo TextInfos[] = {
65 { 0, "DLG_DANDD_TITLE" },
66 { IDC_DAD_STATIC, "DLG_DANDD_TEXT" },
67 { IDC_SCP_RADIO, "DLG_DANDD_SCP_RADIO" },
68 { IDC_SENDFILE_RADIO, "DLG_DANDD_SENDFILE_RADIO" },
69 { IDC_PASTE_RADIO, "DLG_DANDD_PASTE_RADIO" },
70 { IDC_SCP_PATH_LABEL, "DLG_DANDD_SCP_DEST_LABEL" },
71 { IDC_SCP_PATH_NOTE, "DLG_DANDD_SCP_DEST_NOTE" },
72 { IDC_BINARY_CHECK, "DLG_DANDD_SEND_BINARY_CHECK" },
73 { IDC_ESCAPE_CHECK, "DLG_DANDD_PASTE_ESCAPE_CHECK" },
74 { IDC_SPACE_RADIO, "DLG_DANDD_PASTE_SPACE_RADIO" },
75 { IDC_NEWLINE_RADIO, "DLG_DANDD_PASTE_NEWLINE_RADIO" },
76 { IDC_SAME_PROCESS_CHECK, "DLG_DANDD_NEXTFILES" },
77 { IDC_SAME_PROCESS_NEXTDROP_CHECK, "DLG_DANDD_SAME_NEEXTDROP" },
78 { IDC_DONTSHOW_CHECK, "DLG_DANDD_DONTSHOW_NEEXTDROP" },
79 { IDC_DAD_NOTE, "DLG_DANDD_NOTE" },
80 { IDOK, "BTN_OK" },
81 { IDCANCEL, "BTN_CANCEL" },
82 };
83 DrapDropDlgData *DlgData = (DrapDropDlgData *)GetWindowLongPtr(hDlgWnd, DWLP_USER);
84
85 switch (msg) {
86 case WM_INITDIALOG:
87 {
88 DlgData = (DrapDropDlgData *)malloc(sizeof(DrapDropDlgData));
89 SetWindowLongPtr(hDlgWnd, DWLP_USER, (LONG_PTR)DlgData);
90 DrapDropDlgParam *Param = (DrapDropDlgParam *)lp;
91 DlgData->Param = Param;
92 SetDlgTexts(hDlgWnd, TextInfos, _countof(TextInfos), Param->UILanguageFile);
93
94 // target file
95 SetDlgItemTextW(hDlgWnd, IDC_FILENAME_EDIT, Param->TargetFilename);
96
97 // drop type
98 CheckRadioButton(hDlgWnd, IDC_SCP_RADIO, IDC_PASTE_RADIO,
99 Param->DropType == DROP_TYPE_SEND_FILE ? IDC_SENDFILE_RADIO :
100 Param->DropType == DROP_TYPE_PASTE_FILENAME ? IDC_PASTE_RADIO :
101 IDC_SCP_RADIO);
102
103 // SCP
104 SetDlgItemTextA(hDlgWnd, IDC_SCP_PATH, Param->ScpSendDirPtr);
105 if (!Param->ScpEnable) {
106 // ������
107 EnableWindow(GetDlgItem(hDlgWnd, IDC_SCP_RADIO), FALSE);
108 EnableWindow(GetDlgItem(hDlgWnd, IDC_SCP_PATH_LABEL), FALSE);
109 EnableWindow(GetDlgItem(hDlgWnd, IDC_SCP_PATH), FALSE);
110 EnableWindow(GetDlgItem(hDlgWnd, IDC_SCP_PATH_NOTE), FALSE);
111 }
112 SetEditboxEmacsKeybind(hDlgWnd, IDC_SCP_PATH);
113
114 // Send File
115 if (Param->SendfileBinary) {
116 SendMessage(GetDlgItem(hDlgWnd, IDC_BINARY_CHECK), BM_SETCHECK, BST_CHECKED, 0);
117 }
118 if (!Param->SendfileEnable) {
119 // ������
120 EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_RADIO), FALSE);
121 EnableWindow(GetDlgItem(hDlgWnd, IDC_BINARY_CHECK), FALSE);
122 }
123
124 // Paste Filename
125 if (Param->DropTypePaste & DROP_TYPE_PASTE_ESCAPE) {
126 SendMessage(GetDlgItem(hDlgWnd, IDC_ESCAPE_CHECK), BM_SETCHECK, BST_CHECKED, 0);
127 }
128 CheckRadioButton(hDlgWnd, IDC_SPACE_RADIO, IDC_NEWLINE_RADIO,
129 Param->DropTypePaste & DROP_TYPE_PASTE_NEWLINE?
130 IDC_NEWLINE_RADIO : IDC_SPACE_RADIO);
131 if (Param->RemaingFileCount < 2) {
132 EnableWindow(GetDlgItem(hDlgWnd, IDC_SPACE_RADIO), FALSE);
133 EnableWindow(GetDlgItem(hDlgWnd, IDC_NEWLINE_RADIO), FALSE);
134 }
135
136 // Do this for the next %d files
137 char orgmsg[MAX_UIMSG];
138 GetDlgItemTextA(hDlgWnd, IDC_SAME_PROCESS_CHECK, orgmsg, sizeof(orgmsg));
139 char uimsg[MAX_UIMSG];
140 _snprintf_s(uimsg, sizeof(uimsg), _TRUNCATE, orgmsg, Param->RemaingFileCount - 1);
141 SetDlgItemTextA(hDlgWnd, IDC_SAME_PROCESS_CHECK, uimsg);
142 if (Param->RemaingFileCount < 2) {
143 EnableWindow(GetDlgItem(hDlgWnd, IDC_SAME_PROCESS_CHECK), FALSE);
144 }
145
146 // Dont Show Dialog
147 if (Param->DoNotShowDialog) {
148 SendMessage(GetDlgItem(hDlgWnd, IDC_DONTSHOW_CHECK), BM_SETCHECK, BST_CHECKED, 0);
149 }
150 if (!Param->DoNotShowDialogEnable) {
151 EnableWindow(GetDlgItem(hDlgWnd, IDC_DONTSHOW_CHECK), FALSE);
152 EnableWindow(GetDlgItem(hDlgWnd, IDC_DAD_NOTE), FALSE);
153 }
154
155 // focus to "SCP dest textbox" or "Cancel"
156 {
157 int focus_id;
158 if (Param->DropType == DROP_TYPE_SCP) {
159 focus_id = IDC_SCP_PATH;
160 } else {
161 focus_id = IDCANCEL;
162 }
163 PostMessage(hDlgWnd, WM_NEXTDLGCTL,
164 (WPARAM)GetDlgItem(hDlgWnd, focus_id), TRUE);
165 }
166
167 CenterWindow(hDlgWnd, GetParent(hDlgWnd));
168 // TRUE���������{�^�����t�H�[�J�X�������������B
169 return FALSE;
170 }
171
172 case WM_COMMAND:
173 {
174 WORD wID = GET_WM_COMMAND_ID(wp, lp);
175 const WORD wCMD = GET_WM_COMMAND_CMD(wp, lp);
176 if (wCMD == BN_DBLCLK &&
177 (wID == IDC_SCP_RADIO || wID == IDC_SENDFILE_RADIO || wID == IDC_PASTE_RADIO))
178 { // radio buttons double click
179 wID = IDOK;
180 }
181 if (wCMD == EN_SETFOCUS && wID == IDC_SCP_PATH) {
182 CheckRadioButton(hDlgWnd, IDC_SCP_RADIO, IDC_PASTE_RADIO, IDC_SCP_RADIO);
183 }
184 if (wID == IDC_BINARY_CHECK) {
185 CheckRadioButton(hDlgWnd, IDC_SCP_RADIO, IDC_PASTE_RADIO, IDC_SENDFILE_RADIO);
186 }
187 if (wID == IDC_ESCAPE_CHECK ||
188 wID == IDC_SPACE_RADIO || wID == IDC_NEWLINE_RADIO)
189 {
190 CheckRadioButton(hDlgWnd, IDC_SCP_RADIO, IDC_PASTE_RADIO, IDC_PASTE_RADIO);
191 }
192 if (wID == IDOK) {
193 if (IsDlgButtonChecked(hDlgWnd, IDC_SCP_RADIO) == BST_CHECKED) {
194 // SCP
195 DlgData->Param->DropType = DROP_TYPE_SCP;
196 GetDlgItemTextA(hDlgWnd, IDC_SCP_PATH,
197 DlgData->Param->ScpSendDirPtr, DlgData->Param->ScpSendDirSize);
198 } else if (IsDlgButtonChecked(hDlgWnd, IDC_SENDFILE_RADIO) == BST_CHECKED) {
199 // Send File
200 DlgData->Param->DropType = DROP_TYPE_SEND_FILE;
201 DlgData->Param->SendfileBinary =
202 (IsDlgButtonChecked(hDlgWnd, IDC_BINARY_CHECK) == BST_CHECKED) ?
203 true : false;
204 } else /* if (IsDlgButtonChecked(hDlgWnd, IDC_PASTE_RADIO) == BST_CHECKED) */ {
205 // Paste Filename
206 DlgData->Param->DropType = DROP_TYPE_PASTE_FILENAME;
207 DlgData->Param->DropTypePaste = 0;
208 DlgData->Param->DropTypePaste |=
209 (IsDlgButtonChecked(hDlgWnd, IDC_ESCAPE_CHECK) == BST_CHECKED) ?
210 DROP_TYPE_PASTE_ESCAPE : 0;
211 DlgData->Param->DropTypePaste |=
212 (IsDlgButtonChecked(hDlgWnd, IDC_NEWLINE_RADIO) == BST_CHECKED) ?
213 DROP_TYPE_PASTE_NEWLINE : 0;
214 }
215 DlgData->Param->DoSameProcess =
216 (IsDlgButtonChecked(hDlgWnd, IDC_SAME_PROCESS_CHECK) == BST_CHECKED) ?
217 true : false;
218 DlgData->Param->DoSameProcessNextDrop =
219 (IsDlgButtonChecked(hDlgWnd, IDC_SAME_PROCESS_NEXTDROP_CHECK) == BST_CHECKED) ?
220 true : false;
221 DlgData->Param->DoNotShowDialog =
222 (IsDlgButtonChecked(hDlgWnd, IDC_DONTSHOW_CHECK) == BST_CHECKED) ?
223 true : false;
224 }
225 if (wID == IDCANCEL) {
226 DlgData->Param->DropType = DROP_TYPE_CANCEL;
227 }
228 if (wID == IDOK || wID == IDCANCEL) {
229 TTEndDialog(hDlgWnd, wID);
230 break;
231 }
232 return FALSE;
233 }
234 case WM_NCDESTROY:
235 free(DlgData);
236 break;
237
238 default:
239 return FALSE;
240 }
241 return TRUE;
242 }
243
244 enum drop_type ShowDropDialogBox(
245 HINSTANCE hInstance, HWND hWndParent,
246 const wchar_t *TargetFilename,
247 enum drop_type DefaultDropType,
248 int RemaingFileCount,
249 bool EnableSCP,
250 bool EnableSendFile,
251 bool *SendfileBinary,
252 TTTSet *pts,
253 unsigned char *DropTypePaste,
254 bool *DoSameProcess,
255 bool *DoSameProcessNextDrop,
256 bool *DoNotShowDialog)
257 {
258 DrapDropDlgParam Param;
259 Param.TargetFilename = TargetFilename;
260 Param.DropType = DefaultDropType;
261 Param.DropTypePaste = *DropTypePaste;
262 Param.ScpEnable = EnableSCP;
263 Param.SendfileEnable = EnableSendFile;
264 Param.SendfileBinary = *SendfileBinary;
265 Param.RemaingFileCount = RemaingFileCount;
266 Param.DoNotShowDialog = *DoNotShowDialog;
267 Param.DoNotShowDialogEnable = pts->ConfirmFileDragAndDrop ? false : true,
268 Param.ScpSendDirPtr = pts->ScpSendDir;
269 Param.ScpSendDirSize = _countof(pts->ScpSendDir);
270 Param.UILanguageFile = pts->UILanguageFile;
271
272 INT_PTR ret = TTDialogBoxParam(
273 hInstance, MAKEINTRESOURCE(IDD_DAD_DIALOG),
274 hWndParent, (DLGPROC)OnDragDropDlgProc,
275 (LPARAM)&Param);
276 if (ret != IDOK) {
277 return DROP_TYPE_CANCEL;
278 }
279 *DropTypePaste = Param.DropTypePaste;
280 *DoSameProcess = Param.DoSameProcess;
281 *DoSameProcessNextDrop = Param.DoSameProcessNextDrop;
282 *DoNotShowDialog = Param.DoNotShowDialog;
283 *SendfileBinary = Param.SendfileBinary;
284 return Param.DropType;
285 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26