OSDN Git Service

Show Author at blame.
authorFrank Li <lznuaa@gmail.com>
Mon, 12 Jan 2009 03:08:33 +0000 (11:08 +0800)
committerFrank Li <lznuaa@gmail.com>
Mon, 12 Jan 2009 03:08:33 +0000 (11:08 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
src/Git/Git.cpp
src/Git/Git.h
src/TortoiseGitBlame/OutputWnd.cpp
src/TortoiseGitBlame/OutputWnd.h
src/TortoiseGitBlame/TortoiseGitBlameView.cpp
src/TortoiseGitBlame/TortoiseGitBlameView.h

index 880a267..48f8525 100644 (file)
@@ -216,7 +216,10 @@ int CGit::GetLog(CString& logOut, CString &hash,  CTGitPath *path ,int count,int
        if(mask& LOG_INFO_STAT )\r
                param += _T(" -numstat ");\r
        if(mask& LOG_INFO_FILESTATE)\r
-               param += _T("--raw");\r
+               param += _T(" --raw ");\r
+\r
+       if(mask& LOG_INFO_FULLHISTORY)\r
+               param += _T(" --full-history ");\r
 \r
        cmd.Format(_T("git.exe log %s -C --left-right --boundary --topo-order --parents %s --pretty=format:\""),\r
                                num,param);\r
index 1070a36..a94d462 100644 (file)
@@ -49,6 +49,7 @@ public:
                LOG_INFO_STAT=0x1,\r
                LOG_INFO_FILESTATE=0x2,\r
                LOG_INFO_PATCH=0x4,\r
+               LOG_INFO_FULLHISTORY=0x8,\r
        }LOG_INFO_MASK;\r
 \r
        int GetRemoteList(STRING_VECTOR &list);\r
index 23d9e1e..7fc8ba6 100644 (file)
@@ -153,7 +153,7 @@ int COutputWnd::LoadHistory(CString filename)
        CTGitPath path;\r
        path.SetFromWin(filename);\r
 \r
-       m_LogList.FillGitLog(&path,0);\r
+       m_LogList.FillGitLog(&path,CGit::LOG_INFO_FULLHISTORY);\r
 \r
        return 0;\r
 \r
index 5d2ae09..7cbff0e 100644 (file)
@@ -31,7 +31,7 @@ public:
        COutputWnd();\r
 \r
 // Attributes\r
-protected:\r
+public:\r
        CFont m_Font;\r
 \r
        CMFCTabCtrl     m_wndTabs;\r
index c546b80..97fedbe 100644 (file)
@@ -24,6 +24,7 @@
 \r
 #include "TortoiseGitBlameDoc.h"\r
 #include "TortoiseGitBlameView.h"\r
+#include "MainFrm.h"\r
 \r
 #ifdef _DEBUG\r
 #define new DEBUG_NEW\r
@@ -82,6 +83,8 @@ CTortoiseGitBlameView::CTortoiseGitBlameView()
        m_lowestrev = LONG_MAX;\r
        m_highestrev = 0;\r
        m_colorage = true;\r
+\r
+       m_bShowLine=true;\r
 }\r
 \r
 CTortoiseGitBlameView::~CTortoiseGitBlameView()\r
@@ -107,6 +110,8 @@ int CTortoiseGitBlameView::OnCreate(LPCREATESTRUCT lpcs)
        m_TextView.ShowWindow( SW_SHOW);\r
        //m_TextView.InsertText(_T("Abdadfasdf"));\r
        m_wEditor = m_TextView.m_hWnd;\r
+       CreateFont();\r
+       InitialiseEditor();\r
        return CView::OnCreate(lpcs);\r
 }\r
 \r
@@ -139,6 +144,7 @@ void CTortoiseGitBlameView::OnDraw(CDC* /*pDC*/)
        if (!pDoc)\r
                return;\r
 \r
+       DrawBlame(this->GetDC()->m_hDC);\r
        // TODO: add draw code for native data here\r
 }\r
 \r
@@ -518,28 +524,32 @@ BOOL CTortoiseGitBlameView::OpenFile(const char *fileName)
        return TRUE;\r
 }\r
 \r
