OSDN Git Service

Reflog dialog basic work
authorFrank Li <lznuaa@gmail.com>
Tue, 17 Mar 2009 09:14:45 +0000 (17:14 +0800)
committerFrank Li <lznuaa@gmail.com>
Tue, 17 Mar 2009 09:14:45 +0000 (17:14 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
src/Resources/TortoiseProcENG.rc
src/TortoiseProc/GitLogListBase.cpp
src/TortoiseProc/GitLogListBase.h
src/TortoiseProc/LogDataVector.cpp
src/TortoiseProc/RefLogDlg.cpp
src/TortoiseProc/refloglist.cpp
src/TortoiseProc/refloglist.h

index 4e340f4..568bd96 100644 (file)
Binary files a/src/Resources/TortoiseProcENG.rc and b/src/Resources/TortoiseProcENG.rc differ
index 2bcb049..e61f6a2 100644 (file)
@@ -118,6 +118,8 @@ CGitLogListBase::CGitLogListBase():CHintListCtrl()
        m_ContextMenuMask &= ~GetContextMenuBit(ID_REBASE_SQUASH);\r
        m_ContextMenuMask &= ~GetContextMenuBit(ID_REBASE_EDIT);\r
        m_ContextMenuMask &= ~GetContextMenuBit(ID_REBASE_SKIP);\r
+\r
+       m_ColumnRegKey=_T("log");\r
 }\r
 \r
 CGitLogListBase::~CGitLogListBase()\r
@@ -254,7 +256,7 @@ void CGitLogListBase::ResizeAllListCtrlCols()
                {\r
                        // get width for this col last time from registry\r
                        CString regentry;\r
-                       regentry.Format( _T("Software\\TortoiseGit\\log\\ColWidth%d"), col);\r
+                       regentry.Format( _T("Software\\TortoiseGit\\%s\\ColWidth%d"),m_ColumnRegKey, col);\r
                        CRegDWORD regwidth(regentry, 0);\r
                        int cx = regwidth;\r
                        if ( cx == 0 )\r
@@ -2166,7 +2168,7 @@ void CGitLogListBase::SaveColumnWidths()
                {\r
                        int width = GetColumnWidth( col );\r
                        CString regentry;\r
-                       regentry.Format( _T("Software\\TortoiseGit\\log\\ColWidth%d"), col);\r
+                       regentry.Format( _T("Software\\TortoiseGit\\%s\\ColWidth%d"),m_ColumnRegKey, col);\r
                        CRegDWORD regwidth(regentry, 0);\r
                        regwidth = width;       // this writes it to reg\r
                }\r
index 0cdeb77..949ea2a 100644 (file)
@@ -194,8 +194,8 @@ public:
 protected:\r
        DECLARE_MESSAGE_MAP()\r
        afx_msg void OnDestroy();\r
-       afx_msg void OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult);\r
-       afx_msg void OnLvnGetdispinfoLoglist(NMHDR *pNMHDR, LRESULT *pResult);\r
+       virtual afx_msg void OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult);\r
+       virtual afx_msg void OnLvnGetdispinfoLoglist(NMHDR *pNMHDR, LRESULT *pResult);\r
        afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);\r
        afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);\r
        afx_msg LRESULT OnLoad(WPARAM wParam, LPARAM lParam);\r
@@ -249,6 +249,8 @@ protected:
        CString                         m_CurrentBranch;\r
        CString                         m_HeadHash;\r
        \r
+       CString                         m_ColumnRegKey;\r
+\r
        COLORREF                        m_LineColors[Lanes::COLORS_NUM];\r
        DWORD                           m_DateFormat;   // DATE_SHORTDATE or DATE_LONGDATE\r
        bool                            m_bRelativeTimes;       // Show relative times\r
index 9955dc7..851dcbe 100644 (file)
@@ -159,6 +159,7 @@ int CLogDataVector::ParserFromRefLog(CString ref)
                                rev.m_Subject=one.Right(one.GetLength()-message-1);
                        }
                }
+               this->push_back(rev);
        }
        return 0;
 }
index 0cadf34..7a4d600 100644 (file)
@@ -48,11 +48,26 @@ BOOL CRefLogDlg::OnInitDialog()
        STRING_VECTOR list;\r
        g_Git.GetRefList(list);\r
 \r
+       CString currentbranch;\r
+       currentbranch.Format(_T("refs/heads/%s"),g_Git.GetCurrentBranch());\r
+\r
        this->m_ChooseRef.AddString(list);\r
        m_ChooseRef.SetMaxHistoryItems(0x7FFFFFFF);\r
 \r
        this->m_RefList.InsertRefLogColumn();\r
-       m_RefList.m_logEntries.ParserFromRefLog(_T("master"));\r
+       //m_RefList.m_logEntries.ParserFromRefLog(_T("master"));\r
+       \r
+       for(int i=0;i<list.size();i++)\r
+       {\r
+               if(list[i] == currentbranch)\r
+               {\r
+                       m_ChooseRef.SetCurSel(i);\r
+                       break;\r
+               }\r
+       }\r
+\r
+       OnCbnSelchangeRef();\r
+\r
        return TRUE;\r
 }\r
 // CRefLogDlg message handlers\r
