// TortoiseGit - a Windows shell extension for easy version control\r
-\r
// Copyright (C) 2003-2008 - TortoiseGit\r
-\r
// This program is free software; you can redistribute it and/or\r
// modify it under the terms of the GNU General Public License\r
// as published by the Free Software Foundation; either version 2\r
// of the License, or (at your option) any later version.\r
-\r
// This program is distributed in the hope that it will be useful,\r
// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
#include "ProgressDlg.h"\r
//#include "RepositoryBrowser.h"\r
//#include "CopyDlg.h"\r
-//#include "StatGraphDlg.h"\r
+#include "StatGraphDlg.h"\r
#include "Logdlg.h"\r
#include "MessageBox.h"\r
#include "Registry.h"\r
//#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
\r
-\r
-\r
IMPLEMENT_DYNAMIC(CLogDlg, CResizableStandAloneDialog)\r
CLogDlg::CLogDlg(CWnd* pParent /*=NULL*/)\r
: CResizableStandAloneDialog(CLogDlg::IDD, pParent)\r
, m_logcounter(0)\r
, m_nSearchIndex(0)\r
, m_wParam(0)\r
- , m_nSelectedFilter(LOGFILTER_ALL)\r
- , m_bNoDispUpdates(FALSE)\r
, m_currentChangedArray(NULL)\r
, m_nSortColumn(0)\r
, m_bShowedAll(false)\r
, m_bSelect(false)\r
- , m_regLastStrict(_T("Software\\TortoiseGit\\LastLogStrict"), FALSE)\r
- , m_regMaxBugIDColWidth(_T("Software\\TortoiseGit\\MaxBugIDColWidth"), 200)\r
+ \r
, m_bSelectionMustBeContinuous(false)\r
, m_bShowBugtraqColumn(false)\r
, m_lowestRev(_T(""))\r
- , m_bStrictStopped(false)\r
+ \r
, m_sLogInfo(_T(""))\r
, m_pFindDialog(NULL)\r
, m_bCancelled(FALSE)\r
, m_pNotifyWindow(NULL)\r
- , m_bThreadRunning(FALSE)\r
+ \r
, m_bAscending(FALSE)\r
- , m_pStoreSelection(NULL)\r
+\r
, m_limit(0)\r
, m_childCounter(0)\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
- // use the default GUI font, create a copy of it and\r
- // change the copy to BOLD (leave the rest of the font\r
- // the same)\r
- HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);\r
- LOGFONT lf = {0};\r
- GetObject(hFont, sizeof(LOGFONT), &lf);\r
- lf.lfWeight = FW_BOLD;\r
- m_boldFont = CreateFontIndirect(&lf);\r
+ m_bAllBranch=FALSE;\r
+ m_bFirstParent=FALSE;\r
+ m_bWholeProject=FALSE;\r
}\r
\r
CLogDlg::~CLogDlg()\r
{\r
- InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
+ \r
m_CurrentFilteredChangedArray.RemoveAll();\r
- m_logEntries.ClearAll();\r
-\r
- if ( m_pStoreSelection )\r
- {\r
- delete m_pStoreSelection;\r
- m_pStoreSelection = NULL;\r
- }\r
- if (m_boldFont)\r
- DeleteObject(m_boldFont);\r
+ \r
}\r
\r
void CLogDlg::DoDataExchange(CDataExchange* pDX)\r
DDX_Control(pDX, IDC_PROGRESS, m_LogProgress);\r
DDX_Control(pDX, IDC_SPLITTERTOP, m_wndSplitter1);\r
DDX_Control(pDX, IDC_SPLITTERBOTTOM, m_wndSplitter2);\r
- DDX_Check(pDX, IDC_CHECK_STOPONCOPY, m_bStrict);\r
- DDX_Text(pDX, IDC_SEARCHEDIT, m_sFilterText);\r
+ DDX_Text(pDX, IDC_SEARCHEDIT, m_LogList.m_sFilterText);\r
DDX_Control(pDX, IDC_DATEFROM, m_DateFrom);\r
DDX_Control(pDX, IDC_DATETO, m_DateTo);\r
DDX_Control(pDX, IDC_HIDEPATHS, m_cHidePaths);\r
- DDX_Control(pDX, IDC_GETALL, m_btnShow);\r
DDX_Text(pDX, IDC_LOGINFO, m_sLogInfo);\r
- DDX_Check(pDX, IDC_INCLUDEMERGE, m_bIncludeMerges);\r
+ DDX_Check(pDX, IDC_LOG_FIRSTPARENT, m_bFirstParent);\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
}\r
\r
BEGIN_MESSAGE_MAP(CLogDlg, CResizableStandAloneDialog)\r
ON_REGISTERED_MESSAGE(m_FindDialogMessage, OnFindDialogMessage) \r
- ON_BN_CLICKED(IDC_GETALL, OnBnClickedGetall)\r
- ON_NOTIFY(NM_DBLCLK, IDC_LOGMSG, OnNMDblclkChangedFileList)\r
+ //ON_BN_CLICKED(IDC_GETALL, OnBnClickedGetall)\r
+ //ON_NOTIFY(NM_DBLCLK, IDC_LOGMSG, OnNMDblclkChangedFileList)\r
ON_WM_CONTEXTMENU()\r
ON_WM_SETCURSOR()\r
ON_BN_CLICKED(IDHELP, OnBnClickedHelp)\r
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LOGLIST, OnLvnItemchangedLoglist)\r
ON_NOTIFY(EN_LINK, IDC_MSGVIEW, OnEnLinkMsgview)\r
ON_BN_CLICKED(IDC_STATBUTTON, OnBnClickedStatbutton)\r
- //ON_NOTIFY(NM_CUSTOMDRAW, IDC_LOGLIST, OnNMCustomdrawLoglist)\r
+\r
+ \r
ON_MESSAGE(WM_FILTEREDIT_INFOCLICKED, OnClickedInfoIcon)\r
ON_MESSAGE(WM_FILTEREDIT_CANCELCLICKED, OnClickedCancelFilter)\r
- //ON_NOTIFY(LVN_GETDISPINFO, IDC_LOGLIST, OnLvnGetdispinfoLoglist)\r
+\r
+ ON_MESSAGE(MSG_LOAD_PERCENTAGE,OnLogListLoading)\r
+ \r
ON_EN_CHANGE(IDC_SEARCHEDIT, OnEnChangeSearchedit)\r
ON_WM_TIMER()\r
ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATETO, OnDtnDatetimechangeDateto)\r
ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATEFROM, OnDtnDatetimechangeDatefrom)\r
- ON_BN_CLICKED(IDC_NEXTHUNDRED, OnBnClickedNexthundred)\r
- ON_NOTIFY(NM_CUSTOMDRAW, IDC_LOGMSG, OnNMCustomdrawChangedFileList)\r
- ON_NOTIFY(LVN_GETDISPINFO, IDC_LOGMSG, OnLvnGetdispinfoChangedFileList)\r
+ ON_BN_CLICKED(IDC_SHOWWHOLEPROJECT, OnBnClickShowWholeProject)\r
+ //ON_NOTIFY(NM_CUSTOMDRAW, IDC_LOGMSG, OnNMCustomdrawChangedFileList)\r
+ //ON_NOTIFY(LVN_GETDISPINFO, IDC_LOGMSG, OnLvnGetdispinfoChangedFileList)\r
ON_NOTIFY(LVN_COLUMNCLICK,IDC_LOGLIST , OnLvnColumnclick)\r
- ON_NOTIFY(LVN_COLUMNCLICK, IDC_LOGMSG, OnLvnColumnclickChangedFileList)\r
+ //ON_NOTIFY(LVN_COLUMNCLICK, IDC_LOGMSG, OnLvnColumnclickChangedFileList)\r
ON_BN_CLICKED(IDC_HIDEPATHS, OnBnClickedHidepaths)\r
+ ON_BN_CLICKED(IDC_LOG_ALLBRANCH,OnBnClickedAllBranch)\r
\r
- ON_BN_CLICKED(IDC_CHECK_STOPONCOPY, &CLogDlg::OnBnClickedCheckStoponcopy)\r
ON_NOTIFY(DTN_DROPDOWN, IDC_DATEFROM, &CLogDlg::OnDtnDropdownDatefrom)\r
ON_NOTIFY(DTN_DROPDOWN, IDC_DATETO, &CLogDlg::OnDtnDropdownDateto)\r
ON_WM_SIZE()\r
- ON_BN_CLICKED(IDC_INCLUDEMERGE, &CLogDlg::OnBnClickedIncludemerge)\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_COMMAND(ID_LOGDLG_REFRESH,&CLogDlg::OnRefresh)\r
ON_COMMAND(ID_LOGDLG_FIND,&CLogDlg::OnFind)\r
ON_COMMAND(ID_LOGDLG_FOCUSFILTER,&CLogDlg::OnFocusFilter)\r
ON_COMMAND(ID_EDIT_COPY, &CLogDlg::OnEditCopy)\r
END_MESSAGE_MAP()\r
\r
-void CLogDlg::SetParams(const CTGitPath& path, GitRev pegrev, GitRev startrev, GitRev endrev, int limit, BOOL bStrict /* = FALSE */, BOOL bSaveStrict /* = TRUE */)\r
+void CLogDlg::SetParams(const CTGitPath& path, GitRev pegrev, GitRev startrev, GitRev endrev, int limit /* = FALSE */)\r
{\r
m_path = path;\r
m_pegrev = pegrev;\r
m_LogRevision = startrev;\r
m_endrev = endrev;\r
m_hasWC = !path.IsUrl();\r
- m_bStrict = bStrict;\r
- m_bSaveStrict = bSaveStrict;\r
m_limit = limit;\r
if (::IsWindow(m_hWnd))\r
UpdateData(FALSE);\r
\r
BOOL CLogDlg::OnInitDialog()\r
{\r
+ CString temp;\r
CResizableStandAloneDialog::OnInitDialog();\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
- if (!m_bStrict)\r
- m_bStrict = m_regLastStrict;\r
UpdateData(FALSE);\r
- CString temp;\r
- if (m_limit)\r
- temp.Format(IDS_LOG_SHOWNEXT, m_limit);\r
- else\r
- temp.Format(IDS_LOG_SHOWNEXT, (int)(DWORD)CRegDWORD(_T("Software\\TortoiseGit\\NumberOfLogs"), 100));\r
-\r
- SetDlgItemText(IDC_NEXTHUNDRED, temp);\r
-\r
+ \r
// set the font to use in the log message view, configured in the settings dialog\r
CAppUtils::CreateFontForLogs(m_logFont);\r
GetDlgItem(IDC_MSGVIEW)->SetFont(&m_logFont);\r
if ((!m_ProjectProperties.sUrl.IsEmpty())||(!m_ProjectProperties.sCheckRe.IsEmpty()))\r
m_bShowBugtraqColumn = true;\r
\r
- theme.SetWindowTheme(m_LogList.GetSafeHwnd(), L"Explorer", NULL);\r
- theme.SetWindowTheme(m_ChangedFileListCtrl.GetSafeHwnd(), L"Explorer", NULL);\r
+ //theme.SetWindowTheme(m_LogList.GetSafeHwnd(), L"Explorer", NULL);\r
+ //theme.SetWindowTheme(m_ChangedFileListCtrl.GetSafeHwnd(), L"Explorer", NULL);\r
\r
// set up the columns\r
m_LogList.DeleteAllItems();\r
-#if 0\r
- int c = ((CHeaderCtrl*)(m_LogList.GetDlgItem(0)))->GetItemCount()-1;\r
- \r
- while (c>=0)\r
- m_LogList.DeleteColumn(c--);\r
- temp.LoadString(IDS_LOG_GRAPH);\r
-\r
- m_LogList.InsertColumn(this->LOGLIST_GRAPH, temp);\r
- \r
-#if 0 \r
- // make the revision column right aligned\r
- LVCOLUMN Column;\r
- Column.mask = LVCF_FMT;\r
- Column.fmt = LVCFMT_RIGHT;\r
- m_LogList.SetColumn(0, &Column); \r
-#endif \r
-// CString log;\r
-// g_Git.GetLog(log);\r
-\r
- temp.LoadString(IDS_LOG_ACTIONS);\r
- m_LogList.InsertColumn(this->LOGLIST_ACTION, temp);\r
- \r
- temp.LoadString(IDS_LOG_MESSAGE);\r
- m_LogList.InsertColumn(this->LOGLIST_MESSAGE, temp);\r
- \r
- temp.LoadString(IDS_LOG_AUTHOR);\r
- m_LogList.InsertColumn(this->LOGLIST_AUTHOR, temp);\r
- \r
- temp.LoadString(IDS_LOG_DATE);\r
- m_LogList.InsertColumn(this->LOGLIST_DATE, temp);\r
- \r
-\r
- if (m_bShowBugtraqColumn)\r
- {\r
- temp = m_ProjectProperties.sLabel;\r
- if (temp.IsEmpty())\r
- temp.LoadString(IDS_LOG_BUGIDS);\r
- m_LogList.InsertColumn(this->LOGLIST_BUG, temp);\r
-\r
- }\r
- \r
- m_LogList.SetRedraw(false);\r
- ResizeAllListCtrlCols();\r
- m_LogList.SetRedraw(true);\r
-#endif\r
- m_ChangedFileListCtrl.SetExtendedStyle ( LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER );\r
- m_ChangedFileListCtrl.DeleteAllItems();\r
- c = ((CHeaderCtrl*)(m_ChangedFileListCtrl.GetDlgItem(0)))->GetItemCount()-1;\r
- while (c>=0)\r
- m_ChangedFileListCtrl.DeleteColumn(c--);\r
- temp.LoadString(IDS_PROGRS_ACTION);\r
- m_ChangedFileListCtrl.InsertColumn(this->FILELIST_ACTION, temp);\r
- temp.LoadString(IDS_LOG_FILE_LINE_ADD);\r
- m_ChangedFileListCtrl.InsertColumn(this->FILELIST_ADD, temp);\r
- temp.LoadString(IDS_LOG_FILE_LINE_DEL);\r
- m_ChangedFileListCtrl.InsertColumn(this->FILELIST_DEL, temp);\r
- temp.LoadString(IDS_PROGRS_PATH);\r
- m_ChangedFileListCtrl.InsertColumn(this->FILELIST_PATH, temp);\r
- \r
- m_ChangedFileListCtrl.SetRedraw(false);\r
- CAppUtils::ResizeAllListCtrlCols(&m_ChangedFileListCtrl);\r
- m_ChangedFileListCtrl.SetRedraw(true);\r
+ m_LogList.InsertGitColumn();\r
\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_cFilter.SetValidator(this);\r
\r
AdjustControlSize(IDC_HIDEPATHS);\r
- AdjustControlSize(IDC_CHECK_STOPONCOPY);\r
- AdjustControlSize(IDC_INCLUDEMERGE);\r
+ AdjustControlSize(IDC_LOG_FIRSTPARENT);\r
+ AdjustControlSize(IDC_LOG_ALLBRANCH);\r
\r
GetClientRect(m_DlgOrigRect);\r
m_LogList.GetClientRect(m_LogListOrigRect);\r
m_DateTo.SendMessage(DTM_SETMCSTYLE, 0, MCS_WEEKNUMBERS|MCS_NOTODAY|MCS_NOTRAILINGDATES|MCS_NOSELCHANGEONNAV);\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
\r
AddAnchor(IDC_LOGINFO, BOTTOM_LEFT, BOTTOM_RIGHT); \r
AddAnchor(IDC_HIDEPATHS, BOTTOM_LEFT); \r
- AddAnchor(IDC_CHECK_STOPONCOPY, BOTTOM_LEFT);\r
- AddAnchor(IDC_INCLUDEMERGE, BOTTOM_LEFT);\r
- AddAnchor(IDC_GETALL, BOTTOM_LEFT);\r
- AddAnchor(IDC_NEXTHUNDRED, BOTTOM_LEFT);\r
+ AddAnchor(IDC_LOG_ALLBRANCH,BOTTOM_LEFT);\r
+ AddAnchor(IDC_LOG_FIRSTPARENT, BOTTOM_LEFT);\r
+ //AddAnchor(IDC_GETALL, BOTTOM_LEFT);\r
+ AddAnchor(IDC_SHOWWHOLEPROJECT, BOTTOM_LEFT);\r
AddAnchor(IDC_REFRESH, BOTTOM_LEFT);\r
AddAnchor(IDC_STATBUTTON, BOTTOM_RIGHT);\r
AddAnchor(IDC_PROGRESS, BOTTOM_LEFT, BOTTOM_RIGHT);\r
if (m_bSelect)\r
{\r
// the dialog is used to select revisions\r
- if (m_bSelectionMustBeContinuous)\r
- DialogEnableWindow(IDOK, (m_LogList.GetSelectedCount()!=0)&&(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
}\r
\r
- // set the choices for the "Show All" button\r
- temp.LoadString(IDS_LOG_SHOWALL);\r
- m_btnShow.AddEntry(temp);\r
- temp.LoadString(IDS_LOG_SHOWRANGE);\r
- m_btnShow.AddEntry(temp);\r
- m_btnShow.SetCurrentEntry((LONG)CRegDWORD(_T("Software\\TortoiseGit\\ShowAllEntry")));\r
-\r
m_mergedRevs.clear();\r
\r
// first start a thread to obtain the log messages without\r
// blocking the dialog\r
- m_tTo = 0;\r
- m_tFrom = (DWORD)-1;\r
- InterlockedExchange(&m_bThreadRunning, TRUE);\r
- InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
- if (AfxBeginThread(LogThreadEntry, this)==NULL)\r
- {\r
- InterlockedExchange(&m_bThreadRunning, FALSE);\r
- InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
- CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
- }\r
+ //m_tTo = 0;\r
+ //m_tFrom = (DWORD)-1;\r
+\r
+ m_LogList.m_Path=m_path;\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
+{\r
+ int cur=(int)wParam;\r
+\r
+ if( cur == GITLOG_START )\r
+ {\r
+ CString temp;\r
+ temp.LoadString(IDS_PROGRESSWAIT);\r
+\r
+ this->m_LogList.ShowText(temp, true);\r
+\r
+ // We use a progress bar while getting the logs \r
+ m_LogProgress.SetRange32(0, 100);\r
+ m_LogProgress.SetPos(0);\r
+\r
+ GetDlgItem(IDC_PROGRESS)->ShowWindow(TRUE);\r
+\r
+ //DialogEnableWindow(IDC_GETALL, FALSE);\r
+ //DialogEnableWindow(IDC_SHOWWHOLEPROJECT, FALSE);\r
+ //DialogEnableWindow(IDC_LOG_FIRSTPARENT, FALSE);\r
+ DialogEnableWindow(IDC_STATBUTTON, FALSE);\r
+ DialogEnableWindow(IDC_REFRESH, FALSE);\r
+ DialogEnableWindow(IDC_HIDEPATHS,FALSE);\r
+\r
+ }else if( cur == GITLOG_END)\r
+ {\r
+ \r
+ //if (!m_bShowedAll)\r
+ DialogEnableWindow(IDC_SHOWWHOLEPROJECT, TRUE);\r
+\r
+ //DialogEnableWindow(IDC_GETALL, TRUE);\r
+ DialogEnableWindow(IDC_LOG_FIRSTPARENT, TRUE);\r
+ DialogEnableWindow(IDC_STATBUTTON, TRUE);\r
+ DialogEnableWindow(IDC_REFRESH, TRUE);\r
+ DialogEnableWindow(IDC_HIDEPATHS,TRUE);\r
+\r
+// PostMessage(WM_TIMER, LOGFILTER_TIMER);\r
+ GetDlgItem(IDC_PROGRESS)->ShowWindow(FALSE);\r
+ //CTime time=m_LogList.GetOldestTime();\r
+ CTime begin,end;\r
+ m_LogList.GetTimeRange(begin,end);\r
+ m_DateFrom.SetTime(&begin);\r
+ m_DateTo.SetTime(&end);\r
+ \r
+ \r
+ \r
+ }else\r
+ {\r
+ if(this->m_LogList.HasText())\r
+ {\r
+ this->m_LogList.ClearText();\r
+ UpdateLogInfoLabel();\r
+ }\r
+ m_LogProgress.SetPos(cur);\r
+ }\r
+ return 0;\r
+}\r
void CLogDlg::SetDlgTitle(bool bOffline)\r
{\r
if (m_sTitle.IsEmpty())\r
{\r
if (m_path.IsUrl())\r
SetWindowText(m_sTitle + _T(" - ") + m_path.GetUIPathString());\r
+ else if (m_path.IsEmpty())\r
+ SetWindowText(m_sTitle + _T(" - ") + CString(_T("Whole Project")));\r
else if (m_path.IsDirectory())\r
SetWindowText(m_sTitle + _T(" - ") + m_path.GetWinPathString());\r
else\r
if (m_bSelect)\r
{\r
// the dialog is used to select revisions\r
- if (m_bSelectionMustBeContinuous)\r
- DialogEnableWindow(IDOK, (m_LogList.GetSelectedCount()!=0)&&(IsSelectionContinuous()));\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
}\r
pMsgView->SetWindowText(_T(" "));\r
// empty the changed files list\r
m_ChangedFileListCtrl.SetRedraw(FALSE);\r
- InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
+// InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
m_currentChangedArray = NULL;\r
- m_ChangedFileListCtrl.SetExtendedStyle ( LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER );\r
+ //m_ChangedFileListCtrl.SetExtendedStyle ( LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER );\r
m_ChangedFileListCtrl.DeleteAllItems();\r
- m_ChangedFileListCtrl.SetItemCountEx(0);\r
-\r
+ \r
// if we're not here to really show a selected revision, just\r
// get out of here after clearing the views, which is what is intended\r
// if that flag is not set.\r
{\r
// force a redraw\r
m_ChangedFileListCtrl.Invalidate();\r
- InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
+// InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
m_ChangedFileListCtrl.SetRedraw(TRUE);\r
return;\r
}\r
if (selCount == 0)\r
{\r
// if nothing is selected, we have nothing more to do\r
- InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
+// InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
m_ChangedFileListCtrl.SetRedraw(TRUE);\r
return;\r
}\r
// list fully.\r
POSITION pos = m_LogList.GetFirstSelectedItemPosition();\r
int selIndex = m_LogList.GetNextSelectedItem(pos);\r
- if (selIndex >= m_arShownList.GetCount())\r
+ if (selIndex >= m_LogList.m_arShownList.GetCount())\r
{\r
- InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
+// InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
m_ChangedFileListCtrl.SetRedraw(TRUE);\r
return;\r
}\r
- GitRev* pLogEntry = reinterpret_cast<GitRev *>(m_arShownList.GetAt(selIndex));\r
-\r
- // set the log message text\r
- pMsgView->SetWindowText(_T("*")+pLogEntry->m_Subject+_T("\n\n")+pLogEntry->m_Body);\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
- CAppUtils::FormatTextInRichEditControl(pMsgView);\r
- m_currentChangedArray = &(pLogEntry->m_Files);\r
- if (m_currentChangedArray == NULL)\r
+ GitRev* pLogEntry = reinterpret_cast<GitRev *>(m_LogList.m_arShownList.GetAt(selIndex));\r
+\r
+ if(!pLogEntry->m_IsFull)\r
{\r
- InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
- m_ChangedFileListCtrl.SetRedraw(TRUE);\r
- return;\r
- }\r
-#if 0\r
- // fill in the changed files list control\r
- if ((m_cHidePaths.GetState() & 0x0003)==BST_CHECKED)\r
+ pMsgView->SetWindowText(_T("load ..."));\r
+ }else\r
{\r
- m_CurrentFilteredChangedArray.RemoveAll();\r
- for (INT_PTR c = 0; c < m_currentChangedArray->GetCount(); ++c)\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
+ // 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
+ 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
+ CString matchpath=this->m_path.GetGitPathString();\r
+\r
+ for(int i=0;i<pLogEntry->m_Files.GetCount() && (!matchpath.IsEmpty());i++)\r
{\r
- LogChangedPath * cpath = m_currentChangedArray->GetAt(c);\r
- if (cpath == NULL)\r
- continue;\r
- if (m_currentChangedArray->GetAt(c)->sPath.Left(m_sRelativeRoot.GetLength()).Compare(m_sRelativeRoot)==0)\r
+ if( m_bWholeProject )\r
+ break;\r
+\r
+ ((CTGitPath&)pLogEntry->m_Files[i]).m_Action &= ~(CTGitPath::LOGACTIONS_HIDE|CTGitPath::LOGACTIONS_GRAY);\r
+ \r
+ if(pLogEntry->m_Files[i].GetGitPathString().Left(matchpath.GetLength()) != matchpath)\r
{\r
- m_CurrentFilteredChangedArray.Add(cpath);\r
+ if(HidePaths==BST_CHECKED)\r
+ ((CTGitPath&)pLogEntry->m_Files[i]).m_Action |= CTGitPath::LOGACTIONS_HIDE;\r
+ if(HidePaths==BST_INDETERMINATE)\r
+ ((CTGitPath&)pLogEntry->m_Files[i]).m_Action |= CTGitPath::LOGACTIONS_GRAY;\r
}\r
}\r
- m_currentChangedArray = &m_CurrentFilteredChangedArray;\r
+ m_ChangedFileListCtrl.UpdateWithGitPathList(pLogEntry->m_Files);\r
+ m_ChangedFileListCtrl.m_CurrentVersion=pLogEntry->m_CommitHash;\r
+ m_ChangedFileListCtrl.Show(SVNSLC_SHOWVERSIONED);\r
+\r
+ m_ChangedFileListCtrl.SetRedraw(TRUE);\r
+ return;\r
}\r
-#endif\r
+\r
}\r
else\r
{\r
}\r
\r
// redraw the views\r
- InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
+// InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
+#if 0\r
if (m_currentChangedArray)\r
{\r
m_ChangedFileListCtrl.SetItemCountEx(m_currentChangedArray->GetCount());\r
m_ChangedFileListCtrl.SetItemCountEx(0);\r
m_ChangedFileListCtrl.Invalidate();\r
}\r
- CAppUtils::ResizeAllListCtrlCols(&m_ChangedFileListCtrl);\r
+#endif\r
// sort according to the settings\r
if (m_nSortColumnPathList > 0)\r
SetSortArrow(&m_ChangedFileListCtrl, m_nSortColumnPathList, m_bAscendingPathList);\r
\r
}\r
\r
-void CLogDlg::OnBnClickedGetall()\r
-{\r
- GetAll();\r
-}\r
-\r
-void CLogDlg::GetAll(bool bForceAll /* = false */)\r
-{\r
-#if 0\r
- // fetch all requested log messages, either the specified range or\r
- // really *all* available log messages.\r
- UpdateData();\r
- INT_PTR entry = m_btnShow.GetCurrentEntry();\r
- if (bForceAll)\r
- entry = 0;\r
-\r
- switch (entry)\r
- {\r
- case 0: // show all\r
- \r
- m_endrev = 0;\r
- m_startrev = m_LogRevision;\r
- if (m_bStrict)\r
- m_bShowedAll = true;\r
-\r
- break;\r
- case 1: // show range\r
- {\r
-\r
- // ask for a revision range\r
- CRevisionRangeDlg dlg;\r
- dlg.SetStartRevision(m_startrev);\r
- dlg.SetEndRevision( (m_endrev>=0) ? m_endrev : 0);\r
- if (dlg.DoModal()!=IDOK)\r
- {\r
- return;\r
- }\r
- m_endrev = dlg.GetEndRevision();\r
- m_startrev = dlg.GetStartRevision();\r
- if (((m_endrev.IsNumber())&&(m_startrev.IsNumber()))||\r
- (m_endrev.IsHead()||m_startrev.IsHead()))\r
- {\r
- if (((LONG)m_startrev < (LONG)m_endrev)||\r
- (m_endrev.IsHead()))\r
- {\r
- git_revnum_t temp = m_startrev;\r
- m_startrev = m_endrev;\r
- m_endrev = temp;\r
- }\r
- }\r
- m_bShowedAll = false;\r
- }\r
-\r
- break;\r
- }\r
- m_ChangedFileListCtrl.SetItemCountEx(0);\r
- m_ChangedFileListCtrl.Invalidate();\r
- // We need to create CStoreSelection on the heap or else\r
- // the variable will run out of the scope before the\r
- // thread ends. Therefore we let the thread delete\r
- // the instance.\r
- m_pStoreSelection = new CStoreSelection(this);\r
- m_LogList.SetItemCountEx(0);\r
- m_LogList.Invalidate();\r
- InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
- CWnd * pMsgView = GetDlgItem(IDC_MSGVIEW);\r
- pMsgView->SetWindowText(_T(""));\r
-\r
- SetSortArrow(&m_LogList, -1, true);\r
-\r
- m_LogList.DeleteAllItems();\r
- m_arShownList.RemoveAll();\r
- m_logEntries.ClearAll();\r
-\r
- m_logcounter = 0;\r
- m_bCancelled = FALSE;\r
- m_tTo = 0;\r
- m_tFrom = (DWORD)-1;\r
- m_limit = 0;\r
-\r
- InterlockedExchange(&m_bThreadRunning, TRUE);\r
- if (AfxBeginThread(LogThreadEntry, this)==NULL)\r
- {\r
- InterlockedExchange(&m_bThreadRunning, FALSE);\r
- CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
- }\r
- GetDlgItem(IDC_LOGLIST)->UpdateData(FALSE);\r
- InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
-#endif\r
-}\r
-\r
void CLogDlg::OnBnClickedRefresh()\r
{\r
m_limit = 0;\r
Refresh (true);\r
}\r
\r
-void CLogDlg::Refresh (bool autoGoOnline)\r
+void CLogDlg::Refresh (bool /*autoGoOnline*/)\r
{\r
-#if 0\r
- // refreshing means re-downloading the already shown log messages\r
- UpdateData();\r
- m_maxChild = 0;\r
- m_childCounter = 0;\r
-\r
- if ((m_limit == 0)||(m_bStrict)||(int(m_logEntries.size()-1) > m_limit))\r
- {\r
- if (m_logEntries.size() != 0)\r
- {\r
- m_endrev = m_logEntries[m_logEntries.size()-1]->Rev;\r
- }\r
- }\r
- m_startrev = -1;\r
- m_bCancelled = FALSE;\r
-\r
- // We need to create CStoreSelection on the heap or else\r
- // the variable will run out of the scope before the\r
- // thread ends. Therefore we let the thread delete\r
- // the instance.\r
- m_pStoreSelection = new CStoreSelection(this);\r
- m_ChangedFileListCtrl.SetItemCountEx(0);\r
- m_ChangedFileListCtrl.Invalidate();\r
- m_LogList.SetItemCountEx(0);\r
- m_LogList.Invalidate();\r
- InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
- CWnd * pMsgView = GetDlgItem(IDC_MSGVIEW);\r
- pMsgView->SetWindowText(_T(""));\r
-\r
- SetSortArrow(&m_LogList, -1, true);\r
-\r
- m_LogList.DeleteAllItems();\r
- m_arShownList.RemoveAll();\r
- m_logEntries.ClearAll();\r
-\r
- // reset the cached HEAD property & go on-line\r
-\r
- if (autoGoOnline)\r
- {\r
- SetDlgTitle (false);\r
- logCachePool.GetRepositoryInfo().ResetHeadRevision (m_sUUID, m_sRepositoryRoot);\r
- }\r
-\r
- InterlockedExchange(&m_bThreadRunning, TRUE);\r
- if (AfxBeginThread(LogThreadEntry, this)==NULL)\r
- {\r
- InterlockedExchange(&m_bThreadRunning, FALSE);\r
- CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
- }\r
- GetDlgItem(IDC_LOGLIST)->UpdateData(FALSE);\r
- InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
-#endif\r
+ m_LogList.Refresh();\r
}\r
\r
-void CLogDlg::OnBnClickedNexthundred()\r
-{\r
-#if 0\r
- UpdateData();\r
- // we have to fetch the next X log messages.\r
- if (m_logEntries.size() < 1)\r
- {\r
- // since there weren't any log messages fetched before, just\r
- // fetch all since we don't have an 'anchor' to fetch the 'next'\r
- // messages from.\r
- return GetAll(true);\r
- }\r
- git_revnum_t rev = m_logEntries[m_logEntries.size()-1]->Rev;\r
\r
- if (rev < 1)\r
- return; // do nothing! No more revisions to get\r
-\r
- m_startrev = rev;\r
- m_endrev = 0;\r
- m_bCancelled = FALSE;\r
-\r
- // rev is is revision we already have and we will receive it again\r
- // -> fetch one extra revision to get NumberOfLogs *new* revisions\r
-\r
- m_limit = (int)(DWORD)CRegDWORD(_T("Software\\TortoiseGit\\NumberOfLogs"), 100) +1;\r
- InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
- SetSortArrow(&m_LogList, -1, true);\r
- InterlockedExchange(&m_bThreadRunning, TRUE);\r
- // We need to create CStoreSelection on the heap or else\r
- // the variable will run out of the scope before the\r
- // thread ends. Therefore we let the thread delete\r
- // the instance.\r
- m_pStoreSelection = new CStoreSelection(this);\r
-\r
- // since we fetch the log from the last revision we already have,\r
- // we have to remove that revision entry to avoid getting it twice\r
- m_logEntries.pop_back();\r
- if (AfxBeginThread(LogThreadEntry, this)==NULL)\r
- {\r
- InterlockedExchange(&m_bThreadRunning, FALSE);\r
- CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
- }\r
- InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
- GetDlgItem(IDC_LOGLIST)->UpdateData(FALSE);\r
-#endif\r
-}\r
\r
BOOL CLogDlg::Cancel()\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)||(m_bThreadRunning))\r
+ if (this->IsThreadRunning())\r
{\r
- m_bCancelled = true;\r
- return;\r
+ m_LogList.TerminateThread();\r
}\r
UpdateData();\r
- if (m_bSaveStrict)\r
- m_regLastStrict = m_bStrict;\r
- CRegDWORD reg = CRegDWORD(_T("Software\\TortoiseGit\\ShowAllEntry"));\r
- reg = m_btnShow.GetCurrentEntry();\r
+ \r
SaveSplitterPos();\r
__super::OnCancel();\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
return TRUE;\r
}\r
\r
-//this is the thread function which calls the subversion function\r
-UINT CLogDlg::LogThreadEntry(LPVOID pVoid)\r
-{\r
- return ((CLogDlg*)pVoid)->LogThread();\r
-}\r
-\r
GitRev g_rev;\r
//this is the thread function which calls the subversion function\r
-UINT CLogDlg::LogThread()\r
-{\r
-\r
- InterlockedExchange(&m_bThreadRunning, TRUE);\r
-\r
- //does the user force the cache to refresh (shift or control key down)?\r
- bool refresh = (GetKeyState (VK_CONTROL) < 0) \r
- || (GetKeyState (VK_SHIFT) < 0);\r
-\r
- //disable the "Get All" button while we're receiving\r
- //log messages.\r
- DialogEnableWindow(IDC_GETALL, FALSE);\r
- DialogEnableWindow(IDC_NEXTHUNDRED, FALSE);\r
- DialogEnableWindow(IDC_CHECK_STOPONCOPY, FALSE);\r
- DialogEnableWindow(IDC_INCLUDEMERGE, FALSE);\r
- DialogEnableWindow(IDC_STATBUTTON, FALSE);\r
- DialogEnableWindow(IDC_REFRESH, FALSE);\r
- \r
- CString temp;\r
- temp.LoadString(IDS_PROGRESSWAIT);\r
- m_LogList.ShowText(temp, true);\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
- // We use a progress bar while getting the logs\r
- m_LogProgress.SetRange32(0, 100);\r
- m_LogProgress.SetPos(0);\r
- GetDlgItem(IDC_PROGRESS)->ShowWindow(TRUE);\r
-// git_revnum_t r = -1;\r
- \r
- // get the repository root url, because the changed-files-list has the\r
- // paths shown there relative to the repository root.\r
-// CTGitPath rootpath;\r
-// BOOL succeeded = GetRootAndHead(m_path, rootpath, r);\r
-\r
-// m_sRepositoryRoot = rootpath.GetGitPathString();\r
-// m_sURL = m_path.GetGitPathString();\r
-\r
- // we need the UUID to unambigously identify the log cache\r
-// if (logCachePool.IsEnabled())\r
-// m_sUUID = logCachePool.GetRepositoryInfo().GetRepositoryUUID (rootpath);\r
-\r
- // if the log dialog is started from a working copy, we need to turn that\r
- // local path into an url here\r
-// if (succeeded)\r
-// {\r
-// if (!m_path.IsUrl())\r
-// {\r
-// m_sURL = GetURLFromPath(m_path);\r
-\r
- // The URL is escaped because Git::logReceiver\r
- // returns the path in a native format\r
-// m_sURL = CPathUtils::PathUnescape(m_sURL);\r
- // }\r
-// m_sRelativeRoot = m_sURL.Mid(CPathUtils::PathUnescape(m_sRepositoryRoot).GetLength());\r
-// m_sSelfRelativeURL = m_sRelativeRoot;\r
- // }\r
-#if 0\r
- if (succeeded && !m_mergePath.IsEmpty() && m_mergedRevs.empty())\r
- {\r
- // in case we got a merge path set, retrieve the merge info\r
- // of that path and check whether one of the merge URLs\r
- // match the URL we show the log for.\r
- GitPool localpool(pool);\r
- git_error_clear(Err);\r
- apr_hash_t * mergeinfo = NULL;\r
- if (git_client_mergeinfo_get_merged (&mergeinfo, m_mergePath.GetGitApiPath(localpool), GitRev(GitRev::REV_WC), m_pctx, localpool) == NULL)\r
- {\r
- // now check the relative paths\r
- apr_hash_index_t *hi;\r
- const void *key;\r
- void *val;\r
-\r
- if (mergeinfo)\r
- {\r
- for (hi = apr_hash_first(localpool, mergeinfo); hi; hi = apr_hash_next(hi))\r
- {\r
- apr_hash_this(hi, &key, NULL, &val);\r
- if (m_sURL.Compare(CUnicodeUtils::GetUnicode((char*)key)) == 0)\r
- {\r
- apr_array_header_t * arr = (apr_array_header_t*)val;\r
- if (val)\r
- {\r
- for (long i=0; i<arr->nelts; ++i)\r
- {\r
- git_merge_range_t * pRange = APR_ARRAY_IDX(arr, i, git_merge_range_t*);\r
- if (pRange)\r
- {\r
- for (git_revnum_t r=pRange->start+1; r<=pRange->end; ++r)\r
- {\r
- m_mergedRevs.insert(r);\r
- }\r
- }\r
- }\r
- }\r
- break;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- m_LogProgress.SetPos(1);\r
- if (m_startrev == GitRev::REV_HEAD)\r
- {\r
- m_startrev = r;\r
- }\r
- if (m_endrev == GitRev::REV_HEAD)\r
- {\r
- m_endrev = r;\r
- }\r
-\r
- if (m_limit != 0)\r
- {\r
- m_limitcounter = m_limit;\r
- m_LogProgress.SetRange32(0, m_limit);\r
- }\r
- else\r
- m_LogProgress.SetRange32(m_endrev, m_startrev);\r
- \r
- if (!m_pegrev.IsValid())\r
- m_pegrev = m_startrev;\r
- size_t startcount = m_logEntries.size();\r
- m_lowestRev = -1;\r
- m_bStrictStopped = false;\r
-\r
- if (succeeded)\r
- {\r
- succeeded = ReceiveLog (CTGitPathList(m_path), m_pegrev, m_startrev, m_endrev, m_limit, m_bStrict, m_bIncludeMerges, refresh);\r
- if ((!succeeded)&&(!m_path.IsUrl()))\r
- {\r
- // try again with REV_WC as the start revision, just in case the path doesn't\r
- // exist anymore in HEAD\r
- succeeded = ReceiveLog(CTGitPathList(m_path), GitRev(), GitRev::REV_WC, m_endrev, m_limit, m_bStrict, m_bIncludeMerges, refresh);\r
- }\r
- }\r
- m_LogList.ClearText();\r
- if (!succeeded)\r
- {\r
- m_LogList.ShowText(GetLastErrorMessage(), true);\r
- }\r
- else\r
- {\r
- if (!m_wcRev.IsValid())\r
- {\r
- // fetch the revision the wc path is on so we can mark it\r
- CTGitPath revWCPath = m_ProjectProperties.GetPropsPath();\r
- if (!m_path.IsUrl())\r
- revWCPath = m_path;\r
- if (DWORD(CRegDWORD(_T("Software\\TortoiseGit\\RecursiveLogRev"), FALSE)))\r
- {\r
- git_revnum_t minrev, maxrev;\r
- bool switched, modified, sparse;\r
- GetWCRevisionStatus(revWCPath, true, minrev, maxrev, switched, modified, sparse);\r
- if (maxrev)\r
- m_wcRev = maxrev;\r
- }\r
- else\r
- {\r
- CTGitPath dummypath;\r
- GitStatus status;\r
- git_wc_status2_t * stat = status.GetFirstFileStatus(revWCPath, dummypath, false, git_depth_empty);\r
- if (stat && stat->entry && stat->entry->cmt_rev)\r
- m_wcRev = stat->entry->cmt_rev;\r
- if (stat && stat->entry && (stat->entry->kind == git_node_dir))\r
- m_wcRev = stat->entry->revision;\r
- }\r
- }\r
- }\r
- if (m_bStrict && (m_lowestRev>1) && ((m_limit>0) ? ((startcount + m_limit)>m_logEntries.size()) : (m_endrev<m_lowestRev)))\r
- m_bStrictStopped = true;\r
- m_LogList.SetItemCountEx(ShownCountWithStopped());\r
-\r
- m_timFrom = (__time64_t(m_tFrom));\r
- m_timTo = (__time64_t(m_tTo));\r
- m_DateFrom.SetRange(&m_timFrom, &m_timTo);\r
- m_DateTo.SetRange(&m_timFrom, &m_timTo);\r
- m_DateFrom.SetTime(&m_timFrom);\r
- m_DateTo.SetTime(&m_timTo);\r
-#endif\r
- DialogEnableWindow(IDC_GETALL, TRUE);\r
- m_LogList.ClearText();\r
\r
- this->m_logEntries.ClearAll();\r
- this->m_logEntries.ParserFromLog();\r
- m_LogList.SetItemCountEx(this->m_logEntries.size());\r
-\r
- this->m_arShownList.RemoveAll();\r
-\r
- for(int i=0;i<m_logEntries.size();i++)\r
- this->m_arShownList.Add(&m_logEntries[i]);\r
- \r
-#if 0 \r
- if (!m_bShowedAll)\r
- DialogEnableWindow(IDC_NEXTHUNDRED, TRUE);\r
-#endif\r
- DialogEnableWindow(IDC_CHECK_STOPONCOPY, TRUE);\r
- DialogEnableWindow(IDC_INCLUDEMERGE, TRUE);\r
- DialogEnableWindow(IDC_STATBUTTON, TRUE);\r
- DialogEnableWindow(IDC_REFRESH, TRUE);\r
-\r
-#if 0\r
- LogCache::CRepositoryInfo& cachedProperties = logCachePool.GetRepositoryInfo();\r
- SetDlgTitle(cachedProperties.IsOffline (m_sUUID, m_sRepositoryRoot, false));\r
-\r
- GetDlgItem(IDC_PROGRESS)->ShowWindow(FALSE);\r
- m_bCancelled = true;\r
-#endif\r
- InterlockedExchange(&m_bThreadRunning, FALSE);\r
- m_LogList.RedrawItems(0, m_arShownList.GetCount());\r
- m_LogList.SetRedraw(false);\r
- ResizeAllListCtrlCols();\r
- m_LogList.SetRedraw(true);\r
- if ( m_pStoreSelection )\r
- {\r
- // Deleting the instance will restore the\r
- // selection of the CLogDlg.\r
- delete m_pStoreSelection;\r
- m_pStoreSelection = NULL;\r
- }\r
- else\r
- {\r
- // If no selection has been set then this must be the first time\r
- // the revisions are shown. Let's preselect the topmost revision.\r
- if ( m_LogList.GetItemCount()>0 )\r
- {\r
- m_LogList.SetSelectionMark(0);\r
- m_LogList.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);\r
- }\r
- }\r
-\r
- if (!GetDlgItem(IDOK)->IsWindowVisible())\r
- {\r
- temp.LoadString(IDS_MSGBOX_OK);\r
- SetDlgItemText(IDCANCEL, temp);\r
- }\r
-\r
- RefreshCursor();\r
- // make sure the filter is applied (if any) now, after we refreshed/fetched\r
- // the log messages\r
- PostMessage(WM_TIMER, LOGFILTER_TIMER);\r
-\r
- return 0;\r
-}\r
\r
\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
int selCount = m_LogList.GetSelectedCount();\r
if (pWnd == &m_LogList)\r
{\r
- ShowContextMenuForRevisions(pWnd, point);\r
+ //ShowContextMenuForRevisions(pWnd, point);\r
}\r
else if (pWnd == &m_ChangedFileListCtrl)\r
{\r
- ShowContextMenuForChangedpaths(pWnd, point);\r
+ //ShowContextMenuForChangedpaths(pWnd, point);\r
}\r
else if ((selCount == 1)&&(pWnd == GetDlgItem(IDC_MSGVIEW)))\r
{\r
sMenuItemText.LoadString(IDS_SCIEDIT_SELECTALL);\r
popup.AppendMenu(MF_STRING | MF_ENABLED, EM_SETSEL, sMenuItemText);\r
\r
- if (selIndex >= 0)\r
- {\r
- popup.AppendMenu(MF_SEPARATOR);\r
- sMenuItemText.LoadString(IDS_LOG_POPUP_EDITLOG);\r
- popup.AppendMenu(MF_STRING | MF_ENABLED, ID_EDITAUTHOR, sMenuItemText);\r
- }\r
+ //if (selIndex >= 0)\r
+ //{\r
+ // popup.AppendMenu(MF_SEPARATOR);\r
+ // sMenuItemText.LoadString(IDS_LOG_POPUP_EDITLOG);\r
+ // popup.AppendMenu(MF_STRING | MF_ENABLED, CGitLogList::ID_EDITAUTHOR, sMenuItemText);\r
+ //}\r
\r
int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0);\r
switch (cmd)\r
case WM_COPY:\r
::SendMessage(GetDlgItem(IDC_MSGVIEW)->GetSafeHwnd(), cmd, 0, -1);\r
break;\r
- case ID_EDITAUTHOR:\r
+ case CGitLogList::ID_EDITAUTHOR:\r
EditLogMessage(selIndex);\r
break;\r
}\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
}\r
}\r
UpdateData();\r
- if (m_bSaveStrict)\r
- m_regLastStrict = m_bStrict;\r
CRegDWORD reg = CRegDWORD(_T("Software\\TortoiseGit\\ShowAllEntry"));\r
reg = m_btnShow.GetCurrentEntry();\r
SaveSplitterPos();\r
\r
CString cmd;\r
\r
- cmd.Format(_T("git.cmd cat-file -p %s:%s"),rev1->m_CommitHash,(*m_currentChangedArray)[selIndex].GetGitPathString());\r
+ cmd.Format(_T("git.exe cat-file -p %s:%s"),rev1->m_CommitHash,(*m_currentChangedArray)[selIndex].GetGitPathString());\r
g_Git.RunLogFile(cmd,file1);\r
- cmd.Format(_T("git.cmd cat-file -p %s:%s"),rev2->m_CommitHash,(*m_currentChangedArray)[selIndex].GetGitPathString());\r
+ cmd.Format(_T("git.exe cat-file -p %s:%s"),rev2->m_CommitHash,(*m_currentChangedArray)[selIndex].GetGitPathString());\r
g_Git.RunLogFile(cmd,file2);\r
\r
CAppUtils::DiffFlags flags;\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
{\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
\r
+\r
BOOL CLogDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)\r
{\r
- if (m_bThreadRunning)\r
+ //if (this->IsThreadRunning())\r
+ if(m_LogList.m_bNoDispUpdates)\r
{\r
// only show the wait cursor over the list control\r
if ((pWnd)&&\r
{\r
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);\r
*pResult = 0;\r
- if (m_bThreadRunning)\r
+ //if (this->IsThreadRunning())\r
+ if(m_LogList.m_bNoDispUpdates)\r
return;\r
if (pNMLV->iItem >= 0)\r
{\r
m_nSearchIndex = pNMLV->iItem;\r
if (pNMLV->iSubItem != 0)\r
return;\r
- if ((pNMLV->iItem == m_arShownList.GetCount())&&(m_bStrict)&&(m_bStrictStopped))\r
+ if ((pNMLV->iItem == m_LogList.m_arShownList.GetCount()))\r
{\r
// remove the selected state\r
if (pNMLV->uChanged & LVIF_STATE)\r
\r
void CLogDlg::OnBnClickedStatbutton()\r
{\r
-#if 0\r
- if (m_bThreadRunning)\r
+\r
+ if (this->IsThreadRunning())\r
return;\r
- if (m_arShownList.IsEmpty())\r
+ if (m_LogList.m_arShownList.IsEmpty())\r
return; // nothing is shown, so no statistics.\r
// the statistics dialog expects the log entries to be sorted by date\r
SortByColumn(3, false);\r
CPtrArray shownlist;\r
- RecalculateShownList(&shownlist);\r
+ m_LogList.RecalculateShownList(&shownlist);\r
// create arrays which are aware of the current filter\r
CStringArray m_arAuthorsFiltered;\r
CDWordArray m_arDatesFiltered;\r
CDWordArray m_arFileChangesFiltered;\r
for (INT_PTR i=0; i<shownlist.GetCount(); ++i)\r
{\r
- PLOGENTRYDATA pLogEntry = reinterpret_cast<PLOGENTRYDATA>(shownlist.GetAt(i));\r
- CString strAuthor = pLogEntry->sAuthor;\r
+ GitRev* pLogEntry = reinterpret_cast<GitRev*>(shownlist.GetAt(i));\r
+ CString strAuthor = pLogEntry->m_AuthorName;\r
if ( strAuthor.IsEmpty() )\r
{\r
strAuthor.LoadString(IDS_STATGRAPH_EMPTYAUTHOR);\r
}\r
m_arAuthorsFiltered.Add(strAuthor);\r
- m_arDatesFiltered.Add(static_cast<DWORD>(pLogEntry->tmDate));\r
- m_arFileChangesFiltered.Add(pLogEntry->dwFileChanges);\r
+ m_arDatesFiltered.Add(pLogEntry->m_AuthorDate.GetTime());\r
+ m_arFileChangesFiltered.Add(pLogEntry->m_Files.GetCount());\r
}\r
CStatGraphDlg dlg;\r
dlg.m_parAuthors = &m_arAuthorsFiltered;\r
// restore the previous sorting\r
SortByColumn(m_nSortColumn, m_bAscending);\r
OnTimer(LOGFILTER_TIMER);\r
-#endif\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
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
point = CPoint(rect->left, rect->bottom);\r
-#define LOGMENUFLAGS(x) (MF_STRING | MF_ENABLED | (m_nSelectedFilter == x ? MF_CHECKED : MF_UNCHECKED))\r
+#define LOGMENUFLAGS(x) (MF_STRING | MF_ENABLED | (m_LogList.m_nSelectedFilter == x ? MF_CHECKED : MF_UNCHECKED))\r
CMenu popup;\r
if (popup.CreatePopupMenu())\r
{\r
}\r
else\r
{\r
- m_nSelectedFilter = selection;\r
+ m_LogList.m_nSelectedFilter = selection;\r
SetFilterCueText();\r
}\r
SetTimer(LOGFILTER_TIMER, 1000, NULL);\r
\r
LRESULT CLogDlg::OnClickedCancelFilter(WPARAM /*wParam*/, LPARAM /*lParam*/)\r
{\r
-#if 0\r
+\r
KillTimer(LOGFILTER_TIMER);\r
\r
- m_sFilterText.Empty();\r
+ m_LogList.m_sFilterText.Empty();\r
UpdateData(FALSE);\r
theApp.DoWaitCursor(1);\r
CStoreSelection storeselection(this);\r
FillLogMessageCtrl(false);\r
- InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
- m_arShownList.RemoveAll();\r
-\r
- // reset the time filter too\r
- m_timFrom = (__time64_t(m_tFrom));\r
- m_timTo = (__time64_t(m_tTo));\r
- m_DateFrom.SetTime(&m_timFrom);\r
- m_DateTo.SetTime(&m_timTo);\r
- m_DateFrom.SetRange(&m_timFrom, &m_timTo);\r
- m_DateTo.SetRange(&m_timFrom, &m_timTo);\r
-\r
- for (DWORD i=0; i<m_logEntries.size(); ++i)\r
- {\r
- m_arShownList.Add(m_logEntries[i]);\r
- }\r
- InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
- m_LogList.DeleteAllItems();\r
- m_LogList.SetItemCountEx(ShownCountWithStopped());\r
- m_LogList.RedrawItems(0, ShownCountWithStopped());\r
- m_LogList.SetRedraw(false);\r
- ResizeAllListCtrlCols();\r
- m_LogList.SetRedraw(true);\r
+\r
+ m_LogList.RemoveFilter();\r
+\r
+ CTime begin,end;\r
+ m_LogList.GetTimeRange(begin,end);\r
+ m_DateFrom.SetTime(&begin);\r
+ m_DateTo.SetTime(&end);\r
+\r
theApp.DoWaitCursor(-1);\r
GetDlgItem(IDC_SEARCHEDIT)->ShowWindow(SW_HIDE);\r
GetDlgItem(IDC_SEARCHEDIT)->ShowWindow(SW_SHOW);\r
GetDlgItem(IDC_SEARCHEDIT)->SetFocus();\r
UpdateLogInfoLabel();\r
-#endif\r
+\r
return 0L; \r
}\r
\r
void CLogDlg::SetFilterCueText()\r
{\r
CString temp;\r
- switch (m_nSelectedFilter)\r
+ switch (m_LogList.m_nSelectedFilter)\r
{\r
case LOGFILTER_ALL:\r
temp.LoadString(IDS_LOG_FILTER_ALL);\r
break;\r
- case LOGFILTER_MESSAGES:\r
- temp.LoadString(IDS_LOG_FILTER_MESSAGES);\r
- break;\r
- case LOGFILTER_PATHS:\r
- temp.LoadString(IDS_LOG_FILTER_PATHS);\r
- break;\r
- case LOGFILTER_AUTHORS:\r
- temp.LoadString(IDS_LOG_FILTER_AUTHORS);\r
- break;\r
- case LOGFILTER_REVS:\r
- temp.LoadString(IDS_LOG_FILTER_REVS);\r
- break;\r
- }\r
- // to make the cue banner text appear more to the right of the edit control\r
- temp = _T(" ")+temp;\r
- m_cFilter.SetCueBanner(temp);\r
-}\r
-#if 0\r
-void CLogDlg::OnLvnGetdispinfoLoglist(NMHDR *pNMHDR, LRESULT *pResult)\r
-{\r
- NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);\r
-\r
- // Create a pointer to the item\r
- LV_ITEM* pItem = &(pDispInfo)->item;\r
-\r
- // Do the list need text information?\r
- if (!(pItem->mask & LVIF_TEXT))\r
- return;\r
-\r
- // By default, clear text buffer.\r
- lstrcpyn(pItem->pszText, _T(""), pItem->cchTextMax);\r
-\r
- bool bOutOfRange = pItem->iItem >= ShownCountWithStopped();\r
- \r
- *pResult = 0;\r
- if (m_bNoDispUpdates || m_bThreadRunning || bOutOfRange)\r
- return;\r
-\r
- // Which item number?\r
- int itemid = pItem->iItem;\r
- GitRev * pLogEntry = NULL;\r
- if (itemid < m_arShownList.GetCount())\r
- pLogEntry = reinterpret_cast<GitRev*>(m_arShownList.GetAt(pItem->iItem));\r
- \r
- // Which column?\r
- switch (pItem->iSubItem)\r
- {\r
- case this->LOGLIST_GRAPH: //Graphic\r
- if (pLogEntry)\r
- {\r
- }\r
- break;\r
- case this->LOGLIST_ACTION: //action -- no text in the column\r
- break;\r
- case this->LOGLIST_MESSAGE: //Message\r
- if (pLogEntry)\r
- lstrcpyn(pItem->pszText, (LPCTSTR)pLogEntry->m_Subject, pItem->cchTextMax);\r
- break;\r
- case this->LOGLIST_AUTHOR: //Author\r
- if (pLogEntry)\r
- lstrcpyn(pItem->pszText, (LPCTSTR)pLogEntry->m_AuthorName, pItem->cchTextMax);\r
- break;\r
- case this->LOGLIST_DATE: //Date\r
- if (pLogEntry)\r
- lstrcpyn(pItem->pszText, (LPCTSTR)pLogEntry->m_AuthorDate.Format(_T("%Y-%m-%d %H:%M")), pItem->cchTextMax);\r
- break;\r
- \r
- case 5:\r
-\r
- break;\r
- default:\r
- ASSERT(false);\r
- }\r
-}\r
-#endif\r
-void CLogDlg::OnLvnGetdispinfoChangedFileList(NMHDR *pNMHDR, LRESULT *pResult)\r
-{\r
-\r
- NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);\r
-\r
- //Create a pointer to the item\r
- LV_ITEM* pItem= &(pDispInfo)->item;\r
-\r
- *pResult = 0;\r
- if ((m_bNoDispUpdates)||(m_bThreadRunning))\r
- {\r
- if (pItem->mask & LVIF_TEXT)\r
- lstrcpyn(pItem->pszText, _T(""), pItem->cchTextMax);\r
- return;\r
- }\r
- if ((m_currentChangedArray!=NULL)&&(pItem->iItem >= m_currentChangedArray->GetCount()))\r
- {\r
- if (pItem->mask & LVIF_TEXT)\r
- lstrcpyn(pItem->pszText, _T(""), pItem->cchTextMax);\r
- return;\r
- }\r
- if ((m_currentChangedArray==NULL)&&(pItem->iItem >= m_currentChangedPathList.GetCount()))\r
- {\r
- if (pItem->mask & LVIF_TEXT)\r
- lstrcpyn(pItem->pszText, _T(""), pItem->cchTextMax);\r
- return;\r
- }\r
- CTGitPath lcpath = NULL;\r
- if (m_currentChangedArray)\r
- lcpath = (*m_currentChangedArray)[pItem->iItem];\r
- //Does the list need text information?\r
- if (pItem->mask & LVIF_TEXT)\r
- {\r
- //Which column?\r
- switch (pItem->iSubItem)\r
- {\r
- case this->FILELIST_ACTION: //Action\r
-#if 0\r
- if (lcpath)\r
- lstrcpyn(pItem->pszText, (LPCTSTR)lcpath->GetAction(), pItem->cchTextMax);\r
- else\r
- lstrcpyn(pItem->pszText, _T(""), pItem->cchTextMax); \r
-#endif\r
- lstrcpyn(pItem->pszText, (LPCTSTR)lcpath.GetActionName(), pItem->cchTextMax);\r
-\r
- break;\r
-\r
- case this->FILELIST_ADD: //add\r
-#if 0\r
- if (lcpath)\r
- lstrcpyn(pItem->pszText, (LPCTSTR)lcpath->sPath, pItem->cchTextMax);\r
- else\r
- lstrcpyn(pItem->pszText, (LPCTSTR)m_currentChangedPathList[pItem->iItem].GetGitPathString(), pItem->cchTextMax);\r
-#endif\r
- lstrcpyn(pItem->pszText, (LPCTSTR)lcpath.m_StatAdd, pItem->cchTextMax);\r
- break;\r
-\r
- case this->FILELIST_DEL: //del\r
-#if 0\r
- if (lcpath)\r
- lstrcpyn(pItem->pszText, (LPCTSTR)lcpath->sCopyFromPath, pItem->cchTextMax);\r
- else\r
- lstrcpyn(pItem->pszText, _T(""), pItem->cchTextMax);\r
-#endif\r
- lstrcpyn(pItem->pszText, (LPCTSTR)lcpath.m_StatDel, pItem->cchTextMax);\r
- break;\r
- case this->FILELIST_PATH: //path\r
-#if 0\r
- if ((lcpath==NULL)||(lcpath->sCopyFromPath.IsEmpty()))\r
- lstrcpyn(pItem->pszText, _T(""), pItem->cchTextMax);\r
- else\r
- _stprintf_s(pItem->pszText, pItem->cchTextMax, _T("%ld"), lcpath->lCopyFromRev);\r
-#endif\r
- lstrcpyn(pItem->pszText, (LPCTSTR)lcpath.GetGitPathString(), pItem->cchTextMax);\r
- break;\r
- }\r
- }\r
-\r
- *pResult = 0;\r
-}\r
-\r
-void CLogDlg::OnEnChangeSearchedit()\r
-{\r
-#if 0\r
- UpdateData();\r
- if (m_sFilterText.IsEmpty())\r
- {\r
- CStoreSelection storeselection(this);\r
- // clear the filter, i.e. make all entries appear\r
- theApp.DoWaitCursor(1);\r
- KillTimer(LOGFILTER_TIMER);\r
- FillLogMessageCtrl(false);\r
- InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
- m_arShownList.RemoveAll();\r
- for (DWORD i=0; i<m_logEntries.size(); ++i)\r
- {\r
- if (IsEntryInDateRange(i))\r
- m_arShownList.Add(m_logEntries[i]);\r
- }\r
- InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
- m_LogList.DeleteAllItems();\r
- m_LogList.SetItemCountEx(ShownCountWithStopped());\r
- m_LogList.RedrawItems(0, ShownCountWithStopped());\r
- m_LogList.SetRedraw(false);\r
- ResizeAllListCtrlCols();\r
- m_LogList.SetRedraw(true);\r
- theApp.DoWaitCursor(-1);\r
- GetDlgItem(IDC_SEARCHEDIT)->ShowWindow(SW_HIDE);\r
- GetDlgItem(IDC_SEARCHEDIT)->ShowWindow(SW_SHOW);\r
- GetDlgItem(IDC_SEARCHEDIT)->SetFocus();\r
- DialogEnableWindow(IDC_STATBUTTON, !(((m_bThreadRunning)||(m_arShownList.IsEmpty()))));\r
- return;\r
- }\r
- if (Validate(m_sFilterText))\r
- SetTimer(LOGFILTER_TIMER, 1000, NULL);\r
- else\r
- KillTimer(LOGFILTER_TIMER);\r
-#endif\r
-}\r
-\r
-bool CLogDlg::ValidateRegexp(LPCTSTR regexp_str, tr1::wregex& pat, bool bMatchCase /* = false */)\r
-{\r
- try\r
- {\r
- tr1::regex_constants::syntax_option_type type = tr1::regex_constants::ECMAScript;\r
- if (!bMatchCase)\r
- type |= tr1::regex_constants::icase;\r
- pat = tr1::wregex(regexp_str, type);\r
- return true;\r
+ case LOGFILTER_MESSAGES:\r
+ temp.LoadString(IDS_LOG_FILTER_MESSAGES);\r
+ break;\r
+ case LOGFILTER_PATHS:\r
+ temp.LoadString(IDS_LOG_FILTER_PATHS);\r
+ break;\r
+ case LOGFILTER_AUTHORS:\r
+ temp.LoadString(IDS_LOG_FILTER_AUTHORS);\r
+ break;\r
+ case LOGFILTER_REVS:\r
+ temp.LoadString(IDS_LOG_FILTER_REVS);\r
+ break;\r
}\r
- catch (exception) {}\r
- return false;\r
+ // to make the cue banner text appear more to the right of the edit control\r
+ temp = _T(" ")+temp;\r
+ m_cFilter.SetCueBanner(temp);\r
}\r
\r
bool CLogDlg::Validate(LPCTSTR string)\r
if (!m_bFilterWithRegex)\r
return true;\r
tr1::wregex pat;\r
- return ValidateRegexp(string, pat, false);\r
+ return m_LogList.ValidateRegexp(string, pat, false);\r
}\r
\r
-void CLogDlg::RecalculateShownList(CPtrArray * pShownlist)\r
-{\r
-#if 0\r
- pShownlist->RemoveAll();\r
- tr1::wregex pat;//(_T("Remove"), tr1::regex_constants::icase);\r
- bool bRegex = false;\r
- if (m_bFilterWithRegex)\r
- bRegex = ValidateRegexp(m_sFilterText, pat, false);\r
-\r
- tr1::regex_constants::match_flag_type flags = tr1::regex_constants::match_any;\r
- CString sRev;\r
- for (DWORD i=0; i<m_logEntries.size(); ++i)\r
- {\r
- if ((bRegex)&&(m_bFilterWithRegex))\r
- {\r
- if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_BUGID))\r
- {\r
- ATLTRACE(_T("bugID = \"%s\"\n"), (LPCTSTR)m_logEntries[i]->sBugIDs);\r
- if (regex_search(wstring((LPCTSTR)m_logEntries[i]->sBugIDs), pat, flags)&&IsEntryInDateRange(i))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- continue;\r
- }\r
- }\r
- if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_MESSAGES))\r
- {\r
- ATLTRACE(_T("messge = \"%s\"\n"), (LPCTSTR)m_logEntries[i]->sMessage);\r
- if (regex_search(wstring((LPCTSTR)m_logEntries[i]->sMessage), pat, flags)&&IsEntryInDateRange(i))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- continue;\r
- }\r
- }\r
- if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_PATHS))\r
- {\r
- LogChangedPathArray * cpatharray = m_logEntries[i]->pArChangedPaths;\r
-\r
- bool bGoing = true;\r
- for (INT_PTR cpPathIndex = 0; cpPathIndex<cpatharray->GetCount() && bGoing; ++cpPathIndex)\r
- {\r
- LogChangedPath * cpath = cpatharray->GetAt(cpPathIndex);\r
- if (regex_search(wstring((LPCTSTR)cpath->sCopyFromPath), pat, flags)&&IsEntryInDateRange(i))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- bGoing = false;\r
- continue;\r
- }\r
- if (regex_search(wstring((LPCTSTR)cpath->sPath), pat, flags)&&IsEntryInDateRange(i))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- bGoing = false;\r
- continue;\r
- }\r
- if (regex_search(wstring((LPCTSTR)cpath->GetAction()), pat, flags)&&IsEntryInDateRange(i))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- bGoing = false;\r
- continue;\r
- }\r
- }\r
- if (!bGoing)\r
- continue;\r
- }\r
- if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_AUTHORS))\r
- {\r
- if (regex_search(wstring((LPCTSTR)m_logEntries[i]->sAuthor), pat, flags)&&IsEntryInDateRange(i))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- continue;\r
- }\r
- }\r
- if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_REVS))\r
- {\r
- sRev.Format(_T("%ld"), m_logEntries[i]->Rev);\r
- if (regex_search(wstring((LPCTSTR)sRev), pat, flags)&&IsEntryInDateRange(i))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- continue;\r
- }\r
- }\r
- } // if (bRegex)\r
- else\r
- {\r
- CString find = m_sFilterText;\r
- find.MakeLower();\r
- if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_BUGID))\r
- {\r
- CString sBugIDs = m_logEntries[i]->sBugIDs;\r
-\r
- sBugIDs = sBugIDs.MakeLower();\r
- if ((sBugIDs.Find(find) >= 0)&&(IsEntryInDateRange(i)))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- continue;\r
- }\r
- }\r
- if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_MESSAGES))\r
- {\r
- CString msg = m_logEntries[i]->sMessage;\r
-\r
- msg = msg.MakeLower();\r
- if ((msg.Find(find) >= 0)&&(IsEntryInDateRange(i)))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- continue;\r
- }\r
- }\r
- if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_PATHS))\r
- {\r
- LogChangedPathArray * cpatharray = m_logEntries[i]->pArChangedPaths;\r
-\r
- bool bGoing = true;\r
- for (INT_PTR cpPathIndex = 0; cpPathIndex<cpatharray->GetCount() && bGoing; ++cpPathIndex)\r
- {\r
- LogChangedPath * cpath = cpatharray->GetAt(cpPathIndex);\r
- CString path = cpath->sCopyFromPath;\r
- path.MakeLower();\r
- if ((path.Find(find)>=0)&&(IsEntryInDateRange(i)))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- bGoing = false;\r
- continue;\r
- }\r
- path = cpath->sPath;\r
- path.MakeLower();\r
- if ((path.Find(find)>=0)&&(IsEntryInDateRange(i)))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- bGoing = false;\r
- continue;\r
- }\r
- path = cpath->GetAction();\r
- path.MakeLower();\r
- if ((path.Find(find)>=0)&&(IsEntryInDateRange(i)))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- bGoing = false;\r
- continue;\r
- }\r
- }\r
- }\r
- if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_AUTHORS))\r
- {\r
- CString msg = m_logEntries[i]->sAuthor;\r
- msg = msg.MakeLower();\r
- if ((msg.Find(find) >= 0)&&(IsEntryInDateRange(i)))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- continue;\r
- }\r
- }\r
- if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_REVS))\r
- {\r
- sRev.Format(_T("%ld"), m_logEntries[i]->Rev);\r
- if ((sRev.Find(find) >= 0)&&(IsEntryInDateRange(i)))\r
- {\r
- pShownlist->Add(m_logEntries[i]);\r
- continue;\r
- }\r
- }\r
- } // else (from if (bRegex)) \r
- } // for (DWORD i=0; i<m_logEntries.size(); ++i) \r
-#endif\r
-}\r
\r
void CLogDlg::OnTimer(UINT_PTR nIDEvent)\r
{\r
if (nIDEvent == LOGFILTER_TIMER)\r
{\r
- if (m_bThreadRunning)\r
+ if (this->IsThreadRunning())\r
{\r
// thread still running! So just restart the timer.\r
SetTimer(LOGFILTER_TIMER, 1000, NULL);\r
CWnd * focusWnd = GetFocus();\r
bool bSetFocusToFilterControl = ((focusWnd != GetDlgItem(IDC_DATEFROM))&&(focusWnd != GetDlgItem(IDC_DATETO))\r
&& (focusWnd != GetDlgItem(IDC_LOGLIST)));\r
- if (m_sFilterText.IsEmpty())\r
+ if (m_LogList.m_sFilterText.IsEmpty())\r
{\r
- DialogEnableWindow(IDC_STATBUTTON, !(((m_bThreadRunning)||(m_arShownList.IsEmpty()))));\r
+ DialogEnableWindow(IDC_STATBUTTON, !(((this->IsThreadRunning())||(m_LogList.m_arShownList.IsEmpty()))));\r
// do not return here!\r
// we also need to run the filter if the filter text is empty:\r
// 1. to clear an existing filter\r
FillLogMessageCtrl(false);\r
\r
// now start filter the log list\r
- InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
- RecalculateShownList(&m_arShownList);\r
- InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
+ m_LogList.StartFilter();\r
\r
-\r
- m_LogList.DeleteAllItems();\r
- m_LogList.SetItemCountEx(ShownCountWithStopped());\r
- m_LogList.RedrawItems(0, ShownCountWithStopped());\r
- m_LogList.SetRedraw(false);\r
- ResizeAllListCtrlCols();\r
- m_LogList.SetRedraw(true);\r
- m_LogList.Invalidate();\r
if ( m_LogList.GetItemCount()==1 )\r
{\r
m_LogList.SetSelectionMark(0);\r
GetDlgItem(IDC_SEARCHEDIT)->SetFocus();\r
UpdateLogInfoLabel();\r
} // if (nIDEvent == LOGFILTER_TIMER)\r
- DialogEnableWindow(IDC_STATBUTTON, !(((m_bThreadRunning)||(m_arShownList.IsEmpty()))));\r
+ DialogEnableWindow(IDC_STATBUTTON, !(((this->IsThreadRunning())||(m_LogList.m_arShownList.IsEmpty()))));\r
__super::OnTimer(nIDEvent);\r
}\r
\r
try\r
{\r
CTime time(_time.GetYear(), _time.GetMonth(), _time.GetDay(), 23, 59, 59);\r
- if (time.GetTime() != m_tTo)\r
+ if (time.GetTime() != m_LogList.m_To.GetTime())\r
{\r
- m_tTo = (DWORD)time.GetTime();\r
+ m_LogList.m_To = (DWORD)time.GetTime();\r
SetTimer(LOGFILTER_TIMER, 10, NULL);\r
}\r
}\r
try\r
{\r
CTime time(_time.GetYear(), _time.GetMonth(), _time.GetDay(), 0, 0, 0);\r
- if (time.GetTime() != m_tFrom)\r
+ if (time.GetTime() != m_LogList.m_From.GetTime())\r
{\r
- m_tFrom = (DWORD)time.GetTime();\r
+ m_LogList.m_From = (DWORD)time.GetTime();\r
SetTimer(LOGFILTER_TIMER, 10, NULL);\r
}\r
}\r
*pResult = 0;\r
}\r
\r
-BOOL CLogDlg::IsEntryInDateRange(int i)\r
-{\r
-#if 0\r
- __time64_t time = m_logEntries[i]->tmDate;\r
- if ((time >= m_tFrom)&&(time <= m_tTo))\r
- return TRUE;\r
-#endif\r
- return FALSE;\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
void CLogDlg::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult)\r
{\r
- if (m_bThreadRunning)\r
+ if (this->IsThreadRunning())\r
return; //no sorting while the arrays are filled\r
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);\r
const int nColumn = pNMLV->iSubItem;\r
SortShownListArray();\r
m_LogList.Invalidate();\r
UpdateLogInfoLabel();\r
- // the "next 100" button only makes sense if the log messages\r
- // are sorted by revision in descending order\r
- if ((m_nSortColumn)||(m_bAscending))\r
- {\r
- DialogEnableWindow(IDC_NEXTHUNDRED, false);\r
- }\r
- else\r
- {\r
- DialogEnableWindow(IDC_NEXTHUNDRED, true);\r
- }\r
+ \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 (m_bThreadRunning)\r
+#if 0\r
+ if (this->IsThreadRunning())\r
return; //no sorting while the arrays are filled\r
if (m_currentChangedArray == NULL)\r
return;\r
SetSortArrow(&m_ChangedFileListCtrl, m_nSortColumnPathList, m_bAscendingPathList);\r
m_ChangedFileListCtrl.Invalidate();\r
*pResult = 0;\r
+#endif\r
}\r
\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
return 0;\r
}\r
\r
-#if 0\r
-void CLogDlg::ResizeAllListCtrlCols()\r
-{\r
-\r
- const int nMinimumWidth = ICONITEMBORDER+16*4;\r
- int maxcol = ((CHeaderCtrl*)(m_LogList.GetDlgItem(0)))->GetItemCount()-1;\r
- int nItemCount = m_LogList.GetItemCount();\r
- TCHAR textbuf[MAX_PATH];\r
- CHeaderCtrl * pHdrCtrl = (CHeaderCtrl*)(m_LogList.GetDlgItem(0));\r
- if (pHdrCtrl)\r
- {\r
- for (int col = 0; col <= maxcol; col++)\r
- {\r
- HDITEM hdi = {0};\r
- hdi.mask = HDI_TEXT;\r
- hdi.pszText = textbuf;\r
- hdi.cchTextMax = sizeof(textbuf);\r
- pHdrCtrl->GetItem(col, &hdi);\r
- int cx = m_LogList.GetStringWidth(hdi.pszText)+20; // 20 pixels for col separator and margin\r
- for (int index = 0; index<nItemCount; ++index)\r
- {\r
- // get the width of the string and add 14 pixels for the column separator and margins\r
- int linewidth = m_LogList.GetStringWidth(m_LogList.GetItemText(index, col)) + 14;\r
- if (index < m_arShownList.GetCount())\r
- {\r
- GitRev * pCurLogEntry = reinterpret_cast<GitRev*>(m_arShownList.GetAt(index));\r
- if ((pCurLogEntry)&&(pCurLogEntry->m_CommitHash == m_wcRev.m_CommitHash))\r
- {\r
- // set the bold font and ask for the string width again\r
- m_LogList.SendMessage(WM_SETFONT, (WPARAM)m_boldFont, NULL);\r
- linewidth = m_LogList.GetStringWidth(m_LogList.GetItemText(index, col)) + 14;\r
- // restore the system font\r
- m_LogList.SendMessage(WM_SETFONT, NULL, NULL);\r
- }\r
- }\r
- if (index == 0)\r
- {\r
- // add the image size\r
- CImageList * pImgList = m_LogList.GetImageList(LVSIL_SMALL);\r
- if ((pImgList)&&(pImgList->GetImageCount()))\r
- {\r
- IMAGEINFO imginfo;\r
- pImgList->GetImageInfo(0, &imginfo);\r
- linewidth += (imginfo.rcImage.right - imginfo.rcImage.left);\r
- linewidth += 3; // 3 pixels between icon and text\r
- }\r
- }\r
- if (cx < linewidth)\r
- cx = linewidth;\r
- }\r
- // Adjust columns "Actions" containing icons\r
- if (col == this->LOGLIST_ACTION)\r
- {\r
- if (cx < nMinimumWidth)\r
- {\r
- cx = nMinimumWidth;\r
- }\r
- }\r
- \r
- if (col == this->LOGLIST_MESSAGE)\r
- {\r
- if (cx > LOGLIST_MESSAGE_MAX)\r
- {\r
- cx = LOGLIST_MESSAGE_MAX;\r
- }\r
-\r
- }\r
- // keep the bug id column small\r
- if ((col == 4)&&(m_bShowBugtraqColumn))\r
- {\r
- if (cx > (int)(DWORD)m_regMaxBugIDColWidth)\r
- {\r
- cx = (int)(DWORD)m_regMaxBugIDColWidth;\r
- }\r
- }\r
-\r
- m_LogList.SetColumnWidth(col, cx);\r
- }\r
- }\r
-\r
-}\r
-#endif\r
-\r
void CLogDlg::OnBnClickedHidepaths()\r
{\r
FillLogMessageCtrl();\r
Refresh();\r
}\r
\r
-void CLogDlg::OnBnClickedIncludemerge()\r
-{\r
-#if 0\r
- m_endrev = 0;\r
-\r
- m_limit = 0;\r
-#endif\r
- Refresh();\r
-}\r
\r
void CLogDlg::UpdateLogInfoLabel()\r
{\r
-#if 0\r
- git_revnum_t rev1 = 0;\r
- git_revnum_t rev2 = 0;\r
+\r
+ git_revnum_t rev1 ;\r
+ git_revnum_t rev2 ;\r
long selectedrevs = 0;\r
- if (m_arShownList.GetCount())\r
+ int count =m_LogList.m_arShownList.GetCount();\r
+ if (count)\r
{\r
- PLOGENTRYDATA pLogEntry = reinterpret_cast<PLOGENTRYDATA>(m_arShownList.GetAt(0));\r
- rev1 = pLogEntry->Rev;\r
- pLogEntry = reinterpret_cast<PLOGENTRYDATA>(m_arShownList.GetAt(m_arShownList.GetCount()-1));\r
- rev2 = pLogEntry->Rev;\r
+ rev1 = (reinterpret_cast<GitRev*>(m_LogList.m_arShownList.GetAt(0)))->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(IDS_LOG_LOGINFOSTRING, m_arShownList.GetCount(), rev2, rev1, selectedrevs);\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
m_sLogInfo = sTemp;\r
-#endif\r
+\r
UpdateData(FALSE);\r
}\r
\r
+#if 0\r
void CLogDlg::ShowContextMenuForChangedpaths(CWnd* /*pWnd*/, CPoint point)\r
{\r
\r
\r
bool bOneRev = true;\r
int sel=m_LogList.GetNextSelectedItem(pos);\r
- GitRev * pLogEntry = reinterpret_cast<GitRev *>(m_arShownList.GetAt(sel));\r
+ GitRev * pLogEntry = reinterpret_cast<GitRev *>(m_LogList.m_arShownList.GetAt(sel));\r
GitRev * rev1 = pLogEntry;\r
- GitRev * rev2 = reinterpret_cast<GitRev *>(m_arShownList.GetAt(sel+1));\r
+ GitRev * rev2 = reinterpret_cast<GitRev *>(m_LogList.m_arShownList.GetAt(sel+1));\r
#if 0\r
bool bOneRev = true;\r
if (pos)\r
{\r
// if ((!bOneRev)||(IsDiffPossible(changedlogpaths[0], rev1)))\r
{\r
- popup.AppendMenuIcon(ID_DIFF, IDS_LOG_POPUP_DIFF, IDI_DIFF);\r
- popup.AppendMenuIcon(ID_BLAMEDIFF, IDS_LOG_POPUP_BLAMEDIFF, IDI_BLAME);\r
- popup.SetDefaultItem(ID_DIFF, FALSE);\r
- popup.AppendMenuIcon(ID_GNUDIFF1, IDS_LOG_POPUP_GNUDIFF_CH, IDI_DIFF);\r
+ popup.AppendMenuIcon(CGitLogList::ID_DIFF, IDS_LOG_POPUP_DIFF, IDI_DIFF);\r
+ popup.AppendMenuIcon(CGitLogList::ID_BLAMEDIFF, IDS_LOG_POPUP_BLAMEDIFF, IDI_BLAME);\r
+ popup.SetDefaultItem(CGitLogList::ID_DIFF, FALSE);\r
+ popup.AppendMenuIcon(CGitLogList::ID_GNUDIFF1, IDS_LOG_POPUP_GNUDIFF_CH, IDI_DIFF);\r
bEntryAdded = true;\r
}\r
// if (rev2 == rev1-1)\r
{\r
if (bEntryAdded)\r
popup.AppendMenu(MF_SEPARATOR, NULL);\r
- popup.AppendMenuIcon(ID_OPEN, IDS_LOG_POPUP_OPEN, IDI_OPEN);\r
- popup.AppendMenuIcon(ID_OPENWITH, IDS_LOG_POPUP_OPENWITH, IDI_OPEN);\r
- popup.AppendMenuIcon(ID_BLAME, IDS_LOG_POPUP_BLAME, IDI_BLAME);\r
+ popup.AppendMenuIcon(CGitLogList::ID_OPEN, IDS_LOG_POPUP_OPEN, IDI_OPEN);\r
+ popup.AppendMenuIcon(CGitLogList::ID_OPENWITH, IDS_LOG_POPUP_OPENWITH, IDI_OPEN);\r
+ popup.AppendMenuIcon(CGitLogList::ID_BLAME, IDS_LOG_POPUP_BLAME, IDI_BLAME);\r
popup.AppendMenu(MF_SEPARATOR, NULL);\r
if (m_hasWC)\r
- popup.AppendMenuIcon(ID_REVERTREV, IDS_LOG_POPUP_REVERTREV, IDI_REVERT);\r
- popup.AppendMenuIcon(ID_POPPROPS, IDS_REPOBROWSE_SHOWPROP, IDI_PROPERTIES); // "Show Properties"\r
- popup.AppendMenuIcon(ID_LOG, IDS_MENULOG, IDI_LOG); // "Show Log" \r
- popup.AppendMenuIcon(ID_GETMERGELOGS, IDS_LOG_POPUP_GETMERGELOGS, IDI_LOG); // "Show merge log"\r
- popup.AppendMenuIcon(ID_SAVEAS, IDS_LOG_POPUP_SAVE, IDI_SAVEAS);\r
+ popup.AppendMenuIcon(CGitLogList::ID_REVERTREV, IDS_LOG_POPUP_REVERTREV, IDI_REVERT);\r
+ popup.AppendMenuIcon(CGitLogList::ID_POPPROPS, IDS_REPOBROWSE_SHOWPROP, IDI_PROPERTIES); // "Show Properties"\r
+ popup.AppendMenuIcon(CGitLogList::ID_LOG, IDS_MENULOG, IDI_LOG); // "Show Log" \r
+ popup.AppendMenuIcon(CGitLogList::ID_GETMERGELOGS, IDS_LOG_POPUP_GETMERGELOGS, IDI_LOG); // "Show merge log"\r
+ popup.AppendMenuIcon(CGitLogList::ID_SAVEAS, IDS_LOG_POPUP_SAVE, IDI_SAVEAS);\r
bEntryAdded = true;\r
if (!m_ProjectProperties.sWebViewerPathRev.IsEmpty())\r
{\r
popup.AppendMenu(MF_SEPARATOR, NULL);\r
- popup.AppendMenuIcon(ID_VIEWPATHREV, IDS_LOG_POPUP_VIEWPATHREV);\r
+ popup.AppendMenuIcon(CGitLogList::ID_VIEWPATHREV, IDS_LOG_POPUP_VIEWPATHREV);\r
}\r
if (popup.GetDefaultItem(0,FALSE)==-1)\r
- popup.SetDefaultItem(ID_OPEN, FALSE);\r
+ popup.SetDefaultItem(CGitLogList::ID_OPEN, FALSE);\r
}\r
}\r
else if (changedlogpaths.size())\r
{\r
// more than one entry is selected\r
- popup.AppendMenuIcon(ID_SAVEAS, IDS_LOG_POPUP_SAVE);\r
+ popup.AppendMenuIcon(CGitLogList::ID_SAVEAS, IDS_LOG_POPUP_SAVE);\r
bEntryAdded = true;\r
}\r
\r
\r
switch (cmd)\r
{\r
- case ID_DIFF:\r
+ case CGitLogList::ID_DIFF:\r
{\r
DoDiffFromLog(selIndex, rev1, rev2, false, false);\r
}\r
\r
} // if (popup.CreatePopupMenu())\r
}\r
+#endif\r
\r
void CLogDlg::OnDtnDropdownDatefrom(NMHDR * /*pNMHDR*/, LRESULT *pResult)\r
{\r
\r
void CLogDlg::OnRefresh()\r
{\r
- if (GetDlgItem(IDC_GETALL)->IsWindowEnabled())\r
+ //if (GetDlgItem(IDC_GETALL)->IsWindowEnabled())\r
+ ShowStartRef();\r
{\r
m_limit = 0;\r
+ this->m_LogProgress.SetPos(0);\r
+ \r
Refresh (true);\r
}\r
}\r
if (GetFocus() == &m_ChangedFileListCtrl)\r
CopyChangedSelectionToClipBoard();\r
else\r
- CopySelectionToClipBoard();\r
+ m_LogList.CopySelectionToClipBoard();\r
}\r
\r
CString CLogDlg::GetAbsoluteUrlFromRelativeUrl(const CString& url)\r
}\r
\r
\r
-int CLogDataVector::ParserFromLog()\r
+void CLogDlg::OnEnChangeSearchedit()\r
+{\r
+ UpdateData();\r
+ if (m_LogList.m_sFilterText.IsEmpty())\r
+ {\r
+ CStoreSelection storeselection(this);\r
+ // clear the filter, i.e. make all entries appear\r
+ theApp.DoWaitCursor(1);\r
+ KillTimer(LOGFILTER_TIMER);\r
+ FillLogMessageCtrl(false);\r
+ m_LogList.StartFilter();\r
+#if 0\r
+ InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
+ m_arShownList.RemoveAll();\r
+ for (DWORD i=0; i<m_logEntries.size(); ++i)\r
+ {\r
+ if (IsEntryInDateRange(i))\r
+ m_arShownList.Add(m_logEntries[i]);\r
+ }\r
+ InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
+ m_LogList.DeleteAllItems();\r
+ m_LogList.SetItemCountEx(ShownCountWithStopped());\r
+ m_LogList.RedrawItems(0, ShownCountWithStopped());\r
+ m_LogList.SetRedraw(false);\r
+ ResizeAllListCtrlCols();\r
+ m_LogList.SetRedraw(true);\r
+#endif\r
+ theApp.DoWaitCursor(-1);\r
+ GetDlgItem(IDC_SEARCHEDIT)->ShowWindow(SW_HIDE);\r
+ GetDlgItem(IDC_SEARCHEDIT)->ShowWindow(SW_SHOW);\r
+ GetDlgItem(IDC_SEARCHEDIT)->SetFocus();\r
+ DialogEnableWindow(IDC_STATBUTTON, !(((this->IsThreadRunning())||(m_LogList.m_arShownList.IsEmpty()))));\r
+ return;\r
+ }\r
+ if (Validate(m_LogList.m_sFilterText))\r
+ SetTimer(LOGFILTER_TIMER, 1000, NULL);\r
+ else\r
+ KillTimer(LOGFILTER_TIMER);\r
+\r
+}\r
+\r
+void CLogDlg::OnBnClickedAllBranch()\r
+{\r
+ this->UpdateData();\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
+ OnRefresh();\r
+\r
+ FillLogMessageCtrl(false);\r
+}\r
+\r
+void CLogDlg::OnBnClickedBrowseRef()\r
{\r
- CString log;\r
- GitRev rev;\r
- g_Git.GetLog(log);\r
+ CString newRef = CBrowseRefsDlg::PickRef(false,m_LogList.GetStartRef()); \r
+ if(newRef.IsEmpty())\r
+ return;\r
\r
- CString begin;\r
- begin.Format(_T("#<%c>"),LOG_REV_ITEM_BEGIN);\r
- \r
- if(log.GetLength()==0)\r
- return 0;\r
- \r
- int start=4;\r
- int length;\r
- int next =1;\r
- while( next>0 )\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
- next=log.Find(begin,start);\r
- if(next >0 )\r
- length = next - start+4;\r
- else\r
- length = log.GetLength()-start+4;\r
+ GetDlgItem(IDC_STATIC_REF)->SetWindowText(L"<All Branches>");\r
+ return;\r
+ }\r
\r
- CString onelog =log;\r
- onelog=log.Mid(start -4,length);\r
- rev.ParserFromLog(onelog);\r
- this->push_back(rev);\r
- start = next +4;\r
+ CString showStartRef = m_LogList.GetStartRef();\r
+ if(showStartRef.IsEmpty())\r
+ {\r
+ //Ref name is HEAD\r
+ g_Git.Run(L"git symbolic-ref HEAD",&showStartRef,CP_UTF8);\r
+ showStartRef.Trim(L"\r\n\t ");\r
}\r
\r
- return 0;\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
+ GetDlgItem(IDC_STATIC_REF)->SetWindowText(showStartRef);\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
+ this->UpdateData();\r
+\r
+ if(this->m_bFirstParent)\r
+ m_LogList.m_ShowMask|=CGit::LOG_INFO_FIRST_PARENT;\r
+ else\r
+ m_LogList.m_ShowMask&=~CGit::LOG_INFO_FIRST_PARENT;\r
+\r
+ OnRefresh();\r
+\r
+ FillLogMessageCtrl(false);\r
+\r
+}\r
+\r
+void CLogDlg::OnBnClickShowWholeProject()\r
+{\r
+ this->UpdateData();\r
+\r
+ if(this->m_bWholeProject)\r
+ {\r
+ m_LogList.m_Path.Reset();\r
+ SetWindowText(m_sTitle + _T(" - ") + CString(_T("Whole Project")));\r
+ }\r
+ else\r
+ {\r
+ m_LogList.m_Path=m_path;\r
+ if(!m_path.IsEmpty())\r
+ SetWindowText(m_sTitle + _T(" - ") + m_path.GetGitPathString());\r
+ }\r
+ \r
+ OnRefresh();\r
+\r
+ FillLogMessageCtrl(false);\r
+\r
}\r