Adjust checkbox and radio control widths to required size
[TortoiseGit.git] / src / TortoiseProc / Settings / SetDialogs3.cpp
blobce8bda56c78c777f01ac53f3acc4187dde66091f
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2013-2014 - 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 m_tooltips.Create(this);
94 InitGitSettings(this, true, &m_tooltips);
96 UpdateData(FALSE);
97 return TRUE;
100 static void SelectLanguage(CComboBox &combobox, LONG langueage)
102 for (int i = 0; i < combobox.GetCount(); ++i)
104 if (combobox.GetItemData(i) == langueage)
106 combobox.SetCurSel(i);
107 break;
112 void CSetDialogs3::LoadDataImpl(CAutoConfig& config)
115 CString value;
116 if (config.GetString(PROJECTPROPNAME_PROJECTLANGUAGE, value) == GIT_ENOTFOUND && m_iConfigSource != 0)
117 m_langCombo.SetCurSel(0);
118 else if (value == _T("-1"))
119 m_langCombo.SetCurSel(2);
120 else if (!value.IsEmpty())
122 LPTSTR strEnd;
123 long longValue = _tcstol(value, &strEnd, 0);
124 if (longValue == 0)
126 if (m_iConfigSource == 0)
127 SelectLanguage(m_langCombo, CRegDWORD(_T("Software\\TortoiseGit\\LanguageID"), 1033));
128 else
129 m_langCombo.SetCurSel(1);
131 else
132 SelectLanguage(m_langCombo, longValue);
134 else if (m_iConfigSource == 0)
135 SelectLanguage(m_langCombo, CRegDWORD(_T("Software\\TortoiseGit\\LanguageID"), 1033));
136 else
137 m_langCombo.SetCurSel(1);
141 m_LogMinSize = _T("");
142 CString value;
143 m_bInheritLogMinSize = (config.GetString(PROJECTPROPNAME_LOGMINSIZE, value) == GIT_ENOTFOUND);
144 if (!value.IsEmpty() || m_iConfigSource == 0)
146 int nMinLogSize = _ttoi(value);
147 m_LogMinSize.Format(L"%d", nMinLogSize);
148 m_bInheritLogMinSize = FALSE;
153 m_Border = _T("");
154 CString value;
155 m_bInheritBorder = (config.GetString(PROJECTPROPNAME_LOGWIDTHLINE, value) == GIT_ENOTFOUND);
156 if (!value.IsEmpty() || m_iConfigSource == 0)
158 int nLogWidthMarker = _ttoi(value);
159 m_Border.Format(L"%d", nLogWidthMarker);
160 m_bInheritBorder = FALSE;
164 GetBoolConfigValueComboBox(config, PROJECTPROPNAME_WARNNOSIGNEDOFFBY, m_cWarnNoSignedOffBy);
166 m_bInheritIconFile = (config.GetString(PROJECTPROPNAME_ICON, m_iconFile) == GIT_ENOTFOUND);
168 m_bNeedSave = false;
169 SetModified(FALSE);
170 UpdateData(FALSE);
173 BOOL CSetDialogs3::SafeDataImpl(CAutoConfig& config)
175 if (m_langCombo.GetCurSel() == 2) // disable
177 if (!Save(config, PROJECTPROPNAME_PROJECTLANGUAGE, L"-1"))
178 return FALSE;
180 else if (m_langCombo.GetCurSel() == 0) // inherit
182 if (!Save(config, PROJECTPROPNAME_PROJECTLANGUAGE, L"", true))
183 return FALSE;
185 else
187 CString value;
188 char numBuf[20] = { 0 };
189 sprintf_s(numBuf, "%ld", m_langCombo.GetItemData(m_langCombo.GetCurSel()));
190 if (!Save(config, PROJECTPROPNAME_PROJECTLANGUAGE, (CString)numBuf))
191 return FALSE;
194 if (!Save(config, PROJECTPROPNAME_LOGMINSIZE, m_LogMinSize, m_bInheritLogMinSize == TRUE))
195 return FALSE;
197 if (!Save(config, PROJECTPROPNAME_LOGWIDTHLINE, m_Border, m_bInheritBorder == TRUE))
198 return FALSE;
201 CString value;
202 m_cWarnNoSignedOffBy.GetWindowText(value);
203 if (!Save(config, PROJECTPROPNAME_WARNNOSIGNEDOFFBY, value, value.IsEmpty()))
204 return FALSE;
207 if (!Save(config, PROJECTPROPNAME_ICON, m_iconFile, m_bInheritIconFile == TRUE))
208 return FALSE;
210 return TRUE;
213 BOOL CSetDialogs3::PreTranslateMessage(MSG* pMsg)
215 m_tooltips.RelayEvent(pMsg);
216 return ISettingsPropPage::PreTranslateMessage(pMsg);
219 void CSetDialogs3::EnDisableControls()
221 GetDlgItem(IDC_LOGMINSIZE)->SendMessage(EM_SETREADONLY, m_iConfigSource == 0, 0);
222 GetDlgItem(IDC_BORDER)->SendMessage(EM_SETREADONLY, m_iConfigSource == 0, 0);
223 GetDlgItem(IDC_LANGCOMBO)->EnableWindow(m_iConfigSource != 0);
224 GetDlgItem(IDC_WARN_NO_SIGNED_OFF_BY)->EnableWindow(m_iConfigSource != 0);
225 GetDlgItem(IDC_COMBO_SETTINGS_SAFETO)->EnableWindow(m_iConfigSource != 0);
226 GetDlgItem(IDC_ICONFILE)->SendMessage(EM_SETREADONLY, m_iConfigSource == 0, 0);
227 GetDlgItem(IDC_ICONFILE_BROWSE)->EnableWindow(m_iConfigSource != 0 && !m_bInheritIconFile);
228 GetDlgItem(IDC_CHECK_INHERIT_LIMIT)->EnableWindow(m_iConfigSource != 0);
229 GetDlgItem(IDC_CHECK_INHERIT_BORDER)->EnableWindow(m_iConfigSource != 0);
230 GetDlgItem(IDC_CHECK_INHERIT_ICONPATH)->EnableWindow(m_iConfigSource != 0);
232 GetDlgItem(IDC_LOGMINSIZE)->EnableWindow(!m_bInheritLogMinSize);
233 GetDlgItem(IDC_BORDER)->EnableWindow(!m_bInheritBorder);
234 GetDlgItem(IDC_ICONFILE)->EnableWindow(!m_bInheritIconFile);
235 UpdateData(FALSE);
238 void CSetDialogs3::OnChange()
240 UpdateData();
241 EnDisableControls();
242 m_bNeedSave = true;
243 SetModified();
246 void CSetDialogs3::OnBnClickedIconfileBrowse()
248 UpdateData(TRUE);
249 CString currentDir = g_Git.m_CurrentDir + (g_Git.m_CurrentDir.Right(1) == _T("\\") ? _T("") : _T("\\"));
250 CString iconFile = m_iconFile;
251 if (!(iconFile.Mid(1, 1) == _T(":") || iconFile.Left(1) == _T("\\")))
252 iconFile = currentDir + iconFile;
253 iconFile.Replace('/', '\\');
254 CFileDialog dlg(FALSE, _T(""), iconFile, OFN_FILEMUSTEXIST, CString(MAKEINTRESOURCE(IDS_ICONFILEFILTER)));
256 INT_PTR ret = dlg.DoModal();
257 SetCurrentDirectory(g_Git.m_CurrentDir);
258 if (ret == IDOK)
260 CString iconFile = dlg.GetPathName();
261 if (iconFile.Left(currentDir.GetLength()) == currentDir)
262 iconFile = iconFile.Mid(currentDir.GetLength());
263 iconFile.Replace('\\', '/');
264 if (m_iconFile != iconFile)
266 m_iconFile = iconFile;
267 m_bNeedSave = true;
268 SetModified();
270 UpdateData(FALSE);
274 BOOL CSetDialogs3::OnApply()
276 if (!m_bNeedSave)
277 return TRUE;
278 UpdateData();
279 if (!SafeData())
280 return FALSE;
281 m_bNeedSave = false;
282 SetModified(FALSE);
283 return ISettingsPropPage::OnApply();
286 BOOL CSetDialogs3::EnumLocalesProc(LPTSTR lpLocaleString)
288 DWORD langID = _tcstol(lpLocaleString, NULL, 16);
289 g_langs.push_back(langID);
290 return TRUE;
293 void CSetDialogs3::AddLangToCombo(DWORD langID)
295 TCHAR buf[MAX_PATH] = {0};
296 GetLocaleInfo(langID, LOCALE_SNATIVELANGNAME, buf, _countof(buf));
297 CString sLang = buf;
298 GetLocaleInfo(langID, LOCALE_SNATIVECTRYNAME, buf, _countof(buf));
299 if (buf[0])
301 sLang += _T(" (");
302 sLang += buf;
303 sLang += _T(")");
306 int index = m_langCombo.AddString(sLang);
307 m_langCombo.SetItemData(index, langID);