No need to explicitly initialize CString and use Empty() for clearing CString
[TortoiseGit.git] / src / TortoiseProc / Settings / SetDialogs3.cpp
blob4e259b59b2f61511624cdb11bc36db84d9c74b1c
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2013-2015 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #include "stdafx.h"
20 #include "TortoiseProc.h"
21 #include "SetMainPage.h"
22 #include "ProjectProperties.h"
23 #include "SetDialogs3.h"
25 static std::vector<DWORD> g_langs;
27 IMPLEMENT_DYNAMIC(CSetDialogs3, ISettingsPropPage)
28 CSetDialogs3::CSetDialogs3()
29 : ISettingsPropPage(CSetDialogs3::IDD)
30 , m_bNeedSave(false)
31 , m_bInheritLogMinSize(FALSE)
32 , m_bInheritBorder(FALSE)
33 , m_bInheritIconFile(FALSE)
37 CSetDialogs3::~CSetDialogs3()
41 void CSetDialogs3::DoDataExchange(CDataExchange* pDX)
43 ISettingsPropPage::DoDataExchange(pDX);
44 DDX_Control(pDX, IDC_LANGCOMBO, m_langCombo);
45 DDX_Text(pDX, IDC_LOGMINSIZE, m_LogMinSize);
46 DDX_Text(pDX, IDC_BORDER, m_Border);
47 DDX_Text(pDX, IDC_ICONFILE, m_iconFile);
48 DDX_Control(pDX, IDC_WARN_NO_SIGNED_OFF_BY, m_cWarnNoSignedOffBy);
49 DDX_Check(pDX, IDC_CHECK_INHERIT_LIMIT, m_bInheritLogMinSize);
50 DDX_Check(pDX, IDC_CHECK_INHERIT_BORDER, m_bInheritBorder);
51 DDX_Check(pDX, IDC_CHECK_INHERIT_KEYID, m_bInheritIconFile);
52 GITSETTINGS_DDX
55 BEGIN_MESSAGE_MAP(CSetDialogs3, ISettingsPropPage)
56 GITSETTINGS_RADIO_EVENT
57 ON_CBN_SELCHANGE(IDC_LANGCOMBO, &OnChange)
58 ON_CBN_SELCHANGE(IDC_WARN_NO_SIGNED_OFF_BY, &OnChange)
59 ON_EN_CHANGE(IDC_LOGMINSIZE, &OnChange)
60 ON_EN_CHANGE(IDC_BORDER, &OnChange)
61 ON_EN_CHANGE(IDC_ICONFILE, &OnChange)
62 ON_BN_CLICKED(IDC_CHECK_INHERIT_LIMIT, &OnChange)
63 ON_BN_CLICKED(IDC_CHECK_INHERIT_BORDER, &OnChange)
64 ON_BN_CLICKED(IDC_CHECK_INHERIT_KEYID, &OnChange)
65 ON_BN_CLICKED(IDC_ICONFILE_BROWSE, &OnBnClickedIconfileBrowse)
66 END_MESSAGE_MAP()
68 // CSetDialogs2 message handlers
69 BOOL CSetDialogs3::OnInitDialog()
71 ISettingsPropPage::OnInitDialog();
73 AdjustControlSize(IDC_CHECK_INHERIT_LIMIT);
74 AdjustControlSize(IDC_CHECK_INHERIT_BORDER);
75 AdjustControlSize(IDC_CHECK_INHERIT_KEYID);
76 GITSETTINGS_ADJUSTCONTROLSIZE
78 AddTrueFalseToComboBox(m_cWarnNoSignedOffBy);
80 m_langCombo.AddString(_T(""));
81 m_langCombo.SetItemData(0, (DWORD_PTR)-2);
82 m_langCombo.AddString(_T("(auto)")); // do not translate, the order matters!
83 m_langCombo.SetItemData(1, 0);
84 m_langCombo.AddString(_T("(disable)")); // do not translate, the order matters!
85 m_langCombo.SetItemData(2, (DWORD_PTR)-1);
86 // fill the combo box with all available languages
87 g_langs.clear();
88 EnumSystemLocales(EnumLocalesProc, LCID_SUPPORTED);
89 for (DWORD langID : g_langs)
90 AddLangToCombo(langID);
92 InitGitSettings(this, true, &m_tooltips);
94 UpdateData(FALSE);
95 return TRUE;
98 static void SelectLanguage(CComboBox &combobox, LONG langueage)
100 for (int i = 0; i < combobox.GetCount(); ++i)
102 if (combobox.GetItemData(i) == langueage)
104 combobox.SetCurSel(i);
105 break;
110 void CSetDialogs3::LoadDataImpl(CAutoConfig& config)
113 CString value;
114 if (config.GetString(PROJECTPROPNAME_PROJECTLANGUAGE, value) == GIT_ENOTFOUND && m_iConfigSource != 0)
115 m_langCombo.SetCurSel(0);
116 else if (value == _T("-1"))
117 m_langCombo.SetCurSel(2);
118 else if (!value.IsEmpty())
120 LPTSTR strEnd;
121 long longValue = _tcstol(value, &strEnd, 0);
122 if (longValue == 0)
124 if (m_iConfigSource == 0)
125 SelectLanguage(m_langCombo, CRegDWORD(_T("Software\\TortoiseGit\\LanguageID"), 1033));
126 else
127 m_langCombo.SetCurSel(1);
129 else
130 SelectLanguage(m_langCombo, longValue);
132 else if (m_iConfigSource == 0)
133 SelectLanguage(m_langCombo, CRegDWORD(_T("Software\\TortoiseGit\\LanguageID"), 1033));
134 else
135 m_langCombo.SetCurSel(1);
139 m_LogMinSize.Empty();
140 CString value;
141 m_bInheritLogMinSize = (config.GetString(PROJECTPROPNAME_LOGMINSIZE, value) == GIT_ENOTFOUND);
142 if (!value.IsEmpty() || m_iConfigSource == 0)
144 int nMinLogSize = _ttoi(value);
145 m_LogMinSize.Format(L"%d", nMinLogSize);
146 m_bInheritLogMinSize = FALSE;
151 m_Border.Empty();
152 CString value;
153 m_bInheritBorder = (config.GetString(PROJECTPROPNAME_LOGWIDTHLINE, value) == GIT_ENOTFOUND);
154 if (!value.IsEmpty() || m_iConfigSource == 0)
156 int nLogWidthMarker = _ttoi(value);
157 m_Border.Format(L"%d", nLogWidthMarker);
158 m_bInheritBorder = FALSE;
162 GetBoolConfigValueComboBox(config, PROJECTPROPNAME_WARNNOSIGNEDOFFBY, m_cWarnNoSignedOffBy);
164 m_bInheritIconFile = (config.GetString(PROJECTPROPNAME_ICON, m_iconFile) == GIT_ENOTFOUND);
166 m_bNeedSave = false;
167 SetModified(FALSE);
168 UpdateData(FALSE);
171 BOOL CSetDialogs3::SafeDataImpl(CAutoConfig& config)
173 if (m_langCombo.GetCurSel() == 2) // disable
175 if (!Save(config, PROJECTPROPNAME_PROJECTLANGUAGE, L"-1"))
176 return FALSE;
178 else if (m_langCombo.GetCurSel() == 0) // inherit
180 if (!Save(config, PROJECTPROPNAME_PROJECTLANGUAGE, L"", true))
181 return FALSE;
183 else
185 CString value;
186 char numBuf[20] = { 0 };
187 sprintf_s(numBuf, "%lu", (DWORD)m_langCombo.GetItemData(m_langCombo.GetCurSel()));
188 if (!Save(config, PROJECTPROPNAME_PROJECTLANGUAGE, (CString)numBuf))
189 return FALSE;
192 if (!Save(config, PROJECTPROPNAME_LOGMINSIZE, m_LogMinSize, m_bInheritLogMinSize == TRUE))
193 return FALSE;
195 if (!Save(config, PROJECTPROPNAME_LOGWIDTHLINE, m_Border, m_bInheritBorder == TRUE))
196 return FALSE;
199 CString value;
200 m_cWarnNoSignedOffBy.GetWindowText(value);
201 if (!Save(config, PROJECTPROPNAME_WARNNOSIGNEDOFFBY, value, value.IsEmpty()))
202 return FALSE;
205 if (!Save(config, PROJECTPROPNAME_ICON, m_iconFile, m_bInheritIconFile == TRUE))
206 return FALSE;
208 return TRUE;
211 void CSetDialogs3::EnDisableControls()
213 GetDlgItem(IDC_LOGMINSIZE)->SendMessage(EM_SETREADONLY, m_iConfigSource == 0, 0);
214 GetDlgItem(IDC_BORDER)->SendMessage(EM_SETREADONLY, m_iConfigSource == 0, 0);
215 GetDlgItem(IDC_LANGCOMBO)->EnableWindow(m_iConfigSource != 0);
216 GetDlgItem(IDC_WARN_NO_SIGNED_OFF_BY)->EnableWindow(m_iConfigSource != 0);
217 GetDlgItem(IDC_COMBO_SETTINGS_SAFETO)->EnableWindow(m_iConfigSource != 0);
218 GetDlgItem(IDC_ICONFILE)->SendMessage(EM_SETREADONLY, m_iConfigSource == 0, 0);
219 GetDlgItem(IDC_ICONFILE_BROWSE)->EnableWindow(m_iConfigSource != 0 && !m_bInheritIconFile);
220 GetDlgItem(IDC_CHECK_INHERIT_LIMIT)->EnableWindow(m_iConfigSource != 0);
221 GetDlgItem(IDC_CHECK_INHERIT_BORDER)->EnableWindow(m_iConfigSource != 0);
222 GetDlgItem(IDC_CHECK_INHERIT_ICONPATH)->EnableWindow(m_iConfigSource != 0);
224 GetDlgItem(IDC_LOGMINSIZE)->EnableWindow(!m_bInheritLogMinSize);
225 GetDlgItem(IDC_BORDER)->EnableWindow(!m_bInheritBorder);
226 GetDlgItem(IDC_ICONFILE)->EnableWindow(!m_bInheritIconFile);
227 UpdateData(FALSE);
230 void CSetDialogs3::OnChange()
232 UpdateData();
233 EnDisableControls();
234 m_bNeedSave = true;
235 SetModified();
238 void CSetDialogs3::OnBnClickedIconfileBrowse()
240 UpdateData(TRUE);
241 CString currentDir = g_Git.m_CurrentDir + (g_Git.m_CurrentDir.Right(1) == _T("\\") ? _T("") : _T("\\"));
242 CString iconFile = m_iconFile;
243 if (!(iconFile.Mid(1, 1) == _T(":") || iconFile.Left(1) == _T("\\")))
244 iconFile = currentDir + iconFile;
245 iconFile.Replace('/', '\\');
246 CFileDialog dlg(FALSE, _T(""), iconFile, OFN_FILEMUSTEXIST, CString(MAKEINTRESOURCE(IDS_ICONFILEFILTER)));
248 INT_PTR ret = dlg.DoModal();
249 SetCurrentDirectory(g_Git.m_CurrentDir);
250 if (ret == IDOK)
252 iconFile = dlg.GetPathName();
253 if (iconFile.Left(currentDir.GetLength()) == currentDir)
254 iconFile = iconFile.Mid(currentDir.GetLength());
255 iconFile.Replace('\\', '/');
256 if (m_iconFile != iconFile)
258 m_iconFile = iconFile;
259 m_bNeedSave = true;
260 SetModified();
262 UpdateData(FALSE);
266 BOOL CSetDialogs3::OnApply()
268 if (!m_bNeedSave)
269 return TRUE;
270 UpdateData();
271 if (!SafeData())
272 return FALSE;
273 m_bNeedSave = false;
274 SetModified(FALSE);
275 return ISettingsPropPage::OnApply();
278 BOOL CSetDialogs3::EnumLocalesProc(LPTSTR lpLocaleString)
280 DWORD langID = _tcstol(lpLocaleString, NULL, 16);
281 g_langs.push_back(langID);
282 return TRUE;
285 void CSetDialogs3::AddLangToCombo(DWORD langID)
287 TCHAR buf[MAX_PATH] = {0};
288 GetLocaleInfo(langID, LOCALE_SNATIVELANGNAME, buf, _countof(buf));
289 CString sLang = buf;
290 GetLocaleInfo(langID, LOCALE_SNATIVECTRYNAME, buf, _countof(buf));
291 if (buf[0])
293 sLang += _T(" (");
294 sLang += buf;
295 sLang += _T(")");
298 int index = m_langCombo.AddString(sLang);
299 m_langCombo.SetItemData(index, langID);