[prev in list] [next in list] [prev in thread] [next in thread] 

List:       haiku-commits
Subject:    [haiku-commits] [L] Change in haiku[master]: Tracker: Refactor SlowContextPopup to use NavMenu, usin
From:       Gerrit <review () review ! haiku-os ! org>
Date:       2023-08-25 17:47:48
Message-ID: 70cc7d2cc84265fd5744abbb85f9a805229fe691-HTML () review ! haiku-os ! org
[Download RAW message or body]

From waddlesplash <waddlesplash@gmail.com>:

waddlesplash has uploaded this change for review. ( \
https://review.haiku-os.org/c/haiku/+/6873?usp=email )


Change subject: Tracker: Refactor SlowContextPopup to use NavMenu, using templates.
......................................................................

Tracker: Refactor SlowContextPopup to use NavMenu, using templates.

These classes have been mirrors of each other going all the way back
to OpenTracker's initial commit, at least.

Eventually it should be possible to merge the remaining bits of
SlowContextPopup and delete the class entirely.
---
M headers/private/tracker/NavMenu.h
M src/kits/tracker/FavoritesMenu.h
M src/kits/tracker/NavMenu.cpp
M src/kits/tracker/OpenWithWindow.h
M src/kits/tracker/RecentItems.cpp
M src/kits/tracker/SlowContextPopup.cpp
M src/kits/tracker/SlowContextPopup.h
M src/kits/tracker/SlowMenu.cpp
M src/kits/tracker/SlowMenu.h
9 files changed, 143 insertions(+), 628 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/73/6873/1

diff --git a/headers/private/tracker/NavMenu.h b/headers/private/tracker/NavMenu.h
index e1c45d1..03982f5 100644
--- a/headers/private/tracker/NavMenu.h
+++ b/headers/private/tracker/NavMenu.h
@@ -72,16 +72,17 @@
 };


