OSDN Git Service

Save all branch status when close log dialog
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / LogDlg.cpp
index bb49da2..f9f178b 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,17 +77,27 @@ 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
+\r
+       CString str;\r
+       str=g_Git.m_CurrentDir;\r
+       str.Replace(_T(":"),_T("_"));\r
+       str=CString(_T("Software\\TortoiseGit\\LogDialog\\AllBranch\\"))+str;\r
+       \r
+       m_regbAllBranch=CRegDWORD(str,FALSE);\r
+\r
+       m_bAllBranch=m_regbAllBranch;\r
+\r
        m_bFirstParent=FALSE;\r
        m_bWholeProject=FALSE;\r
 }\r
 \r
 CLogDlg::~CLogDlg()\r
 {\r
-       \r
+\r
+       m_regbAllBranch=m_bAllBranch;\r
+\r
     m_CurrentFilteredChangedArray.RemoveAll();\r
        \r
 }\r
@@ -109,6 +119,7 @@ void CLogDlg::DoDataExchange(CDataExchange* pDX)
        DDX_Check(pDX, IDC_LOG_ALLBRANCH,m_bAllBranch);\r
        DDX_Check(pDX, IDC_SHOWWHOLEPROJECT,m_bWholeProject);\r
        DDX_Control(pDX, IDC_SEARCHEDIT, m_cFilter);\r
+       DDX_Control(pDX, IDC_STATIC_REF, m_staticRef);\r
 }\r
 \r
 BEGIN_MESSAGE_MAP(CLogDlg, CResizableStandAloneDialog)\r
@@ -145,6 +156,8 @@ 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_STN_CLICKED(IDC_STATIC_REF, &CLogDlg::OnBnClickedBrowseRef)\r
        ON_COMMAND(ID_LOGDLG_REFRESH,&CLogDlg::OnRefresh)\r
        ON_COMMAND(ID_LOGDLG_FIND,&CLogDlg::OnFind)\r
        ON_COMMAND(ID_LOGDLG_FOCUSFILTER,&CLogDlg::OnFocusFilter)\r
@@ -171,12 +184,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
@@ -242,7 +249,11 @@ BOOL CLogDlg::OnInitDialog()
        m_DateFrom.SendMessage(DTM_SETMCSTYLE, 0, MCS_WEEKNUMBERS|MCS_NOTODAY|MCS_NOTRAILINGDATES|MCS_NOSELCHANGEONNAV);\r
        m_DateTo.SendMessage(DTM_SETMCSTYLE, 0, MCS_WEEKNUMBERS|MCS_NOTODAY|MCS_NOTRAILINGDATES|MCS_NOSELCHANGEONNAV);\r
 \r
+       m_staticRef.SetURL(CString());\r
+\r
        // resizable stuff\r
+       AddAnchor(IDC_STATIC_REF, TOP_LEFT);\r
+       //AddAnchor(IDC_BUTTON_BROWSE_REF, TOP_LEFT);\r
        AddAnchor(IDC_FROMLABEL, TOP_LEFT);\r
        AddAnchor(IDC_DATEFROM, TOP_LEFT);\r
        AddAnchor(IDC_TOLABEL, TOP_LEFT);\r
@@ -270,6 +281,11 @@ BOOL CLogDlg::OnInitDialog()
        AddAnchor(IDCANCEL, BOTTOM_RIGHT);\r
        AddAnchor(IDHELP, BOTTOM_RIGHT);\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
 //     SetPromptParentWindow(m_hWnd);\r
 \r
        if (hWndExplorer)\r
@@ -335,9 +351,12 @@ BOOL CLogDlg::OnInitDialog()
        //m_tFrom = (DWORD)-1;\r
 \r
        m_LogList.m_Path=m_path;\r
+       m_LogList.m_bShowWC = true;\r
        m_LogList.FetchLogAsync(this);\r
 \r
        GetDlgItem(IDC_LOGLIST)->SetFocus();\r
+\r
+       ShowStartRef();\r
        return FALSE;\r
 }\r
 \r
