, m_pStoreSelection(NULL)\r
, m_nSelectedFilter(LOGFILTER_ALL)\r
, m_bVista(false)\r
+ , m_bShowWC(false)\r
+ , m_logEntries(&m_LogCache)\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
\r
m_IsIDReplaceAction=FALSE;\r
\r
- m_wcRev.m_CommitHash=GIT_REV_ZERO;\r
- m_wcRev.m_Subject=_T("Working Copy");\r
+ m_wcRev.m_CommitHash.Empty();\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
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
\r
\r
if (data->m_Lanes.size() == 0)\r
- m_logEntries.setLane(data->m_CommitHash);\r
+ m_logEntries.setLane(data->m_CommitHash.ToString());\r
\r
std::vector<int>& lanes=data->m_Lanes;\r
UINT laneNum = lanes.size();\r
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
\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.IsEmpty())\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
\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.IsEmpty())\r
+ DrawGraph(pLVCD->nmcd.hdc,rect,pLVCD->nmcd.dwItemSpec);\r
\r
*pResult = CDRF_SKIPDEFAULT;\r
return;\r
return;\r
\r
}\r
- }\r
+\r
+ } \r
}\r
\r
if (pLVCD->iSubItem == 1)\r
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.IsEmpty())\r
lstrcpyn(pItem->pszText,\r
CAppUtils::FormatDateAndTime( pLogEntry->m_AuthorDate, m_DateFormat, true, m_bRelativeTimes ), \r
pItem->cchTextMax);\r
\r
if (GetSelectedCount() == 1)\r
{\r
+ \r
{\r
- //if (m_hasWC)\r
+ if( !pSelLogEntry->m_CommitHash.IsEmpty())\r
{\r
if(m_ContextMenuMask&GetContextMenuBit(ID_COMPARE))\r
popup.AppendMenuIcon(ID_COMPARE, IDS_LOG_POPUP_COMPARE, IDI_DIFF);\r
// 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
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.IsEmpty())\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
popup.AppendMenu(MF_SEPARATOR, NULL);\r
}\r
\r
- if ( GetSelectedCount() >0 )\r
+ if ( GetSelectedCount() >0 && (!pSelLogEntry->m_CommitHash.IsEmpty()))\r
{\r
if ( IsSelectionContinuous() && GetSelectedCount() >= 2 )\r
{\r
{\r
if(m_IsOldFirst)\r
{\r
- m_logEntries[m_logEntries.size()-i-1].m_IsFull=TRUE;\r
+ m_logEntries.GetGitRevAt(m_logEntries.size()-i-1).m_IsFull=TRUE;\r
this->m_arShownList.Add(&m_logEntries[m_logEntries.size()-i-1]);\r
\r
}else\r
{\r
- m_logEntries[i].m_IsFull=TRUE;\r
+ m_logEntries.GetGitRevAt(i).m_IsFull=TRUE;\r
this->m_arShownList.Add(&m_logEntries[i]);\r
}\r
}\r
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.m_CommitHash);\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.GetGitRevAt(i).m_CommitHash.IsEmpty())\r
+ m_logEntries.GetGitRevAt(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
latest=CTime(1971,1,2,0,0,0);\r
for(unsigned int i=0;i<m_logEntries.size();i++)\r
{\r
- if(m_logEntries[i].m_AuthorDate.GetTime() < oldest.GetTime())\r
- oldest = m_logEntries[i].m_AuthorDate.GetTime();\r
+ if(m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime() < oldest.GetTime())\r
+ oldest = m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime();\r
\r
- if(m_logEntries[i].m_AuthorDate.GetTime() > latest.GetTime())\r
- latest = m_logEntries[i].m_AuthorDate.GetTime();\r
+ if(m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime() > latest.GetTime())\r
+ latest = m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime();\r
\r
}\r
}\r
}\r
//Set updating\r
int rev=itRev->second;\r
- GitRev* revInVector=&m_ploglist->m_logEntries[rev];\r
+ GitRev* revInVector=&m_ploglist->m_logEntries.GetGitRevAt(rev);\r
\r
\r
if(revInVector->m_IsFull)\r
return;\r
\r
- if(!m_ploglist->m_LogCache.GetCacheData(m_ploglist->m_logEntries[rev]))\r
+ if(!m_ploglist->m_LogCache.GetCacheData(m_ploglist->m_logEntries.GetGitRevAt(rev)))\r
{\r
++m_CollectedCount;\r
- InterlockedExchange(&m_ploglist->m_logEntries[rev].m_IsUpdateing,FALSE);\r
- InterlockedExchange(&m_ploglist->m_logEntries[rev].m_IsFull,TRUE);\r
+ InterlockedExchange(&m_ploglist->m_logEntries.GetGitRevAt(rev).m_IsUpdateing,FALSE);\r
+ InterlockedExchange(&m_ploglist->m_logEntries.GetGitRevAt(rev).m_IsFull,TRUE);\r
::PostMessage(m_ploglist->m_hWnd,MSG_LOADED,(WPARAM)rev,0);\r
return;\r
}\r
{\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
{\r
for(unsigned int i=0;i<m_logEntries.size();i++)\r
{\r
- if(m_logEntries[i].m_IsFull)\r
+ if(m_logEntries.GetGitRevAt(i).m_IsFull)\r
continue;\r
\r
- if(m_LogCache.GetCacheData(m_logEntries[i]))\r
+ if(m_LogCache.GetCacheData(m_logEntries.GetGitRevAt(i)))\r
{\r
if(!m_logEntries.FetchFullInfo(i))\r
{\r
updated++;\r
}\r
- m_LogCache.AddCacheEntry(m_logEntries[i]);\r
+ m_LogCache.AddCacheEntry(m_logEntries.GetGitRevAt(i));\r
\r
}else\r
{\r
updated++;\r
- InterlockedExchange(&m_logEntries[i].m_IsUpdateing,FALSE);\r
- InterlockedExchange(&m_logEntries[i].m_IsFull,TRUE);\r
+ InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsUpdateing,FALSE);\r
+ InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsFull,TRUE);\r
}\r
\r
::PostMessage(m_hWnd,MSG_LOADED,(WPARAM)i,0);\r
int update=0;\r
for(int i=0;i<m_logEntries.size();i++)\r
{\r
- start=this->m_logEntries[i].ParserFromLog(m_logEntries.m_RawlogData,start);\r
+ if( i==0 && m_logEntries.GetGitRevAt(i).m_CommitHash.IsEmpty() )\r
+ {\r
+ m_logEntries.GetGitRevAt(i).m_Files.Clear();\r
+ m_logEntries.GetGitRevAt(i).m_ParentHash.clear();\r
+ m_logEntries.GetGitRevAt(i).m_ParentHash.push_back(m_HeadHash);\r
+ g_Git.GetCommitDiffList(m_logEntries.GetGitRevAt(i).m_CommitHash,this->m_HeadHash,m_logEntries.GetGitRevAt(i).m_Files);\r
+ m_logEntries.GetGitRevAt(i).m_Action =0;\r
+ for(int j=0;j< m_logEntries.GetGitRevAt(i).m_Files.GetCount();j++)\r
+ m_logEntries.GetGitRevAt(i).m_Action |= m_logEntries.GetGitRevAt(i).m_Files[j].m_Action;\r
+ \r
+ m_logEntries.GetGitRevAt(i).m_Body.Format(_T("%d files changed"),m_logEntries.GetGitRevAt(i).m_Files.GetCount());\r
+ ::PostMessage(m_hWnd,MSG_LOADED,(WPARAM)0,0);\r
+ continue;\r
+ }\r
+\r
+ start=this->m_logEntries.GetGitRevAt(i).ParserFromLog(m_logEntries.m_RawlogData,start);\r
m_logEntries.m_HashMap[m_logEntries[i].m_CommitHash]=i;\r
\r
- if(m_LogCache.GetCacheData(m_logEntries[i]))\r
+ if(m_LogCache.GetCacheData(m_logEntries.GetGitRevAt(i)))\r
{\r
if(firstcommit.IsEmpty())\r
firstcommit=m_logEntries[i].m_CommitHash;\r
\r
}else\r
{\r
- InterlockedExchange(&m_logEntries[i].m_IsUpdateing,FALSE);\r
- InterlockedExchange(&m_logEntries[i].m_IsFull,TRUE);\r
+ InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsUpdateing,FALSE);\r
+ InterlockedExchange(&m_logEntries.GetGitRevAt(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
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
if(ret == WAIT_TIMEOUT)\r
TerminateThread();\r
}\r
-\r
+ \r
+ this->SetItemCountEx(0);\r
this->Clear();\r
\r
//Update branch and Tag info\r
//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
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