haiku/headers/private/kernel/boot/menu.h
2013-11-30 19:56:26 +01:00

172 lines
3.9 KiB
C++

/*
* Copyright 2004-2010, Axel Dörfler, axeld@pinc-software.de.
* Distributed under the terms of the MIT License.
*/
#ifndef KERNEL_BOOT_MENU_H
#define KERNEL_BOOT_MENU_H
#include <SupportDefs.h>
#include <util/DoublyLinkedList.h>
class Menu;
class MenuItem;
typedef bool (*menu_item_hook)(Menu* menu, MenuItem* item);
typedef void (*shortcut_hook)(char key);
enum menu_item_type {
MENU_ITEM_STANDARD = 1,
MENU_ITEM_MARKABLE,
MENU_ITEM_TITLE,
MENU_ITEM_NO_CHOICE,
MENU_ITEM_SEPARATOR,
};
class MenuItem : public DoublyLinkedListLinkImpl<MenuItem> {
public:
MenuItem(const char* label = NULL,
Menu* subMenu = NULL);
virtual ~MenuItem();
void SetTarget(menu_item_hook target);
menu_item_hook Target() const { return fTarget; }
virtual void SetMarked(bool marked);
bool IsMarked() const { return fIsMarked; }
void Select(bool selected);
bool IsSelected() const { return fIsSelected; }
void SetEnabled(bool enabled);
bool IsEnabled() const { return fIsEnabled; }
void SetType(menu_item_type type);
menu_item_type Type() const { return fType; }
void SetData(const void* data);
const void* Data() const { return fData; }
void SetHelpText(const char* text);
const char* HelpText() const { return fHelpText; }
void SetShortcut(char key);
char Shortcut() const { return fShortcut; }
const char* Label() const { return fLabel; }
void SetLabel(const char* label);
Menu* Submenu() const { return fSubMenu; }
void SetSubmenu(Menu* subMenu);
Menu* Supermenu() const { return fMenu; }
private:
friend class Menu;
void SetMenu(Menu* menu);
private:
const char* fLabel;
menu_item_hook fTarget;
bool fIsMarked;
bool fIsSelected;
bool fIsEnabled;
menu_item_type fType;
Menu* fMenu;
Menu* fSubMenu;
const void* fData;
const char* fHelpText;
char fShortcut;
};
typedef DoublyLinkedList<MenuItem> MenuItemList;
typedef MenuItemList::Iterator MenuItemIterator;
enum menu_type {
MAIN_MENU = 1,
SAFE_MODE_MENU,
STANDARD_MENU,
CHOICE_MENU,
};
class Menu {
public:
Menu(menu_type type, const char* title = NULL);
virtual ~Menu();
menu_type Type() const { return fType; }
virtual void Entered();
virtual void Exited();
void Hide() { fIsHidden = true; }
void Show() { fIsHidden = false; }
bool IsHidden() const { return fIsHidden; }
MenuItemIterator ItemIterator() { return fItems.GetIterator(); }
MenuItem* ItemAt(int32 index);
int32 IndexOf(MenuItem* item);
int32 CountItems() const;
MenuItem* FindItem(const char* label);
MenuItem* FindMarked();
MenuItem* FindSelected(int32* _index = NULL);
void AddItem(MenuItem* item);
status_t AddSeparatorItem();
MenuItem* RemoveItemAt(int32 index);
void RemoveItem(MenuItem* item);
MenuItem* Superitem() const { return fSuperItem; }
Menu* Supermenu() const
{ return fSuperItem
? fSuperItem->fMenu : NULL; }
const char* Title() const { return fTitle; }
void SetTitle(const char* title)
{ fTitle = title; }
void SetChoiceText(const char* text)
{ fChoiceText = text; }
const char* ChoiceText() const { return fChoiceText; }
void AddShortcut(char key, shortcut_hook function);
shortcut_hook FindShortcut(char key) const;
MenuItem* FindItemByShortcut(char key);
void SortItems(bool (*less)(const MenuItem*,
const MenuItem*));
void Run();
private:
friend class MenuItem;
void Draw(MenuItem* item);
private:
struct shortcut {
shortcut* next;
shortcut_hook function;
char key;
};
const char* fTitle;
const char* fChoiceText;
int32 fCount;
bool fIsHidden;
MenuItemList fItems;
menu_type fType;
MenuItem* fSuperItem;
shortcut* fShortcuts;
};
#endif /* KERNEL_BOOT_MENU_H */