Add PatchListCtrl to show context menu at sendmail and import patch.
[TortoiseGit.git] / src / TortoiseProc / PatchListCtrl.cpp
blob868f32c7578473478de39c6593520daafe6e9b31
1 // PathListCtrl.cpp : implementation file
2 //
4 #include "stdafx.h"
5 #include "TortoiseProc.h"
6 #include "PatchListCtrl.h"
7 #include "iconmenu.h"
8 #include "AppUtils.h"
9 #include "git.h"
10 #include "PathUtils.h"
11 #include "AppUtils.h"
12 // CPatchListCtrl
14 IMPLEMENT_DYNAMIC(CPatchListCtrl, CListCtrl)
16 CPatchListCtrl::CPatchListCtrl()
18 m_ContextMenuMask=0xFFFFFFFF;
21 CPatchListCtrl::~CPatchListCtrl()
26 BEGIN_MESSAGE_MAP(CPatchListCtrl, CListCtrl)
27 ON_NOTIFY_REFLECT(NM_DBLCLK, &CPatchListCtrl::OnNMDblclk)
28 ON_WM_CONTEXTMENU()
29 END_MESSAGE_MAP()
33 // CPatchListCtrl message handlers
37 void CPatchListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
39 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
40 // TODO: Add your control notification handler code here
41 CString path=GetItemText(pNMItemActivate->iItem,0);
42 CTGitPath gitpath;
43 gitpath.SetFromWin(path);
45 CAppUtils::StartUnifiedDiffViewer(path,gitpath.GetFilename());
47 *pResult = 0;
51 void CPatchListCtrl::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
53 // TODO: Add your message handler code here
54 int selected=this->GetSelectedCount();
55 int index=0;
56 POSITION pos=this->GetFirstSelectedItemPosition();
57 index=this->GetNextSelectedItem(pos);
59 CIconMenu popup;
60 if (popup.CreatePopupMenu())
62 if(selected == 1)
64 if( m_ContextMenuMask&GetMenuMask(MENU_VIEWPATCH))
65 popup.AppendMenuIcon(MENU_VIEWPATCH, IDS_MENU_VIEWPATCH, 0);
67 if( m_ContextMenuMask&GetMenuMask(MENU_VIEWWITHMERGE))
68 popup.AppendMenuIcon(MENU_VIEWWITHMERGE, IDS_MENU_VIEWWITHMERGE, 0);
70 popup.SetDefaultItem(MENU_VIEWPATCH, FALSE);
72 if(selected >= 1)
74 if( m_ContextMenuMask&GetMenuMask(MENU_SENDMAIL))
75 popup.AppendMenuIcon(MENU_SENDMAIL, IDS_MENU_SENDMAIL, IDI_MENUSENDMAIL);
77 if( m_ContextMenuMask&GetMenuMask(MENU_APPLY))
78 popup.AppendMenuIcon(MENU_APPLY, IDS_MENU_APPLY, 0);
81 int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0);
83 switch (cmd)
85 case MENU_VIEWPATCH:
88 CString path=GetItemText(index,0);
89 CTGitPath gitpath;
90 gitpath.SetFromWin(path);
92 CAppUtils::StartUnifiedDiffViewer(path,gitpath.GetFilename());
93 break;
95 case MENU_VIEWWITHMERGE:
97 CString path=GetItemText(index,0);
98 CTGitPath gitpath;
99 gitpath.SetFromWin(path);
101 CTGitPath dir;
102 dir.SetFromGit(g_Git.m_CurrentDir);
104 CAppUtils::StartExtPatch(gitpath,dir);
105 break;
107 case MENU_SENDMAIL:
109 LaunchProc(CString(_T("sendmail")));
110 break;
112 case MENU_APPLY:
114 LaunchProc(CString(_T("importpatch")));
116 break;
118 default:
119 break;
124 int CPatchListCtrl::LaunchProc(CString& command)
126 CString tempfile=GetTempFile();
127 POSITION pos=this->GetFirstSelectedItemPosition();
128 CFile file;
129 file.Open(tempfile,CFile::modeWrite|CFile::modeCreate);
131 while(pos)
133 int index = this->GetNextSelectedItem(pos);
134 CString one=this->GetItemText(index,0);
135 file.Write(one.GetBuffer(),sizeof(TCHAR)*one.GetLength());
136 file.Write(_T("\n"),sizeof(TCHAR)*1);
139 file.Close();
141 CString cmd;
142 cmd = CPathUtils::GetAppDirectory();
143 cmd += _T("TortoiseProc.exe /command:");
144 cmd += command;
145 cmd +=_T(" /pathfile:\"");
146 cmd += tempfile;
147 cmd += _T("\" /deletepathfile");
148 CAppUtils::LaunchApplication(cmd, IDS_ERR_PROC,false);
149 return 0;