diff --git a/headers/os/interface/LayoutBuilder.h b/headers/os/interface/LayoutBuilder.h index 7fc100cd4a..3596837901 100644 --- a/headers/os/interface/LayoutBuilder.h +++ b/headers/os/interface/LayoutBuilder.h @@ -6,11 +6,15 @@ #define _LAYOUT_BUILDER_H +#include + #include #include #include #include +#include #include +#include #include #include #include @@ -23,6 +27,8 @@ template class Base; template class Group; template class Grid; template class Split; +template class Menu; +template class MenuItem; template @@ -248,6 +254,54 @@ private: }; +template +class Menu : public Base { +public: + typedef Menu ThisBuilder; + typedef MenuItem ItemBuilder; + typedef Menu MenuBuilder; + +public: + inline Menu(BMenu* menu); + + inline ThisBuilder& GetMenu(BMenu*& _menu); + + inline ItemBuilder AddItem(BMenuItem* item); + inline ItemBuilder AddItem(BMenu* menu); + inline ItemBuilder AddItem(const char* label, BMessage* message, + char shortcut = 0, uint32 modifiers = 0); + inline ItemBuilder AddItem(const char* label, uint32 messageWhat, + char shortcut = 0, uint32 modifiers = 0); + + inline MenuBuilder AddMenu(BMenu* menu); + inline MenuBuilder AddMenu(const char* title, + menu_layout layout = B_ITEMS_IN_COLUMN); + + inline ThisBuilder& AddSeparator(); + +private: + BMenu* fMenu; +}; + + +template +class MenuItem : public Menu { +public: + typedef MenuItem ThisBuilder; + +public: + inline MenuItem(ParentBuilder* parentBuilder, + BMenu* menu, BMenuItem* item); + + inline ThisBuilder& GetItem(BMenuItem*& _item); + + inline ThisBuilder& SetEnabled(bool enabled); + +private: + BMenuItem* fMenuItem; +}; + + // #pragma mark - Base @@ -965,6 +1019,151 @@ Split::operator BSplitView*() } +// #pragma mark - Menu + + +template +Menu::Menu(BMenu* menu) + : + fMenu(menu) +{ +} + + +template +typename Menu::ThisBuilder& +Menu::GetMenu(BMenu*& _menu) +{ + _menu = fMenu; + return *this; +} + + +template +typename Menu::ItemBuilder +Menu::AddItem(BMenuItem* item) +{ + fMenu->AddItem(item); + return MenuItem(this->fParent, fMenu, item); +} + + +template +typename Menu::ItemBuilder +Menu::AddItem(BMenu* menu) +{ + if (!fMenu->AddItem(menu)) + throw std::bad_alloc(); + + return MenuItem(this->fParent, fMenu, + fMenu->ItemAt(fMenu->CountItems() - 1)); +} + + +template +typename Menu::ItemBuilder +Menu::AddItem(const char* label, BMessage* message, + char shortcut, uint32 modifiers) +{ + BMenuItem* item = new BMenuItem(label, message, shortcut, modifiers); + if (!fMenu->AddItem(item)) + delete item; + + return MenuItem(this->fParent, fMenu, item); +} + + +template +typename Menu::ItemBuilder +Menu::AddItem(const char* label, uint32 messageWhat, + char shortcut, uint32 modifiers) +{ + BMessage* message = new BMessage(messageWhat); + BMenuItem* item; + try { + item = new BMenuItem(label, message, shortcut, modifiers); + } catch (...) { + delete message; + throw; + } + + if (!fMenu->AddItem(item)) + delete item; + + return MenuItem(this->fParent, fMenu, item); +} + + +template +typename Menu::ThisBuilder& +Menu::AddSeparator() +{ + fMenu->AddSeparatorItem(); + return *this; +} + + +template +typename Menu::MenuBuilder +Menu::AddMenu(BMenu* menu) +{ + if (!fMenu->AddItem(menu)) + throw std::bad_alloc(); + + MenuBuilder builder(menu); + builder.SetParent(this); + return builder; +} + + +template +typename Menu::MenuBuilder +Menu::AddMenu(const char* title, menu_layout layout) +{ + BMenu* menu = new BMenu(title, layout); + if (!fMenu->AddItem(menu)) { + delete menu; + throw std::bad_alloc(); + } + + MenuBuilder builder(menu); + builder.SetParent(this); + return builder; +} + + +// #pragma mark - MenuItem + + +template +MenuItem::MenuItem(ParentBuilder* parentBuilder, BMenu* menu, + BMenuItem* item) + : + Menu(menu), + fMenuItem(item) +{ + SetParent(parentBuilder); +} + + +template +typename MenuItem::ThisBuilder& +MenuItem::GetItem(BMenuItem*& _item) +{ + _item = fMenuItem; + return *this; +} + + +template +typename MenuItem::ThisBuilder& +MenuItem::SetEnabled(bool enabled) +{ + fMenuItem->SetEnabled(enabled); + return *this; +} + + } // namespace BLayoutBuilder