@@ -362,12 +381,25 @@ LRESULT CLogDlg::OnLogListLoading(WPARAM wParam, LPARAM /*lParam*/)
                //DialogEnableWindow(IDC_SHOWWHOLEPROJECT, FALSE);\r
                //DialogEnableWindow(IDC_LOG_FIRSTPARENT, FALSE);\r
                DialogEnableWindow(IDC_STATBUTTON, FALSE);\r
-               DialogEnableWindow(IDC_REFRESH, FALSE);\r
+               //DialogEnableWindow(IDC_REFRESH, FALSE);\r
                DialogEnableWindow(IDC_HIDEPATHS,FALSE);\r
 \r
+               DialogEnableWindow(IDC_DATEFROM,FALSE);\r
+               DialogEnableWindow(IDC_DATETO,FALSE);\r
+\r
+               DialogEnableWindow(IDC_SEARCHEDIT,FALSE);\r
+\r
        }else if( cur == GITLOG_END)\r
        {\r
                \r
+               if(this->m_LogList.HasText())\r
+               {\r
+                       this->m_LogList.ClearText();\r
+                       \r
+               }\r
+               UpdateLogInfoLabel();\r
+\r
+\r
                //if (!m_bShowedAll)\r
                DialogEnableWindow(IDC_SHOWWHOLEPROJECT, TRUE);\r
 \r
@@ -377,6 +409,11 @@ LRESULT CLogDlg::OnLogListLoading(WPARAM wParam, LPARAM /*lParam*/)
                DialogEnableWindow(IDC_REFRESH, TRUE);\r
                DialogEnableWindow(IDC_HIDEPATHS,TRUE);\r
 \r
+               DialogEnableWindow(IDC_DATEFROM,TRUE);\r
+               DialogEnableWindow(IDC_DATETO,TRUE);\r
+\r
+               DialogEnableWindow(IDC_SEARCHEDIT,TRUE);\r
+\r
 //             PostMessage(WM_TIMER, LOGFILTER_TIMER);\r
                GetDlgItem(IDC_PROGRESS)->ShowWindow(FALSE);\r
                //CTime time=m_LogList.GetOldestTime();\r
@@ -384,16 +421,15 @@ LRESULT CLogDlg::OnLogListLoading(WPARAM wParam, LPARAM /*lParam*/)
                m_LogList.GetTimeRange(begin,end);\r
                m_DateFrom.SetTime(&begin);\r
                m_DateTo.SetTime(&end);\r
-               \r
-               \r
-       \r
+\r
+\r
        }else\r
        {\r
                if(this->m_LogList.HasText())\r
                {\r
                        this->m_LogList.ClearText();\r
-                       UpdateLogInfoLabel();\r
                }\r
+               UpdateLogInfoLabel();\r
                m_LogProgress.SetPos(cur);\r
        }\r
        return 0;\r
@@ -464,7 +500,7 @@ void CLogDlg::FillLogMessageCtrl(bool bShow /* = true*/)
        // and also populate the changed files list control\r
        // according to the selected revision(s).\r
 \r
-       CWnd * pMsgView = GetDlgItem(IDC_MSGVIEW);\r
+       CRichEditCtrl * pMsgView = (CRichEditCtrl*)GetDlgItem(IDC_MSGVIEW);\r
        // empty the log message view\r
        pMsgView->SetWindowText(_T(" "));\r
        // empty the changed files list\r
@@ -517,10 +553,37 @@ 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.ToString()+_T("\r\n\r\n"));\r
                        // turn bug ID's into links if the bugtraq: properties have been set\r
                        // and we can find a match of those in the log message\r
