OSDN Git Service

Logview: Make use of XP themes in list ctrl
authorJohan 't Hart <johanthart@gmail.com>
Sun, 14 Jun 2009 23:09:51 +0000 (01:09 +0200)
committerJohan 't Hart <johanthart@gmail.com>
Tue, 16 Jun 2009 21:51:08 +0000 (23:51 +0200)
src/TortoiseProc/GitLogListBase.cpp

index 51ba5d7..1760744 100644 (file)
@@ -196,7 +196,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
@@ -323,6 +325,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
@@ -334,12 +337,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
@@ -354,19 +356,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
@@ -449,14 +458,26 @@ void CGitLogListBase::DrawTagBranch(HDC hdc,CRect &rect,INT_PTR index)
                        rt.SetRect(rt.left,rt.top,rt.left+size.cx,rt.bottom);\r
                        rt.right+=4;\r
                        ::FillRect(hdc, &rt, brush);\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,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
@@ -473,16 +494,26 @@ void CGitLogListBase::DrawTagBranch(HDC hdc,CRect &rect,INT_PTR index)
        }               \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