- Added a new CreateMimeMenu() method that creates the menu with attributes

for a specific MIME type. 
- Attribute menus now display a hierarchy with type and supertype attributes.

This looks a bit ugly but mostly because not all types and supertypes have icons and descriptions. Anyone up to do a MIME database cleanup? :)



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27125 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Bruno G. Albuquerque
2008-08-22 03:57:57 +00:00
parent d74af3b17f
commit be8c87abf6
2 changed files with 113 additions and 75 deletions
+109 -73
View File
@@ -3110,6 +3110,92 @@ BContainerWindow::AddMimeTypesToMenu()
}
// Create a menu for a specific MIME type.
BMenu*
BContainerWindow::CreateMimeMenu(const BMimeType& mimeType, bool isSuperType,
BMenu* menu, int32 start, int32 count)
{
// Check if we already have an entry for this MIME type in the menu.
for (int32 subindex = start; subindex < count; subindex++) {
BMenuItem *item = menu->ItemAt(subindex);
if (!item)
continue;
BMessage *message = item->Message();
if (!message)
continue;
const char *str;
if (message->FindString("mimetype", &str) == B_OK
&& strcmp(mimeType.Type(), str) == 0) {
return NULL;
}
}
BMessage attrInfo;
char description[B_MIME_TYPE_LENGTH];
const char *nameToAdd = mimeType.Type();
if (!mimeType.IsInstalled())
return NULL;
// only add things to menu which have "user-visible" data
if (mimeType.GetAttrInfo(&attrInfo) != B_OK)
return NULL;
if (mimeType.GetShortDescription(description) == B_OK
&& description[0])
nameToAdd = description;
// go through each field in meta mime and add it to a menu
BMenu *localMenu = NULL;
int32 index = -1;
const char *str;
if (isSuperType) {
// If it is a supertype, we create the menu anyway as it may have
// submenus later on.
localMenu = new BMenu(nameToAdd);
BFont font;
menu->GetFont(&font);
localMenu->SetFont(&font);
}
while (attrInfo.FindString("attr:public_name", ++index, &str) == B_OK) {
if (!attrInfo.FindBool("attr:viewable", index)) {
// don't add if attribute not viewable
continue;
}
int32 type;
int32 align;
int32 width;
bool editable;
const char *attrName;
if (attrInfo.FindString("attr:name", index, &attrName) != B_OK
|| attrInfo.FindInt32("attr:type", index, &type) != B_OK
|| attrInfo.FindBool("attr:editable", index, &editable) != B_OK
|| attrInfo.FindInt32("attr:width", index, &width) != B_OK
|| attrInfo.FindInt32("attr:alignment", index, &align) != B_OK)
continue;
BString displayAs;
attrInfo.FindString("attr:display_as", index, &displayAs);
if (!localMenu) {
// do a lazy allocation of the menu
localMenu = new BMenu(nameToAdd);
BFont font;
menu->GetFont(&font);
localMenu->SetFont(&font);
}
localMenu->AddItem(NewAttributeMenuItem(str, attrName, type,
displayAs.String(), width, align, editable, false));
}
return localMenu;
}
void
BContainerWindow::AddMimeTypesToMenu(BMenu *menu)
{
@@ -3152,83 +3238,33 @@ BContainerWindow::AddMimeTypesToMenu(BMenu *menu)
int32 typeCount = PoseView()->CountMimeTypes();
for (int32 index = 0; index < typeCount; index++) {
bool shouldAdd = true;
const char *signature = PoseView()->MimeTypeAt(index);
BMimeType mimeType(PoseView()->MimeTypeAt(index));
BMimeType superType;
mimeType.GetSupertype(&superType);
for (int32 subindex = start; subindex < count; subindex++) {
BMenuItem *item = menu->ItemAt(subindex);
if (!item)
continue;
BMessage *message = item->Message();
if (!message)
continue;
const char *str;
if (message->FindString("mimetype", &str) == B_OK
&& strcmp(signature, str) == 0) {
shouldAdd = false;
break;
}
}
BMenu* levelOneMenu = CreateMimeMenu(superType, true, menu, start, count);
if (levelOneMenu) {
// We have a supertype menu.
BMenu* levelTwoMenu = CreateMimeMenu(mimeType, false, levelOneMenu, start,
count);
if (levelTwoMenu) {
// And also a one for the main MIME type. Adde them to the menu
// hierarchy.
BMessage *message1 = new BMessage(kMIMETypeItem);
message1->AddString("mimetype", mimeType.Type());
levelOneMenu->AddItem(new IconMenuItem(levelTwoMenu, message1,
mimeType.Type(), B_MINI_ICON));
if (shouldAdd) {
BMessage attrInfo;
char description[B_MIME_TYPE_LENGTH];
const char *nameToAdd = signature;
BMessage *message2 = new BMessage(kMIMETypeItem);
message2->AddString("mimetype", superType.Type());
menu->AddItem(new IconMenuItem(levelOneMenu, message2,
superType.Type(), B_MINI_ICON));
BMimeType mimetype(signature);
if (!mimetype.IsInstalled())
continue;
// only add things to menu which have "user-visible" data
if (mimetype.GetAttrInfo(&attrInfo) != B_OK)
continue;
if (mimetype.GetShortDescription(description) == B_OK
&& description[0])
nameToAdd = description;
// go through each field in meta mime and add it to a menu
BMenu *localMenu = 0;
int32 index = -1;
const char *str;
while (attrInfo.FindString("attr:public_name", ++index, &str) == B_OK) {
if (!attrInfo.FindBool("attr:viewable", index)) {
// don't add if attribute not viewable
continue;
} else {
if (levelOneMenu->CountItems() == 0) {
// Our supertype menu is empty, so we remove it now.
delete levelOneMenu;
}
int32 type;
int32 align;
int32 width;
bool editable;
const char *attrName;
if (attrInfo.FindString("attr:name", index, &attrName) != B_OK
|| attrInfo.FindInt32("attr:type", index, &type) != B_OK
|| attrInfo.FindBool("attr:editable", index, &editable) != B_OK
|| attrInfo.FindInt32("attr:width", index, &width) != B_OK
|| attrInfo.FindInt32("attr:alignment", index, &align) != B_OK)
continue;
BString displayAs;
attrInfo.FindString("attr:display_as", index, &displayAs);
if (!localMenu) {
// do a lazy allocation of the menu
localMenu = new BMenu(nameToAdd);
BFont font;
menu->GetFont(&font);
localMenu->SetFont(&font);
}
localMenu->AddItem(NewAttributeMenuItem(str, attrName, type,
displayAs.String(), width, align, editable, false));
}
if (localMenu) {
BMessage *message = new BMessage(kMIMETypeItem);
message->AddString("mimetype", signature);
menu->AddItem(new IconMenuItem(localMenu, message, signature, B_MINI_ICON));
}
}
}
+2
View File
@@ -146,6 +146,8 @@ class BContainerWindow : public BWindow {
// calls for inheriting window size, attribute layout, etc.
// deprecated
BMenu* CreateMimeMenu(const BMimeType& mimeType, bool isSuperType,
BMenu* menu, int32 start, int32 count);
virtual void AddMimeTypesToMenu(BMenu *);
void AddMimeTypesToMenu();
virtual void MarkAttributeMenu(BMenu *);