OSDN Git Service

Add context menu item "Revert" at Commit File List
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / LogDlg.cpp
index 1fa14ff..cc09e5e 100644 (file)
@@ -60,7 +60,6 @@ CLogDlg::CLogDlg(CWnd* pParent /*=NULL*/)
        , m_nSortColumn(0)\r
        , m_bShowedAll(false)\r
        , m_bSelect(false)\r
-       , m_regLastStrict(_T("Software\\TortoiseGit\\LastLogStrict"), FALSE)\r
        \r
        , m_bSelectionMustBeContinuous(false)\r
        , m_bShowBugtraqColumn(false)\r
@@ -81,7 +80,9 @@ CLogDlg::CLogDlg(CWnd* pParent /*=NULL*/)
        , m_bVista(false)\r
 {\r
        m_bFilterWithRegex = !!CRegDWORD(_T("Software\\TortoiseGit\\UseRegexFilter"), TRUE);\r
-       \r
+       m_bAllBranch=FALSE;\r
+       m_bFirstParent=FALSE;\r
+       m_bWholeProject=FALSE;\r
 }\r
 \r
 CLogDlg::~CLogDlg()\r
@@ -99,20 +100,20 @@ void CLogDlg::DoDataExchange(CDataExchange* pDX)
        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_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_BN_CLICKED(IDC_GETALL, OnBnClickedGetall)\r
        //ON_NOTIFY(NM_DBLCLK, IDC_LOGMSG, OnNMDblclkChangedFileList)\r
        ON_WM_CONTEXTMENU()\r
        ON_WM_SETCURSOR()\r
@@ -120,26 +121,29 @@ BEGIN_MESSAGE_MAP(CLogDlg, CResizableStandAloneDialog)
        ON_NOTIFY(LVN_ITEMCHANGED, IDC_LOGLIST, OnLvnItemchangedLoglist)\r
        ON_NOTIFY(EN_LINK, IDC_MSGVIEW, OnEnLinkMsgview)\r
        ON_BN_CLICKED(IDC_STATBUTTON, OnBnClickedStatbutton)\r
+\r
        \r
        ON_MESSAGE(WM_FILTEREDIT_INFOCLICKED, OnClickedInfoIcon)\r
        ON_MESSAGE(WM_FILTEREDIT_CANCELCLICKED, OnClickedCancelFilter)\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_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_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_COMMAND(ID_LOGDLG_REFRESH,&CLogDlg::OnRefresh)\r
        ON_COMMAND(ID_LOGDLG_FIND,&CLogDlg::OnFind)\r
@@ -147,7 +151,7 @@ BEGIN_MESSAGE_MAP(CLogDlg, CResizableStandAloneDialog)
        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
