OSDN Git Service

Only apply checked patch
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / PatchListCtrl.cpp
1 // PathListCtrl.cpp : implementation file\r
2 //\r
3 \r
4 #include "stdafx.h"\r
5 #include "TortoiseProc.h"\r
6 #include "PatchListCtrl.h"\r
7 #include "iconmenu.h"\r
8 #include "AppUtils.h"\r
9 #include "git.h"\r
10 #include "PathUtils.h"\r
11 #include "AppUtils.h"\r
12 // CPatchListCtrl\r
13 \r
14 IMPLEMENT_DYNAMIC(CPatchListCtrl, CListCtrl)\r
15 \r
16 CPatchListCtrl::CPatchListCtrl()\r
17 {\r
18         m_ContextMenuMask=0xFFFFFFFF;\r
19 }\r
20 \r
21 CPatchListCtrl::~CPatchListCtrl()\r
22 {\r
23 }\r
24 \r
25 \r
26 BEGIN_MESSAGE_MAP(CPatchListCtrl, CListCtrl)\r
27         ON_NOTIFY_REFLECT(NM_DBLCLK, &CPatchListCtrl::OnNMDblclk)\r
28         ON_WM_CONTEXTMENU()\r
29 END_MESSAGE_MAP()\r
30 \r
31 \r
32 \r
33 // CPatchListCtrl message handlers\r
34 \r
35 \r
36 \r
37 void CPatchListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)\r
38 {\r
39         LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);\r
40         // TODO: Add your control notification handler code here\r
41         CString path=GetItemText(pNMItemActivate->iItem,0);\r
42         CTGitPath gitpath;\r
43         gitpath.SetFromWin(path);\r
44         \r
45         CAppUtils::StartUnifiedDiffViewer(path,gitpath.GetFilename());\r
46 \r
47         *pResult = 0;\r
48 \r
49 }\r
50 \r
51 void CPatchListCtrl::OnContextMenu(CWnd* /*pWnd*/, CPoint point)\r
52 {\r
53         // TODO: Add your message handler code here\r
54         int selected=this->GetSelectedCount();\r
55         int index=0;\r
56         POSITION pos=this->GetFirstSelectedItemPosition();\r
57         index=this->GetNextSelectedItem(pos);\r
58 \r
59         CIconMenu popup;\r
60         if (popup.CreatePopupMenu())\r
61         {\r
62                 if(selected == 1)\r
63                 {\r
64                         if( m_ContextMenuMask&GetMenuMask(MENU_VIEWPATCH))\r
65                                 popup.AppendMenuIcon(MENU_VIEWPATCH, IDS_MENU_VIEWPATCH, 0);\r
66 \r
67                         if( m_ContextMenuMask&GetMenuMask(MENU_VIEWWITHMERGE))\r
68                                 popup.AppendMenuIcon(MENU_VIEWWITHMERGE, IDS_MENU_VIEWWITHMERGE, 0);\r
69 \r
70                         popup.SetDefaultItem(MENU_VIEWPATCH, FALSE);\r
71                 }\r
72                 if(selected >= 1)\r
73                 {\r
74                         if( m_ContextMenuMask&GetMenuMask(MENU_SENDMAIL))\r
75                                 popup.AppendMenuIcon(MENU_SENDMAIL, IDS_MENU_SENDMAIL, IDI_MENUSENDMAIL);\r
76 \r
77                         if( m_ContextMenuMask&GetMenuMask(MENU_APPLY))\r
78                                 popup.AppendMenuIcon(MENU_APPLY, IDS_MENU_APPLY, 0);\r
79                 }\r
80 \r
81                 int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0);\r
82 \r
83                 switch (cmd)\r
84                 {\r
85                 case MENU_VIEWPATCH:\r
86                         {\r
87 \r
88                                 CString path=GetItemText(index,0);\r
89                                 CTGitPath gitpath;\r
90                                 gitpath.SetFromWin(path);\r
91         \r
92                                 CAppUtils::StartUnifiedDiffViewer(path,gitpath.GetFilename());\r
93                                 break;\r
94                         }\r
95                 case MENU_VIEWWITHMERGE:\r
96                         {\r
97                                 CString path=GetItemText(index,0);\r
98                                 CTGitPath gitpath;\r
99                                 gitpath.SetFromWin(path);\r
100 \r
101                                 CTGitPath dir;\r
102                                 dir.SetFromGit(g_Git.m_CurrentDir);\r
103 \r
104                                 CAppUtils::StartExtPatch(gitpath,dir);\r
105                                 break;\r
106                         }\r
107                 case MENU_SENDMAIL:\r
108                         {\r
109                                 LaunchProc(CString(_T("sendmail")));\r
110                                 break;\r
111                         }\r
112                 case MENU_APPLY:\r
113                         {\r
114                                 LaunchProc(CString(_T("importpatch")));\r
115 \r
116                                 break;\r
117                         }\r
118                 default:\r
119                         break;\r
120                 }\r
121         }\r
122 }\r
123 \r
124 int CPatchListCtrl::LaunchProc(CString& command)\r
125 {\r
126         CString tempfile=GetTempFile();\r
127         POSITION pos=this->GetFirstSelectedItemPosition();\r
128         CFile file;\r
129         file.Open(tempfile,CFile::modeWrite|CFile::modeCreate);\r
130 \r
131         while(pos)\r
132         {\r
133                 int index = this->GetNextSelectedItem(pos);\r
134                 CString one=this->GetItemText(index,0);\r
135                 file.Write(one.GetBuffer(),sizeof(TCHAR)*one.GetLength());\r
136                 file.Write(_T("\n"),sizeof(TCHAR)*1);\r
137         }\r
138 \r
139         file.Close();\r
140 \r
141         CString cmd;\r
142         cmd = CPathUtils::GetAppDirectory();\r
143         cmd += _T("TortoiseProc.exe /command:");\r
144         cmd += command;\r
145         cmd +=_T(" /pathfile:\"");\r
146         cmd += tempfile;\r
147         cmd += _T("\" /deletepathfile");\r
148         CAppUtils::LaunchApplication(cmd, IDS_ERR_PROC,false);\r
149         return 0;\r
150 }\r