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 10303 - (hide annotations) (download) (as text)
Mon Oct 10 04:48:24 2022 UTC (18 months ago) by zmatsuo
Original Path: trunk/teraterm/teraterm/themedlg.cpp
File MIME type: text/x-c++src
File size: 27231 byte(s)
カラーテーマファイルのマニュアル追記、読み書きを修正

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

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