#include ".\filediffdlg.h"\r
#include "gitdiff.h"\r
#include "CommonResource.h"\r
+#include "BrowseRefsDlg.h"\r
+#include "LogDlg.h"\r
+#include "RefLogDlg.h"\r
\r
#define ID_COMPARE 1\r
#define ID_BLAME 2\r
m_pProgDlg(NULL),\r
m_bCancelled(false)\r
{\r
+ m_bLoadingRef=FALSE;\r
}\r
\r
CFileDiffDlg::~CFileDiffDlg()\r
DDX_Control(pDX, IDC_REV1BTN, m_cRev1Btn);\r
DDX_Control(pDX, IDC_REV2BTN, m_cRev2Btn);\r
DDX_Control(pDX, IDC_FILTER, m_cFilter);\r
+ DDX_Control(pDX, IDC_REV1EDIT, m_ctrRev1Edit);\r
+ DDX_Control(pDX, IDC_REV2EDIT, m_ctrRev2Edit);\r
}\r
\r
\r
ON_MESSAGE(WM_FILTEREDIT_CANCELCLICKED, OnClickedCancelFilter)\r
ON_EN_CHANGE(IDC_FILTER, &CFileDiffDlg::OnEnChangeFilter)\r
ON_WM_TIMER()\r
+ ON_MESSAGE(ENAC_UPDATE, &CFileDiffDlg::OnEnUpdate)\r
+ ON_MESSAGE(MSG_REF_LOADED, OnRefLoad)\r
END_MESSAGE_MAP()\r
\r
\r
\r
if(hash1 == GIT_REV_ZERO)\r
{\r
- m_rev1.m_CommitHash=GIT_REV_ZERO;\r
+ m_rev1.m_CommitHash.Empty();\r
m_rev1.m_Subject=_T("Working Copy");\r
}else\r
{\r
\r
if(hash2 == GIT_REV_ZERO)\r
{\r
- m_rev2.m_CommitHash = GIT_REV_ZERO;\r
+ m_rev2.m_CommitHash.Empty();\r
m_rev2.m_Subject=_T("Working Copy");\r
}else\r
{\r
m_path2 = *path;\r
}\r
m_rev1 = rev1;\r
- m_rev2.m_CommitHash = _T("");\r
+ m_rev2.m_CommitHash.Empty();\r
m_rev2.m_Subject = _T("Previou Version");\r
\r
//this->GetDlgItem()->EnableWindow(FALSE);\r
CResizableStandAloneDialog::OnInitDialog();\r
CString temp;\r
\r
+ this->m_ctrRev1Edit.Init();\r
+ this->m_ctrRev2Edit.Init();\r
+\r
m_tooltips.Create(this);\r
m_tooltips.AddTool(IDC_SWITCHLEFTRIGHT, IDS_FILEDIFF_SWITCHLEFTRIGHT_TT);\r
\r
AddAnchor(IDC_SWITCHLEFTRIGHT, TOP_RIGHT);\r
AddAnchor(IDC_FIRSTURL, TOP_LEFT, TOP_RIGHT);\r
AddAnchor(IDC_REV1BTN, TOP_RIGHT);\r
- AddAnchor(IDC_DIFFSTATIC2, TOP_LEFT, TOP_RIGHT);\r
+ //AddAnchor(IDC_DIFFSTATIC2, TOP_LEFT, TOP_RIGHT);\r
AddAnchor(IDC_SECONDURL, TOP_LEFT, TOP_RIGHT);\r
AddAnchor(IDC_REV2BTN, TOP_RIGHT);\r
AddAnchor(IDC_FILTER, TOP_LEFT, TOP_RIGHT);\r
AddAnchor(IDC_FILELIST, TOP_LEFT, BOTTOM_RIGHT);\r
+ AddAnchor(IDC_REV1GROUP,TOP_LEFT,TOP_RIGHT);\r
+ AddAnchor(IDC_REV2GROUP,TOP_LEFT,TOP_RIGHT);\r
+ AddAnchor(IDC_REV1EDIT,TOP_LEFT);\r
+ AddAnchor(IDC_REV2EDIT,TOP_LEFT);\r
\r
- SetURLLabels();\r
-\r
EnableSaveRestore(_T("FileDiffDlg"));\r
\r
+ if(this->m_strRev1.IsEmpty())\r
+ this->m_ctrRev1Edit.SetWindowText(this->m_rev1.m_CommitHash.ToString());\r
+ else\r
+ {\r
+ if(m_rev1.GetCommit(this->m_strRev1))\r
+ this->m_FileListText+=this->m_strRev1 + _T(" is wrong");\r
+\r
+ this->m_ctrRev1Edit.SetWindowText(m_strRev1);\r
+ }\r
+\r
+ if(this->m_strRev2.IsEmpty())\r
+ this->m_ctrRev2Edit.SetWindowText(this->m_rev2.m_CommitHash.ToString());\r
+ else\r
+ {\r
+ if(m_rev2.GetCommit(this->m_strRev2))\r
+ this->m_FileListText+=this->m_strRev2 + _T(" is wrong");\r
+\r
+ this->m_ctrRev2Edit.SetWindowText(m_strRev2);\r
+ }\r
+\r
+ SetURLLabels();\r
+\r
InterlockedExchange(&m_bThreadRunning, TRUE);\r
if (AfxBeginThread(DiffThreadEntry, this)==NULL)\r
{\r
CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
}\r
\r
+ InterlockedExchange(&m_bLoadingRef, TRUE);\r
+ if (AfxBeginThread(LoadRefThreadEntry, this)==NULL)\r
+ {\r
+ InterlockedExchange(&m_bLoadingRef, FALSE);\r
+ CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
+ }\r
+\r
+\r
+ this->m_cRev1Btn.AddEntry(_T("RefBrowse"));\r
+ this->m_cRev1Btn.AddEntry(_T("Log"));\r
+ this->m_cRev1Btn.AddEntry(_T("RefLog"));\r
+\r
+ this->m_cRev2Btn.AddEntry(_T("RefBrowse"));\r
+ this->m_cRev2Btn.AddEntry(_T("Log"));\r
+ this->m_cRev2Btn.AddEntry(_T("RefLog"));\r
+\r
// Start with focus on file list\r
GetDlgItem(IDC_FILELIST)->SetFocus();\r
\r
if(m_rev2.m_CommitHash.IsEmpty())\r
m_SwitchButton.EnableWindow(FALSE);\r
+\r
+ KillTimer(IDT_INPUT);\r
return FALSE;\r
}\r
\r
bool bSuccess = true;\r
RefreshCursor();\r
m_cFileList.ShowText(CString(MAKEINTRESOURCE(IDS_FILEDIFF_WAIT)));\r
+ m_cFileList.DeleteAllItems();\r
m_arFileList.Clear();\r
+ EnableInputControl(false);\r
#if 0\r
if (m_bDoPegDiff)\r
{\r
// }\r
#endif\r
\r
- g_Git.GetCommitDiffList(m_rev1.m_CommitHash,m_rev2.m_CommitHash,m_arFileList);\r
+ g_Git.GetCommitDiffList(m_rev1.m_CommitHash.ToString(),m_rev2.m_CommitHash.ToString(),m_arFileList);\r
\r
CString sFilterText;\r
m_cFilter.GetWindowText(sFilterText);\r
InterlockedExchange(&m_bThreadRunning, FALSE);\r
InvalidateRect(NULL);\r
RefreshCursor();\r
+ EnableInputControl(true);\r
return 0;\r
}\r
\r
return ret;\r
}\r
\r
+void CFileDiffDlg::EnableInputControl(bool b)\r
+{\r
+ this->m_ctrRev1Edit.EnableWindow(b);\r
+ this->m_ctrRev2Edit.EnableWindow(b);\r
+ this->m_cRev1Btn.EnableWindow(b);\r
+ this->m_cRev2Btn.EnableWindow(b);\r
+ m_cFilter.EnableWindow(b);\r
+ m_SwitchButton.EnableWindow(b);\r
+}\r
+\r
void CFileDiffDlg::DoDiff(int selIndex, bool blame)\r
{\r
\r
CGitDiff diff;\r
CTGitPath* fd = m_arFilteredList[selIndex];\r
- diff.Diff(fd, fd,this->m_rev1.m_CommitHash, this->m_rev2.m_CommitHash, blame, FALSE);\r
+ diff.Diff(fd, fd,this->m_rev1.m_CommitHash.ToString(), this->m_rev2.m_CommitHash.ToString(), blame, FALSE);\r
\r
#if 0\r
CFileDiffDlg::CTGitPath* fd = m_arFilteredList[selIndex];\r
}\r
}\r
\r
+UINT CFileDiffDlg::LoadRefThread()\r
+{\r
+ g_Git.GetBranchList(m_Reflist,NULL,CGit::BRANCH_ALL);\r
+ g_Git.GetTagList(m_Reflist);\r
+\r
+ this->PostMessage(MSG_REF_LOADED);\r
+ InterlockedExchange(&m_bLoadingRef, FALSE);\r
+ return 0;\r
+}\r
+\r
void CFileDiffDlg::OnContextMenu(CWnd* pWnd, CPoint point)\r
{\r
if ((pWnd==0)||(pWnd != &m_cFileList))\r
GitRev rev = m_rev1;\r
m_rev1 = m_rev2;\r
m_rev2 = rev;\r
+\r
+ CString str1,str2;\r
+ this->m_ctrRev1Edit.GetWindowText(str1);\r
+ this->m_ctrRev2Edit.GetWindowText(str2);\r
+\r
+ this->m_ctrRev1Edit.SetWindowText(str2);\r
+ this->m_ctrRev2Edit.SetWindowText(str1);\r
+\r
SetURLLabels();\r
\r
}\r
\r
-void CFileDiffDlg::SetURLLabels()\r
+void CFileDiffDlg::SetURLLabels(int mask)\r
{\r
\r
- m_cRev1Btn.SetWindowText(m_rev1.m_CommitHash.Left(6));\r
- m_cRev2Btn.SetWindowText(m_rev2.m_CommitHash.Left(6));\r
+// m_cRev1Btn.SetWindowText(m_rev1.m_CommitHash.ToString().Left(6));\r
+// m_cRev2Btn.SetWindowText(m_rev2.m_CommitHash.ToString().Left(6));\r
+\r
+ if(mask &0x1)\r
+ {\r
+ SetDlgItemText(IDC_FIRSTURL, m_rev1.m_CommitHash.ToString().Left(8)+_T(": ")+m_rev1.m_Subject);\r
+ m_tooltips.AddTool(IDC_FIRSTURL, \r
+ CAppUtils::FormatDateAndTime( m_rev1.m_AuthorDate, DATE_SHORTDATE, false )+_T(" ")+m_rev1.m_AuthorName);\r
+ \r
+ }\r
\r
- SetDlgItemText(IDC_FIRSTURL, m_rev1.m_Subject+CString(_T("\r\n"))+m_rev1.m_CommitHash);\r
- SetDlgItemText(IDC_SECONDURL,m_rev2.m_Subject+CString(_T("\r\n"))+m_rev2.m_CommitHash);\r
+ if(mask &0x2)\r
+ {\r
+ SetDlgItemText(IDC_SECONDURL,m_rev2.m_CommitHash.ToString().Left(8)+_T(": ")+m_rev2.m_Subject);\r
\r
- m_tooltips.AddTool(IDC_FIRSTURL, \r
- CAppUtils::FormatDateAndTime( m_rev1.m_AuthorDate, DATE_SHORTDATE, false )+_T(" ")+m_rev1.m_AuthorName);\r
- m_tooltips.AddTool(IDC_SECONDURL, \r
- CAppUtils::FormatDateAndTime( m_rev2.m_AuthorDate, DATE_SHORTDATE, false )+_T(" ")+m_rev2.m_AuthorName);\r
+ m_tooltips.AddTool(IDC_SECONDURL, \r
+ CAppUtils::FormatDateAndTime( m_rev2.m_AuthorDate, DATE_SHORTDATE, false )+_T(" ")+m_rev2.m_AuthorName);\r
+ }\r
\r
}\r
\r
+void CFileDiffDlg::ClearURLabels(int mask)\r
+{\r
+ if(mask&0x1)\r
+ {\r
+ SetDlgItemText(IDC_FIRSTURL, _T(""));\r
+ m_tooltips.AddTool(IDC_FIRSTURL, _T(""));\r
+ }\r
+\r
+ if(mask&0x2)\r
+ {\r
+ SetDlgItemText(IDC_SECONDURL, _T(""));\r
+ m_tooltips.AddTool(IDC_SECONDURL, _T(""));\r
+ }\r
+}\r
BOOL CFileDiffDlg::PreTranslateMessage(MSG* pMsg)\r
{\r
m_tooltips.RelayEvent(pMsg);\r
\r
void CFileDiffDlg::OnBnClickedRev1btn()\r
{\r
-#if 0\r
- if (m_bThreadRunning)\r
- return; // do nothing as long as the thread is still running\r
+ \r
+ ClickRevButton(&this->m_cRev1Btn,&this->m_rev1, &this->m_ctrRev1Edit);\r
+ \r
\r
- // show a dialog where the user can enter a revision\r
- CRevisionDlg dlg(this);\r
- dlg.AllowWCRevs(false);\r
- *((GitRev*)&dlg) = m_rev1;\r
+}\r
\r
- if (dlg.DoModal() == IDOK)\r
+void CFileDiffDlg::ClickRevButton(CMenuButton *button, GitRev *rev, CACEdit *edit)\r
+{\r
+ int entry=button->GetCurrentEntry();\r
+ if(entry == 0) /* Browse Refence*/\r
{\r
- m_rev1 = dlg;\r
- m_cRev1Btn.SetWindowText(m_rev1.ToString());\r
- m_cFileList.DeleteAllItems();\r
- // start a new thread to re-fetch the diff\r
- InterlockedExchange(&m_bThreadRunning, TRUE);\r
- if (AfxBeginThread(DiffThreadEntry, this)==NULL)\r
{\r
- InterlockedExchange(&m_bThreadRunning, FALSE);\r
- CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
+ CString str = CBrowseRefsDlg::PickRef();\r
+ if(str.IsEmpty())\r
+ return;\r
+ \r
+ if(FillRevFromString(rev,str))\r
+ return;\r
+\r
+ edit->SetWindowText(str);\r
}\r
}\r
-#endif\r
+\r
+ if(entry == 1) /*Log*/\r
+ {\r
+ CLogDlg dlg;\r
+ dlg.SetSelect(true);\r
+ if(dlg.DoModal() == IDOK)\r
+ {\r
+ if( dlg.GetSelectedHash().IsEmpty() )\r
+ return;\r
+\r
+ if(FillRevFromString(rev,dlg.GetSelectedHash()))\r
+ return;\r
+\r
+ edit->SetWindowText(dlg.GetSelectedHash());\r
+\r
+ }else\r
+ return;\r
+ }\r
+\r
+ if(entry == 2) /*RefLog*/\r
+ {\r
+ CRefLogDlg dlg;\r
+ if(dlg.DoModal() == IDOK)\r
+ {\r
+ if(FillRevFromString(rev,dlg.m_SelectedHash))\r
+ return;\r
+\r
+ edit->SetWindowText(dlg.m_SelectedHash);\r
+\r
+ }else\r
+ return;\r
+ \r
+ }\r
+\r
+ SetURLLabels();\r
+\r
+ InterlockedExchange(&m_bThreadRunning, TRUE);\r
+ if (AfxBeginThread(DiffThreadEntry, this)==NULL)\r
+ {\r
+ InterlockedExchange(&m_bThreadRunning, FALSE);\r
+ CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
+ }\r
+ KillTimer(IDT_INPUT);\r
}\r
\r
void CFileDiffDlg::OnBnClickedRev2btn()\r
{\r
+ ClickRevButton(&this->m_cRev2Btn,&this->m_rev2, &this->m_ctrRev2Edit);\r
#if 0\r
if (m_bThreadRunning)\r
return; // do nothing as long as the thread is still running\r
if (m_bThreadRunning)\r
return;\r
\r
- CString sFilterText;\r
- KillTimer(IDT_FILTER);\r
- m_cFilter.GetWindowText(sFilterText);\r
+ if( nIDEvent == IDT_FILTER)\r
+ {\r
\r
- m_cFileList.SetRedraw(FALSE);\r
- m_cFileList.DeleteAllItems();\r
+ CString sFilterText;\r
+ KillTimer(IDT_FILTER);\r
+ m_cFilter.GetWindowText(sFilterText);\r
\r
- Filter(sFilterText);\r
+ m_cFileList.SetRedraw(FALSE);\r
+ m_cFileList.DeleteAllItems();\r
\r
- m_cFileList.SetRedraw(TRUE);\r
+ Filter(sFilterText);\r
+\r
+ m_cFileList.SetRedraw(TRUE);\r
+\r
+ __super::OnTimer(nIDEvent);\r
+ }\r
+\r
+ if( nIDEvent == IDT_INPUT)\r
+ {\r
+ KillTimer(IDT_INPUT);\r
+ TRACE(_T("Input Timer\r\n"));\r
+\r
+ GitRev gitrev;\r
+ CString str;\r
+ int mask = 0;\r
+ this->m_ctrRev1Edit.GetWindowText(str);\r
+ if( !gitrev.GetCommit(str) )\r
+ {\r
+ this->m_rev1=gitrev;\r
+ mask |= 0x1;\r
+ this->SetURLLabels(0x1);\r
+ }\r
+\r
+ this->m_ctrRev2Edit.GetWindowText(str);\r
\r
- __super::OnTimer(nIDEvent);\r
+ if( !gitrev.GetCommit(str) )\r
+ {\r
+ this->m_rev2=gitrev;\r
+ mask |= 0x2;\r
+ this->SetURLLabels(0x2);\r
+ }\r
+ \r
+ if(mask == 0x3)\r
+ {\r
+ InterlockedExchange(&m_bThreadRunning, TRUE);\r
+ if (AfxBeginThread(DiffThreadEntry, this)==NULL)\r
+ {\r
+ InterlockedExchange(&m_bThreadRunning, FALSE);\r
+ CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
+ }\r
+ }\r
+ }\r
}\r
\r
void CFileDiffDlg::Filter(CString sFilterText)\r
CStringUtils::WriteAsciiStringToClipboard(sTextForClipboard);\r
}\r
\r
+\r
+void CFileDiffDlg::OnEnChangeRev1edit()\r
+{\r
+ // TODO: If this is a RICHEDIT control, the control will not\r
+ // send this notification unless you override the CResizableStandAloneDialog::OnInitDialog()\r
+ // function and call CRichEditCtrl().SetEventMask()\r
+ // with the ENM_CHANGE flag ORed into the mask.\r
+\r
+ // TODO: Add your control notification handler code here\r
+}\r
+\r
+void CFileDiffDlg::OnEnChangeRev2edit()\r
+{\r
+ // TODO: If this is a RICHEDIT control, the control will not\r
+ // send this notification unless you override the CResizableStandAloneDialog::OnInitDialog()\r
+ // function and call CRichEditCtrl().SetEventMask()\r
+ // with the ENM_CHANGE flag ORed into the mask.\r
+\r
+ // TODO: Add your control notification handler code here\r
+}\r
+\r
+LRESULT CFileDiffDlg::OnRefLoad(WPARAM wParam, LPARAM lParam)\r
+{\r
+ for(int i=0;i<m_Reflist.size();i++)\r
+ {\r
+ CString str=m_Reflist[i];\r
+ \r
+ if(str.Find(_T("remotes/")) == 0)\r
+ str=str.Mid(8);\r
+\r
+ m_ctrRev1Edit.AddSearchString(str);\r
+ m_ctrRev2Edit.AddSearchString(str);\r
+ }\r
+ return 0;\r
+}\r
+\r
+BOOL CFileDiffDlg::DestroyWindow()\r
+{\r
+ return CResizableStandAloneDialog::DestroyWindow();\r
+}\r
+\r
+LRESULT CFileDiffDlg::OnEnUpdate(WPARAM wParam, LPARAM lParam)\r
+{\r
+ if(lParam == IDC_REV1EDIT)\r
+ {\r
+ OnTextUpdate(&this->m_ctrRev1Edit);\r
+ ClearURLabels(1);\r
+ }\r
+ if(lParam == IDC_REV2EDIT)\r
+ {\r
+ OnTextUpdate(&this->m_ctrRev2Edit);\r
+ ClearURLabels(1<<1);\r
+ }\r
+ return 0;\r
+}\r
+\r
+void CFileDiffDlg::OnTextUpdate(CACEdit *pEdit)\r
+{\r
+ SetTimer(IDT_INPUT, 1000, NULL);\r
+ this->m_cFileList.ShowText(_T("Wait For input validate version"));\r
+}
\ No newline at end of file