Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/teraterm/teraterm/dnddlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 7172 - (hide annotations) (download) (as text)
Sun Aug 5 10:49:00 2018 UTC (5 years, 8 months ago) by zmatsuo
File MIME type: text/x-c++src
File size: 11535 byte(s)
teraterm/common/dlglib.c,h dnddlgからSetDlgTexts()を移動
teraterm/common/ttftypes.h,tttypes.h に #pragma once 追加
teraterm/teraterm/dnddlg.cpp,vtwin 引数修正
teraterm/teraterm/dnddlg.cpp データ収納をGWLP_USERDATAからDWLP_USERに変更

1 zmatsuo 7145 /*
2     * (C) 2005-2018 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 zmatsuo 7157 /* TERATERM.EXE, drag and drop dialog */
30 zmatsuo 7145 #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 char *TargetFilename;
43     enum drop_type DropType;
44     unsigned char DropTypePaste;
45     bool ScpEnable;
46     char *ScpSendDirPtr;
47     int ScpSendDirSize;
48     bool SendfileEnable;
49     bool PasteNewlineEnable;
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     HFONT hPrevFont;
60     DrapDropDlgParam *Param;
61     };
62    
63     static HFONT SetDlgFonts(HWND hDlg, const int nIDDlgItems[], int nIDDlgItemCount, const char *UILanguageFile, PCHAR key)
64     {
65     if (key == NULL) key = "DLG_TAHOMA_FONT";
66     HFONT hPrevFont = (HFONT)SendMessage(hDlg, WM_GETFONT, 0, 0);
67     LOGFONT logfont;
68     GetObject(hPrevFont, sizeof(LOGFONT), &logfont);
69     HFONT hNewFont;
70     if (get_lang_font("DLG_TAHOMA_FONT", hDlg, &logfont, &hNewFont, UILanguageFile)) {
71     for (int i = 0 ; i < nIDDlgItemCount ; i++) {
72     const int nIDDlgItem = nIDDlgItems[i];
73     SendDlgItemMessage(hDlg, nIDDlgItem, WM_SETFONT, (WPARAM)hNewFont, MAKELPARAM(TRUE,0));
74     }
75     }
76     return hNewFont;
77     }
78    
79     static LRESULT CALLBACK OnDragDropDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
80     {
81     static const int FontIDs[] = {
82     IDC_FILENAME_EDIT,
83     IDC_DAD_STATIC,
84     IDC_SCP_RADIO, IDC_SENDFILE_RADIO, IDC_PASTE_RADIO,
85     IDC_SCP_PATH_LABEL, IDC_SCP_PATH, IDC_SCP_PATH_NOTE,
86     IDC_BINARY_CHECK,
87     IDC_ESCAPE_CHECK, IDC_NEWLINE_RADIO, IDC_SPACE_RADIO,
88     IDC_SAME_PROCESS_CHECK, IDC_SAME_PROCESS_NEXTDROP_CHECK, IDC_DONTSHOW_CHECK,
89     IDC_DAD_NOTE,
90     IDOK, IDCANCEL,
91     };
92     static const DlgTextInfo TextInfos[] = {
93     { 0, "DLG_DANDD_TITLE" },
94     { IDC_DAD_STATIC, "DLG_DANDD_TEXT" },
95 zmatsuo 7157 { IDC_SCP_RADIO, "DLG_DANDD_SCP_RADIO" },
96     { IDC_SENDFILE_RADIO, "DLG_DANDD_SENDFILE_RADIO" },
97     { IDC_PASTE_RADIO, "DLG_DANDD_PASTE_RADIO" },
98     { IDC_SCP_PATH_LABEL, "DLG_DANDD_SCP_DEST_LABEL" },
99     { IDC_SCP_PATH_NOTE, "DLG_DANDD_SCP_DEST_NOTE" },
100     { IDC_BINARY_CHECK, "DLG_DANDD_SEND_BINARY_CHECK" },
101     { IDC_ESCAPE_CHECK, "DLG_DANDD_PASTE_ESCAPE_CHECK" },
102     { IDC_SPACE_RADIO, "DLG_DANDD_PASTE_SPACE_RADIO" },
103     { IDC_NEWLINE_RADIO, "DLG_DANDD_PASTE_NEWLINE_RADIO" },
104 zmatsuo 7145 { IDC_SAME_PROCESS_CHECK, "DLG_DANDD_CONFLICTS" },
105     { IDC_SAME_PROCESS_NEXTDROP_CHECK, "DLG_DANDD_SAME_NEEXTDROP" },
106     { IDC_DONTSHOW_CHECK, "DLG_DANDD_DONTSHOW_NEEXTDROP" },
107     { IDC_DAD_NOTE, "DLG_DANDD_NOTE" },
108     { IDOK, "BTN_OK" },
109     { IDCANCEL, "BTN_CANCEL" },
110     };
111 zmatsuo 7172 DrapDropDlgData *DlgData = (DrapDropDlgData *)GetWindowLongPtr(hDlgWnd, DWLP_USER);
112 zmatsuo 7145
113     switch (msg) {
114     case WM_INITDIALOG:
115     {
116     DlgData = (DrapDropDlgData *)malloc(sizeof(DrapDropDlgData));
117 zmatsuo 7172 SetWindowLongPtr(hDlgWnd, DWLP_USER, (LONG_PTR)DlgData);
118 zmatsuo 7145 DrapDropDlgParam *Param = (DrapDropDlgParam *)lp;
119     DlgData->Param = Param;
120     DlgData->hPrevFont = SetDlgFonts(hDlgWnd, FontIDs, _countof(FontIDs), Param->UILanguageFile, NULL);
121     SetDlgTexts(hDlgWnd, TextInfos, _countof(TextInfos), Param->UILanguageFile);
122    
123     // target file
124     SetDlgItemText(hDlgWnd, IDC_FILENAME_EDIT, Param->TargetFilename);
125    
126     // checkbox
127     CheckRadioButton(hDlgWnd, IDC_SCP_RADIO, IDC_PASTE_RADIO,
128     (Param->DropType == DROP_TYPE_SEND_FILE ||
129     Param->DropType == DROP_TYPE_SEND_FILE_BINARY) ? IDC_SENDFILE_RADIO :
130     Param->DropType == DROP_TYPE_PASTE_FILENAME ? IDC_PASTE_RADIO :
131     IDC_SCP_RADIO);
132    
133     // SCP
134     SendMessage(GetDlgItem(hDlgWnd, IDC_SCP_PATH), WM_SETTEXT, 0, (LPARAM)Param->ScpSendDirPtr);
135     if (!Param->ScpEnable) {
136     // 無効化
137     EnableWindow(GetDlgItem(hDlgWnd, IDC_SCP_RADIO), FALSE);
138     EnableWindow(GetDlgItem(hDlgWnd, IDC_SCP_PATH_LABEL), FALSE);
139     EnableWindow(GetDlgItem(hDlgWnd, IDC_SCP_PATH), FALSE);
140     EnableWindow(GetDlgItem(hDlgWnd, IDC_SCP_PATH_NOTE), FALSE);
141     }
142 zmatsuo 7158 SetEditboxSubclass(hDlgWnd, IDC_SCP_PATH, FALSE);
143 zmatsuo 7145
144     // Send File
145     if (Param->DropType == DROP_TYPE_SEND_FILE_BINARY) {
146     SendMessage(GetDlgItem(hDlgWnd, IDC_BINARY_CHECK), BM_SETCHECK, BST_CHECKED, 0);
147     }
148     if (!Param->SendfileEnable) {
149     // 無効化
150     EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_RADIO), FALSE);
151     EnableWindow(GetDlgItem(hDlgWnd, IDC_BINARY_CHECK), FALSE);
152     }
153    
154     // Paste Filename
155     if (Param->DropTypePaste & DROP_TYPE_PASTE_ESCAPE) {
156     SendMessage(GetDlgItem(hDlgWnd, IDC_ESCAPE_CHECK), BM_SETCHECK, BST_CHECKED, 0);
157     }
158     CheckRadioButton(hDlgWnd, IDC_SPACE_RADIO, IDC_NEWLINE_RADIO,
159     Param->DropTypePaste & DROP_TYPE_PASTE_NEWLINE?
160     IDC_NEWLINE_RADIO : IDC_SPACE_RADIO);
161     if (Param->RemaingFileCount < 2) {
162     EnableWindow(GetDlgItem(hDlgWnd, IDC_SPACE_RADIO), FALSE);
163     EnableWindow(GetDlgItem(hDlgWnd, IDC_NEWLINE_RADIO), FALSE);
164     }
165    
166     // Do this for the next %d conflicts
167     char orgmsg[MAX_UIMSG];
168     GetDlgItemText(hDlgWnd, IDC_SAME_PROCESS_CHECK, orgmsg, sizeof(orgmsg));
169     char uimsg[MAX_UIMSG];
170     _snprintf_s(uimsg, sizeof(uimsg), _TRUNCATE, orgmsg, Param->RemaingFileCount - 1);
171     SetDlgItemText(hDlgWnd, IDC_SAME_PROCESS_CHECK, uimsg);
172     if (Param->RemaingFileCount < 2) {
173     EnableWindow(GetDlgItem(hDlgWnd, IDC_SAME_PROCESS_CHECK), FALSE);
174     }
175    
176     // Dont Show Dialog
177     if (Param->DoNotShowDialog) {
178     SendMessage(GetDlgItem(hDlgWnd, IDC_DONTSHOW_CHECK), BM_SETCHECK, BST_CHECKED, 0);
179     }
180     if (!Param->DoNotShowDialogEnable) {
181     EnableWindow(GetDlgItem(hDlgWnd, IDC_DONTSHOW_CHECK), FALSE);
182     EnableWindow(GetDlgItem(hDlgWnd, IDC_DAD_NOTE), FALSE);
183     }
184    
185     // focus to "SCP dest textbox" or "Cancel"
186     if (Param->ScpEnable) {
187     // "SCP" 有効時は Cancel にフォーカスを当て、最終的に SCP PATH にフォーカスが
188     // 当たるようにする。
189     SetFocus(GetDlgItem(hDlgWnd, IDC_SCP_RADIO));
190     } else {
191     // フォーカスの初期状態を Cancel にする為、この時点では IDOK に
192     // フォーカスを当てる。後で WM_NEXTDLGCTL でフォーカスが次のボタンになる。
193     SetFocus(GetDlgItem(hDlgWnd, IDOK));
194     }
195     // フォーカスを次のボタンに移す
196     // SetFocus() で直接フォーカスを当てるとタブキーの動作等に問題が出るため、
197     // このメッセージを併用する
198     PostMessage(hDlgWnd, WM_NEXTDLGCTL, 0, 0L);
199    
200     // TRUEにするとボタンにフォーカスが当たらない。
201     return FALSE;
202     }
203    
204     case WM_COMMAND:
205     {
206     WORD wID = GET_WM_COMMAND_ID(wp, lp);
207     const WORD wCMD = GET_WM_COMMAND_CMD(wp, lp);
208     if (wCMD == BN_DBLCLK &&
209     (wID == IDC_SCP_RADIO || wID == IDC_SENDFILE_RADIO || wID == IDC_PASTE_RADIO))
210     { // radio buttons double click
211     wID = IDOK;
212     }
213     if (wCMD == EN_SETFOCUS && wID == IDC_SCP_PATH) {
214     CheckRadioButton(hDlgWnd, IDC_SCP_RADIO, IDC_PASTE_RADIO, IDC_SCP_RADIO);
215     }
216     if (wID == IDC_BINARY_CHECK) {
217     CheckRadioButton(hDlgWnd, IDC_SCP_RADIO, IDC_PASTE_RADIO, IDC_SENDFILE_RADIO);
218     }
219     if (wID == IDC_ESCAPE_CHECK ||
220     wID == IDC_SPACE_RADIO || wID == IDC_NEWLINE_RADIO)
221     {
222     CheckRadioButton(hDlgWnd, IDC_SCP_RADIO, IDC_PASTE_RADIO, IDC_PASTE_RADIO);
223     }
224     if (wID == IDOK) {
225     if (IsDlgButtonChecked(hDlgWnd, IDC_SCP_RADIO) == BST_CHECKED) {
226     // SCP
227     DlgData->Param->DropType = DROP_TYPE_SCP;
228     SendMessage(GetDlgItem(hDlgWnd, IDC_SCP_PATH), WM_GETTEXT,
229     (WPARAM)DlgData->Param->ScpSendDirSize,
230     (LPARAM)DlgData->Param->ScpSendDirPtr);
231     } else if (IsDlgButtonChecked(hDlgWnd, IDC_SENDFILE_RADIO) == BST_CHECKED) {
232     // Send File
233     DlgData->Param->DropType =
234     (IsDlgButtonChecked(hDlgWnd, IDC_BINARY_CHECK) == BST_CHECKED) ?
235     DROP_TYPE_SEND_FILE_BINARY : DROP_TYPE_SEND_FILE;
236     } else /* if (IsDlgButtonChecked(hDlgWnd, IDC_PASTE_RADIO) == BST_CHECKED) */ {
237     // Paste Filename
238     DlgData->Param->DropType = DROP_TYPE_PASTE_FILENAME;
239     DlgData->Param->DropTypePaste = 0;
240     DlgData->Param->DropTypePaste |=
241     (IsDlgButtonChecked(hDlgWnd, IDC_ESCAPE_CHECK) == BST_CHECKED) ?
242     DROP_TYPE_PASTE_ESCAPE : 0;
243     DlgData->Param->DropTypePaste |=
244     (IsDlgButtonChecked(hDlgWnd, IDC_NEWLINE_RADIO) == BST_CHECKED) ?
245     DROP_TYPE_PASTE_NEWLINE : 0;
246     }
247     DlgData->Param->DoSameProcess =
248     (IsDlgButtonChecked(hDlgWnd, IDC_SAME_PROCESS_CHECK) == BST_CHECKED) ?
249     true : false;
250     DlgData->Param->DoSameProcessNextDrop =
251     (IsDlgButtonChecked(hDlgWnd, IDC_SAME_PROCESS_NEXTDROP_CHECK) == BST_CHECKED) ?
252     true : false;
253     DlgData->Param->DoNotShowDialog =
254     (IsDlgButtonChecked(hDlgWnd, IDC_DONTSHOW_CHECK) == BST_CHECKED) ?
255     true : false;
256     }
257     if (wID == IDCANCEL) {
258     DlgData->Param->DropType = DROP_TYPE_CANCEL;
259     }
260     if (wID == IDOK || wID == IDCANCEL) {
261     if (DlgData->hPrevFont != NULL) {
262     DeleteObject(DlgData->hPrevFont);
263     }
264     EndDialog(hDlgWnd, wID);
265     free(DlgData);
266     break;
267     }
268     return FALSE;
269     }
270    
271     default:
272     return FALSE;
273     }
274     return TRUE;
275     }
276    
277     enum drop_type ShowDropDialogBox(
278     HINSTANCE hInstance, HWND hWndParent,
279     const char *TargetFilename,
280     enum drop_type DefaultDropType,
281     int RemaingFileCount,
282     bool EnableSCP,
283     bool EnableSendFile,
284 zmatsuo 7172 TTTSet *pts,
285 zmatsuo 7145 unsigned char *DropTypePaste,
286     bool *DoSameProcess,
287     bool *DoSameProcessNextDrop,
288     bool *DoNotShowDialog)
289     {
290     DrapDropDlgParam Param;
291     Param.TargetFilename = TargetFilename;
292     Param.DropType = DefaultDropType;
293     Param.DropTypePaste = *DropTypePaste;
294     Param.ScpEnable = EnableSCP;
295     Param.SendfileEnable = EnableSendFile;
296     Param.PasteNewlineEnable = true;
297     Param.RemaingFileCount = RemaingFileCount;
298     Param.DoNotShowDialog = *DoNotShowDialog;
299 zmatsuo 7172 Param.DoNotShowDialogEnable = pts->ConfirmFileDragAndDrop ? false : true,
300     Param.ScpSendDirPtr = pts->ScpSendDir;
301     Param.ScpSendDirSize = _countof(pts->ScpSendDir);
302     Param.UILanguageFile = pts->UILanguageFile;
303    
304 zmatsuo 7145 int ret = DialogBoxParam(
305     hInstance, MAKEINTRESOURCE(IDD_DAD_DIALOG),
306     hWndParent, (DLGPROC)OnDragDropDlgProc,
307     (LPARAM)&Param);
308     if (ret != IDOK) {
309     return DROP_TYPE_CANCEL;
310     }
311     *DropTypePaste = Param.DropTypePaste;
312     *DoSameProcess = Param.DoSameProcess;
313     *DoSameProcessNextDrop = Param.DoSameProcessNextDrop;
314     *DoNotShowDialog = Param.DoNotShowDialog;
315     return Param.DropType;
316     }

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