OSDN Git Service

Show Bug ID link at log dialog
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / LogDlg.cpp
index cc09e5e..35276ce 100644 (file)
@@ -45,7 +45,7 @@
 //#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
@@ -77,7 +77,6 @@ CLogDlg::CLogDlg(CWnd* pParent /*=NULL*/)
        , 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
@@ -145,6 +144,7 @@ BEGIN_MESSAGE_MAP(CLogDlg, CResizableStandAloneDialog)
        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
@@ -171,12 +171,6 @@ BOOL CLogDlg::OnInitDialog()
 \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
@@ -210,7 +204,7 @@ BOOL CLogDlg::OnInitDialog()
        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
@@ -243,6 +237,8 @@ BOOL CLogDlg::OnInitDialog()
        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
@@ -338,6 +334,8 @@ BOOL CLogDlg::OnInitDialog()
        m_LogList.FetchLogAsync(this);\r
 \r
        GetDlgItem(IDC_LOGLIST)->SetFocus();\r
+\r
+       ShowStartRef();\r
        return FALSE;\r
 }\r
 \r
@@ -517,10 +515,17 @@ void CLogDlg::FillLogMessageCtrl(bool bShow /* = true*/)
                }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
@@ -766,24 +771,27 @@ GitRev g_rev;
 \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
@@ -816,9 +824,10 @@ void CLogDlg::CopyChangedSelectionToClipBoard()
                        }\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
@@ -1792,261 +1801,6 @@ void CLogDlg::OnBnClickedStatbutton()
 \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
@@ -2147,6 +1901,10 @@ void CLogDlg::SetSplitterRange()
 \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
@@ -3177,6 +2935,7 @@ void CLogDlg::OnSize(UINT nType, int cx, int cy)
 void CLogDlg::OnRefresh()\r
 {\r
        //if (GetDlgItem(IDC_GETALL)->IsWindowEnabled())\r
+       ShowStartRef();\r
        {\r
                m_limit = 0;\r
                this->m_LogProgress.SetPos(0);\r
@@ -3296,6 +3055,54 @@ void CLogDlg::OnBnClickedAllBranch()
        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
@@ -3332,4 +3139,4 @@ void CLogDlg::OnBnClickShowWholeProject()
 \r
        FillLogMessageCtrl(false);\r
 \r
-}
\ No newline at end of file
+}\r