OSDN Git Service

First pass at relative times in log. This version shows both local and relative time...
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / GitLogListBase.cpp
index d9c7ed6..9c9d86d 100644 (file)
@@ -86,7 +86,7 @@ CGitLogListBase::CGitLogListBase():CHintListCtrl()
 \r
        m_From=CTime(1970,1,2,0,0,0);\r
        m_To=CTime::GetCurrentTime();\r
-    m_bAllBranch = FALSE;\r
+    m_ShowMask = 0;\r
        m_LoadingThread = NULL;\r
 \r
        m_bExitThread=FALSE;\r
@@ -143,6 +143,7 @@ BEGIN_MESSAGE_MAP(CGitLogListBase, CHintListCtrl)
        ON_NOTIFY_REFLECT(LVN_ODFINDITEM,OnLvnOdfinditemLoglist)\r
        ON_WM_CREATE()\r
        ON_WM_DESTROY()\r
+       ON_MESSAGE(MSG_LOADED,OnLoad)\r
 END_MESSAGE_MAP()\r
 \r
 int CGitLogListBase:: OnCreate(LPCREATESTRUCT lpCreateStruct)\r
@@ -849,7 +850,7 @@ void CGitLogListBase::OnLvnGetdispinfoLoglist(NMHDR *pNMHDR, LRESULT *pResult)
        case this->LOGLIST_DATE: //Date\r
                if (pLogEntry)\r
                        lstrcpyn(pItem->pszText,\r
-                               CAppUtils::FormatDateAndTime( pLogEntry->m_AuthorDate, m_DateFormat ), \r
+                               CAppUtils::FormatDateAndTime( pLogEntry->m_AuthorDate, m_DateFormat, true, true ), \r
                                pItem->cchTextMax);\r
                break;\r
                \r
@@ -1325,14 +1326,17 @@ int CGitLogListBase::FillGitShortLog()
        CString hash;\r
        int mask;\r
        mask = CGit::LOG_INFO_ONLY_HASH | CGit::LOG_INFO_BOUNDARY;\r
-       if(this->m_bAllBranch)\r
-               mask |= CGit::LOG_INFO_ALL_BRANCH;\r
+//     if(this->m_bAllBranch)\r
+       mask |= m_ShowMask;\r
 \r
        this->m_logEntries.ParserShortLog(path,hash,-1,mask);\r
        \r
 \r
        //this->m_logEntries.ParserFromLog();\r
-       SetItemCountEx(this->m_logEntries.size());\r
+       if(IsInWorkingThread())\r
+               PostMessage(LVM_SETITEMCOUNT, (WPARAM) this->m_logEntries.size(),(LPARAM) LVSICF_NOINVALIDATEALL);\r
+       else\r
+               SetItemCountEx(this->m_logEntries.size());\r
 \r
        this->m_arShownList.RemoveAll();\r
 \r
@@ -1387,9 +1391,8 @@ void CGitLogListBase::OnNMDblclkLoglist(NMHDR * /*pNMHDR*/, LRESULT *pResult)
          DiffSelectedRevWithPrevious();\r
 }\r
 \r
-int CGitLogListBase::FetchLogAsync(CALLBACK_PROCESS *proc,void * data)\r
+int CGitLogListBase::FetchLogAsync(void * data)\r
 {\r
-       m_ProcCallBack=proc;\r
        m_ProcData=data;\r
        m_bExitThread=FALSE;\r
        InterlockedExchange(&m_bThreadRunning, TRUE);\r
@@ -1430,8 +1433,9 @@ void CGitLogListBase::GetTimeRange(CTime &oldest, CTime &latest)
 UINT CGitLogListBase::LogThread()\r
 {\r
 \r
-       if(m_ProcCallBack)\r
-               m_ProcCallBack(m_ProcData,GITLOG_START);\r
+//     if(m_ProcCallBack)\r
+//             m_ProcCallBack(m_ProcData,GITLOG_START);\r
+       ::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) GITLOG_START,0);\r
 \r
        InterlockedExchange(&m_bThreadRunning, TRUE);\r
        InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
@@ -1443,15 +1447,11 @@ UINT CGitLogListBase::LogThread()
        //disable the "Get All" button while we're receiving\r
        //log messages.\r
 \r
