//#include "RepositoryInfo.h"\r
//#include "EditPropertiesDlg.h"\r
#include "FileDiffDlg.h"\r
-\r
+#include "BrowseRefsDlg.h"\r
\r
const UINT CLogDlg::m_FindDialogMessage = RegisterWindowMessage(FINDMSGSTRING);\r
\r
, m_maxChild(0)\r
, m_bIncludeMerges(FALSE)\r
, m_hAccel(NULL)\r
- , m_bVista(false)\r
{\r
m_bFilterWithRegex = !!CRegDWORD(_T("Software\\TortoiseGit\\UseRegexFilter"), TRUE);\r
m_bAllBranch=FALSE;\r
DDX_Check(pDX, IDC_LOG_ALLBRANCH,m_bAllBranch);\r
DDX_Check(pDX, IDC_SHOWWHOLEPROJECT,m_bWholeProject);\r
DDX_Control(pDX, IDC_SEARCHEDIT, m_cFilter);\r
+ DDX_Control(pDX, IDC_STATIC_REF, m_staticRef);\r
}\r
\r
BEGIN_MESSAGE_MAP(CLogDlg, CResizableStandAloneDialog)\r
ON_WM_SIZE()\r
ON_BN_CLICKED(IDC_LOG_FIRSTPARENT, &CLogDlg::OnBnClickedFirstParent)\r
ON_BN_CLICKED(IDC_REFRESH, &CLogDlg::OnBnClickedRefresh)\r
+// ON_BN_CLICKED(IDC_BUTTON_BROWSE_REF, &CLogDlg::OnBnClickedBrowseRef)\r
+ ON_STN_CLICKED(IDC_STATIC_REF, &CLogDlg::OnBnClickedBrowseRef)\r
ON_COMMAND(ID_LOGDLG_REFRESH,&CLogDlg::OnRefresh)\r
ON_COMMAND(ID_LOGDLG_FIND,&CLogDlg::OnFind)\r
ON_COMMAND(ID_LOGDLG_FOCUSFILTER,&CLogDlg::OnFocusFilter)\r
\r
m_hAccel = LoadAccelerators(AfxGetResourceHandle(),MAKEINTRESOURCE(IDR_ACC_LOGDLG));\r
\r
- OSVERSIONINFOEX inf;\r
- SecureZeroMemory(&inf, sizeof(OSVERSIONINFOEX));\r
- inf.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);\r
- GetVersionEx((OSVERSIONINFO *)&inf);\r
- WORD fullver = MAKEWORD(inf.dwMinorVersion, inf.dwMajorVersion);\r
- m_bVista = (fullver >= 0x0600);\r
\r
// use the state of the "stop on copy/rename" option from the last time\r
UpdateData(FALSE);\r
m_LogList.DeleteAllItems();\r
m_LogList.InsertGitColumn();\r
\r
- m_ChangedFileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |IDS_STATUSLIST_COLADD|IDS_STATUSLIST_COLDEL , _T("LogDlg"),(SVNSLC_POPALL ^ SVNSLC_POPCOMMIT),false);\r
+ m_ChangedFileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |SVNSLC_COLADD|SVNSLC_COLDEL , _T("LogDlg"),(SVNSLC_POPALL ^ (SVNSLC_POPCOMMIT|SVNSLC_POPREVERT)),false);\r
\r
GetDlgItem(IDC_LOGLIST)->UpdateData(FALSE);\r
\r
m_DateFrom.SendMessage(DTM_SETMCSTYLE, 0, MCS_WEEKNUMBERS|MCS_NOTODAY|MCS_NOTRAILINGDATES|MCS_NOSELCHANGEONNAV);\r
m_DateTo.SendMessage(DTM_SETMCSTYLE, 0, MCS_WEEKNUMBERS|MCS_NOTODAY|MCS_NOTRAILINGDATES|MCS_NOSELCHANGEONNAV);\r
\r
+ m_staticRef.SetURL(CString());\r
+\r
// resizable stuff\r
+ AddAnchor(IDC_STATIC_REF, TOP_LEFT);\r
+ //AddAnchor(IDC_BUTTON_BROWSE_REF, TOP_LEFT);\r
AddAnchor(IDC_FROMLABEL, TOP_LEFT);\r
AddAnchor(IDC_DATEFROM, TOP_LEFT);\r
AddAnchor(IDC_TOLABEL, TOP_LEFT);\r
if (m_bSelect)\r
{\r
// the dialog is used to select revisions\r
- if (m_bSelectionMustBeContinuous)\r
- DialogEnableWindow(IDOK, (m_LogList.GetSelectedCount()!=0)&&(m_LogList.IsSelectionContinuous()));\r
- else\r
- DialogEnableWindow(IDOK, m_LogList.GetSelectedCount()!=0);\r
+ // enable the OK button if appropriate\r
+ EnableOKButton();\r
}\r
else\r
{\r
// the dialog is used to just view log messages\r
+ // hide the OK button and set text on Cancel button to OK\r
GetDlgItemText(IDOK, temp);\r
SetDlgItemText(IDCANCEL, temp);\r
GetDlgItem(IDOK)->ShowWindow(SW_HIDE);\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
+\r
+ ShowStartRef();\r
return FALSE;\r
}\r
\r
-LRESULT CLogDlg::OnLogListLoading(WPARAM wParam, LPARAM lParam)\r
+LRESULT CLogDlg::OnLogListLoading(WPARAM wParam, LPARAM /*lParam*/)\r
{\r
int cur=(int)wParam;\r
\r
\r
this->m_LogList.ShowText(temp, true);\r
\r
- // change the text of the close button to "Cancel" since now the thread\r
- // is running, and simply closing the dialog doesn't work.\r
- if (!GetDlgItem(IDOK)->IsWindowVisible())\r
- {\r
- temp.LoadString(IDS_MSGBOX_CANCEL);\r
- SetDlgItemText(IDCANCEL, temp);\r
- }\r
-\r
// We use a progress bar while getting the logs \r
m_LogProgress.SetRange32(0, 100);\r
m_LogProgress.SetPos(0);\r
DialogEnableWindow(IDC_STATBUTTON, FALSE);\r
DialogEnableWindow(IDC_REFRESH, FALSE);\r
DialogEnableWindow(IDC_HIDEPATHS,FALSE);\r
+ \r
\r
}else if( cur == GITLOG_END)\r
{\r
\r
+ if(this->m_LogList.HasText())\r
+ {\r
+ this->m_LogList.ClearText();\r
+ //UpdateLogInfoLabel();\r
+ }\r
+\r
+#if 0\r
//if (!m_bShowedAll)\r
DialogEnableWindow(IDC_SHOWWHOLEPROJECT, TRUE);\r
\r
m_LogList.GetTimeRange(begin,end);\r
m_DateFrom.SetTime(&begin);\r
m_DateTo.SetTime(&end);\r
- \r
- \r
- \r
+#endif\r
+\r
}else\r
{\r
if(this->m_LogList.HasText())\r
if (m_bSelect)\r
{\r
// the dialog is used to select revisions\r
- if (m_bSelectionMustBeContinuous)\r
+ if (m_bSelectionMustBeSingle)\r
+ {\r
+ // enable OK button if only a single revision is selected\r
+ DialogEnableWindow(IDOK, (m_LogList.GetSelectedCount()==1));\r
+ }\r
+ else if (m_bSelectionMustBeContinuous)\r
DialogEnableWindow(IDOK, (m_LogList.GetSelectedCount()!=0)&&(m_LogList.IsSelectionContinuous()));\r
else\r
DialogEnableWindow(IDOK, m_LogList.GetSelectedCount()!=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
- m_ProjectProperties.FindBugID(pLogEntry->m_Body, pMsgView);\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
+ // the rich edit control doesn't count the CR char!\r
+ // to be exact: CRLF is treated as one char.\r
+ text.Replace(_T("\r"), _T(""));\r
+\r
+ m_ProjectProperties.FindBugID(text, pMsgView);\r
CAppUtils::FormatTextInRichEditControl(pMsgView);\r
\r
int HidePaths=m_cHidePaths.GetState() & 0x0003;\r
\r
void CLogDlg::OnBnClickedRefresh()\r
{\r
- m_limit = 0;\r
+ \r
Refresh (true);\r
}\r
\r
-void CLogDlg::Refresh (bool autoGoOnline)\r
+void CLogDlg::Refresh (bool /*autoGoOnline*/)\r
{\r
+ m_limit = 0;\r
m_LogList.Refresh();\r
+ FillLogMessageCtrl(false);\r
}\r
\r
\r
void CLogDlg::OnCancel()\r
{\r
// canceling means stopping the working thread if it's still running.\r
- // we do this by using the Subversion cancel callback.\r
- // But canceling can also mean just to close the dialog, depending on the\r
- // text shown on the cancel button (it could simply read "OK").\r
- CString temp, temp2;\r
- GetDlgItemText(IDOK, temp);\r
- temp2.LoadString(IDS_MSGBOX_CANCEL);\r
- if ((temp.Compare(temp2)==0)||(this->IsThreadRunning()))\r
- {\r
- //m_bCancelled = true;\r
- //return;\r
- if(m_LogList.m_bThreadRunning)\r
- {\r
- //m_LogList.m_bExitThread=true;\r
- //WaitForSingleObject(m_LogList.m_LoadingThread->m_hThread,INFINITE);\r
- m_LogList.TerminateThread();\r
- }\r
-\r
- //m_LogList.TerminateThread();\r
+ if (this->IsThreadRunning())\r
+ {\r
+ m_LogList.TerminateThread();\r
}\r
UpdateData();\r
\r
return sShortMessage;\r
}\r
\r
-BOOL CLogDlg::Log(git_revnum_t rev, const CString& author, const CString& date, const CString& message, LogChangedPathArray * cpaths, int filechanges, BOOL copies, DWORD actions, BOOL haschildren)\r
+BOOL CLogDlg::Log(git_revnum_t /*rev*/, const CString& /*author*/, const CString& /*date*/, const CString& /*message*/, LogChangedPathArray * /*cpaths*/, int /*filechanges*/, BOOL /*copies*/, DWORD /*actions*/, BOOL /*haschildren*/)\r
{\r
#if 0\r
if (rev == SVN_INVALID_REVNUM)\r
\r
void CLogDlg::CopyChangedSelectionToClipBoard()\r
{\r
-#if 0\r
+\r
POSITION pos = m_LogList.GetFirstSelectedItemPosition();\r
if (pos == NULL)\r
return; // nothing is selected, get out of here\r
\r
CString sPaths;\r
\r
- PLOGENTRYDATA pLogEntry = reinterpret_cast<PLOGENTRYDATA>(m_arShownList.GetAt(m_LogList.GetNextSelectedItem(pos)));\r
- if (pos)\r
+// CGitRev* pLogEntry = reinterpret_cast<CGitRev* >(m_LogList.m_arShownList.GetAt(m_LogList.GetNextSelectedItem(pos)));\r
+// if (pos)\r
{\r
POSITION pos = m_ChangedFileListCtrl.GetFirstSelectedItemPosition();\r
while (pos)\r
{\r
int nItem = m_ChangedFileListCtrl.GetNextSelectedItem(pos);\r
- sPaths += m_currentChangedPathList[nItem].GetGitPathString();\r
+ CTGitPath *path = (CTGitPath*)m_ChangedFileListCtrl.GetItemData(nItem);\r
+ if(path)\r
+ sPaths += path->GetGitPathString();\r
sPaths += _T("\r\n");\r
}\r
}\r
+#if 0\r
else\r
{\r
// only one revision is selected in the log dialog top pane\r
}\r
}\r
}\r
+#endif\r
sPaths.Trim();\r
CStringUtils::WriteAsciiStringToClipboard(sPaths, GetSafeHwnd());\r
-#endif\r
+\r
}\r
\r
-BOOL CLogDlg::IsDiffPossible(LogChangedPath * changedpath, git_revnum_t rev)\r
+BOOL CLogDlg::IsDiffPossible(LogChangedPath * /*changedpath*/, git_revnum_t rev)\r
{\r
#if 0\r
CString added, deleted;\r
\r
void CLogDlg::OnOK()\r
{\r
-#if 0 \r
// since the log dialog is also used to select revisions for other\r
// dialogs, we have to do some work before closing this dialog\r
if (GetFocus() != GetDlgItem(IDOK))\r
return; // if the "OK" button doesn't have the focus, do nothing: this prevents closing the dialog when pressing enter\r
+\r
+ \r
+ if (this->IsThreadRunning())\r
+ {\r
+ m_LogList.TerminateThread();\r
+ }\r
+ UpdateData();\r
+ // check that one and only one row is selected\r
+ if (m_LogList.GetSelectedCount() == 1)\r
+ {\r
+ // get the selected row\r
+ POSITION pos = m_LogList.GetFirstSelectedItemPosition();\r
+ int selIndex = m_LogList.GetNextSelectedItem(pos);\r
+ if (selIndex < m_LogList.m_arShownList.GetCount())\r
+ {\r
+ // all ok, pick up the revision\r
+ GitRev* pLogEntry = reinterpret_cast<GitRev *>(m_LogList.m_arShownList.GetAt(selIndex));\r
+ // extract the hash\r
+ m_sSelectedHash = pLogEntry->m_CommitHash;\r
+ }\r
+ }\r
+ UpdateData(FALSE);\r
+ SaveSplitterPos();\r
+ __super::OnOK();\r
+ \r
+ #if 0 \r
if (!GetDlgItem(IDOK)->IsWindowVisible() && GetFocus() != GetDlgItem(IDCANCEL))\r
return; // the Cancel button works as the OK button. But if the cancel button has not the focus, do nothing.\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
EnableOKButton();\r
}\r
\r
-BOOL CLogDlg::Open(bool bOpenWith,CString changedpath, git_revnum_t rev)\r
+BOOL CLogDlg::Open(bool /*bOpenWith*/,CString changedpath, git_revnum_t rev)\r
{\r
#if 0\r
DialogEnableWindow(IDOK, FALSE);\r
return TRUE;\r
}\r
\r
-void CLogDlg::EditAuthor(const CLogDataVector& logs)\r
+void CLogDlg::EditAuthor(const CLogDataVector& /*logs*/)\r
{\r
#if 0\r
CString url;\r
#endif\r
}\r
\r
-void CLogDlg::EditLogMessage(int index)\r
+void CLogDlg::EditLogMessage(int /*index*/)\r
{\r
#if 0\r
CString url;\r
EnableOKButton();\r
#endif\r
}\r
-#if 0\r
+\r
BOOL CLogDlg::PreTranslateMessage(MSG* pMsg)\r
{\r
// Skip Ctrl-C when copying text out of the log message or search filter\r
{\r
if (CRegDWORD(_T("Software\\TortoiseGit\\DiffByDoubleClickInLog"), FALSE))\r
{\r
- DiffSelectedRevWithPrevious();\r
+ m_LogList.DiffSelectedRevWithPrevious();\r
return TRUE;\r
}\r
}\r
return TRUE;\r
}\r
\r
- m_tooltips.RelayEvent(pMsg);\r
+ if(::IsWindow(m_tooltips.m_hWnd))\r
+ m_tooltips.RelayEvent(pMsg);\r
return __super::PreTranslateMessage(pMsg);\r
}\r
-#endif\r
+\r
\r
BOOL CLogDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)\r
{\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
}\r
\r
-#if 0\r
-void CLogDlg::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)\r
-{\r
-\r
- NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );\r
- // Take the default processing unless we set this to something else below.\r
- *pResult = CDRF_DODEFAULT;\r
-\r
- if (m_bNoDispUpdates)\r
- return;\r
-\r
- switch (pLVCD->nmcd.dwDrawStage)\r
- {\r
- case CDDS_PREPAINT:\r
- {\r
- *pResult = CDRF_NOTIFYITEMDRAW;\r
- return;\r
- }\r
- break;\r
- case CDDS_ITEMPREPAINT:\r
- {\r
- // This is the prepaint stage for an item. Here's where we set the\r
- // item's text color. \r
- \r
- // Tell Windows to send draw notifications for each subitem.\r
- *pResult = CDRF_NOTIFYSUBITEMDRAW;\r
-\r
- COLORREF crText = GetSysColor(COLOR_WINDOWTEXT);\r
-\r
- if (m_arShownList.GetCount() > (INT_PTR)pLVCD->nmcd.dwItemSpec)\r
- {\r
- GitRev* data = (GitRev*)m_arShownList.GetAt(pLVCD->nmcd.dwItemSpec);\r
- if (data)\r
- {\r
-#if 0\r
- if (data->bCopiedSelf)\r
- {\r
- // only change the background color if the item is not 'hot' (on vista with themes enabled)\r
- if (!theme.IsAppThemed() || !m_bVista || ((pLVCD->nmcd.uItemState & CDIS_HOT)==0))\r
- pLVCD->clrTextBk = GetSysColor(COLOR_MENU);\r
- }\r
-\r
- if (data->bCopies)\r
- crText = m_Colors.GetColor(CColors::Modified);\r
-#endif\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
- // 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
- }\r
- }\r
- if (m_arShownList.GetCount() == (INT_PTR)pLVCD->nmcd.dwItemSpec)\r
- {\r
- if (m_bStrictStopped)\r
- crText = GetSysColor(COLOR_GRAYTEXT);\r
- }\r
- // Store the color back in the NMLVCUSTOMDRAW struct.\r
- pLVCD->clrText = crText;\r
- return;\r
- }\r
- break;\r
- case CDDS_ITEMPREPAINT|CDDS_ITEM|CDDS_SUBITEM:\r
- {\r
- if ((m_bStrictStopped)&&(m_arShownList.GetCount() == (INT_PTR)pLVCD->nmcd.dwItemSpec))\r
- {\r
- pLVCD->nmcd.uItemState &= ~(CDIS_SELECTED|CDIS_FOCUS);\r
- }\r
- if (pLVCD->iSubItem == 1)\r
- {\r
- *pResult = CDRF_DODEFAULT;\r
-\r
- if (m_arShownList.GetCount() <= (INT_PTR)pLVCD->nmcd.dwItemSpec)\r
- return;\r
-\r
- int nIcons = 0;\r
- int iconwidth = ::GetSystemMetrics(SM_CXSMICON);\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
- m_LogList.GetItem(&rItem);\r
-\r
- CRect rect;\r
- m_LogList.GetSubItemRect(pLVCD->nmcd.dwItemSpec, pLVCD->iSubItem, LVIR_BOUNDS, rect);\r
-\r
- // Fill the background\r
- if (theme.IsAppThemed() && m_bVista)\r
- {\r
- theme.Open(m_hWnd, L"Explorer");\r
- int state = LISS_NORMAL;\r
- if (rItem.state & LVIS_SELECTED)\r
- {\r
- if (::GetFocus() == m_LogList.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 (theme.IsBackgroundPartiallyTransparent(LVP_LISTDETAIL, state))\r
- theme.DrawParentBackground(m_hWnd, pLVCD->nmcd.hdc, &rect);\r
-\r
- 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_LogList.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
- // 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
- nIcons++;\r
-\r
- if (pLogEntry->m_Action & CTGitPath::LOGACTIONS_ADDED)\r
- ::DrawIconEx(pLVCD->nmcd.hdc, rect.left+nIcons*iconwidth + ICONITEMBORDER, rect.top, m_hAddedIcon, iconwidth, iconheight, 0, NULL, DI_NORMAL);\r
- nIcons++;\r
-\r
- if (pLogEntry->m_Action & CTGitPath::LOGACTIONS_DELETED)\r
- ::DrawIconEx(pLVCD->nmcd.hdc, rect.left+nIcons*iconwidth + ICONITEMBORDER, rect.top, m_hDeletedIcon, iconwidth, iconheight, 0, NULL, DI_NORMAL);\r
- nIcons++;\r
-\r
- if (pLogEntry->m_Action & CTGitPath::LOGACTIONS_REPLACED)\r
- ::DrawIconEx(pLVCD->nmcd.hdc, rect.left+nIcons*iconwidth + ICONITEMBORDER, rect.top, m_hReplacedIcon, iconwidth, iconheight, 0, NULL, DI_NORMAL);\r
- nIcons++;\r
- *pResult = CDRF_SKIPDEFAULT;\r
- return;\r
- }\r
- }\r
- break;\r
- }\r
- *pResult = CDRF_DODEFAULT;\r
-\r
-}\r
-#endif\r
-\r
-void CLogDlg::OnNMCustomdrawChangedFileList(NMHDR *pNMHDR, LRESULT *pResult)\r
-{\r
-\r
- NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );\r
- // Take the default processing unless we set this to something else below.\r
- *pResult = CDRF_DODEFAULT;\r
-\r
-// if (m_bNoDispUpdates)\r
-// return;\r
-\r
- // First thing - check the draw stage. If it's the control's prepaint\r
- // stage, then tell Windows we want messages for every item.\r
-\r
- if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )\r
- {\r
- *pResult = CDRF_NOTIFYITEMDRAW;\r
- }\r
- else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )\r
- {\r
- // This is the prepaint stage for an item. Here's where we set the\r
- // item's text color. Our return value will tell Windows to draw the\r
- // item itself, but it will use the new color we set here.\r
-\r
- // Tell Windows to paint the control itself.\r
- *pResult = CDRF_DODEFAULT;\r
-\r
- COLORREF crText = GetSysColor(COLOR_WINDOWTEXT);\r
- bool bGrayed = false;\r
-#if 0\r
- if ((m_cHidePaths.GetState() & 0x0003)==BST_INDETERMINATE)\r
- {\r
- if ((m_currentChangedArray)&&((m_currentChangedArray->GetCount() > (INT_PTR)pLVCD->nmcd.dwItemSpec)))\r
- {\r
- //if ((*m_currentChangedArray)[(pLVCD->nmcd.dwItemSpec)]sPath.Left(m_sRelativeRoot.GetLength()).Compare(m_sRelativeRoot)!=0)\r
- {\r
- crText = GetSysColor(COLOR_GRAYTEXT);\r
- bGrayed = true;\r
- }\r
- }\r
- else if (m_currentChangedPathList.GetCount() > (INT_PTR)pLVCD->nmcd.dwItemSpec)\r
- {\r
- //if (m_currentChangedPathList[pLVCD->nmcd.dwItemSpec].GetGitPathString().Left(m_sRelativeRoot.GetLength()).Compare(m_sRelativeRoot)!=0)\r
- {\r
- crText = GetSysColor(COLOR_GRAYTEXT);\r
- bGrayed = true;\r
- }\r
- }\r
- }\r
-\r
-#endif\r
- if ((!bGrayed)&&(m_currentChangedArray)&&(m_currentChangedArray->GetCount() > (INT_PTR)pLVCD->nmcd.dwItemSpec))\r
- {\r
- DWORD action = ((*m_currentChangedArray)[pLVCD->nmcd.dwItemSpec]).m_Action;\r
- if (action == CTGitPath::LOGACTIONS_MODIFIED)\r
- crText = m_Colors.GetColor(CColors::Modified);\r
- if (action == CTGitPath::LOGACTIONS_REPLACED)\r
- crText = m_Colors.GetColor(CColors::Deleted);\r
- if (action == CTGitPath::LOGACTIONS_ADDED)\r
- crText = m_Colors.GetColor(CColors::Added);\r
- if (action == CTGitPath::LOGACTIONS_DELETED)\r
- crText = m_Colors.GetColor(CColors::Deleted);\r
- }\r
-\r
- // Store the color back in the NMLVCUSTOMDRAW struct.\r
- pLVCD->clrText = crText;\r
- }\r
-}\r
-\r
void CLogDlg::DoSizeV1(int delta)\r
{\r
\r
\r
LRESULT CLogDlg::OnClickedInfoIcon(WPARAM /*wParam*/, LPARAM lParam)\r
{\r
+ // FIXME: x64 version would get this function called with unexpected parameters.\r
+ if (!lParam)\r
+ return 0;\r
+\r
RECT * rect = (LPRECT)lParam;\r
CPoint point;\r
CString temp;\r
\r
\r
\r
-CTGitPathList CLogDlg::GetChangedPathsFromSelectedRevisions(bool bRelativePaths /* = false */, bool bUseFilter /* = true */)\r
+CTGitPathList CLogDlg::GetChangedPathsFromSelectedRevisions(bool /*bRelativePaths*/ /* = false */, bool /*bUseFilter*/ /* = true */)\r
{\r
CTGitPathList pathList;\r
#if 0\r
return pathList;\r
}\r
\r
-void CLogDlg::SortByColumn(int nSortColumn, bool bAscending)\r
+void CLogDlg::SortByColumn(int /*nSortColumn*/, bool /*bAscending*/)\r
{\r
#if 0\r
switch(nSortColumn)\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
pHeader->SetItem(nColumn, &HeaderItem);\r
}\r
}\r
-void CLogDlg::OnLvnColumnclickChangedFileList(NMHDR *pNMHDR, LRESULT *pResult)\r
+void CLogDlg::OnLvnColumnclickChangedFileList(NMHDR* /*pNMHDR*/, LRESULT* /*pResult*/)\r
{\r
#if 0\r
if (this->IsThreadRunning())\r
int CLogDlg::m_nSortColumnPathList = 0;\r
bool CLogDlg::m_bAscendingPathList = false;\r
\r
-int CLogDlg::SortCompare(const void * pElem1, const void * pElem2)\r
+int CLogDlg::SortCompare(const void * /*pElem1*/, const void * /*pElem2*/)\r
{\r
#if 0\r
LogChangedPath * cpath1 = *((LogChangedPath**)pElem1);\r
void CLogDlg::OnRefresh()\r
{\r
//if (GetDlgItem(IDC_GETALL)->IsWindowEnabled())\r
+ ShowStartRef();\r
{\r
m_limit = 0;\r
this->m_LogProgress.SetPos(0);\r
FillLogMessageCtrl(false);\r
}\r
\r
+void CLogDlg::OnBnClickedBrowseRef()\r
+{\r
+ CString newRef = CBrowseRefsDlg::PickRef(false,m_LogList.GetStartRef()); \r
+ if(newRef.IsEmpty())\r
+ return;\r
+\r
+ SetStartRef(newRef);\r
+ ((CButton*)GetDlgItem(IDC_LOG_ALLBRANCH))->SetCheck(0);\r
+\r
+ OnBnClickedAllBranch();\r
+}\r
+\r
+void CLogDlg::ShowStartRef()\r
+{\r
+ //Show ref name on top\r
+ if(!::IsWindow(m_hWnd))\r
+ return;\r
+ if(m_bAllBranch)\r
+ {\r
+ m_staticRef.SetWindowText(L"<All Branches>");\r
+ m_staticRef.Invalidate(TRUE);\r
+ return;\r
+ }\r
+\r
+ CString showStartRef = m_LogList.GetStartRef();\r
+ if(showStartRef.IsEmpty())\r
+ {\r
+ //Ref name is HEAD\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
+\r
+ if(wcsncmp(showStartRef,L"refs/",5) == 0)\r
+ showStartRef = showStartRef.Mid(5);\r
+ if(wcsncmp(showStartRef,L"heads/",6) == 0)\r
+ showStartRef = showStartRef.Mid(6);\r
+\r
+ m_staticRef.SetWindowText(showStartRef);\r
+ m_staticRef.Invalidate(TRUE);\r
+}\r
+\r
+void CLogDlg::SetStartRef(const CString& StartRef)\r
+{\r
+ m_LogList.SetStartRef(StartRef);\r
+\r
+ ShowStartRef();\r
+}\r
+\r
+\r
\r
void CLogDlg::OnBnClickedFirstParent()\r
{\r
\r
FillLogMessageCtrl(false);\r
\r
-}
\ No newline at end of file
+}\r