1 // TortoiseSVN - a Windows shell extension for easy version control
\r
3 // Copyright (C) 2003-2008 - TortoiseSVN
\r
5 // This program is free software; you can redistribute it and/or
\r
6 // modify it under the terms of the GNU General Public License
\r
7 // as published by the Free Software Foundation; either version 2
\r
8 // of the License, or (at your option) any later version.
\r
10 // This program is distributed in the hope that it will be useful,
\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 // GNU General Public License for more details.
\r
15 // You should have received a copy of the GNU General Public License
\r
16 // along with this program; if not, write to the Free Software Foundation,
\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\r
20 #include "TortoiseProc.h"
\r
21 #include "registry.h"
\r
22 #include "PathUtils.h"
\r
23 #include "AppUtils.h"
\r
24 #include "DirFileEnum.h"
\r
25 #include "SetSavedDataPage.h"
\r
26 #include "MessageBox.h"
\r
28 IMPLEMENT_DYNAMIC(CSetSavedDataPage, ISettingsPropPage)
\r
30 CSetSavedDataPage::CSetSavedDataPage()
\r
31 : ISettingsPropPage(CSetSavedDataPage::IDD)
\r
34 m_regMaxLines = CRegDWORD(_T("Software\\TortoiseSVN\\MaxLinesInLogfile"), 4000);
\r
35 m_maxLines = m_regMaxLines;
\r
38 CSetSavedDataPage::~CSetSavedDataPage()
\r
42 void CSetSavedDataPage::DoDataExchange(CDataExchange* pDX)
\r
44 ISettingsPropPage::DoDataExchange(pDX);
\r
45 DDX_Control(pDX, IDC_URLHISTCLEAR, m_btnUrlHistClear);
\r
46 DDX_Control(pDX, IDC_LOGHISTCLEAR, m_btnLogHistClear);
\r
47 DDX_Control(pDX, IDC_RESIZABLEHISTCLEAR, m_btnResizableHistClear);
\r
48 DDX_Control(pDX, IDC_AUTHHISTCLEAR, m_btnAuthHistClear);
\r
49 DDX_Control(pDX, IDC_REPOLOGCLEAR, m_btnRepoLogClear);
\r
50 DDX_Text(pDX, IDC_MAXLINES, m_maxLines);
\r
51 DDX_Control(pDX, IDC_ACTIONLOGSHOW, m_btnActionLogShow);
\r
52 DDX_Control(pDX, IDC_ACTIONLOGCLEAR, m_btnActionLogClear);
\r
55 BOOL CSetSavedDataPage::OnInitDialog()
\r
57 ISettingsPropPage::OnInitDialog();
\r
59 // find out how many log messages and URLs we've stored
\r
61 INT_PTR nLogHistMsg = 0;
\r
63 INT_PTR nUrlHistItems = 0;
\r
64 int nLogHistRepo = 0;
\r
65 CRegistryKey regloghist(_T("Software\\TortoiseSVN\\History"));
\r
66 CStringList loghistlist;
\r
67 regloghist.getSubKeys(loghistlist);
\r
68 for (POSITION pos = loghistlist.GetHeadPosition(); pos != NULL; )
\r
70 CString sHistName = loghistlist.GetNext(pos);
\r
71 if (sHistName.Left(6).CompareNoCase(_T("commit"))==0)
\r
74 CRegistryKey regloghistwc(_T("Software\\TortoiseSVN\\History\\")+sHistName);
\r
75 CStringList loghistlistwc;
\r
76 regloghistwc.getValues(loghistlistwc);
\r
77 nLogHistMsg += loghistlistwc.GetCount();
\r
82 CStringList urlhistlistmain;
\r
83 CStringList urlhistlistmainvalues;
\r
84 CRegistryKey regurlhistlist(_T("Software\\TortoiseSVN\\History\\repoURLS"));
\r
85 regurlhistlist.getSubKeys(urlhistlistmain);
\r
86 regurlhistlist.getValues(urlhistlistmainvalues);
\r
87 nUrlHistItems += urlhistlistmainvalues.GetCount();
\r
88 for (POSITION urlpos = urlhistlistmain.GetHeadPosition(); urlpos != NULL; )
\r
90 CString sWCUID = urlhistlistmain.GetNext(urlpos);
\r
92 CStringList urlhistlistwc;
\r
93 CRegistryKey regurlhistlistwc(_T("Software\\TortoiseSVN\\History\\repoURLS\\")+sWCUID);
\r
94 regurlhistlistwc.getValues(urlhistlistwc);
\r
95 nUrlHistItems += urlhistlistwc.GetCount();
\r
100 // find out how many dialog sizes / positions we've stored
\r
101 INT_PTR nResizableDialogs = 0;
\r
102 CRegistryKey regResizable(_T("Software\\TortoiseSVN\\TortoiseProc\\ResizableState"));
\r
103 CStringList resizablelist;
\r
104 regResizable.getValues(resizablelist);
\r
105 nResizableDialogs += resizablelist.GetCount();
\r
107 // find out how many auth data we've stored
\r
113 bool bIsDir = false;
\r
115 TCHAR pathbuf[MAX_PATH] = {0};
\r
116 if (SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, pathbuf)==S_OK)
\r
118 _tcscat_s(pathbuf, MAX_PATH, _T("\\Subversion\\auth\\"));
\r
119 CString sSimple = CString(pathbuf) + _T("svn.simple");
\r
120 CString sSSL = CString(pathbuf) + _T("svn.ssl.server");
\r
121 CString sUsername = CString(pathbuf) + _T("svn.username");
\r
122 CDirFileEnum simpleenum(sSimple);
\r
123 while (simpleenum.NextFile(sFile, &bIsDir))
\r
125 CDirFileEnum sslenum(sSSL);
\r
126 while (sslenum.NextFile(sFile, &bIsDir))
\r
128 CDirFileEnum userenum(sUsername);
\r
129 while (userenum.NextFile(sFile, &bIsDir))
\r
133 CDirFileEnum logenum(CPathUtils::GetAppDataDirectory()+_T("logcache"));
\r
134 while (logenum.NextFile(sFile, &bIsDir))
\r
136 // the "Repositories.dat" is not a cache file
\r
139 BOOL bActionLog = PathFileExists(CPathUtils::GetAppDataDirectory() + _T("logfile.txt"));
\r
141 m_btnLogHistClear.EnableWindow(nLogHistMsg || nLogHistWC);
\r
142 m_btnUrlHistClear.EnableWindow(nUrlHistItems || nUrlHistWC);
\r
143 m_btnResizableHistClear.EnableWindow(nResizableDialogs > 0);
\r
144 m_btnAuthHistClear.EnableWindow(nSimple || nSSL || nUsername);
\r
145 m_btnRepoLogClear.EnableWindow(nLogHistRepo >= 0);
\r
146 m_btnActionLogClear.EnableWindow(bActionLog);
\r
147 m_btnActionLogShow.EnableWindow(bActionLog);
\r
151 m_tooltips.Create(this);
\r
153 sTT.Format(IDS_SETTINGS_SAVEDDATA_LOGHIST_TT, nLogHistMsg, nLogHistWC);
\r
154 m_tooltips.AddTool(IDC_LOGHISTORY, sTT);
\r
155 m_tooltips.AddTool(IDC_LOGHISTCLEAR, sTT);
\r
156 sTT.Format(IDS_SETTINGS_SAVEDDATA_URLHIST_TT, nUrlHistItems, nUrlHistWC);
\r
157 m_tooltips.AddTool(IDC_URLHISTORY, sTT);
\r
158 m_tooltips.AddTool(IDC_URLHISTCLEAR, sTT);
\r
159 sTT.Format(IDS_SETTINGS_SAVEDDATA_RESIZABLE_TT, nResizableDialogs);
\r
160 m_tooltips.AddTool(IDC_RESIZABLEHISTORY, sTT);
\r
161 m_tooltips.AddTool(IDC_RESIZABLEHISTCLEAR, sTT);
\r
162 sTT.Format(IDS_SETTINGS_SAVEDDATA_AUTH_TT, nSimple, nSSL, nUsername);
\r
163 m_tooltips.AddTool(IDC_AUTHHISTORY, sTT);
\r
164 m_tooltips.AddTool(IDC_AUTHHISTCLEAR, sTT);
\r
165 sTT.Format(IDS_SETTINGS_SAVEDDATA_REPOLOGHIST_TT, nLogHistRepo);
\r
166 m_tooltips.AddTool(IDC_REPOLOG, sTT);
\r
167 m_tooltips.AddTool(IDC_REPOLOGCLEAR, sTT);
\r
168 sTT.LoadString(IDS_SETTINGS_SHOWACTIONLOG_TT);
\r
169 m_tooltips.AddTool(IDC_ACTIONLOGSHOW, sTT);
\r
170 sTT.LoadString(IDS_SETTINGS_MAXACTIONLOGLINES_TT);
\r
171 m_tooltips.AddTool(IDC_MAXLINES, sTT);
\r
172 sTT.LoadString(IDS_SETTINGS_CLEARACTIONLOG_TT);
\r
173 m_tooltips.AddTool(IDC_ACTIONLOGCLEAR, sTT);
\r
178 BOOL CSetSavedDataPage::PreTranslateMessage(MSG* pMsg)
\r
180 m_tooltips.RelayEvent(pMsg);
\r
181 return ISettingsPropPage::PreTranslateMessage(pMsg);
\r
184 BEGIN_MESSAGE_MAP(CSetSavedDataPage, ISettingsPropPage)
\r
185 ON_BN_CLICKED(IDC_URLHISTCLEAR, &CSetSavedDataPage::OnBnClickedUrlhistclear)
\r
186 ON_BN_CLICKED(IDC_LOGHISTCLEAR, &CSetSavedDataPage::OnBnClickedLoghistclear)
\r
187 ON_BN_CLICKED(IDC_RESIZABLEHISTCLEAR, &CSetSavedDataPage::OnBnClickedResizablehistclear)
\r
188 ON_BN_CLICKED(IDC_AUTHHISTCLEAR, &CSetSavedDataPage::OnBnClickedAuthhistclear)
\r
189 ON_BN_CLICKED(IDC_REPOLOGCLEAR, &CSetSavedDataPage::OnBnClickedRepologclear)
\r
190 ON_BN_CLICKED(IDC_ACTIONLOGSHOW, &CSetSavedDataPage::OnBnClickedActionlogshow)
\r
191 ON_BN_CLICKED(IDC_ACTIONLOGCLEAR, &CSetSavedDataPage::OnBnClickedActionlogclear)
\r
192 ON_EN_CHANGE(IDC_MAXLINES, OnModified)
\r
195 void CSetSavedDataPage::OnBnClickedUrlhistclear()
\r
197 CRegistryKey reg(_T("Software\\TortoiseSVN\\History\\repoURLS"));
\r
199 m_btnUrlHistClear.EnableWindow(FALSE);
\r
200 m_tooltips.DelTool(GetDlgItem(IDC_URLHISTCLEAR));
\r
201 m_tooltips.DelTool(GetDlgItem(IDC_URLHISTORY));
\r
204 void CSetSavedDataPage::OnBnClickedLoghistclear()
\r
206 CRegistryKey reg(_T("Software\\TortoiseSVN\\History"));
\r
207 CStringList histlist;
\r
208 reg.getSubKeys(histlist);
\r
209 for (POSITION pos = histlist.GetHeadPosition(); pos != NULL; )
\r
211 CString sHist = histlist.GetNext(pos);
\r
212 if (sHist.Left(6).CompareNoCase(_T("commit"))==0)
\r
214 CRegistryKey regkey(_T("Software\\TortoiseSVN\\History\\")+sHist);
\r
215 regkey.removeKey();
\r
219 m_btnLogHistClear.EnableWindow(FALSE);
\r
220 m_tooltips.DelTool(GetDlgItem(IDC_RESIZABLEHISTCLEAR));
\r
221 m_tooltips.DelTool(GetDlgItem(IDC_RESIZABLEHISTORY));
\r
224 void CSetSavedDataPage::OnBnClickedResizablehistclear()
\r
226 CRegistryKey reg(_T("Software\\TortoiseSVN\\TortoiseProc\\ResizableState"));
\r
228 m_btnResizableHistClear.EnableWindow(FALSE);
\r
229 m_tooltips.DelTool(GetDlgItem(IDC_RESIZABLEHISTCLEAR));
\r
230 m_tooltips.DelTool(GetDlgItem(IDC_RESIZABLEHISTORY));
\r
233 void CSetSavedDataPage::OnBnClickedAuthhistclear()
\r
235 CRegStdString auth = CRegStdString(_T("Software\\TortoiseSVN\\Auth\\"));
\r
237 TCHAR pathbuf[MAX_PATH] = {0};
\r
238 if (SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, pathbuf)==S_OK)
\r
240 _tcscat_s(pathbuf, MAX_PATH, _T("\\Subversion\\auth"));
\r
241 pathbuf[_tcslen(pathbuf)+1] = 0;
\r
242 SHFILEOPSTRUCT fileop;
\r
243 fileop.hwnd = this->m_hWnd;
\r
244 fileop.wFunc = FO_DELETE;
\r
245 fileop.pFrom = pathbuf;
\r
247 fileop.fFlags = FOF_NO_CONNECTED_ELEMENTS | FOF_NOCONFIRMATION;// | FOF_NOERRORUI | FOF_SILENT;
\r
248 fileop.lpszProgressTitle = _T("deleting file");
\r
249 SHFileOperation(&fileop);
\r
251 m_btnAuthHistClear.EnableWindow(FALSE);
\r
252 m_tooltips.DelTool(GetDlgItem(IDC_AUTHHISTCLEAR));
\r
253 m_tooltips.DelTool(GetDlgItem(IDC_AUTHHISTORY));
\r
256 void CSetSavedDataPage::OnBnClickedRepologclear()
\r
258 CString path = CPathUtils::GetAppDataDirectory()+_T("logcache");
\r
259 TCHAR pathbuf[MAX_PATH] = {0};
\r
260 _tcscpy_s(pathbuf, MAX_PATH, (LPCTSTR)path);
\r
261 pathbuf[_tcslen(pathbuf)+1] = 0;
\r
263 SHFILEOPSTRUCT fileop = {0};
\r
264 fileop.hwnd = this->m_hWnd;
\r
265 fileop.wFunc = FO_DELETE;
\r
266 fileop.pFrom = pathbuf;
\r
268 fileop.fFlags = FOF_NO_CONNECTED_ELEMENTS | FOF_NOCONFIRMATION;
\r
269 fileop.lpszProgressTitle = _T("deleting cached data");
\r
270 SHFileOperation(&fileop);
\r
272 m_btnRepoLogClear.EnableWindow(FALSE);
\r
273 m_tooltips.DelTool(GetDlgItem(IDC_REPOLOG));
\r
274 m_tooltips.DelTool(GetDlgItem(IDC_REPOLOGCLEAR));
\r
277 void CSetSavedDataPage::OnBnClickedActionlogshow()
\r
279 CString logfile = CPathUtils::GetAppDataDirectory() + _T("logfile.txt");
\r
280 CAppUtils::StartTextViewer(logfile);
\r
283 void CSetSavedDataPage::OnBnClickedActionlogclear()
\r
285 CString logfile = CPathUtils::GetAppDataDirectory() + _T("logfile.txt");
\r
286 DeleteFile(logfile);
\r
287 m_btnActionLogClear.EnableWindow(FALSE);
\r
288 m_btnActionLogShow.EnableWindow(FALSE);
\r
291 void CSetSavedDataPage::OnModified()
\r
296 BOOL CSetSavedDataPage::OnApply()
\r
298 Store (m_maxLines, m_regMaxLines);
\r
299 return ISettingsPropPage::OnApply();
\r