File: menubar.h

package info (click to toggle)
mysql-workbench 6.3.8%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 113,932 kB
  • ctags: 87,814
  • sloc: ansic: 955,521; cpp: 427,465; python: 59,728; yacc: 59,129; xml: 54,204; sql: 7,091; objc: 965; makefile: 638; sh: 613; java: 237; perl: 30; ruby: 6; php: 1
file content (193 lines) | stat: -rw-r--r-- 5,505 bytes parent folder | download | duplicates (2)
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;
  };
};