diff --git a/headers/private/kernel/boot/menu.h b/headers/private/kernel/boot/menu.h index 6b7beb36f7..dc07cb393b 100644 --- a/headers/private/kernel/boot/menu.h +++ b/headers/private/kernel/boot/menu.h @@ -30,12 +30,12 @@ class MenuItem : public DoublyLinkedListLinkImpl { public: MenuItem(const char* label = NULL, Menu* subMenu = NULL); - ~MenuItem(); + virtual ~MenuItem(); void SetTarget(menu_item_hook target); menu_item_hook Target() const { return fTarget; } - void SetMarked(bool marked); + virtual void SetMarked(bool marked); bool IsMarked() const { return fIsMarked; } void Select(bool selected); @@ -57,7 +57,11 @@ public: char Shortcut() const { return fShortcut; } const char* Label() const { return fLabel; } + Menu* Submenu() const { return fSubMenu; } + void SetSubmenu(Menu* subMenu); + + Menu* Supermenu() const { return fMenu; } private: friend class Menu; @@ -93,10 +97,13 @@ enum menu_type { class Menu { public: Menu(menu_type type, const char* title = NULL); - ~Menu(); + 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; } @@ -131,6 +138,9 @@ public: shortcut_hook FindShortcut(char key) const; MenuItem* FindItemByShortcut(char key); + void SortItems(bool (*less)(const MenuItem*, + const MenuItem*)); + void Run(); private: diff --git a/src/system/boot/loader/menu.cpp b/src/system/boot/loader/menu.cpp index 38241b6729..58e2170965 100644 --- a/src/system/boot/loader/menu.cpp +++ b/src/system/boot/loader/menu.cpp @@ -51,21 +51,18 @@ MenuItem::MenuItem(const char *label, Menu *subMenu) fIsEnabled(true), fType(MENU_ITEM_STANDARD), fMenu(NULL), - fSubMenu(subMenu), + fSubMenu(NULL), fData(NULL), fHelpText(NULL), fShortcut(0) { - if (subMenu != NULL) - subMenu->fSuperItem = this; + SetSubmenu(subMenu); } MenuItem::~MenuItem() { - if (fSubMenu != NULL) - fSubMenu->fSuperItem = NULL; - + delete fSubMenu; free(const_cast(fLabel)); } @@ -175,6 +172,16 @@ MenuItem::SetShortcut(char key) } +void +MenuItem::SetSubmenu(Menu* subMenu) +{ + fSubMenu = subMenu; + + if (fSubMenu != NULL) + fSubMenu->fSuperItem = this; +} + + void MenuItem::SetMenu(Menu* menu) { @@ -210,6 +217,18 @@ Menu::~Menu() } +void +Menu::Entered() +{ +} + + +void +Menu::Exited() +{ +} + + MenuItem* Menu::ItemAt(int32 index) { @@ -397,6 +416,13 @@ Menu::FindItemByShortcut(char key) } +void +Menu::SortItems(bool (*less)(const MenuItem*, const MenuItem*)) +{ + fItems.Sort(less); +} + + void Menu::Run() { diff --git a/src/system/boot/platform/generic/text_menu.cpp b/src/system/boot/platform/generic/text_menu.cpp index 502db27b6b..605f8da2cc 100644 --- a/src/system/boot/platform/generic/text_menu.cpp +++ b/src/system/boot/platform/generic/text_menu.cpp @@ -209,7 +209,7 @@ draw_menu(Menu *menu) print_centered(2, "Haiku Boot Loader"); console_set_color(kCopyrightColor, kBackgroundColor); - print_centered(4, "Copyright 2004-2012 Haiku Inc."); + print_centered(4, "Copyright 2004-2013 Haiku, Inc."); if (menu->Title()) { console_set_cursor(kOffsetX, kFirstLine - 2); @@ -390,6 +390,7 @@ static void run_menu(Menu* menu) { sMenuOffset = 0; + menu->Entered(); menu->Show(); draw_menu(menu); @@ -481,6 +482,7 @@ run_menu(Menu* menu) } menu->Hide(); + menu->Exited(); }