-void CTortoiseGitBlameView::SetAStyle(int style, COLORREF fore, COLORREF back, int size, const char *face) \r
+void CTortoiseGitBlameView::SetAStyle(int style, COLORREF fore, COLORREF back, int size, CString *face) \r
 {\r
        SendEditor(SCI_STYLESETFORE, style, fore);\r
        SendEditor(SCI_STYLESETBACK, style, back);\r
        if (size >= 1)\r
                SendEditor(SCI_STYLESETSIZE, style, size);\r
        if (face) \r
-               SendEditor(SCI_STYLESETFONT, style, reinterpret_cast<LPARAM>(face));\r
+               SendEditor(SCI_STYLESETFONT, style, reinterpret_cast<LPARAM>(this->m_TextView.StringForControl(*face).GetBuffer()));\r
 }\r
 \r
 void CTortoiseGitBlameView::InitialiseEditor() \r
 {\r
-#if 0\r
-       m_directFunction = SendMessage(m_wEditor, SCI_GETDIRECTFUNCTION, 0, 0);\r
-       m_directPointer = SendMessage(m_wEditor, SCI_GETDIRECTPOINTER, 0, 0);\r
+\r
+       m_directFunction = ::SendMessage(m_wEditor, SCI_GETDIRECTFUNCTION, 0, 0);\r
+       m_directPointer = ::SendMessage(m_wEditor, SCI_GETDIRECTPOINTER, 0, 0);\r
        // Set up the global default style. These attributes are used wherever no explicit choices are made.\r
-       SetAStyle(STYLE_DEFAULT, black, white, (DWORD)CRegStdWORD(_T("Software\\TortoiseGit\\BlameFontSize"), 10), \r
-               ((stdstring)(CRegStdString(_T("Software\\TortoiseGit\\BlameFontName"), _T("Courier New")))).c_str());\r
+       SetAStyle(STYLE_DEFAULT, \r
+                         black, \r
+                         white, \r
+                       (DWORD)CRegStdWORD(_T("Software\\TortoiseGit\\BlameFontSize"), 10), \r
+                       &CString(((stdstring)CRegStdString(_T("Software\\TortoiseGit\\BlameFontName"), _T("Courier New"))).c_str())\r
+                       );\r
        SendEditor(SCI_SETTABWIDTH, (DWORD)CRegStdWORD(_T("Software\\TortoiseGit\\BlameTabSize"), 4));\r
        SendEditor(SCI_SETREADONLY, TRUE);\r
-       LRESULT pix = SendEditor(SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)_T("_99999"));\r
-       if (ShowLine)\r
+       LRESULT pix = SendEditor(SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)this->m_TextView.StringForControl(_T("_99999")).GetBuffer());\r
+       if (m_bShowLine)\r
                SendEditor(SCI_SETMARGINWIDTHN, 0, pix);\r
        else\r
                SendEditor(SCI_SETMARGINWIDTHN, 0);\r
@@ -553,7 +563,9 @@ void CTortoiseGitBlameView::InitialiseEditor()
        SendEditor(SCI_SETCARETFORE, ::GetSysColor(COLOR_WINDOWTEXT));\r
        m_regOldLinesColor = CRegStdWORD(_T("Software\\TortoiseGit\\BlameOldColor"), RGB(230, 230, 255));\r
        m_regNewLinesColor = CRegStdWORD(_T("Software\\TortoiseGit\\BlameNewColor"), RGB(255, 230, 230));\r
-#endif\r
+       \r
+       this->m_TextView.Call(SCI_SETWRAPMODE, SC_WRAP_NONE);\r
+\r
 }\r
 \r
 void CTortoiseGitBlameView::StartSearch()\r
@@ -1054,11 +1066,12 @@ void CTortoiseGitBlameView::CreateFont()
 \r
        ::ReleaseDC(wBlame, hDC);\r
 \r
