#include "ProgressDlg.h"\r
#include "ShellUpdater.h"\r
#include "Commands/PushCommand.h"\r
+#include "PatchViewDlg.h"\r
+#include "COMError.h"\r
\r
#ifdef _DEBUG\r
#define new DEBUG_NEW\r
DDX_Control(pDX, IDC_SPLITTER, m_wndSplitter);\r
DDX_Check(pDX, IDC_KEEPLISTS, m_bKeepChangeList);\r
DDX_Check(pDX,IDC_COMMIT_AMEND,m_bCommitAmend);\r
+ DDX_Control(pDX,IDC_VIEW_PATCH,m_ctrlShowPatch);\r
}\r
\r
BEGIN_MESSAGE_MAP(CCommitDlg, CResizableStandAloneDialog)\r
ON_REGISTERED_MESSAGE(CGitStatusListCtrl::SVNSLNM_NEEDSREFRESH, OnGitStatusListCtrlNeedsRefresh)\r
ON_REGISTERED_MESSAGE(CGitStatusListCtrl::SVNSLNM_ADDFILE, OnFileDropped)\r
ON_REGISTERED_MESSAGE(CGitStatusListCtrl::SVNSLNM_CHECKCHANGED, &CCommitDlg::OnGitStatusListCtrlCheckChanged)\r
+ ON_REGISTERED_MESSAGE(CGitStatusListCtrl::SVNSLNM_ITEMCHANGED, &CCommitDlg::OnGitStatusListCtrlItemChanged)\r
+ \r
ON_REGISTERED_MESSAGE(WM_AUTOLISTREADY, OnAutoListReady) \r
ON_WM_TIMER()\r
ON_WM_SIZE()\r
ON_BN_CLICKED(IDC_WHOLE_PROJECT, &CCommitDlg::OnBnClickedWholeProject)\r
ON_STN_CLICKED(IDC_BUGIDLABEL, &CCommitDlg::OnStnClickedBugidlabel)\r
ON_COMMAND(ID_FOCUS_MESSAGE,&CCommitDlg::OnFocusMessage)\r
+ ON_STN_CLICKED(IDC_VIEW_PATCH, &CCommitDlg::OnStnClickedViewPatch)\r
+ ON_WM_MOVE()\r
+ ON_WM_MOVING()\r
+ ON_WM_SIZING()\r
+ ON_NOTIFY(HDN_ITEMCHANGED, 0, &CCommitDlg::OnHdnItemchangedFilelist)\r
END_MESSAGE_MAP()\r
\r
BOOL CCommitDlg::OnInitDialog()\r
// AddAnchor(IDC_HISTORY, TOP_LEFT);\r
AddAnchor(IDC_LOGMESSAGE, TOP_LEFT, TOP_RIGHT);\r
AddAnchor(IDC_SIGNOFF, TOP_RIGHT);\r
+ AddAnchor(IDC_VIEW_PATCH,TOP_RIGHT);\r
AddAnchor(IDC_LISTGROUP, TOP_LEFT, BOTTOM_RIGHT);\r
AddAnchor(IDC_SPLITTER, TOP_LEFT, TOP_RIGHT);\r
AddAnchor(IDC_FILELIST, TOP_LEFT, BOTTOM_RIGHT);\r
//this->m_bCommitAmend=FALSE;\r
//this->UpdateData(FALSE);\r
\r
+ this->m_ctrlShowPatch.SetURL(CString());\r
+\r
return FALSE; // return TRUE unless you set the focus to a control\r
// EXCEPTION: OCX Property Pages should return FALSE\r
}\r
return;\r
}\r
\r
+ m_ListCtrl.WriteCheckedNamesToPathList(m_selectedPathList);\r
#if 0\r
CRegDWORD regUnversionedRecurse (_T("Software\\TortoiseGit\\UnversionedRecurse"), TRUE);\r
if (!(DWORD)regUnversionedRecurse)\r
//std::set<CString> checkedLists;\r
//std::set<CString> uncheckedLists;\r
\r
+ // now let the bugtraq plugin check the commit message\r
+ CComPtr<IBugTraqProvider2> pProvider2 = NULL;\r
+ if (m_BugTraqProvider)\r
+ {\r
+ HRESULT hr = m_BugTraqProvider.QueryInterface(&pProvider2);\r
+ if (SUCCEEDED(hr))\r
+ {\r
+ BSTR temp = NULL;\r
+ CString common = g_Git.m_CurrentDir;\r
+ BSTR repositoryRoot = common.AllocSysString();\r
+ BSTR parameters = m_bugtraq_association.GetParameters().AllocSysString();\r
+ BSTR commonRoot = SysAllocString(m_pathList.GetCommonRoot().GetDirectory().GetWinPath());\r
+ BSTR commitMessage = m_sLogMessage.AllocSysString();\r
+ SAFEARRAY *pathList = SafeArrayCreateVector(VT_BSTR, 0, m_selectedPathList.GetCount());\r
+\r
+ for (LONG index = 0; index < m_selectedPathList.GetCount(); ++index)\r
+ SafeArrayPutElement(pathList, &index, m_selectedPathList[index].GetGitPathString().AllocSysString());\r
+\r
+ if (FAILED(hr = pProvider2->CheckCommit(GetSafeHwnd(), parameters, repositoryRoot, commonRoot, pathList, commitMessage, &temp)))\r
+ {\r
+ COMError ce(hr);\r
+ CString sErr;\r
+ sErr.Format(IDS_ERR_FAILEDISSUETRACKERCOM, m_bugtraq_association.GetProviderName(), ce.GetMessageAndDescription().c_str());\r
+ CMessageBox::Show(m_hWnd, sErr, _T("TortoiseSVN"), MB_ICONERROR);\r
+ }\r
+ else\r
+ {\r
+ CString sError = temp;\r
+ if (!sError.IsEmpty())\r
+ {\r
+ CMessageBox::Show(m_hWnd, sError, _T("TortoiseSVN"), MB_ICONERROR);\r
+ return;\r
+ }\r
+ SysFreeString(temp);\r
+ }\r
+ }\r
+ }\r
+\r
//CString checkedfiles;\r
//CString uncheckedfiles;\r
\r
//User pressed 'Push' button after successful commit.\r
m_bPushAfterCommit=true;\r
}\r
-\r
+ \r
CFile::Remove(tempfile);\r
+\r
+ if (m_BugTraqProvider && progress.m_GitStatus == 0)\r
+ {\r
+ CComPtr<IBugTraqProvider2> pProvider = NULL;\r
+ HRESULT hr = m_BugTraqProvider.QueryInterface(&pProvider);\r
+ if (SUCCEEDED(hr))\r
+ {\r
+ BSTR commonRoot = SysAllocString(g_Git.m_CurrentDir);\r
+ SAFEARRAY *pathList = SafeArrayCreateVector(VT_BSTR, 0,this->m_selectedPathList.GetCount());\r
+\r
+ for (LONG index = 0; index < m_selectedPathList.GetCount(); ++index)\r
+ SafeArrayPutElement(pathList, &index, m_selectedPathList[index].GetGitPathString().AllocSysString());\r
+\r
+ BSTR logMessage = m_sLogMessage.AllocSysString();\r
+\r
+ CString hash=g_Git.GetHash(CString(_T("HEAD")));\r
+ LONG version = g_Git.Hash2int(hash);\r
+\r
+ BSTR temp = NULL;\r
+ if (FAILED(hr = pProvider->OnCommitFinished(GetSafeHwnd(), \r
+ commonRoot,\r
+ pathList,\r
+ logMessage,\r
+ (LONG)version,\r
+ &temp)))\r
+ {\r
+ CString sErr = temp;\r
+ if (!sErr.IsEmpty())\r
+ CMessageBox::Show(NULL,(sErr),_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+ else\r
+ {\r
+ COMError ce(hr);\r
+ sErr.Format(IDS_ERR_FAILEDISSUETRACKERCOM, ce.GetSource().c_str(), ce.GetMessageAndDescription().c_str());\r
+ CMessageBox::Show(NULL,(sErr),_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+ }\r
+ }\r
+\r
+ SysFreeString(temp);\r
+ }\r
+ }\r
+ \r
}else\r
{\r
CMessageBox::Show(this->m_hWnd, IDS_ERROR_NOTHING_COMMIT, IDS_COMMIT_FINISH, MB_OK | MB_ICONINFORMATION);\r
//save only the files the user has checked into the temporary file\r
m_ListCtrl.WriteCheckedNamesToPathList(m_pathList);\r
}\r
- m_ListCtrl.WriteCheckedNamesToPathList(m_selectedPathList);\r
+ \r
// the item count is used in the progress dialog to show the overall commit\r
// progress.\r
// deleted items only send one notification event, all others send two\r
\r
}\r
\r
+void CCommitDlg::FillPatchView()\r
+{\r
+ if(::IsWindow(this->m_patchViewdlg.m_hWnd))\r
+ {\r
+ m_patchViewdlg.m_ctrlPatchView.SetText(CString());\r
+\r
+ POSITION pos=m_ListCtrl.GetFirstSelectedItemPosition();\r
+ m_patchViewdlg.m_ctrlPatchView.Call(SCI_SETREADONLY, FALSE);\r
+ CString cmd,out;\r
+\r
+ while(pos)\r
+ {\r
+ int nSelect = m_ListCtrl.GetNextSelectedItem(pos);\r
+ CTGitPath * p=(CTGitPath*)m_ListCtrl.GetItemData(nSelect);\r
+ if(p && !(p->m_Action&CTGitPath::LOGACTIONS_UNVER) )\r
+ {\r
+ cmd.Format(_T("git.exe diff -- \"%s\""),p->GetGitPathString());\r
+ g_Git.Run(cmd,&out,CP_ACP);\r
+\r
+ }\r
+\r
+ }\r
+\r
+ m_patchViewdlg.m_ctrlPatchView.SetText(out);\r
+ m_patchViewdlg.m_ctrlPatchView.Call(SCI_SETREADONLY, TRUE);\r
+ m_patchViewdlg.m_ctrlPatchView.Call(SCI_GOTOPOS, 0);\r
+\r
+ }\r
+\r
+}\r
+LRESULT CCommitDlg::OnGitStatusListCtrlItemChanged(WPARAM wparam, LPARAM lparam)\r
+{\r
+ TRACE("OnGitStatusListCtrlItemChanged %d\r\n", wparam);\r
+ this->FillPatchView();\r
+ return 0;\r
+}\r
+\r
+\r
LRESULT CCommitDlg::OnGitStatusListCtrlCheckChanged(WPARAM, LPARAM)\r
{\r
UpdateOKButton();\r
RemoveAnchor(IDC_LISTGROUP);\r
RemoveAnchor(IDC_FILELIST);\r
RemoveAnchor(IDC_TEXT_INFO);\r
+ RemoveAnchor(IDC_VIEW_PATCH);\r
\r
CSplitterControl::ChangeHeight(&m_cLogMessage, delta, CW_TOPALIGN);\r
CSplitterControl::ChangeHeight(GetDlgItem(IDC_MESSAGEGROUP), delta, CW_TOPALIGN);\r
CSplitterControl::ChangePos(GetDlgItem(IDC_SIGNOFF),0,delta);\r
CSplitterControl::ChangePos(GetDlgItem(IDC_COMMIT_AMEND),0,delta);\r
CSplitterControl::ChangePos(GetDlgItem(IDC_TEXT_INFO),0,delta);\r
-\r
+ CSplitterControl::ChangePos(GetDlgItem(IDC_VIEW_PATCH),0,delta);\r
+ \r
+ AddAnchor(IDC_VIEW_PATCH,TOP_RIGHT);\r
AddAnchor(IDC_MESSAGEGROUP, TOP_LEFT, TOP_RIGHT);\r
AddAnchor(IDC_LOGMESSAGE, TOP_LEFT, TOP_RIGHT);\r
AddAnchor(IDC_SPLITTER, TOP_LEFT, TOP_RIGHT);\r
\r
//set range\r
SetSplitterRange();\r
+\r
}\r
\r
\r
\r
if(*pResult)\r
*pResult=0;\r
-}
\ No newline at end of file
+}\r
+void CCommitDlg::OnStnClickedViewPatch()\r
+{\r
+ // TODO: Add your control notification handler code here\r
+ \r
+ m_patchViewdlg.m_pProjectProperties = &this->m_ProjectProperties;\r
+ m_patchViewdlg.m_ParentCommitDlg = this;\r
+ if(!IsWindow(this->m_patchViewdlg.m_hWnd))\r
+ {\r
+ m_patchViewdlg.Create(IDD_PATCH_VIEW,this);\r
+ CRect rect;\r
+ this->GetWindowRect(&rect);\r
+ \r
+ m_patchViewdlg.SetWindowPos(NULL,rect.right,rect.top,rect.Width(),rect.Height(),\r
+ SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER);\r
+ \r
+ m_patchViewdlg.m_ctrlPatchView.MoveWindow(0,0,rect.Width(),rect.Height());\r
+ m_patchViewdlg.ShowWindow(SW_SHOW);\r
+ \r
+ ShowViewPatchText(false);\r
+ FillPatchView();\r
+ }\r
+ else\r
+ {\r
+ m_patchViewdlg.ShowWindow(SW_HIDE);\r
+ m_patchViewdlg.DestroyWindow();\r
+ ShowViewPatchText(true);\r
+ }\r
+ this->m_ctrlShowPatch.Invalidate();\r
+}\r
+\r
+void CCommitDlg::OnMove(int x, int y)\r
+{\r
+ __super::OnMove(x, y);\r
+\r
+ // TODO: Add your message handler code here\r
+}\r
+\r
+void CCommitDlg::OnMoving(UINT fwSide, LPRECT pRect)\r
+{\r
+ __super::OnMoving(fwSide, pRect);\r
+\r
+ // TODO: Add your message handler code here\r
+ if (::IsWindow(m_patchViewdlg.m_hWnd))\r
+ {\r
+ RECT patchrect;\r
+ m_patchViewdlg.GetWindowRect(&patchrect);\r
+ if (::IsWindow(m_hWnd))\r
+ {\r
+ RECT thisrect;\r
+ GetWindowRect(&thisrect);\r
+ if (patchrect.left == thisrect.right)\r
+ {\r
+ m_patchViewdlg.SetWindowPos(NULL, patchrect.left - (thisrect.left - pRect->left), patchrect.top - (thisrect.top - pRect->top), \r
+ 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);\r
+ }\r
+ }\r
+ }\r
+\r
+}\r
+\r
+void CCommitDlg::OnSizing(UINT fwSide, LPRECT pRect)\r
+{\r
+ __super::OnSizing(fwSide, pRect);\r
+\r
+ if(::IsWindow(this->m_patchViewdlg.m_hWnd))\r
+ {\r
+ CRect thisrect, patchrect;\r
+ this->GetWindowRect(thisrect);\r
+ this->m_patchViewdlg.GetWindowRect(patchrect);\r
+ if(thisrect.right==patchrect.left)\r
+ {\r
+ int width = patchrect.Width();\r
+ patchrect.left -= (thisrect.right - pRect->right);\r
+ patchrect.right-= (thisrect.right - pRect->right);\r
+\r
+ if( patchrect.bottom == thisrect.bottom)\r
+ {\r
+ patchrect.bottom -= (thisrect.bottom - pRect->bottom);\r
+ }\r
+ if( patchrect.top == thisrect.top)\r
+ {\r
+ patchrect.top -= thisrect.top-pRect->top;\r
+ }\r
+ m_patchViewdlg.MoveWindow(patchrect);\r
+ }\r
+ }\r
+ // TODO: Add your message handler code here\r
+}\r
+\r
+void CCommitDlg::OnHdnItemchangedFilelist(NMHDR *pNMHDR, LRESULT *pResult)\r
+{\r
+ LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);\r
+ // TODO: Add your control notification handler code here\r
+ *pResult = 0;\r
+ TRACE("Item Changed\r\n");\r
+}\r