1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2012-2013 - TortoiseGit
4 // Copyright (C) 2003-2008 - 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"
29 IMPLEMENT_DYNAMIC(CSetSavedDataPage
, ISettingsPropPage
)
31 CSetSavedDataPage::CSetSavedDataPage()
32 : ISettingsPropPage(CSetSavedDataPage::IDD
)
35 m_regMaxLines
= CRegDWORD(_T("Software\\TortoiseGit\\MaxLinesInLogfile"), 4000);
36 m_maxLines
= m_regMaxLines
;
39 CSetSavedDataPage::~CSetSavedDataPage()
43 void CSetSavedDataPage::DoDataExchange(CDataExchange
* pDX
)
45 ISettingsPropPage::DoDataExchange(pDX
);
46 DDX_Control(pDX
, IDC_URLHISTCLEAR
, m_btnUrlHistClear
);
47 DDX_Control(pDX
, IDC_LOGHISTCLEAR
, m_btnLogHistClear
);
48 DDX_Control(pDX
, IDC_RESIZABLEHISTCLEAR
, m_btnResizableHistClear
);
49 DDX_Control(pDX
, IDC_AUTHHISTCLEAR
, m_btnAuthHistClear
);
50 DDX_Control(pDX
, IDC_REPOLOGCLEAR
, m_btnRepoLogClear
);
51 DDX_Text(pDX
, IDC_MAXLINES
, m_maxLines
);
52 DDX_Control(pDX
, IDC_ACTIONLOGSHOW
, m_btnActionLogShow
);
53 DDX_Control(pDX
, IDC_ACTIONLOGCLEAR
, m_btnActionLogClear
);
56 BOOL
CSetSavedDataPage::OnInitDialog()
58 ISettingsPropPage::OnInitDialog();
60 // find out how many log messages and URLs we've stored
62 INT_PTR nLogHistMsg
= 0;
64 INT_PTR nUrlHistItems
= 0;
66 CRegistryKey
regloghist(_T("Software\\TortoiseGit\\History"));
67 CStringList loghistlist
;
68 regloghist
.getSubKeys(loghistlist
);
69 for (POSITION pos
= loghistlist
.GetHeadPosition(); pos
!= NULL
; )
71 CString sHistName
= loghistlist
.GetNext(pos
);
72 if (sHistName
.Left(6).CompareNoCase(_T("commit")) == 0 || sHistName
.Left(5).CompareNoCase(_T("merge")) == 0)
75 CRegistryKey
regloghistwc(_T("Software\\TortoiseGit\\History\\")+sHistName
);
76 CStringList loghistlistwc
;
77 regloghistwc
.getValues(loghistlistwc
);
78 nLogHistMsg
+= loghistlistwc
.GetCount();
83 CStringList urlhistlistmain
;
84 CStringList urlhistlistmainvalues
;
85 CRegistryKey
regurlhistlist(_T("Software\\TortoiseGit\\History\\repoURLS"));
86 regurlhistlist
.getSubKeys(urlhistlistmain
);
87 regurlhistlist
.getValues(urlhistlistmainvalues
);
88 nUrlHistItems
+= urlhistlistmainvalues
.GetCount();
89 for (POSITION urlpos
= urlhistlistmain
.GetHeadPosition(); urlpos
!= NULL
; )
91 CString sWCUID
= urlhistlistmain
.GetNext(urlpos
);
93 CStringList urlhistlistwc
;
94 CRegistryKey
regurlhistlistwc(_T("Software\\TortoiseGit\\History\\repoURLS\\")+sWCUID
);
95 regurlhistlistwc
.getValues(urlhistlistwc
);
96 nUrlHistItems
+= urlhistlistwc
.GetCount();
101 // find out how many dialog sizes / positions we've stored
102 INT_PTR nResizableDialogs
= 0;
103 CRegistryKey
regResizable(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState"));
104 CStringList resizablelist
;
105 regResizable
.getValues(resizablelist
);
106 nResizableDialogs
+= resizablelist
.GetCount();
108 // find out how many auth data we've stored
116 TCHAR pathbuf
[MAX_PATH
] = {0};
117 if (SHGetFolderPath(NULL
, CSIDL_APPDATA
, NULL
, SHGFP_TYPE_CURRENT
, pathbuf
)==S_OK
)
119 _tcscat_s(pathbuf
, MAX_PATH
, _T("\\Subversion\\auth\\"));
120 CString sSimple
= CString(pathbuf
) + _T("svn.simple");
121 CString sSSL
= CString(pathbuf
) + _T("svn.ssl.server");
122 CString sUsername
= CString(pathbuf
) + _T("svn.username");
123 CDirFileEnum
simpleenum(sSimple
);
124 while (simpleenum
.NextFile(sFile
, &bIsDir
))
126 CDirFileEnum
sslenum(sSSL
);
127 while (sslenum
.NextFile(sFile
, &bIsDir
))
129 CDirFileEnum
userenum(sUsername
);
130 while (userenum
.NextFile(sFile
, &bIsDir
))
134 CDirFileEnum
logenum(CPathUtils::GetAppDataDirectory()+_T("logcache"));
135 while (logenum
.NextFile(sFile
, &bIsDir
))
137 // the "Repositories.dat" is not a cache file
140 BOOL bActionLog
= PathFileExists(CPathUtils::GetAppDataDirectory() + _T("logfile.txt"));
142 m_btnLogHistClear
.EnableWindow(nLogHistMsg
|| nLogHistWC
);
143 m_btnUrlHistClear
.EnableWindow(nUrlHistItems
|| nUrlHistWC
);
144 m_btnResizableHistClear
.EnableWindow(nResizableDialogs
> 0);
145 m_btnAuthHistClear
.EnableWindow(nSimple
|| nSSL
|| nUsername
);
146 m_btnRepoLogClear
.EnableWindow(nLogHistRepo
>= 0);
147 m_btnActionLogClear
.EnableWindow(bActionLog
);
148 m_btnActionLogShow
.EnableWindow(bActionLog
);
152 m_tooltips
.Create(this);
154 sTT
.Format(IDS_SETTINGS_SAVEDDATA_LOGHIST_TT
, nLogHistMsg
, nLogHistWC
);
155 m_tooltips
.AddTool(IDC_LOGHISTORY
, sTT
);
156 m_tooltips
.AddTool(IDC_LOGHISTCLEAR
, sTT
);
157 sTT
.Format(IDS_SETTINGS_SAVEDDATA_URLHIST_TT
, nUrlHistItems
, nUrlHistWC
);
158 m_tooltips
.AddTool(IDC_URLHISTORY
, sTT
);
159 m_tooltips
.AddTool(IDC_URLHISTCLEAR
, sTT
);
160 sTT
.Format(IDS_SETTINGS_SAVEDDATA_RESIZABLE_TT
, nResizableDialogs
);
161 m_tooltips
.AddTool(IDC_RESIZABLEHISTORY
, sTT
);
162 m_tooltips
.AddTool(IDC_RESIZABLEHISTCLEAR
, sTT
);
163 sTT
.Format(IDS_SETTINGS_SAVEDDATA_AUTH_TT
, nSimple
, nSSL
, nUsername
);
164 m_tooltips
.AddTool(IDC_AUTHHISTORY
, sTT
);
165 m_tooltips
.AddTool(IDC_AUTHHISTCLEAR
, sTT
);
166 sTT
.Format(IDS_SETTINGS_SAVEDDATA_REPOLOGHIST_TT
, nLogHistRepo
);
167 m_tooltips
.AddTool(IDC_REPOLOG
, sTT
);
168 m_tooltips
.AddTool(IDC_REPOLOGCLEAR
, sTT
);
169 sTT
.LoadString(IDS_SETTINGS_SHOWACTIONLOG_TT
);
170 m_tooltips
.AddTool(IDC_ACTIONLOGSHOW
, sTT
);
171 sTT
.LoadString(IDS_SETTINGS_MAXACTIONLOGLINES_TT
);
172 m_tooltips
.AddTool(IDC_MAXLINES
, sTT
);
173 sTT
.LoadString(IDS_SETTINGS_CLEARACTIONLOG_TT
);
174 m_tooltips
.AddTool(IDC_ACTIONLOGCLEAR
, sTT
);
179 BOOL
CSetSavedDataPage::PreTranslateMessage(MSG
* pMsg
)
181 m_tooltips
.RelayEvent(pMsg
);
182 return ISettingsPropPage::PreTranslateMessage(pMsg
);
185 BEGIN_MESSAGE_MAP(CSetSavedDataPage
, ISettingsPropPage
)
186 ON_BN_CLICKED(IDC_URLHISTCLEAR
, &CSetSavedDataPage::OnBnClickedUrlhistclear
)
187 ON_BN_CLICKED(IDC_LOGHISTCLEAR
, &CSetSavedDataPage::OnBnClickedLoghistclear
)
188 ON_BN_CLICKED(IDC_RESIZABLEHISTCLEAR
, &CSetSavedDataPage::OnBnClickedResizablehistclear
)
189 ON_BN_CLICKED(IDC_AUTHHISTCLEAR
, &CSetSavedDataPage::OnBnClickedAuthhistclear
)
190 ON_BN_CLICKED(IDC_REPOLOGCLEAR
, &CSetSavedDataPage::OnBnClickedRepologclear
)
191 ON_BN_CLICKED(IDC_ACTIONLOGSHOW
, &CSetSavedDataPage::OnBnClickedActionlogshow
)
192 ON_BN_CLICKED(IDC_ACTIONLOGCLEAR
, &CSetSavedDataPage::OnBnClickedActionlogclear
)
193 ON_BN_CLICKED(IDC_TEMPFILESCLEAR
, &CSetSavedDataPage::OnBnClickedTempfileclear
)
194 ON_EN_CHANGE(IDC_MAXLINES
, OnModified
)
197 void CSetSavedDataPage::OnBnClickedUrlhistclear()
199 CRegistryKey
reg(_T("Software\\TortoiseGit\\History\\repoURLS"));
201 m_btnUrlHistClear
.EnableWindow(FALSE
);
202 m_tooltips
.DelTool(GetDlgItem(IDC_URLHISTCLEAR
));
203 m_tooltips
.DelTool(GetDlgItem(IDC_URLHISTORY
));
206 void CSetSavedDataPage::OnBnClickedLoghistclear()
208 CRegistryKey
reg(_T("Software\\TortoiseGit\\History"));
209 CStringList histlist
;
210 reg
.getSubKeys(histlist
);
211 for (POSITION pos
= histlist
.GetHeadPosition(); pos
!= NULL
; )
213 CString sHist
= histlist
.GetNext(pos
);
214 if (sHist
.Left(6).CompareNoCase(_T("commit"))==0)
216 CRegistryKey
regkey(_T("Software\\TortoiseGit\\History\\")+sHist
);
221 m_btnLogHistClear
.EnableWindow(FALSE
);
222 m_tooltips
.DelTool(GetDlgItem(IDC_RESIZABLEHISTCLEAR
));
223 m_tooltips
.DelTool(GetDlgItem(IDC_RESIZABLEHISTORY
));
226 void CSetSavedDataPage::OnBnClickedResizablehistclear()
228 CRegistryKey
reg(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState"));
230 m_btnResizableHistClear
.EnableWindow(FALSE
);
231 m_tooltips
.DelTool(GetDlgItem(IDC_RESIZABLEHISTCLEAR
));
232 m_tooltips
.DelTool(GetDlgItem(IDC_RESIZABLEHISTORY
));
235 void CSetSavedDataPage::OnBnClickedAuthhistclear()
237 CRegStdString auth
= CRegStdString(_T("Software\\TortoiseGit\\Auth\\"));
239 TCHAR pathbuf
[MAX_PATH
] = {0};
240 if (SHGetFolderPath(NULL
, CSIDL_APPDATA
, NULL
, SHGFP_TYPE_CURRENT
, pathbuf
)==S_OK
)
242 _tcscat_s(pathbuf
, MAX_PATH
, _T("\\Subversion\\auth"));
243 pathbuf
[_tcslen(pathbuf
)+1] = 0;
244 SHFILEOPSTRUCT fileop
;
245 fileop
.hwnd
= this->m_hWnd
;
246 fileop
.wFunc
= FO_DELETE
;
247 fileop
.pFrom
= pathbuf
;
249 fileop
.fFlags
= FOF_NO_CONNECTED_ELEMENTS
| FOF_NOCONFIRMATION
;// | FOF_NOERRORUI | FOF_SILENT;
250 fileop
.lpszProgressTitle
= _T("deleting file");
251 SHFileOperation(&fileop
);
253 m_btnAuthHistClear
.EnableWindow(FALSE
);
254 m_tooltips
.DelTool(GetDlgItem(IDC_AUTHHISTCLEAR
));
255 m_tooltips
.DelTool(GetDlgItem(IDC_AUTHHISTORY
));
258 void CSetSavedDataPage::OnBnClickedRepologclear()
260 CString path
= CPathUtils::GetAppDataDirectory()+_T("logcache");
261 TCHAR pathbuf
[MAX_PATH
] = {0};
262 _tcscpy_s(pathbuf
, MAX_PATH
, (LPCTSTR
)path
);
263 pathbuf
[_tcslen(pathbuf
)+1] = 0;
265 SHFILEOPSTRUCT fileop
= {0};
266 fileop
.hwnd
= this->m_hWnd
;
267 fileop
.wFunc
= FO_DELETE
;
268 fileop
.pFrom
= pathbuf
;
270 fileop
.fFlags
= FOF_NO_CONNECTED_ELEMENTS
| FOF_NOCONFIRMATION
;
271 fileop
.lpszProgressTitle
= _T("deleting cached data");
272 SHFileOperation(&fileop
);
274 m_btnRepoLogClear
.EnableWindow(FALSE
);
275 m_tooltips
.DelTool(GetDlgItem(IDC_REPOLOG
));
276 m_tooltips
.DelTool(GetDlgItem(IDC_REPOLOGCLEAR
));
279 void CSetSavedDataPage::OnBnClickedActionlogshow()
281 CString logfile
= CPathUtils::GetAppDataDirectory() + _T("logfile.txt");
282 CAppUtils::StartTextViewer(logfile
);
285 void CSetSavedDataPage::OnBnClickedActionlogclear()
287 CString logfile
= CPathUtils::GetAppDataDirectory() + _T("logfile.txt");
289 m_btnActionLogClear
.EnableWindow(FALSE
);
290 m_btnActionLogShow
.EnableWindow(FALSE
);
293 void CSetSavedDataPage::OnBnClickedTempfileclear()
295 if (CMessageBox::Show(m_hWnd
, IDS_PROC_WARNCLEARTEMP
, IDS_APPNAME
, 1, IDI_QUESTION
, IDS_ABORTBUTTON
, IDS_PROCEEDBUTTON
) == 1)
299 DWORD len
= GetTortoiseGitTempPath(0, NULL
);
300 std::unique_ptr
<TCHAR
[]> path(new TCHAR
[len
+ 100]);
301 len
= GetTortoiseGitTempPath(len
+ 100, path
.get());
309 CDirFileEnum
finder(path
.get());
312 while (finder
.NextFile(filepath
, &isDir
))
314 ::SetFileAttributes(filepath
, FILE_ATTRIBUTE_NORMAL
);
317 if (!::RemoveDirectory(filepath
))
322 if (!::DeleteFile(filepath
))
326 } while (lastcount
!= count
);
330 GetDlgItem(IDC_TEMPFILESCLEAR
)->EnableWindow(FALSE
);
333 void CSetSavedDataPage::OnModified()
338 BOOL
CSetSavedDataPage::OnApply()
340 Store (m_maxLines
, m_regMaxLines
);
341 return ISettingsPropPage::OnApply();