+       //m_TextView.SetFont(lf.lfFaceName,((DWORD)CRegStdWORD(_T("Software\\TortoiseGit\\BlameFontSize"), 10)));\r
 }\r
 \r
 void CTortoiseGitBlameView::DrawBlame(HDC hDC)\r
 {\r
-#if 0\r
+\r
        if (hDC == NULL)\r
                return;\r
        if (m_font == NULL)\r
@@ -1072,40 +1085,47 @@ void CTortoiseGitBlameView::DrawBlame(HDC hDC)
        TCHAR buf[MAX_PATH];\r
        RECT rc;\r
        BOOL sel = FALSE;\r
-       ::GetClientRect(wBlame, &rc);\r
+       //::GetClientRect(this->m_hWnd, &rc);\r
        for (LRESULT i=line; i<(line+linesonscreen); ++i)\r
        {\r
                sel = FALSE;\r
-               if (i < (int)revs.size())\r
+               if (i < (int)m_CommitHash.size())\r
                {\r
-                       if (mergelines[i])\r
-                               oldfont = (HFONT)::SelectObject(hDC, m_italicfont);\r
-                       else\r
+               //      if (mergelines[i])\r
+               //              oldfont = (HFONT)::SelectObject(hDC, m_italicfont);\r
+               //      else\r
                                oldfont = (HFONT)::SelectObject(hDC, m_font);\r
                        ::SetBkColor(hDC, m_windowcolor);\r
                        ::SetTextColor(hDC, m_textcolor);\r
-                       if (authors[i].GetLength()>0)\r
+                       if (m_CommitHash[i].GetLength()>0)\r
                        {\r
-                               if (authors[i].Compare(m_mouseauthor)==0)\r
+                               if (m_CommitHash[i].Compare(m_MouseHash)==0)\r
                                        ::SetBkColor(hDC, m_mouseauthorcolor);\r
-                               if (authors[i].Compare(m_selectedauthor)==0)\r
+                               if (m_CommitHash[i].Compare(m_SelectedHash)==0)\r
                                {\r
                                        ::SetBkColor(hDC, m_selectedauthorcolor);\r
                                        ::SetTextColor(hDC, m_texthighlightcolor);\r
                                        sel = TRUE;\r
                                }\r
                        }\r
-                       if ((revs[i] == m_mouserev)&&(!sel))\r
-                               ::SetBkColor(hDC, m_mouserevcolor);\r
-                       if (revs[i] == m_selectedrev)\r
-                       {\r
-                               ::SetBkColor(hDC, m_selectedrevcolor);\r
-                               ::SetTextColor(hDC, m_texthighlightcolor);\r
-                       }\r
-                       _stprintf_s(buf, MAX_PATH, _T("%8ld       "), revs[i]);\r
-                       rc.right = rc.left + m_revwidth;\r
-                       ::ExtTextOut(hDC, 0, Y, ETO_CLIPPED, &rc, buf, _tcslen(buf), 0);\r
+                       //if ((revs[i] == m_mouserev)&&(!sel))\r
+                       //      ::SetBkColor(hDC, m_mouserevcolor);\r
+                       //if (revs[i] == m_selectedrev)\r
+                       //{\r
+                       //      ::SetBkColor(hDC, m_selectedrevcolor);\r
+                       //      ::SetTextColor(hDC, m_texthighlightcolor);\r
+                       //}\r
+\r
+                       CString str;\r
+                       str.Format(_T("%d.%s"),m_ID[i],m_Authors[i]);\r
+\r
+                       //_stprintf_s(buf, MAX_PATH, _T("%8ld       "), revs[i]);\r
+                       rc.top=Y;rc.left=0;             \r
+                       rc.bottom=Y+height;\r
+                       rc.right = rc.left + 100;\r
+                       ::ExtTextOut(hDC, 0, Y, ETO_CLIPPED, &rc, str, str.GetLength(), 0);\r
                        int Left = m_revwidth;\r
+#if 0\r
                        if (ShowDate)\r
                        {\r
                                rc.right = rc.left + Left + m_datewidth;\r
@@ -1120,6 +1140,8 @@ void CTortoiseGitBlameView::DrawBlame(HDC hDC)
                                ::ExtTextOut(hDC, Left, Y, ETO_CLIPPED, &rc, buf, _tcslen(buf), 0);\r
                                Left += m_authorwidth;\r
                        }\r
+#endif\r
+#if 0\r
                        if (ShowPath)\r
                        {\r
                                rc.right = rc.left + Left + m_pathwidth;\r
@@ -1127,6 +1149,7 @@ void CTortoiseGitBlameView::DrawBlame(HDC hDC)
                                ::ExtTextOut(hDC, Left, Y, ETO_CLIPPED, &rc, buf, _tcslen(buf), 0);\r
                                Left += m_authorwidth;\r
                        }\r
+#endif\r
                        if ((i==m_SelectedLine)&&(currentDialog))\r
                        {\r
                                LOGBRUSH brush;\r
@@ -1158,7 +1181,6 @@ void CTortoiseGitBlameView::DrawBlame(HDC hDC)
                        Y += height;\r
                }\r
        }\r
-#endif\r
 }\r
 \r
 void CTortoiseGitBlameView::DrawHeader(HDC hDC)\r
@@ -2423,10 +2445,15 @@ void CTortoiseGitBlameView::UpdateInfo()
        CString one;\r
        int pos=0;\r
 \r
+       CLogDataVector * pRevs= GetLogData();\r
+\r
        this->m_CommitHash.clear();\r
        this->m_Authors.clear();\r
        this->m_ID.clear();\r
        CString line;\r
+\r
+       CreateFont();\r
+\r
        SendEditor(SCI_SETREADONLY, FALSE);\r
        SendEditor(SCI_CLEARALL);\r
        SendEditor(EM_EMPTYUNDOBUFFER);\r
@@ -2445,6 +2472,15 @@ void CTortoiseGitBlameView::UpdateInfo()
                        line=one.Right(one.GetLength()-start-2);\r
                        this->m_TextView.InsertText(line,true);\r
                }\r