@@ -65,5 +80,32 @@ void CRefLogDlg::OnBnClickedOk()
 \r
 void CRefLogDlg::OnCbnSelchangeRef()\r
 {\r
-       \r
+       CString ref=m_ChooseRef.GetString();\r
+       if(m_RefList.m_RefMap.find(ref) == m_RefList.m_RefMap.end())\r
+       {\r
+               m_RefList.m_RefMap[ref].ParserFromRefLog(ref);\r
+       }\r
+       m_RefList.ClearText();\r
+\r
+       //this->m_logEntries.ParserFromLog();\r
+       m_RefList.SetRedraw(false);\r
+\r
+       CLogDataVector *plog;\r
+       plog = &m_RefList.m_RefMap[ref];\r
+\r
+       m_RefList.SetItemCountEx(plog->size());\r
+\r
+       this->m_RefList.m_arShownList.RemoveAll();\r
+\r
+       for(unsigned int i=0;i<m_RefList.m_RefMap[ref].size();i++)\r
+       {\r
+               plog->at(i).m_IsFull=TRUE;\r
+               this->m_RefList.m_arShownList.Add(&(plog->at(i)));\r
+               \r
+       }\r
+\r
+       m_RefList.SetRedraw(true);\r
+\r
+       m_RefList.Invalidate();\r
+\r
 }
\ No newline at end of file
index 23a7814..60236e0 100644 (file)
@@ -8,6 +8,7 @@ IMPLEMENT_DYNAMIC(CRefLogList, CGitLogList)
 \r
 CRefLogList::CRefLogList()\r
 {\r
+       m_ColumnRegKey=_T("reflog");\r
 \r
 }\r
 \r
@@ -36,4 +37,67 @@ void CRefLogList::InsertRefLogColumn()
        SetRedraw(false);\r
        ResizeAllListCtrlCols();\r
        SetRedraw(true);\r
+}\r
+\r
+void CRefLogList::OnLvnGetdispinfoLoglist(NMHDR *pNMHDR, LRESULT *pResult)\r
+{\r
+       NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);\r
+\r
+       // Create a pointer to the item\r
+       LV_ITEM* pItem = &(pDispInfo)->item;\r
+\r
+       // Do the list need text information?\r
+       if (!(pItem->mask & LVIF_TEXT))\r
+               return;\r
+\r
+       // By default, clear text buffer.\r
+       lstrcpyn(pItem->pszText, _T(""), pItem->cchTextMax);\r
+\r
+       bool bOutOfRange = pItem->iItem >= ShownCountWithStopped();\r
+       \r
+       *pResult = 0;\r
+       if (m_bNoDispUpdates || bOutOfRange)\r
+               return;\r
+\r
+       // Which item number?\r
+       int itemid = pItem->iItem;\r
+       GitRev * pLogEntry = NULL;\r
+       if (itemid < m_arShownList.GetCount())\r
+               pLogEntry = reinterpret_cast<GitRev*>(m_arShownList.GetAt(pItem->iItem));\r
+\r
+       CString temp;\r
+           \r
+       // Which column?\r
+       switch (pItem->iSubItem)\r
+       {\r
+       case this->REFLOG_HASH: //Graphic\r
+               if (pLogEntry)\r
+               {\r
+                       lstrcpyn(pItem->pszText,pLogEntry->m_CommitHash, pItem->cchTextMax);\r
+               }\r
+               break;\r
+       case REFLOG_REF: //action -- no text in the column\r
+               if(pLogEntry)\r
+                       lstrcpyn(pItem->pszText, pLogEntry->m_Ref, pItem->cchTextMax);\r
+               break;\r
+       case REFLOG_ACTION: //Message\r
+               if (pLogEntry)\r
+                       lstrcpyn(pItem->pszText, (LPCTSTR)pLogEntry->m_RefAction, pItem->cchTextMax);\r
+               break;\r
+       case REFLOG_MESSAGE: //Author\r
+               if (pLogEntry)\r
+                       lstrcpyn(pItem->pszText, (LPCTSTR)pLogEntry->m_Subject, pItem->cchTextMax);\r
+               break;\r
+               \r
+       default:\r
+               ASSERT(false);\r
+       }\r
+}\r
+\r
+void CRefLogList::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)\r
+{\r
+\r
+       NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );\r
+       // Take the default processing unless we set this to something else below.\r
+       *pResult = CDRF_DODEFAULT;\r
 }
\ No newline at end of file
index 1dce5c3..e155a76 100644 (file)
@@ -16,6 +16,10 @@ public:
                REFLOG_ACTION,\r
                REFLOG_MESSAGE\r
        };\r
+       \r
+       std::map<CString,CLogDataVector> m_RefMap;\r
 protected:\r
+       virtual void OnLvnGetdispinfoLoglist(NMHDR *pNMHDR, LRESULT *pResult);\r
+       virtual void OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult);\r
        \r
 };
\ No newline at end of file