-class BNavMenu : public BSlowMenu {
+template<typename T>
+class NavMenu : public BSlowMenu<T> {
 public:
-	BNavMenu(const char* title, uint32 message, const BHandler*,
+	NavMenu(const char* title, uint32 message, const BHandler*,
 		BWindow* parentWindow = NULL, const BObjectList<BString>* list = NULL);
-	BNavMenu(const char* title, uint32 message, const BMessenger&,
+	NavMenu(const char* title, uint32 message, const BMessenger&,
 		BWindow* parentWindow = NULL, const BObjectList<BString>* list = NULL);
 		// parentWindow, if specified, will be closed if nav menu item invoked
 		// with option held down

-	virtual ~BNavMenu();
+	virtual ~NavMenu();

 	virtual void AttachedToWindow();
 	virtual void DetachedFromWindow();
@@ -146,8 +147,14 @@
 	BObjectList<BString>* fTypesList;

 	TrackingHookData fTrackingHook;
+
+private:
+	typedef BSlowMenu<T> _inherited;
 };

+typedef NavMenu<BMenu> BNavMenu;
+
+
 //	Spring Loaded Folder convenience routines
 //		used in both Tracker and Deskbar
 #ifndef _IMPEXP_TRACKER
@@ -164,6 +171,7 @@

 } // namespace BPrivate

+
 using namespace BPrivate;


diff --git a/src/kits/tracker/FavoritesMenu.h b/src/kits/tracker/FavoritesMenu.h
index ec365c7..6111b66 100644
--- a/src/kits/tracker/FavoritesMenu.h
+++ b/src/kits/tracker/FavoritesMenu.h
@@ -51,7 +51,7 @@
 #define kGoDirectory "Tracker/Go"


-class FavoritesMenu : public BSlowMenu {
+class FavoritesMenu : public BSlowMenu<BMenu> {
 	// FavoritesMenu is used in the FilePanel -
 	// displays recent files, recent folders and favorites items
 	public:
diff --git a/src/kits/tracker/NavMenu.cpp b/src/kits/tracker/NavMenu.cpp
index 959125b..bee8309 100644
--- a/src/kits/tracker/NavMenu.cpp
+++ b/src/kits/tracker/NavMenu.cpp
@@ -261,10 +261,11 @@
 #define B_TRANSLATION_CONTEXT "NavMenu"


-BNavMenu::BNavMenu(const char* title, uint32 message, const BHandler* target,
+template<typename T>
+NavMenu<T>::NavMenu(const char* title, uint32 message, const BHandler* target,
 	BWindow* parentWindow, const BObjectList<BString>* list)
 	:
-	BSlowMenu(title),
+	BSlowMenu<T>(title),
 	fMessage(message),
 	fMessenger(target, target->Looper()),
 	fParentWindow(parentWindow),
@@ -289,15 +290,16 @@
 	}

 	// too long to have triggers
-	SetTriggersEnabled(false);
+	_inherited::SetTriggersEnabled(false);
 }


-BNavMenu::BNavMenu(const char* title, uint32 message,
+template<typename T>
+NavMenu<T>::NavMenu(const char* title, uint32 message,
 	const BMessenger& messenger, BWindow* parentWindow,
 	const BObjectList<BString>* list)
 	:
-	BSlowMenu(title),
+	BSlowMenu<T>(title),
 	fMessage(message),
 	fMessenger(messenger),
 	fParentWindow(parentWindow),
@@ -322,20 +324,22 @@
 	}

 	// too long to have triggers
-	SetTriggersEnabled(false);
+	_inherited::SetTriggersEnabled(false);
 }


-BNavMenu::~BNavMenu()
+template<typename T>
+NavMenu<T>::~NavMenu()
 {
 	delete fTypesList;
 }


+template<typename T>
 void
-BNavMenu::AttachedToWindow()
+NavMenu<T>::AttachedToWindow()
 {
-	BSlowMenu::AttachedToWindow();
+	_inherited::AttachedToWindow();

 	SpringLoadedFolderSetMenuStates(this, fTypesList);
 		// If dragging, (fTypesList != NULL) set the menu items enabled state
@@ -345,36 +349,41 @@
 }


+template<typename T>
 void
-BNavMenu::DetachedFromWindow()
+NavMenu<T>::DetachedFromWindow()
 {
 }


+template<typename T>
 void
-BNavMenu::ResetTargets()
+NavMenu<T>::ResetTargets()
 {
-	SetTargetForItems(Target());
+	_inherited::SetTargetForItems(Target());
 }


+template<typename T>
 void
-BNavMenu::ForceRebuild()
+NavMenu<T>::ForceRebuild()
 {
 	ClearMenuBuildingState();
-	fMenuBuilt = false;
+	_inherited::fMenuBuilt = false;
 }


+template<typename T>
 bool
-BNavMenu::NeedsToRebuild() const
+NavMenu<T>::NeedsToRebuild() const
 {
-	return !fMenuBuilt;
+	return !_inherited::fMenuBuilt;
 }


+template<typename T>
 void
-BNavMenu::SetNavDir(const entry_ref* ref)
+NavMenu<T>::SetNavDir(const entry_ref* ref)
 {
 	ForceRebuild();
 		// reset the slow menu building mechanism so we can add more stuff
@@ -383,8 +392,9 @@
 }


+template<typename T>
 void
-BNavMenu::ClearMenuBuildingState()
+NavMenu<T>::ClearMenuBuildingState()
 {
 	delete fContainer;
 	fContainer = NULL;
@@ -392,7 +402,7 @@
 	// item list is non-owning, need to delete the items because
 	// they didn't get added to the menu
 	if (fItemList != NULL) {
-		RemoveItems(0, fItemList->CountItems(), true);
+		_inherited::RemoveItems(0, fItemList->CountItems(), true);

 		delete fItemList;
 		fItemList = NULL;
@@ -400,8 +410,9 @@
 }


+template<typename T>
 bool
-BNavMenu::StartBuildingItemList()
+NavMenu<T>::StartBuildingItemList()
 {
 	BEntry entry;

@@ -479,8 +490,9 @@
 }


+template<typename T>
 void
-BNavMenu::AddRootItemsIfNeeded()
+NavMenu<T>::AddRootItemsIfNeeded()
 {
 	BVolumeRoster roster;
 	roster.Rewind();
@@ -500,8 +512,9 @@
 }


+template<typename T>
 void
-BNavMenu::AddTrashItem()
+NavMenu<T>::AddTrashItem()
 {
 	BPath path;
 	if (find_directory(B_TRASH_DIRECTORY, &path) == B_OK) {
@@ -512,8 +525,9 @@
 }


+template<typename T>
 bool
-BNavMenu::AddNextItem()
+NavMenu<T>::AddNextItem()
 {
 	if ((fFlags & kVolumesOnly) != 0) {
 		BuildVolumeMenu();
@@ -567,8 +581,9 @@
 }


+template<typename T>
 void
-BNavMenu::AddOneItem(Model* model)
+NavMenu<T>::AddOneItem(Model* model)
 {
 	BMenuItem* item = NewModelItem(model, &fMessage, fMessenger, false,
 		dynamic_cast<BContainerWindow*>(fParentWindow),
@@ -579,8 +594,9 @@
 }


+template<typename T>
 ModelMenuItem*
-BNavMenu::NewModelItem(Model* model, const BMessage* invokeMessage,
+NavMenu<T>::NewModelItem(Model* model, const BMessage* invokeMessage,
 	const BMessenger& target, bool suppressFolderHierarchy,
 	BContainerWindow* parentWindow, const BObjectList<BString>* typeslist,
 	TrackingHookData* hook)
@@ -668,8 +684,9 @@
 }


+template<typename T>
 void
-BNavMenu::BuildVolumeMenu()
+NavMenu<T>::BuildVolumeMenu()
 {
 	BVolumeRoster roster;
 	BVolume volume;
@@ -710,8 +727,9 @@
 }


+template<typename T>
 int
-BNavMenu::CompareFolderNamesFirstOne(const BMenuItem* i1, const BMenuItem* i2)
+NavMenu<T>::CompareFolderNamesFirstOne(const BMenuItem* i1, const BMenuItem* i2)
 {
 	ThrowOnAssert(i1 != NULL && i2 != NULL);

@@ -727,8 +745,9 @@
 }


+template<typename T>
 int
-BNavMenu::CompareOne(const BMenuItem* i1, const BMenuItem* i2)
+NavMenu<T>::CompareOne(const BMenuItem* i1, const BMenuItem* i2)
 {
 	ThrowOnAssert(i1 != NULL && i2 != NULL);

@@ -736,8 +755,9 @@
 }


+template<typename T>
 void
-BNavMenu::DoneBuildingItemList()
+NavMenu<T>::DoneBuildingItemList()
 {
 	// add sorted items to menu
 	if (TrackerSettings().SortFolderNamesFirst())
@@ -762,29 +782,31 @@

 	int32 count = fItemList->CountItems();
 	for (int32 index = 0; index < count; index++)
-		AddItem(fItemList->ItemAt(index));
+		_inherited::AddItem(fItemList->ItemAt(index));

 	fItemList->MakeEmpty();

 	if (count == 0) {
 		BMenuItem* item = new BMenuItem(B_TRANSLATE("Empty folder"), 0);
 		item->SetEnabled(false);
-		AddItem(item);
+		_inherited::AddItem(item);
 	}

-	SetTargetForItems(fMessenger);
+	_inherited::SetTargetForItems(fMessenger);
 }


+template<typename T>
 int32
-BNavMenu::GetMaxMenuWidth(void)
+NavMenu<T>::GetMaxMenuWidth(void)
 {
 	return std::max((int32)(BScreen().Frame().Width() / 4), kMinMenuWidth);
 }


+template<typename T>
 void
-BNavMenu::AddNavDir(const Model* model, uint32 what, BHandler* target,
+NavMenu<T>::AddNavDir(const Model* model, uint32 what, BHandler* target,
 	bool populateSubmenu)
 {
 	BMessage* message = new BMessage((uint32)what);
@@ -801,12 +823,13 @@
 	} else
 		item = new ModelMenuItem(model, model->Name(), message);

-	AddItem(item);
+	_inherited::AddItem(item);
 }


+template<typename T>
 void
-BNavMenu::AddNavParentDir(const char* name,const Model* model,
+NavMenu<T>::AddNavParentDir(const char* name,const Model* model,
 	uint32 what, BHandler* target)
 {
 	BNavMenu* menu = new BNavMenu(name, what, target);
@@ -820,26 +843,29 @@
 	message->AddRef("refs", model->EntryRef());
 	item->SetMessage(message);

-	AddItem(item);
+	_inherited::AddItem(item);
 }


+template<typename T>
 void
-BNavMenu::AddNavParentDir(const Model* model, uint32 what, BHandler* target)
+NavMenu<T>::AddNavParentDir(const Model* model, uint32 what, BHandler* target)
 {
 	AddNavParentDir(B_TRANSLATE("parent folder"),model, what, target);
 }


+template<typename T>
 void
-BNavMenu::SetShowParent(bool show)
+NavMenu<T>::SetShowParent(bool show)
 {
 	fFlags = uint8((fFlags & ~kShowParent) | (show ? kShowParent : 0));
 }


+template<typename T>
 void
-BNavMenu::SetTypesList(const BObjectList<BString>* list)
+NavMenu<T>::SetTypesList(const BObjectList<BString>* list)
 {
 	if (list != NULL)
 		*fTypesList = *list;
@@ -848,29 +874,33 @@
 }


+template<typename T>
 const BObjectList<BString>*
-BNavMenu::TypesList() const
+NavMenu<T>::TypesList() const
 {
 	return fTypesList;
 }


+template<typename T>
 void
-BNavMenu::SetTarget(const BMessenger& messenger)
+NavMenu<T>::SetTarget(const BMessenger& messenger)
 {
 	fMessenger = messenger;
 }


+template<typename T>
 BMessenger
-BNavMenu::Target()
+NavMenu<T>::Target()
 {
 	return fMessenger;
 }


+template<typename T>
 TrackingHookData*
-BNavMenu::InitTrackingHook(bool (*hook)(BMenu*, void*),
+NavMenu<T>::InitTrackingHook(bool (*hook)(BMenu*, void*),
 	const BMessenger* target, const BMessage* dragMessage)
 {
 	fTrackingHook.fTrackingHook = hook;
@@ -884,8 +914,9 @@
 }


+template<typename T>
 void
-BNavMenu::SetTrackingHookDeep(BMenu* menu, bool (*func)(BMenu*, void*),
+NavMenu<T>::SetTrackingHookDeep(BMenu* menu, bool (*func)(BMenu*, void*),
 	void* state)
 {
 	menu->SetTrackingHook(func, state);
@@ -900,3 +931,12 @@
 			SetTrackingHookDeep(submenu, func, state);
 	}
 }
+
+
+//	#pragma mark - template instantiation
+
+
+namespace BPrivate {
+template class NavMenu<BMenu>;
+template class NavMenu<BPopUpMenu>;
+}
diff --git a/src/kits/tracker/OpenWithWindow.h b/src/kits/tracker/OpenWithWindow.h
index 37840cc..ef42f7b 100644
--- a/src/kits/tracker/OpenWithWindow.h
+++ b/src/kits/tracker/OpenWithWindow.h
@@ -296,7 +296,7 @@
 };


-class OpenWithMenu: public BSlowMenu {
+class OpenWithMenu : public BSlowMenu<BMenu> {
 public:
 	OpenWithMenu(const char* label, const BMessage* entriesToOpen,
 		BWindow* parentWindow, BHandler* target);
@@ -327,7 +327,7 @@
 	bool fHaveCommonPreferredApp;
 	BWindow* fParentWindow;

-	typedef BSlowMenu _inherited;
+	typedef BSlowMenu<BMenu> _inherited;
 };


diff --git a/src/kits/tracker/RecentItems.cpp b/src/kits/tracker/RecentItems.cpp
index 18c18b1..5c05a3e 100644
--- a/src/kits/tracker/RecentItems.cpp
+++ b/src/kits/tracker/RecentItems.cpp
@@ -47,7 +47,7 @@
 #include "Utilities.h"


-class RecentItemsMenu : public BSlowMenu {
+class RecentItemsMenu : public BSlowMenu<BMenu> {
 public:
 	RecentItemsMenu(const char* title, BMessage* openMessage,
 		BHandler* itemTarget, int32 maxItems);
diff --git a/src/kits/tracker/SlowContextPopup.cpp \
b/src/kits/tracker/SlowContextPopup.cpp index bd73972..7d72900 100644
--- a/src/kits/tracker/SlowContextPopup.cpp
+++ b/src/kits/tracker/SlowContextPopup.cpp
@@ -35,35 +35,7 @@
 #include <string.h>
 #include <stdlib.h>

-#include <Debug.h>
-
-#include <Application.h>
-#include <Catalog.h>
-#include <Directory.h>
-#include <Locale.h>
-#include <Path.h>
-#include <Query.h>
-#include <StopWatch.h>
-#include <VolumeRoster.h>
-#include <Volume.h>
-
-#include "Attributes.h"
-#include "Commands.h"
-#include "ContainerWindow.h"
-#include "DesktopPoseView.h"
-#include "FSUtils.h"
-#include "FunctionObject.h"
-#include "IconMenuItem.h"
-#include "PoseView.h"
-#include "QueryPoseView.h"
 #include "SlowContextPopup.h"
-#include "Thread.h"
-#include "Tracker.h"
-#include "VirtualDirectoryEntryList.h"
-
-
-#undef B_TRANSLATION_CONTEXT
-#define B_TRANSLATION_CONTEXT "SlowContextPopup"


 //	#pragma mark - BSlowContextMenu
@@ -71,21 +43,10 @@

 BSlowContextMenu::BSlowContextMenu(const char* title)
 	:
-	BPopUpMenu(title, false, false),
-	fMenuBuilt(false),
-	fMessage(B_REFS_RECEIVED),
-	fParentWindow(NULL),
-	fVolsOnly(false),
-	fItemList(NULL),
-	fContainer(NULL),
-	fIteratingDesktop(false),
-	fTypesList(NULL),
+	_inherited(title, B_REFS_RECEIVED, BMessenger(), NULL, NULL),
 	fIsShowing(false)
 {
-	InitIconPreloader();
-
 	SetFont(be_plain_font);
-	SetTriggersEnabled(false);
 }


@@ -112,12 +73,7 @@
 	// window is open...  so there
 	fIsShowing = true;

-	BPopUpMenu::AttachedToWindow();
-
-	SpringLoadedFolderSetMenuStates(this, fTypesList);
-
-	// allow an opportunity to reset the target for each of the items
-	SetTargetForItems(Target());
+	_inherited::AttachedToWindow();
 }


@@ -127,38 +83,7 @@
 	// see note above in AttachedToWindow
 	fIsShowing = false;

-	// does this need to set this to null?
-	// the parent, handling dnd should set this
-	// appropriately
-	//
-	// if this changes, BeMenu and RecentsMenu
-	// in Deskbar should also change
-	fTypesList = NULL;
-}
-
-
-void
-BSlowContextMenu::SetNavDir(const entry_ref* ref)
-{
-	ForceRebuild();
-		// reset the slow menu building mechanism so we can add more stuff
-
-	fNavDir = *ref;
-}
-
-
-void
-BSlowContextMenu::ForceRebuild()
-{
-	ClearMenuBuildingState();
-	fMenuBuilt = false;
-}
-
-
-bool
-BSlowContextMenu::NeedsToRebuild() const
-{
-	return !fMenuBuilt;
+	_inherited::DetachedFromWindow();
 }


@@ -169,394 +94,3 @@

 	fMenuBuilt = false;
 }
-
-
-void
-BSlowContextMenu::ClearMenuBuildingState()
-{
-	delete fContainer;
-	fContainer = NULL;
-
-	// item list is non-owning, need to delete the items because
-	// they didn't get added to the menu
-	if (fItemList) {
-		RemoveItems(0, fItemList->CountItems(), true);
-		delete fItemList;
-		fItemList = NULL;
-	}
-}
-
-
-const int32 kItemsToAddChunk = 20;
-const bigtime_t kMaxTimeBuildingMenu = 200000;
-
-
-bool
-BSlowContextMenu::AddDynamicItem(add_state state)
-{
-	if (fMenuBuilt)
-		return false;
-
-	if (state == B_ABORT) {
-		ClearMenuBuildingState();
-		return false;
-	}
-
-	if (state == B_INITIAL_ADD && !StartBuildingItemList()) {
-		ClearMenuBuildingState();
-		return false;
-	}
-
-	bigtime_t timeToBail = system_time() + kMaxTimeBuildingMenu;
-	for (int32 count = 0; count < kItemsToAddChunk; count++) {
-		if (!AddNextItem()) {
-			fMenuBuilt = true;
-			DoneBuildingItemList();
-			ClearMenuBuildingState();
-			return false;
-				// done with menu, don't call again
-		}
-		if (system_time() > timeToBail)
-			// we have been in here long enough, come back later
-			break;
-	}
-
-	return true;
-		// call me again, got more to show
-}
-
-
-bool
-BSlowContextMenu::StartBuildingItemList()
-{
-	// return false when done building
-	BEntry entry;
-
-	if (fNavDir.device < 0 || entry.SetTo(&fNavDir) != B_OK
-		|| !entry.Exists()) {
-		return false;
-	}
-
-	fItemList = new BObjectList<BMenuItem>(50);
-
-	fIteratingDesktop = false;
-
-	BDirectory parent;
-	status_t err = entry.GetParent(&parent);
-
-	// if ref is the root item then build list of volume root dirs
-	fVolsOnly = (err == B_ENTRY_NOT_FOUND);
-
-	if (fVolsOnly)
-		return true;
-
-	Model startModel(&entry, true);
-	if (startModel.InitCheck() != B_OK || !startModel.IsContainer())
-		return false;
-
-	if (startModel.IsQuery()) {
-		fContainer = new QueryEntryListCollection(&startModel);
-	} else if (startModel.IsVirtualDirectory()) {
-		fContainer = new VirtualDirectoryEntryList(&startModel);
-	} else if (startModel.IsDesktop()) {
-		fIteratingDesktop = true;
-		fContainer = DesktopPoseView::InitDesktopDirentIterator(0,
-			startModel.EntryRef());
-		AddRootItemsIfNeeded();
-		AddTrashItem();
-	} else {
-		BDirectory* directory = dynamic_cast<BDirectory*>(
-			startModel.Node());
-
-		ASSERT(directory != NULL);
-
-		if (directory != NULL)
-			fContainer = new DirectoryEntryList(*directory);
-	}
-
-	if (fContainer->InitCheck() != B_OK)
-		return false;
-
-	fContainer->Rewind();
-
-	return true;
-}
-
-
-void
-BSlowContextMenu::AddRootItemsIfNeeded()
-{
-	BVolumeRoster roster;
-	roster.Rewind();
-	BVolume volume;
-	while (roster.GetNextVolume(&volume) == B_OK) {
-		BDirectory root;
-		BEntry entry;
-		if (!volume.IsPersistent()
-			|| volume.GetRootDirectory(&root) != B_OK
-			|| root.GetEntry(&entry) != B_OK) {
-			continue;
-		}
-
-		Model model(&entry);
-		AddOneItem(&model);
-	}
-}
-
-
-void
-BSlowContextMenu::AddTrashItem()
-{
-	BPath path;
-	if (find_directory(B_TRASH_DIRECTORY, &path) == B_OK) {
-		BEntry entry(path.Path());
-		Model model(&entry);
-		AddOneItem(&model);
-	}
-}
-
-
-bool
-BSlowContextMenu::AddNextItem()
-{
-	if (fVolsOnly) {
-		BuildVolumeMenu();
-		return false;
-	}
-
-	// limit nav menus to 500 items only
-	if (fItemList->CountItems() > 500)
-		return false;
-
-	BEntry entry;
-	if (fContainer->GetNextEntry(&entry) != B_OK)
-		// we're finished
-		return false;
-
-	Model model(&entry, true);
-	if (model.InitCheck() != B_OK) {
-//		PRINT(("not showing hidden item %s, wouldn't open\n", model->Name()));
-		return true;
-	}
-
-	PoseInfo poseInfo;
-
-	if (model.Node())  {
-		model.Node()->ReadAttr(kAttrPoseInfo, B_RAW_TYPE, 0,
-			&poseInfo, sizeof(poseInfo));
-	}
-
-	model.CloseNode();
-
-	if (!BPoseView::PoseVisible(&model, &poseInfo)) {
-		return true;
-	}
-
-	AddOneItem(&model);
-	return true;
-}
-
-
-void
-BSlowContextMenu::AddOneItem(Model* model)
-{
-	BMenuItem* item = NewModelItem(model, &fMessage, fMessenger, false,
-		dynamic_cast<BContainerWindow*>(fParentWindow), fTypesList,
-		&fTrackingHook);
-	if (item != NULL)
-		fItemList->AddItem(item);
-}
-
-
-ModelMenuItem*
-BSlowContextMenu::NewModelItem(Model* model, const BMessage* invokeMessage,
-	const BMessenger &target, bool suppressFolderHierarchy,
-	BContainerWindow* parentWindow, const BObjectList<BString>* typeslist,
-	TrackingHookData* hook)
-{
-	if (model->InitCheck() != B_OK)
-		return NULL;
-
-	entry_ref ref;
-	bool container = false;
-	if (model->IsSymLink()) {
-
-		Model* newResolvedModel = NULL;
-		Model* result = model->LinkTo();
-
-		if (!result) {
-			newResolvedModel = new Model(model->EntryRef(), true, true);
-
-			if (newResolvedModel->InitCheck() != B_OK) {
-				// broken link, still can show though, bail
-				delete newResolvedModel;
-				newResolvedModel = NULL;
-			}
-
-			result = newResolvedModel;
-		}
-
-		if (result) {
-			BModelOpener opener(result);
-				// open the model, if it ain't open already
-
-			PoseInfo poseInfo;
-
-			if (result->Node()) {
-				result->Node()->ReadAttr(kAttrPoseInfo, B_RAW_TYPE, 0,
-					&poseInfo, sizeof(poseInfo));
-			}
-
-			result->CloseNode();
-
-			ref = *result->EntryRef();
-			container = result->IsContainer();
-		}
-		model->SetLinkTo(result);
-	} else {
-		ref = *model->EntryRef();
-		container = model->IsContainer();
-	}
-
-	BMessage* message = new BMessage(*invokeMessage);
-	message->AddRef("refs", model->EntryRef());
-
-	// Truncate the name if necessary
-	BString truncatedString(model->Name());
-	be_plain_font->TruncateString(&truncatedString, B_TRUNCATE_END,
-		BNavMenu::GetMaxMenuWidth());
-
-	ModelMenuItem* item = NULL;
-	if (!container || suppressFolderHierarchy) {
-		item = new ModelMenuItem(model, truncatedString.String(), message);
-		if (invokeMessage->what != B_REFS_RECEIVED)
-			item->SetEnabled(false);
-	} else {
-		BNavMenu* menu = new BNavMenu(truncatedString.String(),
-			invokeMessage->what, target, parentWindow, typeslist);
-
-		menu->SetNavDir(&ref);
-		if (hook)
-			menu->InitTrackingHook(hook->fTrackingHook, &(hook->fTarget),
-				hook->fDragMessage);
-
-		item = new ModelMenuItem(model, menu);
-		item->SetMessage(message);
-	}
-
-	return item;
-}
-
-
-void
-BSlowContextMenu::BuildVolumeMenu()
-{
-	BVolumeRoster roster;
-	BVolume	volume;
-
-	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);
-			if (model->InitCheck() != B_OK) {
-				delete model;
-				continue;
-			}
-
-			BNavMenu* menu = new BNavMenu(model->Name(), fMessage.what,
-				fMessenger, fParentWindow, fTypesList);
-
-			menu->SetNavDir(model->EntryRef());
-			menu->InitTrackingHook(fTrackingHook.fTrackingHook,
-				&(fTrackingHook.fTarget), fTrackingHook.fDragMessage);
-
-			ASSERT(menu->Name());
-
-			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());
-		}
-	}
-}
-
-
-void
-BSlowContextMenu::DoneBuildingItemList()
-{
-	// add sorted items to menu
-	if (TrackerSettings().SortFolderNamesFirst())
-		fItemList->SortItems(&BNavMenu::CompareFolderNamesFirstOne);
-	else
-		fItemList->SortItems(&BNavMenu::CompareOne);
-
-	int32 count = fItemList->CountItems();
-	for (int32 index = 0; index < count; index++)
-		AddItem(fItemList->ItemAt(index));
-
-	fItemList->MakeEmpty();
-
-	if (!count) {
-		BMenuItem* item = new BMenuItem(B_TRANSLATE("Empty folder"), 0);
-		item->SetEnabled(false);
-		AddItem(item);
-	}
-
-	SetTargetForItems(fMessenger);
-}
-
-
-void
-BSlowContextMenu::SetTypesList(const BObjectList<BString>* list)
-{
-	fTypesList = list;
-}
-
-
-void
-BSlowContextMenu::SetTarget(const BMessenger &target)
-{
-	fMessenger = target;
-}
-
-
-TrackingHookData*
-BSlowContextMenu::InitTrackingHook(bool (*hook)(BMenu*, void*),
-	const BMessenger* target, const BMessage* dragMessage)
-{
-	fTrackingHook.fTrackingHook = hook;
-	if (target)
-		fTrackingHook.fTarget = *target;
-	fTrackingHook.fDragMessage = dragMessage;
-	SetTrackingHookDeep(this, hook, &fTrackingHook);
-	return &fTrackingHook;
-}
-
-
-void
-BSlowContextMenu::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);
-		if (!item)
-			continue;
-
-		BMenu* submenu = item->Submenu();
-		if (submenu)
-			SetTrackingHookDeep(submenu, func, state);
-	}
-}
diff --git a/src/kits/tracker/SlowContextPopup.h \
b/src/kits/tracker/SlowContextPopup.h index fe63e54..15a0ab5 100644
--- a/src/kits/tracker/SlowContextPopup.h
+++ b/src/kits/tracker/SlowContextPopup.h
@@ -36,104 +36,34 @@


 #include <PopUpMenu.h>
