Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10332 - (hide annotations) (download) (as text)
Sun Oct 23 15:16:14 2022 UTC (17 months, 2 weeks ago) by zmatsuo
Original Path: trunk/teraterm/teraterm/themedlg.cpp
File MIME type: text/x-c++src
File size: 27207 byte(s)
テーマファイルの扱いをUnicode化

- UnicodeAPIを使用するよう修正
- 背景テーマのセクション名を "BG theme" へ変更
  - "BG" セクションも読み込める
- TODO
  - MAX_PATHが残っている
1 zmatsuo 10134 /*
2     * Copyright (C) 1994-1998 T. Teranishi
3     * (C) 2022- TeraTerm Project
4     * All rights reserved.
5     *
6     * Redistribution and use in source and binary forms, with or without
7     * modification, are permitted provided that the following conditions
8     * are met:
9     *
10     * 1. Redistributions of source code must retain the above copyright
11     * notice, this list of conditions and the following disclaimer.
12     * 2. Redistributions in binary form must reproduce the above copyright
13     * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the distribution.
15     * 3. The name of the author may not be used to endorse or promote products
16     * derived from this software without specific prior written permission.
17     *
18     * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28     */
29    
30     #include "teraterm.h"
31     #include "tttypes.h"
32    
33     #include "ttcommon.h"
34     #include "ttdialog.h"
35     #include "commlib.h"
36     #include "ttlib.h"
37     #include "dlglib.h"
38    
39     #include <stdio.h>
40     #define _CRTDBG_MAP_ALLOC
41     #include <stdlib.h>
42     #include <crtdbg.h>
43     #include <string.h>
44     #include <assert.h>
45    
46     #include <shlobj.h>
47     #include <windows.h>
48     #include <wchar.h>
49     #include <htmlhelp.h>
50    
51     #include "compat_win.h"
52     #include "codeconv.h"
53     #include "asprintf.h"
54     #include "win32helper.h"
55     #include "tipwin2.h"
56     #include "dlglib.h"
57     #include "helpid.h"
58     #include "vtdisp.h"
59     #include "tmfc.h"
60     #include "tmfc_propdlg.h"
61    
62 zmatsuo 10256 #include "theme.h"
63 zmatsuo 10134 #include "themedlg_res.h"
64     #include "themedlg.h"
65    
66     typedef struct {
67     // ����
68     HINSTANCE hInst;
69     TComVar *pcv;
70     TTTSet *pts;
71     DLGTEMPLATE *dlg_templ;
72     TipWin2 *tipwin;
73     HWND hVTWin;
74     // file tab
75     struct {
76     DLGTEMPLATE *dlg_templ;
77     } FileTab;
78     // bg theme tab
79     BGTheme bg_theme;
80     struct {
81     DLGTEMPLATE *dlg_templ;
82     TipWin2 *tipwin;
83     BGTheme bg_theme;
84     } BGTab;
85     // color theme tab
86     struct {
87     TColorTheme color_theme;
88     } color_tab;
89     struct {
90     BGTheme bg_theme;
91     TColorTheme color_theme;
92     } backup;
93     } ThemeDlgData;
94    
95     static void SetWindowTextColor(HWND hWnd, COLORREF color)
96     {
97     char str[32];
98 zmatsuo 10256 sprintf_s(str, "%02x%02x%02x", GetRValue(color), GetGValue(color), GetBValue(color));
99 zmatsuo 10134 SetWindowTextA(hWnd, str);
100     }
101    
102     static void SetDlgItemTextColor(HWND hDlg, int ID, COLORREF color)
103     {
104     SetWindowTextColor(GetDlgItem(hDlg, ID), color);
105     }
106    
107     static COLORREF GetWindowTextColor(HWND hWnd)
108     {
109     char str[32];
110     unsigned int r, g, b;
111     char elem[3];
112    
113     GetWindowTextA(hWnd, str, _countof(str));
114    
115     memcpy(elem, &str[0], 2);
116     elem[2] = 0;
117     r = 0;
118 zmatsuo 10256 sscanf_s(elem, "%x", &r);
119 zmatsuo 10134
120     memcpy(elem, &str[2], 2);
121     elem[2] = 0;
122     g = 0;
123 zmatsuo 10256 sscanf_s(elem, "%x", &g);
124 zmatsuo 10134
125     memcpy(elem, &str[4], 2);
126     elem[2] = 0;
127     b = 0;
128 zmatsuo 10256 sscanf_s(elem, "%x", &b);
129 zmatsuo 10134
130     return RGB(r, g, b);
131     }
132    
133     static COLORREF GetDlgItemTextColor(HWND hDlg, int ID)
134     {
135     return GetWindowTextColor(GetDlgItem(hDlg, ID));
136     }
137    
138     static void ResetControls(HWND hWnd, const BGTheme *bg_theme)
139     {
140 zmatsuo 10256 BOOL bg_enable = (bg_theme->BGDest.type == BG_PICTURE && (bg_theme->BGDest.file != NULL && bg_theme->BGDest.file[0] != 0)) ? TRUE : FALSE;
141     SendDlgItemMessageA(hWnd, IDC_BGIMG_CHECK, BM_SETCHECK, bg_enable, 0);
142 zmatsuo 10332 SetDlgItemTextW(hWnd, IDC_BGIMG_EDIT, bg_theme->BGDest.file);
143 zmatsuo 10134 SetDlgItemTextColor(hWnd, IDC_BGIMG_COLOR_EDIT, bg_theme->BGDest.color);
144     {
145     LRESULT count = SendDlgItemMessageA(hWnd, IDC_BGIMG_COMBO, CB_GETCOUNT, 0, 0);
146     int sel = 0;
147     int i;
148     for (i = 0; i < count; i++) {
149     BG_PATTERN pattern = (BG_PATTERN)SendDlgItemMessageW(hWnd, IDC_BGIMG_COMBO, CB_GETITEMDATA, i, 0);
150     if (pattern == bg_theme->BGDest.pattern) {
151     sel = i;
152     break;
153     }
154     }
155 zmatsuo 10188 SendDlgItemMessageA(hWnd, IDC_BGIMG_COMBO, CB_SETCURSEL, sel, 0);
156 zmatsuo 10134 }
157    
158 zmatsuo 10188 SendDlgItemMessageA(hWnd, IDC_WALLPAPER_CHECK, BM_SETCHECK, bg_theme->BGSrc1.alpha != 0, 0);
159 zmatsuo 10134 SetDlgItemInt(hWnd, IDC_WALLPAPER_ALPHA_EDIT, bg_theme->BGSrc1.alpha, FALSE);
160    
161 zmatsuo 10188 SendDlgItemMessageA(hWnd, IDC_SIMPLE_COLOR_PLANE_CHECK, BM_SETCHECK, bg_theme->BGSrc2.alpha != 0, 0);
162 zmatsuo 10134 SetDlgItemInt(hWnd, IDC_SIMPLE_COLOR_PLANE_ALPHA, bg_theme->BGSrc2.alpha, FALSE);
163     SetDlgItemTextColor(hWnd, IDC_SIMPLE_COLOR_PLANE_COLOR, bg_theme->BGSrc2.color);
164 zmatsuo 10188
165     SendDlgItemMessageA(hWnd, IDC_REVERSE_TEXT_ALPHA_SLIDER, TBM_SETPOS, TRUE, bg_theme->BGReverseTextAlpha);
166 zmatsuo 10134 }
167    
168     static void ReadFromDialog(HWND hWnd, BGTheme* bg_theme)
169     {
170     LRESULT checked;
171     LRESULT index;
172     checked = SendDlgItemMessageA(hWnd, IDC_BGIMG_CHECK, BM_GETCHECK, 0, 0);
173     bg_theme->BGDest.type = checked & BST_CHECKED ? BG_PICTURE : BG_NONE;
174 zmatsuo 10332 GetDlgItemTextW(hWnd, IDC_BGIMG_EDIT, bg_theme->BGDest.file, _countof(bg_theme->BGDest.file));
175 zmatsuo 10134 bg_theme->BGDest.color = GetDlgItemTextColor(hWnd, IDC_BGIMG_COLOR_EDIT);
176 zmatsuo 10188 index = SendDlgItemMessageA(hWnd, IDC_BGIMG_COMBO, CB_GETCURSEL, 0, 0);
177     bg_theme->BGDest.pattern = (BG_PATTERN)SendDlgItemMessageA(hWnd, IDC_BGIMG_COMBO, CB_GETITEMDATA, index, 0);
178 zmatsuo 10134
179     checked = SendDlgItemMessageA(hWnd, IDC_WALLPAPER_CHECK, BM_GETCHECK, 0, 0);
180     if (checked & BST_CHECKED) {
181     bg_theme->BGSrc1.type = BG_WALLPAPER;
182     bg_theme->BGSrc1.alpha = GetDlgItemInt(hWnd, IDC_WALLPAPER_ALPHA_EDIT, NULL, FALSE);
183     } else {
184     bg_theme->BGSrc1.type = BG_NONE;
185     bg_theme->BGSrc1.alpha = 0;
186     }
187    
188     checked = SendDlgItemMessageA(hWnd, IDC_SIMPLE_COLOR_PLANE_CHECK, BM_GETCHECK, 0, 0);
189     if (checked & BST_CHECKED) {
190     bg_theme->BGSrc2.type = BG_COLOR;
191     bg_theme->BGSrc2.alpha = GetDlgItemInt(hWnd, IDC_SIMPLE_COLOR_PLANE_ALPHA, NULL, FALSE);
192     } else {
193     bg_theme->BGSrc2.type = BG_NONE;
194     bg_theme->BGSrc2.alpha = 0;
195     }
196     bg_theme->BGSrc2.color = GetDlgItemTextColor(hWnd, IDC_SIMPLE_COLOR_PLANE_COLOR);
197 zmatsuo 10188
198 zmatsuo 10189 bg_theme->BGReverseTextAlpha = (int)SendDlgItemMessageA(hWnd, IDC_REVERSE_TEXT_ALPHA_SLIDER, TBM_GETPOS, 0, 0);
199 zmatsuo 10134 }
200    
201     static INT_PTR CALLBACK BGThemeProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
202     {
203     ThemeDlgData* dlg_data = (ThemeDlgData*)GetWindowLongPtr(hWnd, DWLP_USER);
204    
205     switch (msg) {
206     case WM_INITDIALOG: {
207 zmatsuo 10189 static const DlgTextInfo TextInfos[] = {
208     { IDC_REVERSE_TEXT_ALPHA_TITLE, "DLG_THEME_BG_REVERSE_TEXT_BG_ALPHA_TITLE" },
209     };
210 zmatsuo 10134 int i;
211     dlg_data = (ThemeDlgData*)(((PROPSHEETPAGEW_V1 *)lp)->lParam);
212     SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)dlg_data);
213    
214 zmatsuo 10189 SetDlgTextsW(hWnd, TextInfos, _countof(TextInfos), dlg_data->pts->UILanguageFileW);
215    
216 zmatsuo 10134 SetDlgItemTextW(hWnd, IDC_BG_THEME_HELP,
217     L"Mix order:\n"
218     L" base\n"
219     L" v\n"
220     L" Background Image\n"
221     L" v\n"
222     L" wallpaper\n"
223     L" v\n"
224     L" simple color plane"
225     );
226    
227     for (i = 0;; i++) {
228     LRESULT index;
229 zmatsuo 10256 const BG_PATTERN_ST *st = ThemeBGPatternList(i);
230 zmatsuo 10134 if (st == NULL) {
231     break;
232     }
233 zmatsuo 10332 index = SendDlgItemMessageW(hWnd, IDC_BGIMG_COMBO, CB_ADDSTRING, 0, (LPARAM)st->str);
234 zmatsuo 10134 SendDlgItemMessageW(hWnd, IDC_BGIMG_COMBO, CB_SETITEMDATA, index, st->id);
235     }
236    
237 zmatsuo 10188 SendDlgItemMessageA(hWnd, IDC_REVERSE_TEXT_ALPHA_SLIDER, TBM_SETRANGE, TRUE, MAKELONG(0, 255));
238    
239 zmatsuo 10134 ResetControls(hWnd, &dlg_data->bg_theme);
240     return TRUE;
241     break;
242     }
243     case WM_COMMAND: {
244     switch (wp) {
245     case IDC_BGIMG_BUTTON | (BN_CLICKED << 16): {
246     // �����t�@�C���I��
247     OPENFILENAMEW ofn = {};
248     wchar_t bg_file[MAX_PATH];
249     wchar_t *bg_file_in;
250    
251     hGetDlgItemTextW(hWnd, IDC_BGIMG_EDIT, &bg_file_in);
252     wcscpy_s(bg_file, _countof(bg_file), bg_file_in);
253     free(bg_file_in);
254    
255     ofn.lStructSize = get_OPENFILENAME_SIZEW();
256     ofn.hwndOwner = hWnd;
257     ofn.lpstrFile = bg_file;
258     ofn.nMaxFile = _countof(bg_file);
259     //ofn.lpstrFilter = "";
260     ofn.nFilterIndex = 1;
261     ofn.hInstance = dlg_data->hInst;
262     ofn.lpstrDefExt = L"jpg";
263     ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
264     ofn.lpstrTitle = L"select bg image file";
265    
266     if (GetOpenFileNameW(&ofn)) {
267     SetDlgItemTextW(hWnd, IDC_BGIMG_EDIT, bg_file);
268     }
269     break;
270     }
271     default:
272     break;
273     }
274     break;
275     }
276     case WM_NOTIFY: {
277     NMHDR *nmhdr = (NMHDR *)lp;
278     switch (nmhdr->code) {
279     case PSN_APPLY: {
280     break;
281     }
282     case PSN_HELP:
283     OpenHelpCV(dlg_data->pcv, HH_HELP_CONTEXT, HlpMenuSetupAdditionalTheme);
284     break;
285     case PSN_KILLACTIVE: {
286     ReadFromDialog(hWnd, &dlg_data->bg_theme);
287     break;
288     }
289     case PSN_SETACTIVE: {
290     ResetControls(hWnd, &dlg_data->bg_theme);
291     break;
292     }
293     default:
294     break;
295     }
296     break;
297     }
298     default:
299     return FALSE;
300     }
301     return FALSE;
302     }
303    
304     static UINT CALLBACK BGCallBack(HWND hwnd, UINT uMsg, struct _PROPSHEETPAGEW *ppsp)
305     {
306     UINT ret_val = 0;
307     (void)hwnd;
308     switch (uMsg) {
309     case PSPCB_CREATE:
310     ret_val = 1;
311     break;
312     case PSPCB_RELEASE:
313     free((void *)ppsp->pResource);
314     ppsp->pResource = NULL;
315     break;
316     default:
317     break;
318     }
319     return ret_val;
320     }
321    
322     static HPROPSHEETPAGE ThemeEditorCreate2(ThemeDlgData *dlg_data)
323     {
324     const int id = IDD_TABSHEET_THEME_EDITOR;
325     HINSTANCE inst = dlg_data->hInst;
326    
327 zmatsuo 10189 wchar_t *title;
328     GetI18nStrWW("Tera Term", "DLG_THEME_BG_TITLE",
329     L"Background", dlg_data->pts->UILanguageFileW, &title);
330    
331 zmatsuo 10134 PROPSHEETPAGEW_V1 psp = {};
332     psp.dwSize = sizeof(psp);
333     psp.dwFlags = PSP_DEFAULT | PSP_USECALLBACK | PSP_USETITLE | PSP_HASHELP;
334     psp.hInstance = inst;
335     psp.pfnCallback = BGCallBack;
336 zmatsuo 10189 psp.pszTitle = title;
337 zmatsuo 10134 psp.pszTemplate = MAKEINTRESOURCEW(id);
338     psp.dwFlags |= PSP_DLGINDIRECT;
339     psp.pResource = TTGetDlgTemplate(inst, MAKEINTRESOURCEA(id));
340    
341     psp.pfnDlgProc = BGThemeProc;
342     psp.lParam = (LPARAM)dlg_data;
343    
344 zmatsuo 10189 HPROPSHEETPAGE hpsp = CreatePropertySheetPageW((LPPROPSHEETPAGEW)&psp);
345     free(title);
346     return hpsp;
347 zmatsuo 10134 }
348    
349     //////////////////////////////////////////////////////////////////////////////
350    
351     static struct {
352     const wchar_t *name;
353     COLORREF color;
354     } list[] = {
355     { L"VTColor Fore", RGB(0,0,0) },
356     { L"VTColor Back", RGB(0,0,0) },
357     { L"VTBoldColor Fore", RGB(0,0,0) },
358     { L"VTBoldColor Back", RGB(0,0,0) },
359 zmatsuo 10214 { L"VTUnderlineColor Fore", RGB(0,0,0) },
360     { L"VTUnderlineColor Back", RGB(0,0,0) },
361 zmatsuo 10134 { L"VTBlinkColor Fore", RGB(0,0,0) },
362     { L"VTBlinkColor Back", RGB(0,0,0) },
363     { L"VTReverseColor Fore", RGB(0,0,0) },
364     { L"VTReverseColor Back", RGB(0,0,0) },
365     { L"URLColor Fore", RGB(0,0,0) },
366     { L"URLColor Back", RGB(0,0,0) },
367     { L"ANSI 0 / Black", RGB(0,0,0) },
368     { L"ANSI 1 / Red", RGB(197,15,31) },
369     { L"ANSI 2 / Green", RGB(19, 161, 14) },
370     { L"ANSI 3 / Yellow", RGB(193, 156, 0) },
371     { L"ANSI 4 / Blue", RGB(0, 55, 218) },
372     { L"ANSI 5 / Magenta", RGB(136, 23, 152) },
373     { L"ANSI 6 / Cyan", RGB(58, 150, 221) },
374     { L"ANSI 7 / White", RGB(204, 204, 204) },
375     { L"ANSI 8 / Bright Black (Gray)", RGB(118, 118, 118) },
376     { L"ANSI 9 / Bright Red", RGB(231, 72, 86) },
377     { L"ANSI 10 / Bright Green", RGB(22, 198, 12) },
378     { L"ANSI 11 / Bright Yellow", RGB(249, 241, 165) },
379     { L"ANSI 12 / Bright Blue", RGB(59, 120, 255) },
380     { L"ANSI 13 / Bright Magenta", RGB(180, 0, 158) },
381     { L"ANSI 14 / Bright Cyan", RGB(97, 214, 214) },
382     { L"ANSI 15 / Bright White", RGB(242, 242, 242) },
383     };
384    
385     static void SetColor(const TColorTheme *data)
386     {
387     list[0].color = data->vt.fg;
388     list[1].color = data->vt.bg;
389     list[2].color = data->bold.fg;
390     list[3].color = data->bold.bg;
391 zmatsuo 10214 list[4].color = data->underline.fg;
392     list[5].color = data->underline.bg;
393     list[6].color = data->blink.fg;
394     list[7].color = data->blink.bg;
395     list[8].color = data->reverse.fg;
396     list[9].color = data->reverse.bg;
397     list[10].color = data->url.fg;
398     list[11].color = data->url.bg;
399 zmatsuo 10134 for (int i = 0; i < 16; i++) {
400 zmatsuo 10214 list[12+i].color = data->ansicolor.color[i];
401 zmatsuo 10134 }
402     }
403    
404     static void RestoreColor(TColorTheme *data)
405     {
406     data->vt.fg = list[0].color;
407     data->vt.bg = list[1].color;
408     data->bold.fg = list[2].color;
409     data->bold.bg = list[3].color;
410 zmatsuo 10214 data->underline.fg = list[4].color;
411     data->underline.bg = list[5].color;
412     data->blink.fg = list[6].color;
413     data->blink.bg = list[7].color;
414     data->reverse.fg = list[8].color;
415     data->reverse.bg = list[9].color;
416     data->url.fg = list[10].color;
417     data->url.bg = list[11].color;
418 zmatsuo 10134 for (int i = 0; i < 16; i++) {
419 zmatsuo 10214 data->ansicolor.color[i] = list[12+i].color;
420 zmatsuo 10134 }
421     }
422    
423     static void SetColorListCtrlValue(HWND hWndList, int y)
424     {
425     LVITEMW item;
426    
427     const COLORREF c = list[y].color;
428     const int r = GetRValue(c);
429     const int g = GetGValue(c);
430     const int b = GetBValue(c);
431    
432     wchar_t color_str[64];
433 zmatsuo 10303 swprintf_s(color_str, L"#%02x%02x%02x", r,g,b);
434 zmatsuo 10134 item.mask = LVIF_TEXT;
435     item.iItem = y;
436     item.iSubItem = 2;
437     item.pszText = color_str;
438     SendMessage(hWndList, LVM_SETITEMW, 0, (LPARAM)&item);
439    
440     swprintf_s(color_str, L"%d,%d,%d", r,g,b);
441     item.iSubItem = 3;
442     item.pszText = color_str;
443     SendMessage(hWndList, LVM_SETITEMW, 0, (LPARAM)&item);
444     }
445    
446     static void SetColorListCtrl(HWND hWnd)
447     {
448     HWND hWndList = GetDlgItem(hWnd, IDC_COLOR_LIST);
449     ListView_SetExtendedListViewStyleEx(hWndList, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
450    
451     SendMessage(hWndList, LVM_DELETEALLITEMS, 0, 0);
452    
453     for (int y = 0; y< _countof(list); y++) {
454     LVITEMW item;
455     item.mask = LVIF_TEXT;
456     item.iItem = y;
457     item.iSubItem = 0;
458     item.pszText = (LPWSTR)list[y].name;
459     SendMessage(hWndList, LVM_INSERTITEMW, 0, (LPARAM)&item);
460    
461     item.iSubItem = 1;
462     item.pszText = NULL;
463     SendMessage(hWndList, LVM_SETITEMW, 0, (LPARAM)&item);
464    
465     SetColorListCtrlValue(hWndList, y);
466     }
467    
468     // ��������
469     for (int i = 0; i < 4; i++) {
470     ListView_SetColumnWidth(hWndList, i, i == 1 ? LVSCW_AUTOSIZE_USEHEADER : LVSCW_AUTOSIZE);
471     }
472     }
473    
474     static INT_PTR CALLBACK ColorThemeProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
475     {
476     static const DlgTextInfo TextInfos[] = {
477     {0, "DLG_GEN_TITLE"},
478     };
479     ThemeDlgData *dlg_data = (ThemeDlgData *)GetWindowLongPtr(hWnd, DWLP_USER);
480    
481     switch (msg) {
482     case WM_INITDIALOG: {
483     dlg_data = (ThemeDlgData *)(((PROPSHEETPAGEW_V1 *)lp)->lParam);
484     SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)dlg_data);
485    
486     {
487     HWND hWndList = GetDlgItem(hWnd, IDC_COLOR_LIST);
488     LV_COLUMNA lvcol;
489     lvcol.mask = LVCF_TEXT | LVCF_SUBITEM;
490     lvcol.pszText = (LPSTR)"name";
491     lvcol.iSubItem = 0;
492     //ListView_InsertColumn(hWndList, 0, &lvcol);
493     SendMessage(hWndList, LVM_INSERTCOLUMNA, 0, (LPARAM)&lvcol);
494    
495     lvcol.pszText = (LPSTR)"color";
496     lvcol.iSubItem = 1;
497     //ListView_InsertColumn(hWndList, 1, &lvcol);
498     SendMessage(hWndList, LVM_INSERTCOLUMNA, 1, (LPARAM)&lvcol);
499    
500 zmatsuo 10303 lvcol.pszText = (LPSTR)"value(#RRGGBB)";
501 zmatsuo 10134 lvcol.iSubItem = 2;
502     //ListView_InsertColumn(hWndList, 1, &lvcol);
503     SendMessage(hWndList, LVM_INSERTCOLUMNA, 2, (LPARAM)&lvcol);
504    
505     lvcol.pszText = (LPSTR)"value(R, G, B)";
506     lvcol.iSubItem = 3;
507     //ListView_InsertColumn(hWndList, 1, &lvcol);
508     SendMessage(hWndList, LVM_INSERTCOLUMNA, 3, (LPARAM)&lvcol);
509     }
510    
511     SetColor(&dlg_data->color_tab.color_theme);
512     SetColorListCtrl(hWnd);
513     break;
514     }
515     case WM_COMMAND: {
516     switch (wp) {
517     case IDC_COLOR_DEFAULT_BUTTON | (BN_CLICKED << 16): {
518     // �f�t�H���g
519 zmatsuo 10256 ThemeGetColorDefault(&dlg_data->color_tab.color_theme);
520 zmatsuo 10134 SetColor(&dlg_data->color_tab.color_theme);
521     SetColorListCtrl(hWnd);
522     break;
523     }
524     default:
525     break;
526     }
527     break;
528     }
529     case WM_NOTIFY: {
530     NMHDR *nmhdr = (NMHDR *)lp;
531     switch (nmhdr->idFrom) {
532     case IDC_COLOR_LIST: {
533     NMLISTVIEW *nmlist = (NMLISTVIEW *)lp;
534     switch (nmlist->hdr.code) {
535     case NM_CUSTOMDRAW: {
536     NMLVCUSTOMDRAW *lpLvCustomDraw = (LPNMLVCUSTOMDRAW)lp;
537     switch (lpLvCustomDraw->nmcd.dwDrawStage) {
538     case CDDS_PREPAINT: {
539     // go CDDS_ITEMPREPAINT stage
540     SetWindowLongW(hWnd, DWLP_MSGRESULT, (LONG)CDRF_NOTIFYITEMDRAW);
541     return TRUE;
542     }
543     case CDDS_ITEMPREPAINT: {
544     // go CDDS_SUBITEM stage
545     SetWindowLongW(hWnd, DWLP_MSGRESULT, (LONG)CDRF_NOTIFYSUBITEMDRAW);
546     return TRUE;
547     }
548     case (CDDS_ITEMPREPAINT | CDDS_SUBITEM):
549     case CDDS_SUBITEM: {
550     // �s�����w��
551     // if (lpLvCustomDraw->nmcd.dwItemSpec == 1 && lpLvCustomDraw->iSubItem == 1) {
552     if (lpLvCustomDraw->iSubItem == 1) {
553     lpLvCustomDraw->clrText = RGB(0x80, 0x80, 0x80);
554     lpLvCustomDraw->clrTextBk = list[lpLvCustomDraw->nmcd.dwItemSpec].color;
555     }
556     else
557     {
558     // �F�����X�������Z�����f�t�H���g�F���w��
559     // �������w�������������A�F�����X���������~���A�����F��������������
560    
561     // �������f�t�H���g�F
562     lpLvCustomDraw->clrText = GetSysColor(COLOR_WINDOWTEXT);
563    
564     // �w�i���f�t�H���g�F
565     lpLvCustomDraw->clrTextBk = GetSysColor(COLOR_WINDOW);
566     }
567     SetWindowLongW(hWnd, DWLP_MSGRESULT, (LONG)CDRF_NEWFONT);
568     return TRUE;
569     }
570     default:
571     SetWindowLongW(hWnd, DWLP_MSGRESULT, (LONG)CDRF_DODEFAULT);
572     return TRUE;
573     }
574     break;
575     }
576     // case NM_CLICK:
577     case NM_DBLCLK:
578     case NM_RCLICK: {
579     static COLORREF CustColors[16]; // TODO �����I���F�����K�v?
580     int i = nmlist->iItem;
581     CHOOSECOLORA cc = {};
582     cc.lStructSize = sizeof(cc);
583     cc.hwndOwner = hWnd;
584     cc.rgbResult = list[i].color;
585     cc.lpCustColors = CustColors;
586     cc.Flags = CC_FULLOPEN | CC_RGBINIT;
587     if (ChooseColorA(&cc)) {
588     list[i].color = cc.rgbResult;
589     SetColorListCtrlValue(nmlist->hdr.hwndFrom, i);
590     InvalidateRect(nmlist->hdr.hwndFrom, NULL, TRUE);
591     }
592     break;
593     }
594     default:
595     break;
596     }
597     break;
598     }
599     default:
600     break;
601     }
602     switch (nmhdr->code) {
603     case PSN_APPLY: {
604     break;
605     }
606     case PSN_HELP:
607     OpenHelpCV(dlg_data->pcv, HH_HELP_CONTEXT, HlpMenuSetupAdditionalTheme);
608     break;
609     case PSN_KILLACTIVE: {
610     RestoreColor(&dlg_data->color_tab.color_theme);
611     break;
612     }
613     case PSN_SETACTIVE: {
614     SetColor(&dlg_data->color_tab.color_theme);
615     SetColorListCtrl(hWnd);
616     break;
617     }
618     default:
619     break;
620     }
621     break;
622     }
623     default:
624     return FALSE;
625     }
626     return FALSE;
627     }
628    
629     static UINT CALLBACK ColorCallBack(HWND hwnd, UINT uMsg, struct _PROPSHEETPAGEW *ppsp)
630     {
631     (void)hwnd;
632     UINT ret_val = 0;
633     switch (uMsg) {
634     case PSPCB_CREATE:
635     ret_val = 1;
636     break;
637     case PSPCB_RELEASE:
638     free((void *)ppsp->pResource);
639     ppsp->pResource = NULL;
640     break;
641     default:
642     break;
643     }
644     return ret_val;
645     }
646    
647     static HPROPSHEETPAGE ColorThemeEditorCreate2(ThemeDlgData *dlg_data)
648     {
649     const int id = IDD_TABSHEET_COLOR_THEME_EDITOR;
650     HINSTANCE inst = dlg_data->hInst;
651    
652 zmatsuo 10189 wchar_t *title;
653     GetI18nStrWW("Tera Term", "DLG_THEME_COLOR_TITLE",
654     L"color", dlg_data->pts->UILanguageFileW, &title);
655    
656 zmatsuo 10134 PROPSHEETPAGEW_V1 psp = {};
657     psp.dwSize = sizeof(psp);
658     psp.dwFlags = PSP_DEFAULT | PSP_USECALLBACK | PSP_USETITLE | PSP_HASHELP;
659     psp.hInstance = inst;
660     psp.pfnCallback = ColorCallBack;
661 zmatsuo 10189 psp.pszTitle = title;
662 zmatsuo 10134 psp.pszTemplate = MAKEINTRESOURCEW(id);
663     #if 1
664     psp.dwFlags |= PSP_DLGINDIRECT;
665     psp.pResource = TTGetDlgTemplate(inst, MAKEINTRESOURCEA(id));
666     #endif
667    
668     psp.pfnDlgProc = ColorThemeProc;
669     psp.lParam = (LPARAM)dlg_data;
670    
671     HPROPSHEETPAGE hpsp = CreatePropertySheetPageW((LPPROPSHEETPAGEW)&psp);
672 zmatsuo 10189 free(title);
673 zmatsuo 10134 return hpsp;
674     }
675    
676     //////////////////////////////////////////////////////////////////////////////
677    
678     static INT_PTR CALLBACK FileProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
679     {
680     static const DlgTextInfo TextInfos[] = {
681     {0, "DLG_GEN_TITLE"},
682     };
683     ThemeDlgData *dlg_data = (ThemeDlgData *)GetWindowLongPtr(hWnd, DWLP_USER);
684     TTTSet *ts = dlg_data == NULL ? NULL : dlg_data->pts;
685    
686     switch (msg) {
687     case WM_INITDIALOG: {
688     dlg_data = (ThemeDlgData *)(((PROPSHEETPAGEW_V1 *)lp)->lParam);
689     ts = dlg_data->pts;
690     SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)dlg_data);
691    
692     dlg_data->tipwin = TipWin2Create(NULL, hWnd);
693     #if 0
694     TipWin2SetTextW(dlg_data->tipwin, IDC_BUTTON1,
695     L"�e�[�}�t�B�A������������\n"
696     );
697     TipWin2SetTextW(dlg_data->tipwin, IDC_BUTTON3,
698     L"�������_�C�A���O�����������������e�[�}�t�@�C������������\n"
699     );
700     TipWin2SetTextW(dlg_data->tipwin, IDC_BUTTON4,
701     L"�������_�C�A���O����������������\n"
702     L"�����y�[�W�������������o����������������\n"
703     );
704     #endif
705     EnableWindow(GetDlgItem(hWnd, IDC_FILE_SAVE_BUTTON), FALSE);
706     return TRUE;
707     break;
708     }
709     case WM_NOTIFY: {
710     NMHDR *nmhdr = (NMHDR *)lp;
711     switch (nmhdr->code) {
712     case PSN_APPLY: {
713     // OK
714     TipWin2Destroy(dlg_data->tipwin);
715     dlg_data->tipwin = NULL;
716     break;
717     }
718     case PSN_HELP:
719     OpenHelpCV(dlg_data->pcv, HH_HELP_CONTEXT, HlpMenuSetupAdditionalTheme);
720     break;
721     default:
722     break;
723     }
724     break;
725     }
726     case WM_COMMAND: {
727     switch (wp) {
728     case IDC_FILE_UNDO_BUTTON | (BN_CLICKED << 16): {
729     // undo,��������
730     dlg_data->bg_theme = dlg_data->backup.bg_theme;
731     dlg_data->color_tab.color_theme = dlg_data->backup.color_theme;
732     goto set;
733     break;
734     }
735     case IDC_FILE_PREVIEW_BUTTON | (BN_CLICKED << 16): {
736     set:
737     // preview
738 zmatsuo 10256 ThemeSetBG(&dlg_data->bg_theme);
739     ThemeSetColor(&dlg_data->color_tab.color_theme);
740 zmatsuo 10134 BGSetupPrimary(TRUE);
741     InvalidateRect(dlg_data->hVTWin, NULL, FALSE);
742     break;
743     }
744     case IDC_FILE_LOAD_BUTTON | (BN_CLICKED << 16): {
745     // load
746     // �e�[�}�t�@�C����������
747     OPENFILENAMEW ofn = {};
748     wchar_t theme_file[MAX_PATH];
749    
750 zmatsuo 10303 if (ts->EtermLookfeel.BGThemeFileW != NULL) {
751     wcscpy_s(theme_file, _countof(theme_file), ts->EtermLookfeel.BGThemeFileW);
752     }
753     else {
754     theme_file[0] = 0;
755     }
756 zmatsuo 10134
757     ofn.lStructSize = get_OPENFILENAME_SIZEW();
758     ofn.hwndOwner = hWnd;
759     ofn.lpstrFile = theme_file;
760     ofn.nMaxFile = _countof(theme_file);
761     ofn.nFilterIndex = 1;
762     ofn.hInstance = dlg_data->hInst;
763     ofn.lpstrDefExt = L"ini";
764     ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
765     ofn.lpstrTitle = L"select theme file";
766    
767     if (GetOpenFileNameW(&ofn)) {
768 zmatsuo 10256 ThemeLoad(theme_file, &dlg_data->bg_theme, &dlg_data->color_tab.color_theme);
769 zmatsuo 10134
770     static const TTMessageBoxInfoW info = {
771     "Tera Term",
772     NULL, L"Info",
773     NULL, L"Preview?",
774     MB_YESNO | MB_ICONWARNING
775     };
776     if (TTMessageBoxW(hWnd, &info, ts->UILanguageFileW) == IDYES) {
777 zmatsuo 10256 ThemeSetColor(&dlg_data->color_tab.color_theme);
778     ThemeSetBG(&dlg_data->bg_theme);
779 zmatsuo 10134 //SetColor(&dlg_data->color_tab.color_theme);
780    
781     BGSetupPrimary(TRUE);
782     InvalidateRect(dlg_data->hVTWin, NULL, FALSE);
783     }
784     }
785    
786     break;
787     }
788     case IDC_FILE_SAVE_BUTTON | (BN_CLICKED << 16): {
789     // save
790     // �e�[�}�t�@�C�������o��
791     wchar_t theme_file[MAX_PATH];
792     OPENFILENAMEW ofn = {};
793    
794     theme_file[0] = 0;
795    
796     ofn.lStructSize = get_OPENFILENAME_SIZEW();
797     ofn.hwndOwner = hWnd;
798     ofn.lpstrFile = theme_file;
799     ofn.nMaxFile = _countof(theme_file);
800     //ofn.lpstrFilter = "";
801     ofn.nFilterIndex = 1;
802     ofn.hInstance = dlg_data->hInst;
803     ofn.lpstrDefExt = L"ini";
804     ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
805     ofn.lpstrTitle = L"save theme file";
806    
807     if (GetSaveFileNameW(&ofn)) {
808     LRESULT checked = SendDlgItemMessageA(hWnd, IDC_FILE_SAVE_BG_CHECK, BM_GETCHECK, 0, 0);
809     if (checked & BST_CHECKED) {
810 zmatsuo 10256 ThemeSaveBG(&dlg_data->bg_theme, theme_file);
811 zmatsuo 10134 }
812     checked = SendDlgItemMessageA(hWnd, IDC_FILE_SAVE_COLOR_CHECK, BM_GETCHECK, 0, 0);
813     if (checked & BST_CHECKED) {
814 zmatsuo 10256 ThemeSaveColor(&dlg_data->color_tab.color_theme, theme_file);
815 zmatsuo 10134 }
816     }
817     break;
818     }
819     case IDC_FILE_SAVE_BG_CHECK:
820     case IDC_FILE_SAVE_COLOR_CHECK: {
821     LRESULT bg = SendDlgItemMessageA(hWnd, IDC_FILE_SAVE_BG_CHECK, BM_GETCHECK, 0, 0);
822     LRESULT color = SendDlgItemMessageA(hWnd, IDC_FILE_SAVE_COLOR_CHECK, BM_GETCHECK, 0, 0);
823     EnableWindow(GetDlgItem(hWnd, IDC_FILE_SAVE_BUTTON),
824     ((bg & BST_CHECKED) || (color & BST_CHECKED)) ? TRUE : FALSE);
825     break;
826     }
827     default:
828     break;
829     }
830     break;
831     }
832     default:
833     return FALSE;
834     }
835     return FALSE;
836     }
837    
838     static UINT CALLBACK FileCallBack(HWND hwnd, UINT uMsg, struct _PROPSHEETPAGEW *ppsp)
839     {
840     UINT ret_val = 0;
841     (void)hwnd;
842     switch (uMsg) {
843     case PSPCB_CREATE:
844     ret_val = 1;
845     break;
846     case PSPCB_RELEASE:
847     free((void *)ppsp->pResource);
848     ppsp->pResource = NULL;
849     break;
850     default:
851     break;
852     }
853     return ret_val;
854     }
855    
856     static HPROPSHEETPAGE ThemeEditorFile(ThemeDlgData* dlg_data)
857     {
858     const int id = IDD_TABSHEET_THEME_FILE;
859    
860     HINSTANCE inst = dlg_data->hInst;
861    
862 zmatsuo 10189 wchar_t *title;
863     GetI18nStrWW("Tera Term", "DLG_THEME_PREVIEW_FILE_TITLE",
864     L"preview/file", dlg_data->pts->UILanguageFileW, &title);
865    
866 zmatsuo 10134 PROPSHEETPAGEW_V1 psp = {};
867     psp.dwSize = sizeof(psp);
868     psp.dwFlags = PSP_DEFAULT | PSP_USECALLBACK | PSP_USETITLE | PSP_HASHELP;
869     psp.hInstance = inst;
870     psp.pfnCallback = FileCallBack;
871 zmatsuo 10189 psp.pszTitle = title;
872 zmatsuo 10134 psp.pszTemplate = MAKEINTRESOURCEW(id);
873     #if 1
874     psp.dwFlags |= PSP_DLGINDIRECT;
875     psp.pResource = TTGetDlgTemplate(inst, MAKEINTRESOURCEA(id));
876     #endif
877    
878     psp.pfnDlgProc = FileProc;
879     psp.lParam = (LPARAM)dlg_data;
880    
881     HPROPSHEETPAGE hpsp = CreatePropertySheetPageW((LPPROPSHEETPAGEW)&psp);
882 zmatsuo 10189 free(title);
883 zmatsuo 10134 return hpsp;
884     }
885    
886     //////////////////////////////////////////////////////////////////////////////
887    
888     // Theme dialog
889     class CThemeDlg: public TTCPropSheetDlg
890     {
891     public:
892     CThemeDlg(HINSTANCE hInstance, HWND hParentWnd, ThemeDlgData *dlg_data):
893     TTCPropSheetDlg(hInstance, hParentWnd, dlg_data->pts->UILanguageFileW)
894     {
895     HPROPSHEETPAGE page;
896     page = ThemeEditorFile(dlg_data);
897     AddPage(page);
898     page = ThemeEditorCreate2(dlg_data);
899     AddPage(page);
900     page = ColorThemeEditorCreate2(dlg_data);
901     AddPage(page);
902    
903     SetCaption(L"Theme Editor");
904     }
905     ~CThemeDlg() {
906     ;
907     }
908    
909     private:
910     ;
911     };
912    
913     void ThemeDialog(HINSTANCE hInst, HWND hWnd, TComVar *pcv)
914     {
915     ThemeDlgData *dlg_data = (ThemeDlgData*)calloc(sizeof(*dlg_data), 1);
916     dlg_data->hInst = hInst;
917     dlg_data->pcv = pcv;
918     dlg_data->pts = pcv->ts;
919     dlg_data->hVTWin = pcv->HWin;
920 zmatsuo 10256 ThemeGetBG(&dlg_data->bg_theme);
921 zmatsuo 10134 dlg_data->backup.bg_theme = dlg_data->bg_theme;
922 zmatsuo 10256 ThemeGetColor(&dlg_data->color_tab.color_theme);
923 zmatsuo 10134 dlg_data->backup.color_theme = dlg_data->color_tab.color_theme;
924    
925     CThemeDlg dlg(hInst, hWnd, dlg_data);
926     INT_PTR r = dlg.DoModal();
927     if (r == 0) {
928     // cancel���A�o�b�N�A�b�v���e������
929 zmatsuo 10256 ThemeSetBG(&dlg_data->backup.bg_theme);
930     ThemeSetColor(&dlg_data->color_tab.color_theme);
931 zmatsuo 10134 BGSetupPrimary(TRUE);
932     InvalidateRect(dlg_data->hVTWin, NULL, FALSE);
933     }
934     else if (r >= 1) {
935     // ok����(Changes were saved by the user)
936 zmatsuo 10256 ThemeSetBG(&dlg_data->bg_theme);
937     ThemeSetColor(&dlg_data->color_tab.color_theme);
938 zmatsuo 10134 BGSetupPrimary(TRUE);
939     InvalidateRect(dlg_data->hVTWin, NULL, FALSE);
940     }
941    
942     free(dlg_data);
943     }

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