Fixed issue #1542: Can send pull request email
[TortoiseGit.git] / src / TortoiseProc / SendMailDlg.cpp
blob51887d900d2505f59d265923de6509fcf7c9a4d0
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2013 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 // SendMailDlg.cpp : implementation file
22 #include "stdafx.h"
23 #include "TortoiseProc.h"
24 #include "SendMailDlg.h"
25 #include "MessageBox.h"
26 #include "AppUtils.h"
27 #include "PatchListCtrl.h"
28 #include "MailMsg.h"
29 // CSendMailDlg dialog
31 IMPLEMENT_DYNAMIC(CSendMailDlg, CResizableStandAloneDialog)
33 CSendMailDlg::CSendMailDlg(CWnd* pParent /*=NULL*/)
34 : CResizableStandAloneDialog(CSendMailDlg::IDD, pParent)
35 , m_To(_T(""))
36 , m_CC(_T(""))
37 , m_Subject(_T(""))
38 , m_bCustomSubject(FALSE)
40 , m_regAttach(_T("Software\\TortoiseGit\\TortoiseProc\\SendMail\\Attach"),0)
41 , m_regCombine(_T("Software\\TortoiseGit\\TortoiseProc\\SendMail\\Combine"),0)
42 , m_regUseMAPI(_T("Software\\TortoiseGit\\TortoiseProc\\SendMail\\UseMAPI"),0)
44 m_bAttachment = m_regAttach;
45 m_bCombine = m_regCombine;
46 m_bUseMAPI = m_regUseMAPI;
47 this->m_ctrlList.m_ContextMenuMask &=~ m_ctrlList.GetMenuMask(CPatchListCtrl::MENU_SENDMAIL);
50 CSendMailDlg::~CSendMailDlg()
54 void CSendMailDlg::DoDataExchange(CDataExchange* pDX)
56 CDialog::DoDataExchange(pDX);
57 DDX_Text(pDX, IDC_SENDMAIL_TO, m_To);
58 DDX_Text(pDX, IDC_SENDMAIL_CC, m_CC);
59 DDX_Check(pDX, IDC_SENDMAIL_ATTACHMENT, m_bAttachment);
60 DDX_Check(pDX, IDC_SENDMAIL_COMBINE, m_bCombine);
61 DDX_Check(pDX, IDC_SENDMAIL_MAPI, m_bUseMAPI);
62 DDX_Control(pDX, IDC_SENDMAIL_PATCHS, m_ctrlList);
63 DDX_Control(pDX,IDC_SENDMAIL_SETUP, this->m_SmtpSetup);
64 DDX_Control(pDX,IDC_SENDMAIL_TO,m_ctrlTO);
65 DDX_Control(pDX,IDC_SENDMAIL_CC,m_ctrlCC);
69 BEGIN_MESSAGE_MAP(CSendMailDlg, CResizableStandAloneDialog)
70 ON_BN_CLICKED(IDC_SENDMAIL_COMBINE, &CSendMailDlg::OnBnClickedSendmailCombine)
71 ON_BN_CLICKED(IDOK, &CSendMailDlg::OnBnClickedOk)
72 ON_NOTIFY(LVN_ITEMCHANGED, IDC_SENDMAIL_PATCHS, &CSendMailDlg::OnLvnItemchangedSendmailPatchs)
73 ON_NOTIFY(NM_DBLCLK, IDC_SENDMAIL_PATCHS, &CSendMailDlg::OnNMDblclkSendmailPatchs)
74 ON_EN_CHANGE(IDC_SENDMAIL_SUBJECT, &CSendMailDlg::OnEnChangeSendmailSubject)
75 ON_BN_CLICKED(IDC_SENDMAIL_MAPI, &CSendMailDlg::OnBnClickedSendmailMapi)
76 END_MESSAGE_MAP()
78 // CSendMailDlg message handlers
80 BOOL CSendMailDlg::PreTranslateMessage(MSG* pMsg)
82 m_ToolTip.RelayEvent(pMsg);
84 return CDialog::PreTranslateMessage(pMsg);
87 BOOL CSendMailDlg::OnInitDialog()
89 CResizableStandAloneDialog::OnInitDialog();
90 CAppUtils::MarkWindowAsUnpinnable(m_hWnd);
92 AddAnchor(IDC_SENDMAIL_GROUP,TOP_LEFT,TOP_RIGHT);
93 AddAnchor(IDC_SENDMAIL_TO,TOP_LEFT,TOP_RIGHT);
94 AddAnchor(IDC_SENDMAIL_CC,TOP_LEFT,TOP_RIGHT);
95 AddAnchor(IDC_SENDMAIL_SUBJECT,TOP_LEFT,TOP_RIGHT);
96 AddAnchor(IDC_SENDMAIL_SETUP,TOP_RIGHT);
98 AddAnchor(IDC_SENDMAIL_PATCHS,TOP_LEFT,BOTTOM_RIGHT);
99 AddAnchor(IDOK,BOTTOM_RIGHT);
100 AddAnchor(IDCANCEL,BOTTOM_RIGHT);
101 AddAnchor(IDHELP, BOTTOM_RIGHT);
103 this->AddOthersToAnchor();
105 AdjustControlSize(IDC_SENDMAIL_ATTACHMENT);
106 AdjustControlSize(IDC_SENDMAIL_COMBINE);
107 AdjustControlSize(IDC_SENDMAIL_MAPI);
108 AdjustControlSize(IDC_SENDMAIL_SETUP);
110 EnableSaveRestore(_T("SendMailDlg"));
112 CString sWindowTitle;
113 GetWindowText(sWindowTitle);
114 CAppUtils::SetWindowTitle(m_hWnd, m_PathList.GetCommonRoot().GetUIPathString(), sWindowTitle);
116 CString mailCient;
117 CMailMsg::DetectMailClient(mailCient);
118 if (mailCient.IsEmpty()) {
119 m_bUseMAPI = false;
120 GetDlgItem(IDC_SENDMAIL_MAPI)->EnableWindow(false);
121 GetDlgItem(IDC_SENDMAIL_MAPI)->SendMessage(BM_SETCHECK, BST_UNCHECKED);
124 m_ctrlCC.Init();
125 m_ctrlTO.Init();
127 m_ctrlCC.SetSeparator(_T(";"));
128 m_ctrlTO.SetSeparator(_T(";"));
130 m_AddressReg.SetMaxHistoryItems(0xFFFF);
132 m_AddressReg.Load(_T("Software\\TortoiseGit\\TortoiseProc\\EmailAddress\\"),_T("email"));
133 for (int i = 0; i < m_AddressReg.GetCount(); ++i)
135 m_ctrlCC.AddSearchString(m_AddressReg.GetEntry(i));
136 m_ctrlTO.AddSearchString(m_AddressReg.GetEntry(i));
139 m_ctrlList.SetExtendedStyle( m_ctrlList.GetExtendedStyle()| LVS_EX_CHECKBOXES );
141 for (int i = 0; i < m_PathList.GetCount(); ++i)
143 m_ctrlList.InsertItem(i,m_PathList[i].GetWinPathString());
144 m_ctrlList.SetCheck(i,true);
147 if (m_PathList.GetCount() == 1)
148 m_ctrlList.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
150 // m_ctrlCC.AddSearchString(_T("Tortoisegit-dev@google.com"));
151 // m_ctrlTO.AddSearchString(_T("Tortoisegit-dev@google.com"));
152 this->UpdateData(FALSE);
153 OnBnClickedSendmailCombine();
155 //Create the ToolTip control
156 if( !m_ToolTip.Create(this))
158 TRACE0("Unable to create the ToolTip!");
160 else
162 m_ToolTip.SetMaxTipWidth(1024*8); // make multiline tooltips possible
163 m_ToolTip.AddTool(GetDlgItem(IDC_SENDMAIL_MAPI), CString(MAKEINTRESOURCE(IDS_PROC_SENDMAIL_WRAPTOOLTIP)));
164 m_ToolTip.Activate(TRUE);
167 return TRUE;
169 void CSendMailDlg::OnBnClickedSendmailCombine()
171 this->UpdateData();
173 if (m_bCustomSubject)
174 return;
176 this->GetDlgItem(IDC_SENDMAIL_SUBJECT)->EnableWindow(this->m_bCombine);
177 if(m_bCombine)
178 GetDlgItem(IDC_SENDMAIL_SUBJECT)->SetWindowText(this->m_Subject);
180 UpdateSubject();
183 void CSendMailDlg::OnBnClickedOk()
185 this->UpdateData();
187 if(this->m_To.IsEmpty() && this->m_CC.IsEmpty())
189 CMessageBox::Show(NULL,IDS_ERR_ADDRESS_NO_EMPTY,IDS_APPNAME,MB_OK|MB_ICONERROR);
190 return;
192 int start =0;
193 CString Address;
194 while(start>=0)
196 Address=this->m_CC.Tokenize(_T(";"),start);
197 m_AddressReg.AddEntry(Address);
198 m_AddressReg.Save();
200 start =0;
201 while(start>=0)
203 Address=this->m_To.Tokenize(_T(";"),start);
204 m_AddressReg.AddEntry(Address);
205 m_AddressReg.Save();
208 this->m_PathList.Clear();
209 for (int i = 0; i < m_ctrlList.GetItemCount(); ++i)
211 CTGitPath path;
212 if(m_ctrlList.GetCheck(i))
214 path.SetFromWin(m_ctrlList.GetItemText(i,0));
215 this->m_PathList.AddPath(path);
219 m_regAttach=m_bAttachment;
220 m_regCombine=m_bCombine;
221 m_regUseMAPI=m_bUseMAPI;
223 OnOK();
226 void CSendMailDlg::UpdateSubject()
228 this->UpdateData();
230 if(!this->m_bCombine)
232 if(m_ctrlList.GetSelectedCount()==1)
234 POSITION pos=m_ctrlList.GetFirstSelectedItemPosition();
235 int index=m_ctrlList.GetNextSelectedItem(pos);
236 if(this->m_MapPatch.find(index) == m_MapPatch.end() )
238 CString pathfile=m_ctrlList.GetItemText(index,0);
239 m_MapPatch[index].Parse(pathfile);
241 GetDlgItem(IDC_SENDMAIL_SUBJECT)->SetWindowText(m_MapPatch[index].m_Subject);
243 else
245 GetDlgItem(IDC_SENDMAIL_SUBJECT)->SetWindowText(_T(""));
250 void CSendMailDlg::OnLvnItemchangedSendmailPatchs(NMHDR * /*pNMHDR*/, LRESULT *pResult)
252 if (!m_bCustomSubject)
253 UpdateSubject();
255 *pResult = 0;
258 void CSendMailDlg::OnNMDblclkSendmailPatchs(NMHDR *pNMHDR, LRESULT *pResult)
260 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
262 CString path=this->m_ctrlList.GetItemText(pNMItemActivate->iItem,0);
263 CTGitPath gitpath;
264 gitpath.SetFromWin(path);
266 CAppUtils::StartUnifiedDiffViewer(path,gitpath.GetFilename());
268 *pResult = 0;
271 void CSendMailDlg::OnEnChangeSendmailSubject()
273 this->UpdateData();
274 if (m_bCombine || m_bCustomSubject)
275 GetDlgItem(IDC_SENDMAIL_SUBJECT)->GetWindowText(this->m_Subject);
278 void CSendMailDlg::OnBnClickedSendmailMapi()
280 this->UpdateData();