Added a layout builder for menus.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39507 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2010-11-19 14:29:37 +00:00
parent 42df5ff102
commit 6bb10e965d
+199
View File
@@ -6,11 +6,15 @@
#define _LAYOUT_BUILDER_H
#include <new>
#include <GridLayout.h>
#include <GridView.h>
#include <GroupLayout.h>
#include <GroupView.h>
#include <Menu.h>
#include <MenuField.h>
#include <MenuItem.h>
#include <SpaceLayoutItem.h>
#include <SplitView.h>
#include <TextControl.h>
@@ -23,6 +27,8 @@ template<typename ParentBuilder> class Base;
template<typename ParentBuilder = void*> class Group;
template<typename ParentBuilder = void*> class Grid;
template<typename ParentBuilder = void*> class Split;
template<typename ParentBuilder = void*> class Menu;
template<typename ParentBuilder = void*> class MenuItem;
template<typename ParentBuilder>
@@ -248,6 +254,54 @@ private:
};
template<typename ParentBuilder>
class Menu : public Base<ParentBuilder> {
public:
typedef Menu<ParentBuilder> ThisBuilder;
typedef MenuItem<ParentBuilder> ItemBuilder;
typedef Menu<ThisBuilder> 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<typename ParentBuilder>
class MenuItem : public Menu<ParentBuilder> {
public:
typedef MenuItem<ParentBuilder> 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<ParentBuilder>::operator BSplitView*()
}
// #pragma mark - Menu
template<typename ParentBuilder>
Menu<ParentBuilder>::Menu(BMenu* menu)
:
fMenu(menu)
{
}
template<typename ParentBuilder>
typename Menu<ParentBuilder>::ThisBuilder&
Menu<ParentBuilder>::GetMenu(BMenu*& _menu)
{
_menu = fMenu;
return *this;
}
template<typename ParentBuilder>
typename Menu<ParentBuilder>::ItemBuilder
Menu<ParentBuilder>::AddItem(BMenuItem* item)
{
fMenu->AddItem(item);
return MenuItem<ParentBuilder>(this->fParent, fMenu, item);
}
template<typename ParentBuilder>
typename Menu<ParentBuilder>::ItemBuilder
Menu<ParentBuilder>::AddItem(BMenu* menu)
{
if (!fMenu->AddItem(menu))
throw std::bad_alloc();
return MenuItem<ParentBuilder>(this->fParent, fMenu,
fMenu->ItemAt(fMenu->CountItems() - 1));
}
template<typename ParentBuilder>
typename Menu<ParentBuilder>::ItemBuilder
Menu<ParentBuilder>::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<ParentBuilder>(this->fParent, fMenu, item);
}
template<typename ParentBuilder>
typename Menu<ParentBuilder>::ItemBuilder
Menu<ParentBuilder>::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<ParentBuilder>(this->fParent, fMenu, item);
}
template<typename ParentBuilder>
typename Menu<ParentBuilder>::ThisBuilder&
Menu<ParentBuilder>::AddSeparator()
{
fMenu->AddSeparatorItem();
return *this;
}
template<typename ParentBuilder>
typename Menu<ParentBuilder>::MenuBuilder
Menu<ParentBuilder>::AddMenu(BMenu* menu)
{
if (!fMenu->AddItem(menu))
throw std::bad_alloc();
MenuBuilder builder(menu);
builder.SetParent(this);
return builder;
}
template<typename ParentBuilder>
typename Menu<ParentBuilder>::MenuBuilder
Menu<ParentBuilder>::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<typename ParentBuilder>
MenuItem<ParentBuilder>::MenuItem(ParentBuilder* parentBuilder, BMenu* menu,
BMenuItem* item)
:
Menu<ParentBuilder>(menu),
fMenuItem(item)
{
SetParent(parentBuilder);
}
template<typename ParentBuilder>
typename MenuItem<ParentBuilder>::ThisBuilder&
MenuItem<ParentBuilder>::GetItem(BMenuItem*& _item)
{
_item = fMenuItem;
return *this;
}
template<typename ParentBuilder>
typename MenuItem<ParentBuilder>::ThisBuilder&
MenuItem<ParentBuilder>::SetEnabled(bool enabled)
{
fMenuItem->SetEnabled(enabled);
return *this;
}
} // namespace BLayoutBuilder