-       CString temp;\r
-       temp.LoadString(IDS_PROGRESSWAIT);\r
-       ShowText(temp, true);\r
-\r
        FillGitShortLog();\r
        \r
        if(this->m_bExitThread)\r
                return 0;\r
-\r
+#if 0\r
        RedrawItems(0, m_arShownList.GetCount());\r
 //     SetRedraw(false);\r
 //     ResizeAllListCtrlCols();\r
@@ -1474,9 +1474,9 @@ UINT CGitLogListBase::LogThread()
                        SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);\r
                }\r
        }\r
+#endif\r
        InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
 \r
-       int index=0;\r
        unsigned int updated=0;\r
        int percent=0;\r
        CRect rect;\r
@@ -1489,8 +1489,6 @@ UINT CGitLogListBase::LogThread()
                                if(!m_logEntries.FetchFullInfo(i))\r
                                {\r
                                        updated++;\r
-                                       this->GetItemRect(i,&rect,LVIR_BOUNDS);\r
-                                       this->InvalidateRect(rect);\r
                                }\r
                                m_LogCache.AddCacheEntry(m_logEntries[i]);\r
 \r
@@ -1499,11 +1497,10 @@ UINT CGitLogListBase::LogThread()
                                updated++;\r
                                InterlockedExchange(&m_logEntries[i].m_IsUpdateing,FALSE);\r
                                InterlockedExchange(&m_logEntries[i].m_IsFull,TRUE);\r
-\r
-                               this->GetItemRect(i,&rect,LVIR_BOUNDS);\r
-                               this->InvalidateRect(rect);\r
                        }\r
                        \r
+                       ::PostMessage(m_hWnd,MSG_LOADED,(WPARAM)i,0);\r
+\r
                        if(m_bExitThread)\r
                                return 0;\r
 \r
@@ -1511,8 +1508,7 @@ UINT CGitLogListBase::LogThread()
                        if(percent == GITLOG_END)\r
                                percent = GITLOG_END -1;\r
                        \r
-                       if(m_ProcCallBack)\r
-                               m_ProcCallBack(m_ProcData,percent);\r
+                       ::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) percent,0);\r
 \r
                        \r
                }\r
@@ -1524,10 +1520,7 @@ UINT CGitLogListBase::LogThread()
        // make sure the filter is applied (if any) now, after we refreshed/fetched\r
        // the log messages\r
 \r
-       \r
-\r
-       if(m_ProcCallBack)\r
-               m_ProcCallBack(m_ProcData,GITLOG_END);\r
+       ::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) GITLOG_END,0);\r
 \r
        InterlockedExchange(&m_bThreadRunning, FALSE);\r
 \r
@@ -1830,15 +1823,32 @@ void CGitLogListBase::OnDestroy()
 {\r
        // save the column widths to the registry\r
        SaveColumnWidths();\r
+\r
+       if(this->m_bThreadRunning)\r
+       {\r
+               this->m_bExitThread=true;\r
+               DWORD ret =::WaitForSingleObject(m_LoadingThread->m_hThread,20000);\r
+               if(ret == WAIT_TIMEOUT)\r
+                       TerminateThread();\r
+       }\r
        while(m_LogCache.SaveCache())\r
        {\r
-               if(CMessageBox::Show(NULL,_T("Cannot Save Log Cache to Disk,click yes for retry, click no for give up"),_T("TortoiseGit"),\r
+               if(CMessageBox::Show(NULL,_T("Cannot Save Log Cache to Disk. To retry click yes. To give up click no."),_T("TortoiseGit"),\r
                                                        MB_YESNO) == IDNO)\r
                                                        break;\r
        }\r
        CHintListCtrl::OnDestroy();\r
 }\r
 \r
+LRESULT CGitLogListBase::OnLoad(WPARAM wParam,LPARAM lParam)\r
+{\r
+       CRect rect;\r
+       int i=(int)wParam;\r
+       this->GetItemRect(i,&rect,LVIR_BOUNDS);\r
+       this->InvalidateRect(rect);\r
+       return 0;\r
+}\r
+\r
 /**\r
  * Save column widths to the registry\r
  */\r
@@ -1857,4 +1867,4 @@ void CGitLogListBase::SaveColumnWidths()
                        regwidth = width;       // this writes it to reg\r
                }\r
        }\r
-}
\ No newline at end of file
+}\r