//#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
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_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|SVNSLC_POPREVERT)),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_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
m_LogList.FetchLogAsync(this);\r
\r
GetDlgItem(IDC_LOGLIST)->SetFocus();\r
+\r
+ ShowStartRef();\r
return FALSE;\r
}\r
\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+_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
- m_ProjectProperties.FindBugID(pLogEntry->m_Body, pMsgView);\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::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
\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
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
+ GetDlgItem(IDC_STATIC_REF)->SetWindowText(L"<All Branches>");\r
+ return;\r
+ }\r
+\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
+\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
\r
FillLogMessageCtrl(false);\r
\r
-}
\ No newline at end of file
+}\r