Minor cleanup
[TortoiseGit.git] / src / TortoiseProc / Settings / SetSavedDataPage.cpp
blob05758d3e130e51c949d621a741d1280a0267394d
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2012-2013-2014 - TortoiseGit
4 // Copyright (C) 2003-2008,2014 - 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.
20 #include "stdafx.h"
21 #include "TortoiseProc.h"
22 #include "registry.h"
23 #include "PathUtils.h"
24 #include "AppUtils.h"
25 #include "DirFileEnum.h"
26 #include "SetSavedDataPage.h"
27 #include "MessageBox.h"
28 #include "StringUtils.h"
30 IMPLEMENT_DYNAMIC(CSetSavedDataPage, ISettingsPropPage)
32 CSetSavedDataPage::CSetSavedDataPage()
33 : ISettingsPropPage(CSetSavedDataPage::IDD)
34 , m_maxLines(0)
36 m_regMaxLines = CRegDWORD(_T("Software\\TortoiseGit\\MaxLinesInLogfile"), 4000);
37 m_maxLines = m_regMaxLines;
40 CSetSavedDataPage::~CSetSavedDataPage()
44 void CSetSavedDataPage::DoDataExchange(CDataExchange* pDX)
46 ISettingsPropPage::DoDataExchange(pDX);
47 DDX_Control(pDX, IDC_URLHISTCLEAR, m_btnUrlHistClear);
48 DDX_Control(pDX, IDC_LOGHISTCLEAR, m_btnLogHistClear);
49 DDX_Control(pDX, IDC_RESIZABLEHISTCLEAR, m_btnResizableHistClear);
50 DDX_Control(pDX, IDC_AUTHHISTCLEAR, m_btnAuthHistClear);
51 DDX_Control(pDX, IDC_REPOLOGCLEAR, m_btnRepoLogClear);
52 DDX_Text(pDX, IDC_MAXLINES, m_maxLines);
53 DDX_Control(pDX, IDC_ACTIONLOGSHOW, m_btnActionLogShow);
54 DDX_Control(pDX, IDC_ACTIONLOGCLEAR, m_btnActionLogClear);
57 BOOL CSetSavedDataPage::OnInitDialog()
59 ISettingsPropPage::OnInitDialog();
61 // find out how many log messages and URLs we've stored
62 int nLogHistWC = 0;
63 INT_PTR nLogHistMsg = 0;
64 int nUrlHistWC = 0;
65 INT_PTR nUrlHistItems = 0;
66 int nLogHistRepo = 0;
67 CRegistryKey regloghist(_T("Software\\TortoiseGit\\History"));
68 CStringList loghistlist;
69 regloghist.getSubKeys(loghistlist);
70 for (POSITION pos = loghistlist.GetHeadPosition(); pos != NULL; )
72 CString sHistName = loghistlist.GetNext(pos);
73 if (sHistName.Left(6).CompareNoCase(_T("commit")) == 0 || sHistName.Left(5).CompareNoCase(_T("merge")) == 0)
75 nLogHistWC++;
76 CRegistryKey regloghistwc(_T("Software\\TortoiseGit\\History\\")+sHistName);
77 CStringList loghistlistwc;
78 regloghistwc.getValues(loghistlistwc);
79 nLogHistMsg += loghistlistwc.GetCount();
81 else
83 // repoURLs
84 CStringList urlhistlistmain;
85 CStringList urlhistlistmainvalues;
86 CRegistryKey regurlhistlist(_T("Software\\TortoiseGit\\History\\repoURLS"));
87 regurlhistlist.getSubKeys(urlhistlistmain);
88 regurlhistlist.getValues(urlhistlistmainvalues);
89 nUrlHistItems += urlhistlistmainvalues.GetCount();
90 for (POSITION urlpos = urlhistlistmain.GetHeadPosition(); urlpos != NULL; )
92 CString sWCUID = urlhistlistmain.GetNext(urlpos);
93 nUrlHistWC++;
94 CStringList urlhistlistwc;
95 CRegistryKey regurlhistlistwc(_T("Software\\TortoiseGit\\History\\repoURLS\\")+sWCUID);
96 regurlhistlistwc.getValues(urlhistlistwc);
97 nUrlHistItems += urlhistlistwc.GetCount();
102 // find out how many dialog sizes / positions we've stored
103 INT_PTR nResizableDialogs = 0;
104 CRegistryKey regResizable(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState"));
105 CStringList resizablelist;
106 regResizable.getValues(resizablelist);
107 nResizableDialogs += resizablelist.GetCount();
109 // find out how many auth data we've stored
110 int nSimple = 0;
111 int nSSL = 0;
112 int nUsername = 0;
114 CString sFile;
115 bool bIsDir = false;
117 TCHAR pathbuf[MAX_PATH] = {0};
118 if (SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, pathbuf)==S_OK)
120 _tcscat_s(pathbuf, MAX_PATH, _T("\\Subversion\\auth\\"));
121 CString sSimple = CString(pathbuf) + _T("svn.simple");
122 CString sSSL = CString(pathbuf) + _T("svn.ssl.server");
123 CString sUsername = CString(pathbuf) + _T("svn.username");
124 CDirFileEnum simpleenum(sSimple);
125 while (simpleenum.NextFile(sFile, &bIsDir))
126 nSimple++;
127 CDirFileEnum sslenum(sSSL);
128 while (sslenum.NextFile(sFile, &bIsDir))
129 nSSL++;
130 CDirFileEnum userenum(sUsername);
131 while (userenum.NextFile(sFile, &bIsDir))
132 nUsername++;
135 CDirFileEnum logenum(CPathUtils::GetAppDataDirectory()+_T("logcache"));
136 while (logenum.NextFile(sFile, &bIsDir))
137 nLogHistRepo++;
138 // the "Repositories.dat" is not a cache file
139 nLogHistRepo--;
141 BOOL bActionLog = PathFileExists(CPathUtils::GetLocalAppDataDirectory() + _T("logfile.txt"));
143 m_btnLogHistClear.EnableWindow(nLogHistMsg || nLogHistWC);
144 m_btnUrlHistClear.EnableWindow(nUrlHistItems || nUrlHistWC);
145 m_btnResizableHistClear.EnableWindow(nResizableDialogs > 0);
146 m_btnAuthHistClear.EnableWindow(nSimple || nSSL || nUsername);
147 m_btnRepoLogClear.EnableWindow(nLogHistRepo >= 0);
148 m_btnActionLogClear.EnableWindow(bActionLog);
149 m_btnActionLogShow.EnableWindow(bActionLog);
151 EnableToolTips();
153 m_tooltips.Create(this);
154 CString sTT;
155 sTT.Format(IDS_SETTINGS_SAVEDDATA_LOGHIST_TT, nLogHistMsg, nLogHistWC);
156 m_tooltips.AddTool(IDC_LOGHISTORY, sTT);
157 m_tooltips.AddTool(IDC_LOGHISTCLEAR, sTT);
158 sTT.Format(IDS_SETTINGS_SAVEDDATA_URLHIST_TT, nUrlHistItems, nUrlHistWC);
159 m_tooltips.AddTool(IDC_URLHISTORY, sTT);
160 m_tooltips.AddTool(IDC_URLHISTCLEAR, sTT);
161 sTT.Format(IDS_SETTINGS_SAVEDDATA_RESIZABLE_TT, nResizableDialogs);
162 m_tooltips.AddTool(IDC_RESIZABLEHISTORY, sTT);
163 m_tooltips.AddTool(IDC_RESIZABLEHISTCLEAR, sTT);
164 sTT.Format(IDS_SETTINGS_SAVEDDATA_AUTH_TT, nSimple, nSSL, nUsername);
165 m_tooltips.AddTool(IDC_AUTHHISTORY, sTT);
166 m_tooltips.AddTool(IDC_AUTHHISTCLEAR, sTT);
167 sTT.Format(IDS_SETTINGS_SAVEDDATA_REPOLOGHIST_TT, nLogHistRepo);
168 m_tooltips.AddTool(IDC_REPOLOG, sTT);
169 m_tooltips.AddTool(IDC_REPOLOGCLEAR, sTT);
170 sTT.LoadString(IDS_SETTINGS_SHOWACTIONLOG_TT);
171 m_tooltips.AddTool(IDC_ACTIONLOGSHOW, sTT);
172 sTT.LoadString(IDS_SETTINGS_MAXACTIONLOGLINES_TT);
173 m_tooltips.AddTool(IDC_MAXLINES, sTT);
174 sTT.LoadString(IDS_SETTINGS_CLEARACTIONLOG_TT);
175 m_tooltips.AddTool(IDC_ACTIONLOGCLEAR, sTT);
177 return TRUE;
180 BOOL CSetSavedDataPage::PreTranslateMessage(MSG* pMsg)
182 m_tooltips.RelayEvent(pMsg);
183 return ISettingsPropPage::PreTranslateMessage(pMsg);
186 BEGIN_MESSAGE_MAP(CSetSavedDataPage, ISettingsPropPage)
187 ON_BN_CLICKED(IDC_URLHISTCLEAR, &CSetSavedDataPage::OnBnClickedUrlhistclear)
188 ON_BN_CLICKED(IDC_LOGHISTCLEAR, &CSetSavedDataPage::OnBnClickedLoghistclear)
189 ON_BN_CLICKED(IDC_RESIZABLEHISTCLEAR, &CSetSavedDataPage::OnBnClickedResizablehistclear)
190 ON_BN_CLICKED(IDC_AUTHHISTCLEAR, &CSetSavedDataPage::OnBnClickedAuthhistclear)
191 ON_BN_CLICKED(IDC_REPOLOGCLEAR, &CSetSavedDataPage::OnBnClickedRepologclear)
192 ON_BN_CLICKED(IDC_ACTIONLOGSHOW, &CSetSavedDataPage::OnBnClickedActionlogshow)
193 ON_BN_CLICKED(IDC_ACTIONLOGCLEAR, &CSetSavedDataPage::OnBnClickedActionlogclear)
194 ON_BN_CLICKED(IDC_TEMPFILESCLEAR, &CSetSavedDataPage::OnBnClickedTempfileclear)
195 ON_EN_CHANGE(IDC_MAXLINES, OnModified)
196 END_MESSAGE_MAP()
198 void CSetSavedDataPage::OnBnClickedUrlhistclear()
200 CRegistryKey reg(_T("Software\\TortoiseGit\\History\\repoURLS"));
201 reg.removeKey();
202 m_btnUrlHistClear.EnableWindow(FALSE);
203 m_tooltips.DelTool(GetDlgItem(IDC_URLHISTCLEAR));
204 m_tooltips.DelTool(GetDlgItem(IDC_URLHISTORY));
207 void CSetSavedDataPage::OnBnClickedLoghistclear()
209 CRegistryKey reg(_T("Software\\TortoiseGit\\History"));
210 CStringList histlist;
211 reg.getSubKeys(histlist);
212 for (POSITION pos = histlist.GetHeadPosition(); pos != NULL; )
214 CString sHist = histlist.GetNext(pos);
215 if (sHist.Left(6).CompareNoCase(_T("commit"))==0)
217 CRegistryKey regkey(_T("Software\\TortoiseGit\\History\\")+sHist);
218 regkey.removeKey();
222 m_btnLogHistClear.EnableWindow(FALSE);
223 m_tooltips.DelTool(GetDlgItem(IDC_RESIZABLEHISTCLEAR));
224 m_tooltips.DelTool(GetDlgItem(IDC_RESIZABLEHISTORY));
227 void CSetSavedDataPage::OnBnClickedResizablehistclear()
229 CRegistryKey reg(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState"));
230 reg.removeKey();
231 m_btnResizableHistClear.EnableWindow(FALSE);
232 m_tooltips.DelTool(GetDlgItem(IDC_RESIZABLEHISTCLEAR));
233 m_tooltips.DelTool(GetDlgItem(IDC_RESIZABLEHISTORY));
236 void CSetSavedDataPage::OnBnClickedAuthhistclear()
238 CRegStdString auth = CRegStdString(_T("Software\\TortoiseGit\\Auth\\"));
239 auth.removeKey();
240 TCHAR pathbuf[MAX_PATH] = {0};
241 if (SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, pathbuf)==S_OK)
243 _tcscat_s(pathbuf, MAX_PATH, _T("\\Subversion\\auth"));
244 DeleteViaShell(pathbuf, IDS_SETTINGS_DELFILE);
246 m_btnAuthHistClear.EnableWindow(FALSE);
247 m_tooltips.DelTool(GetDlgItem(IDC_AUTHHISTCLEAR));
248 m_tooltips.DelTool(GetDlgItem(IDC_AUTHHISTORY));
251 void CSetSavedDataPage::OnBnClickedRepologclear()
253 CString path = CPathUtils::GetAppDataDirectory()+_T("logcache");
254 TCHAR pathbuf[MAX_PATH] = {0};
255 _tcscpy_s(pathbuf, MAX_PATH, (LPCTSTR)path);
257 DeleteViaShell(pathbuf, IDS_SETTINGS_DELCACHE);
259 m_btnRepoLogClear.EnableWindow(FALSE);
260 m_tooltips.DelTool(GetDlgItem(IDC_REPOLOG));
261 m_tooltips.DelTool(GetDlgItem(IDC_REPOLOGCLEAR));
264 void CSetSavedDataPage::OnBnClickedActionlogshow()
266 CString logfile = CPathUtils::GetLocalAppDataDirectory() + _T("logfile.txt");
267 CAppUtils::StartTextViewer(logfile);
270 void CSetSavedDataPage::OnBnClickedActionlogclear()
272 CString logfile = CPathUtils::GetLocalAppDataDirectory() + _T("logfile.txt");
273 DeleteFile(logfile);
274 m_btnActionLogClear.EnableWindow(FALSE);
275 m_btnActionLogShow.EnableWindow(FALSE);
278 void CSetSavedDataPage::OnBnClickedTempfileclear()
280 if (CMessageBox::Show(m_hWnd, IDS_PROC_WARNCLEARTEMP, IDS_APPNAME, 1, IDI_QUESTION, IDS_ABORTBUTTON, IDS_PROCEEDBUTTON) == 1)
281 return;
283 int count = 0;
284 DWORD len = GetTortoiseGitTempPath(0, NULL);
285 std::unique_ptr<TCHAR[]> path(new TCHAR[len + 100]);
286 len = GetTortoiseGitTempPath(len + 100, path.get());
287 if (len != 0)
289 int lastcount;
292 lastcount = count;
293 count = 0;
294 CDirFileEnum finder(path.get());
295 bool isDir;
296 CString filepath;
297 while (finder.NextFile(filepath, &isDir))
299 ::SetFileAttributes(filepath, FILE_ATTRIBUTE_NORMAL);
300 if (isDir)
302 if (!::RemoveDirectory(filepath))
303 count++;
305 else
307 if (!::DeleteFile(filepath))
308 count++;
311 } while (lastcount != count);
314 if (count == 0)
315 GetDlgItem(IDC_TEMPFILESCLEAR)->EnableWindow(FALSE);
318 void CSetSavedDataPage::OnModified()
320 SetModified();
323 BOOL CSetSavedDataPage::OnApply()
325 Store(m_maxLines, m_regMaxLines);
326 return ISettingsPropPage::OnApply();
329 void CSetSavedDataPage::DeleteViaShell(LPCTSTR path, UINT progressText)
331 CString p(path);
332 p += L"||";
333 int len = p.GetLength();
334 std::unique_ptr<TCHAR[]> buf(new TCHAR[len + 2]);
335 wcscpy_s(buf.get(), len + 2, p);
336 CStringUtils::PipesToNulls(buf.get(), len);
338 CString progText(MAKEINTRESOURCE(progressText));
339 SHFILEOPSTRUCT fileop;
340 fileop.hwnd = m_hWnd;
341 fileop.wFunc = FO_DELETE;
342 fileop.pFrom = buf.get();
343 fileop.pTo = NULL;
344 fileop.fFlags = FOF_NO_CONNECTED_ELEMENTS | FOF_NOCONFIRMATION;
345 fileop.lpszProgressTitle = progText;
346 SHFileOperation(&fileop);