OSDN Git Service

Update first commit can't show when launch log dialog
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / GitLogListBase.cpp
index e9a914e..f4e2314 100644 (file)
@@ -58,6 +58,7 @@ CGitLogListBase::CGitLogListBase():CHintListCtrl()
        , m_pStoreSelection(NULL)\r
        , m_nSelectedFilter(LOGFILTER_ALL)\r
        , m_bVista(false)\r
+       , m_bShowWC(false)\r
 {\r
        // use the default GUI font, create a copy of it and\r
        // change the copy to BOLD (leave the rest of the font\r
@@ -73,7 +74,11 @@ CGitLogListBase::CGitLogListBase():CHintListCtrl()
        m_IsIDReplaceAction=FALSE;\r
 \r
        m_wcRev.m_CommitHash=GIT_REV_ZERO;\r
-       m_wcRev.m_Subject=_T("Working Copy");\r
+       m_wcRev.m_Subject=_T("Working dir changes");\r
+       m_wcRev.m_ParentHash.clear();\r
+       m_wcRev.m_Mark=_T('-');\r
+       m_wcRev.m_IsUpdateing=FALSE;\r
+       m_wcRev.m_IsFull = TRUE;\r
 \r
        m_hModifiedIcon = (HICON)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ACTIONMODIFIED), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);\r
        m_hReplacedIcon = (HICON)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ACTIONREPLACED), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);\r
@@ -167,8 +172,25 @@ BEGIN_MESSAGE_MAP(CGitLogListBase, CHintListCtrl)
        ON_WM_CREATE()\r
        ON_WM_DESTROY()\r
        ON_MESSAGE(MSG_LOADED,OnLoad)\r
+       ON_WM_MEASUREITEM()\r
+       ON_WM_MEASUREITEM_REFLECT()\r
 END_MESSAGE_MAP()\r
 \r
+void CGitLogListBase::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)\r
+{\r
+       // TODO: ÔÚ´ËÌí¼ÓÏûÏ¢´¦Àí³ÌÐò´úÂëºÍ/»òµ÷ÓÃĬÈÏÖµ\r
+\r
+       CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);\r
+}\r
+\r
+void CGitLogListBase::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)\r
+{\r
+       //if (m_nRowHeight>0)\r
+       {\r
+               lpMeasureItemStruct->itemHeight = 50;\r
+       }\r
+}\r
+\r
 int CGitLogListBase:: OnCreate(LPCREATESTRUCT lpCreateStruct)\r
 {\r
        PreSubclassWindow();\r
@@ -179,7 +201,9 @@ void CGitLogListBase::PreSubclassWindow()
 {\r
        SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES);\r
        // load the icons for the action columns\r
-       m_Theme.SetWindowTheme(GetSafeHwnd(), L"Explorer", NULL);\r
+//     m_Theme.Open(m_hWnd, L"ListView");\r
+       m_Theme.Open(m_hWnd, L"Explorer::ListView;ListView");\r
+       m_Theme.SetWindowTheme(m_hWnd, L"Explorer", NULL);\r
        CHintListCtrl::PreSubclassWindow();\r
 }\r
 \r
@@ -187,7 +211,7 @@ void CGitLogListBase::InsertGitColumn()
 {\r
        CString temp;\r
 \r
-       int c = ((CHeaderCtrl*)(GetDlgItem(0)))->GetItemCount()-1;\r
+       int c = GetHeaderCtrl()->GetItemCount()-1;\r
        \r
        while (c>=0)\r
                DeleteColumn(c--);\r
@@ -306,6 +330,7 @@ BOOL CGitLogListBase::GetShortName(CString ref, CString &shortname,CString prefi
        }\r
        return FALSE;\r
 }\r
