Improve line margin icon for moved lines
[TortoiseGit.git] / src / TortoiseProc / Settings / SetDialogs3.cpp
blobc3d6080b6d7f2a0149b6c18eda47821fd7f9bc60
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2013-2017 - 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 m_tooltips.AddTool(IDC_CHECK_INHERIT_LIMIT, IDS_SETTINGS_GITCONFIG_INHERIT_TT);
80 m_tooltips.AddTool(IDC_CHECK_INHERIT_BORDER, IDS_SETTINGS_GITCONFIG_INHERIT_TT);
81 m_tooltips.AddTool(IDC_CHECK_INHERIT_KEYID, IDS_SETTINGS_GITCONFIG_INHERIT_TT);
83 AddTrueFalseToComboBox(m_cWarnNoSignedOffBy);
85 m_langCombo.AddString(L"");
86 m_langCombo.SetItemData(0, (DWORD_PTR)-2);
87 m_langCombo.AddString(L"(auto)"); // do not translate, the order matters!
88 m_langCombo.SetItemData(1, 0);
89 m_langCombo.AddString(L"(disable)"); // do not translate, the order matters!
90 m_langCombo.SetItemData(2, (DWORD_PTR)-1);
91 // fill the combo box with all available languages
92 g_langs.clear();
93 EnumSystemLocales(EnumLocalesProc, LCID_SUPPORTED);
94 for (DWORD langID : g_langs)
95 AddLangToCombo(langID);
97 InitGitSettings(this, true, &m_tooltips);
99 UpdateData(FALSE);
100 return TRUE;
103 static void SelectLanguage(CComboBox &combobox, LONG langueage)
105 for (int i = 0; i < combobox.GetCount(); ++i)
107 if (combobox.GetItemData(i) == (DWORD)langueage)
109 combobox.SetCurSel(i);
110 break;
115 void CSetDialogs3::LoadDataImpl(CAutoConfig& config)
118 CString value;
119 if (config.GetString(PROJECTPROPNAME_PROJECTLANGUAGE, value) == GIT_ENOTFOUND && m_iConfigSource != 0)
120 m_langCombo.SetCurSel(0);
121 else if (value == L"-1")
122 m_langCombo.SetCurSel(2);
123 else if (!value.IsEmpty())
125 LPTSTR strEnd;
126 long longValue = wcstol(value, &strEnd, 0);
127 if (longValue == 0)
129 if (m_iConfigSource == CFG_SRC_EFFECTIVE)
130 SelectLanguage(m_langCombo, CRegDWORD(L"Software\\TortoiseGit\\LanguageID", 1033));
131 else
132 m_langCombo.SetCurSel(1);
134 else
135 SelectLanguage(m_langCombo, longValue);
137 else if (m_iConfigSource == CFG_SRC_EFFECTIVE)
138 SelectLanguage(m_langCombo, CRegDWORD(L"Software\\TortoiseGit\\LanguageID", 1033));
139 else
140 m_langCombo.SetCurSel(1);
144 m_LogMinSize.Empty();
145 CString value;
146 m_bInheritLogMinSize = (config.GetString(PROJECTPROPNAME_LOGMINSIZE, value) == GIT_ENOTFOUND);
147 if (!value.IsEmpty() || m_iConfigSource == CFG_SRC_EFFECTIVE)
149 int nMinLogSize = _wtoi(value);
150 m_LogMinSize.Format(L"%d", nMinLogSize);
151 m_bInheritLogMinSize = FALSE;
156 m_Border.Empty();
157 CString value;
158 m_bInheritBorder = (config.GetString(PROJECTPROPNAME_LOGWIDTHLINE, value) == GIT_ENOTFOUND);
159 if (!value.IsEmpty() || m_iConfigSource == CFG_SRC_EFFECTIVE)
161 int nLogWidthMarker = _wtoi(value);
162 m_Border.Format(L"%d", nLogWidthMarker);
163 m_bInheritBorder = FALSE;
167 GetBoolConfigValueComboBox(config, PROJECTPROPNAME_WARNNOSIGNEDOFFBY, m_cWarnNoSignedOffBy);
169 m_bInheritIconFile = (config.GetString(PROJECTPROPNAME_ICON, m_iconFile) == GIT_ENOTFOUND);
171 m_bNeedSave = false;
172 SetModified(FALSE);
173 UpdateData(FALSE);
176 BOOL CSetDialogs3::SafeDataImpl(CAutoConfig& config)
178 if (m_langCombo.GetCurSel() == 2) // disable
180 if (!Save(config, PROJECTPROPNAME_PROJECTLANGUAGE, L"-1"))
181 return FALSE;
183 else if (m_langCombo.GetCurSel() == 0) // inherit
185 if (!Save(config, PROJECTPROPNAME_PROJECTLANGUAGE, L"", true))
186 return FALSE;
188 else
190 CString value;
191 char numBuf[20] = { 0 };
192 sprintf_s(numBuf, "%lu", (DWORD)m_langCombo.GetItemData(m_langCombo.GetCurSel()));
193 if (!Save(config, PROJECTPROPNAME_PROJECTLANGUAGE, (CString)numBuf))
194 return FALSE;
197 if (!Save(config, PROJECTPROPNAME_LOGMINSIZE, m_LogMinSize, m_bInheritLogMinSize == TRUE))
198 return FALSE;
200 if (!Save(config, PROJECTPROPNAME_LOGWIDTHLINE, m_Border, m_bInheritBorder == TRUE))
201 return FALSE;
204 CString value;
205 m_cWarnNoSignedOffBy.GetWindowText(value);
206 if (!Save(config, PROJECTPROPNAME_WARNNOSIGNEDOFFBY, value, value.IsEmpty()))
207 return FALSE;
210 if (!Save(config, PROJECTPROPNAME_ICON, m_iconFile, m_bInheritIconFile == TRUE))
211 return FALSE;
213 return TRUE;
216 void CSetDialogs3::EnDisableControls()
218 GetDlgItem(IDC_LOGMINSIZE)->SendMessage(EM_SETREADONLY, m_iConfigSource == CFG_SRC_EFFECTIVE, 0);
219 GetDlgItem(IDC_BORDER)->SendMessage(EM_SETREADONLY, m_iConfigSource == CFG_SRC_EFFECTIVE, 0);
220 GetDlgItem(IDC_LANGCOMBO)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE);
221 GetDlgItem(IDC_WARN_NO_SIGNED_OFF_BY)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE);
222 GetDlgItem(IDC_COMBO_SETTINGS_SAFETO)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE);
223 GetDlgItem(IDC_ICONFILE)->SendMessage(EM_SETREADONLY, m_iConfigSource == CFG_SRC_EFFECTIVE, 0);
224 GetDlgItem(IDC_ICONFILE_BROWSE)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE && !m_bInheritIconFile);
225 GetDlgItem(IDC_CHECK_INHERIT_LIMIT)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE);
226 GetDlgItem(IDC_CHECK_INHERIT_BORDER)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE);
227 GetDlgItem(IDC_CHECK_INHERIT_ICONPATH)->EnableWindow(m_iConfigSource != CFG_SRC_EFFECTIVE);
229 GetDlgItem(IDC_LOGMINSIZE)->EnableWindow(!m_bInheritLogMinSize);
230 GetDlgItem(IDC_BORDER)->EnableWindow(!m_bInheritBorder);
231 GetDlgItem(IDC_ICONFILE)->EnableWindow(!m_bInheritIconFile);
232 UpdateData(FALSE);
235 void CSetDialogs3::OnChange()
237 UpdateData();
238 EnDisableControls();
239 m_bNeedSave = true;
240 SetModified();
243 void CSetDialogs3::OnBnClickedIconfileBrowse()
245 UpdateData(TRUE);
246 CString currentDir = g_Git.m_CurrentDir + (CStringUtils::EndsWith(g_Git.m_CurrentDir, L'\\') ? L"" : L"\\");
247 CString iconFile = m_iconFile;
248 if (!(iconFile.Mid(1, 1) == L":" || CStringUtils::StartsWith(iconFile, L"\\")))
249 iconFile = currentDir + iconFile;
250 iconFile.Replace('/', '\\');
251 if (!CAppUtils::FileOpenSave(iconFile, nullptr, 0, IDS_ICONFILEFILTER, true, GetSafeHwnd()))
252 return;
254 if (CStringUtils::StartsWith(iconFile, currentDir))
255 iconFile = iconFile.Mid(currentDir.GetLength());
256 iconFile.Replace('\\', '/');
257 if (m_iconFile != iconFile)
259 m_iconFile = iconFile;
260 m_bNeedSave = true;
261 SetModified();
263 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 = wcstol(lpLocaleString, nullptr, 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 += L" (";
294 sLang += buf;
295 sLang += L')';
298 int index = m_langCombo.AddString(sLang);
299 m_langCombo.SetItemData(index, langID);