OSDN Git Service

Add NO_SCROLL when update total size of list number.
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / LogDlg.cpp
index d3e10e4..9c29a18 100644 (file)
@@ -335,6 +335,7 @@ BOOL CLogDlg::OnInitDialog()
        //m_tFrom = (DWORD)-1;\r
 \r
        m_LogList.m_Path=m_path;\r
+       m_LogList.m_bShowWC = true;\r
        m_LogList.FetchLogAsync(this);\r
 \r
        GetDlgItem(IDC_LOGLIST)->SetFocus();\r
@@ -366,10 +367,18 @@ LRESULT CLogDlg::OnLogListLoading(WPARAM wParam, LPARAM /*lParam*/)
                DialogEnableWindow(IDC_STATBUTTON, FALSE);\r
                DialogEnableWindow(IDC_REFRESH, FALSE);\r
                DialogEnableWindow(IDC_HIDEPATHS,FALSE);\r
+               \r
 \r
        }else if( cur == GITLOG_END)\r
        {\r
                \r
+               if(this->m_LogList.HasText())\r
+               {\r
+                       this->m_LogList.ClearText();\r
+                       //UpdateLogInfoLabel();\r
+               }\r
+\r
+#if 0\r
                //if (!m_bShowedAll)\r
                DialogEnableWindow(IDC_SHOWWHOLEPROJECT, TRUE);\r
 \r
@@ -386,9 +395,8 @@ LRESULT CLogDlg::OnLogListLoading(WPARAM wParam, LPARAM /*lParam*/)
                m_LogList.GetTimeRange(begin,end);\r
                m_DateFrom.SetTime(&begin);\r
                m_DateTo.SetTime(&end);\r
-               \r
-               \r
-       \r
+#endif\r
+\r
        }else\r
        {\r
                if(this->m_LogList.HasText())\r
@@ -519,7 +527,7 @@ void CLogDlg::FillLogMessageCtrl(bool bShow /* = true*/)
                }else\r
                {\r
                        // set the log message text\r
-                       pMsgView->SetWindowText(_T("Commit:")+pLogEntry->m_CommitHash+_T("\r\n\r\n"));\r
+                       pMsgView->SetWindowText(_T("Commit:")+pLogEntry->m_CommitHash.ToString()+_T("\r\n\r\n"));\r
                        // turn bug ID's into links if the bugtraq: properties have been set\r
                        // and we can find a match of those in the log message\r
                        \r
@@ -618,13 +626,15 @@ void CLogDlg::FillLogMessageCtrl(bool bShow /* = true*/)
 \r
 void CLogDlg::OnBnClickedRefresh()\r
 {\r
-       m_limit = 0;\r
+       \r
        Refresh (true);\r
 }\r
 \r
 void CLogDlg::Refresh (bool /*autoGoOnline*/)\r
 {\r
+       m_limit = 0;\r
        m_LogList.Refresh();\r
+       FillLogMessageCtrl(false);\r
 }\r
 \r
 \r
@@ -1338,14 +1348,14 @@ void CLogDlg::DoDiffFromLog(INT_PTR selIndex, GitRev* rev1, GitRev* rev2, bool b
        file1.Format(_T("%s%s_%s%s"),\r
                                temppath,                                               \r
                                (*m_currentChangedArray)[selIndex].GetBaseFilename(),\r
-                               rev1->m_CommitHash.Left(6),\r
+                               rev1->m_CommitHash.ToString().Left(6),\r
                                (*m_currentChangedArray)[selIndex].GetFileExtension());\r
 \r
        CString file2;\r
        file2.Format(_T("%s\\%s_%s%s"),\r
                                temppath,                                               \r
                                (*m_currentChangedArray)[selIndex].GetBaseFilename(),\r
-                               rev2->m_CommitHash.Left(6),\r
+                               rev2->m_CommitHash.ToString().Left(6),\r
                                (*m_currentChangedArray)[selIndex].GetFileExtension());\r
 \r
        CString cmd;\r
@@ -1786,6 +1796,127 @@ void CLogDlg::OnEnLinkMsgview(NMHDR *pNMHDR, LRESULT *pResult)
        *pResult = 0;\r
 }\r
 \r
+class CDateSorter\r
+{\r
+public:\r
+       class CCommitPointer\r
+       {\r
+       public:\r
+               CCommitPointer():m_cont(NULL){}\r
+               CCommitPointer(const CCommitPointer& P_Right)\r
+               : m_cont(NULL)\r
+               {\r
+                       *this = P_Right;\r
+               }\r
+\r
+               CCommitPointer& operator = (const CCommitPointer& P_Right)\r
+               {\r
+                       if(IsPointer())\r
+                       {\r
+                               (*m_cont->m_parDates)[m_place]                  = P_Right.GetDate();\r
+                               (*m_cont->m_parFileChanges)[m_place]    = P_Right.GetChanges();\r
+                               (*m_cont->m_parAuthors)[m_place]                = P_Right.GetAuthor();\r
+                       }\r
+                       else \r
+                       {\r
+                               m_Date                                                          = P_Right.GetDate();\r
+                               m_Changes                                                       = P_Right.GetChanges();\r
+                               m_csAuthor                                                      = P_Right.GetAuthor();\r
+                       }\r
+                       return *this;\r
+               }\r
+\r
+               void Clone(const CCommitPointer& P_Right)\r
+               {\r
+                       m_cont = P_Right.m_cont;\r
+                       m_place = P_Right.m_place;\r
+                       m_Date = P_Right.m_Date;\r
+                       m_Changes = P_Right.m_Changes;\r
+                       m_csAuthor = P_Right.m_csAuthor;\r
+               }\r
+\r
+               DWORD            GetDate()              const {return IsPointer() ? (*m_cont->m_parDates)[m_place] : m_Date;}\r
+               DWORD            GetChanges()   const {return IsPointer() ? (*m_cont->m_parFileChanges)[m_place] : m_Changes;}\r
+               CString          GetAuthor()    const {return IsPointer() ? (*m_cont->m_parAuthors)[m_place] : m_csAuthor;}\r
+\r
+               bool            IsPointer() const {return m_cont != NULL;}\r
+               //When pointer\r
+               CDateSorter* m_cont;\r
+               int                      m_place;\r
+\r
+               //When element\r
+               DWORD            m_Date;\r
+               DWORD            m_Changes;\r
+               CString          m_csAuthor;\r
+\r
+       };\r
+       class iterator : public std::iterator<std::random_access_iterator_tag, CCommitPointer>\r
+       {\r
+       public:\r
+               CCommitPointer m_ptr;\r
+\r
+               iterator(){}\r
+               iterator(const iterator& P_Right){*this = P_Right;}\r
+               iterator& operator=(const iterator& P_Right)\r
+               {\r
+                       m_ptr.Clone(P_Right.m_ptr);\r
+                       return *this;\r
+               }\r
+\r
+               CCommitPointer& operator*(){return m_ptr;}\r
+               CCommitPointer* operator->(){return &m_ptr;}\r
+               const CCommitPointer& operator*()const{return m_ptr;}\r
+               const CCommitPointer* operator->()const{return &m_ptr;}\r
+\r
+               iterator& operator+=(size_t P_iOffset){m_ptr.m_place += P_iOffset;return *this;}\r
+               iterator& operator-=(size_t P_iOffset){m_ptr.m_place -= P_iOffset;return *this;}\r
+               iterator operator+(size_t P_iOffset)const{iterator it(*this); it += P_iOffset;return it;}\r
+               iterator operator-(size_t P_iOffset)const{iterator it(*this); it -= P_iOffset;return it;}\r
+\r
+               iterator& operator++(){++m_ptr.m_place;return *this;}\r
+               iterator& operator--(){--m_ptr.m_place;return *this;}\r
+               iterator operator++(int){iterator it(*this);++*this;return it;}\r
+               iterator operator--(int){iterator it(*this);--*this;return it;}\r
+\r
+               size_t operator-(const iterator& P_itRight)const{return m_ptr.m_place - P_itRight->m_place;}\r
+\r
+               bool operator<(const iterator& P_itRight)const{return m_ptr.m_place < P_itRight->m_place;}\r
+               bool operator!=(const iterator& P_itRight)const{return m_ptr.m_place != P_itRight->m_place;}\r
+               bool operator==(const iterator& P_itRight)const{return m_ptr.m_place == P_itRight->m_place;}\r
+               bool operator>(const iterator& P_itRight)const{return m_ptr.m_place > P_itRight->m_place;}\r
+       };\r
+       iterator begin()\r
+       {\r
+               iterator it;\r
+               it->m_place = 0;\r
+               it->m_cont = this;\r
+               return it;\r
+       }\r
+       iterator end()\r
+       {\r
+               iterator it;\r
+               it->m_place = m_parDates->GetCount();\r
+               it->m_cont = this;\r
+               return it;\r
+       }\r
+\r
+       CDWordArray     *       m_parDates;\r
+       CDWordArray     *       m_parFileChanges;\r
+       CStringArray *  m_parAuthors;\r
+};\r
+\r
+class CDateSorterLess\r
+{\r
+public:\r
+       bool operator () (const CDateSorter::CCommitPointer& P_Left, const CDateSorter::CCommitPointer& P_Right) const\r
+       {\r
+               return P_Left.GetDate() > P_Right.GetDate(); //Last date first\r
+       }\r
+\r
+};\r
+\r
+\r
+\r
 void CLogDlg::OnBnClickedStatbutton()\r
 {\r
 \r
@@ -1813,6 +1944,13 @@ void CLogDlg::OnBnClickedStatbutton()
                m_arDatesFiltered.Add(pLogEntry->m_AuthorDate.GetTime());\r
                m_arFileChangesFiltered.Add(pLogEntry->m_Files.GetCount());\r
        }\r
+\r
+       CDateSorter W_Sorter;\r
+       W_Sorter.m_parAuthors           = &m_arAuthorsFiltered;\r
+       W_Sorter.m_parDates                     = &m_arDatesFiltered;\r
+       W_Sorter.m_parFileChanges       = &m_arFileChangesFiltered;\r
+       std::sort(W_Sorter.begin(), W_Sorter.end(), CDateSorterLess());\r
+\r
        CStatGraphDlg dlg;\r
        dlg.m_parAuthors = &m_arAuthorsFiltered;\r
        dlg.m_parDates = &m_arDatesFiltered;\r
@@ -2241,6 +2379,7 @@ void CLogDlg::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult)
 {\r
        if (this->IsThreadRunning())\r
                return;         //no sorting while the arrays are filled\r
+#if 0\r
        LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);\r
        const int nColumn = pNMLV->iSubItem;\r
        m_bAscending = nColumn == m_nSortColumn ? !m_bAscending : TRUE;\r
@@ -2250,7 +2389,7 @@ void CLogDlg::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult)
        SortShownListArray();\r
        m_LogList.Invalidate();\r
        UpdateLogInfoLabel();\r
-       \r
+#endif\r
        *pResult = 0;\r
 }\r
 \r