+\r
 void CGitLogListBase::FillBackGround(HDC hdc, int Index,CRect &rect)\r
 {      \r
 //     HBRUSH brush;\r
@@ -317,12 +342,11 @@ void CGitLogListBase::FillBackGround(HDC hdc, int Index,CRect &rect)
        GetItem(&rItem);\r
 \r
        GitRev* pLogEntry = (GitRev*)m_arShownList.GetAt(Index);\r
-       HBRUSH brush;\r
+       HBRUSH brush = NULL;\r
 \r
        \r
        if (m_Theme.IsAppThemed() && m_bVista)\r
        {\r
-               m_Theme.Open(m_hWnd, L"Explorer");\r
                int state = LISS_NORMAL;\r
                if (rItem.state & LVIS_SELECTED)\r
                {\r
@@ -337,19 +361,26 @@ void CGitLogListBase::FillBackGround(HDC hdc, int Index,CRect &rect)
                                brush = ::CreateSolidBrush(RGB(156,156,156));\r
                        else if(pLogEntry->m_Action&CTGitPath::LOGACTIONS_REBASE_EDIT)\r
                                brush = ::CreateSolidBrush(RGB(200,200,128));\r
+               }\r
 \r
-                       if (brush == NULL)\r
-                               return;\r
-\r
+               if (brush != NULL)\r
+               {\r
                        ::FillRect(hdc, &rect, brush);\r
                        ::DeleteObject(brush);\r
-\r
                }\r
-\r
-               if (m_Theme.IsBackgroundPartiallyTransparent(LVP_LISTDETAIL, state))\r
-                       m_Theme.DrawParentBackground(m_hWnd, hdc, &rect);\r
                else\r
-                       m_Theme.DrawBackground(hdc, LVP_LISTDETAIL, state, &rect, NULL);\r
+               {\r
+                       if (m_Theme.IsBackgroundPartiallyTransparent(LVP_LISTITEM, state))\r
+                               m_Theme.DrawParentBackground(m_hWnd, hdc, &rect);\r
+\r
+                       CRect rectDraw = rect;\r
+                       if(rItem.state & LVIS_SELECTED)\r
+                               rectDraw.InflateRect(1,0);\r
+                       else\r
+                               rectDraw.InflateRect(1,1);\r
+\r
+                       m_Theme.DrawBackground(hdc, LVP_LISTITEM, state, rectDraw, &rect);\r
+               }\r
        }\r
        else\r
        {\r
@@ -370,7 +401,7 @@ void CGitLogListBase::FillBackGround(HDC hdc, int Index,CRect &rect)
                                brush = ::CreateSolidBrush(RGB(156,156,156));\r
                        else if(pLogEntry->m_Action&CTGitPath::LOGACTIONS_REBASE_EDIT)\r
                                brush = ::CreateSolidBrush(RGB(200,200,128));\r
-                       else \r
+                       else\r
                                brush = ::CreateSolidBrush(::GetSysColor(COLOR_WINDOW));\r
                }\r
                if (brush == NULL)\r
@@ -399,28 +430,38 @@ void CGitLogListBase::DrawTagBranch(HDC hdc,CRect &rect,INT_PTR index)
                str=m_HashMap[data->m_CommitHash][i];\r
                \r
                CString shortname;\r
-               HBRUSH brush=0;\r
-               shortname=_T("");\r
+               HBRUSH brush = 0;\r
+               shortname = _T("");\r
+               COLORREF colRef = 0;\r
+\r
+               //Determine label color\r
                if(GetShortName(str,shortname,_T("refs/heads/")))\r
                {\r
                        if( shortname == m_CurrentBranch )\r
-                               brush = ::CreateSolidBrush(m_Colors.GetColor(CColors::CurrentBranch));\r
+                               colRef = m_Colors.GetColor(CColors::CurrentBranch);\r
                        else\r
-                               brush = ::CreateSolidBrush(m_Colors.GetColor(CColors::LocalBranch));\r
+                               colRef = m_Colors.GetColor(CColors::LocalBranch);\r
 \r
                }else if(GetShortName(str,shortname,_T("refs/remotes/")))\r
                {\r
-                       brush = ::CreateSolidBrush(m_Colors.GetColor(CColors::RemoteBranch));\r
+                       colRef = m_Colors.GetColor(CColors::RemoteBranch);\r
                }\r
                else if(GetShortName(str,shortname,_T("refs/tags/")))\r
                {\r
-                       brush = ::CreateSolidBrush(m_Colors.GetColor(CColors::Tag));\r
+                       colRef = m_Colors.GetColor(CColors::Tag);\r
                }\r
                else if(GetShortName(str,shortname,_T("refs/stash")))\r
                {\r
-                       brush = ::CreateSolidBrush(m_Colors.GetColor(CColors::Stash));\r
+                       colRef = m_Colors.GetColor(CColors::Stash);\r
                        shortname=_T("stash");\r
                }\r
+\r
+               //When row selected, ajust label color\r
+               if (!(m_Theme.IsAppThemed() && m_bVista))\r
+                       if (rItem.state & LVIS_SELECTED)\r
+                               colRef = CColors::MixColors(colRef, ::GetSysColor(COLOR_HIGHLIGHT), 150);\r
+\r
+               brush = ::CreateSolidBrush(colRef);\r
                \r
 \r
                if(!shortname.IsEmpty())\r
@@ -430,46 +471,97 @@ void CGitLogListBase::DrawTagBranch(HDC hdc,CRect &rect,INT_PTR index)
                        GetTextExtentPoint32(hdc, shortname,shortname.GetLength(),&size);\r
                \r
                        rt.SetRect(rt.left,rt.top,rt.left+size.cx,rt.bottom);\r
-                       rt.right+=4;\r
+                       rt.right+=8;\r
+\r
+                       //Fill interior of ref label\r
                        ::FillRect(hdc, &rt, brush);\r
-                       if (rItem.state & LVIS_SELECTED)\r
+\r
+                       //Draw edge of label\r
+                       CDC W_Dc;\r
+                       W_Dc.Attach(hdc);\r
+\r
+                       CRect rectEdge = rt;\r
+\r
+                       W_Dc.Draw3dRect(rectEdge, m_Colors.Lighten(colRef,100), m_Colors.Darken(colRef,100));\r
+                       rectEdge.DeflateRect(1,1);\r
+                       W_Dc.Draw3dRect(rectEdge, m_Colors.Lighten(colRef,50), m_Colors.Darken(colRef,50));\r
+\r
+                       W_Dc.Detach();\r
+\r
+                       //Draw text inside label\r
+                       if (m_Theme.IsAppThemed() && m_bVista)\r
                        {\r
-                               COLORREF   clrOld   = ::SetTextColor(hdc,::GetSysColor(COLOR_HIGHLIGHTTEXT));   \r
-                               ::DrawText(hdc,shortname,shortname.GetLength(),&rt,DT_CENTER);\r
-                               ::SetTextColor(hdc,clrOld);   \r
-                       }else\r
+                               int txtState = LISS_NORMAL;\r
+                               if (rItem.state & LVIS_SELECTED)\r
+                                       txtState = LISS_SELECTED;\r
+\r
+                               m_Theme.DrawText(hdc, LVP_LISTITEM, txtState, shortname, -1, DT_CENTER | DT_SINGLELINE | DT_VCENTER, 0, &rt);\r
+                       }\r
+                       else\r
                        {\r
-                               ::DrawText(hdc,shortname,shortname.GetLength(),&rt,DT_CENTER);\r
+                               if (rItem.state & LVIS_SELECTED)\r
+                               {\r
+                                       COLORREF clrNew = ::GetSysColor(COLOR_HIGHLIGHTTEXT);\r
+                                       COLORREF   clrOld   = ::SetTextColor(hdc,clrNew);   \r
+                                       ::DrawText(hdc,shortname,shortname.GetLength(),&rt,DT_CENTER | DT_SINGLELINE | DT_VCENTER);\r
+                                       ::SetTextColor(hdc,clrOld);\r
+                               }else\r
+                               {\r
+                                       ::DrawText(hdc,shortname,shortname.GetLength(),&rt,DT_CENTER | DT_SINGLELINE | DT_VCENTER);\r
+                               }\r
                        }\r
 \r
                        \r
