Search text in labels
Posted
by Zafir Anjum
on August 6th, 1998
// FindItem - Finds an item that contains the search string
// Returns - Handle to the item or NULL
// str - String to search for
// bCaseSensitive - Should the search be case sensitive
// bDownDir - Search direction - TRUE for down
// bWholeWord - True if search should match whole words
// hItem - Item to start searching from. NULL for
// - currently selected item
HTREEITEM CTreeCtrlX::FindItem(CString &str,
BOOL bCaseSensitive /*= FALSE*/,
BOOL bDownDir /*= TRUE*/,
BOOL bWholeWord /*= FALSE*/,
HTREEITEM hItem /*= NULL*/)
{
int lenSearchStr = str.GetLength();
if( lenSearchStr == 0 ) return NULL;
HTREEITEM htiSel = hItem ? hItem : GetSelectedItem();
HTREEITEM htiCur = bDownDir ? GetNextItem( htiSel ) : GetPrevItem( htiSel );
CString sSearch = str;
if( htiCur == NULL )
{
if( bDownDir ) htiCur = GetRootItem();
else htiCur = GetLastItem( NULL );
}
if( !bCaseSensitive )
sSearch.MakeLower();
while( htiCur && htiCur != htiSel )
{
CString sItemText = GetItemText( htiCur );
if( !bCaseSensitive )
sItemText.MakeLower();
int n;
while( (n = sItemText.Find( sSearch )) != -1 )
{
// Search string found
if( bWholeWord )
{
// Check preceding char
if( n != 0 )
{
if( isalpha(sItemText[n-1]) ||
sItemText[n-1] == '_' ){
// Not whole word
sItemText = sItemText.Right(
sItemText.GetLength() - n -
lenSearchStr );
continue;
}
}
// Check succeeding char
if( sItemText.GetLength() > n + lenSearchStr
&& ( isalpha(sItemText[n+lenSearchStr]) ||
sItemText[n+lenSearchStr] == '_' ) )
{
// Not whole word
sItemText = sItemText.Right( sItemText.GetLength()
- n - sSearch.GetLength() );
continue;
}
}
if( IsFindValid( htiCur ) )
return htiCur;
else break;
}
htiCur = bDownDir ? GetNextItem( htiCur ) : GetPrevItem( htiCur );
if( htiCur == NULL )
{
if( bDownDir ) htiCur = GetRootItem();
else htiCur = GetLastItem( NULL );
}
}
return NULL;
}
// IsFindValid - Virtual function used by FindItem to allow this
// function to filter the result of FindItem
// Returns - True if item matches the criteria
// Arg - Handle of the item
BOOL CTreeCtrlX::IsFindValid( HTREEITEM )
{
return TRUE;
}
In the class declaration add the following.
public: virtual HTREEITEM FindItem(CString &sSearch, BOOL bCaseSensitive = FALSE, BOOL bDownDir = TRUE, BOOL bWholeWord = FALSE, HTREEITEM hItem = NULL); protected: virtual BOOL IsFindValid( HTREEITEM );

Comments
What about incremental search of labels?
Posted by Legacy on 06/15/1999 12:00amOriginally posted by: Oren Lev
Hi,
Do you know how I can implement incremental search like it is done in the Explorer tree? (start to write a word when the tree is in focus, and the selection jumps to the closest match)
I found a message called: "TVM_GETISEARCHSTRING" that is supposed to be sent to the tree control and return the current incremental text, but it doesn't seem to work...
I thank you for any information on this subject.
Oren
ReplyLittle problem ???
Posted by Legacy on 11/05/1998 12:00amOriginally posted by: Patrice Lacroix
Reply