1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2012-2016 - 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.
22 #include "TortoiseProc.h"
23 #include "SettingsAdvanced.h"
27 IMPLEMENT_DYNAMIC(CSettingsAdvanced
, ISettingsPropPage
)
29 CSettingsAdvanced::CSettingsAdvanced()
30 : ISettingsPropPage(CSettingsAdvanced::IDD
)
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
"MaxRefHistoryItems";
94 settings
[i
].type
= CSettingsAdvanced::SettingTypeNumber
;
95 settings
[i
++].def
.l
= 5;
97 settings
[i
].sName
= L
"Msys2Hack";
98 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
99 settings
[i
++].def
.b
= false;
101 settings
[i
].sName
= L
"NoSortLocalBranchesFirst";
102 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
103 settings
[i
++].def
.b
= false;
105 settings
[i
].sName
= L
"NumDiffWarning";
106 settings
[i
].type
= CSettingsAdvanced::SettingTypeNumber
;
107 settings
[i
++].def
.l
= 10;
109 settings
[i
].sName
= L
"ProgressDlgLinesLimit";
110 settings
[i
].type
= CSettingsAdvanced::SettingTypeNumber
;
111 settings
[i
++].def
.l
= 50000;
113 settings
[i
].sName
= L
"PullRebaseBehaviorLike1816";
114 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
115 settings
[i
++].def
.b
= false;
117 settings
[i
].sName
= L
"ReaddUnselectedAddedFilesAfterCommit";
118 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
119 settings
[i
++].def
.b
= true;
121 settings
[i
].sName
= L
"RefreshFileListAfterResolvingConflict";
122 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
123 settings
[i
++].def
.b
= true;
125 settings
[i
].sName
= L
"RememberFileListPosition";
126 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
127 settings
[i
++].def
.b
= true;
129 settings
[i
].sName
= L
"SanitizeCommitMsg";
130 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
131 settings
[i
++].def
.b
= true;
133 settings
[i
].sName
= L
"ScintillaDirect2D";
134 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
135 settings
[i
++].def
.b
= false;
137 settings
[i
].sName
= L
"ShellMenuAccelerators";
138 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
139 settings
[i
++].def
.b
= true;
141 settings
[i
].sName
= L
"ShowContextMenuIcons";
142 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
143 settings
[i
++].def
.b
= true;
145 settings
[i
].sName
= L
"ShowAppContextMenuIcons";
146 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
147 settings
[i
++].def
.b
= true;
149 settings
[i
].sName
= L
"ShowListBackgroundImage";
150 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
151 settings
[i
++].def
.b
= true;
153 settings
[i
].sName
= L
"ShowListFullPathTooltip";
154 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
155 settings
[i
++].def
.b
= true;
157 settings
[i
].sName
= L
"StyleCommitMessages";
158 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
159 settings
[i
++].def
.b
= true;
161 settings
[i
].sName
= L
"TGitCacheCheckContentMaxSize";
162 settings
[i
].type
= CSettingsAdvanced::SettingTypeNumber
;
163 settings
[i
++].def
.l
= 10 * 1024;
165 settings
[i
].sName
= L
"UseLibgit2";
166 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
167 settings
[i
++].def
.b
= true;
169 settings
[i
].sName
= L
"VersionCheck";
170 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
171 settings
[i
++].def
.b
= true;
173 settings
[i
].sName
= L
"VersionCheckPreview";
174 settings
[i
].type
= CSettingsAdvanced::SettingTypeBoolean
;
175 settings
[i
++].def
.b
= false;
177 settings
[i
].sName
= L
"";
178 settings
[i
].type
= CSettingsAdvanced::SettingTypeNone
;
179 settings
[i
++].def
.b
= false;
182 CSettingsAdvanced::~CSettingsAdvanced()
186 void CSettingsAdvanced::DoDataExchange(CDataExchange
* pDX
)
188 ISettingsPropPage::DoDataExchange(pDX
);
189 DDX_Control(pDX
, IDC_CONFIG
, m_ListCtrl
);
193 BEGIN_MESSAGE_MAP(CSettingsAdvanced
, ISettingsPropPage
)
194 ON_NOTIFY(LVN_BEGINLABELEDIT
, IDC_CONFIG
, &CSettingsAdvanced::OnLvnBeginlabeledit
)
195 ON_NOTIFY(LVN_ENDLABELEDIT
, IDC_CONFIG
, &CSettingsAdvanced::OnLvnEndlabeledit
)
196 ON_NOTIFY(NM_DBLCLK
, IDC_CONFIG
, &CSettingsAdvanced::OnNMDblclkConfig
)
200 BOOL
CSettingsAdvanced::OnInitDialog()
202 ISettingsPropPage::OnInitDialog();
204 m_ListCtrl
.DeleteAllItems();
205 int c
= m_ListCtrl
.GetHeaderCtrl()->GetItemCount() - 1;
207 m_ListCtrl
.DeleteColumn(c
--);
209 SetWindowTheme(m_ListCtrl
.GetSafeHwnd(), L
"Explorer", nullptr);
212 temp
.LoadString(IDS_SETTINGS_CONF_VALUECOL
);
213 m_ListCtrl
.InsertColumn(0, temp
);
214 temp
.LoadString(IDS_SETTINGS_CONF_NAMECOL
);
215 m_ListCtrl
.InsertColumn(1, temp
);
217 m_ListCtrl
.SetRedraw(FALSE
);
220 while (settings
[i
].type
!= SettingTypeNone
)
222 m_ListCtrl
.InsertItem(i
, settings
[i
].sName
);
223 m_ListCtrl
.SetItemText(i
, 1, settings
[i
].sName
);
224 switch (settings
[i
].type
)
226 case SettingTypeBoolean
:
228 CRegDWORD
s(L
"Software\\TortoiseGit\\" + settings
[i
].sName
, settings
[i
].def
.b
);
229 m_ListCtrl
.SetItemText(i
, 0, DWORD(s
) ? L
"true" : L
"false");
232 case SettingTypeNumber
:
234 CRegDWORD
s(L
"Software\\TortoiseGit\\" + settings
[i
].sName
, settings
[i
].def
.l
);
235 temp
.Format(L
"%ld", (DWORD
)s
);
236 m_ListCtrl
.SetItemText(i
, 0, temp
);
239 case SettingTypeString
:
241 CRegString
s(L
"Software\\TortoiseGit\\" + settings
[i
].sName
, settings
[i
].def
.s
);
242 m_ListCtrl
.SetItemText(i
, 0, CString(s
));
250 int maxcol
= m_ListCtrl
.GetHeaderCtrl()->GetItemCount() - 1;
252 for (col
= mincol
; col
<= maxcol
; ++col
)
253 m_ListCtrl
.SetColumnWidth(col
, LVSCW_AUTOSIZE_USEHEADER
);
255 m_ListCtrl
.SetColumnOrderArray(2, arr
);
256 m_ListCtrl
.SetRedraw(TRUE
);
261 BOOL
CSettingsAdvanced::OnApply()
264 while (settings
[i
].type
!= SettingTypeNone
)
266 CString sValue
= m_ListCtrl
.GetItemText(i
, 0);
267 switch (settings
[i
].type
)
269 case SettingTypeBoolean
:
271 CRegDWORD
s(L
"Software\\TortoiseGit\\" + settings
[i
].sName
, settings
[i
].def
.b
);
272 if (sValue
.IsEmpty())
276 DWORD newValue
= sValue
.Compare(L
"true") == 0;
277 if (DWORD(s
) != newValue
)
282 case SettingTypeNumber
:
284 CRegDWORD
s(L
"Software\\TortoiseGit\\" + settings
[i
].sName
, settings
[i
].def
.l
);
285 if (DWORD(_wtol(sValue
)) != DWORD(s
))
289 case SettingTypeString
:
291 CRegString
s(L
"Software\\TortoiseGit\\" + settings
[i
].sName
, settings
[i
].def
.s
);
292 if (sValue
.Compare(CString(s
)))
300 return ISettingsPropPage::OnApply();
303 void CSettingsAdvanced::OnLvnBeginlabeledit(NMHDR
* /*pNMHDR*/, LRESULT
*pResult
)
308 void CSettingsAdvanced::OnLvnEndlabeledit(NMHDR
*pNMHDR
, LRESULT
*pResult
)
310 NMLVDISPINFO
*pDispInfo
= reinterpret_cast<NMLVDISPINFO
*>(pNMHDR
);
312 if (!pDispInfo
->item
.pszText
)
315 bool allowEdit
= false;
316 switch (settings
[pDispInfo
->item
.iItem
].type
)
318 case SettingTypeBoolean
:
320 if ((pDispInfo
->item
.pszText
[0] == 0) ||
321 (wcscmp(pDispInfo
->item
.pszText
, L
"true") == 0) ||
322 (wcscmp(pDispInfo
->item
.pszText
, L
"false") == 0))
328 case SettingTypeNumber
:
330 TCHAR
* pChar
= pDispInfo
->item
.pszText
;
334 if (!_istdigit(*pChar
))
343 case SettingTypeString
:
351 *pResult
= allowEdit
? TRUE
: FALSE
;
354 BOOL
CSettingsAdvanced::PreTranslateMessage(MSG
* pMsg
)
356 if (pMsg
->message
== WM_KEYDOWN
)
358 switch (pMsg
->wParam
)
362 m_ListCtrl
.EditLabel(m_ListCtrl
.GetSelectionMark());
367 return ISettingsPropPage::PreTranslateMessage(pMsg
);
370 void CSettingsAdvanced::OnNMDblclkConfig(NMHDR
*pNMHDR
, LRESULT
*pResult
)
372 LPNMITEMACTIVATE pNMItemActivate
= reinterpret_cast<LPNMITEMACTIVATE
>(pNMHDR
);
373 m_ListCtrl
.EditLabel(pNMItemActivate
->iItem
);