OSDN Git Service

Merge remove x86 build
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / GitLogListAction.cpp
1 // GitLogList.cpp : implementation file\r
2 //\r
3 /*\r
4         Description: qgit revision list view\r
5 \r
6         Author: Marco Costalba (C) 2005-2007\r
7 \r
8         Copyright: See COPYING file that comes with this distribution\r
9 \r
10 */\r
11 #include "stdafx.h"\r
12 #include "TortoiseProc.h"\r
13 #include "GitLogList.h"\r
14 #include "GitRev.h"\r
15 //#include "VssStyle.h"\r
16 #include "IconMenu.h"\r
17 // CGitLogList\r
18 #include "cursor.h"\r
19 #include "InputDlg.h"\r
20 #include "PropDlg.h"\r
21 #include "SVNProgressDlg.h"\r
22 #include "ProgressDlg.h"\r
23 //#include "RepositoryBrowser.h"\r
24 //#include "CopyDlg.h"\r
25 //#include "StatGraphDlg.h"\r
26 #include "Logdlg.h"\r
27 #include "MessageBox.h"\r
28 #include "Registry.h"\r
29 #include "AppUtils.h"\r
30 #include "PathUtils.h"\r
31 #include "StringUtils.h"\r
32 #include "UnicodeUtils.h"\r
33 #include "TempFile.h"\r
34 //#include "GitInfo.h"\r
35 //#include "GitDiff.h"\r
36 #include "IconMenu.h"\r
37 //#include "RevisionRangeDlg.h"\r
38 //#include "BrowseFolder.h"\r
39 //#include "BlameDlg.h"\r
40 //#include "Blame.h"\r
41 //#include "GitHelpers.h"\r
42 #include "GitStatus.h"\r
43 //#include "LogDlgHelper.h"\r
44 //#include "CachedLogInfo.h"\r
45 //#include "RepositoryInfo.h"\r
46 //#include "EditPropertiesDlg.h"\r
47 #include "FileDiffDlg.h"\r
48 \r
49 IMPLEMENT_DYNAMIC(CGitLogList, CHintListCtrl)\r
50 \r
51 void CGitLogList::ContextMenuAction(int cmd,int FirstSelect, int LastSelect)\r
52 {       \r
53         POSITION pos = GetFirstSelectedItemPosition();\r
54         int indexNext = GetNextSelectedItem(pos);\r
55         if (indexNext < 0)\r
56                 return;\r
57 \r
58         GitRev* pSelLogEntry = reinterpret_cast<GitRev*>(m_arShownList.GetAt(indexNext));\r
59 \r
60         theApp.DoWaitCursor(1);\r
61         bool bOpenWith = false;\r
62         switch (cmd)\r
63                 {\r
64                         case ID_GNUDIFF1:\r
65                         {\r
66                                 CString tempfile=GetTempFile();\r
67                                 CString cmd;\r
68                                 GitRev * r1 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(FirstSelect));\r
69                                 cmd.Format(_T("git.exe diff-tree -r -p --stat %s"),r1->m_CommitHash);\r
70                                 g_Git.RunLogFile(cmd,tempfile);\r
71                                 CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.Left(6)+_T(":")+r1->m_Subject);\r
72                         }\r
73                         break;\r
74 \r
75                         case ID_GNUDIFF2:\r
76                         {\r
77                                 CString tempfile=GetTempFile();\r
78                                 CString cmd;\r
79                                 GitRev * r1 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(FirstSelect));\r
80                                 GitRev * r2 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(LastSelect));\r
81                                 cmd.Format(_T("git.exe diff-tree -r -p --stat %s %s"),r1->m_CommitHash,r2->m_CommitHash);\r
82                                 g_Git.RunLogFile(cmd,tempfile);\r
83                                 CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.Left(6)+_T(":")+r2->m_CommitHash.Left(6));\r
84 \r
85                         }\r
86                         break;\r
87 \r
88                 case ID_COMPARETWO:\r
89                         {\r
90                                 GitRev * r1 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(FirstSelect));\r
91                                 GitRev * r2 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(LastSelect));\r
92                                 CFileDiffDlg dlg;\r
93                                 dlg.SetDiff(NULL,*r1,*r2);\r
94                                 dlg.DoModal();\r
95                                 \r
96                         }\r
97                         break;\r
98                 \r
99 \r
100                 case ID_COMPARE:\r
101                         {\r
102                                 GitRev * r1 = &m_wcRev;\r
103                                 GitRev * r2 = pSelLogEntry;\r
104                                 CFileDiffDlg dlg;\r
105                                 dlg.SetDiff(NULL,*r1,*r2);\r
106                                 dlg.DoModal();\r
107 \r
108                                 //user clicked on the menu item "compare with working copy"\r
109                                 //if (PromptShown())\r
110                                 //{\r
111                                 //      GitDiff diff(this, m_hWnd, true);\r
112                                 //      diff.SetAlternativeTool(!!(GetAsyncKeyState(VK_SHIFT) & 0x8000));\r
113                                 //      diff.SetHEADPeg(m_LogRevision);\r
114                                 //      diff.ShowCompare(m_path, GitRev::REV_WC, m_path, revSelected);\r
115                                 //}\r
116                                 //else\r
117                                 //      CAppUtils::StartShowCompare(m_hWnd, m_path, GitRev::REV_WC, m_path, revSelected, GitRev(), m_LogRevision, !!(GetAsyncKeyState(VK_SHIFT) & 0x8000));\r
118                         }\r
119                         break;\r
120 \r
121                 case ID_COMPAREWITHPREVIOUS:\r
122                         {\r
123 \r
124                                 CFileDiffDlg dlg;\r
125                                 \r
126                                 if(pSelLogEntry->m_ParentHash.size()>0)\r
127                                 //if(m_logEntries.m_HashMap[pSelLogEntry->m_ParentHash[0]]>=0)\r
128                                 {\r
129                                         dlg.SetDiff(NULL,pSelLogEntry->m_CommitHash,pSelLogEntry->m_ParentHash[0]);\r
130                                         dlg.DoModal();\r
131                                 }else\r
132                                 {\r
133                                         CMessageBox::Show(NULL,_T("No previous version"),_T("TortoiseGit"),MB_OK);      \r
134                                 }\r
135                                 //if (PromptShown())\r
136                                 //{\r
137                                 //      GitDiff diff(this, m_hWnd, true);\r
138                                 //      diff.SetAlternativeTool(!!(GetAsyncKeyState(VK_SHIFT) & 0x8000));\r
139                                 //      diff.SetHEADPeg(m_LogRevision);\r
140                                 //      diff.ShowCompare(CTGitPath(pathURL), revPrevious, CTGitPath(pathURL), revSelected);\r
141                                 //}\r
142                                 //else\r
143                                 //      CAppUtils::StartShowCompare(m_hWnd, CTGitPath(pathURL), revPrevious, CTGitPath(pathURL), revSelected, GitRev(), m_LogRevision, !!(GetAsyncKeyState(VK_SHIFT) & 0x8000));\r
144                         }\r
145                         break;\r
146                 case ID_COPYCLIPBOARD:\r
147                         {\r
148                                 CopySelectionToClipBoard();\r
149                         }\r
150                         break;\r
151                 case ID_COPYHASH:\r
152                         {\r
153                                 CopySelectionToClipBoard(TRUE);\r
154                         }\r
155                         break;\r
156                 case ID_EXPORT:\r
157                         CAppUtils::Export(&pSelLogEntry->m_CommitHash);\r
158                         break;\r
159                 case ID_CREATE_BRANCH:\r
160                         CAppUtils::CreateBranchTag(FALSE,&pSelLogEntry->m_CommitHash);\r
161                         ReloadHashMap();\r
162                         Invalidate();                   \r
163                         break;\r
164                 case ID_CREATE_TAG:\r
165                         CAppUtils::CreateBranchTag(TRUE,&pSelLogEntry->m_CommitHash);\r
166                         ReloadHashMap();\r
167                         Invalidate();\r
168                         break;\r
169                 case ID_SWITCHTOREV:\r
170                         CAppUtils::Switch(&pSelLogEntry->m_CommitHash);\r
171                         ReloadHashMap();\r
172                         Invalidate();\r
173                         break;\r
174                 case ID_RESET:\r
175                         CAppUtils::GitReset(&pSelLogEntry->m_CommitHash);\r
176                         ReloadHashMap();\r
177                         Invalidate();\r
178                         break;\r
179                 case ID_REBASE_PICK:\r
180                         SetSelectedAction(CTGitPath::LOGACTIONS_REBASE_PICK);\r
181                         break;\r
182                 case ID_REBASE_EDIT:\r
183                         SetSelectedAction(CTGitPath::LOGACTIONS_REBASE_EDIT);\r
184                         break;\r
185                 case ID_REBASE_SQUASH:\r
186                         SetSelectedAction(CTGitPath::LOGACTIONS_REBASE_SQUASH);\r
187                         break;\r
188                 case ID_REBASE_SKIP:\r
189                         SetSelectedAction(CTGitPath::LOGACTIONS_REBASE_SKIP);\r
190                         break;\r
191                 default:\r
192                         //CMessageBox::Show(NULL,_T("Have not implemented"),_T("TortoiseGit"),MB_OK);\r
193                         break;\r
194 #if 0\r
195         \r
196                 case ID_REVERTREV:\r
197                         {\r
198                                 // we need an URL to complete this command, so error out if we can't get an URL\r
199                                 if (pathURL.IsEmpty())\r
200                                 {\r
201                                         CString strMessage;\r
202                                         strMessage.Format(IDS_ERR_NOURLOFFILE, (LPCTSTR)(m_path.GetUIPathString()));\r
203                                         CMessageBox::Show(this->m_hWnd, strMessage, _T("TortoiseGit"), MB_ICONERROR);\r
204                                         TRACE(_T("could not retrieve the URL of the folder!\n"));\r
205                                         break;          //exit\r
206                                 }\r
207                                 CString msg;\r
208                                 msg.Format(IDS_LOG_REVERT_CONFIRM, m_path.GetWinPath());\r
209                                 if (CMessageBox::Show(this->m_hWnd, msg, _T("TortoiseGit"), MB_YESNO | MB_ICONQUESTION) == IDYES)\r
210                                 {\r
211                                         CGitProgressDlg dlg;\r
212                                         dlg.SetCommand(CGitProgressDlg::GitProgress_Merge);\r
213                                         dlg.SetPathList(CTGitPathList(m_path));\r
214                                         dlg.SetUrl(pathURL);\r
215                                         dlg.SetSecondUrl(pathURL);\r
216                                         revisionRanges.AdjustForMerge(true);\r
217                                         dlg.SetRevisionRanges(revisionRanges);\r
218                                         dlg.SetPegRevision(m_LogRevision);\r
219                                         dlg.DoModal();\r
220                                 }\r
221                         }\r
222                         break;\r
223                 case ID_MERGEREV:\r
224                         {\r
225                                 // we need an URL to complete this command, so error out if we can't get an URL\r
226                                 if (pathURL.IsEmpty())\r
227                                 {\r
228                                         CString strMessage;\r
229                                         strMessage.Format(IDS_ERR_NOURLOFFILE, (LPCTSTR)(m_path.GetUIPathString()));\r
230                                         CMessageBox::Show(this->m_hWnd, strMessage, _T("TortoiseGit"), MB_ICONERROR);\r
231                                         TRACE(_T("could not retrieve the URL of the folder!\n"));\r
232                                         break;          //exit\r
233                                 }\r
234 \r
235                                 CString path = m_path.GetWinPathString();\r
236                                 bool bGotSavePath = false;\r
237                                 if ((GetSelectedCount() == 1)&&(!m_path.IsDirectory()))\r
238                                 {\r
239                                         bGotSavePath = CAppUtils::FileOpenSave(path, NULL, IDS_LOG_MERGETO, IDS_COMMONFILEFILTER, true, GetSafeHwnd());\r
240                                 }\r
241                                 else\r
242                                 {\r
243                                         CBrowseFolder folderBrowser;\r
244                                         folderBrowser.SetInfo(CString(MAKEINTRESOURCE(IDS_LOG_MERGETO)));\r
245                                         bGotSavePath = (folderBrowser.Show(GetSafeHwnd(), path, path) == CBrowseFolder::OK);\r
246                                 }\r
247                                 if (bGotSavePath)\r
248                                 {\r
249                                         CGitProgressDlg dlg;\r
250                                         dlg.SetCommand(CGitProgressDlg::GitProgress_Merge);\r
251                                         dlg.SetPathList(CTGitPathList(CTGitPath(path)));\r
252                                         dlg.SetUrl(pathURL);\r
253                                         dlg.SetSecondUrl(pathURL);\r
254                                         revisionRanges.AdjustForMerge(false);\r
255                                         dlg.SetRevisionRanges(revisionRanges);\r
256                                         dlg.SetPegRevision(m_LogRevision);\r
257                                         dlg.DoModal();\r
258                                 }\r
259                         }\r
260                         break;\r
261                 case ID_REVERTTOREV:\r
262                         {\r
263                                 // we need an URL to complete this command, so error out if we can't get an URL\r
264                                 if (pathURL.IsEmpty())\r
265                                 {\r
266                                         CString strMessage;\r
267                                         strMessage.Format(IDS_ERR_NOURLOFFILE, (LPCTSTR)(m_path.GetUIPathString()));\r
268                                         CMessageBox::Show(this->m_hWnd, strMessage, _T("TortoiseGit"), MB_ICONERROR);\r
269                                         TRACE(_T("could not retrieve the URL of the folder!\n"));\r
270                                         break;          //exit\r
271                                 }\r
272 \r
273                                 CString msg;\r
274                                 msg.Format(IDS_LOG_REVERTTOREV_CONFIRM, m_path.GetWinPath());\r
275                                 if (CMessageBox::Show(this->m_hWnd, msg, _T("TortoiseGit"), MB_YESNO | MB_ICONQUESTION) == IDYES)\r
276                                 {\r
277                                         CGitProgressDlg dlg;\r
278                                         dlg.SetCommand(CGitProgressDlg::GitProgress_Merge);\r
279                                         dlg.SetPathList(CTGitPathList(m_path));\r
280                                         dlg.SetUrl(pathURL);\r
281                                         dlg.SetSecondUrl(pathURL);\r
282                                         GitRevRangeArray revarray;\r
283                                         revarray.AddRevRange(GitRev::REV_HEAD, revSelected);\r
284                                         dlg.SetRevisionRanges(revarray);\r
285                                         dlg.SetPegRevision(m_LogRevision);\r
286                                         dlg.DoModal();\r
287                                 }\r
288                         }\r
289                         break;\r
290         \r
291 \r
292         \r
293                 case ID_BLAMECOMPARE:\r
294                         {\r
295                                 //user clicked on the menu item "compare with working copy"\r
296                                 //now first get the revision which is selected\r
297                                 if (PromptShown())\r
298                                 {\r
299                                         GitDiff diff(this, this->m_hWnd, true);\r
300                                         diff.SetHEADPeg(m_LogRevision);\r
301                                         diff.ShowCompare(m_path, GitRev::REV_BASE, m_path, revSelected, GitRev(), false, true);\r
302                                 }\r
303                                 else\r
304                                         CAppUtils::StartShowCompare(m_hWnd, m_path, GitRev::REV_BASE, m_path, revSelected, GitRev(), m_LogRevision, false, false, true);\r
305                         }\r
306                         break;\r
307                 case ID_BLAMETWO:\r
308                         {\r
309                                 //user clicked on the menu item "compare and blame revisions"\r
310                                 if (PromptShown())\r
311                                 {\r
312                                         GitDiff diff(this, this->m_hWnd, true);\r
313                                         diff.SetHEADPeg(m_LogRevision);\r
314                                         diff.ShowCompare(CTGitPath(pathURL), revSelected2, CTGitPath(pathURL), revSelected, GitRev(), false, true);\r
315                                 }\r
316                                 else\r
317                                         CAppUtils::StartShowCompare(m_hWnd, CTGitPath(pathURL), revSelected2, CTGitPath(pathURL), revSelected, GitRev(), m_LogRevision, false, false, true);\r
318                         }\r
319                         break;\r
320                 case ID_BLAMEWITHPREVIOUS:\r
321                         {\r
322                                 //user clicked on the menu item "Compare and Blame with previous revision"\r
323                                 if (PromptShown())\r
324                                 {\r
325                                         GitDiff diff(this, this->m_hWnd, true);\r
326                                         diff.SetHEADPeg(m_LogRevision);\r
327                                         diff.ShowCompare(CTGitPath(pathURL), revPrevious, CTGitPath(pathURL), revSelected, GitRev(), false, true);\r
328                                 }\r
329                                 else\r
330                                         CAppUtils::StartShowCompare(m_hWnd, CTGitPath(pathURL), revPrevious, CTGitPath(pathURL), revSelected, GitRev(), m_LogRevision, false, false, true);\r
331                         }\r
332                         break;\r
333                 \r
334                 case ID_OPENWITH:\r
335                         bOpenWith = true;\r
336                 case ID_OPEN:\r
337                         {\r
338                                 CProgressDlg progDlg;\r
339                                 progDlg.SetTitle(IDS_APPNAME);\r
340                                 progDlg.SetAnimation(IDR_DOWNLOAD);\r
341                                 CString sInfoLine;\r
342                                 sInfoLine.Format(IDS_PROGRESSGETFILEREVISION, m_path.GetWinPath(), (LPCTSTR)revSelected.ToString());\r
343                                 progDlg.SetLine(1, sInfoLine, true);\r
344                                 SetAndClearProgressInfo(&progDlg);\r
345                                 progDlg.ShowModeless(m_hWnd);\r
346                                 CTGitPath tempfile = CTempFiles::Instance().GetTempFilePath(false, m_path, revSelected);\r
347                                 bool bSuccess = true;\r
348                                 if (!Cat(m_path, GitRev(GitRev::REV_HEAD), revSelected, tempfile))\r
349                                 {\r
350                                         bSuccess = false;\r
351                                         // try again, but with the selected revision as the peg revision\r
352                                         if (!Cat(m_path, revSelected, revSelected, tempfile))\r
353                                         {\r
354                                                 progDlg.Stop();\r
355                                                 SetAndClearProgressInfo((HWND)NULL);\r
356                                                 CMessageBox::Show(this->m_hWnd, GetLastErrorMessage(), _T("TortoiseGit"), MB_ICONERROR);\r
357                                                 EnableOKButton();\r
358                                                 break;\r
359                                         }\r
360                                         bSuccess = true;\r
361                                 }\r
362                                 if (bSuccess)\r
363                                 {\r
364                                         progDlg.Stop();\r
365                                         SetAndClearProgressInfo((HWND)NULL);\r
366                                         SetFileAttributes(tempfile.GetWinPath(), FILE_ATTRIBUTE_READONLY);\r
367                                         int ret = 0;\r
368                                         if (!bOpenWith)\r
369                                                 ret = (int)ShellExecute(this->m_hWnd, NULL, tempfile.GetWinPath(), NULL, NULL, SW_SHOWNORMAL);\r
370                                         if ((ret <= HINSTANCE_ERROR)||bOpenWith)\r
371                                         {\r
372                                                 CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ");\r
373                                                 cmd += tempfile.GetWinPathString() + _T(" ");\r
374                                                 CAppUtils::LaunchApplication(cmd, NULL, false);\r
375                                         }\r
376                                 }\r
377                         }\r
378                         break;\r
379                 case ID_BLAME:\r
380                         {\r
381                                 CBlameDlg dlg;\r
382                                 dlg.EndRev = revSelected;\r
383                                 if (dlg.DoModal() == IDOK)\r
384                                 {\r
385                                         CBlame blame;\r
386                                         CString tempfile;\r
387                                         CString logfile;\r
388                                         tempfile = blame.BlameToTempFile(m_path, dlg.StartRev, dlg.EndRev, dlg.EndRev, logfile, _T(""), dlg.m_bIncludeMerge, TRUE, TRUE);\r
389                                         if (!tempfile.IsEmpty())\r
390                                         {\r
391                                                 if (dlg.m_bTextView)\r
392                                                 {\r
393                                                         //open the default text editor for the result file\r
394                                                         CAppUtils::StartTextViewer(tempfile);\r
395                                                 }\r
396                                                 else\r
397                                                 {\r
398                                                         CString sParams = _T("/path:\"") + m_path.GetGitPathString() + _T("\" ");\r
399                                                         if(!CAppUtils::LaunchTortoiseBlame(tempfile, logfile, CPathUtils::GetFileNameFromPath(m_path.GetFileOrDirectoryName()),sParams))\r
400                                                         {\r
401                                                                 break;\r
402                                                         }\r
403                                                 }\r
404                                         }\r
405                                         else\r
406                                         {\r
407                                                 CMessageBox::Show(this->m_hWnd, blame.GetLastErrorMessage(), _T("TortoiseGit"), MB_ICONERROR);\r
408                                         }\r
409                                 }\r
410                         }\r
411                         break;\r
412                 case ID_UPDATE:\r
413                         {\r
414                                 CString sCmd;\r
415                                 CString url = _T("tgit:")+pathURL;\r
416                                 sCmd.Format(_T("%s /command:update /path:\"%s\" /rev:%ld"),\r
417                                         (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")),\r
418                                         (LPCTSTR)m_path.GetWinPath(), (LONG)revSelected);\r
419                                 CAppUtils::LaunchApplication(sCmd, NULL, false);\r
420                         }\r
421                         break;\r
422                 case ID_FINDENTRY:\r
423                         {\r
424                                 m_nSearchIndex = GetSelectionMark();\r
425                                 if (m_nSearchIndex < 0)\r
426                                         m_nSearchIndex = 0;\r
427                                 if (m_pFindDialog)\r
428                                 {\r
429                                         break;\r
430                                 }\r
431                                 else\r
432                                 {\r
433                                         m_pFindDialog = new CFindReplaceDialog();\r
434                                         m_pFindDialog->Create(TRUE, NULL, NULL, FR_HIDEUPDOWN | FR_HIDEWHOLEWORD, this);                                                                        \r
435                                 }\r
436                         }\r
437                         break;\r
438                 case ID_REPOBROWSE:\r
439                         {\r
440                                 CString sCmd;\r
441                                 sCmd.Format(_T("%s /command:repobrowser /path:\"%s\" /rev:%s"),\r
442                                         (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")),\r
443                                         (LPCTSTR)pathURL, (LPCTSTR)revSelected.ToString());\r
444 \r
445                                 CAppUtils::LaunchApplication(sCmd, NULL, false);\r
446                         }\r
447                         break;\r
448                 case ID_EDITLOG:\r
449                         {\r
450                                 EditLogMessage(selIndex);\r
451                         }\r
452                         break;\r
453                 case ID_EDITAUTHOR:\r
454                         {\r
455                                 EditAuthor(selEntries);\r
456                         }\r
457                         break;\r
458                 case ID_REVPROPS:\r
459                         {\r
460                                 CEditPropertiesDlg dlg;\r
461                                 dlg.SetProjectProperties(&m_ProjectProperties);\r
462                                 CTGitPathList escapedlist;\r
463                                 dlg.SetPathList(CTGitPathList(CTGitPath(pathURL)));\r
464                                 dlg.SetRevision(revSelected);\r
465                                 dlg.RevProps(true);\r
466                                 dlg.DoModal();\r
467                         }\r
468                         break;\r
469                 \r
470                 case ID_EXPORT:\r
471                         {\r
472                                 CString sCmd;\r
473                                 sCmd.Format(_T("%s /command:export /path:\"%s\" /revision:%ld"),\r
474                                         (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")),\r
475                                         (LPCTSTR)pathURL, (LONG)revSelected);\r
476                                 CAppUtils::LaunchApplication(sCmd, NULL, false);\r
477                         }\r
478                         break;\r
479                 case ID_CHECKOUT:\r
480                         {\r
481                                 CString sCmd;\r
482                                 CString url = _T("tgit:")+pathURL;\r
483                                 sCmd.Format(_T("%s /command:checkout /url:\"%s\" /revision:%ld"),\r
484                                         (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")),\r
485                                         (LPCTSTR)url, (LONG)revSelected);\r
486                                 CAppUtils::LaunchApplication(sCmd, NULL, false);\r
487                         }\r
488                         break;\r
489                 case ID_VIEWREV:\r
490                         {\r
491                                 CString url = m_ProjectProperties.sWebViewerRev;\r
492                                 url = GetAbsoluteUrlFromRelativeUrl(url);\r
493                                 url.Replace(_T("%REVISION%"), revSelected.ToString());\r
494                                 if (!url.IsEmpty())\r
495                                         ShellExecute(this->m_hWnd, _T("open"), url, NULL, NULL, SW_SHOWDEFAULT);                                        \r
496                         }\r
497                         break;\r
498                 case ID_VIEWPATHREV:\r
499                         {\r
500                                 CString relurl = pathURL;\r
501                                 CString sRoot = GetRepositoryRoot(CTGitPath(relurl));\r
502                                 relurl = relurl.Mid(sRoot.GetLength());\r
503                                 CString url = m_ProjectProperties.sWebViewerPathRev;\r
504                                 url = GetAbsoluteUrlFromRelativeUrl(url);\r
505                                 url.Replace(_T("%REVISION%"), revSelected.ToString());\r
506                                 url.Replace(_T("%PATH%"), relurl);\r
507                                 if (!url.IsEmpty())\r
508                                         ShellExecute(this->m_hWnd, _T("open"), url, NULL, NULL, SW_SHOWDEFAULT);                                        \r
509                         }\r
510                         break;\r
511 #endif\r
512                 \r
513                 } // switch (cmd)\r
514 \r
515                 theApp.DoWaitCursor(-1);\r
516 }\r
517 \r
518 void CGitLogList::SetSelectedAction(int action)\r
519 {\r
520         POSITION pos = GetFirstSelectedItemPosition();\r
521         int index;\r
522         while(pos)\r
523         {\r
524                 index = GetNextSelectedItem(pos);\r
525                 ((GitRev*)m_arShownList[index])->m_Action = action;\r
526                 CRect rect;\r
527                 this->GetItemRect(index,&rect,LVIR_BOUNDS);\r
528                 this->InvalidateRect(rect);\r
529 \r
530         }\r
531 \r
532 }