+
 #include "NavMenu.h"


 namespace BPrivate {

-class BSlowContextMenu : public BPopUpMenu {
+class BSlowContextMenu : public NavMenu<BPopUpMenu> {
 public:
 				BSlowContextMenu(const char* title);
 	virtual		~BSlowContextMenu();

+	void ClearMenu();
+
 	virtual	void AttachedToWindow();
 	virtual	void DetachedFromWindow();

-	void SetNavDir(const entry_ref*);
-
-	void ClearMenu();
-
-	void ForceRebuild();
-	bool NeedsToRebuild() const;
-		// will cause menu to get rebuilt next time it is shown
-
-	void SetTarget(const BMessenger &);
-	const BMessenger Target() const;
-
-	void SetTypesList(const BObjectList<BString>* list);
-	const BObjectList<BString>* TypesList() const;
-
-	static ModelMenuItem* NewModelItem(Model*, const BMessage*,
-		const BMessenger&, bool suppressFolderHierarchy = false,
-		BContainerWindow* = NULL,
-		const BObjectList<BString>* typeslist = NULL,
-		TrackingHookData* hook = NULL);
-
-	TrackingHookData* InitTrackingHook(bool (*)(BMenu*, void*),
-		const BMessenger* target, const BMessage* dragMessage);
-
-	const bool IsShowing() const;
-
-protected:
-	virtual bool AddDynamicItem(add_state state);
-	virtual bool StartBuildingItemList();
-	virtual bool AddNextItem();
-	virtual void DoneBuildingItemList();
-	virtual void ClearMenuBuildingState();
-
-	void BuildVolumeMenu();
-
-	void AddOneItem(Model*);
-	void AddRootItemsIfNeeded();
-	void AddTrashItem();
-	static void SetTrackingHookDeep(BMenu*, bool (*)(BMenu*, void*), void*);
-
-	bool fMenuBuilt;
+			bool IsShowing() const { return fIsShowing; }

 private:
-	entry_ref fNavDir;
-	BMessage fMessage;
-	BMessenger fMessenger;
-	BWindow* fParentWindow;
-
-	// menu building state
-	bool fVolsOnly;
-	BObjectList<BMenuItem>* fItemList;
-	EntryListBase* fContainer;
-	bool fIteratingDesktop;
-
-	const BObjectList<BString>* fTypesList;
-
-	TrackingHookData fTrackingHook;
 	bool fIsShowing;
 		// see note in AttachedToWindow
-};

+private:
+	typedef NavMenu<BPopUpMenu> _inherited;
+};

 } // namespace BPrivate

 using namespace BPrivate;

