Make sounds for indicating a warning or error work
[TortoiseGit.git] / src / TortoiseProc / Settings / SetSavedDataPage.cpp
blobee8997abda511f2f276317224511f2d5258bc565
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.
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"
29 IMPLEMENT_DYNAMIC(CSetSavedDataPage, ISettingsPropPage)
31 CSetSavedDataPage::CSetSavedDataPage()
32 : ISettingsPropPage(CSetSavedDataPage::IDD)
33 , m_maxLines(0)
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
61 int nLogHistWC = 0;
62 INT_PTR nLogHistMsg = 0;
63 int nUrlHistWC = 0;
64 INT_PTR nUrlHistItems = 0;
65 int nLogHistRepo = 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)
74 nLogHistWC++;
75 CRegistryKey regloghistwc(_T("Software\\TortoiseGit\\History\\")+sHistName);
76 CStringList loghistlistwc;
77 regloghistwc.getValues(loghistlistwc);
78 nLogHistMsg += loghistlistwc.GetCount();
80 else
82 // repoURLs
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);
92 nUrlHistWC++;
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
109 int nSimple = 0;
110 int nSSL = 0;
111 int nUsername = 0;
113 CString sFile;
114 bool bIsDir = false;
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))
125 nSimple++;
126 CDirFileEnum sslenum(sSSL);
127 while (sslenum.NextFile(sFile, &bIsDir))
128 nSSL++;
129 CDirFileEnum userenum(sUsername);
130 while (userenum.NextFile(sFile, &bIsDir))
131 nUsername++;
134 CDirFileEnum logenum(CPathUtils::GetAppDataDirectory()+_T("logcache"));
135 while (logenum.NextFile(sFile, &bIsDir))
136 nLogHistRepo++;
137 // the "Repositories.dat" is not a cache file
138 nLogHistRepo--;
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);
150 EnableToolTips();
152 m_tooltips.Create(this);
153 CString sTT;
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);
176 return TRUE;
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)
195 END_MESSAGE_MAP()
197 void CSetSavedDataPage::OnBnClickedUrlhistclear()
199 CRegistryKey reg(_T("Software\\TortoiseGit\\History\\repoURLS"));
200 reg.removeKey();
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);
217 regkey.removeKey();
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"));
229 reg.removeKey();
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\\"));
238 auth.removeKey();
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;
248 fileop.pTo = NULL;
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;
269 fileop.pTo = NULL;
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");
288 DeleteFile(logfile);
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)
296 return;
298 int count = 0;
299 DWORD len = GetTortoiseGitTempPath(0, NULL);
300 std::unique_ptr<TCHAR[]> path(new TCHAR[len + 100]);
301 len = GetTortoiseGitTempPath(len + 100, path.get());
302 if (len != 0)
304 int lastcount;
307 lastcount = count;
308 count = 0;
309 CDirFileEnum finder(path.get());
310 bool isDir;
311 CString filepath;
312 while (finder.NextFile(filepath, &isDir))
314 ::SetFileAttributes(filepath, FILE_ATTRIBUTE_NORMAL);
315 if (isDir)
317 if (!::RemoveDirectory(filepath))
318 count++;
320 else
322 if (!::DeleteFile(filepath))
323 count++;
326 } while (lastcount != count);
329 if (count == 0)
330 GetDlgItem(IDC_TEMPFILESCLEAR)->EnableWindow(FALSE);
333 void CSetSavedDataPage::OnModified()
335 SetModified();
338 BOOL CSetSavedDataPage::OnApply()
340 Store (m_maxLines, m_regMaxLines);
341 return ISettingsPropPage::OnApply();