+               int id=pRevs->m_HashMap[one.Left(40)];          \r
+               if(id>=0)\r
+               {\r
+                       m_ID.push_back(pRevs->size()-id);\r
+                       m_Authors.push_back(pRevs->at(id).m_AuthorName);\r
+               }else\r
+               {\r
+                       ASSERT(FALSE);\r
+               }\r
        }\r
 \r
        SetupLexer(GetDocument()->m_CurrentFileName);\r
@@ -2456,4 +2492,11 @@ void CTortoiseGitBlameView::UpdateInfo()
        SendEditor(SCI_SETSCROLLWIDTHTRACKING, TRUE);\r
        SendEditor(SCI_SETREADONLY, TRUE);\r
 \r
+\r
+       this->Invalidate();\r
+}\r
+\r
+CLogDataVector * CTortoiseGitBlameView::GetLogData()\r
+{\r
+       return &(GetDocument()->GetMainFrame()->m_wndOutput.m_LogList.m_logEntries);\r
 }
\ No newline at end of file
index 2592455..c51a9bf 100644 (file)
@@ -10,6 +10,7 @@
 #include "registry.h"\r
 #include "SciEdit.h"\r
 \r
+#include "GitBlameLogList.h"\r
 \r
 const COLORREF black = RGB(0,0,0);\r
 const COLORREF white = RGB(0xff,0xff,0xff);\r
@@ -108,7 +109,8 @@ public:
        void Command(int id);\r
        void Notify(SCNotification *notification);\r
 \r
-       void SetAStyle(int style, COLORREF fore, COLORREF back=::GetSysColor(COLOR_WINDOW), int size=-1, const char *face=0);\r
+       void SetAStyle(int style, COLORREF fore, COLORREF back=::GetSysColor(COLOR_WINDOW), int size=-1, CString *face=0);\r
+\r
        void InitialiseEditor();\r
     void InitSize();\r
        LONG GetBlameWidth();\r
@@ -129,11 +131,11 @@ public:
        void SetSelectedLine(LONG line) { m_SelectedLine=line;};\r
 \r
        LONG                                            m_mouserev;\r
-       CString                                 m_mouseauthor;\r
+       CString                                         m_MouseHash;\r
        LONG                                            m_selectedrev;\r
        LONG                                            m_selectedorigrev;\r
-       CString                                 m_selectedauthor;\r
-       CString                                 m_selecteddate;\r
+       CString                                         m_SelectedHash;\r
+       CString                                         m_selecteddate;\r
        static long                                     m_gotoline;\r
        long                                            m_lowestrev;\r
        long                                            m_highestrev;\r
@@ -154,6 +156,11 @@ public:
        void StringExpand(LPSTR str);\r
        void StringExpand(LPWSTR str);\r
        BOOL                                            ttVisible;\r
+\r
+       CLogDataVector *                GetLogData();\r
+\r
+       BOOL m_bShowLine;\r
+\r
 protected:\r
        void CreateFont();\r
        void SetupLexer(CString filename);\r