-
-inline const BObjectList<BString>*
-BSlowContextMenu::TypesList() const
-{
-	return fTypesList;
-}
-
-
-inline const BMessenger
-BSlowContextMenu::Target() const
-{
-	return fMessenger;
-}
-
-
-inline const bool
-BSlowContextMenu::IsShowing() const
-{
-	return fIsShowing;
-}
-
-
 #endif	// _SLOW_CONTEXT_POPUP_H
diff --git a/src/kits/tracker/SlowMenu.cpp b/src/kits/tracker/SlowMenu.cpp
index cf6f37d..908d868 100644
--- a/src/kits/tracker/SlowMenu.cpp
+++ b/src/kits/tracker/SlowMenu.cpp
@@ -35,6 +35,8 @@

 #include "SlowMenu.h"

+#include <PopUpMenu.h>
+

 const int32 kItemsToAddChunk = 20;
 const bigtime_t kMaxTimeBuildingMenu = 200000;
@@ -43,26 +45,28 @@
 //	#pragma mark - BSlowMenu

 
-BSlowMenu::BSlowMenu(const char* title, menu_layout layout)
+template<typename BaseMenu>
+BSlowMenu<BaseMenu>::BSlowMenu(const char* title, menu_layout layout)
 	:
-	BMenu(title, layout),
+	BaseMenu(title, layout),
 	fMenuBuilt(false)
 {
 }