-                       m_ProjectProperties.FindBugID(pLogEntry->m_Body, pMsgView);\r
+                       \r
+                       pMsgView->SetSel(-1,-1);\r
+                       CHARFORMAT2 format;\r
+                       SecureZeroMemory(&format, sizeof(CHARFORMAT2));\r
+                       format.cbSize = sizeof(CHARFORMAT2);\r
+                       format.dwMask = CFM_BOLD;\r
+                       format.dwEffects = CFE_BOLD;\r
+                       pMsgView->SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&format);\r
+                       \r
+                       CString msg=_T("* ");\r
+                       msg+=pLogEntry->m_Subject;\r
+                       pMsgView->ReplaceSel(msg);\r
+\r
+                       pMsgView->SetSel(-1,-1);\r
+                       format.dwEffects = 0;\r
+                       pMsgView->SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&format);\r
+                       \r
+                       msg=_T("\n\n");\r
+                       msg+=pLogEntry->m_Body;\r
+                       pMsgView->ReplaceSel(msg);\r
+\r
+                       CString text;\r
+                       pMsgView->GetWindowText(text);\r
+                       // the rich edit control doesn't count the CR char!\r
+                       // to be exact: CRLF is treated as one char.\r
+                       text.Replace(_T("\r"), _T(""));\r
+\r
+                       m_ProjectProperties.FindBugID(text, pMsgView);\r
                        CAppUtils::FormatTextInRichEditControl(pMsgView);\r
 \r
                        int HidePaths=m_cHidePaths.GetState() & 0x0003;\r
@@ -589,13 +652,15 @@ void CLogDlg::FillLogMessageCtrl(bool bShow /* = true*/)
 \r
 void CLogDlg::OnBnClickedRefresh()\r
 {\r
-       m_limit = 0;\r
+       \r
        Refresh (true);\r
 }\r
 \r
 void CLogDlg::Refresh (bool /*autoGoOnline*/)\r
 {\r
+       m_limit = 0;\r
        m_LogList.Refresh();\r
+       FillLogMessageCtrl(false);\r
 }\r
 \r
 \r
@@ -1309,14 +1374,14 @@ void CLogDlg::DoDiffFromLog(INT_PTR selIndex, GitRev* rev1, GitRev* rev2, bool b
        file1.Format(_T("%s%s_%s%s"),\r
                                temppath,                                               \r
                                (*m_currentChangedArray)[selIndex].GetBaseFilename(),\r
-                               rev1->m_CommitHash.Left(6),\r
+                               rev1->m_CommitHash.ToString().Left(6),\r
                                (*m_currentChangedArray)[selIndex].GetFileExtension());\r
 \r
        CString file2;\r
        file2.Format(_T("%s\\%s_%s%s"),\r
                                temppath,                                               \r
                                (*m_currentChangedArray)[selIndex].GetBaseFilename(),\r
-                               rev2->m_CommitHash.Left(6),\r
+                               rev2->m_CommitHash.ToString().Left(6),\r
                                (*m_currentChangedArray)[selIndex].GetFileExtension());\r
 \r
        CString cmd;\r
@@ -1757,6 +1822,127 @@ void CLogDlg::OnEnLinkMsgview(NMHDR *pNMHDR, LRESULT *pResult)
        *pResult = 0;\r
 }\r
 \r
