From 8b98295a684e3603b5719bc3a27815ee0a47dc79 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Wed, 5 Jun 2013 21:59:34 -0400 Subject: [PATCH] Redo filtering to use new RegExp classes. ImageFunctionsView's filtering field now allows shell-style glob matches rather than just simple direct string matches. Implements remaining part of #7955. --- .../gui/team_window/ImageFunctionsView.cpp | 89 ++++++++++--------- 1 file changed, 47 insertions(+), 42 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp b/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp index d81a34b546..2c39d2f35c 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp @@ -17,6 +17,7 @@ #include #include +#include #include "table/TableColumns.h" @@ -50,7 +51,7 @@ public: fComponentName(componentName), fSourceFile(sourceFile), fFunction(function), - fFilterMatchIndex(-1) + fFilterMatch() { if (fSourceFile != NULL) fSourceFile->AcquireReference(); @@ -137,14 +138,14 @@ public: return true; } - int32 FilterMatchIndex() const + const RegExp::MatchResult& FilterMatch() const { - return fFilterMatchIndex; + return fFilterMatch; } - void SetFilterMatchIndex(int32 index) + void SetFilterMatch(const RegExp::MatchResult& match) { - fFilterMatchIndex = index; + fFilterMatch = match; } private: @@ -171,7 +172,7 @@ private: LocatableFile* fSourceFile; FunctionInstance* fFunction; ChildPathComponentList fChildPathComponents; - int32 fFilterMatchIndex; + RegExp::MatchResult fFilterMatch; }; @@ -186,15 +187,13 @@ public: : StringTableColumn(modelIndex, title, width, minWidth, maxWidth, truncate, align), - fFilter(), - fFilterWidth(0.0) + fHasFilter(false) { } - void SetFilter(const BString& filter) + void SetHasFilter(bool hasFilter) { - fFilter = filter; - fFilterWidth = 0.0; + fHasFilter = hasFilter; } virtual void DrawValue(const BVariant& value, BRect rect, @@ -202,10 +201,7 @@ public: { StringTableColumn::DrawValue(value, rect, targetView); - if (!fFilter.IsEmpty()) { - if (fFilterWidth == 0.0) - fFilterWidth = targetView->StringWidth(fFilter); - + if (fHasFilter) { // TODO: handle this case as well if (fField.HasClippedString()) return; @@ -213,15 +209,18 @@ public: const SourcePathComponentNode* node = (const SourcePathComponentNode*)value.ToPointer(); - int32 matchIndex = node->FilterMatchIndex(); - if (matchIndex < 0) + const RegExp::MatchResult& match = node->FilterMatch(); + if (!match.HasMatched()) return; targetView->PushState(); BRect fillRect(rect); fillRect.left += kTextMargin + targetView->StringWidth( - fField.String(), matchIndex); - fillRect.right = fillRect.left + fFilterWidth; + fField.String(), match.StartOffset()); + float filterWidth = targetView->StringWidth(fField.String() + + match.StartOffset(), match.EndOffset() + - match.StartOffset()); + fillRect.right = fillRect.left + filterWidth; targetView->SetLowColor(255, 255, 0, 255); targetView->SetDrawingMode(B_OP_MIN); targetView->FillRect(fillRect, B_SOLID_LOW); @@ -241,8 +240,7 @@ public: private: - BString fFilter; - float fFilterWidth; + bool fHasFilter; }; @@ -293,7 +291,8 @@ public: LocatableFile* currentFile = NULL; BStringList pathComponents; - bool applyFilter = !fCurrentFilter.IsEmpty(); + bool applyFilter = !fFilterString.IsEmpty() + && fCurrentFilter.IsValid(); int32 functionCount = fImageDebugInfo->CountFunctions(); for (int32 i = 0; i < functionCount; i++) { FunctionInstance* instance = fImageDebugInfo->FunctionAt(i); @@ -313,16 +312,16 @@ public: if (sourceFile != NULL) sourceFile->GetPath(sourcePath); - int32 pathMatchIndex = -1; - int32 functionMatchIndex = -1; + RegExp::MatchResult pathMatch; + RegExp::MatchResult functionMatch; if (applyFilter && !_FilterFunction(instance, sourcePath, - pathMatchIndex, functionMatchIndex)) { + pathMatch, functionMatch)) { continue; } if (sourceFile == NULL) { if (!_AddFunctionNode(sourcelessNode, instance, NULL, - functionMatchIndex)) { + functionMatch)) { return; } continue; @@ -342,7 +341,7 @@ public: } if (!_AddFunctionByPath(pathComponents, instance, currentFile, - pathMatchIndex, functionMatchIndex)) { + pathMatch, functionMatch)) { return; } } @@ -469,9 +468,12 @@ public: void SetFilter(const char* filter) { - fCurrentFilter = filter; - - SetImageDebugInfo(fImageDebugInfo); + fFilterString = filter; + if (fFilterString.IsEmpty() + || fCurrentFilter.SetPattern(filter, RegExp::PATTERN_TYPE_WILDCARD, + false)) { + SetImageDebugInfo(fImageDebugInfo); + } } private: @@ -504,8 +506,8 @@ private: } bool _AddFunctionByPath(const BStringList& pathComponents, - FunctionInstance* function, LocatableFile* file, int32 pathMatchIndex, - int32 functionMatchIndex) + FunctionInstance* function, LocatableFile* file, + RegExp::MatchResult& pathMatch, RegExp::MatchResult& functionMatch) { SourcePathComponentNode* parentNode = NULL; SourcePathComponentNode* currentNode = NULL; @@ -525,7 +527,7 @@ private: return false; if (pathComponents.CountStrings() == 1) - currentNode->SetFilterMatchIndex(pathMatchIndex); + currentNode->SetFilterMatch(pathMatch); BReference nodeReference(currentNode, true); @@ -545,11 +547,12 @@ private: } return _AddFunctionNode(currentNode, function, file, - functionMatchIndex); + functionMatch); } bool _AddFunctionNode(SourcePathComponentNode* parent, - FunctionInstance* function, LocatableFile* file, int32 matchIndex) + FunctionInstance* function, LocatableFile* file, + RegExp::MatchResult& match) { SourcePathComponentNode* functionNode = new(std::nothrow) SourcePathComponentNode(parent, function->PrettyName(), file, @@ -558,7 +561,7 @@ private: if (functionNode == NULL) return B_NO_MEMORY; - functionNode->SetFilterMatchIndex(matchIndex); + functionNode->SetFilterMatch(match); BReference nodeReference(functionNode, true); if (!parent->AddChild(functionNode)) @@ -568,12 +571,12 @@ private: } bool _FilterFunction(FunctionInstance* instance, const BString& sourcePath, - int32& pathMatchIndex, int32& functionMatchIndex) + RegExp::MatchResult& pathMatch, RegExp::MatchResult& functionMatch) { - functionMatchIndex = instance->PrettyName().IFindFirst(fCurrentFilter); - pathMatchIndex = sourcePath.IFindFirst(fCurrentFilter); + functionMatch = fCurrentFilter.Match(instance->PrettyName()); + pathMatch = fCurrentFilter.Match(sourcePath.String()); - return functionMatchIndex >= 0 || pathMatchIndex >= 0; + return functionMatch.HasMatched() || pathMatch.HasMatched(); } @@ -584,7 +587,8 @@ private: ImageDebugInfo* fImageDebugInfo; ChildPathComponentList fChildPathComponents; SourcePathComponentNode* fSourcelessNode; - BString fCurrentFilter; + BString fFilterString; + RegExp fCurrentFilter; }; @@ -713,7 +717,8 @@ ImageFunctionsView::MessageReceived(BMessage* message) { if (system_time() - fLastFilterKeypress >= kKeypressTimeout) { fFunctionsTableModel->SetFilter(fFilterField->Text()); - fHighlightingColumn->SetFilter(fFilterField->Text()); + fHighlightingColumn->SetHasFilter( + fFilterField->TextView()->TextLength() > 0); _ExpandFilteredNodes(); } break;