Ticket #6374: NavMenu.cpp.patch
File NavMenu.cpp.patch, 19.3 KB (added by , 14 years ago) |
---|
-
src/kits/tracker/NavMenu.cpp
26 26 used in advertising or otherwise to promote the sale, use or other dealings in 27 27 this Software without prior written authorization from Be Incorporated. 28 28 29 Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks30 of Be Incorporated in the United States and other countries. Other brand product 31 names are registered trademarks or trademarks of their respective holders. 32 All rights reserved.29 Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered 30 trademarks of Be Incorporated in the United States and other countries. 31 Other brand product names are registered trademarks or trademarks of 32 their respective holders. All rights reserved. 33 33 */ 34 34 35 35 // NavMenu is a hierarchical menu of volumes, folders, files and queries … … 77 77 78 78 79 79 bool 80 SpringLoadedFolderCompareMessages(const BMessage *incoming, const BMessage *dragmessage) 80 SpringLoadedFolderCompareMessages(const BMessage* incoming, 81 const BMessage* dragmessage) 81 82 { 82 83 if (!dragmessage || !incoming) 83 84 return false; 84 85 85 bool retvalue =false;86 for (int32 inIndex =0; incoming->HasRef("refs", inIndex); inIndex++) {86 bool retvalue = false; 87 for (int32 inIndex = 0; incoming->HasRef("refs", inIndex); inIndex++) { 87 88 entry_ref inRef; 88 89 if (incoming->FindRef("refs", inIndex, &inRef) != B_OK) { 89 90 retvalue = false; 90 91 break; 91 92 } 92 93 93 94 bool inRefMatch = false; 94 for (int32 dragIndex=0; dragmessage->HasRef("refs", dragIndex); dragIndex++) { 95 for (int32 dragIndex = 0; dragmessage->HasRef("refs", dragIndex); 96 dragIndex++) { 95 97 entry_ref dragRef; 96 98 if (dragmessage->FindRef("refs", dragIndex, &dragRef) != B_OK) { 97 99 inRefMatch = false; … … 117 119 BPoint inPt, dPt; 118 120 if (incoming->FindPoint("click_pt", &inPt) == B_OK) 119 121 if (dragmessage->FindPoint("click_pt", &dPt) == B_OK) 120 retvalue = (inPt == dPt); 122 retvalue = (inPt == dPt); 121 123 } 122 124 123 125 return retvalue; … … 125 127 126 128 127 129 void 128 SpringLoadedFolderSetMenuStates(const BMenu* menu, const BObjectList<BString> *typeslist) 130 SpringLoadedFolderSetMenuStates(const BMenu* menu, 131 const BObjectList<BString> *typeslist) 129 132 { 130 133 if (!menu || !typeslist) 131 134 return; 132 135 133 136 // if a types list exists 134 137 // iterate through the list and see if each item 135 138 // can support any item in the list 136 // set the enabled state of the item 139 // set the enabled state of the item 137 140 int32 count = menu->CountItems(); 138 141 for (int32 index = 0 ; index < count ; index++) { 139 ModelMenuItem *item = dynamic_cast<ModelMenuItem *>(menu->ItemAt(index));142 ModelMenuItem* item = dynamic_cast<ModelMenuItem *>(menu->ItemAt(index)); 140 143 if (!item) 141 144 continue; 142 145 143 const Model *model = item->TargetModel();146 const Model* model = item->TargetModel(); 144 147 if (!model) 145 148 continue; 146 149 147 150 if (model->IsSymLink()) { 148 151 // find out what the model is, resolve if symlink 149 152 BEntry entry(model->EntryRef(), true); … … 157 160 int32 supported = resolvedModel.SupportsMimeType(NULL, typeslist); 158 161 item->SetEnabled(supported != kDoesNotSupportType); 159 162 } 160 } else 163 } else 161 164 // bad entry ref (bad symlink?), disable 162 165 item->SetEnabled(false); 163 } else if (model->IsDirectory() || model->IsRoot() || model->IsVolume()) 166 } else if (model->IsDirectory() || model->IsRoot() || model->IsVolume()) 164 167 // always enabled if a container 165 168 item->SetEnabled(true); 166 169 else if (model->IsFile() || model->IsExecutable()) { … … 168 171 item->SetEnabled(supported != kDoesNotSupportType); 169 172 } else 170 173 item->SetEnabled(false); 171 } 174 } 172 175 } 173 176 174 177 175 178 void 176 SpringLoadedFolderAddUniqueTypeToList(entry_ref *ref, BObjectList<BString> *typeslist) 179 SpringLoadedFolderAddUniqueTypeToList(entry_ref* ref, 180 BObjectList<BString> *typeslist) 177 181 { 178 182 if (!ref || !typeslist) 179 183 return; 180 184 181 185 // get the mime type for the current ref 182 186 BNodeInfo nodeinfo; 183 187 BNode node(ref); 184 188 if (node.InitCheck() != B_OK) 185 189 return; 186 190 187 191 nodeinfo.SetTo(&node); 188 189 char mimestr[B_MIME_TYPE_LENGTH]; 192 193 char mimestr[B_MIME_TYPE_LENGTH]; 190 194 // add it to the list 191 195 if (nodeinfo.GetType(mimestr) == B_OK && strlen(mimestr) > 0) { 192 196 // if this is a symlink, add symlink to the list (below) … … 194 198 // to the list 195 199 if (strcmp(B_LINK_MIMETYPE, mimestr) == 0) { 196 200 BEntry entry(ref, true); 197 if (entry.InitCheck() == B_OK) { 201 if (entry.InitCheck() == B_OK) { 198 202 entry_ref resolvedRef; 199 if (entry.GetRef(&resolvedRef) == B_OK) 203 if (entry.GetRef(&resolvedRef) == B_OK) 200 204 SpringLoadedFolderAddUniqueTypeToList(&resolvedRef, typeslist); 201 205 } 202 } 206 } 203 207 // scan the current list, don't add dups 204 208 bool unique = true; 205 209 int32 count = typeslist->CountItems(); … … 209 213 break; 210 214 } 211 215 } 212 213 if (unique) 216 217 if (unique) 214 218 typeslist->AddItem(new BString(mimestr)); 215 219 } 216 220 } 217 221 218 222 219 223 void 220 SpringLoadedFolderCacheDragData(const BMessage *incoming, BMessage **message, BObjectList<BString> **typeslist) 224 SpringLoadedFolderCacheDragData(const BMessage* incoming, BMessage* *message, 225 BObjectList<BString> **typeslist) 221 226 { 222 227 if (!incoming) 223 228 return; 224 229 225 230 delete *message; 226 231 delete *typeslist; 227 228 BMessage *localMessage = new BMessage(*incoming);232 233 BMessage* localMessage = new BMessage(*incoming); 229 234 BObjectList<BString> *localTypesList = new BObjectList<BString>(10, true); 230 235 231 for (int32 index =0; incoming->HasRef("refs", index); index++) {236 for (int32 index = 0; incoming->HasRef("refs", index); index++) { 232 237 entry_ref ref; 233 238 if (incoming->FindRef("refs", index, &ref) != B_OK) 234 239 continue; 235 240 236 241 SpringLoadedFolderAddUniqueTypeToList(&ref, localTypesList); 237 242 } 238 243 239 244 *message = localMessage; 240 245 *typeslist = localTypesList; 241 246 } … … 249 254 #undef B_TRANSLATE_CONTEXT 250 255 #define B_TRANSLATE_CONTEXT "NavMenu" 251 256 252 BNavMenu::BNavMenu(const char *title, uint32 message, const BHandler *target,253 BWindow *parentWindow, const BObjectList<BString> *list)257 BNavMenu::BNavMenu(const char* title, uint32 message, const BHandler* target, 258 BWindow* parentWindow, const BObjectList<BString> *list) 254 259 : BSlowMenu(title), 255 260 fMessage(message), 256 261 fMessenger(target, target->Looper()), … … 266 271 267 272 // add the parent window to the invocation message so that it 268 273 // can be closed if option modifier held down during invocation 269 BContainerWindow *originatingWindow = dynamic_cast<BContainerWindow *>(fParentWindow); 274 BContainerWindow* originatingWindow = 275 dynamic_cast<BContainerWindow *>(fParentWindow); 270 276 if (originatingWindow) 271 277 fMessage.AddData("nodeRefsToClose", B_RAW_TYPE, 272 278 originatingWindow->TargetModel()->NodeRef(), sizeof (node_ref)); … … 276 282 } 277 283 278 284 279 BNavMenu::BNavMenu(const char *title, uint32 message, const BMessenger &messenger, 280 BWindow *parentWindow, const BObjectList<BString> *list) 285 BNavMenu::BNavMenu(const char* title, uint32 message, 286 const BMessenger& messenger, BWindow* parentWindow, 287 const BObjectList<BString> *list) 281 288 : BSlowMenu(title), 282 289 fMessage(message), 283 290 fMessenger(messenger), … … 293 300 294 301 // add the parent window to the invocation message so that it 295 302 // can be closed if option modifier held down during invocation 296 BContainerWindow *originatingWindow = dynamic_cast<BContainerWindow *>(fParentWindow); 303 BContainerWindow* originatingWindow = 304 dynamic_cast<BContainerWindow *>(fParentWindow); 297 305 if (originatingWindow) 298 306 fMessage.AddData("nodeRefsToClose", B_RAW_TYPE, 299 307 originatingWindow->TargetModel()->NodeRef(), sizeof (node_ref)); … … 312 320 BNavMenu::AttachedToWindow() 313 321 { 314 322 BSlowMenu::AttachedToWindow(); 315 323 316 324 SpringLoadedFolderSetMenuStates(this, fTypesList); 317 325 // if dragging (fTypesList != NULL) 318 326 // set the menu items enabled state … … 343 351 } 344 352 345 353 346 void 354 void 347 355 BNavMenu::ForceRebuild() 348 356 { 349 357 ClearMenuBuildingState(); … … 351 359 } 352 360 353 361 354 bool 362 bool 355 363 BNavMenu::NeedsToRebuild() const 356 364 { 357 365 return !fMenuBuilt; … … 359 367 360 368 361 369 void 362 BNavMenu::SetNavDir(const entry_ref *ref)370 BNavMenu::SetNavDir(const entry_ref* ref) 363 371 { 364 372 ForceRebuild(); 365 373 // reset the slow menu building mechanism so we can add more stuff 366 367 fNavDir = *ref;374 375 fNavDir =* ref; 368 376 } 369 377 370 378 … … 378 386 // they didn't get added to the menu 379 387 if (fItemList) { 380 388 int32 count = fItemList->CountItems(); 381 for (int32 index = count - 1; index >= 0; index--) 389 for (int32 index = count - 1; index >= 0; index--) 382 390 delete RemoveItem(index); 383 391 delete fItemList; 384 392 fItemList = NULL; … … 392 400 BEntry entry; 393 401 394 402 if (fNavDir.device < 0 || entry.SetTo(&fNavDir) != B_OK 395 || !entry.Exists()) 403 || !entry.Exists()) 396 404 return false; 397 405 398 406 fItemList = new BObjectList<BMenuItem>(50); 399 407 400 408 fIteratingDesktop = false; 401 409 402 410 BDirectory parent; 403 411 status_t status = entry.GetParent(&parent); 404 412 405 413 // if ref is the root item then build list of volume root dirs 406 fFlags = uint8((fFlags & ~kVolumesOnly) | (status == B_ENTRY_NOT_FOUND ? kVolumesOnly : 0)); 414 fFlags = uint8((fFlags & ~kVolumesOnly) 415 | (status == B_ENTRY_NOT_FOUND ? kVolumesOnly : 0)); 407 416 if (fFlags & kVolumesOnly) 408 417 return true; 409 418 410 419 Model startModel(&entry, true); 411 if (startModel.InitCheck() != B_OK || !startModel.IsContainer()) 420 if (startModel.InitCheck() != B_OK || !startModel.IsContainer()) 412 421 return false; 413 422 414 if (startModel.IsQuery()) 423 if (startModel.IsQuery()) 415 424 fContainer = new QueryEntryListCollection(&startModel); 416 425 else if (startModel.IsDesktop()) { 417 426 fIteratingDesktop = true; 418 fContainer = DesktopPoseView::InitDesktopDirentIterator(0, startModel.EntryRef()); 427 fContainer = DesktopPoseView::InitDesktopDirentIterator( 428 0, startModel.EntryRef()); 419 429 AddRootItemsIfNeeded(); 420 430 AddTrashItem(); 421 431 } else if (startModel.IsTrash()) { … … 425 435 volRoster.Rewind(); 426 436 BVolume volume; 427 437 fContainer = new EntryIteratorList(); 428 438 429 439 while (volRoster.GetNextVolume(&volume) == B_OK) { 430 440 if (volume.IsReadOnly() || !volume.IsPersistent()) 431 441 continue; 432 442 433 443 BDirectory trashDir; 434 444 435 445 if (FSGetTrashDir(&trashDir, volume.Device()) == B_OK) 436 446 dynamic_cast<EntryIteratorList *>(fContainer)-> 437 447 AddItem(new DirectoryEntryList(trashDir)); … … 508 518 return true; 509 519 } 510 520 511 QueryEntryListCollection *queryContainer521 QueryEntryListCollection* queryContainer 512 522 = dynamic_cast<QueryEntryListCollection*>(fContainer); 513 523 if (queryContainer && !queryContainer->ShowResultsFromTrash() 514 524 && FSInTrashDir(model.EntryRef())) { … … 519 529 ssize_t size = -1; 520 530 PoseInfo poseInfo; 521 531 522 if (model.Node()) 532 if (model.Node()) 523 533 size = model.Node()->ReadAttr(kAttrPoseInfo, B_RAW_TYPE, 0, 524 534 &poseInfo, sizeof(poseInfo)); 525 535 526 536 model.CloseNode(); 527 537 528 538 // item might be in invisible 529 539 if (size == sizeof(poseInfo) 530 540 && !BPoseView::PoseVisible(&model, &poseInfo)) … … 535 545 } 536 546 537 547 538 void 539 BNavMenu::AddOneItem(Model *model)548 void 549 BNavMenu::AddOneItem(Model* model) 540 550 { 541 BMenuItem *item = NewModelItem(model, &fMessage, fMessenger, false,551 BMenuItem* item = NewModelItem(model, &fMessage, fMessenger, false, 542 552 dynamic_cast<BContainerWindow *>(fParentWindow), 543 553 fTypesList, &fTrackingHook); 544 554 … … 547 557 } 548 558 549 559 550 ModelMenuItem *551 BNavMenu::NewModelItem(Model *model, const BMessage *invokeMessage,552 const BMessenger &target, bool suppressFolderHierarchy,553 BContainerWindow *parentWindow, const BObjectList<BString> *typeslist,554 TrackingHookData *hook)560 ModelMenuItem* 561 BNavMenu::NewModelItem(Model* model, const BMessage* invokeMessage, 562 const BMessenger& target, bool suppressFolderHierarchy, 563 BContainerWindow* parentWindow, const BObjectList<BString> *typeslist, 564 TrackingHookData* hook) 555 565 { 556 566 if (model->InitCheck() != B_OK) 557 567 return 0; 558 568 entry_ref ref; 559 569 bool container = false; 560 570 if (model->IsSymLink()) { 561 562 Model *newResolvedModel = 0;563 Model *result = model->LinkTo();564 571 572 Model* newResolvedModel = 0; 573 Model* result = model->LinkTo(); 574 565 575 if (!result) { 566 576 newResolvedModel = new Model(model->EntryRef(), true, true); 567 577 … … 576 586 if (result) { 577 587 BModelOpener opener(result); 578 588 // open the model, if it ain't open already 579 589 580 590 PoseInfo poseInfo; 581 591 ssize_t size = -1; 582 592 583 if (result->Node()) 593 if (result->Node()) 584 594 size = result->Node()->ReadAttr(kAttrPoseInfo, B_RAW_TYPE, 0, 585 595 &poseInfo, sizeof(poseInfo)); 586 596 587 597 result->CloseNode(); 588 598 589 if (size == sizeof(poseInfo) && !BPoseView::PoseVisible(result, 599 if (size == sizeof(poseInfo) && !BPoseView::PoseVisible(result, 590 600 &poseInfo)) { 591 601 // link target does not want to be visible 592 602 delete newResolvedModel; … … 602 612 container = model->IsContainer(); 603 613 } 604 614 605 BMessage *message = new BMessage(*invokeMessage);615 BMessage* message = new BMessage(*invokeMessage); 606 616 message->AddRef("refs", model->EntryRef()); 607 617 608 618 // Truncate the name if necessary … … 610 620 be_plain_font->TruncateString(&truncatedString, B_TRUNCATE_END, 611 621 GetMaxMenuWidth()); 612 622 613 ModelMenuItem *item = NULL;623 ModelMenuItem* item = NULL; 614 624 if (!container || suppressFolderHierarchy) { 615 625 item = new ModelMenuItem(model, truncatedString.String(), message); 616 626 if (invokeMessage->what != B_REFS_RECEIVED) … … 618 628 // the above is broken for FavoritesMenu::AddNextItem, which uses a 619 629 // workaround - should fix this 620 630 } else { 621 BNavMenu *menu = new BNavMenu(truncatedString.String(),631 BNavMenu* menu = new BNavMenu(truncatedString.String(), 622 632 invokeMessage->what, target, parentWindow, typeslist); 623 633 624 634 menu->SetNavDir(&ref); 625 635 if (hook) 626 636 menu->InitTrackingHook(hook->fTrackingHook, &(hook->fTarget), … … 629 639 item = new ModelMenuItem(model, menu); 630 640 item->SetMessage(message); 631 641 } 632 642 633 643 return item; 634 644 } 635 645 … … 642 652 643 653 roster.Rewind(); 644 654 while (roster.GetNextVolume(&volume) == B_OK) { 645 655 646 656 if (!volume.IsPersistent()) 647 657 continue; 648 658 649 659 BDirectory startDir; 650 660 if (volume.GetRootDirectory(&startDir) == B_OK) { 651 661 BEntry entry; 652 662 startDir.GetEntry(&entry); 653 663 654 Model *model = new Model(&entry);664 Model* model = new Model(&entry); 655 665 if (model->InitCheck() != B_OK) { 656 666 delete model; 657 667 continue; 658 668 } 659 660 BNavMenu *menu = new BNavMenu(model->Name(), fMessage.what,669 670 BNavMenu* menu = new BNavMenu(model->Name(), fMessage.what, 661 671 fMessenger, fParentWindow, fTypesList); 662 672 663 673 menu->SetNavDir(model->EntryRef()); 664 674 665 675 ASSERT(menu->Name()); 666 676 667 ModelMenuItem *item = new ModelMenuItem(model, menu);668 BMessage *message = new BMessage(fMessage);677 ModelMenuItem* item = new ModelMenuItem(model, menu); 678 BMessage* message = new BMessage(fMessage); 669 679 670 680 message->AddRef("refs", model->EntryRef()); 671 681 672 682 item->SetMessage(message); 673 683 fItemList->AddItem(item); 674 684 ASSERT(item->Label()); 675 685 676 686 } 677 687 } 678 688 } 679 689 680 690 681 691 int 682 BNavMenu::CompareFolderNamesFirstOne(const BMenuItem *i1, const BMenuItem *i2)692 BNavMenu::CompareFolderNamesFirstOne(const BMenuItem* i1, const BMenuItem* i2) 683 693 { 684 const ModelMenuItem *item1 = dynamic_cast<const ModelMenuItem *>(i1);685 const ModelMenuItem *item2 = dynamic_cast<const ModelMenuItem *>(i2);686 694 const ModelMenuItem* item1 = dynamic_cast<const ModelMenuItem *>(i1); 695 const ModelMenuItem* item2 = dynamic_cast<const ModelMenuItem *>(i2); 696 687 697 if (item1 != NULL && item2 != NULL) 688 698 return item1->TargetModel()->CompareFolderNamesFirst(item2->TargetModel()); 689 699 … … 692 702 693 703 694 704 int 695 BNavMenu::CompareOne(const BMenuItem *i1, const BMenuItem *i2)705 BNavMenu::CompareOne(const BMenuItem* i1, const BMenuItem* i2) 696 706 { 697 707 return strcasecmp(i1->Label(), i2->Label()); 698 708 } … … 716 726 if (!directory.IsRootDirectory() 717 727 && entry.GetParent(&entry) == B_OK) { 718 728 Model model(&entry, true); 719 BLooper *looper; 720 AddNavParentDir(&model,fMessage.what,fMessenger.Target(&looper)); 729 BLooper* looper; 730 AddNavParentDir(&model, fMessage.what, 731 fMessenger.Target(&looper)); 721 732 } 722 733 } 723 734 724 735 int32 count = fItemList->CountItems(); 725 for (int32 index = 0; index < count; index++) 736 for (int32 index = 0; index < count; index++) 726 737 AddItem(fItemList->ItemAt(index)); 727 738 fItemList->MakeEmpty(); 728 739 729 740 if (!count) { 730 BMenuItem *item = new BMenuItem(B_TRANSLATE("Empty folder"), 0);741 BMenuItem* item = new BMenuItem(B_TRANSLATE("Empty folder"), 0); 731 742 item->SetEnabled(false); 732 743 AddItem(item); 733 744 } … … 744 755 } 745 756 746 757 747 void 748 BNavMenu::AddNavDir(const Model *model, uint32 what, BHandler *target,758 void 759 BNavMenu::AddNavDir(const Model* model, uint32 what, BHandler* target, 749 760 bool populateSubmenu) 750 761 { 751 BMessage *message = new BMessage((uint32)what);762 BMessage* message = new BMessage((uint32)what); 752 763 message->AddRef("refs", model->EntryRef()); 753 ModelMenuItem *item = NULL;764 ModelMenuItem* item = NULL; 754 765 755 766 if (populateSubmenu) { 756 BNavMenu *navMenu = new BNavMenu(model->Name(), what, target);767 BNavMenu* navMenu = new BNavMenu(model->Name(), what, target); 757 768 navMenu->SetNavDir(model->EntryRef()); 758 navMenu->InitTrackingHook(fTrackingHook.fTrackingHook, &(fTrackingHook.fTarget),759 769 navMenu->InitTrackingHook(fTrackingHook.fTrackingHook, 770 &(fTrackingHook.fTarget), fTrackingHook.fDragMessage); 760 771 item = new ModelMenuItem(model, navMenu); 761 772 item->SetMessage(message); 762 } else 773 } else 763 774 item = new ModelMenuItem(model, model->Name(), message); 764 775 765 776 AddItem(item); … … 767 778 768 779 769 780 void 770 BNavMenu::AddNavParentDir(const char *name,const Model *model,uint32 what,BHandler *target) 781 BNavMenu::AddNavParentDir(const char* name,const Model* model, 782 uint32 what, BHandler* target) 771 783 { 772 BNavMenu *menu = new BNavMenu(name,what,target);784 BNavMenu* menu = new BNavMenu(name, what, target); 773 785 menu->SetNavDir(model->EntryRef()); 774 786 menu->SetShowParent(true); 775 787 menu->InitTrackingHook(fTrackingHook.fTrackingHook, &(fTrackingHook.fTarget), 776 788 fTrackingHook.fDragMessage); 777 789 778 BMenuItem *item = new SpecialModelMenuItem(model,menu);790 BMenuItem* item = new SpecialModelMenuItem(model, menu); 779 791 780 BMessage *message = new BMessage(what);792 BMessage* message = new BMessage(what); 781 793 message->AddRef("refs",model->EntryRef()); 782 794 item->SetMessage(message); 783 795 … … 786 798 787 799 788 800 void 789 BNavMenu::AddNavParentDir(const Model *model, uint32 what, BHandler *target)801 BNavMenu::AddNavParentDir(const Model* model, uint32 what, BHandler* target) 790 802 { 791 AddNavParentDir( "parent folder",model,what,target);803 AddNavParentDir(B_TRANSLATE("parent folder"),model, what, target); 792 804 } 793 805 794 806 … … 814 826 815 827 816 828 void 817 BNavMenu::SetTarget(const BMessenger &msngr)829 BNavMenu::SetTarget(const BMessenger& msngr) 818 830 { 819 831 fMessenger = msngr; 820 832 } … … 827 839 } 828 840 829 841 830 TrackingHookData 831 BNavMenu::InitTrackingHook(bool (*hook)(BMenu *, void *), const BMessenger *target,832 const BMess age *dragMessage)842 TrackingHookData* 843 BNavMenu::InitTrackingHook(bool (*hook)(BMenu*, void*), 844 const BMessenger* target, const BMessage* dragMessage) 833 845 { 834 846 fTrackingHook.fTrackingHook = hook; 835 847 if (target) … … 840 852 } 841 853 842 854 843 void 844 BNavMenu::SetTrackingHookDeep(BMenu *menu, bool (*func)(BMenu *, void *), void *state) 855 void 856 BNavMenu::SetTrackingHookDeep(BMenu* menu, bool (*func)(BMenu*, void*), 857 void* state) 845 858 { 846 859 menu->SetTrackingHook(func, state); 847 860 int32 count = menu->CountItems(); 848 861 for (int32 index = 0 ; index < count; index++) { 849 BMenuItem *item = menu->ItemAt(index);862 BMenuItem* item = menu->ItemAt(index); 850 863 if (!item) 851 864 continue; 852 865 853 BMenu *submenu = item->Submenu();866 BMenu* submenu = item->Submenu(); 854 867 if (submenu) 855 868 SetTrackingHookDeep(submenu, func, state); 856 869 }