File: basemenu.h

package info (click to toggle)
geresh 0.6.3-9
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 1,040 kB
  • ctags: 1,635
  • sloc: cpp: 11,815; sh: 345; makefile: 120
file content (130 lines) | stat: -rw-r--r-- 3,327 bytes parent folder | download
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
#ifndef BDE_BASEMENU_H
#define BDE_BASEMENU_H

#include <cstring>
#include "widget.h"

struct MenuItem {
    const char *action;
    const char *label;
    int         state_id;
    MenuItem   *submenu;
    unsigned long command_parameter1;
    unsigned long command_parameter2;
    const char   *command_parameter3;
    const char *desc;
    Event       evt;
    unichar     shortkey;
};

typedef MenuItem PulldownMenu[];

struct MenubarItem {
    const char *label;
    MenuItem   *submenu;
};

typedef MenubarItem MenubarMenu[];

class PopupMenu : public Widget {

public:
    // The result of the user interaction:
    enum PostResult { mnuPrev, mnuNext, mnuSelect, mnuCancel };

protected:

    MenuItem *mnu;  // The menu.
    int count;	    // Number of menu items.
    int top;	    // If the menu is too long to fit the screen,
		    // 'top' points to the first visible item.
    int current;    // The highlightd item.
    PostResult post_result;
    PopupMenu *parent;

private:

    void draw_frame();
    int  get_optimal_width();
    int  get_item_optimal_width(int item);
    void update_ancestors();
    void complete_menu(PulldownMenu mnu);
    void reposition(int x, int y);
    void end_modal(PostResult rslt);

protected:

    virtual void show_hint(const char *hint) = 0;
    virtual void clear_other_popups() = 0;
    virtual bool get_item_state(int id) = 0;
    virtual Dispatcher *get_primary_target() = 0;
    virtual Dispatcher *get_secondary_target() = 0;
    virtual PopupMenu *create_popupmenu(PopupMenu *aParent, PulldownMenu mnu) = 0;
    virtual bool handle_event(const Event &evt);
    virtual void do_command(unsigned long parameter1, unsigned long parameter2,
			    const char *parameter3) = 0;

public:

    HAS_ACTIONS_MAP(PopupMenu, Dispatcher);
    HAS_BINDINGS_MAP(PopupMenu, Dispatcher);
    
    PopupMenu(PopupMenu *aParent, PulldownMenu aMnu);
    void init(PulldownMenu mnu);
    PostResult post(int x, int y, Event &evt);

    INTERACTIVE void prev_menu();
    INTERACTIVE void next_menu();
    INTERACTIVE void select();
    INTERACTIVE void cancel_menu();
    INTERACTIVE void screen_resize();

    INTERACTIVE void move_previous_item();
    INTERACTIVE void move_next_item();
    INTERACTIVE void move_first_item();
    INTERACTIVE void move_last_item();
    
    // from base Widget class:
    virtual bool is_dirty() const { return true; }
    virtual void invalidate_view() {}
    virtual void update();
};

class Menubar : public Widget {

protected:

    MenubarItem *mnu;
    int count;
    int current;
    bool dirty;

    void set_current(int i);
    int get_ofs(int item);
    virtual void refresh_screen() = 0;
    virtual PopupMenu *create_popupmenu(PulldownMenu mnu) = 0;
    virtual bool handle_event(const Event &evt);
    
public:

    HAS_ACTIONS_MAP(Menubar, Dispatcher);
    HAS_BINDINGS_MAP(Menubar, Dispatcher);

    Menubar();
    void init(MenubarItem *aMnu);
    void exec();

    INTERACTIVE void select();
    INTERACTIVE void next_menu();
    INTERACTIVE void prev_menu();
    INTERACTIVE void screen_resize();

    // from base Widget class:
    virtual bool is_dirty() const { return dirty; }
    virtual void invalidate_view() { dirty = true; }
    virtual void update();
    virtual void resize(int lines, int columns, int y, int x);
};

#endif