OSDN Git Service

Diff Dialog Okay
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / FileDiffDlg.cpp
index fee87b5..25cba21 100644 (file)
@@ -32,6 +32,9 @@
 #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
@@ -50,6 +53,7 @@ CFileDiffDlg::CFileDiffDlg(CWnd* pParent /*=NULL*/)
        m_pProgDlg(NULL),\r
        m_bCancelled(false)\r
 {\r
+       m_bLoadingRef=FALSE;\r
 }\r
 \r
 CFileDiffDlg::~CFileDiffDlg()\r
@@ -65,6 +69,8 @@ void CFileDiffDlg::DoDataExchange(CDataExchange* pDX)
        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
@@ -83,6 +89,8 @@ BEGIN_MESSAGE_MAP(CFileDiffDlg, CResizableStandAloneDialog)
        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
@@ -109,7 +117,7 @@ void CFileDiffDlg::SetDiff(CTGitPath * path, CString &hash1, CString &hash2)
 \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
@@ -121,7 +129,7 @@ void CFileDiffDlg::SetDiff(CTGitPath * path, CString &hash1, CString &hash2)
 \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
@@ -137,7 +145,7 @@ void CFileDiffDlg::SetDiff(CTGitPath * path, GitRev rev1)
                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
@@ -150,6 +158,9 @@ BOOL CFileDiffDlg::OnInitDialog()
        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
@@ -199,16 +210,40 @@ BOOL CFileDiffDlg::OnInitDialog()
        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
@@ -216,11 +251,29 @@ BOOL CFileDiffDlg::OnInitDialog()
                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
@@ -249,7 +302,9 @@ UINT CFileDiffDlg::DiffThread()
        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
@@ -267,7 +322,7 @@ UINT CFileDiffDlg::DiffThread()
 //     }\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
@@ -294,6 +349,7 @@ UINT CFileDiffDlg::DiffThread()
        InterlockedExchange(&m_bThreadRunning, FALSE);\r
        InvalidateRect(NULL);\r
        RefreshCursor();\r
+       EnableInputControl(true);\r
        return 0;\r
 }\r
 \r
@@ -320,12 +376,22 @@ int CFileDiffDlg::AddEntry(const CTGitPath * fd)
        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
@@ -612,6 +678,16 @@ void CFileDiffDlg::OnNMCustomdrawFilelist(NMHDR *pNMHDR, LRESULT *pResult)
        }\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
@@ -876,26 +952,56 @@ void CFileDiffDlg::OnBnClickedSwitchleftright()
        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
@@ -1024,33 +1130,76 @@ bool CFileDiffDlg::SortCompare(const CTGitPath*& Data1, const CTGitPath*& Data2)
 \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
@@ -1106,18 +1255,58 @@ void CFileDiffDlg::OnTimer(UINT_PTR nIDEvent)
        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
@@ -1159,3 +1348,64 @@ void CFileDiffDlg::CopySelectionToClipboard()
        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