m_hAddedIcon = (HICON)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ACTIONADDED), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);\r
m_hDeletedIcon = (HICON)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ACTIONDELETED), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);\r
\r
-\r
+ g_Git.GetMapHashToFriendName(m_HashMap);\r
}\r
\r
CGitLogList::~CGitLogList()\r
}\r
\r
}\r
+BOOL CGitLogList::GetShortName(CString ref, CString &shortname,CString prefix)\r
+{\r
+ if(ref.Left(prefix.GetLength()) == prefix)\r
+ {\r
+ shortname = ref.Right(ref.GetLength()-prefix.GetLength());\r
+ return TRUE;\r
+ }\r
+ return FALSE;\r
+}\r
+void CGitLogList::FillBackGround(HDC hdc, int Index,CRect &rect)\r
+{ \r
+ HBRUSH brush;\r
+ LVITEM rItem;\r
+ SecureZeroMemory(&rItem, sizeof(LVITEM));\r
+ rItem.mask = LVIF_STATE;\r
+ rItem.iItem = Index;\r
+ rItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED;\r
+ GetItem(&rItem);\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
+ if (::GetFocus() == m_hWnd)\r
+ state |= LISS_SELECTED;\r
+ else\r
+ state |= LISS_SELECTEDNOTFOCUS;\r
+ }\r
+ else\r
+ {\r
+#if 0\r
+ if (pLogEntry->bCopiedSelf)\r
+ {\r
+ // unfortunately, the pLVCD->nmcd.uItemState does not contain valid\r
+ // information at this drawing stage. But we can check the whether the\r
+ // previous stage changed the background color of the item\r
+ if (pLVCD->clrTextBk == GetSysColor(COLOR_MENU))\r
+ {\r
+ HBRUSH brush;\r
+ brush = ::CreateSolidBrush(::GetSysColor(COLOR_MENU));\r
+ if (brush)\r
+ {\r
+ ::FillRect(pLVCD->nmcd.hdc, &rect, brush);\r
+ ::DeleteObject(brush);\r
+ }\r
+ }\r
+ }\r
+#endif\r
+ }\r
+\r
+ if (m_Theme.IsBackgroundPartiallyTransparent(LVP_LISTDETAIL, state))\r
+ m_Theme.DrawParentBackground(m_hWnd, hdc, &rect);\r
+\r
+ m_Theme.DrawBackground(hdc, LVP_LISTDETAIL, state, &rect, NULL);\r
+ }\r
+ else\r
+ {\r
+ HBRUSH brush;\r
+ if (rItem.state & LVIS_SELECTED)\r
+ {\r
+ if (::GetFocus() == m_hWnd)\r
+ brush = ::CreateSolidBrush(::GetSysColor(COLOR_HIGHLIGHT));\r
+ else\r
+ brush = ::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE));\r
+ }\r
+ else\r
+ {\r
+ //if (pLogEntry->bCopiedSelf)\r
+ // brush = ::CreateSolidBrush(::GetSysColor(COLOR_MENU));\r
+ //else\r
+ brush = ::CreateSolidBrush(::GetSysColor(COLOR_WINDOW));\r
+ }\r
+ if (brush == NULL)\r
+ return;\r
+\r
+ ::FillRect(hdc, &rect, brush);\r
+ ::DeleteObject(brush);\r
+ \r
+ }\r
+}\r
+\r
+void CGitLogList::DrawTagBranch(HDC hdc,CRect &rect,INT_PTR index)\r
+{\r
+ GitRev* data = (GitRev*)m_arShownList.GetAt(index);\r
+ CRect rt=rect;\r
+ for(int i=0;i<m_HashMap[data->m_CommitHash].size();i++)\r
+ {\r
+ CString str;\r
+ str=m_HashMap[data->m_CommitHash][i];\r
+ \r
+ CString shortname;\r
+ HBRUSH brush=0;\r
+ shortname=_T("");\r
+ if(GetShortName(str,shortname,_T("refs/heads/")))\r
+ {\r
+ brush = ::CreateSolidBrush(RGB(0xff, 0, 0));\r
+ }else if(GetShortName(str,shortname,_T("refs/remotes/")))\r
+ {\r
+ brush = ::CreateSolidBrush(RGB(0xff, 0xff, 0));\r
+ }\r
+ else if(GetShortName(str,shortname,_T("refs/tags/")))\r
+ {\r
+ brush = ::CreateSolidBrush(RGB(0, 0, 0xff));\r
+ }\r
\r
+ if(!shortname.IsEmpty())\r
+ {\r
+ SIZE size;\r
+ memset(&size,0,sizeof(SIZE));\r
+ GetTextExtentPoint32(hdc, shortname,shortname.GetLength(),&size);\r
+ \r
+ rt.SetRect(rt.left,rt.top,rt.left+size.cx,rt.bottom);\r
+ \r
+ ::FillRect(hdc, &rt, brush);\r
+ ::DrawText(hdc,shortname,shortname.GetLength(),&rt,DT_CENTER);\r
+ \r
+ rt.left=rt.right+3;\r
+ }\r
+ if(brush)\r
+ ::DeleteObject(brush);\r
+ } \r
+ rt.right=rect.right;\r
+ ::DrawText(hdc,data->m_Subject,data->m_Subject.GetLength(),&rt,DT_LEFT);\r
+ \r
+}\r
\r
void CGitLogList::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)\r
{\r
{\r
pLVCD->nmcd.uItemState &= ~(CDIS_SELECTED|CDIS_FOCUS);\r
}\r
+ if (pLVCD->iSubItem == LOGLIST_MESSAGE)\r
+ {\r
+ if (m_arShownList.GetCount() > (INT_PTR)pLVCD->nmcd.dwItemSpec)\r
+ {\r
+ GitRev* data = (GitRev*)m_arShownList.GetAt(pLVCD->nmcd.dwItemSpec);\r
+ if(m_HashMap[data->m_CommitHash].size()!=0)\r
+ {\r
+ CRect rect;\r
+ GetSubItemRect(pLVCD->nmcd.dwItemSpec, pLVCD->iSubItem, LVIR_BOUNDS, rect);\r
+ \r
+ FillBackGround(pLVCD->nmcd.hdc, (INT_PTR)pLVCD->nmcd.dwItemSpec,rect);\r
+ DrawTagBranch(pLVCD->nmcd.hdc,rect,pLVCD->nmcd.dwItemSpec);\r
+\r
+ *pResult = CDRF_SKIPDEFAULT;\r
+ return;\r
+\r
+ }\r
+ }\r
+ }\r
if (pLVCD->iSubItem == 1)\r
{\r
*pResult = CDRF_DODEFAULT;\r
int iconheight = ::GetSystemMetrics(SM_CYSMICON);\r
\r
GitRev* pLogEntry = reinterpret_cast<GitRev *>(m_arShownList.GetAt(pLVCD->nmcd.dwItemSpec));\r
-\r
- // Get the selected state of the\r
- // item being drawn.\r
- LVITEM rItem;\r
- SecureZeroMemory(&rItem, sizeof(LVITEM));\r
- rItem.mask = LVIF_STATE;\r
- rItem.iItem = pLVCD->nmcd.dwItemSpec;\r
- rItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED;\r
- GetItem(&rItem);\r
-\r
CRect rect;\r
GetSubItemRect(pLVCD->nmcd.dwItemSpec, pLVCD->iSubItem, LVIR_BOUNDS, rect);\r
+ // Get the selected state of the\r
+ // item being drawn. \r
\r
// Fill the background\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
- if (::GetFocus() == m_hWnd)\r
- state |= LISS_SELECTED;\r
- else\r
- state |= LISS_SELECTEDNOTFOCUS;\r
- }\r
- else\r
- {\r
-#if 0\r
- if (pLogEntry->bCopiedSelf)\r
- {\r
- // unfortunately, the pLVCD->nmcd.uItemState does not contain valid\r
- // information at this drawing stage. But we can check the whether the\r
- // previous stage changed the background color of the item\r
- if (pLVCD->clrTextBk == GetSysColor(COLOR_MENU))\r
- {\r
- HBRUSH brush;\r
- brush = ::CreateSolidBrush(::GetSysColor(COLOR_MENU));\r
- if (brush)\r
- {\r
- ::FillRect(pLVCD->nmcd.hdc, &rect, brush);\r
- ::DeleteObject(brush);\r
- }\r
- }\r
- }\r
-#endif\r
- }\r
-\r
- if (m_Theme.IsBackgroundPartiallyTransparent(LVP_LISTDETAIL, state))\r
- m_Theme.DrawParentBackground(m_hWnd, pLVCD->nmcd.hdc, &rect);\r
-\r
- m_Theme.DrawBackground(pLVCD->nmcd.hdc, LVP_LISTDETAIL, state, &rect, NULL);\r
- }\r
- else\r
- {\r
- HBRUSH brush;\r
- if (rItem.state & LVIS_SELECTED)\r
- {\r
- if (::GetFocus() == m_hWnd)\r
- brush = ::CreateSolidBrush(::GetSysColor(COLOR_HIGHLIGHT));\r
- else\r
- brush = ::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE));\r
- }\r
- else\r
- {\r
- //if (pLogEntry->bCopiedSelf)\r
- // brush = ::CreateSolidBrush(::GetSysColor(COLOR_MENU));\r
- //else\r
- brush = ::CreateSolidBrush(::GetSysColor(COLOR_WINDOW));\r
- }\r
- if (brush == NULL)\r
- return;\r
-\r
- ::FillRect(pLVCD->nmcd.hdc, &rect, brush);\r
- ::DeleteObject(brush);\r
- }\r
-\r
+ FillBackGround(pLVCD->nmcd.hdc, (INT_PTR)pLVCD->nmcd.dwItemSpec,rect);\r
+ \r
// Draw the icon(s) into the compatible DC\r
if (pLogEntry->m_Action & CTGitPath::LOGACTIONS_MODIFIED)\r
::DrawIconEx(pLVCD->nmcd.hdc, rect.left + ICONITEMBORDER, rect.top, m_hModifiedIcon, iconwidth, iconheight, 0, NULL, DI_NORMAL);\r