1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
/*
* Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; version 2 of the
* License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#pragma once
#include "base/trackable.h"
#include <mforms/box.h>
#include <mforms/app.h>
#include <vector>
namespace mforms {
class MenuBase;
class MenuItem;
class MenuBar;
class View;
class ContextMenu;
enum MenuItemType
{
NormalMenuItem = 0,
CheckedMenuItem,
SeparatorMenuItem
};
#ifndef SWIG
#ifndef DOXYGEN_SHOULD_SKIP_THIS
// This merges functionality of menus and menu items.
struct MFORMS_EXPORT MenuItemImplPtrs
{
bool (*create_menu_bar)(MenuBar *item);
bool (*create_context_menu)(ContextMenu *item);
bool (*create_menu_item)(MenuItem *item, const std::string &, const MenuItemType type);
void (*set_title)(MenuItem *item, const std::string&);
std::string (*get_title)(MenuItem *item);
void (*set_shortcut)(MenuItem *item, const std::string&);
void (*set_enabled)(MenuBase *item, bool);
bool (*get_enabled)(MenuBase *item);
void (*set_checked)(MenuItem *item, bool);
bool (*get_checked)(MenuItem *item);
void (*insert_item)(MenuBase *menu, int index, MenuItem *item);
void (*remove_item)(MenuBase *menu, MenuItem *item); // NULL item to remove all
void (*popup_at)(ContextMenu *menu, View *owner, base::Point location);
};
#endif
#endif
// base abstract class for menuitem and menubase
class MFORMS_EXPORT MenuBase : public Object, public base::trackable
{
protected:
MenuBase();
MenuItemImplPtrs *_impl;
MenuBase *_parent;
std::vector<MenuItem*> _items;
public:
virtual ~MenuBase();
#ifndef SWIG
std::vector<MenuItem*> &get_subitems() { return _items; }
#endif
MenuItem *find_item(const std::string &name);
MenuItem *get_item(int i);
int get_item_index(MenuItem *item);
int item_count();
#ifndef SWIG
MenuItem *add_item_with_title(const std::string &title, boost::function<void ()> action, const std::string &name="");
MenuItem *add_check_item_with_title(const std::string &title, boost::function<void ()> action, const std::string &name="");
#endif
MenuItem *add_separator();
void add_item(MenuItem *item);
void add_submenu(MenuItem *item) { add_item(item); }
void insert_item(int index, MenuItem *item);
void remove_all();
void remove_item(MenuItem *item);
void set_enabled(bool flag);
bool get_enabled();
virtual void validate();
MenuBase *get_parent() { return _parent; }
MenuBase *get_top_menu();
};
/** A menu item that can be added to the host application menus.
*/
class MFORMS_EXPORT MenuItem : public MenuBase
{
public:
/** Constructor
@param title - passing an empty title in the constructor will make the item be a separator
*/
MenuItem(const std::string &title, const MenuItemType type = NormalMenuItem);
void set_title(const std::string &title);
std::string get_title();
void set_shortcut(const std::string &shortcut);
std::string get_shortcut() { return _shortcut; }
void set_checked(bool flag);
bool get_checked();
#ifndef SWIG
boost::signals2::signal<void ()>* signal_clicked() { return &_clicked_signal; }
#endif
void set_name(const std::string &name);
std::string get_name() { return _name; }
MenuItemType get_type() { return _type; }
void set_validator(const boost::function<bool ()> &slot);
public:
void callback();
virtual void validate();
private:
std::string _name;
std::string _shortcut;
boost::function<bool ()> _validate;
boost::signals2::signal<void ()> _clicked_signal;
MenuItemType _type;
};
/** A menu that can be added to the host application.
*/
class MFORMS_EXPORT MenuBar : public MenuBase
{
public:
MenuBar();
#ifndef SWIG
boost::signals2::signal<void (MenuItem*)>* signal_will_show() { return &_signal_will_show; }
#endif
void set_item_enabled(const std::string &item_name, bool flag);
void set_item_checked(const std::string &item_name, bool flag);
void will_show_submenu_from(MenuItem *item);
private:
boost::signals2::signal<void (MenuItem*)> _signal_will_show;
};
/** A menu that can be attached to other controls
*/
class MFORMS_EXPORT ContextMenu : public MenuBase
{
public:
ContextMenu();
#ifndef SWIG
boost::signals2::signal<void (MenuItem*)>* signal_will_show() { return &_signal_will_show; }
#endif
void set_item_enabled(const std::string &item_name, bool flag);
void set_item_checked(const std::string &item_name, bool flag);
void will_show();
void will_show_submenu_from(MenuItem *item);
void popup_at(View *owner, base::Point location);
private:
boost::signals2::signal<void (MenuItem*)> _signal_will_show;
};
};
|