+class CDateSorter\r
+{\r
+public:\r
+       class CCommitPointer\r
+       {\r
+       public:\r
+               CCommitPointer():m_cont(NULL){}\r
+               CCommitPointer(const CCommitPointer& P_Right)\r
+               : m_cont(NULL)\r
+               {\r
+                       *this = P_Right;\r
+               }\r
+\r
+               CCommitPointer& operator = (const CCommitPointer& P_Right)\r
+               {\r
+                       if(IsPointer())\r
+                       {\r
+                               (*m_cont->m_parDates)[m_place]                  = P_Right.GetDate();\r
+                               (*m_cont->m_parFileChanges)[m_place]    = P_Right.GetChanges();\r
+                               (*m_cont->m_parAuthors)[m_place]                = P_Right.GetAuthor();\r
+                       }\r
+                       else \r
+                       {\r
+                               m_Date                                                          = P_Right.GetDate();\r
+                               m_Changes                                                       = P_Right.GetChanges();\r
+                               m_csAuthor                                                      = P_Right.GetAuthor();\r
+                       }\r
+                       return *this;\r
+               }\r
+\r
+               void Clone(const CCommitPointer& P_Right)\r
+               {\r
+                       m_cont = P_Right.m_cont;\r
+                       m_place = P_Right.m_place;\r
+                       m_Date = P_Right.m_Date;\r
+                       m_Changes = P_Right.m_Changes;\r
+                       m_csAuthor = P_Right.m_csAuthor;\r
+               }\r
+\r
+               DWORD            GetDate()              const {return IsPointer() ? (*m_cont->m_parDates)[m_place] : m_Date;}\r
+               DWORD            GetChanges()   const {return IsPointer() ? (*m_cont->m_parFileChanges)[m_place] : m_Changes;}\r
+               CString          GetAuthor()    const {return IsPointer() ? (*m_cont->m_parAuthors)[m_place] : m_csAuthor;}\r
+\r
+               bool            IsPointer() const {return m_cont != NULL;}\r
+               //When pointer\r
+               CDateSorter* m_cont;\r
+               int                      m_place;\r
+\r
+               //When element\r
+               DWORD            m_Date;\r
+               DWORD            m_Changes;\r
+               CString          m_csAuthor;\r
+\r
+       };\r
+       class iterator : public std::iterator<std::random_access_iterator_tag, CCommitPointer>\r
+       {\r
+       public:\r
+               CCommitPointer m_ptr;\r
+\r
+               iterator(){}\r
+               iterator(const iterator& P_Right){*this = P_Right;}\r
+               iterator& operator=(const iterator& P_Right)\r
+               {\r
+                       m_ptr.Clone(P_Right.m_ptr);\r
+                       return *this;\r
+               }\r
+\r
+               CCommitPointer& operator*(){return m_ptr;}\r
+               CCommitPointer* operator->(){return &m_ptr;}\r
+               const CCommitPointer& operator*()const{return m_ptr;}\r
+               const CCommitPointer* operator->()const{return &m_ptr;}\r
+\r
+               iterator& operator+=(size_t P_iOffset){m_ptr.m_place += P_iOffset;return *this;}\r
+               iterator& operator-=(size_t P_iOffset){m_ptr.m_place -= P_iOffset;return *this;}\r
+               iterator operator+(size_t P_iOffset)const{iterator it(*this); it += P_iOffset;return it;}\r
+               iterator operator-(size_t P_iOffset)const{iterator it(*this); it -= P_iOffset;return it;}\r
+\r
+               iterator& operator++(){++m_ptr.m_place;return *this;}\r
+               iterator& operator--(){--m_ptr.m_place;return *this;}\r
+               iterator operator++(int){iterator it(*this);++*this;return it;}\r
+               iterator operator--(int){iterator it(*this);--*this;return it;}\r
+\r
+               size_t operator-(const iterator& P_itRight)const{return m_ptr.m_place - P_itRight->m_place;}\r
+\r
+               bool operator<(const iterator& P_itRight)const{return m_ptr.m_place < P_itRight->m_place;}\r
+               bool operator!=(const iterator& P_itRight)const{return m_ptr.m_place != P_itRight->m_place;}\r
+               bool operator==(const iterator& P_itRight)const{return m_ptr.m_place == P_itRight->m_place;}\r
+               bool operator>(const iterator& P_itRight)const{return m_ptr.m_place > P_itRight->m_place;}\r
+       };\r
+       iterator begin()\r
+       {\r
+               iterator it;\r
+               it->m_place = 0;\r
+               it->m_cont = this;\r
+               return it;\r
+       }\r
+       iterator end()\r
+       {\r
+               iterator it;\r
+               it->m_place = m_parDates->GetCount();\r
+               it->m_cont = this;\r
+               return it;\r
+       }\r
+\r
+       CDWordArray     *       m_parDates;\r
+       CDWordArray     *       m_parFileChanges;\r
+       CStringArray *  m_parAuthors;\r
+};\r
+\r
+class CDateSorterLess\r
+{\r
+public:\r
+       bool operator () (const CDateSorter::CCommitPointer& P_Left, const CDateSorter::CCommitPointer& P_Right) const\r
+       {\r
+               return P_Left.GetDate() > P_Right.GetDate(); //Last date first\r
+       }\r
+\r
+};\r
+\r
+\r
+\r
 void CLogDlg::OnBnClickedStatbutton()\r
 {\r
 \r
@@ -1784,6 +1970,13 @@ void CLogDlg::OnBnClickedStatbutton()
                m_arDatesFiltered.Add(pLogEntry->m_AuthorDate.GetTime());\r
                m_arFileChangesFiltered.Add(pLogEntry->m_Files.GetCount());\r
        }\r
