, m_hAccel(NULL)\r
{\r
m_bFilterWithRegex = !!CRegDWORD(_T("Software\\TortoiseGit\\UseRegexFilter"), TRUE);\r
- m_bAllBranch=FALSE;\r
+\r
+ CString str;\r
+ str=g_Git.m_CurrentDir;\r
+ str.Replace(_T(":"),_T("_"));\r
+ str=CString(_T("Software\\TortoiseGit\\LogDialog\\AllBranch\\"))+str;\r
+ \r
+ m_regbAllBranch=CRegDWORD(str,FALSE);\r
+\r
+ m_bAllBranch=m_regbAllBranch;\r
+\r
m_bFirstParent=FALSE;\r
m_bWholeProject=FALSE;\r
}\r
\r
CLogDlg::~CLogDlg()\r
{\r
- \r
+\r
+ m_regbAllBranch=m_bAllBranch;\r
+\r
m_CurrentFilteredChangedArray.RemoveAll();\r
\r
}\r
AddAnchor(IDCANCEL, BOTTOM_RIGHT);\r
AddAnchor(IDHELP, BOTTOM_RIGHT);\r
\r
+ if(this->m_bAllBranch)\r
+ m_LogList.m_ShowMask|=CGit::LOG_INFO_ALL_BRANCH;\r
+ else\r
+ m_LogList.m_ShowMask&=~CGit::LOG_INFO_ALL_BRANCH;\r
+\r
// SetPromptParentWindow(m_hWnd);\r
\r
if (hWndExplorer)\r
//m_tFrom = (DWORD)-1;\r
\r
m_LogList.m_Path=m_path;\r
+ m_LogList.m_bShowWC = true;\r
m_LogList.FetchLogAsync(this);\r
\r
GetDlgItem(IDC_LOGLIST)->SetFocus();\r
//DialogEnableWindow(IDC_SHOWWHOLEPROJECT, FALSE);\r
//DialogEnableWindow(IDC_LOG_FIRSTPARENT, FALSE);\r
DialogEnableWindow(IDC_STATBUTTON, FALSE);\r
- DialogEnableWindow(IDC_REFRESH, FALSE);\r
+ //DialogEnableWindow(IDC_REFRESH, FALSE);\r
DialogEnableWindow(IDC_HIDEPATHS,FALSE);\r
\r
+ DialogEnableWindow(IDC_DATEFROM,FALSE);\r
+ DialogEnableWindow(IDC_DATETO,FALSE);\r
+\r
+ DialogEnableWindow(IDC_SEARCHEDIT,FALSE);\r
+\r
}else if( cur == GITLOG_END)\r
{\r
\r
+ if(this->m_LogList.HasText())\r
+ {\r
+ this->m_LogList.ClearText();\r
+ \r
+ }\r
+ UpdateLogInfoLabel();\r
+\r
+\r
//if (!m_bShowedAll)\r
DialogEnableWindow(IDC_SHOWWHOLEPROJECT, TRUE);\r
\r
DialogEnableWindow(IDC_REFRESH, TRUE);\r
DialogEnableWindow(IDC_HIDEPATHS,TRUE);\r
\r
+ DialogEnableWindow(IDC_DATEFROM,TRUE);\r
+ DialogEnableWindow(IDC_DATETO,TRUE);\r
+\r
+ DialogEnableWindow(IDC_SEARCHEDIT,TRUE);\r
+\r
// PostMessage(WM_TIMER, LOGFILTER_TIMER);\r
GetDlgItem(IDC_PROGRESS)->ShowWindow(FALSE);\r
//CTime time=m_LogList.GetOldestTime();\r
m_LogList.GetTimeRange(begin,end);\r
m_DateFrom.SetTime(&begin);\r
m_DateTo.SetTime(&end);\r
- \r
- \r
- \r
+\r
+\r
}else\r
{\r
if(this->m_LogList.HasText())\r
{\r
this->m_LogList.ClearText();\r
- UpdateLogInfoLabel();\r
+ this->m_LogList.Invalidate();\r
}\r
+ UpdateLogInfoLabel();\r
m_LogProgress.SetPos(cur);\r
}\r
return 0;\r
// and also populate the changed files list control\r
// according to the selected revision(s).\r
\r
- CWnd * pMsgView = GetDlgItem(IDC_MSGVIEW);\r
+ CRichEditCtrl * pMsgView = (CRichEditCtrl*)GetDlgItem(IDC_MSGVIEW);\r
// empty the log message view\r
pMsgView->SetWindowText(_T(" "));\r
// empty the changed files list\r
}else\r
{\r
// set the log message text\r
- pMsgView->SetWindowText(_T("Commit:")+pLogEntry->m_CommitHash+_T("\r\n\r\n* ")+pLogEntry->m_Subject+_T("\n\n")+pLogEntry->m_Body);\r
+ pMsgView->SetWindowText(_T("Commit:")+pLogEntry->m_CommitHash.ToString()+_T("\r\n\r\n"));\r
// turn bug ID's into links if the bugtraq: properties have been set\r
// and we can find a match of those in the log message\r
+ \r
+ pMsgView->SetSel(-1,-1);\r
+ CHARFORMAT2 format;\r
+ SecureZeroMemory(&format, sizeof(CHARFORMAT2));\r
+ format.cbSize = sizeof(CHARFORMAT2);\r
+ format.dwMask = CFM_BOLD;\r
+ format.dwEffects = CFE_BOLD;\r
+ pMsgView->SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&format);\r
+ \r
+ CString msg=_T("* ");\r
+ msg+=pLogEntry->m_Subject;\r
+ pMsgView->ReplaceSel(msg);\r
+\r
+ pMsgView->SetSel(-1,-1);\r
+ format.dwEffects = 0;\r
+ pMsgView->SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&format);\r
+ \r
+ msg=_T("\n\n");\r
+ msg+=pLogEntry->m_Body;\r
+ pMsgView->ReplaceSel(msg);\r
\r
CString text;\r
pMsgView->GetWindowText(text);\r
\r
void CLogDlg::OnBnClickedRefresh()\r
{\r
- m_limit = 0;\r
+ \r
Refresh (true);\r
}\r
\r
void CLogDlg::Refresh (bool /*autoGoOnline*/)\r
{\r
+ m_limit = 0;\r
m_LogList.Refresh();\r
+ FillLogMessageCtrl(false);\r
}\r
\r
\r
file1.Format(_T("%s%s_%s%s"),\r
temppath, \r
(*m_currentChangedArray)[selIndex].GetBaseFilename(),\r
- rev1->m_CommitHash.Left(6),\r
+ rev1->m_CommitHash.ToString().Left(6),\r
(*m_currentChangedArray)[selIndex].GetFileExtension());\r
\r
CString file2;\r
file2.Format(_T("%s\\%s_%s%s"),\r
temppath, \r
(*m_currentChangedArray)[selIndex].GetBaseFilename(),\r
- rev2->m_CommitHash.Left(6),\r
+ rev2->m_CommitHash.ToString().Left(6),\r
(*m_currentChangedArray)[selIndex].GetFileExtension());\r
\r
CString cmd;\r
*pResult = 0;\r
}\r
\r
+class CDateSorter\r
+{\r
+public:\r
+ class CCommitPointer\r
+ {\r
+ public:\r
+ CCommitPointer():m_cont(NULL){}\r
+ CCommitPointer(const CCommitPointer& P_Right)\r
+ : m_cont(NULL)\r
+ {\r
+ *this = P_Right;\r
+ }\r
+\r
+ CCommitPointer& operator = (const CCommitPointer& P_Right)\r
+ {\r
+ if(IsPointer())\r
+ {\r
+ (*m_cont->m_parDates)[m_place] = P_Right.GetDate();\r
+ (*m_cont->m_parFileChanges)[m_place] = P_Right.GetChanges();\r
+ (*m_cont->m_parAuthors)[m_place] = P_Right.GetAuthor();\r
+ }\r
+ else \r
+ {\r
+ m_Date = P_Right.GetDate();\r
+ m_Changes = P_Right.GetChanges();\r
+ m_csAuthor = P_Right.GetAuthor();\r
+ }\r
+ return *this;\r
+ }\r
+\r
+ void Clone(const CCommitPointer& P_Right)\r
+ {\r
+ m_cont = P_Right.m_cont;\r
+ m_place = P_Right.m_place;\r
+ m_Date = P_Right.m_Date;\r
+ m_Changes = P_Right.m_Changes;\r
+ m_csAuthor = P_Right.m_csAuthor;\r
+ }\r
+\r
+ DWORD GetDate() const {return IsPointer() ? (*m_cont->m_parDates)[m_place] : m_Date;}\r
+ DWORD GetChanges() const {return IsPointer() ? (*m_cont->m_parFileChanges)[m_place] : m_Changes;}\r
+ CString GetAuthor() const {return IsPointer() ? (*m_cont->m_parAuthors)[m_place] : m_csAuthor;}\r
+\r
+ bool IsPointer() const {return m_cont != NULL;}\r
+ //When pointer\r
+ CDateSorter* m_cont;\r
+ int m_place;\r
+\r
+ //When element\r
+ DWORD m_Date;\r
+ DWORD m_Changes;\r
+ CString m_csAuthor;\r
+\r
+ };\r
+ class iterator : public std::iterator<std::random_access_iterator_tag, CCommitPointer>\r
+ {\r
+ public:\r
+ CCommitPointer m_ptr;\r
+\r
+ iterator(){}\r
+ iterator(const iterator& P_Right){*this = P_Right;}\r
+ iterator& operator=(const iterator& P_Right)\r
+ {\r
+ m_ptr.Clone(P_Right.m_ptr);\r
+ return *this;\r
+ }\r
+\r
+ CCommitPointer& operator*(){return m_ptr;}\r
+ CCommitPointer* operator->(){return &m_ptr;}\r
+ const CCommitPointer& operator*()const{return m_ptr;}\r
+ const CCommitPointer* operator->()const{return &m_ptr;}\r
+\r
+ iterator& operator+=(size_t P_iOffset){m_ptr.m_place += P_iOffset;return *this;}\r
+ iterator& operator-=(size_t P_iOffset){m_ptr.m_place -= P_iOffset;return *this;}\r
+ iterator operator+(size_t P_iOffset)const{iterator it(*this); it += P_iOffset;return it;}\r
+ iterator operator-(size_t P_iOffset)const{iterator it(*this); it -= P_iOffset;return it;}\r
+\r
+ iterator& operator++(){++m_ptr.m_place;return *this;}\r
+ iterator& operator--(){--m_ptr.m_place;return *this;}\r
+ iterator operator++(int){iterator it(*this);++*this;return it;}\r
+ iterator operator--(int){iterator it(*this);--*this;return it;}\r
+\r
+ size_t operator-(const iterator& P_itRight)const{return m_ptr.m_place - P_itRight->m_place;}\r
+\r
+ bool operator<(const iterator& P_itRight)const{return m_ptr.m_place < P_itRight->m_place;}\r
+ bool operator!=(const iterator& P_itRight)const{return m_ptr.m_place != P_itRight->m_place;}\r
+ bool operator==(const iterator& P_itRight)const{return m_ptr.m_place == P_itRight->m_place;}\r
+ bool operator>(const iterator& P_itRight)const{return m_ptr.m_place > P_itRight->m_place;}\r
+ };\r
+ iterator begin()\r
+ {\r
+ iterator it;\r
+ it->m_place = 0;\r
+ it->m_cont = this;\r
+ return it;\r
+ }\r
+ iterator end()\r
+ {\r
+ iterator it;\r
+ it->m_place = m_parDates->GetCount();\r
+ it->m_cont = this;\r
+ return it;\r
+ }\r
+\r
+ CDWordArray * m_parDates;\r
+ CDWordArray * m_parFileChanges;\r
+ CStringArray * m_parAuthors;\r
+};\r
+\r
+class CDateSorterLess\r
+{\r
+public:\r
+ bool operator () (const CDateSorter::CCommitPointer& P_Left, const CDateSorter::CCommitPointer& P_Right) const\r
+ {\r
+ return P_Left.GetDate() > P_Right.GetDate(); //Last date first\r
+ }\r
+\r
+};\r
+\r
+\r
+\r
void CLogDlg::OnBnClickedStatbutton()\r
{\r
\r
m_arDatesFiltered.Add(pLogEntry->m_AuthorDate.GetTime());\r
m_arFileChangesFiltered.Add(pLogEntry->m_Files.GetCount());\r
}\r
+\r
+ CDateSorter W_Sorter;\r
+ W_Sorter.m_parAuthors = &m_arAuthorsFiltered;\r
+ W_Sorter.m_parDates = &m_arDatesFiltered;\r
+ W_Sorter.m_parFileChanges = &m_arFileChangesFiltered;\r
+ std::sort(W_Sorter.begin(), W_Sorter.end(), CDateSorterLess());\r
+\r
CStatGraphDlg dlg;\r
dlg.m_parAuthors = &m_arAuthorsFiltered;\r
dlg.m_parDates = &m_arDatesFiltered;\r
{\r
if (this->IsThreadRunning())\r
return; //no sorting while the arrays are filled\r
+#if 0\r
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);\r
const int nColumn = pNMLV->iSubItem;\r
m_bAscending = nColumn == m_nSortColumn ? !m_bAscending : TRUE;\r
SortShownListArray();\r
m_LogList.Invalidate();\r
UpdateLogInfoLabel();\r
- \r
+#endif\r
*pResult = 0;\r
}\r
\r
void CLogDlg::UpdateLogInfoLabel()\r
{\r
\r
- git_revnum_t rev1 ;\r
- git_revnum_t rev2 ;\r
+ CGitHash rev1 ;\r
+ CGitHash rev2 ;\r
long selectedrevs = 0;\r
int count =m_LogList.m_arShownList.GetCount();\r
+ int start = 0;\r
if (count)\r
{\r
rev1 = (reinterpret_cast<GitRev*>(m_LogList.m_arShownList.GetAt(0)))->m_CommitHash;\r
+ if(this->m_LogList.m_bShowWC && rev1.IsEmpty())\r
+ start = 1;\r
+ rev1 = (reinterpret_cast<GitRev*>(m_LogList.m_arShownList.GetAt(start)))->m_CommitHash;\r
//pLogEntry = reinterpret_cast<PLOGENTRYDATA>(m_arShownList.GetAt(m_arShownList.GetCount()-1));\r
rev2 = (reinterpret_cast<GitRev*>(m_LogList.m_arShownList.GetAt(count-1)))->m_CommitHash;\r
selectedrevs = m_LogList.GetSelectedCount();\r
}\r
CString sTemp;\r
- sTemp.Format(_T("Showing %ld revision(s), from revision %s to revision %s - %ld revision(s) selected"), count, rev2.Left(6), rev1.Left(6), selectedrevs);\r
+ sTemp.Format(_T("Showing %ld revision(s), from revision %s to revision %s - %ld revision(s) selected"), \r
+ count - start,\r
+ rev2.ToString().Left(6), rev1.ToString().Left(6), selectedrevs);\r
+\r
m_sLogInfo = sTemp;\r
\r
UpdateData(FALSE);\r
if(showStartRef.IsEmpty())\r
{\r
//Ref name is HEAD\r
- g_Git.Run(L"git symbolic-ref HEAD",&showStartRef,CP_UTF8);\r
+ if( g_Git.Run(L"git symbolic-ref HEAD",&showStartRef,CP_UTF8) )\r
+ showStartRef = _T("<No branch>");\r
showStartRef.Trim(L"\r\n\t ");\r
}\r
\r