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.
20 #include "TortoiseProc.h"
21 #include "SetMainPage.h"
22 #include "ProjectProperties.h"
23 #include "SetDialogs3.h"
26 static std::vector
<DWORD
> g_langs
;
28 IMPLEMENT_DYNAMIC(CSetDialogs3
, ISettingsPropPage
)
29 CSetDialogs3::CSetDialogs3()
30 : ISettingsPropPage(CSetDialogs3::IDD
)
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
);
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
)
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
93 EnumSystemLocales(EnumLocalesProc
, LCID_SUPPORTED
);
94 for (DWORD langID
: g_langs
)
95 AddLangToCombo(langID
);
97 InitGitSettings(this, true, &m_tooltips
);
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
);
115 void CSetDialogs3::LoadDataImpl(CAutoConfig
& config
)
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())
126 long longValue
= wcstol(value
, &strEnd
, 0);
129 if (m_iConfigSource
== CFG_SRC_EFFECTIVE
)
130 SelectLanguage(m_langCombo
, CRegDWORD(L
"Software\\TortoiseGit\\LanguageID", 1033));
132 m_langCombo
.SetCurSel(1);
135 SelectLanguage(m_langCombo
, longValue
);
137 else if (m_iConfigSource
== CFG_SRC_EFFECTIVE
)
138 SelectLanguage(m_langCombo
, CRegDWORD(L
"Software\\TortoiseGit\\LanguageID", 1033));
140 m_langCombo
.SetCurSel(1);
144 m_LogMinSize
.Empty();
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
;
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
);
176 BOOL
CSetDialogs3::SafeDataImpl(CAutoConfig
& config
)
178 if (m_langCombo
.GetCurSel() == 2) // disable
180 if (!Save(config
, PROJECTPROPNAME_PROJECTLANGUAGE
, L
"-1"))
183 else if (m_langCombo
.GetCurSel() == 0) // inherit
185 if (!Save(config
, PROJECTPROPNAME_PROJECTLANGUAGE
, L
"", true))
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
))
197 if (!Save(config
, PROJECTPROPNAME_LOGMINSIZE
, m_LogMinSize
, m_bInheritLogMinSize
== TRUE
))
200 if (!Save(config
, PROJECTPROPNAME_LOGWIDTHLINE
, m_Border
, m_bInheritBorder
== TRUE
))
205 m_cWarnNoSignedOffBy
.GetWindowText(value
);
206 if (!Save(config
, PROJECTPROPNAME_WARNNOSIGNEDOFFBY
, value
, value
.IsEmpty()))
210 if (!Save(config
, PROJECTPROPNAME_ICON
, m_iconFile
, m_bInheritIconFile
== 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
);
235 void CSetDialogs3::OnChange()
243 void CSetDialogs3::OnBnClickedIconfileBrowse()
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()))
254 if (CStringUtils::StartsWith(iconFile
, currentDir
))
255 iconFile
= iconFile
.Mid(currentDir
.GetLength());
256 iconFile
.Replace('\\', '/');
257 if (m_iconFile
!= iconFile
)
259 m_iconFile
= iconFile
;
266 BOOL
CSetDialogs3::OnApply()
275 return ISettingsPropPage::OnApply();
278 BOOL
CSetDialogs3::EnumLocalesProc(LPTSTR lpLocaleString
)
280 DWORD langID
= wcstol(lpLocaleString
, nullptr, 16);
281 g_langs
.push_back(langID
);
285 void CSetDialogs3::AddLangToCombo(DWORD langID
)
287 TCHAR buf
[MAX_PATH
] = {0};
288 GetLocaleInfo(langID
, LOCALE_SNATIVELANGNAME
, buf
, _countof(buf
));
290 GetLocaleInfo(langID
, LOCALE_SNATIVECTRYNAME
, buf
, _countof(buf
));
298 int index
= m_langCombo
.AddString(sLang
);
299 m_langCombo
.SetItemData(index
, langID
);