-                       ::MoveToEx(hdc,rt.left,rt.top,NULL);\r
-                       ::LineTo(hdc,rt.right,rt.top);\r
-                       ::LineTo(hdc,rt.right,rt.bottom);\r
-                       ::LineTo(hdc,rt.left,rt.bottom);\r
-                       ::LineTo(hdc,rt.left,rt.top);\r
+                       //::MoveToEx(hdc,rt.left,rt.top,NULL);\r
+                       //::LineTo(hdc,rt.right,rt.top);\r
+                       //::LineTo(hdc,rt.right,rt.bottom);\r
+                       //::LineTo(hdc,rt.left,rt.bottom);\r
+                       //::LineTo(hdc,rt.left,rt.top);\r
+\r
                                \r
-                       rt.left=rt.right+3;\r
+                       rt.left=rt.right+1;\r
                }\r
                if(brush)\r
                        ::DeleteObject(brush);\r
        }               \r
        rt.right=rect.right;\r
 \r
-       if (rItem.state & LVIS_SELECTED)\r
+       if (m_Theme.IsAppThemed() && m_bVista)\r
        {\r
-               COLORREF   clrOld   = ::SetTextColor(hdc,::GetSysColor(COLOR_HIGHLIGHTTEXT));   \r
-               ::DrawText(hdc,data->m_Subject,data->m_Subject.GetLength(),&rt,DT_LEFT);\r
-               ::SetTextColor(hdc,clrOld);   \r
-       }else\r
+               int txtState = LISS_NORMAL;\r
+               if (rItem.state & LVIS_SELECTED)\r
+                       txtState = LISS_SELECTED;\r
+\r
+               m_Theme.DrawText(hdc, LVP_LISTITEM, txtState, data->m_Subject, -1, DT_LEFT | DT_SINGLELINE | DT_VCENTER, 0, &rt);\r
+       }\r
+       else\r
        {\r
-               ::DrawText(hdc,data->m_Subject,data->m_Subject.GetLength(),&rt,DT_LEFT);\r
+               if (rItem.state & LVIS_SELECTED)\r
+               {\r
+                       COLORREF   clrOld   = ::SetTextColor(hdc,::GetSysColor(COLOR_HIGHLIGHTTEXT));   \r
+                       ::DrawText(hdc,data->m_Subject,data->m_Subject.GetLength(),&rt,DT_LEFT | DT_SINGLELINE | DT_VCENTER);\r
+                       ::SetTextColor(hdc,clrOld);   \r
+               }else\r
+               {\r
+                       ::DrawText(hdc,data->m_Subject,data->m_Subject.GetLength(),&rt,DT_LEFT | DT_SINGLELINE | DT_VCENTER);\r
+               }\r
        }\r
-       \r
 }\r
 \r
