@@ -79,6 +79,9 @@ BEGIN_MESSAGE_MAP(CLogItemView, CListView)
7979 ON_COMMAND(ID_DETAILS_DELETE_SELECT_ITEMS, &CLogItemView::OnDetailDeleteSelectItems)
8080 ON_COMMAND(ID_DETAILS_SELECT_CURRENT_PID, &CLogItemView::OnDetailSelectCurrentPid)
8181 ON_COMMAND(ID_DETAILS_SELECT_CURRENT_TID, &CLogItemView::OnDetailSelectCurrentTid)
82+ ON_COMMAND(ID_DETAILS_SELECT_CURRENT_FILE, &CLogItemView::OnDetailSelectCurrentFile)
83+ ON_COMMAND(ID_DETAILS_CLEAR_FILTER_BY_FILES, &CLogItemView::OnDetailClearFilterByFiles)
84+
8285 ON_WM_CONTEXTMENU()
8386 ON_WM_ERASEBKGND()
8487 ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, &CLogItemView::OnLvnItemchanged)
@@ -468,25 +471,7 @@ void CLogItemView::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
468471 else
469472 {
470473 CString strTraceInfo (pLogItem->pszTraceInfo );
471-
472- int leftBraPos = strTraceInfo.Find (TEXT (' (' )); // 左括号
473- int rightBraPos = strTraceInfo.Find (TEXT (' )' ));// 右括号
474- if (rightBraPos != -1 )
475- {
476- int semPos = strTraceInfo.Find (TEXT (' :' ),rightBraPos);
477- if (-1 != semPos) // 找到分号,可能带有文件名和路径
478- {
479- strTraceInfo.SetAt (semPos,TEXT (' \0 ' ));
480- if (-1 != leftBraPos && -1 != rightBraPos && rightBraPos > leftBraPos)
481- {
482- CString strLine = strTraceInfo.Mid (leftBraPos + 1 , rightBraPos - leftBraPos - 1 );
483- line = _ttoi (strLine);
484-
485- strFileName = strTraceInfo.Left (leftBraPos);
486- rLogManager.TryReparseRealFileName (strFileName);
487- }
488- }
489- }
474+ rLogManager.ParseFileNameAndPos (strTraceInfo, strFileName, line);
490475 }
491476
492477 // 如果找到文件名和行号,可以尝试通过源码定位
@@ -533,7 +518,7 @@ void CLogItemView::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
533518 }
534519 if (szPathFull[0 ] == TEXT (' \0 ' ))
535520 {
536- StringCchCopy (szPathFull, _countof (szPathFull), spFilePathList->front ());
521+ StringCchCopy (szPathFull, _countof (szPathFull), * spFilePathList->begin ());
537522 }
538523 // TODO: if there are more than one file with same name, then prompt user choose
539524 }
@@ -573,11 +558,14 @@ void CLogItemView::OnContextMenu(CWnd* pWnd, CPoint point)
573558 CMenu* pDetailMenu = menuDetails.GetSubMenu (0 );
574559 FTLASSERT (pDetailMenu);
575560 m_ptContextMenuClick = point;
576- #if ENABLE_COPY_FULL_LOG
577- pDetailMenu->EnableMenuItem (ID_DETAILS_COPY_FULL_LOG, MF_ENABLED | MF_BYCOMMAND);
578- #else
579- pDetailMenu->EnableMenuItem (ID_DETAILS_COPY_FULL_LOG, MF_DISABLED | MF_GRAYED | MF_BYCOMMAND);
580- #endif
561+
562+ CLogManager& logManager = GetDocument ()->m_FTLogManager ;
563+ if (logManager.m_logConfig .m_nEnableFullLog )
564+ {
565+ pDetailMenu->EnableMenuItem (ID_DETAILS_COPY_FULL_LOG, MF_ENABLED | MF_BYCOMMAND);
566+ } else {
567+ pDetailMenu->EnableMenuItem (ID_DETAILS_COPY_FULL_LOG, MF_DISABLED | MF_GRAYED | MF_BYCOMMAND);
568+ }
581569 API_VERIFY (pDetailMenu->TrackPopupMenu (TPM_TOPALIGN|TPM_LEFTBUTTON,point.x ,point.y ,pWnd));
582570 }
583571}
@@ -726,7 +714,6 @@ void CLogItemView::OnDetailsCopyLineText()
726714
727715void CLogItemView::OnDetailsCopyFullLog ()
728716{
729- #if ENABLE_COPY_FULL_LOG
730717 BOOL bRet = FALSE ;
731718 CString strText;
732719
@@ -746,7 +733,6 @@ void CLogItemView::OnDetailsCopyFullLog()
746733 TEXT (" pos=[%d,%d], text=%s, Last Error=%d" ),
747734 lvHistTestInfo.iItem , lvHistTestInfo.iSubItem , strText, GetLastError ());
748735 }
749- #endif
750736}
751737
752738void CLogItemView::OnDetailDeleteSelectItems () {
@@ -820,6 +806,24 @@ void CLogItemView::_HighlightSameThread(LogItemPointer pCompareLogItem)
820806}
821807
822808int CLogItemView::_GetSelectedIdTypeValue (MachinePIdTIdTypeList& idTypeList) {
809+ LogItemsContainer selectedLogItems;
810+ INT nSelectedSubItem = _GetSelectedIdLogItems (selectedLogItems);
811+
812+ for (LogItemsContainerIter iter = selectedLogItems.begin (); iter != selectedLogItems.end (); ++iter)
813+ {
814+ const LogItemPointer pLogItem = *iter;
815+ MachinePIdTIdType idType;
816+ idType.machine = pLogItem->machine ;
817+ idType.pid = pLogItem->processId ;
818+ idType.tid = pLogItem->threadId ;
819+ idTypeList.push_back (idType);
820+ FTLTRACE (TEXT (" Filter machine=%s, pid=%s, tid=%s" ),
821+ idType.machine .c_str (), idType.pid .c_str (), idType.tid .c_str ());
822+ }
823+ return nSelectedSubItem;
824+ }
825+
826+ int CLogItemView::_GetSelectedIdLogItems (LogItemsContainer& selectedLogItems){
823827 CLogManager& logManager = GetDocument ()->m_FTLogManager ;
824828
825829 LogIndexContainer selectedItemList;
@@ -830,14 +834,8 @@ int CLogItemView::_GetSelectedIdTypeValue(MachinePIdTIdTypeList& idTypeList) {
830834 for (LogIndexContainerIter iter = selectedItemList.begin (); iter != selectedItemList.end (); ++iter)
831835 {
832836 const LogItemPointer pLogItem = logManager.GetDisplayLogItem (*iter);
833- if (pLogItem){
834- MachinePIdTIdType idType;
835- idType.machine = pLogItem->machine ;
836- idType.pid = pLogItem->processId ;
837- idType.tid = pLogItem->threadId ;
838- idTypeList.push_back (idType);
839- FTLTRACE (TEXT (" Filter machine=%s, pid=%s, tid=%s" ),
840- idType.machine .c_str (), idType.pid .c_str (), idType.tid .c_str ());
837+ if (pLogItem) {
838+ selectedLogItems.push_back (pLogItem);
841839 }
842840 }
843841 }
@@ -874,6 +872,46 @@ void CLogItemView::OnDetailSelectCurrentTid() {
874872 }
875873}
876874
875+ void CLogItemView::OnDetailSelectCurrentFile () {
876+ int oldSelectIndex = 0 ;
877+ LogItemsContainer selectedLogItems;
878+ if (-1 != (oldSelectIndex = _GetSelectedIdLogItems (selectedLogItems))){
879+ CLogManager& logManager = GetDocument ()->m_FTLogManager ;
880+
881+ // 获取所有用户选择的有效文件名
882+ std::set<CString> selectFileNames;
883+ for (LogItemsContainerIter iter = selectedLogItems.begin (); iter != selectedLogItems.end (); ++iter){
884+ const LogItemPointer pLogItem = *iter;
885+ if (pLogItem->pszSrcFileName )
886+ {
887+ CString strFileName (pLogItem->pszSrcFileName );
888+ if (!strFileName.IsEmpty ())
889+ {
890+ selectFileNames.insert (pLogItem->pszSrcFileName );
891+ }
892+ }
893+ }
894+ if (!selectFileNames.empty ())
895+ {
896+ UINT nCurSelectLine = _GetCurrentFirstSelectLine ();
897+ logManager.SetFilterFileNames (selectFileNames);
898+
899+ OnUpdate (this , VIEW_UPDATE_HINT_FILTER_BY_FILENAME, NULL );
900+ _GotoSpecialLine (nCurSelectLine);
901+ }
902+ }
903+ }
904+
905+ void CLogItemView::OnDetailClearFilterByFiles () {
906+ UINT nCurSelectLine = _GetCurrentFirstSelectLine ();
907+ CLogManager& logManager = GetDocument ()->m_FTLogManager ;
908+
909+ if (logManager.ClearFilterFileNames ()){
910+ OnUpdate (this , VIEW_UPDATE_HINT_FILTER_BY_FILENAME, NULL );
911+ _GotoSpecialLine (nCurSelectLine);
912+ }
913+ }
914+
877915
878916BOOL CLogItemView::OnEraseBkgnd (CDC* pDC)
879917{
0 commit comments