@@ -155,8 +159,6 @@ void CLogDlg::SetParams(const CTGitPath& path, GitRev pegrev, GitRev startrev, G
        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
@@ -164,6 +166,7 @@ void CLogDlg::SetParams(const CTGitPath& path, GitRev pegrev, GitRev startrev, G
 \r
 BOOL CLogDlg::OnInitDialog()\r
 {\r
+       CString temp;\r
        CResizableStandAloneDialog::OnInitDialog();\r
 \r
        m_hAccel = LoadAccelerators(AfxGetResourceHandle(),MAKEINTRESOURCE(IDR_ACC_LOGDLG));\r
@@ -176,17 +179,8 @@ BOOL CLogDlg::OnInitDialog()
        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
@@ -216,7 +210,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"));\r
+       m_ChangedFileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |IDS_STATUSLIST_COLADD|IDS_STATUSLIST_COLDEL , _T("LogDlg"),(SVNSLC_POPALL ^ (SVNSLC_POPCOMMIT|SVNSLC_POPREVERT)),false);\r
 \r
        GetDlgItem(IDC_LOGLIST)->UpdateData(FALSE);\r
 \r
@@ -237,8 +231,8 @@ BOOL CLogDlg::OnInitDialog()
        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
@@ -265,10 +259,10 @@ BOOL CLogDlg::OnInitDialog()
 \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
@@ -321,26 +315,18 @@ BOOL CLogDlg::OnInitDialog()
        if (m_bSelect)\r
        {\r
                // the dialog is used to select revisions\r
-               if (m_bSelectionMustBeContinuous)\r
-                       DialogEnableWindow(IDOK, (m_LogList.GetSelectedCount()!=0)&&(m_LogList.IsSelectionContinuous()));\r
-               else\r
-                       DialogEnableWindow(IDOK, m_LogList.GetSelectedCount()!=0);\r
+               // enable the OK button if appropriate\r
+               EnableOKButton();\r
        }\r
        else\r
        {\r
                // the dialog is used to just view log messages\r
+               // hide the OK button and set text on Cancel button to OK\r
                GetDlgItemText(IDOK, temp);\r
                SetDlgItemText(IDCANCEL, temp);\r
                GetDlgItem(IDOK)->ShowWindow(SW_HIDE);\r
        }\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_SHOW_WHOLE);\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
@@ -349,26 +335,22 @@ BOOL CLogDlg::OnInitDialog()
        //m_tFrom = (DWORD)-1;\r
 \r
        m_LogList.m_Path=m_path;\r
-       m_LogList.FetchLogAsync(LogCallBack,this);\r
+       m_LogList.FetchLogAsync(this);\r
 \r
        GetDlgItem(IDC_LOGLIST)->SetFocus();\r
        return FALSE;\r
 }\r
 \r
-void CLogDlg::LogRunStatus(int cur)\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
-               // 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
+               this->m_LogList.ShowText(temp, true);\r
 \r
                // We use a progress bar while getting the logs \r
                m_LogProgress.SetRange32(0, 100);\r
@@ -377,35 +359,44 @@ void CLogDlg::LogRunStatus(int cur)
                GetDlgItem(IDC_PROGRESS)->ShowWindow(TRUE);\r
 \r
                //DialogEnableWindow(IDC_GETALL, FALSE);\r