+static COLORREF blend(const COLORREF& col1, const COLORREF& col2, int amount = 128) {\r
+\r
+       // Returns ((256 - amount)*col1 + amount*col2) / 256;\r
+       return RGB(((256 - amount)*GetRValue(col1)   + amount*GetRValue(col2)  ) / 256,\r
+                     ((256 - amount)*GetGValue(col1) + amount*GetGValue(col2) ) / 256,\r
+                     ((256 - amount)*GetBValue(col1)  + amount*GetBValue(col2) ) / 256);\r
+}\r
+\r
+Gdiplus::Color GetGdiColor(COLORREF col)\r
+{\r
+       return Gdiplus::Color(GetRValue(col),GetGValue(col),GetBValue(col));\r
+}\r
 void CGitLogListBase::paintGraphLane(HDC hdc, int laneHeight,int type, int x1, int x2,\r
-                                      const COLORREF& col,int top\r
+                                      const COLORREF& col,const COLORREF& activeColor, int top\r
                                                                          )  \r
 {\r
        int h = laneHeight / 2;\r
@@ -484,12 +576,97 @@ void CGitLogListBase::paintGraphLane(HDC hdc, int laneHeight,int type, int x1, i
        #define P_270    m , 2 * h+top\r
        #define R_CENTER m - r, h - r+top, m - r+d, h - r+top+d\r
 \r
+\r
+       #define DELTA_UR_B 2*(x1 - m), 2*h +top \r
+       #define DELTA_UR_E 0*16, 90*16 +top  // -,\r
+\r
+       #define DELTA_DR_B 2*(x1 - m), 2*-h +top\r
+       #define DELTA_DR_E 270*16, 90*16 +top  // -'\r
+\r
+       #define DELTA_UL_B 2*(x2 - m), 2*h +top\r
+       #define DELTA_UL_E 90*16, 90*16 +top //  ,-\r
+\r
+       #define DELTA_DL_B 2*(x2 - m),2*-h +top \r
+       #define DELTA_DL_E 180*16, 90*16  //  '-\r
+\r
+       #define CENTER_UR x1, 2*h, 225\r
+       #define CENTER_DR x1, 0  , 135\r
+       #define CENTER_UL x2, 2*h, 315\r
+       #define CENTER_DL x2, 0  ,  45\r
+\r
+\r
+       Gdiplus::Graphics graphics( hdc );\r
+\r
+       // arc\r
+       switch (type) {\r
+       case Lanes::JOIN:\r
+       case Lanes::JOIN_R:\r
+       case Lanes::HEAD:\r
+       case Lanes::HEAD_R: \r
+       {\r
+               Gdiplus::LinearGradientBrush gradient(\r
+                                                               Gdiplus::Point(x1-2, h+top-2),\r
+                                                               Gdiplus::Point(P_270),\r
+                                                               GetGdiColor(activeColor),GetGdiColor(col));\r
+\r
+               \r
+               Gdiplus::Pen mypen(&gradient,2);\r
+               //Gdiplus::Pen mypen(Gdiplus::Color(0,0,0),2);\r
+               \r
+               //graphics.DrawRectangle(&mypen,x1-(x2-x1)/2,top+h, x2-x1,laneHeight);\r
+               graphics.DrawArc(&mypen,x1-(x2-x1)/2-1,top+h-1, x2-x1+1,laneHeight+1,270,90);\r
+               //graphics.DrawLine(&mypen,x1-1,h+top,P_270);\r
+\r
+               break;\r
+       }\r
+       case Lanes::JOIN_L: \r
+       {\r
+       \r
+               Gdiplus::Pen mypen(Gdiplus::Color(0,0,0),2);\r
+\r
+               \r
+               graphics.DrawArc(&mypen,x1,top+h, x2-x1,laneHeight,270,90);\r
+\r
+               break;\r
+       }\r
+       case Lanes::TAIL:\r
+       case Lanes::TAIL_R: \r
+       {\r
+               \r
+               Gdiplus::LinearGradientBrush gradient(\r
+                                                               Gdiplus::Point(x1-2, h+top-2),\r
+                                                               Gdiplus::Point(P_90),\r
+                                                               GetGdiColor(activeColor),GetGdiColor(col));\r
+\r
+               \r
+               Gdiplus::Pen mypen(&gradient,2);\r
+\r
+               graphics.DrawArc(&mypen,x1-(x2-x1)/2-1,top-h-1, x2-x1+1,laneHeight+1,0,90);\r
+\r
+\r
+#if 0\r
+               QConicalGradient gradient(CENTER_DR);\r
+               gradient.setColorAt(0.375, activeCol);\r
+               gradient.setColorAt(0.625, col);\r
+               myPen.setBrush(gradient);\r
+               p->setPen(myPen);\r
+               p->drawArc(P_CENTER, DELTA_DR);\r
+#endif\r
+               break;\r
+       }\r
+       default:\r
+               break;\r
+       }\r
+\r
+\r
        //static QPen myPen(Qt::black, 2); // fast path here\r
        CPen pen;\r
        pen.CreatePen(PS_SOLID,2,col);\r
        //myPen.setColor(col);\r
        HPEN oldpen=(HPEN)::SelectObject(hdc,(HPEN)pen);\r
 \r
+       Gdiplus::Pen myPen(GetGdiColor(col),2);\r
+\r
        //p->setPen(myPen);\r
 \r
        // vertical line\r
@@ -502,31 +679,33 @@ void CGitLogListBase::paintGraphLane(HDC hdc, int laneHeight,int type, int x1, i
        case Lanes::JOIN:\r
        case Lanes::JOIN_R:\r
        case Lanes::JOIN_L:\r
-               DrawLine(hdc,P_90,P_270);\r
+       case Lanes::CROSS:\r
+               //DrawLine(hdc,P_90,P_270);\r
+               graphics.DrawLine(&myPen,P_90,P_270);\r
                //p->drawLine(P_90, P_270);\r
                break;\r
-       case Lanes::HEAD:\r
-       case Lanes::HEAD_R:\r
        case Lanes::HEAD_L:\r
        case Lanes::BRANCH:\r
-               DrawLine(hdc,P_CENTER,P_270);\r
+               //DrawLine(hdc,P_CENTER,P_270);\r
+               graphics.DrawLine(&myPen,P_CENTER,P_270);\r
                //p->drawLine(P_CENTER, P_270);\r
                break;\r
-       case Lanes::TAIL:\r
-       case Lanes::TAIL_R:\r
        case Lanes::TAIL_L:\r
        case Lanes::INITIAL:\r
        case Lanes::BOUNDARY:\r
        case Lanes::BOUNDARY_C:\r
        case Lanes::BOUNDARY_R:\r
        case Lanes::BOUNDARY_L:\r
-               DrawLine(hdc,P_90, P_CENTER);\r
+               //DrawLine(hdc,P_90, P_CENTER);\r
+               graphics.DrawLine(&myPen,P_90,P_CENTER);\r
                //p->drawLine(P_90, P_CENTER);\r
                break;\r
        default:\r
                break;\r
        }\r
 \r
+       myPen.SetColor(GetGdiColor(activeColor));\r
+\r
        // horizontal line\r
        switch (type) {\r
        case Lanes::MERGE_FORK:\r
@@ -536,23 +715,22 @@ void CGitLogListBase::paintGraphLane(HDC hdc, int laneHeight,int type, int x1, i
        case Lanes::CROSS:\r
        case Lanes::CROSS_EMPTY:\r
        case Lanes::BOUNDARY_C:\r
-               DrawLine(hdc,P_180,P_0);\r
+               //DrawLine(hdc,P_180,P_0);\r
+               graphics.DrawLine(&myPen,P_180,P_0);\r
                //p->drawLine(P_180, P_0);\r
                break;\r
        case Lanes::MERGE_FORK_R:\r
-       case Lanes::JOIN_R:\r
-       case Lanes::HEAD_R:\r
-       case Lanes::TAIL_R:\r
        case Lanes::BOUNDARY_R:\r
-               DrawLine(hdc,P_180,P_CENTER);\r
+               //DrawLine(hdc,P_180,P_CENTER);\r
+               graphics.DrawLine(&myPen,P_180,P_CENTER);\r
                //p->drawLine(P_180, P_CENTER);\r
                break;\r
        case Lanes::MERGE_FORK_L:\r
-       case Lanes::JOIN_L:\r
        case Lanes::HEAD_L:\r
        case Lanes::TAIL_L:\r
        case Lanes::BOUNDARY_L:\r
-               DrawLine(hdc,P_CENTER,P_0);\r
+               //DrawLine(hdc,P_CENTER,P_0);\r
+               graphics.DrawLine(&myPen,P_CENTER,P_0);\r
                //p->drawLine(P_CENTER, P_0);\r
                break;\r
        default:\r
@@ -649,16 +827,37 @@ void CGitLogListBase::DrawGraph(HDC hdc,CRect &rect,INT_PTR index)
 \r
        std::vector<int>& lanes=data->m_Lanes;\r
        UINT laneNum = lanes.size();\r
-       UINT mergeLane = 0;\r
+       UINT activeLane = 0;\r
        for (UINT i = 0; i < laneNum; i++)\r
                if (Lanes::isMerge(lanes[i])) {\r
-                       mergeLane = i;\r
+                       activeLane = i;\r
                        break;\r
                }\r
 \r
        int x1 = 0, x2 = 0;\r
        int maxWidth = rect.Width();\r
        int lw = 3 * rect.Height() / 4; //laneWidth() \r
+\r
+       COLORREF activeColor = m_LineColors[activeLane % Lanes::COLORS_NUM];\r
+       //if (opt.state & QStyle::State_Selected)\r
+       //      activeColor = blend(activeColor, opt.palette.highlightedText().color(), 208);\r
+       \r
+\r
+       for (unsigned int i = 0; i < laneNum && x2 < maxWidth; i++) \r
+       {\r
+\r
+               x1 = x2;\r
+               x2 += lw;\r
+\r
+               int ln = lanes[i];\r
+               if (ln == Lanes::EMPTY)\r
+                       continue;\r
+\r
+               COLORREF color = i == activeLane ? activeColor : m_LineColors[i % Lanes::COLORS_NUM];\r
+               paintGraphLane(hdc, rect.Height(),ln, x1+rect.left, x2+rect.left, color,activeColor, rect.top);\r
+       }\r
+\r
+#if 0\r
        for (UINT i = 0; i < laneNum && x2 < maxWidth; i++) {\r
 \r
                x1 = x2;\r
@@ -669,16 +868,16 @@ void CGitLogListBase::DrawGraph(HDC hdc,CRect &rect,INT_PTR index)
                        continue;\r
 \r
                UINT col = (  Lanes:: isHead(ln) ||Lanes:: isTail(ln) || Lanes::isJoin(ln)\r
-                           || ln ==Lanes:: CROSS_EMPTY) ? mergeLane : i;\r
+                           || ln ==Lanes:: CROSS_EMPTY) ? activeLane : i;\r
 \r
                if (ln == Lanes::CROSS) {\r
                        paintGraphLane(hdc, rect.Height(),Lanes::NOT_ACTIVE, x1, x2, m_LineColors[col % Lanes::COLORS_NUM],rect.top);\r
-                       paintGraphLane(hdc, rect.Height(),Lanes::CROSS, x1, x2, m_LineColors[mergeLane % Lanes::COLORS_NUM],rect.top);\r
+                       paintGraphLane(hdc, rect.Height(),Lanes::CROSS, x1, x2, m_LineColors[activeLane % Lanes::COLORS_NUM],rect.top);\r
                } else\r
                        paintGraphLane(hdc, rect.Height(),ln, x1, x2, m_LineColors[col % Lanes::COLORS_NUM],rect.top);\r
        }\r
+#endif\r
 \r
-       TRACE(_T("index %d %d\r\n"),index,data->m_Lanes.size());\r
 }\r
 \r
 void CGitLogListBase::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)\r
@@ -734,7 +933,7 @@ void CGitLogListBase::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)
                                                pLVCD->clrTextBk = RGB(156,156,156);\r
                                        else if(data->m_Action&CTGitPath::LOGACTIONS_REBASE_EDIT)\r
                                                pLVCD->clrTextBk  = RGB(200,200,128);\r