+\r
+       CDateSorter W_Sorter;\r
+       W_Sorter.m_parAuthors           = &m_arAuthorsFiltered;\r
+       W_Sorter.m_parDates                     = &m_arDatesFiltered;\r
+       W_Sorter.m_parFileChanges       = &m_arFileChangesFiltered;\r
+       std::sort(W_Sorter.begin(), W_Sorter.end(), CDateSorterLess());\r
+\r
        CStatGraphDlg dlg;\r
        dlg.m_parAuthors = &m_arAuthorsFiltered;\r
        dlg.m_parDates = &m_arDatesFiltered;\r
@@ -2212,6 +2405,7 @@ void CLogDlg::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult)
 {\r
        if (this->IsThreadRunning())\r
                return;         //no sorting while the arrays are filled\r
+#if 0\r
        LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);\r
        const int nColumn = pNMLV->iSubItem;\r
        m_bAscending = nColumn == m_nSortColumn ? !m_bAscending : TRUE;\r
@@ -2221,7 +2415,7 @@ void CLogDlg::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult)
        SortShownListArray();\r
        m_LogList.Invalidate();\r
        UpdateLogInfoLabel();\r
-       \r
+#endif\r
        *pResult = 0;\r
 }\r
 \r
@@ -2346,19 +2540,26 @@ void CLogDlg::OnBnClickedCheckStoponcopy()
 void CLogDlg::UpdateLogInfoLabel()\r
 {\r
 \r
-       git_revnum_t rev1 ;\r
-       git_revnum_t rev2 ;\r
+       CGitHash rev1 ;\r
+       CGitHash rev2 ;\r
        long selectedrevs = 0;\r
        int count =m_LogList.m_arShownList.GetCount();\r
+       int start = 0;\r
        if (count)\r
        {\r
                rev1 = (reinterpret_cast<GitRev*>(m_LogList.m_arShownList.GetAt(0)))->m_CommitHash;\r
+               if(this->m_LogList.m_bShowWC && rev1.IsEmpty())\r
+                       start = 1;\r
+               rev1 = (reinterpret_cast<GitRev*>(m_LogList.m_arShownList.GetAt(start)))->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(_T("Showing %ld revision(s), from revision %s to revision %s - %ld revision(s) selected"), count, rev2.Left(6), rev1.Left(6), selectedrevs);\r
+       sTemp.Format(_T("Showing %ld revision(s), from revision %s to revision %s - %ld revision(s) selected"), \r
+               count - start,\r
+               rev2.ToString().Left(6), rev1.ToString().Left(6), selectedrevs);\r
+\r
        m_sLogInfo = sTemp;\r
 \r
        UpdateData(FALSE);\r
@@ -2930,6 +3131,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
@@ -3049,6 +3251,57 @@ 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
+               m_staticRef.SetWindowText(L"<All Branches>");\r
+               m_staticRef.Invalidate(TRUE);\r
+               return;\r
+       }\r
+\r
+       CString showStartRef = m_LogList.GetStartRef();\r
+       if(showStartRef.IsEmpty())\r
+       {\r
+               //Ref name is HEAD\r
+               if( g_Git.Run(L"git symbolic-ref HEAD",&showStartRef,CP_UTF8) )\r
+                       showStartRef = _T("<No branch>");\r
+               showStartRef.Trim(L"\r\n\t ");\r
+       }\r
+\r
+\r
+       if(wcsncmp(showStartRef,L"refs/",5) == 0)\r
+               showStartRef = showStartRef.Mid(5);\r
+       if(wcsncmp(showStartRef,L"heads/",6) == 0)\r
+               showStartRef = showStartRef.Mid(6);\r
+\r
+       m_staticRef.SetWindowText(showStartRef);\r
+       m_staticRef.Invalidate(TRUE);\r
+}\r
+\r
+void CLogDlg::SetStartRef(const CString& StartRef)\r
+{\r
+       m_LogList.SetStartRef(StartRef);\r
+\r
+       ShowStartRef();\r
+}\r
+\r
+\r
 \r
 void CLogDlg::OnBnClickedFirstParent()\r
 {\r