Make more use of CStringUtils::StartsWith
[TortoiseGit.git] / src / TortoiseProc / Settings / SetDialogs3.cpp
blob33590a204837d87dc495666af73430aec512bc7c
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2013-2016 - 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"
24 #include "AppUtils.h"
26 static std::vector<DWORD> g_langs;
28 IMPLEMENT_DYNAMIC(CSetDialogs3, ISettingsPropPage)
29 CSetDialogs3::CSetDialogs3()
30 : ISettingsPropPage(CSetDialogs3::IDD)
31 , m_bNeedSave(false)
32 , m_bInheritLogMinSize(FALSE)
33 , m_bInheritBorder(FALSE)
34 , m_bInheritIconFile(FALSE)
38 CSetDialogs3::~CSetDialogs3()
42 void CSetDialogs3::DoDataExchange(CDataExchange* pDX)
44 ISettingsPropPage::DoDataExchange(pDX);
45 DDX_Control(pDX, IDC_LANGCOMBO, m_langCombo);
46 DDX_Text(pDX, IDC_LOGMINSIZE, m_LogMinSize);
47 DDX_Text(pDX, IDC_BORDER, m_Border);
48 DDX_Text(pDX, IDC_ICONFILE, m_iconFile);
49 DDX_Control(pDX, IDC_WARN_NO_SIGNED_OFF_BY, m_cWarnNoSignedOffBy);
50 DDX_Check(pDX, IDC_CHECK_INHERIT_LIMIT, m_bInheritLogMinSize);
51 DDX_Check(pDX, IDC_CHECK_INHERIT_BORDER, m_bInheritBorder);
52 DDX_Check(pDX, IDC_CHECK_INHERIT_KEYID, m_bInheritIconFile);
53 GITSETTINGS_DDX
56 BEGIN_MESSAGE_MAP(CSetDialogs3, ISettingsPropPage)
57 GITSETTINGS_RADIO_EVENT
58 ON_CBN_SELCHANGE(IDC_LANGCOMBO, &OnChange)
59 ON_CBN_SELCHANGE(IDC_WARN_NO_SIGNED_OFF_BY, &OnChange)
60 ON_EN_CHANGE(IDC_LOGMINSIZE, &OnChange)
61 ON_EN_CHANGE(IDC_BORDER, &OnChange)
62 ON_EN_CHANGE(IDC_ICONFILE, &OnChange)
63 ON_BN_CLICKED(IDC_CHECK_INHERIT_LIMIT, &OnChange)
64 ON_BN_CLICKED(IDC_CHECK_INHERIT_BORDER, &OnChange)
65 ON_BN_CLICKED(IDC_CHECK_INHERIT_KEYID, &OnChange)
66 ON_BN_CLICKED(IDC_ICONFILE_BROWSE, &OnBnClickedIconfileBrowse)
67 END_MESSAGE_MAP()
69 // CSetDialogs2 message handlers
70 BOOL CSetDialogs3::OnInitDialog()
72 ISettingsPropPage::OnInitDialog();
74 AdjustControlSize(IDC_CHECK_INHERIT_LIMIT);
75 AdjustControlSize(IDC_CHECK_INHERIT_BORDER);
76 AdjustControlSize(IDC_CHECK_INHERIT_KEYID);
77 GITSETTINGS_ADJUSTCONTROLSIZE
79 AddTrueFalseToComboBox(m_cWarnNoSignedOffBy);
81 m_langCombo.AddString(_T(""));
82 m_langCombo.SetItemData(0, (DWORD_PTR)-2);
83 m_langCombo.AddString(_T("(auto)")); // do not translate, the order matters!
84 m_langCombo.SetItemData(1, 0);
85 m_langCombo.AddString(_T("(disable)")); // do not translate, the order matters!
86 m_langCombo.SetItemData(2, (DWORD_PTR)-1);
87 // fill the combo box with all available languages
88 g_langs.clear();
89 EnumSystemLocales(EnumLocalesProc, LCID_SUPPORTED);
90 for (DWORD langID : g_langs)
91 AddLangToCombo(langID);
93 InitGitSettings(this, true, &m_tooltips);
95 UpdateData(FALSE);
96 return TRUE;
99 static void SelectLanguage(CComboBox &combobox, LONG langueage)
101 for (int i = 0; i < combobox.GetCount(); ++i)
103 if (combobox.GetItemData(i) == (DWORD)langueage)
105 combobox.SetCurSel(i);
106 break;
111 void CSetDialogs3::LoadDataImpl(CAutoConfig& config)
114 CString value;
115 if (config.GetString(PROJECTPROPNAME_PROJECTLANGUAGE, value) == GIT_ENOTFOUND && m_iConfigSource != 0)
116 m_langCombo.SetCurSel(0);
117 else if (value == _T("-1"))
118 m_langCombo.SetCurSel(2);
119 else if (!value.IsEmpty())
121 LPTSTR strEnd;
122 long longValue = _tcstol(value, &strEnd, 0);
123 if (longValue == 0)
125 if (m_iConfigSource == CFG_SRC_EFFECTIVE)
126 SelectLanguage(m_langCombo, CRegDWORD(_T("Software\\TortoiseGit\\LanguageID"), 1033));
127 else
128 m_langCombo.SetCurSel(1);
130 else
131 SelectLanguage(m_langCombo, longValue);
133 else if (m_iConfigSource == CFG_SRC_EFFECTIVE)
134 SelectLanguage(m_langCombo, CRegDWORD(_T("Software\\TortoiseGit\\LanguageID"), 1033));
135 else
136 m_langCombo.SetCurSel(1);
140 m_LogMinSize.Empty();
141 CString value;
142 m_bInheritLogMinSize = (config.GetString(PROJECTPROPNAME_LOGMINSIZE, value) == GIT_ENOTFOUND);
143 if (!value.IsEmpty() || m_iConfigSource == CFG_SRC_EFFECTIVE)
145 int nMinLogSize = _ttoi(value);
146 m_LogMinSize.Format(L"%d", nMinLogSize);
147 m_bInheritLogMinSize = FALSE;
152 m_Border.Empty();
153 CString value;
154 m_bInheritBorder = (config.GetString(PROJECTPROPNAME_LOGWIDTHLINE, value) == GIT_ENOTFOUND);
155 if (!value.IsEmpty() || m_iConfigSource == CFG_SRC_EFFECTIVE)
157 int nLogWidthMarker = _ttoi(value);
158 m_Border.Format(L"%d", nLogWidthMarker);
159 m_bInheritBorder = FALSE;
163 GetBoolConfigValueComboBox(config, PROJECTPROPNAME_WARNNOSIGNEDOFFBY, m_cWarnNoSignedOffBy);
165 m_bInheritIconFile = (config.GetString(PROJECTPROPNAME_ICON, m_iconFile) == GIT_ENOTFOUND);
167 m_bNeedSave = false;
168 SetModified(FALSE);
169 UpdateData(FALSE);
172 BOOL CSetDialogs3::SafeDataImpl(CAutoConfig& config)
174 if (m_langCombo.GetCurSel() == 2) // disable
176 if (!Save(config, PROJECTPROPNAME_PROJECTLANGUAGE, L"-1"))
177 return FALSE;
179 else if (m_langCombo.GetCurSel() == 0) // inherit
181 if (!Save(config, PROJECTPROPNAME_PROJECTLANGUAGE, L"", true))
182 return FALSE;
184 else
186 CString value;
187 char numBuf[20] = { 0 };
188 sprintf_s(numBuf, "%lu", (DWORD)m_langCombo.GetItemData(m_langCombo.GetCurSel()));
189 if (!Save(config, PROJECTPROPNAME_PROJECTLANGUAGE, (CString)numBuf))
190 return FALSE;
193 if (!Save(config, PROJECTPROPNAME_LOGMINSIZE, m_LogMinSize, m_bInheritLogMinSize == TRUE))
194 return FALSE;
196 if (!Save(config, PROJECTPROPNAME_LOGWIDTHLINE, m_Border, m_bInheritBorder == TRUE))
197 return FALSE;
200 CString value;
201 m_cWarnNoSignedOffBy.GetWindowText(value);
202 if (!Save(config, PROJECTPROPNAME_WARNNOSIGNEDOFFBY, value, value.IsEmpty()))
203 return FALSE;
206 if (!Save(config, PROJECTPROPNAME_ICON, m_iconFile, m_bInheritIconFile == TRUE))
207 return FALSE;
209 return TRUE;
212 void CSetDialogs3::EnDisableControls()
214 GetDlgItem(IDC_LOGMINSIZE)->SendMessage(EM_SETREADONLY, m_iConfigSource == CFG_SRC_EFFECTIVE, 0);
215 GetDlgItem(IDC_BORDER)->SendMessage(EM_SETREADONLY, m_iConfigSource == CFG_SRC_EFFECTIVE, 0);
216 GetDlgItem(IDC_LANGCOMBO)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE);
217 GetDlgItem(IDC_WARN_NO_SIGNED_OFF_BY)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE);
218 GetDlgItem(IDC_COMBO_SETTINGS_SAFETO)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE);
219 GetDlgItem(IDC_ICONFILE)->SendMessage(EM_SETREADONLY, m_iConfigSource == CFG_SRC_EFFECTIVE, 0);
220 GetDlgItem(IDC_ICONFILE_BROWSE)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE && !m_bInheritIconFile);
221 GetDlgItem(IDC_CHECK_INHERIT_LIMIT)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE);
222 GetDlgItem(IDC_CHECK_INHERIT_BORDER)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE);
223 GetDlgItem(IDC_CHECK_INHERIT_ICONPATH)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE);
225 GetDlgItem(IDC_LOGMINSIZE)->EnableWindow(!m_bInheritLogMinSize);
226 GetDlgItem(IDC_BORDER)->EnableWindow(!m_bInheritBorder);
227 GetDlgItem(IDC_ICONFILE)->EnableWindow(!m_bInheritIconFile);
228 UpdateData(FALSE);
231 void CSetDialogs3::OnChange()
233 UpdateData();
234 EnDisableControls();
235 m_bNeedSave = true;
236 SetModified();
239 void CSetDialogs3::OnBnClickedIconfileBrowse()
241 UpdateData(TRUE);
242 CString currentDir = g_Git.m_CurrentDir + (g_Git.m_CurrentDir.Right(1) == _T("\\") ? _T("") : _T("\\"));
243 CString iconFile = m_iconFile;
244 if (!(iconFile.Mid(1, 1) == L":" || CStringUtils::StartsWith(iconFile, L"\\")))
245 iconFile = currentDir + iconFile;
246 iconFile.Replace('/', '\\');
247 if (!CAppUtils::FileOpenSave(iconFile, nullptr, 0, IDS_ICONFILEFILTER, true, GetSafeHwnd()))
248 return;
250 if (CStringUtils::StartsWith(iconFile, currentDir))
251 iconFile = iconFile.Mid(currentDir.GetLength());
252 iconFile.Replace('\\', '/');
253 if (m_iconFile != iconFile)
255 m_iconFile = iconFile;
256 m_bNeedSave = true;
257 SetModified();
259 UpdateData(FALSE);
262 BOOL CSetDialogs3::OnApply()
264 if (!m_bNeedSave)
265 return TRUE;
266 UpdateData();
267 if (!SafeData())
268 return FALSE;
269 m_bNeedSave = false;
270 SetModified(FALSE);
271 return ISettingsPropPage::OnApply();
274 BOOL CSetDialogs3::EnumLocalesProc(LPTSTR lpLocaleString)
276 DWORD langID = _tcstol(lpLocaleString, nullptr, 16);
277 g_langs.push_back(langID);
278 return TRUE;
281 void CSetDialogs3::AddLangToCombo(DWORD langID)
283 TCHAR buf[MAX_PATH] = {0};
284 GetLocaleInfo(langID, LOCALE_SNATIVELANGNAME, buf, _countof(buf));
285 CString sLang = buf;
286 GetLocaleInfo(langID, LOCALE_SNATIVECTRYNAME, buf, _countof(buf));
287 if (buf[0])
289 sLang += _T(" (");
290 sLang += buf;
291 sLang += _T(")");
294 int index = m_langCombo.AddString(sLang);
295 m_langCombo.SetItemData(index, langID);