1/* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef SETTINGS_MENU_H 6#define SETTINGS_MENU_H 7 8 9#include <MenuItem.h> 10 11#include <Referenceable.h> 12 13#include "Settings.h" 14 15 16class BoolSetting; 17class OptionsSetting; 18 19 20class SettingsMenu : public BReferenceable { 21public: 22 SettingsMenu(); 23 virtual ~SettingsMenu(); 24 25 virtual status_t AddToMenu(BMenu* menu, int32 index) = 0; 26 virtual void RemoveFromMenu() = 0; 27 28 virtual void PrepareToShow(BLooper* parentLooper) = 0; 29 virtual bool Finish(BLooper* parentLooper, bool force) = 0; 30}; 31 32 33class SettingMenuItem : public BMenuItem { 34public: 35 SettingMenuItem(Setting* setting, 36 const char* label, BMessage* message, 37 char shortcut = 0, uint32 modifiers = 0); 38 SettingMenuItem(Setting* setting, BMenu* menu, 39 BMessage* message = NULL); 40 virtual ~SettingMenuItem(); 41 42 Setting* GetSetting() const { return fSetting; } 43 44 virtual void PrepareToShow(BLooper* parentLooper, 45 BHandler* targetHandler, 46 Settings* settings); 47 virtual bool Finish(BLooper* parentLooper, 48 BHandler* targetHandler, bool force); 49 50 virtual void ItemSelected(Settings* settings); 51 52protected: 53 Setting* fSetting; 54}; 55 56 57class SettingsMenuImpl : public SettingsMenu, private BHandler { 58public: 59 SettingsMenuImpl(Settings* settings); 60 virtual ~SettingsMenuImpl(); 61 62 bool AddItem(SettingMenuItem* item); 63 // takes over ownership 64 bool AddBoolItem(BoolSetting* setting); 65 bool AddOptionsItem(OptionsSetting* setting); 66 67 BMenu* Menu() const { return fMenu; } 68 virtual status_t AddToMenu(BMenu* menu, int32 index); 69 virtual void RemoveFromMenu(); 70 71 virtual void PrepareToShow(BLooper* parentLooper); 72 virtual bool Finish(BLooper* parentLooper, bool force); 73 74 Settings* GetSettings() const { return fSettings; } 75 76private: 77 virtual void MessageReceived(BMessage* message); 78 79private: 80 class MenuItem; 81 class BoolMenuItem; 82 class OptionMenuItem; 83 class OptionsMenuItem; 84 85 typedef BObjectList<SettingMenuItem> MenuItemList; 86 87private: 88 SettingMenuItem* _FindMenuItem(Setting* setting) const; 89 90private: 91 Settings* fSettings; 92 BMenu* fMenu; 93 MenuItemList fMenuItems; 94}; 95 96 97#endif // SETTINGS_MENU_H 98