Allow to control whether fetch uses default refspec for named remotes
[TortoiseGit.git] / src / TortoiseProc / Settings / SettingsAdvanced.cpp
blobc355ca986e0eb72dd7fe4bd7815df56352dc9a9e
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2012-2017 - TortoiseGit
4 // Copyright (C) 2009-2011, 2013 - TortoiseSVN
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software Foundation,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include "stdafx.h"
22 #include "TortoiseProc.h"
23 #include "SettingsAdvanced.h"
24 #include "registry.h"
27 IMPLEMENT_DYNAMIC(CSettingsAdvanced, ISettingsPropPage)
29 CSettingsAdvanced::CSettingsAdvanced()
30 : ISettingsPropPage(CSettingsAdvanced::IDD)
32 int i = 0;
33 settings[i].sName = L"AutoCompleteMinChars";
34 settings[i].type = CSettingsAdvanced::SettingTypeNumber;
35 settings[i++].def.l = 3;
37 settings[i].sName = L"AutocompleteParseMaxSize";
38 settings[i].type = CSettingsAdvanced::SettingTypeNumber;
39 settings[i++].def.l = 300000L;
41 settings[i].sName = L"AutocompleteParseUnversioned";
42 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
43 settings[i++].def.b = false;
45 settings[i].sName = L"AutocompleteRemovesExtensions";
46 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
47 settings[i++].def.b = false;
49 settings[i].sName = L"BlockStatus";
50 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
51 settings[i++].def.b = false;
53 settings[i].sName = L"CacheTrayIcon";
54 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
55 settings[i++].def.b = false;
57 settings[i].sName = L"CacheSave";
58 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
59 settings[i++].def.b = true;
61 settings[i].sName = L"CygwinHack";
62 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
63 settings[i++].def.b = false;
65 settings[i].sName = L"Debug";
66 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
67 settings[i++].def.b = false;
69 settings[i].sName = L"DebugOutputString";
70 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
71 settings[i++].def.b = false;
73 settings[i].sName = L"DiffBlamesWithTortoiseMerge";
74 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
75 settings[i++].def.b = false;
77 settings[i].sName = L"FullRowSelect";
78 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
79 settings[i++].def.b = true;
81 settings[i].sName = L"GroupTaskbarIconsPerRepo";
82 settings[i].type = CSettingsAdvanced::SettingTypeNumber;
83 settings[i++].def.l = 3;
85 settings[i].sName = L"GroupTaskbarIconsPerRepoOverlay";
86 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
87 settings[i++].def.b = true;
89 settings[i].sName = L"LogIncludeBoundaryCommits";
90 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
91 settings[i++].def.b = false;
93 settings[i].sName = L"LogShowSuperProjectSubmodulePointer";
94 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
95 settings[i++].def.b = true;
97 settings[i].sName = L"MaxRefHistoryItems";
98 settings[i].type = CSettingsAdvanced::SettingTypeNumber;
99 settings[i++].def.l = 5;
101 settings[i].sName = L"Msys2Hack";
102 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
103 settings[i++].def.b = false;
105 settings[i].sName = L"NamedRemoteFetchAll";
106 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
107 settings[i++].def.b = true;
109 settings[i].sName = L"NoSortLocalBranchesFirst";
110 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
111 settings[i++].def.b = false;
113 settings[i].sName = L"NumDiffWarning";
114 settings[i].type = CSettingsAdvanced::SettingTypeNumber;
115 settings[i++].def.l = 10;
117 settings[i].sName = L"ProgressDlgLinesLimit";
118 settings[i].type = CSettingsAdvanced::SettingTypeNumber;
119 settings[i++].def.l = 50000;
121 settings[i].sName = L"PullRebaseBehaviorLike1816";
122 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
123 settings[i++].def.b = false;
125 settings[i].sName = L"ReaddUnselectedAddedFilesAfterCommit";
126 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
127 settings[i++].def.b = true;
129 settings[i].sName = L"RefreshFileListAfterResolvingConflict";
130 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
131 settings[i++].def.b = true;
133 settings[i].sName = L"RememberFileListPosition";
134 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
135 settings[i++].def.b = true;
137 settings[i].sName = L"SanitizeCommitMsg";
138 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
139 settings[i++].def.b = true;
141 settings[i].sName = L"ScintillaDirect2D";
142 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
143 settings[i++].def.b = false;
145 settings[i].sName = L"ShellMenuAccelerators";
146 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
147 settings[i++].def.b = true;
149 settings[i].sName = L"ShowContextMenuIcons";
150 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
151 settings[i++].def.b = true;
153 settings[i].sName = L"ShowAppContextMenuIcons";
154 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
155 settings[i++].def.b = true;
157 settings[i].sName = L"ShowListBackgroundImage";
158 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
159 settings[i++].def.b = true;
161 settings[i].sName = L"ShowListFullPathTooltip";
162 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
163 settings[i++].def.b = true;
165 settings[i].sName = L"SquashDate";
166 settings[i].type = CSettingsAdvanced::SettingTypeNumber;
167 settings[i++].def.l = 0;
169 settings[i].sName = L"StyleCommitMessages";
170 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
171 settings[i++].def.b = true;
173 settings[i].sName = L"TGitCacheCheckContentMaxSize";
174 settings[i].type = CSettingsAdvanced::SettingTypeNumber;
175 settings[i++].def.l = 10 * 1024;
177 settings[i].sName = L"UseLibgit2";
178 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
179 settings[i++].def.b = true;
181 settings[i].sName = L"VersionCheck";
182 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
183 settings[i++].def.b = true;
185 settings[i].sName = L"VersionCheckPreview";
186 settings[i].type = CSettingsAdvanced::SettingTypeBoolean;
187 settings[i++].def.b = false;
189 settings[i].sName = L"";
190 settings[i].type = CSettingsAdvanced::SettingTypeNone;
191 settings[i++].def.b = false;
194 CSettingsAdvanced::~CSettingsAdvanced()
198 void CSettingsAdvanced::DoDataExchange(CDataExchange* pDX)
200 ISettingsPropPage::DoDataExchange(pDX);
201 DDX_Control(pDX, IDC_CONFIG, m_ListCtrl);
205 BEGIN_MESSAGE_MAP(CSettingsAdvanced, ISettingsPropPage)
206 ON_NOTIFY(LVN_BEGINLABELEDIT, IDC_CONFIG, &CSettingsAdvanced::OnLvnBeginlabeledit)
207 ON_NOTIFY(LVN_ENDLABELEDIT, IDC_CONFIG, &CSettingsAdvanced::OnLvnEndlabeledit)
208 ON_NOTIFY(NM_DBLCLK, IDC_CONFIG, &CSettingsAdvanced::OnNMDblclkConfig)
209 END_MESSAGE_MAP()
212 BOOL CSettingsAdvanced::OnInitDialog()
214 ISettingsPropPage::OnInitDialog();
216 m_ListCtrl.DeleteAllItems();
217 int c = m_ListCtrl.GetHeaderCtrl()->GetItemCount() - 1;
218 while (c >= 0)
219 m_ListCtrl.DeleteColumn(c--);
221 SetWindowTheme(m_ListCtrl.GetSafeHwnd(), L"Explorer", nullptr);
223 CString temp;
224 temp.LoadString(IDS_SETTINGS_CONF_VALUECOL);
225 m_ListCtrl.InsertColumn(0, temp);
226 temp.LoadString(IDS_SETTINGS_CONF_NAMECOL);
227 m_ListCtrl.InsertColumn(1, temp);
229 m_ListCtrl.SetRedraw(FALSE);
231 int i = 0;
232 while (settings[i].type != SettingTypeNone)
234 m_ListCtrl.InsertItem(i, settings[i].sName);
235 m_ListCtrl.SetItemText(i, 1, settings[i].sName);
236 switch (settings[i].type)
238 case SettingTypeBoolean:
240 CRegDWORD s(L"Software\\TortoiseGit\\" + settings[i].sName, settings[i].def.b);
241 m_ListCtrl.SetItemText(i, 0, DWORD(s) ? L"true" : L"false");
243 break;
244 case SettingTypeNumber:
246 CRegDWORD s(L"Software\\TortoiseGit\\" + settings[i].sName, settings[i].def.l);
247 temp.Format(L"%ld", (DWORD)s);
248 m_ListCtrl.SetItemText(i, 0, temp);
250 break;
251 case SettingTypeString:
253 CRegString s(L"Software\\TortoiseGit\\" + settings[i].sName, settings[i].def.s);
254 m_ListCtrl.SetItemText(i, 0, CString(s));
258 ++i;
261 int mincol = 0;
262 int maxcol = m_ListCtrl.GetHeaderCtrl()->GetItemCount() - 1;
263 int col;
264 for (col = mincol; col <= maxcol; ++col)
265 m_ListCtrl.SetColumnWidth(col, LVSCW_AUTOSIZE_USEHEADER);
266 int arr[2] = {1,0};
267 m_ListCtrl.SetColumnOrderArray(2, arr);
268 m_ListCtrl.SetRedraw(TRUE);
270 return TRUE;
273 BOOL CSettingsAdvanced::OnApply()
275 int i = 0;
276 while (settings[i].type != SettingTypeNone)
278 CString sValue = m_ListCtrl.GetItemText(i, 0);
279 switch (settings[i].type)
281 case SettingTypeBoolean:
283 CRegDWORD s(L"Software\\TortoiseGit\\" + settings[i].sName, settings[i].def.b);
284 if (sValue.IsEmpty())
285 s.removeValue();
286 else
288 DWORD newValue = sValue.Compare(L"true") == 0;
289 if (DWORD(s) != newValue)
290 s = newValue;
293 break;
294 case SettingTypeNumber:
296 CRegDWORD s(L"Software\\TortoiseGit\\" + settings[i].sName, settings[i].def.l);
297 if (DWORD(_wtol(sValue)) != DWORD(s))
298 s = _wtol(sValue);
300 break;
301 case SettingTypeString:
303 CRegString s(L"Software\\TortoiseGit\\" + settings[i].sName, settings[i].def.s);
304 if (sValue.Compare(CString(s)))
305 s = sValue;
309 ++i;
312 return ISettingsPropPage::OnApply();
315 void CSettingsAdvanced::OnLvnBeginlabeledit(NMHDR * /*pNMHDR*/, LRESULT *pResult)
317 *pResult = FALSE;
320 void CSettingsAdvanced::OnLvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult)
322 NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
323 *pResult = 0;
324 if (!pDispInfo->item.pszText)
325 return;
327 bool allowEdit = false;
328 switch (settings[pDispInfo->item.iItem].type)
330 case SettingTypeBoolean:
332 if ((pDispInfo->item.pszText[0] == 0) ||
333 (wcscmp(pDispInfo->item.pszText, L"true") == 0) ||
334 (wcscmp(pDispInfo->item.pszText, L"false") == 0))
336 allowEdit = true;
339 break;
340 case SettingTypeNumber:
342 TCHAR * pChar = pDispInfo->item.pszText;
343 allowEdit = true;
344 while (*pChar)
346 if (!_istdigit(*pChar))
348 allowEdit = false;
349 break;
351 ++pChar;
354 break;
355 case SettingTypeString:
356 allowEdit = true;
357 break;
360 if (allowEdit)
361 SetModified();
363 *pResult = allowEdit ? TRUE : FALSE;
366 BOOL CSettingsAdvanced::PreTranslateMessage(MSG* pMsg)
368 if (pMsg->message == WM_KEYDOWN)
370 switch (pMsg->wParam)
372 case VK_F2:
374 m_ListCtrl.EditLabel(m_ListCtrl.GetSelectionMark());
376 break;
379 return ISettingsPropPage::PreTranslateMessage(pMsg);
382 void CSettingsAdvanced::OnNMDblclkConfig(NMHDR *pNMHDR, LRESULT *pResult)
384 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
385 m_ListCtrl.EditLabel(pNMItemActivate->iItem);
386 *pResult = 0;