-                                       else \r
+                                       else\r
                                                pLVCD->clrTextBk  = ::GetSysColor(COLOR_WINDOW);\r
 \r
                                        if(data->m_Action&CTGitPath::LOGACTIONS_REBASE_CURRENT)\r
@@ -751,13 +950,15 @@ void CGitLogListBase::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)
 \r
 //                                     if ((data->childStackDepth)||(m_mergedRevs.find(data->Rev) != m_mergedRevs.end()))\r
 //                                             crText = GetSysColor(COLOR_GRAYTEXT);\r
-//                                     if (data->Rev == m_wcRev)\r
-//                                     {\r
-//                                             SelectObject(pLVCD->nmcd.hdc, m_boldFont);\r
+//                                     \r
+                                       if (data->m_CommitHash == GIT_REV_ZERO)\r
+                                       {\r
+                                               //crText = GetSysColor(RGB(200,200,0));\r
+                                               //SelectObject(pLVCD->nmcd.hdc, m_boldFont);\r
                                                // We changed the font, so we're returning CDRF_NEWFONT. This\r
                                                // tells the control to recalculate the extent of the text.\r
-//                                             *pResult = CDRF_NOTIFYSUBITEMDRAW | CDRF_NEWFONT;\r
-//                                     }\r
+                                               *pResult = CDRF_NOTIFYSUBITEMDRAW | CDRF_NEWFONT;\r
+                                       }\r
                                }\r
                        }\r
                        if (m_arShownList.GetCount() == (INT_PTR)pLVCD->nmcd.dwItemSpec)\r
