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.
21 #include "TortoiseProc.h"
23 #include "PathUtils.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
)
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
63 INT_PTR nLogHistMsg
= 0;
65 INT_PTR nUrlHistItems
= 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)
76 CRegistryKey
regloghistwc(_T("Software\\TortoiseGit\\History\\")+sHistName
);
77 CStringList loghistlistwc
;
78 regloghistwc
.getValues(loghistlistwc
);
79 nLogHistMsg
+= loghistlistwc
.GetCount();
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
);
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
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
))
127 CDirFileEnum
sslenum(sSSL
);
128 while (sslenum
.NextFile(sFile
, &bIsDir
))
130 CDirFileEnum
userenum(sUsername
);
131 while (userenum
.NextFile(sFile
, &bIsDir
))
135 CDirFileEnum
logenum(CPathUtils::GetAppDataDirectory()+_T("logcache"));
136 while (logenum
.NextFile(sFile
, &bIsDir
))
138 // the "Repositories.dat" is not a cache file
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
);
153 m_tooltips
.Create(this);
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
);
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
)
198 void CSetSavedDataPage::OnBnClickedUrlhistclear()
200 CRegistryKey
reg(_T("Software\\TortoiseGit\\History\\repoURLS"));
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
);
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"));
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\\"));
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");
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)
284 DWORD len
= GetTortoiseGitTempPath(0, NULL
);
285 std::unique_ptr
<TCHAR
[]> path(new TCHAR
[len
+ 100]);
286 len
= GetTortoiseGitTempPath(len
+ 100, path
.get());
294 CDirFileEnum
finder(path
.get());
297 while (finder
.NextFile(filepath
, &isDir
))
299 ::SetFileAttributes(filepath
, FILE_ATTRIBUTE_NORMAL
);
302 if (!::RemoveDirectory(filepath
))
307 if (!::DeleteFile(filepath
))
311 } while (lastcount
!= count
);
315 GetDlgItem(IDC_TEMPFILESCLEAR
)->EnableWindow(FALSE
);
318 void CSetSavedDataPage::OnModified()
323 BOOL
CSetSavedDataPage::OnApply()
325 Store(m_maxLines
, m_regMaxLines
);
326 return ISettingsPropPage::OnApply();
329 void CSetSavedDataPage::DeleteViaShell(LPCTSTR path
, UINT progressText
)
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();
344 fileop
.fFlags
= FOF_NO_CONNECTED_ELEMENTS
| FOF_NOCONFIRMATION
;
345 fileop
.lpszProgressTitle
= progText
;
346 SHFileOperation(&fileop
);