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 7158 - (hide annotations) (download) (as text)
Wed Jul 18 14:33:38 2018 UTC (5 years, 8 months ago) by zmatsuo
File MIME type: text/x-c++src
File size: 12127 byte(s)
drap and drop dialog の editbox で CTRL+f,b などが使えるようにした
- combobox、editboxで CTRL+f,b を簡単に利用できるようにした
- プロジェクトの依存関係調整

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

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