Finding an item (matching any member of TV_ITEM)

FindNextItem traverses a tree searching for an item matching all the item attributes set in a TV_ITEM structure. In the TV_ITEM structure, the mask member specifies which attributes make up the search criteria. If a match is found, the function returns the handle otherwise NULL. This function uses the function GetNextItem, seen previously. The function only searches in one direction (down) and if hItem is NULL starts from the root of the tree.


HTREEITEM CTreeCtrlEx::FindNextItem(TV_ITEM* pItem, HTREEITEM hItem)
{
   ASSERT(::IsWindow(m_hWnd));
   
   TV_ITEM hNextItem;

   //Clear Item data
   ZeroMemory(&hNextItem, sizeof(hNextItem));
      
   //The mask is used to retrieve the data to compare
   hNextItem.mask = pItem->mask;
   hNextItem.hItem = (hItem) ? GetNextItem(hItem) : GetRootItem();
   
   //Prepare to compare pszText
   //Testing pItem->pszText protects the code from a client setting the
   //TVIF_TEXT bit but passing in a NULL pointer.
   if((pItem->mask & TVIF_TEXT) && pItem->pszText)
   {
      hNextItem.cchTextMax = strlen(pItem->pszText);

      if(hNextItem.cchTextMax)
         hNextItem.pszText = new char[++hNextItem.cchTextMax];
   }

   while(hNextItem.hItem)
   {
      if(Compare(pItem, hNextItem))
      {         
         //Copy all the information into pItem and return
         memcpy(pItem, &hNextItem, sizeof(TV_ITEM));

         //Free resources
         if(hNextItem.pszText)
            delete hNextItem.pszText;
         
         return pItem->hItem;
      }

      //The mask is used to retrieve the data to compare and must be
      //reset before calling Compare
      hNextItem.mask = pItem->mask;
      hNextItem.hItem = GetNextItem(hNextItem.hItem);
   }   
   
   //Set hItem in pItem
   pItem->hItem = NULL;

   //Free resources
   if(hNextItem.pszText)
      delete hNextItem.pszText;
   
   return NULL;
}

BOOL CTreeCtrlEx::Compare(TV_ITEM* pItem, TV_ITEM& tvTempItem)
{
   //This call uses the .mask setting to just retrieve the values
   //that the client wants to compare.
   //Get all the data passed in by pItem
   GetItem(&tvTempItem);

   //Reset the mask so I can keep track of the matching attributes
   tvTempItem.mask = 0;

   if((pItem->mask & TVIF_STATE) && 
      (pItem->state == tvTempItem.state))
      tvTempItem.mask |= TVIF_STATE;

   if((pItem->mask & TVIF_IMAGE) && 
      (pItem->iImage == tvTempItem.iImage))
      tvTempItem.mask |= TVIF_IMAGE;

   if((pItem->mask & TVIF_PARAM) && 
      (pItem->lParam == tvTempItem.lParam))
      tvTempItem.mask |= TVIF_PARAM;

   if((pItem->mask & TVIF_TEXT) &&
      pItem->pszText && tvTempItem.pszText && //Don't compare if either is NULL
      !strcmp(pItem->pszText, tvTempItem.pszText))
      tvTempItem.mask |= TVIF_TEXT;

   if((pItem->mask & TVIF_CHILDREN) && 
      (pItem->cChildren == tvTempItem.cChildren))
      tvTempItem.mask |= TVIF_CHILDREN;

   if((pItem->mask & TVIF_SELECTEDIMAGE) && 
      (pItem->iSelectedImage == tvTempItem.iSelectedImage))
      tvTempItem.mask |= TVIF_SELECTEDIMAGE;
   
   //If by this point these two values are the same.
   //tvTempItem.hItem is the desired item
   return (pItem->mask == tvTempItem.mask);
}


Date Last Updated: April 24, 1999



Comments

  • Doesn't traverse

    Posted by Legacy on 11/04/2002 12:00am

    Originally posted by: Raymond Parsons

    This works well, although it doesn't provide any support for traversing into child items.

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: July 28, 2016 @ 1:00 p.m. ET / 10:00 a.m. PT Jepsen tests are third-party tests for distributed databases that validate vendors' guarantees about how they perform under various failure scenarios, especially network partitions. These have proven their value as tools in any distributed system tester's arsenal. When the creator of Jepsen, Kyle Kingsbury, started his Jepsen-for-Hire business last fall, VoltDB immediately got in line, and over the past two months, our solution was given the most …

  • Microsoft® Office 365 is a top choice for enterprises that want a cloud-based suite of productivity/ collaboration applications. With Office 365, you get access to Microsoft™ Office solutions practically anytime, anywhere, on virtually any device. It's a great option for current Microsoft users who can now build on their experience with Microsoft™ solutions while enjoying the flexibility of a cloud-based delivery. But even organizations with no previous investment in Microsoft will find that …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date