Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ttcomtester/teraterm/teraterm/sendfiledlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9362 - (hide annotations) (download) (as text)
Sat Aug 14 14:43:37 2021 UTC (2 years, 7 months ago) by zmatsuo
Original Path: trunk/teraterm/teraterm/sendfiledlg.cpp
File MIME type: text/x-c++src
File size: 10727 byte(s)
hGetWindowTextW() を追加

- AllocControlTextW(), AllocControlTextA() を削除
1 zmatsuo 8618 /*
2 nmaya 9048 * (C) 2020- TeraTerm Project
3 zmatsuo 8618 * 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 zmatsuo 8588
29     #include <windows.h>
30     #include <stdio.h>
31     #define _CRTDBG_MAP_ALLOC
32     #include <stdlib.h>
33     #include <crtdbg.h>
34     #include <wchar.h>
35 zmatsuo 9324 #include <commctrl.h>
36 zmatsuo 8588
37     #include "i18n.h"
38     #include "tt_res.h"
39     #include "ttlib.h"
40     #include "dlglib.h"
41     #include "tttypes.h" // for WM_USER_DLGHELP2
42     #include "helpid.h"
43     #include "codeconv.h"
44 zmatsuo 8618 #include "asprintf.h"
45 zmatsuo 9362 #include "win32helper.h"
46 zmatsuo 8588
47     #include "sendfiledlg.h"
48    
49 zmatsuo 9147 typedef struct tagTipWinData {
50     HWND hDlg;
51     HWND hTip;
52     } TipWin2;
53    
54     static TipWin2 *TipWin2Create(HINSTANCE hInstance, HWND hDlg)
55     {
56     HINSTANCE hInst = hInstance;
57     if (hInstance == NULL) {
58     hInst = (HINSTANCE)GetWindowLongPtr(hDlg, GWLP_HINSTANCE);
59     }
60    
61     HWND hTip = CreateWindowExW(NULL, TOOLTIPS_CLASSW, NULL,
62     WS_POPUP |TTS_ALWAYSTIP | TTS_BALLOON,
63     CW_USEDEFAULT, CW_USEDEFAULT,
64     CW_USEDEFAULT, CW_USEDEFAULT,
65     hDlg, NULL,
66     hInst, NULL);
67     if (hTip == NULL) {
68     return NULL;
69     }
70     SendMessageW(hTip, TTM_SETMAXTIPWIDTH, 0, INT_MAX);
71    
72     TipWin2 *tWin = (TipWin2 *)calloc(sizeof(TipWin2), 1);
73     if (tWin == NULL) {
74     return NULL;
75     }
76     tWin->hTip = hTip;
77     tWin->hDlg = hDlg;
78    
79     return tWin;
80     }
81    
82     static void TipWin2Destroy(TipWin2 *tWin)
83     {
84     DestroyWindow(tWin->hTip);
85     tWin->hTip = NULL;
86     free(tWin);
87     }
88    
89     static BOOL TipWin2SetTextW(TipWin2 *tWin, int id, const wchar_t *text)
90     {
91     TOOLINFOW toolInfo = {};
92     toolInfo.cbSize = sizeof(toolInfo);
93     toolInfo.hwnd = tWin->hDlg;
94     toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS; // TTF_IDISHWND ��������rect���Q����������
95     toolInfo.uId = (UINT_PTR)GetDlgItem(tWin->hDlg, id);
96     toolInfo.lpszText = (LPWSTR)text; // text �� SendMessage() ������������������
97     SendMessageW(tWin->hTip, TTM_ADDTOOLW, 0, (LPARAM)&toolInfo);
98    
99     return TRUE;
100     }
101    
102 zmatsuo 9146 typedef struct {
103     sendfiledlgdata *create_param;
104     // work
105 zmatsuo 9147 TipWin2 *tip;
106 zmatsuo 9146 UINT MsgDlgHelp;
107     } SendFileDlgWork_t;
108 zmatsuo 8621
109 zmatsuo 8588 static INT_PTR CALLBACK SendFileDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
110     {
111     static const DlgTextInfo TextInfos[] = {
112     {0, "FILEDLG_TRANS_TITLE_SENDFILE"},
113     {IDC_SENDFILE_FILENAME_TITLE, "DLG_SENDFILE_FILENAME_TITLE"},
114     {IDC_SENDFILE_CHECK_BINARY, "DLG_FOPT_BINARY"},
115 zmatsuo 8621 {IDC_SENDFILE_DELAYTYPE_LABEL, "DLG_SENDFILE_DELAYTYPE_TITLE"},
116     {IDC_SENDFILE_SEND_SIZE_LABEL, "DLG_SENDFILE_SEND_SIZE_TITLE"},
117     {IDC_SENDFILE_DELAYTIME_LABEL, "DLG_SENDFILE_DELAYTIME_TITLE"},
118 zmatsuo 9147 {IDC_SENDFILE_CHECK_4, "DLG_SENDFILE_TERATERM4"},
119 zmatsuo 8588 {IDCANCEL, "BTN_CANCEL"},
120     {IDOK, "BTN_OK"},
121     };
122 zmatsuo 8621 static const I18nTextInfo delaytype_list[] = {
123 zmatsuo 8588 {"DLG_SENDFILE_DELAYTYPE_NO_DELAY", L"no delay"},
124     {"DLG_SENDFILE_DELAYTYPE_PER_CHAR", L"per charactor"},
125     {"DLG_SENDFILE_DELAYTYPE_PER_LINE", L"per line"},
126     {"DLG_SENDFILE_DELAYTYPE_PER_SENDSIZE", L"per sendsize"},
127     };
128     static const int send_size_list[] = {16, 256, 4 * 1024};
129 zmatsuo 9146 SendFileDlgWork_t *work = (SendFileDlgWork_t *)GetWindowLongPtr(hDlgWnd, DWLP_USER);
130     sendfiledlgdata *data = work != NULL ? work->create_param : NULL;
131 zmatsuo 8588
132     switch (msg) {
133 zmatsuo 9146 case WM_INITDIALOG: {
134     work = (SendFileDlgWork_t *)calloc(sizeof(*work), 1);
135     SetWindowLongPtr(hDlgWnd, DWLP_USER, (LONG_PTR)work);
136 zmatsuo 8588 data = (sendfiledlgdata *)lp;
137 zmatsuo 9146 work->create_param = data;
138     work->MsgDlgHelp = RegisterWindowMessage(HELPMSGSTRING);
139 zmatsuo 8588 ::DragAcceptFiles(hDlgWnd, TRUE);
140 zmatsuo 9359 SetDlgTextsW(hDlgWnd, TextInfos, _countof(TextInfos), data->UILanguageFileW);
141 zmatsuo 8588 CenterWindow(hDlgWnd, GetParent(hDlgWnd));
142    
143 zmatsuo 9359 SetI18nListW("Tera Term", hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN, delaytype_list, _countof(delaytype_list),
144     data->UILanguageFileW, 0);
145 zmatsuo 8588
146 zmatsuo 9146 for (size_t i = 0; i < _countof(send_size_list); i++) {
147 zmatsuo 8588 char buf[32];
148     sprintf(buf, "%d", send_size_list[i]);
149     SendDlgItemMessageA(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)buf);
150     }
151     SendDlgItemMessage(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN, CB_SETCURSEL, _countof(send_size_list) - 1, 0);
152    
153     SetDlgItemTextA(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT, "1");
154    
155     EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN), FALSE);
156     EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT), FALSE);
157    
158 zmatsuo 9147 TipWin2 *tip = TipWin2Create(NULL, hDlgWnd);
159     work->tip = tip;
160 zmatsuo 9359 wchar_t *text;
161     GetI18nStrWW("Tera Term", "DLG_SENDFILE_TERATERM4_TOOLTIP", NULL, data->UILanguageFileW, &text);
162 zmatsuo 9147 if (text != NULL) {
163     TipWin2SetTextW(tip, IDC_SENDFILE_CHECK_4, text);
164     free(text);
165     }
166     //TipWin2SetTextW(tip, IDC_SENDFILE_FILENAME_EDIT, L"�t�@�C������������"); // test
167     //TipWin2SetTextW(tip, IDC_SENDFILE_FILENAME_BUTTON, L"�t�@�C���I��"); // test
168    
169 zmatsuo 8588 return TRUE;
170 zmatsuo 9146 }
171 zmatsuo 9147 case WM_DESTROY: {
172     TipWin2Destroy(work->tip);
173     work->tip = NULL;
174     free(work);
175     return FALSE;
176     }
177 zmatsuo 8588 case WM_COMMAND:
178     switch (wp) {
179     case IDOK | (BN_CLICKED << 16): {
180 zmatsuo 9362 wchar_t *filename;
181     hGetWindowTextW(GetDlgItem(hDlgWnd, IDC_SENDFILE_FILENAME_EDIT), &filename);
182     const DWORD attr = GetFileAttributesW(filename);
183 zmatsuo 8588 if (attr == INVALID_FILE_ATTRIBUTES || attr & FILE_ATTRIBUTE_DIRECTORY) {
184 zmatsuo 8618 static const TTMessageBoxInfoW mbinfo = {
185     "Tera Term",
186     "MSG_TT_ERROR", L"Tera Term: Error",
187 zmatsuo 9342 "MSG_CANTOPEN_FILE_ERROR", L"Cannot open file",
188     MB_TASKMODAL | MB_ICONEXCLAMATION };
189 zmatsuo 9359 TTMessageBoxW(hDlgWnd, &mbinfo, data->UILanguageFileW);
190 zmatsuo 8588
191 zmatsuo 9362 free(filename);
192 zmatsuo 8588
193     PostMessage(hDlgWnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlgWnd, IDC_SENDFILE_FILENAME_EDIT),
194     TRUE);
195    
196     return TRUE;
197     }
198    
199 zmatsuo 9362 data->filename = filename;
200 zmatsuo 8588 data->binary =
201     SendMessage(GetDlgItem(hDlgWnd, IDC_SENDFILE_CHECK_BINARY), BM_GETCHECK, 0, 0) == BST_CHECKED
202     ? TRUE
203     : FALSE;
204     data->delay_type = (int)SendDlgItemMessage(hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN, CB_GETCURSEL, 0, 0);
205     data->delay_tick = GetDlgItemInt(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT, NULL, FALSE);
206     data->send_size = GetDlgItemInt(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN, NULL, FALSE);
207 zmatsuo 9146 data->method_4 = IsDlgButtonChecked(hDlgWnd, IDC_SENDFILE_CHECK_4);
208 zmatsuo 8588
209     TTEndDialog(hDlgWnd, IDOK);
210     return TRUE;
211     }
212    
213     case IDHELP | (BN_CLICKED << 16):
214     PostMessage(GetParent(hDlgWnd), WM_USER_DLGHELP2, HlpMenuFileSendfile, 0);
215     return TRUE;
216    
217     case IDCANCEL | (BN_CLICKED << 16):
218     data->filename = NULL;
219     TTEndDialog(hDlgWnd, IDCANCEL);
220     return TRUE;
221    
222     case IDC_SENDFILE_FILENAME_BUTTON | (BN_CLICKED << 16): {
223 zmatsuo 8618 wchar_t TempDir[MAX_PATH];
224 zmatsuo 9324 GetCurrentDirectoryW(_countof(TempDir), TempDir);
225 zmatsuo 8588
226 zmatsuo 9359 wchar_t *uimsg;
227     GetI18nStrWW("Tera Term", "FILEDLG_TRANS_TITLE_SENDFILE", L"Send file", data->UILanguageFileW, &uimsg);
228 zmatsuo 8618 wchar_t *title;
229     aswprintf(&title, L"Tera Term: %s", uimsg);
230     free(uimsg);
231     uimsg = NULL;
232 zmatsuo 8588
233 zmatsuo 8943 wchar_t *filterW = GetCommonDialogFilterW(data->filesend_filter, data->UILanguageFile);
234 zmatsuo 8618 wchar_t filename[MAX_PATH];
235 zmatsuo 8588 filename[0] = 0;
236 zmatsuo 8618 OPENFILENAMEW ofn = {};
237     ofn.lStructSize = get_OPENFILENAME_SIZEW();
238 zmatsuo 8588 ofn.hwndOwner = hDlgWnd;
239     ofn.lpstrFile = filename;
240     ofn.nMaxFile = MAX_PATH;
241 zmatsuo 8618 ofn.lpstrFilter = filterW;
242 zmatsuo 8588 ofn.nFilterIndex = 0;
243     ofn.lpstrTitle = title;
244     ofn.Flags = OFN_FILEMUSTEXIST | OFN_SHOWHELP | OFN_HIDEREADONLY;
245 zmatsuo 9324 BOOL Ok = GetOpenFileNameW(&ofn);
246 zmatsuo 8618 free(filterW);
247     free(title);
248 zmatsuo 8588
249 zmatsuo 9324 SetCurrentDirectoryW(TempDir);
250 zmatsuo 8588
251     if (Ok) {
252 zmatsuo 9324 SetDlgItemTextW(hDlgWnd, IDC_SENDFILE_FILENAME_EDIT, filename);
253 zmatsuo 8588 PostMessage(hDlgWnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlgWnd, IDOK), TRUE);
254     }
255    
256     return TRUE;
257     }
258    
259     case IDC_SENDFILE_DELAYTYPE_DROPDOWN | (CBN_SELCHANGE << 16): {
260     int sel = (int)SendDlgItemMessage(hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN, CB_GETCURSEL, 0, 0);
261     EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN), sel != 3 ? FALSE : TRUE);
262     EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT), sel == 0 ? FALSE : TRUE);
263     return TRUE;
264     }
265    
266     default:
267     return FALSE;
268     }
269    
270     case WM_DROPFILES: {
271     // �����h���b�v��������������1������������
272     HDROP hDrop = (HDROP)wp;
273 zmatsuo 9324 const UINT len = DragQueryFileW(hDrop, 0, NULL, 0);
274 zmatsuo 8588 if (len == 0) {
275     DragFinish(hDrop);
276     return TRUE;
277     }
278     wchar_t *filename = (wchar_t *)malloc(sizeof(wchar_t) * (len + 1));
279 zmatsuo 9324 DragQueryFileW(hDrop, 0, filename, len + 1);
280 zmatsuo 8588 filename[len] = '\0';
281 zmatsuo 9324 SetDlgItemTextW(hDlgWnd, IDC_SENDFILE_FILENAME_EDIT, filename);
282 zmatsuo 8588 SendDlgItemMessage(hDlgWnd, IDC_SENDFILE_FILENAME_EDIT, EM_SETSEL, len, len);
283     PostMessage(hDlgWnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlgWnd, IDOK), TRUE);
284    
285     free(filename);
286     DragFinish(hDrop);
287     return TRUE;
288     }
289     default:
290 zmatsuo 9146 if (work != NULL && msg == work->MsgDlgHelp) {
291 zmatsuo 8588 // �R�����_�C�A���O���w���v�{�^������������
292     PostMessage(GetParent(hDlgWnd), WM_USER_DLGHELP2, HlpMenuFileSendfile, 0);
293     return TRUE;
294     }
295     return FALSE;
296     }
297     }
298    
299     INT_PTR sendfiledlg(HINSTANCE hInstance, HWND hWndParent, sendfiledlgdata *data)
300     {
301     INT_PTR ret;
302 zmatsuo 9146 data->method_4 = FALSE;
303 zmatsuo 8588 ret = TTDialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_SENDFILEDLG), hWndParent, SendFileDlgProc, (LPARAM)data);
304     return ret;
305     }

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