forked from m417z/Textify
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSettingsDlg.cpp
135 lines (103 loc) · 3.38 KB
/
SettingsDlg.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "stdafx.h"
#include "SettingsDlg.h"
BOOL CSettingsDlg::OnInitDialog(CWindow wndFocus, LPARAM lInitParam)
{
// Center the dialog on the screen.
CenterWindow();
// Init resizing.
DlgResize_Init();
// Init font.
CStatic configTextCtrl(GetDlgItem(IDC_CONFIG_TEXT));
CFontHandle font(configTextCtrl.GetFont());
CLogFont fontAttributes(font);
wcscpy_s(fontAttributes.lfFaceName, L"Consolas");
m_fontConfigText = fontAttributes.CreateFontIndirect();
configTextCtrl.SetFont(m_fontConfigText);
// Load ini file.
CEdit configText = CEdit(GetDlgItem(IDC_CONFIG_TEXT));
configText.SetWindowText(LoadIniFile());
configText.SetLimitText(0);
// Other initialization stuff.
m_wndEdit.SubclassWindow(configText);
CButton(GetDlgItem(IDOK)).EnableWindow(FALSE);
return TRUE;
}
void CSettingsDlg::OnDestroy()
{
}
void CSettingsDlg::OnConfigTextChange(UINT uNotifyCode, int nID, CWindow wndCtl)
{
CButton(GetDlgItem(IDOK)).EnableWindow(TRUE);
}
void CSettingsDlg::OnOK(UINT uNotifyCode, int nID, CWindow wndCtl)
{
CEdit configText = CEdit(GetDlgItem(IDC_CONFIG_TEXT));
CString str;
configText.GetWindowText(str);
SaveIniFile(str);
EndDialog(nID);
}
void CSettingsDlg::OnCancel(UINT uNotifyCode, int nID, CWindow wndCtl)
{
if(CButton(GetDlgItem(IDOK)).IsWindowEnabled() &&
MessageBox(L"Discard unsaved changes?", L"Please confirm", MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2) != IDYES)
{
return;
}
EndDialog(nID);
}
UINT CSettingsDlg::OnGetDlgCode(LPMSG lpMsg)
{
// Prevent selecting all text when focused.
// https://devblogs.microsoft.com/oldnewthing/20031114-00/?p=41823
return m_wndEdit.DefWindowProc() & ~DLGC_HASSETSEL;
}
// Private functions
CPath CSettingsDlg::GetIniFilePath()
{
CPath iniFilePath;
GetModuleFileName(NULL, iniFilePath.m_strPath.GetBuffer(MAX_PATH), MAX_PATH);
iniFilePath.m_strPath.ReleaseBuffer();
iniFilePath.RenameExtension(L".ini");
return iniFilePath;
}
CString CSettingsDlg::LoadIniFile()
{
HRESULT hr;
CPath iniFilePath = GetIniFilePath();
CAtlFile file;
hr = file.Create(iniFilePath, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING);
ATLENSURE_RETURN_VAL(SUCCEEDED(hr), L"");
ULONGLONG fileSizeUlonglong;
hr = file.GetSize(fileSizeUlonglong);
ATLENSURE_RETURN_VAL(SUCCEEDED(hr), L"");
int fileSize = (int)fileSizeUlonglong;
CStringA utf8Contents;
CHAR* utf8ContentsBuffer = utf8Contents.GetBuffer(fileSize + 1);
hr = file.Read(utf8ContentsBuffer, fileSize);
ATLENSURE_RETURN_VAL(SUCCEEDED(hr), L"");
utf8ContentsBuffer[fileSize] = '\0';
utf8Contents.ReleaseBuffer(fileSize + 1);
CA2W unicodeContents(utf8ContentsBuffer, CP_UTF8);
CString result = unicodeContents.m_psz;
const WCHAR* prefixToRemove = L"; After editing this configuration file,\r\n; Textify must be restarted to apply the changes.\r\n";
size_t prefixToRemoveLength = wcslen(prefixToRemove);
if(result.Left(prefixToRemoveLength) == prefixToRemove)
{
result = result.Right(result.GetLength() - prefixToRemoveLength);
result.TrimLeft();
}
return result;
}
bool CSettingsDlg::SaveIniFile(CString newFileContents)
{
HRESULT hr;
CPath iniFilePath = GetIniFilePath();
CAtlFile file;
hr = file.Create(iniFilePath, GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS);
ATLENSURE_RETURN_VAL(SUCCEEDED(hr), false);
CW2A utf8Contents(newFileContents, CP_UTF8);
hr = file.Write(utf8Contents.m_psz, strlen(utf8Contents.m_psz));
ATLENSURE_RETURN_VAL(SUCCEEDED(hr), false);
return true;
}