+template<typename BaseMenu>
 bool
-BSlowMenu::AddDynamicItem(add_state state)
+BSlowMenu<BaseMenu>::AddDynamicItem(BMenu::add_state state)
 {
 	if (fMenuBuilt)
 		return false;

-	if (state == B_ABORT) {
+	if (state == BMenu::B_ABORT) {
 		ClearMenuBuildingState();
 		return false;
 	}

-	if (state == B_INITIAL_ADD && !StartBuildingItemList()) {
+	if (state == BMenu::B_INITIAL_ADD && !StartBuildingItemList()) {
 		ClearMenuBuildingState();
 		return false;
 	}
@@ -88,33 +92,18 @@
 }


+template<typename BaseMenu>
 bool
-BSlowMenu::StartBuildingItemList()
+BSlowMenu<BaseMenu>::StartBuildingItemList()
 {
 	return true;
 }


-bool
-BSlowMenu::AddNextItem()
-{
-	TRESPASS();
-		// pure virtual, shouldn't be here
-	return true;
-}
+//	#pragma mark - template instantiation

 
-void
-BSlowMenu::DoneBuildingItemList()
-{
-	TRESPASS();
-		// pure virtual, shouldn't be here
-}
-
-
-void
-BSlowMenu::ClearMenuBuildingState()
-{
-	TRESPASS();
-		// pure virtual, shouldn't be here
+namespace BPrivate {
+template class BSlowMenu<BMenu>;
+template class BSlowMenu<BPopUpMenu>;
 }
diff --git a/src/kits/tracker/SlowMenu.h b/src/kits/tracker/SlowMenu.h
index f793ebf8..2c4e338 100644
--- a/src/kits/tracker/SlowMenu.h
+++ b/src/kits/tracker/SlowMenu.h
@@ -48,7 +48,8 @@

 namespace BPrivate {
 
-class BSlowMenu : public BMenu {
+template<typename BaseMenu>
+class BSlowMenu : public BaseMenu {
 public:
 	BSlowMenu(const char* title, menu_layout layout = B_ITEMS_IN_COLUMN);

@@ -65,7 +66,7 @@
 	virtual void ClearMenuBuildingState() = 0;

 protected:
-	virtual bool AddDynamicItem(add_state state);
+	virtual bool AddDynamicItem(BMenu::add_state state);
 		// this is the callback from BMenu, you shouldn't need to
 		// override this
 

--
To view, visit https://review.haiku-os.org/c/haiku/+/6873?usp=email
To unsubscribe, or for help writing mail filters, visit \
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: Ic1f49c5bed60fff7a3076a22f74aebc6eba51d57
Gerrit-Change-Number: 6873
Gerrit-PatchSet: 1
Gerrit-Owner: waddlesplash <waddlesplash@gmail.com>
Gerrit-MessageType: newchange


[Attachment #3 (text/html)]

<p>waddlesplash has uploaded this change for <strong>review</strong>.</p><p><a \
href="https://review.haiku-os.org/c/haiku/+/6873?usp=email">View Change</a></p><pre \
style="font-family: monospace,monospace; white-space: pre-wrap;">Tracker: Refactor \
SlowContextPopup to use NavMenu, using templates.<br><br>These classes have been \
mirrors of each other going all the way back<br>to OpenTracker&#39;s initial commit, \
at least.<br><br>Eventually it should be possible to merge the remaining bits \
of<br>SlowContextPopup and delete the class entirely.<br>---<br>M \
headers/private/tracker/NavMenu.h<br>M src/kits/tracker/FavoritesMenu.h<br>M \
src/kits/tracker/NavMenu.cpp<br>M src/kits/tracker/OpenWithWindow.h<br>M \
src/kits/tracker/RecentItems.cpp<br>M src/kits/tracker/SlowContextPopup.cpp<br>M \
src/kits/tracker/SlowContextPopup.h<br>M src/kits/tracker/SlowMenu.cpp<br>M \
src/kits/tracker/SlowMenu.h<br>9 files changed, 143 insertions(+), 628 \
deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: \
pre-wrap;">git pull ssh://git.haiku-os.org:22/haiku refs/changes/73/6873/1</pre><pre \
style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git \
a/headers/private/tracker/NavMenu.h \
b/headers/private/tracker/NavMenu.h</span><br><span>index e1c45d1..03982f5 \
100644</span><br><span>--- a/headers/private/tracker/NavMenu.h</span><br><span>+++ \
b/headers/private/tracker/NavMenu.h</span><br><span>@@ -72,16 +72,17 \
@@</span><br><span> };</span><br><span> </span><br><span> </span><br><span \
style="color: hsl(0, 100%, 40%);">-class BNavMenu : public BSlowMenu \
{</span><br><span style="color: hsl(120, 100%, 40%);">+template&lt;typename \
T&gt;</span><br><span style="color: hsl(120, 100%, 40%);">+class NavMenu : public \
BSlowMenu&lt;T&gt; {</span><br><span> public:</span><br><span style="color: hsl(0, \
100%, 40%);">-	BNavMenu(const char* title, uint32 message, const \
BHandler*,</span><br><span style="color: hsl(120, 100%, 40%);">+	NavMenu(const char* \
title, uint32 message, const BHandler*,</span><br><span> 		BWindow* parentWindow = \
NULL, const BObjectList&lt;BString&gt;* list = NULL);</span><br><span style="color: \
hsl(0, 100%, 40%);">-	BNavMenu(const char* title, uint32 message, const \
BMessenger&amp;,</span><br><span style="color: hsl(120, 100%, 40%);">+	NavMenu(const \
char* title, uint32 message, const BMessenger&amp;,</span><br><span> 		BWindow* \
parentWindow = NULL, const BObjectList&lt;BString&gt;* list = NULL);</span><br><span> \
// parentWindow, if specified, will be closed if nav menu item \
invoked</span><br><span> 		// with option held down</span><br><span> </span><br><span \
style="color: hsl(0, 100%, 40%);">-	virtual ~BNavMenu();</span><br><span \
style="color: hsl(120, 100%, 40%);">+	virtual ~NavMenu();</span><br><span> \
</span><br><span> 	virtual void AttachedToWindow();</span><br><span> 	virtual void \
DetachedFromWindow();</span><br><span>@@ -146,8 +147,14 @@</span><br><span> \
BObjectList&lt;BString&gt;* fTypesList;</span><br><span> </span><br><span> \
TrackingHookData fTrackingHook;</span><br><span style="color: hsl(120, 100%, \
40%);">+</span><br><span style="color: hsl(120, 100%, \
40%);">+private:</span><br><span style="color: hsl(120, 100%, 40%);">+	typedef \
BSlowMenu&lt;T&gt; _inherited;</span><br><span> };</span><br><span> </span><br><span \
style="color: hsl(120, 100%, 40%);">+typedef NavMenu&lt;BMenu&gt; \
BNavMenu;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span \
style="color: hsl(120, 100%, 40%);">+</span><br><span> //	Spring Loaded Folder \
convenience routines</span><br><span> //		used in both Tracker and \
Deskbar</span><br><span> #ifndef _IMPEXP_TRACKER</span><br><span>@@ -164,6 +171,7 \
@@</span><br><span> </span><br><span> } // namespace BPrivate</span><br><span> \
</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> using \
namespace BPrivate;</span><br><span> </span><br><span> </span><br><span>diff --git \
a/src/kits/tracker/FavoritesMenu.h \
b/src/kits/tracker/FavoritesMenu.h</span><br><span>index ec365c7..6111b66 \
100644</span><br><span>--- a/src/kits/tracker/FavoritesMenu.h</span><br><span>+++ \
b/src/kits/tracker/FavoritesMenu.h</span><br><span>@@ -51,7 +51,7 @@</span><br><span> \
#define kGoDirectory &quot;Tracker/Go&quot;</span><br><span> </span><br><span> \
</span><br><span style="color: hsl(0, 100%, 40%);">-class FavoritesMenu : public \
BSlowMenu {</span><br><span style="color: hsl(120, 100%, 40%);">+class FavoritesMenu \
: public BSlowMenu&lt;BMenu&gt; {</span><br><span> 	// FavoritesMenu is used in the \
FilePanel -</span><br><span> 	// displays recent files, recent folders and favorites \
items</span><br><span> 	public:</span><br><span>diff --git \
a/src/kits/tracker/NavMenu.cpp b/src/kits/tracker/NavMenu.cpp</span><br><span>index \
959125b..bee8309 100644</span><br><span>--- \
a/src/kits/tracker/NavMenu.cpp</span><br><span>+++ \
b/src/kits/tracker/NavMenu.cpp</span><br><span>@@ -261,10 +261,11 @@</span><br><span> \
#define B_TRANSLATION_CONTEXT &quot;NavMenu&quot;</span><br><span> </span><br><span> \
</span><br><span style="color: hsl(0, 100%, 40%);">-BNavMenu::BNavMenu(const char* \
title, uint32 message, const BHandler* target,</span><br><span style="color: hsl(120, \
100%, 40%);">+template&lt;typename T&gt;</span><br><span style="color: hsl(120, 100%, \
40%);">+NavMenu&lt;T&gt;::NavMenu(const char* title, uint32 message, const BHandler* \
target,</span><br><span> 	BWindow* parentWindow, const BObjectList&lt;BString&gt;* \
list)</span><br><span> 	:</span><br><span style="color: hsl(0, 100%, \
40%);">-	BSlowMenu(title),</span><br><span style="color: hsl(120, 100%, \
40%);">+	BSlowMenu&lt;T&gt;(title),</span><br><span> \
fMessage(message),</span><br><span> 	fMessenger(target, \
target-&gt;Looper()),</span><br><span> \
fParentWindow(parentWindow),</span><br><span>@@ -289,15 +290,16 @@</span><br><span> \
}</span><br><span> </span><br><span> 	// too long to have triggers</span><br><span \
style="color: hsl(0, 100%, 40%);">-	SetTriggersEnabled(false);</span><br><span \
style="color: hsl(120, 100%, \
40%);">+	_inherited::SetTriggersEnabled(false);</span><br><span> }</span><br><span> \
</span><br><span> </span><br><span style="color: hsl(0, 100%, \
40%);">-BNavMenu::BNavMenu(const char* title, uint32 message,</span><br><span \
style="color: hsl(120, 100%, 40%);">+template&lt;typename T&gt;</span><br><span \
style="color: hsl(120, 100%, 40%);">+NavMenu&lt;T&gt;::NavMenu(const char* title, \
uint32 message,</span><br><span> 	const BMessenger&amp; messenger, BWindow* \
parentWindow,</span><br><span> 	const BObjectList&lt;BString&gt;* \
list)</span><br><span> 	:</span><br><span style="color: hsl(0, 100%, \
40%);">-	BSlowMenu(title),</span><br><span style="color: hsl(120, 100%, \
40%);">+	BSlowMenu&lt;T&gt;(title),</span><br><span> \
fMessage(message),</span><br><span> 	fMessenger(messenger),</span><br><span> \
fParentWindow(parentWindow),</span><br><span>@@ -322,20 +324,22 @@</span><br><span> \
}</span><br><span> </span><br><span> 	// too long to have triggers</span><br><span \
style="color: hsl(0, 100%, 40%);">-	SetTriggersEnabled(false);</span><br><span \
style="color: hsl(120, 100%, \
40%);">+	_inherited::SetTriggersEnabled(false);</span><br><span> }</span><br><span> \
</span><br><span> </span><br><span style="color: hsl(0, 100%, \
40%);">-BNavMenu::~BNavMenu()</span><br><span style="color: hsl(120, 100%, \
40%);">+template&lt;typename T&gt;</span><br><span style="color: hsl(120, 100%, \
40%);">+NavMenu&lt;T&gt;::~NavMenu()</span><br><span> {</span><br><span> 	delete \
fTypesList;</span><br><span> }</span><br><span> </span><br><span> </span><br><span \
style="color: hsl(120, 100%, 40%);">+template&lt;typename T&gt;</span><br><span> \
void</span><br><span style="color: hsl(0, 100%, \
40%);">-BNavMenu::AttachedToWindow()</span><br><span style="color: hsl(120, 100%, \
40%);">+NavMenu&lt;T&gt;::AttachedToWindow()</span><br><span> {</span><br><span \
style="color: hsl(0, 100%, 40%);">-	BSlowMenu::AttachedToWindow();</span><br><span \
style="color: hsl(120, 100%, \
40%);">+	_inherited::AttachedToWindow();</span><br><span> </span><br><span> \
SpringLoadedFolderSetMenuStates(this, fTypesList);</span><br><span> 		// If dragging, \
(fTypesList != NULL) set the menu items enabled state</span><br><span>@@ -345,36 \
+349,41 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span \
style="color: hsl(120, 100%, 40%);">+template&lt;typename T&gt;</span><br><span> \
void</span><br><span style="color: hsl(0, 100%, \
40%);">-BNavMenu::DetachedFromWindow()</span><br><span style="color: hsl(120, 100%, \
40%);">+NavMenu&lt;T&gt;::DetachedFromWindow()</span><br><span> {</span><br><span> \
}</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, \
40%);">+template&lt;typename T&gt;</span><br><span> void</span><br><span \
style="color: hsl(0, 100%, 40%);">-BNavMenu::ResetTargets()</span><br><span \
style="color: hsl(120, 100%, \
40%);">+NavMenu&lt;T&gt;::ResetTargets()</span><br><span> {</span><br><span \
style="color: hsl(0, 100%, 40%);">-	SetTargetForItems(Target());</span><br><span \
style="color: hsl(120, 100%, \
40%);">+	_inherited::SetTargetForItems(Target());</span><br><span> }</span><br><span> \
</span><br><span> </span><br><span style="color: hsl(120, 100%, \
40%);">+template&lt;typename T&gt;</span><br><span> void</span><br><span \
style="color: hsl(0, 100%, 40%);">-BNavMenu::ForceRebuild()</span><br><span \
style="color: hsl(120, 100%, \
40%);">+NavMenu&lt;T&gt;::ForceRebuild()</span><br><span> {</span><br><span> \
ClearMenuBuildingState();</span><br><span style="color: hsl(0, 100%, \
40%);">-	fMenuBuilt = false;</span><br><span style="color: hsl(120, 100%, \
40%);">+	_inherited::fMenuBuilt = false;</span><br><span> }</span><br><span> \
</span><br><span> </span><br><span style="color: hsl(120, 100%, \
40%);">+template&lt;typename T&gt;</span><br><span> bool</span><br><span \
style="color: hsl(0, 100%, 40%);">-BNavMenu::NeedsToRebuild() const</span><br><span \
style="color: hsl(120, 100%, 40%);">+NavMenu&lt;T&gt;::NeedsToRebuild() \
const</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-	return \
!fMenuBuilt;</span><br><span style="color: hsl(120, 100%, 40%);">+	return \
!_inherited::fMenuBuilt;</span><br><span> }</span><br><span> </span><br><span> \
</span><br><span style="color: hsl(120, 100%, 40%);">+template&lt;typename \
T&gt;</span><br><span> void</span><br><span style="color: hsl(0, 100%, \
40%);">-BNavMenu::SetNavDir(const entry_ref* ref)</span><br><span style="color: \
hsl(120, 100%, 40%);">+NavMenu&lt;T&gt;::SetNavDir(const entry_ref* \
ref)</span><br><span> {</span><br><span> 	ForceRebuild();</span><br><span> 		// reset \
the slow menu building mechanism so we can add more stuff</span><br><span>@@ -383,8 \
+392,9 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span \
style="color: hsl(120, 100%, 40%);">+template&lt;typename T&gt;</span><br><span> \
void</span><br><span style="color: hsl(0, 100%, \
40%);">-BNavMenu::ClearMenuBuildingState()</span><br><span style="color: hsl(120, \
100%, 40%);">+NavMenu&lt;T&gt;::ClearMenuBuildingState()</span><br><span> \
{</span><br><span> 	delete fContainer;</span><br><span> 	fContainer = \
NULL;</span><br><span>@@ -392,7 +402,7 @@</span><br><span> 	// item list is \
non-owning, need to delete the items because</span><br><span> 	// they didn&#39;t get \
added to the menu</span><br><span> 	if (fItemList != NULL) {</span><br><span \
style="color: hsl(0, 100%, 40%);">-		RemoveItems(0, fItemList-&gt;CountItems(), \
true);</span><br><span style="color: hsl(120, 100%, \
40%);">+		_inherited::RemoveItems(0, fItemList-&gt;CountItems(), \
true);</span><br><span> </span><br><span> 		delete fItemList;</span><br><span> \
fItemList = NULL;</span><br><span>@@ -400,8 +410,9 @@</span><br><span> \
}</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, \
40%);">+template&lt;typename T&gt;</span><br><span> bool</span><br><span \
style="color: hsl(0, 100%, 40%);">-BNavMenu::StartBuildingItemList()</span><br><span \
style="color: hsl(120, 100%, \
40%);">+NavMenu&lt;T&gt;::StartBuildingItemList()</span><br><span> {</span><br><span> \
BEntry entry;</span><br><span> </span><br><span>@@ -479,8 +490,9 @@</span><br><span> \
}</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, \
40%);">+template&lt;typename T&gt;</span><br><span> void</span><br><span \
style="color: hsl(0, 100%, 40%);">-BNavMenu::AddRootItemsIfNeeded()</span><br><span \
style="color: hsl(120, 100%, \
40%);">+NavMenu&lt;T&gt;::AddRootItemsIfNeeded()</span><br><span> {</span><br><span> \
BVolumeRoster roster;</span><br><span> 	roster.Rewind();</span><br><span>@@ -500,8 \
+512,9 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span \
style="color: hsl(120, 100%, 40%);">+template&lt;typename T&gt;</span><br><span> \
void</span><br><span style="color: hsl(0, 100%, \
40%);">-BNavMenu::AddTrashItem()</span><br><span style="color: hsl(120, 100%, \
40%);">+NavMenu&lt;T&gt;::AddTrashItem()</span><br><span> {</span><br><span> 	BPath \
path;</span><br><span> 	if (find_directory(B_TRASH_DIRECTORY, &amp;path) == B_OK) \
{</span><br><span>@@ -512,8 +525,9 @@</span><br><span> }</span><br><span> \
</span><br><span> </span><br><span style="color: hsl(120, 100%, \
40%);">+template&lt;typename T&gt;</span><br><span> bool</span><br><span \
style="color: hsl(0, 100%, 40%);">-BNavMenu::AddNextItem()</span><br><span \
style="color: hsl(120, 100%, 40%);">+NavMenu&lt;T&gt;::AddNextItem()</span><br><span> \
{</span><br><span> 	if ((fFlags &amp; kVolumesOnly) != 0) {</span><br><span> \
BuildVolumeMenu();</span><br><span>@@ -567,8 +581,9 @@</span><br><span> \
}</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, \
40%);">+template&lt;typename T&gt;</span><br><span> void</span><br><span \
style="color: hsl(0, 100%, 40%);">-BNavMenu::AddOneItem(Model* model)</span><br><span \
style="color: hsl(120, 100%, 40%);">+NavMenu&lt;T&gt;::AddOneItem(Model* \
model)</span><br><span> {</span><br><span> 	BMenuItem* item = NewModelItem(model, \
&amp;fMessage, fMessenger, false,</span><br><span> \
dynamic_cast&lt;BContainerWindow*&gt;(fParentWindow),</span><br><span>@@ -579,8 \
+594,9 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span \
style="color: hsl(120, 100%, 40%);">+template&lt;typename T&gt;</span><br><span> \
ModelMenuItem*</span><br><span style="color: hsl(0, 100%, \
40%);">-BNavMenu::NewModelItem(Model* model, const BMessage* \
invokeMessage,</span><br><span style="color: hsl(120, 100%, \
40%);">+NavMenu&lt;T&gt;::NewModelItem(Model* model, const BMessage* \
invokeMessage,</span><br><span> 	const BMessenger&amp; target, bool \
suppressFolderHierarchy,</span><br><span> 	BContainerWindow* parentWindow, const \
BObjectList&lt;BString&gt;* typeslist,</span><br><span> 	TrackingHookData* \
hook)</span><br><span>@@ -668,8 +684,9 @@</span><br><span> }</span><br><span> \
</span><br><span> </span><br><span style="color: hsl(120, 100%, \
40%);">+template&lt;typename T&gt;</span><br><span> void</span><br><span \

<div style="display:none"> Gerrit-Project: haiku </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: \
Ic1f49c5bed60fff7a3076a22f74aebc6eba51d57 </div> <div style="display:none"> \
Gerrit-Change-Number: 6873 </div> <div style="display:none"> Gerrit-PatchSet: 1 \
</div> <div style="display:none"> Gerrit-Owner: waddlesplash \
&lt;waddlesplash@gmail.com&gt; </div> <div style="display:none"> Gerrit-MessageType: \
newchange </div>



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic