From 206c62f03624e6763acb69adaed300e6c07b8ee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 22 Aug 2008 12:01:27 +0000 Subject: [PATCH] * Got rid of the "count" parameter and maintenance altogether - makes the code much simpler. * Simplified code to compute "start", ie. the index of the first MIME type menu item. * Promote MIME types to the top-level if their super type don't add any attributes. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27143 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/tracker/ContainerWindow.cpp | 62 ++++++++++++++++------------ src/kits/tracker/ContainerWindow.h | 2 +- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/kits/tracker/ContainerWindow.cpp b/src/kits/tracker/ContainerWindow.cpp index 68092be5a6..6158918b9c 100644 --- a/src/kits/tracker/ContainerWindow.cpp +++ b/src/kits/tracker/ContainerWindow.cpp @@ -3115,13 +3115,10 @@ BContainerWindow::AddMimeTypesToMenu() */ BMenu* BContainerWindow::AddMimeMenu(const BMimeType& mimeType, bool isSuperType, - BMenu* menu, int32 start, int32& count) + BMenu* menu, int32 start) { // Check if we already have an entry for this MIME type in the menu. - for (int32 i = start; i < count; i++) { - BMenuItem* item = menu->ItemAt(i); - if (item == NULL) - continue; + for (int32 i = start; BMenuItem* item = menu->ItemAt(i); i++) { BMessage* message = item->Message(); if (message == NULL) continue; @@ -3200,7 +3197,6 @@ BContainerWindow::AddMimeMenu(const BMimeType& mimeType, bool isSuperType, message->AddString("mimetype", mimeType.Type()); menu->AddItem(new IconMenuItem(mimeMenu, message, mimeType.Type(), B_MINI_ICON)); - count++; return mimeMenu; } @@ -3212,24 +3208,16 @@ BContainerWindow::AddMimeTypesToMenu(BMenu *menu) if (!menu) return; - // find start of mime types in menu - int32 count = menu->CountItems(); - int32 start; - - for (start = 0; start < count; start++) { - if (menu->ItemAt(start)->Submenu()) - break; - } - - // Remove old mime menu: - int32 removeIndex = count - 1; - while (menu->ItemAt(removeIndex)->Submenu() != NULL) { - delete menu->RemoveItem(removeIndex); - removeIndex--; + // Remove old mime type menus + int32 start = menu->CountItems(); + while (start > 0 && menu->ItemAt(start - 1)->Submenu() != NULL) { + delete menu->RemoveItem(start - 1); + start--; } // Add a separator item if there is none yet - if (dynamic_cast(menu->ItemAt(removeIndex)) == NULL) + if (start > 0 + && dynamic_cast(menu->ItemAt(start - 1)) == NULL) menu->AddSeparatorItem(); // Add MIME type in case we're a default query type window @@ -3245,6 +3233,8 @@ BContainerWindow::AddMimeTypesToMenu(BMenu *menu) } } + // Add MIME type menus + int32 typeCount = PoseView()->CountMimeTypes(); for (int32 index = 0; index < typeCount; index++) { @@ -3252,23 +3242,41 @@ BContainerWindow::AddMimeTypesToMenu(BMenu *menu) BMimeType superType; mimeType.GetSupertype(&superType); - BMenu* superMenu = AddMimeMenu(superType, true, menu, start, count); + BMenu* superMenu = AddMimeMenu(superType, true, menu, start); if (superMenu != NULL) { // We have a supertype menu. - int32 subCount = superMenu->CountItems(); - AddMimeMenu(mimeType, false, superMenu, 0, subCount); + AddMimeMenu(mimeType, false, superMenu, 0); } } - // remove empty super menus + // remove empty super menus, promote sub-types if needed for (int32 index = 0; index < typeCount; index++) { BMimeType mimeType(PoseView()->MimeTypeAt(index)); BMimeType superType; mimeType.GetSupertype(&superType); - BMenu* superMenu = AddMimeMenu(superType, true, menu, start, count); - if (superMenu != NULL && superMenu->ItemAt(0) == NULL) { + BMenu* superMenu = AddMimeMenu(superType, true, menu, start); + if (superMenu == NULL) + continue; + + int32 itemsFound = 0; + int32 menusFound = 0; + for (int32 i = 0; BMenuItem* item = superMenu->ItemAt(i); i++) { + if (item->Submenu() != NULL) + menusFound++; + else + itemsFound++; + } + + if (itemsFound == 0) { + if (menusFound != 0) { + // promote types to the top level + while (BMenuItem* item = superMenu->RemoveItem((int32)0)) { + menu->AddItem(item); + } + } + menu->RemoveItem(superMenu->Superitem()); delete superMenu->Superitem(); } diff --git a/src/kits/tracker/ContainerWindow.h b/src/kits/tracker/ContainerWindow.h index 5272b31e56..8923085fb1 100644 --- a/src/kits/tracker/ContainerWindow.h +++ b/src/kits/tracker/ContainerWindow.h @@ -240,7 +240,7 @@ class BContainerWindow : public BWindow { virtual void UpdateMenu(BMenu *menu, UpdateMenuContext context); BMenu* AddMimeMenu(const BMimeType& mimeType, bool isSuperType, - BMenu* menu, int32 start, int32& count); + BMenu* menu, int32 start); BHandler *ResolveSpecifier(BMessage *, int32, BMessage *, int32, const char *);