diff --git a/src/kits/tracker/NavMenu.cpp b/src/kits/tracker/NavMenu.cpp index 53afa3c6dd..f63bc6ba07 100644 --- a/src/kits/tracker/NavMenu.cpp +++ b/src/kits/tracker/NavMenu.cpp @@ -26,10 +26,10 @@ Except as contained in this notice, the name of Be Incorporated shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Be Incorporated. -Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks -of Be Incorporated in the United States and other countries. Other brand product -names are registered trademarks or trademarks of their respective holders. -All rights reserved. +Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered +trademarks of Be Incorporated in the United States and other countries. +Other brand product names are registered trademarks or trademarks of +their respective holders. All rights reserved. */ // NavMenu is a hierarchical menu of volumes, folders, files and queries @@ -77,21 +77,23 @@ enum nav_flags { bool -SpringLoadedFolderCompareMessages(const BMessage *incoming, const BMessage *dragmessage) +SpringLoadedFolderCompareMessages(const BMessage* incoming, + const BMessage* dragmessage) { if (!dragmessage || !incoming) return false; - bool retvalue=false; - for (int32 inIndex=0; incoming->HasRef("refs", inIndex); inIndex++) { + bool retvalue = false; + for (int32 inIndex = 0; incoming->HasRef("refs", inIndex); inIndex++) { entry_ref inRef; if (incoming->FindRef("refs", inIndex, &inRef) != B_OK) { retvalue = false; break; } - + bool inRefMatch = false; - for (int32 dragIndex=0; dragmessage->HasRef("refs", dragIndex); dragIndex++) { + for (int32 dragIndex = 0; dragmessage->HasRef("refs", dragIndex); + dragIndex++) { entry_ref dragRef; if (dragmessage->FindRef("refs", dragIndex, &dragRef) != B_OK) { inRefMatch = false; @@ -117,7 +119,7 @@ SpringLoadedFolderCompareMessages(const BMessage *incoming, const BMessage *drag BPoint inPt, dPt; if (incoming->FindPoint("click_pt", &inPt) == B_OK) if (dragmessage->FindPoint("click_pt", &dPt) == B_OK) - retvalue = (inPt == dPt); + retvalue = (inPt == dPt); } return retvalue; @@ -125,25 +127,26 @@ SpringLoadedFolderCompareMessages(const BMessage *incoming, const BMessage *drag void -SpringLoadedFolderSetMenuStates(const BMenu* menu, const BObjectList *typeslist) +SpringLoadedFolderSetMenuStates(const BMenu* menu, + const BObjectList *typeslist) { if (!menu || !typeslist) return; - + // if a types list exists // iterate through the list and see if each item // can support any item in the list - // set the enabled state of the item + // set the enabled state of the item int32 count = menu->CountItems(); for (int32 index = 0 ; index < count ; index++) { - ModelMenuItem *item = dynamic_cast(menu->ItemAt(index)); + ModelMenuItem* item = dynamic_cast(menu->ItemAt(index)); if (!item) continue; - const Model *model = item->TargetModel(); + const Model* model = item->TargetModel(); if (!model) continue; - + if (model->IsSymLink()) { // find out what the model is, resolve if symlink BEntry entry(model->EntryRef(), true); @@ -157,10 +160,10 @@ SpringLoadedFolderSetMenuStates(const BMenu* menu, const BObjectList *t int32 supported = resolvedModel.SupportsMimeType(NULL, typeslist); item->SetEnabled(supported != kDoesNotSupportType); } - } else + } else // bad entry ref (bad symlink?), disable item->SetEnabled(false); - } else if (model->IsDirectory() || model->IsRoot() || model->IsVolume()) + } else if (model->IsDirectory() || model->IsRoot() || model->IsVolume()) // always enabled if a container item->SetEnabled(true); else if (model->IsFile() || model->IsExecutable()) { @@ -168,25 +171,26 @@ SpringLoadedFolderSetMenuStates(const BMenu* menu, const BObjectList *t item->SetEnabled(supported != kDoesNotSupportType); } else item->SetEnabled(false); - } + } } void -SpringLoadedFolderAddUniqueTypeToList(entry_ref *ref, BObjectList *typeslist) +SpringLoadedFolderAddUniqueTypeToList(entry_ref* ref, + BObjectList *typeslist) { if (!ref || !typeslist) return; - + // get the mime type for the current ref BNodeInfo nodeinfo; BNode node(ref); if (node.InitCheck() != B_OK) return; - + nodeinfo.SetTo(&node); - - char mimestr[B_MIME_TYPE_LENGTH]; + + char mimestr[B_MIME_TYPE_LENGTH]; // add it to the list if (nodeinfo.GetType(mimestr) == B_OK && strlen(mimestr) > 0) { // if this is a symlink, add symlink to the list (below) @@ -194,12 +198,12 @@ SpringLoadedFolderAddUniqueTypeToList(entry_ref *ref, BObjectList *type // to the list if (strcmp(B_LINK_MIMETYPE, mimestr) == 0) { BEntry entry(ref, true); - if (entry.InitCheck() == B_OK) { + if (entry.InitCheck() == B_OK) { entry_ref resolvedRef; - if (entry.GetRef(&resolvedRef) == B_OK) + if (entry.GetRef(&resolvedRef) == B_OK) SpringLoadedFolderAddUniqueTypeToList(&resolvedRef, typeslist); } - } + } // scan the current list, don't add dups bool unique = true; int32 count = typeslist->CountItems(); @@ -209,33 +213,34 @@ SpringLoadedFolderAddUniqueTypeToList(entry_ref *ref, BObjectList *type break; } } - - if (unique) + + if (unique) typeslist->AddItem(new BString(mimestr)); } } void -SpringLoadedFolderCacheDragData(const BMessage *incoming, BMessage **message, BObjectList **typeslist) +SpringLoadedFolderCacheDragData(const BMessage* incoming, BMessage* *message, + BObjectList **typeslist) { if (!incoming) return; - + delete *message; delete *typeslist; - - BMessage *localMessage = new BMessage(*incoming); + + BMessage* localMessage = new BMessage(*incoming); BObjectList *localTypesList = new BObjectList(10, true); - for (int32 index=0; incoming->HasRef("refs", index); index++) { + for (int32 index = 0; incoming->HasRef("refs", index); index++) { entry_ref ref; if (incoming->FindRef("refs", index, &ref) != B_OK) continue; SpringLoadedFolderAddUniqueTypeToList(&ref, localTypesList); } - + *message = localMessage; *typeslist = localTypesList; } @@ -249,8 +254,8 @@ SpringLoadedFolderCacheDragData(const BMessage *incoming, BMessage **message, BO #undef B_TRANSLATE_CONTEXT #define B_TRANSLATE_CONTEXT "NavMenu" -BNavMenu::BNavMenu(const char *title, uint32 message, const BHandler *target, - BWindow *parentWindow, const BObjectList *list) +BNavMenu::BNavMenu(const char* title, uint32 message, const BHandler* target, + BWindow* parentWindow, const BObjectList *list) : BSlowMenu(title), fMessage(message), fMessenger(target, target->Looper()), @@ -266,7 +271,8 @@ BNavMenu::BNavMenu(const char *title, uint32 message, const BHandler *target, // add the parent window to the invocation message so that it // can be closed if option modifier held down during invocation - BContainerWindow *originatingWindow = dynamic_cast(fParentWindow); + BContainerWindow* originatingWindow = + dynamic_cast(fParentWindow); if (originatingWindow) fMessage.AddData("nodeRefsToClose", B_RAW_TYPE, originatingWindow->TargetModel()->NodeRef(), sizeof (node_ref)); @@ -276,8 +282,9 @@ BNavMenu::BNavMenu(const char *title, uint32 message, const BHandler *target, } -BNavMenu::BNavMenu(const char *title, uint32 message, const BMessenger &messenger, - BWindow *parentWindow, const BObjectList *list) +BNavMenu::BNavMenu(const char* title, uint32 message, + const BMessenger& messenger, BWindow* parentWindow, + const BObjectList *list) : BSlowMenu(title), fMessage(message), fMessenger(messenger), @@ -293,7 +300,8 @@ BNavMenu::BNavMenu(const char *title, uint32 message, const BMessenger &messenge // add the parent window to the invocation message so that it // can be closed if option modifier held down during invocation - BContainerWindow *originatingWindow = dynamic_cast(fParentWindow); + BContainerWindow* originatingWindow = + dynamic_cast(fParentWindow); if (originatingWindow) fMessage.AddData("nodeRefsToClose", B_RAW_TYPE, originatingWindow->TargetModel()->NodeRef(), sizeof (node_ref)); @@ -312,7 +320,7 @@ void BNavMenu::AttachedToWindow() { BSlowMenu::AttachedToWindow(); - + SpringLoadedFolderSetMenuStates(this, fTypesList); // if dragging (fTypesList != NULL) // set the menu items enabled state @@ -343,7 +351,7 @@ BNavMenu::ResetTargets() } -void +void BNavMenu::ForceRebuild() { ClearMenuBuildingState(); @@ -351,7 +359,7 @@ BNavMenu::ForceRebuild() } -bool +bool BNavMenu::NeedsToRebuild() const { return !fMenuBuilt; @@ -359,11 +367,11 @@ BNavMenu::NeedsToRebuild() const void -BNavMenu::SetNavDir(const entry_ref *ref) +BNavMenu::SetNavDir(const entry_ref* ref) { ForceRebuild(); // reset the slow menu building mechanism so we can add more stuff - + fNavDir = *ref; } @@ -378,7 +386,7 @@ BNavMenu::ClearMenuBuildingState() // they didn't get added to the menu if (fItemList) { int32 count = fItemList->CountItems(); - for (int32 index = count - 1; index >= 0; index--) + for (int32 index = count - 1; index >= 0; index--) delete RemoveItem(index); delete fItemList; fItemList = NULL; @@ -392,30 +400,32 @@ BNavMenu::StartBuildingItemList() BEntry entry; if (fNavDir.device < 0 || entry.SetTo(&fNavDir) != B_OK - || !entry.Exists()) + || !entry.Exists()) return false; fItemList = new BObjectList(50); fIteratingDesktop = false; - + BDirectory parent; status_t status = entry.GetParent(&parent); // if ref is the root item then build list of volume root dirs - fFlags = uint8((fFlags & ~kVolumesOnly) | (status == B_ENTRY_NOT_FOUND ? kVolumesOnly : 0)); + fFlags = uint8((fFlags & ~kVolumesOnly) + | (status == B_ENTRY_NOT_FOUND ? kVolumesOnly : 0)); if (fFlags & kVolumesOnly) return true; Model startModel(&entry, true); - if (startModel.InitCheck() != B_OK || !startModel.IsContainer()) + if (startModel.InitCheck() != B_OK || !startModel.IsContainer()) return false; - if (startModel.IsQuery()) + if (startModel.IsQuery()) fContainer = new QueryEntryListCollection(&startModel); else if (startModel.IsDesktop()) { fIteratingDesktop = true; - fContainer = DesktopPoseView::InitDesktopDirentIterator(0, startModel.EntryRef()); + fContainer = DesktopPoseView::InitDesktopDirentIterator( + 0, startModel.EntryRef()); AddRootItemsIfNeeded(); AddTrashItem(); } else if (startModel.IsTrash()) { @@ -425,13 +435,13 @@ BNavMenu::StartBuildingItemList() volRoster.Rewind(); BVolume volume; fContainer = new EntryIteratorList(); - + while (volRoster.GetNextVolume(&volume) == B_OK) { if (volume.IsReadOnly() || !volume.IsPersistent()) continue; - + BDirectory trashDir; - + if (FSGetTrashDir(&trashDir, volume.Device()) == B_OK) dynamic_cast(fContainer)-> AddItem(new DirectoryEntryList(trashDir)); @@ -508,7 +518,7 @@ BNavMenu::AddNextItem() return true; } - QueryEntryListCollection *queryContainer + QueryEntryListCollection* queryContainer = dynamic_cast(fContainer); if (queryContainer && !queryContainer->ShowResultsFromTrash() && FSInTrashDir(model.EntryRef())) { @@ -519,12 +529,12 @@ BNavMenu::AddNextItem() ssize_t size = -1; PoseInfo poseInfo; - if (model.Node()) + if (model.Node()) size = model.Node()->ReadAttr(kAttrPoseInfo, B_RAW_TYPE, 0, &poseInfo, sizeof(poseInfo)); model.CloseNode(); - + // item might be in invisible if (size == sizeof(poseInfo) && !BPoseView::PoseVisible(&model, &poseInfo)) @@ -535,10 +545,10 @@ BNavMenu::AddNextItem() } -void -BNavMenu::AddOneItem(Model *model) +void +BNavMenu::AddOneItem(Model* model) { - BMenuItem *item = NewModelItem(model, &fMessage, fMessenger, false, + BMenuItem* item = NewModelItem(model, &fMessage, fMessenger, false, dynamic_cast(fParentWindow), fTypesList, &fTrackingHook); @@ -547,20 +557,20 @@ BNavMenu::AddOneItem(Model *model) } -ModelMenuItem * -BNavMenu::NewModelItem(Model *model, const BMessage *invokeMessage, - const BMessenger &target, bool suppressFolderHierarchy, - BContainerWindow *parentWindow, const BObjectList *typeslist, - TrackingHookData *hook) +ModelMenuItem* +BNavMenu::NewModelItem(Model* model, const BMessage* invokeMessage, + const BMessenger& target, bool suppressFolderHierarchy, + BContainerWindow* parentWindow, const BObjectList *typeslist, + TrackingHookData* hook) { if (model->InitCheck() != B_OK) return 0; entry_ref ref; bool container = false; if (model->IsSymLink()) { - - Model *newResolvedModel = 0; - Model *result = model->LinkTo(); + + Model* newResolvedModel = 0; + Model* result = model->LinkTo(); if (!result) { newResolvedModel = new Model(model->EntryRef(), true, true); @@ -576,17 +586,17 @@ BNavMenu::NewModelItem(Model *model, const BMessage *invokeMessage, if (result) { BModelOpener opener(result); // open the model, if it ain't open already - + PoseInfo poseInfo; ssize_t size = -1; - if (result->Node()) + if (result->Node()) size = result->Node()->ReadAttr(kAttrPoseInfo, B_RAW_TYPE, 0, &poseInfo, sizeof(poseInfo)); - + result->CloseNode(); - if (size == sizeof(poseInfo) && !BPoseView::PoseVisible(result, + if (size == sizeof(poseInfo) && !BPoseView::PoseVisible(result, &poseInfo)) { // link target does not want to be visible delete newResolvedModel; @@ -602,7 +612,7 @@ BNavMenu::NewModelItem(Model *model, const BMessage *invokeMessage, container = model->IsContainer(); } - BMessage *message = new BMessage(*invokeMessage); + BMessage* message = new BMessage(*invokeMessage); message->AddRef("refs", model->EntryRef()); // Truncate the name if necessary @@ -610,7 +620,7 @@ BNavMenu::NewModelItem(Model *model, const BMessage *invokeMessage, be_plain_font->TruncateString(&truncatedString, B_TRUNCATE_END, GetMaxMenuWidth()); - ModelMenuItem *item = NULL; + ModelMenuItem* item = NULL; if (!container || suppressFolderHierarchy) { item = new ModelMenuItem(model, truncatedString.String(), message); if (invokeMessage->what != B_REFS_RECEIVED) @@ -618,9 +628,9 @@ BNavMenu::NewModelItem(Model *model, const BMessage *invokeMessage, // the above is broken for FavoritesMenu::AddNextItem, which uses a // workaround - should fix this } else { - BNavMenu *menu = new BNavMenu(truncatedString.String(), + BNavMenu* menu = new BNavMenu(truncatedString.String(), invokeMessage->what, target, parentWindow, typeslist); - + menu->SetNavDir(&ref); if (hook) menu->InitTrackingHook(hook->fTrackingHook, &(hook->fTarget), @@ -629,7 +639,7 @@ BNavMenu::NewModelItem(Model *model, const BMessage *invokeMessage, item = new ModelMenuItem(model, menu); item->SetMessage(message); } - + return item; } @@ -642,48 +652,48 @@ BNavMenu::BuildVolumeMenu() roster.Rewind(); while (roster.GetNextVolume(&volume) == B_OK) { - + if (!volume.IsPersistent()) continue; - + BDirectory startDir; if (volume.GetRootDirectory(&startDir) == B_OK) { BEntry entry; startDir.GetEntry(&entry); - Model *model = new Model(&entry); + Model* model = new Model(&entry); if (model->InitCheck() != B_OK) { delete model; continue; } - - BNavMenu *menu = new BNavMenu(model->Name(), fMessage.what, + + BNavMenu* menu = new BNavMenu(model->Name(), fMessage.what, fMessenger, fParentWindow, fTypesList); menu->SetNavDir(model->EntryRef()); ASSERT(menu->Name()); - ModelMenuItem *item = new ModelMenuItem(model, menu); - BMessage *message = new BMessage(fMessage); + ModelMenuItem* item = new ModelMenuItem(model, menu); + BMessage* message = new BMessage(fMessage); message->AddRef("refs", model->EntryRef()); item->SetMessage(message); fItemList->AddItem(item); ASSERT(item->Label()); - + } } } int -BNavMenu::CompareFolderNamesFirstOne(const BMenuItem *i1, const BMenuItem *i2) +BNavMenu::CompareFolderNamesFirstOne(const BMenuItem* i1, const BMenuItem* i2) { - const ModelMenuItem *item1 = dynamic_cast(i1); - const ModelMenuItem *item2 = dynamic_cast(i2); - + const ModelMenuItem* item1 = dynamic_cast(i1); + const ModelMenuItem* item2 = dynamic_cast(i2); + if (item1 != NULL && item2 != NULL) return item1->TargetModel()->CompareFolderNamesFirst(item2->TargetModel()); @@ -692,7 +702,7 @@ BNavMenu::CompareFolderNamesFirstOne(const BMenuItem *i1, const BMenuItem *i2) int -BNavMenu::CompareOne(const BMenuItem *i1, const BMenuItem *i2) +BNavMenu::CompareOne(const BMenuItem* i1, const BMenuItem* i2) { return strcasecmp(i1->Label(), i2->Label()); } @@ -716,18 +726,19 @@ BNavMenu::DoneBuildingItemList() if (!directory.IsRootDirectory() && entry.GetParent(&entry) == B_OK) { Model model(&entry, true); - BLooper *looper; - AddNavParentDir(&model,fMessage.what,fMessenger.Target(&looper)); + BLooper* looper; + AddNavParentDir(&model, fMessage.what, + fMessenger.Target(&looper)); } } int32 count = fItemList->CountItems(); - for (int32 index = 0; index < count; index++) + for (int32 index = 0; index < count; index++) AddItem(fItemList->ItemAt(index)); fItemList->MakeEmpty(); if (!count) { - BMenuItem *item = new BMenuItem(B_TRANSLATE("Empty folder"), 0); + BMenuItem* item = new BMenuItem(B_TRANSLATE("Empty folder"), 0); item->SetEnabled(false); AddItem(item); } @@ -744,22 +755,22 @@ BNavMenu::GetMaxMenuWidth(void) } -void -BNavMenu::AddNavDir(const Model *model, uint32 what, BHandler *target, +void +BNavMenu::AddNavDir(const Model* model, uint32 what, BHandler* target, bool populateSubmenu) { - BMessage *message = new BMessage((uint32)what); + BMessage* message = new BMessage((uint32)what); message->AddRef("refs", model->EntryRef()); - ModelMenuItem *item = NULL; + ModelMenuItem* item = NULL; if (populateSubmenu) { - BNavMenu *navMenu = new BNavMenu(model->Name(), what, target); + BNavMenu* navMenu = new BNavMenu(model->Name(), what, target); navMenu->SetNavDir(model->EntryRef()); - navMenu->InitTrackingHook(fTrackingHook.fTrackingHook, &(fTrackingHook.fTarget), - fTrackingHook.fDragMessage); + navMenu->InitTrackingHook(fTrackingHook.fTrackingHook, + &(fTrackingHook.fTarget), fTrackingHook.fDragMessage); item = new ModelMenuItem(model, navMenu); item->SetMessage(message); - } else + } else item = new ModelMenuItem(model, model->Name(), message); AddItem(item); @@ -767,17 +778,18 @@ BNavMenu::AddNavDir(const Model *model, uint32 what, BHandler *target, void -BNavMenu::AddNavParentDir(const char *name,const Model *model,uint32 what,BHandler *target) +BNavMenu::AddNavParentDir(const char* name,const Model* model, + uint32 what, BHandler* target) { - BNavMenu *menu = new BNavMenu(name,what,target); + BNavMenu* menu = new BNavMenu(name, what, target); menu->SetNavDir(model->EntryRef()); menu->SetShowParent(true); menu->InitTrackingHook(fTrackingHook.fTrackingHook, &(fTrackingHook.fTarget), fTrackingHook.fDragMessage); - BMenuItem *item = new SpecialModelMenuItem(model,menu); + BMenuItem* item = new SpecialModelMenuItem(model, menu); - BMessage *message = new BMessage(what); + BMessage* message = new BMessage(what); message->AddRef("refs",model->EntryRef()); item->SetMessage(message); @@ -786,9 +798,9 @@ BNavMenu::AddNavParentDir(const char *name,const Model *model,uint32 what,BHandl void -BNavMenu::AddNavParentDir(const Model *model, uint32 what, BHandler *target) +BNavMenu::AddNavParentDir(const Model* model, uint32 what, BHandler* target) { - AddNavParentDir("parent folder",model,what,target); + AddNavParentDir(B_TRANSLATE("parent folder"),model, what, target); } @@ -814,7 +826,7 @@ BNavMenu::TypesList() const void -BNavMenu::SetTarget(const BMessenger &msngr) +BNavMenu::SetTarget(const BMessenger& msngr) { fMessenger = msngr; } @@ -827,9 +839,9 @@ BNavMenu::Target() } -TrackingHookData * -BNavMenu::InitTrackingHook(bool (*hook)(BMenu *, void *), const BMessenger *target, - const BMessage *dragMessage) +TrackingHookData* +BNavMenu::InitTrackingHook(bool (*hook)(BMenu*, void*), + const BMessenger* target, const BMessage* dragMessage) { fTrackingHook.fTrackingHook = hook; if (target) @@ -840,17 +852,18 @@ BNavMenu::InitTrackingHook(bool (*hook)(BMenu *, void *), const BMessenger *targ } -void -BNavMenu::SetTrackingHookDeep(BMenu *menu, bool (*func)(BMenu *, void *), void *state) +void +BNavMenu::SetTrackingHookDeep(BMenu* menu, bool (*func)(BMenu*, void*), + void* state) { menu->SetTrackingHook(func, state); int32 count = menu->CountItems(); for (int32 index = 0 ; index < count; index++) { - BMenuItem *item = menu->ItemAt(index); + BMenuItem* item = menu->ItemAt(index); if (!item) continue; - BMenu *submenu = item->Submenu(); + BMenu* submenu = item->Submenu(); if (submenu) SetTrackingHookDeep(submenu, func, state); }