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 9146 - (hide annotations) (download) (as text)
Sat Feb 6 05:44:30 2021 UTC (3 years, 2 months ago) by zmatsuo
Original Path: trunk/teraterm/teraterm/sendfiledlg.cpp
File MIME type: text/x-c++src
File size: 8663 byte(s)
ファイル送信を整理

- ファイル送信のUIを Tera Term 4 と 5 で追加した方法の2つから選択できるよう修正
  - 変更前はコードを変更する必要があった
- filesys.cpp からファイル選択ダイアログに関するコードを削除
  - sendfiledlg にまとめた
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    
36     #include "i18n.h"
37     #include "tt_res.h"
38     #include "ttlib.h"
39     #include "dlglib.h"
40     #include "layer_for_unicode.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 8588
46     #include "sendfiledlg.h"
47    
48 zmatsuo 9146 typedef struct {
49     sendfiledlgdata *create_param;
50     // work
51     UINT MsgDlgHelp;
52     } SendFileDlgWork_t;
53 zmatsuo 8621
54 zmatsuo 8588 static INT_PTR CALLBACK SendFileDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
55     {
56     static const DlgTextInfo TextInfos[] = {
57     {0, "FILEDLG_TRANS_TITLE_SENDFILE"},
58     {IDC_SENDFILE_FILENAME_TITLE, "DLG_SENDFILE_FILENAME_TITLE"},
59     {IDC_SENDFILE_CHECK_BINARY, "DLG_FOPT_BINARY"},
60 zmatsuo 8621 {IDC_SENDFILE_DELAYTYPE_LABEL, "DLG_SENDFILE_DELAYTYPE_TITLE"},
61     {IDC_SENDFILE_SEND_SIZE_LABEL, "DLG_SENDFILE_SEND_SIZE_TITLE"},
62     {IDC_SENDFILE_DELAYTIME_LABEL, "DLG_SENDFILE_DELAYTIME_TITLE"},
63 zmatsuo 8588 {IDCANCEL, "BTN_CANCEL"},
64     {IDOK, "BTN_OK"},
65     };
66 zmatsuo 8621 static const I18nTextInfo delaytype_list[] = {
67 zmatsuo 8588 {"DLG_SENDFILE_DELAYTYPE_NO_DELAY", L"no delay"},
68     {"DLG_SENDFILE_DELAYTYPE_PER_CHAR", L"per charactor"},
69     {"DLG_SENDFILE_DELAYTYPE_PER_LINE", L"per line"},
70     {"DLG_SENDFILE_DELAYTYPE_PER_SENDSIZE", L"per sendsize"},
71     };
72     static const int send_size_list[] = {16, 256, 4 * 1024};
73 zmatsuo 9146 SendFileDlgWork_t *work = (SendFileDlgWork_t *)GetWindowLongPtr(hDlgWnd, DWLP_USER);
74     sendfiledlgdata *data = work != NULL ? work->create_param : NULL;
75 zmatsuo 8588
76     switch (msg) {
77 zmatsuo 9146 case WM_INITDIALOG: {
78     work = (SendFileDlgWork_t *)calloc(sizeof(*work), 1);
79     SetWindowLongPtr(hDlgWnd, DWLP_USER, (LONG_PTR)work);
80 zmatsuo 8588 data = (sendfiledlgdata *)lp;
81 zmatsuo 9146 work->create_param = data;
82     work->MsgDlgHelp = RegisterWindowMessage(HELPMSGSTRING);
83 zmatsuo 8588 ::DragAcceptFiles(hDlgWnd, TRUE);
84     SetDlgTexts(hDlgWnd, TextInfos, _countof(TextInfos), data->UILanguageFile);
85     CenterWindow(hDlgWnd, GetParent(hDlgWnd));
86    
87 zmatsuo 8621 SetI18nList("TeraTerm", hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN, delaytype_list, _countof(delaytype_list),
88     data->UILanguageFile, 0);
89 zmatsuo 8588
90 zmatsuo 9146 for (size_t i = 0; i < _countof(send_size_list); i++) {
91 zmatsuo 8588 char buf[32];
92     sprintf(buf, "%d", send_size_list[i]);
93     SendDlgItemMessageA(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)buf);
94     }
95     SendDlgItemMessage(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN, CB_SETCURSEL, _countof(send_size_list) - 1, 0);
96    
97     SetDlgItemTextA(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT, "1");
98    
99     EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN), FALSE);
100     EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT), FALSE);
101    
102     return TRUE;
103 zmatsuo 9146 }
104 zmatsuo 8588 case WM_COMMAND:
105     switch (wp) {
106     case IDOK | (BN_CLICKED << 16): {
107 zmatsuo 8618 wchar_t *strW = AllocControlTextW(GetDlgItem(hDlgWnd, IDC_SENDFILE_FILENAME_EDIT));
108 zmatsuo 8588
109     const DWORD attr = _GetFileAttributesW(strW);
110     if (attr == INVALID_FILE_ATTRIBUTES || attr & FILE_ATTRIBUTE_DIRECTORY) {
111 zmatsuo 8618 static const TTMessageBoxInfoW mbinfo = {
112     "Tera Term",
113     "MSG_TT_ERROR", L"Tera Term: Error",
114     "MSG_CANTOPEN_FILE_ERROR", L"Cannot open file" };
115     TTMessageBoxW(hDlgWnd, &mbinfo, MB_TASKMODAL | MB_ICONEXCLAMATION, data->UILanguageFile);
116 zmatsuo 8588
117     free(strW);
118    
119     PostMessage(hDlgWnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlgWnd, IDC_SENDFILE_FILENAME_EDIT),
120     TRUE);
121    
122     return TRUE;
123     }
124    
125     data->filename = strW;
126     data->binary =
127     SendMessage(GetDlgItem(hDlgWnd, IDC_SENDFILE_CHECK_BINARY), BM_GETCHECK, 0, 0) == BST_CHECKED
128     ? TRUE
129     : FALSE;
130     data->delay_type = (int)SendDlgItemMessage(hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN, CB_GETCURSEL, 0, 0);
131     data->delay_tick = GetDlgItemInt(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT, NULL, FALSE);
132     data->send_size = GetDlgItemInt(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN, NULL, FALSE);
133 zmatsuo 9146 data->method_4 = IsDlgButtonChecked(hDlgWnd, IDC_SENDFILE_CHECK_4);
134 zmatsuo 8588
135     TTEndDialog(hDlgWnd, IDOK);
136     return TRUE;
137     }
138    
139     case IDHELP | (BN_CLICKED << 16):
140     PostMessage(GetParent(hDlgWnd), WM_USER_DLGHELP2, HlpMenuFileSendfile, 0);
141     return TRUE;
142    
143     case IDCANCEL | (BN_CLICKED << 16):
144     data->filename = NULL;
145     TTEndDialog(hDlgWnd, IDCANCEL);
146     return TRUE;
147    
148     case IDC_SENDFILE_FILENAME_BUTTON | (BN_CLICKED << 16): {
149 zmatsuo 8618 wchar_t TempDir[MAX_PATH];
150     _GetCurrentDirectoryW(_countof(TempDir), TempDir);
151 zmatsuo 8588
152 zmatsuo 9146 wchar_t *uimsg = TTGetLangStrW("Tera Term", "FILEDLG_TRANS_TITLE_SENDFILE", L"Send file", data->UILanguageFile);
153 zmatsuo 8618 wchar_t *title;
154     aswprintf(&title, L"Tera Term: %s", uimsg);
155     free(uimsg);
156     uimsg = NULL;
157 zmatsuo 8588
158 zmatsuo 8943 wchar_t *filterW = GetCommonDialogFilterW(data->filesend_filter, data->UILanguageFile);
159 zmatsuo 8618 wchar_t filename[MAX_PATH];
160 zmatsuo 8588 filename[0] = 0;
161 zmatsuo 8618 OPENFILENAMEW ofn = {};
162     ofn.lStructSize = get_OPENFILENAME_SIZEW();
163 zmatsuo 8588 ofn.hwndOwner = hDlgWnd;
164     ofn.lpstrFile = filename;
165     ofn.nMaxFile = MAX_PATH;
166 zmatsuo 8618 ofn.lpstrFilter = filterW;
167 zmatsuo 8588 ofn.nFilterIndex = 0;
168     ofn.lpstrTitle = title;
169     ofn.Flags = OFN_FILEMUSTEXIST | OFN_SHOWHELP | OFN_HIDEREADONLY;
170 zmatsuo 8618 BOOL Ok = _GetOpenFileNameW(&ofn);
171     free(filterW);
172     free(title);
173 zmatsuo 8588
174 zmatsuo 8618 _SetCurrentDirectoryW(TempDir);
175 zmatsuo 8588
176     if (Ok) {
177 zmatsuo 8618 _SetDlgItemTextW(hDlgWnd, IDC_SENDFILE_FILENAME_EDIT, filename);
178 zmatsuo 8588 PostMessage(hDlgWnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlgWnd, IDOK), TRUE);
179     }
180    
181     return TRUE;
182     }
183    
184     case IDC_SENDFILE_DELAYTYPE_DROPDOWN | (CBN_SELCHANGE << 16): {
185     int sel = (int)SendDlgItemMessage(hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN, CB_GETCURSEL, 0, 0);
186     EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN), sel != 3 ? FALSE : TRUE);
187     EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT), sel == 0 ? FALSE : TRUE);
188     return TRUE;
189     }
190    
191     default:
192     return FALSE;
193     }
194    
195     case WM_DROPFILES: {
196     // �����h���b�v��������������1������������
197     HDROP hDrop = (HDROP)wp;
198     const UINT len = _DragQueryFileW(hDrop, 0, NULL, 0);
199     if (len == 0) {
200     DragFinish(hDrop);
201     return TRUE;
202     }
203     wchar_t *filename = (wchar_t *)malloc(sizeof(wchar_t) * (len + 1));
204     _DragQueryFileW(hDrop, 0, filename, len + 1);
205     filename[len] = '\0';
206     _SetDlgItemTextW(hDlgWnd, IDC_SENDFILE_FILENAME_EDIT, filename);
207     SendDlgItemMessage(hDlgWnd, IDC_SENDFILE_FILENAME_EDIT, EM_SETSEL, len, len);
208     PostMessage(hDlgWnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlgWnd, IDOK), TRUE);
209    
210     free(filename);
211     DragFinish(hDrop);
212     return TRUE;
213     }
214     default:
215 zmatsuo 9146 if (work != NULL && msg == work->MsgDlgHelp) {
216 zmatsuo 8588 // �R�����_�C�A���O���w���v�{�^������������
217     PostMessage(GetParent(hDlgWnd), WM_USER_DLGHELP2, HlpMenuFileSendfile, 0);
218     return TRUE;
219     }
220     return FALSE;
221     }
222     }
223    
224     INT_PTR sendfiledlg(HINSTANCE hInstance, HWND hWndParent, sendfiledlgdata *data)
225     {
226     INT_PTR ret;
227 zmatsuo 9146 data->method_4 = FALSE;
228 zmatsuo 8588 ret = TTDialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_SENDFILEDLG), hWndParent, SendFileDlgProc, (LPARAM)data);
229     return ret;
230     }

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