-               DialogEnableWindow(IDC_NEXTHUNDRED, FALSE);\r
-               DialogEnableWindow(IDC_CHECK_STOPONCOPY, FALSE);\r
-               DialogEnableWindow(IDC_INCLUDEMERGE, 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
 \r
-       if( cur == GITLOG_END)\r
+       }else if( cur == GITLOG_END)\r
        {\r
                \r
-               if (!m_bShowedAll)\r
-                       DialogEnableWindow(IDC_NEXTHUNDRED, TRUE);\r
+               //if (!m_bShowedAll)\r
+               DialogEnableWindow(IDC_SHOWWHOLEPROJECT, TRUE);\r
 \r
-               DialogEnableWindow(IDC_GETALL, TRUE);\r
-               //DialogEnableWindow(IDC_INCLUDEMERGE, TRUE);\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
-\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
-\r
-       m_LogProgress.SetPos(cur);\r
+       return 0;\r
 }\r
 void CLogDlg::SetDlgTitle(bool bOffline)\r
 {\r
@@ -427,6 +418,8 @@ void CLogDlg::SetDlgTitle(bool bOffline)
        {\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
@@ -451,7 +444,12 @@ void CLogDlg::EnableOKButton()
        if (m_bSelect)\r
        {\r
                // the dialog is used to select revisions\r
-               if (m_bSelectionMustBeContinuous)\r
+               if (m_bSelectionMustBeSingle)\r
+               {\r
+                       // enable OK button if only a single revision is selected\r
+                       DialogEnableWindow(IDOK, (m_LogList.GetSelectedCount()==1));\r
+               }\r
+               else if (m_bSelectionMustBeContinuous)\r
                        DialogEnableWindow(IDOK, (m_LogList.GetSelectedCount()!=0)&&(m_LogList.IsSelectionContinuous()));\r
                else\r
                        DialogEnableWindow(IDOK, m_LogList.GetSelectedCount()!=0);\r
@@ -525,6 +523,24 @@ void CLogDlg::FillLogMessageCtrl(bool bShow /* = true*/)
                        m_ProjectProperties.FindBugID(pLogEntry->m_Body, 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
+                               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
+                                       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_ChangedFileListCtrl.UpdateWithGitPathList(pLogEntry->m_Files);\r
                        m_ChangedFileListCtrl.m_CurrentVersion=pLogEntry->m_CommitHash;\r
                        m_ChangedFileListCtrl.Show(SVNSLC_SHOWVERSIONED);\r
@@ -532,24 +548,7 @@ void CLogDlg::FillLogMessageCtrl(bool bShow /* = true*/)
                        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
-               {\r
-                       m_CurrentFilteredChangedArray.RemoveAll();\r
-                       for (INT_PTR c = 0; c < m_currentChangedArray->GetCount(); ++c)\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
-                               {\r
-                                       m_CurrentFilteredChangedArray.Add(cpath);\r
-                               }\r
-                       }\r
-                       m_currentChangedArray = &m_CurrentFilteredChangedArray;\r
-               }\r
-#endif\r
+\r
        }\r
        else\r
        {\r
@@ -579,7 +578,6 @@ void CLogDlg::FillLogMessageCtrl(bool bShow /* = true*/)
                m_ChangedFileListCtrl.Invalidate();\r
        }\r
 #endif\r
-       CAppUtils::ResizeAllListCtrlCols(&m_ChangedFileListCtrl);\r
        // sort according to the settings\r
        if (m_nSortColumnPathList > 0)\r
                SetSortArrow(&m_ChangedFileListCtrl, m_nSortColumnPathList, m_bAscendingPathList);\r
@@ -589,153 +587,18 @@ void CLogDlg::FillLogMessageCtrl(bool bShow /* = true*/)
 \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
        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
@@ -761,22 +624,12 @@ void CLogDlg::SaveSplitterPos()
 void CLogDlg::OnCancel()\r
 {\r
        // canceling means stopping the working thread if it's still running.\r
-       // we do this by using the Subversion cancel callback.\r
-       // But canceling can also mean just to close the dialog, depending on the\r
-       // text shown on the cancel button (it could simply read "OK").\r
-       CString temp, temp2;\r
-       GetDlgItemText(IDOK, temp);\r
-       temp2.LoadString(IDS_MSGBOX_CANCEL);\r
-       if ((temp.Compare(temp2)==0)||(this->IsThreadRunning()))\r
-       {\r
-               m_bCancelled = true;\r
-               return;\r
+       if (this->IsThreadRunning())\r
+       {\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
@@ -807,7 +660,7 @@ CString CLogDlg::MakeShortMessage(const CString& message)
        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
@@ -968,7 +821,7 @@ void CLogDlg::CopyChangedSelectionToClipBoard()
 #endif\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
@@ -1187,11 +1040,36 @@ LRESULT CLogDlg::OnFindDialogMessage(WPARAM /*wParam*/, LPARAM /*lParam*/)
 \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
@@ -1274,8 +1152,6 @@ void CLogDlg::OnOK()
                }\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
@@ -1525,7 +1401,7 @@ void CLogDlg::DoDiffFromLog(INT_PTR selIndex, GitRev* rev1, GitRev* rev2, bool b
        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
@@ -1595,7 +1471,7 @@ BOOL CLogDlg::Open(bool bOpenWith,CString changedpath, git_revnum_t rev)
        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
@@ -1674,7 +1550,7 @@ void CLogDlg::EditAuthor(const CLogDataVector& logs)
 #endif\r
 }\r
 \r
-void CLogDlg::EditLogMessage(int index)\r
+void CLogDlg::EditLogMessage(int /*index*/)\r
 {\r
 #if 0\r
        CString url;\r
@@ -1755,7 +1631,7 @@ void CLogDlg::EditLogMessage(int index)
        EnableOKButton();\r
 #endif\r
 }\r
-#if 0\r
+\r
 BOOL CLogDlg::PreTranslateMessage(MSG* pMsg)\r
 {\r
        // Skip Ctrl-C when copying text out of the log message or search filter\r
@@ -1766,7 +1642,7 @@ BOOL CLogDlg::PreTranslateMessage(MSG* pMsg)
                {\r
                        if (CRegDWORD(_T("Software\\TortoiseGit\\DiffByDoubleClickInLog"), FALSE))\r
                        {\r
-                               DiffSelectedRevWithPrevious();\r
+                               m_LogList.DiffSelectedRevWithPrevious();\r
                                return TRUE;\r
                        }\r
                }\r
@@ -1783,10 +1659,11 @@ BOOL CLogDlg::PreTranslateMessage(MSG* pMsg)
                        return TRUE;\r
        }\r
        \r
-       m_tooltips.RelayEvent(pMsg);\r
+       if(::IsWindow(m_tooltips.m_hWnd))\r
+               m_tooltips.RelayEvent(pMsg);\r
        return __super::PreTranslateMessage(pMsg);\r
 }\r
-#endif\r
+\r
 \r
 BOOL CLogDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)\r
 {\r
@@ -1829,7 +1706,7 @@ void CLogDlg::OnLvnItemchangedLoglist(NMHDR *pNMHDR, LRESULT *pResult)
                m_nSearchIndex = pNMLV->iItem;\r
                if (pNMLV->iSubItem != 0)\r
                        return;\r
-               if ((pNMLV->iItem == m_LogList.m_arShownList.GetCount())&&(m_bStrict)&&(1/*m_bStrictStopped*/))\r
+               if ((pNMLV->iItem == m_LogList.m_arShownList.GetCount()))\r
                {\r
                        // remove the selected state\r
                        if (pNMLV->uChanged & LVIF_STATE)\r
@@ -2472,7 +2349,7 @@ void CLogDlg::OnDtnDatetimechangeDatefrom(NMHDR * /*pNMHDR*/, LRESULT *pResult)
 \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
@@ -2516,7 +2393,7 @@ CTGitPathList CLogDlg::GetChangedPathsFromSelectedRevisions(bool bRelativePaths
        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
@@ -2591,16 +2468,7 @@ void CLogDlg::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult)
        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
@@ -2638,7 +2506,7 @@ void CLogDlg::SetSortArrow(CListCtrl * control, int nColumn, bool bAscending)
                pHeader->SetItem(nColumn, &HeaderItem);\r
        }\r
 }\r
-void CLogDlg::OnLvnColumnclickChangedFileList(NMHDR *pNMHDR, LRESULT *pResult)\r
+void CLogDlg::OnLvnColumnclickChangedFileList(NMHDR* /*pNMHDR*/, LRESULT* /*pResult*/)\r
 {\r
 #if 0\r
        if (this->IsThreadRunning())\r
@@ -2660,7 +2528,7 @@ void CLogDlg::OnLvnColumnclickChangedFileList(NMHDR *pNMHDR, LRESULT *pResult)
 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
@@ -2694,89 +2562,6 @@ int CLogDlg::SortCompare(const void * pElem1, const void * pElem2)
        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
@@ -2804,22 +2589,13 @@ void CLogDlg::OnBnClickedCheckStoponcopy()
        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
 \r
        git_revnum_t rev1 ;\r
        git_revnum_t rev2 ;\r
-       long selectedrevs ;\r
+       long selectedrevs = 0;\r
        int count =m_LogList.m_arShownList.GetCount();\r
        if (count)\r
        {\r
@@ -3400,9 +3176,11 @@ void CLogDlg::OnSize(UINT nType, int cx, int cy)
 \r
 void CLogDlg::OnRefresh()\r
 {\r
-       if (GetDlgItem(IDC_GETALL)->IsWindowEnabled())\r
+       //if (GetDlgItem(IDC_GETALL)->IsWindowEnabled())\r
        {\r
                m_limit = 0;\r
+               this->m_LogProgress.SetPos(0);\r
+               \r
                Refresh (true);\r
        }\r
 }\r
@@ -3502,4 +3280,56 @@ void CLogDlg::OnEnChangeSearchedit()
        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
+\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
 }
\ No newline at end of file