@@ -783,9 +984,19 @@ void CGitLogListBase::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)
                                {\r
                                        CRect rect;\r
                                        GetSubItemRect(pLVCD->nmcd.dwItemSpec, pLVCD->iSubItem, LVIR_BOUNDS, rect);\r
+                                       if(pLVCD->iSubItem == 0)\r
+                                       {\r
+                                               CRect second;\r
+                                               GetSubItemRect(pLVCD->nmcd.dwItemSpec, pLVCD->iSubItem+1, LVIR_BOUNDS, second);\r
+                                               rect.right=second.left;\r
+                                       }\r
                                        \r
+                                       TRACE(_T("A Graphic left %d right %d\r\n"),rect.left,rect.right);\r
                                        FillBackGround(pLVCD->nmcd.hdc, (INT_PTR)pLVCD->nmcd.dwItemSpec,rect);\r
-                                       DrawGraph(pLVCD->nmcd.hdc,rect,pLVCD->nmcd.dwItemSpec);\r
+                                       \r
+                                       GitRev* data = (GitRev*)m_arShownList.GetAt(pLVCD->nmcd.dwItemSpec);\r
+                                       if( data ->m_CommitHash != GIT_REV_ZERO)\r
+                                               DrawGraph(pLVCD->nmcd.hdc,rect,pLVCD->nmcd.dwItemSpec);\r
 \r
                                        *pResult = CDRF_SKIPDEFAULT;\r
                                        return;\r
@@ -818,7 +1029,8 @@ void CGitLogListBase::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)
                                                return;\r
 \r
                                        }\r
-                               }\r
+\r
+                               }       \r
                        }\r
                        \r
                        if (pLVCD->iSubItem == 1)\r
@@ -840,6 +1052,7 @@ void CGitLogListBase::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)
                                GitRev* pLogEntry = reinterpret_cast<GitRev *>(m_arShownList.GetAt(pLVCD->nmcd.dwItemSpec));\r
                                CRect rect;\r
                                GetSubItemRect(pLVCD->nmcd.dwItemSpec, pLVCD->iSubItem, LVIR_BOUNDS, rect);\r
+                               TRACE(_T("Action left %d right %d\r\n"),rect.left,rect.right);\r
                                // Get the selected state of the\r
                                // item being drawn.                                                    \r
 \r
@@ -938,7 +1151,7 @@ void CGitLogListBase::OnLvnGetdispinfoLoglist(NMHDR *pNMHDR, LRESULT *pResult)
                        lstrcpyn(pItem->pszText, (LPCTSTR)pLogEntry->m_AuthorName, pItem->cchTextMax);\r
                break;\r
        case this->LOGLIST_DATE: //Date\r
-               if (pLogEntry)\r
+               if (pLogEntry && pLogEntry->m_CommitHash != GIT_REV_ZERO)\r
                        lstrcpyn(pItem->pszText,\r
                                CAppUtils::FormatDateAndTime( pLogEntry->m_AuthorDate, m_DateFormat, true, m_bRelativeTimes ), \r
                                pItem->cchTextMax);\r
