* 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
This commit is contained in:
@@ -3115,13 +3115,10 @@ BContainerWindow::AddMimeTypesToMenu()
|
|||||||
*/
|
*/
|
||||||
BMenu*
|
BMenu*
|
||||||
BContainerWindow::AddMimeMenu(const BMimeType& mimeType, bool isSuperType,
|
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.
|
// Check if we already have an entry for this MIME type in the menu.
|
||||||
for (int32 i = start; i < count; i++) {
|
for (int32 i = start; BMenuItem* item = menu->ItemAt(i); i++) {
|
||||||
BMenuItem* item = menu->ItemAt(i);
|
|
||||||
if (item == NULL)
|
|
||||||
continue;
|
|
||||||
BMessage* message = item->Message();
|
BMessage* message = item->Message();
|
||||||
if (message == NULL)
|
if (message == NULL)
|
||||||
continue;
|
continue;
|
||||||
@@ -3200,7 +3197,6 @@ BContainerWindow::AddMimeMenu(const BMimeType& mimeType, bool isSuperType,
|
|||||||
message->AddString("mimetype", mimeType.Type());
|
message->AddString("mimetype", mimeType.Type());
|
||||||
menu->AddItem(new IconMenuItem(mimeMenu, message, mimeType.Type(),
|
menu->AddItem(new IconMenuItem(mimeMenu, message, mimeType.Type(),
|
||||||
B_MINI_ICON));
|
B_MINI_ICON));
|
||||||
count++;
|
|
||||||
|
|
||||||
return mimeMenu;
|
return mimeMenu;
|
||||||
}
|
}
|
||||||
@@ -3212,24 +3208,16 @@ BContainerWindow::AddMimeTypesToMenu(BMenu *menu)
|
|||||||
if (!menu)
|
if (!menu)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// find start of mime types in menu
|
// Remove old mime type menus
|
||||||
int32 count = menu->CountItems();
|
int32 start = menu->CountItems();
|
||||||
int32 start;
|
while (start > 0 && menu->ItemAt(start - 1)->Submenu() != NULL) {
|
||||||
|
delete menu->RemoveItem(start - 1);
|
||||||
for (start = 0; start < count; start++) {
|
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--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a separator item if there is none yet
|
// Add a separator item if there is none yet
|
||||||
if (dynamic_cast<BSeparatorItem *>(menu->ItemAt(removeIndex)) == NULL)
|
if (start > 0
|
||||||
|
&& dynamic_cast<BSeparatorItem *>(menu->ItemAt(start - 1)) == NULL)
|
||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
|
|
||||||
// Add MIME type in case we're a default query type window
|
// 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();
|
int32 typeCount = PoseView()->CountMimeTypes();
|
||||||
|
|
||||||
for (int32 index = 0; index < typeCount; index++) {
|
for (int32 index = 0; index < typeCount; index++) {
|
||||||
@@ -3252,23 +3242,41 @@ BContainerWindow::AddMimeTypesToMenu(BMenu *menu)
|
|||||||
BMimeType superType;
|
BMimeType superType;
|
||||||
mimeType.GetSupertype(&superType);
|
mimeType.GetSupertype(&superType);
|
||||||
|
|
||||||
BMenu* superMenu = AddMimeMenu(superType, true, menu, start, count);
|
BMenu* superMenu = AddMimeMenu(superType, true, menu, start);
|
||||||
if (superMenu != NULL) {
|
if (superMenu != NULL) {
|
||||||
// We have a supertype menu.
|
// We have a supertype menu.
|
||||||
int32 subCount = superMenu->CountItems();
|
AddMimeMenu(mimeType, false, superMenu, 0);
|
||||||
AddMimeMenu(mimeType, false, superMenu, 0, subCount);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove empty super menus
|
// remove empty super menus, promote sub-types if needed
|
||||||
|
|
||||||
for (int32 index = 0; index < typeCount; index++) {
|
for (int32 index = 0; index < typeCount; index++) {
|
||||||
BMimeType mimeType(PoseView()->MimeTypeAt(index));
|
BMimeType mimeType(PoseView()->MimeTypeAt(index));
|
||||||
BMimeType superType;
|
BMimeType superType;
|
||||||
mimeType.GetSupertype(&superType);
|
mimeType.GetSupertype(&superType);
|
||||||
|
|
||||||
BMenu* superMenu = AddMimeMenu(superType, true, menu, start, count);
|
BMenu* superMenu = AddMimeMenu(superType, true, menu, start);
|
||||||
if (superMenu != NULL && superMenu->ItemAt(0) == NULL) {
|
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());
|
menu->RemoveItem(superMenu->Superitem());
|
||||||
delete superMenu->Superitem();
|
delete superMenu->Superitem();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ class BContainerWindow : public BWindow {
|
|||||||
virtual void UpdateMenu(BMenu *menu, UpdateMenuContext context);
|
virtual void UpdateMenu(BMenu *menu, UpdateMenuContext context);
|
||||||
|
|
||||||
BMenu* AddMimeMenu(const BMimeType& mimeType, bool isSuperType,
|
BMenu* AddMimeMenu(const BMimeType& mimeType, bool isSuperType,
|
||||||
BMenu* menu, int32 start, int32& count);
|
BMenu* menu, int32 start);
|
||||||
|
|
||||||
BHandler *ResolveSpecifier(BMessage *, int32, BMessage *, int32,
|
BHandler *ResolveSpecifier(BMessage *, int32, BMessage *, int32,
|
||||||
const char *);
|
const char *);
|
||||||
|
|||||||
Reference in New Issue
Block a user