@@ -1044,7 +1257,7 @@ void CGitLogListBase::OnContextMenu(CWnd* pWnd, CPoint point)
        {\r
 \r
                if(m_ContextMenuMask&GetContextMenuBit(ID_REBASE_PICK))\r
-                       popup.AppendMenuIcon(ID_REBASE_PICK,  IDS_REBASE_SKIP,   IDI_PICK);\r
+                       popup.AppendMenuIcon(ID_REBASE_PICK,  IDS_REBASE_PICK,   IDI_PICK);\r
 \r
                if(m_ContextMenuMask&GetContextMenuBit(ID_REBASE_SQUASH))\r
                        popup.AppendMenuIcon(ID_REBASE_SQUASH,IDS_REBASE_SQUASH, IDI_SQUASH);\r
@@ -1061,8 +1274,9 @@ void CGitLogListBase::OnContextMenu(CWnd* pWnd, CPoint point)
 \r
                if (GetSelectedCount() == 1)\r
                {\r
+                       \r
                        {\r
-                               if (m_hasWC)\r
+                               if(pSelLogEntry->m_CommitHash != GIT_REV_ZERO)\r
                                {\r
                                        if(m_ContextMenuMask&GetContextMenuBit(ID_COMPARE))\r
                                                popup.AppendMenuIcon(ID_COMPARE, IDS_LOG_POPUP_COMPARE, IDI_DIFF);\r
@@ -1073,6 +1287,10 @@ void CGitLogListBase::OnContextMenu(CWnd* pWnd, CPoint point)
                                        // But until that's implemented, the context menu entry for\r
                                        // this feature is commented out.\r
                                        //popup.AppendMenu(ID_BLAMECOMPARE, IDS_LOG_POPUP_BLAMECOMPARE, IDI_BLAME);\r
+                               }else\r
+                               {\r
+                                       if(m_ContextMenuMask&GetContextMenuBit(ID_COMMIT))\r
+                                               popup.AppendMenuIcon(ID_COMMIT, IDS_LOG_POPUP_COMMIT, IDI_COMMIT);\r
                                }\r
                                if(m_ContextMenuMask&GetContextMenuBit(ID_GNUDIFF1))\r
                                        popup.AppendMenuIcon(ID_GNUDIFF1, IDS_LOG_POPUP_GNUDIFF_CH, IDI_DIFF);\r
@@ -1108,30 +1326,33 @@ void CGitLogListBase::OnContextMenu(CWnd* pWnd, CPoint point)
                        format.LoadString(IDS_RESET_TO_THIS_FORMAT);\r
                        str.Format(format,g_Git.GetCurrentBranch());\r
 \r
-                       if(m_ContextMenuMask&GetContextMenuBit(ID_RESET))\r
-                               popup.AppendMenuIcon(ID_RESET,str,IDI_REVERT);\r
+                       if(pSelLogEntry->m_CommitHash != GIT_REV_ZERO)\r
+                       {\r
+                               if(m_ContextMenuMask&GetContextMenuBit(ID_RESET))\r
+                                       popup.AppendMenuIcon(ID_RESET,str,IDI_REVERT);\r
 \r
-                       if(m_ContextMenuMask&GetContextMenuBit(ID_SWITCHTOREV))\r
-                               popup.AppendMenuIcon(ID_SWITCHTOREV, IDS_SWITCH_TO_THIS , IDI_SWITCH);\r
+                               if(m_ContextMenuMask&GetContextMenuBit(ID_SWITCHTOREV))\r
+                                       popup.AppendMenuIcon(ID_SWITCHTOREV, IDS_SWITCH_TO_THIS , IDI_SWITCH);\r
 \r
-                       if(m_ContextMenuMask&GetContextMenuBit(ID_CREATE_BRANCH))\r
-                               popup.AppendMenuIcon(ID_CREATE_BRANCH, IDS_CREATE_BRANCH_AT_THIS , IDI_COPY);\r
+                               if(m_ContextMenuMask&GetContextMenuBit(ID_CREATE_BRANCH))\r
+                                       popup.AppendMenuIcon(ID_CREATE_BRANCH, IDS_CREATE_BRANCH_AT_THIS , IDI_COPY);\r
 \r
-                       if(m_ContextMenuMask&GetContextMenuBit(ID_CREATE_TAG))\r
-                               popup.AppendMenuIcon(ID_CREATE_TAG,IDS_CREATE_TAG_AT_THIS , IDI_COPY);\r
+                               if(m_ContextMenuMask&GetContextMenuBit(ID_CREATE_TAG))\r
+                                       popup.AppendMenuIcon(ID_CREATE_TAG,IDS_CREATE_TAG_AT_THIS , IDI_COPY);\r
                        \r
-                       format.LoadString(IDS_REBASE_THIS_FORMAT);\r
-                       str.Format(format,g_Git.GetCurrentBranch());\r
+                               format.LoadString(IDS_REBASE_THIS_FORMAT);\r
+                               str.Format(format,g_Git.GetCurrentBranch());\r
 \r
-                       if(pSelLogEntry->m_CommitHash != m_HeadHash)\r
-                               if(m_ContextMenuMask&GetContextMenuBit(ID_REBASE_TO_VERSION))\r
-                                       popup.AppendMenuIcon(ID_REBASE_TO_VERSION, str , IDI_REBASE);                   \r
+                               if(pSelLogEntry->m_CommitHash != m_HeadHash)\r
+                                       if(m_ContextMenuMask&GetContextMenuBit(ID_REBASE_TO_VERSION))\r
+                                               popup.AppendMenuIcon(ID_REBASE_TO_VERSION, str , IDI_REBASE);                   \r
 \r
-                       if(m_ContextMenuMask&GetContextMenuBit(ID_EXPORT))\r
-                               popup.AppendMenuIcon(ID_EXPORT,IDS_EXPORT_TO_THIS, IDI_EXPORT); \r
+                               if(m_ContextMenuMask&GetContextMenuBit(ID_EXPORT))\r
+                                       popup.AppendMenuIcon(ID_EXPORT,IDS_EXPORT_TO_THIS, IDI_EXPORT); \r
                        \r
 \r
-                       popup.AppendMenu(MF_SEPARATOR, NULL);\r
+                               popup.AppendMenu(MF_SEPARATOR, NULL);\r
+                       }\r
 \r
                }\r
 \r
@@ -1170,7 +1391,7 @@ void CGitLogListBase::OnContextMenu(CWnd* pWnd, CPoint point)
                                popup.AppendMenu(MF_SEPARATOR, NULL);\r
                }\r
 \r
-               if ( GetSelectedCount() >0 )\r
+               if ( GetSelectedCount() >0 && pSelLogEntry->m_CommitHash != GIT_REV_ZERO)\r
                {\r
                        if ( IsSelectionContinuous() && GetSelectedCount() >= 2 )\r
                        {\r
@@ -1193,7 +1414,7 @@ void CGitLogListBase::OnContextMenu(CWnd* pWnd, CPoint point)
                        if(m_ContextMenuMask&GetContextMenuBit(ID_CHERRY_PICK))\r
                                popup.AppendMenuIcon(ID_CHERRY_PICK, IDS_CHERRY_PICK_VERSION, IDI_EXPORT);\r
 \r
-                       if(GetSelectedCount()<=2)\r
+                       if(GetSelectedCount()<=2 || (IsSelectionContinuous() && GetSelectedCount() > 0))\r
                                if(m_ContextMenuMask&GetContextMenuBit(ID_CREATE_PATCH))\r
                                        popup.AppendMenuIcon(ID_CREATE_PATCH, IDS_CREATE_PATCH, IDI_PATCH);\r
                        \r
@@ -1540,20 +1761,29 @@ int CGitLogListBase::FillGitShortLog()
        mask = CGit::LOG_INFO_ONLY_HASH | CGit::LOG_INFO_BOUNDARY;\r
 //     if(this->m_bAllBranch)\r
        mask |= m_ShowMask;\r
-\r
-       this->m_logEntries.FetchShortLog(path,m_StartRef,-1,mask);\r
        \r
+       if(m_bShowWC)\r
+               this->m_logEntries.insert(m_logEntries.begin(),this->m_wcRev);\r
+\r
+       this->m_logEntries.FetchShortLog(path,m_StartRef,-1,mask,m_bShowWC?1:0);\r
+\r
        //this->m_logEntries.ParserFromLog();\r
        if(IsInWorkingThread())\r
+       {\r
                PostMessage(LVM_SETITEMCOUNT, (WPARAM) this->m_logEntries.size(),(LPARAM) LVSICF_NOINVALIDATEALL);\r
+       }\r
        else\r
+       {\r
                SetItemCountEx(this->m_logEntries.size());\r
+       }\r
 \r
        this->m_arShownList.RemoveAll();\r
 \r
        for(unsigned int i=0;i<m_logEntries.size();i++)\r
        {\r
-               m_logEntries[i].m_Subject=_T("parser...");\r
+               if(i>0 || m_logEntries[i].m_CommitHash != GIT_REV_ZERO)\r
+                       m_logEntries[i].m_Subject=_T("parser...");\r
+\r
                if(this->m_IsOldFirst)\r
                {\r
                        this->m_arShownList.Add(&m_logEntries[m_logEntries.size()-1-i]);\r
@@ -1761,6 +1991,7 @@ void CGitLogListBase::FetchFullLogInfo(CString &from, CString &to)
 {\r
        CGitCall_FetchFullLogInfo fetcher(this);\r
        int mask=\r
+               CGit::LOG_INFO_FULL_DIFF|\r
                CGit::LOG_INFO_STAT|\r
                CGit::LOG_INFO_FILESTATE|\r
                CGit::LOG_INFO_DETECT_COPYRENAME|\r
@@ -1846,6 +2077,21 @@ UINT CGitLogListBase::LogThread()
        int update=0;\r
        for(int i=0;i<m_logEntries.size();i++)\r
        {\r
+               if( i==0 && m_logEntries[i].m_CommitHash == GIT_REV_ZERO)\r
+               {\r
+                       m_logEntries[i].m_Files.Clear();\r
+                       m_logEntries[i].m_ParentHash.clear();\r
+                       m_logEntries[i].m_ParentHash.push_back(m_HeadHash);\r
+                       g_Git.GetCommitDiffList(m_logEntries[i].m_CommitHash,this->m_HeadHash,m_logEntries[i].m_Files);\r
+                       m_logEntries[i].m_Action =0;\r
+                       for(int j=0;j< m_logEntries[i].m_Files.GetCount();j++)\r
+                               m_logEntries[i].m_Action |= m_logEntries[i].m_Files[j].m_Action;\r
+                       \r
+                       m_logEntries[i].m_Body.Format(_T("%d files changed"),m_logEntries[i].m_Files.GetCount());\r
+                       ::PostMessage(m_hWnd,MSG_LOADED,(WPARAM)0,0);\r
+                       continue;\r
+               }\r
+\r
                start=this->m_logEntries[i].ParserFromLog(m_logEntries.m_RawlogData,start);\r
                m_logEntries.m_HashMap[m_logEntries[i].m_CommitHash]=i;\r
 \r
@@ -1861,6 +2107,8 @@ UINT CGitLogListBase::LogThread()
                        InterlockedExchange(&m_logEntries[i].m_IsFull,TRUE);\r
                        update++;\r
                }\r
+               ::PostMessage(m_hWnd,MSG_LOADED,(WPARAM) i, 0);\r
+\r
                if(start<0)\r
                        break;\r
                if(start>=m_logEntries.m_RawlogData.size())\r
@@ -1869,7 +2117,6 @@ UINT CGitLogListBase::LogThread()
                int percent=i*30/m_logEntries.size() + GITLOG_START+1;\r
 \r
                ::PostMessage(GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) percent, 0);\r
-               ::PostMessage(m_hWnd,MSG_LOADED,(WPARAM) i, 0);\r
 \r
                if(this->m_bExitThread)\r
                {       \r
@@ -1932,7 +2179,8 @@ void CGitLogListBase::Refresh()
                if(ret == WAIT_TIMEOUT)\r
                        TerminateThread();\r
        }\r
-\r
+       \r
+       this->SetItemCountEx(0);\r
        this->Clear();\r
 \r
        //Update branch and Tag info\r
@@ -1940,7 +2188,7 @@ void CGitLogListBase::Refresh()
        //Assume Thread have exited\r
        //if(!m_bThreadRunning)\r
        {\r
-               this->SetItemCountEx(0);\r
+               \r
                m_logEntries.clear();\r
                m_bExitThread=FALSE;\r
                InterlockedExchange(&m_bThreadRunning, TRUE);\r
@@ -2258,6 +2506,11 @@ LRESULT CGitLogListBase::OnLoad(WPARAM wParam,LPARAM lParam)
        int i=(int)wParam;\r
        this->GetItemRect(i,&rect,LVIR_BOUNDS);\r
        this->InvalidateRect(rect);\r
+\r
+       if(this->GetItemState(i,LVIF_STATE) & LVIS_SELECTED)\r
+       {\r
+               int i=0;\r
+       }\r
        return 0;\r
 }\r
 \r