r1007: Make configure detect and work on amd64.
[cinelerra_cv/mob.git] / guicast / bcmenubar.C
blob16d7e2fefadf6e224ef7198e30bc34d3a3da3f71
1 #include "bcmenu.h"
2 #include "bcmenubar.h"
3 #include "bcmenupopup.h"
4 #include "bcpixmap.h"
5 #include "bcpopup.h"
6 #include "bcpopupmenu.h"
7 #include "bcresources.h"
8 #include "bcsignals.h"
9 #include "colors.h"
10 #include "fonts.h"
11 #include <string.h>
12 #include "vframe.h"
15 // ================================== Menu bar ==================================
17 BC_MenuBar::BC_MenuBar(int x, int y, int w)
18  : BC_SubWindow(x, y, w, 0, -1)
20 // Height is really determined by the font in create_tool_objects.
21         button_releases = 0;
22         active = 0;
23         menu_bar_bg = 0;
24         for(int i = 0; i < 3; i++)
25                 menu_title_bg[i] = 0;
29 BC_MenuBar::~BC_MenuBar()
31 // Delete all titles.
32         for(int i = 0; i < menu_titles.total; i++) delete menu_titles.values[i];
33         menu_titles.remove_all();
34         delete menu_bar_bg;
35         for(int i = 0; i < 3; i++)
36                 delete menu_title_bg[i];
39 int BC_MenuBar::initialize()
41         BC_Resources *resources = get_resources();
42 // Initialize dimensions
43         h = calculate_height(this);
44         bg_color = resources->menu_up;
46         if(resources->menu_bar_bg) menu_bar_bg = new BC_Pixmap(this,
47                 resources->menu_bar_bg);
49         if(resources->menu_title_bg)
50         {
51                 for(int i = 0; i < 3; i++)
52                         menu_title_bg[i] = new BC_Pixmap(this,
53                                 resources->menu_title_bg[i]);
54         }
56 // Create the subwindow
57         BC_SubWindow::initialize();
59         if(resources->menu_bg) 
60                 set_background(resources->menu_bg);
61         draw_face();
62         return 0;
65 int BC_MenuBar::calculate_height(BC_WindowBase *window)
67         if(get_resources()->menu_bar_bg)
68                 return get_resources()->menu_bar_bg->get_h();
69         else
70                 return window->get_text_height(MEDIUMFONT) + 8;
73 void BC_MenuBar::draw_items()
75         for(int i = 0; i < menu_titles.total; i++)
76                 menu_titles.values[i]->draw_items();
77         flush();
80 int BC_MenuBar::add_menu(BC_Menu* menu)
82         int x, w;
84 // Get dimensions
85         if(menu_titles.total == 0)
86                 x = 2;
87         else
88                 x = menu_titles.values[menu_titles.total - 1]->x + 
89                         menu_titles.values[menu_titles.total - 1]->w;
91         w = get_text_width(MEDIUMFONT, menu->text) + 20;
92 // get pointer
93         menu_titles.append(menu);
94 // initialize and draw
95         menu->initialize(top_level, this, x, 2, w, get_h() - 4); 
96         return 0;
99 int BC_MenuBar::focus_out_event()
101         deactivate();
102         return 0;
105 int BC_MenuBar::button_press_event()
107         int result = 0;
109         for(int i = 0; i < menu_titles.total && !result; i++)
110         {
111                 result = menu_titles.values[i]->dispatch_button_press();
112         }
114         return result;
117 int BC_MenuBar::button_release_event()
119         int result = 0;
121         button_down = 0;
122         button_releases++;
123         for(int i = 0; i < menu_titles.total; i++)
124         {
125                 result += menu_titles.values[i]->dispatch_button_release();
126         }
128 // Button was released outside any menu.
129         if(!result)
130         {
131                 deactivate();
132         }
133 //printf("BC_MenuBar::button_release_event %d\n", result);
135         return result;
138 int BC_MenuBar::resize_event(int w, int h)
140         resize_window(w, get_h());
141         draw_face();
142         for(int i = 0; i < menu_titles.total; i++)
143         {
144                 menu_titles.values[i]->draw_title();
145         }
146         return 0;
149 int BC_MenuBar::keypress_event()
151         int result = 0;
152         if(!top_level->active_subwindow || !top_level->active_subwindow->uses_text())
153         {
154                 for(int i = 0; i < menu_titles.total && !result; i++)
155                 {
156                         result = menu_titles.values[i]->dispatch_keypress();
157                 }
158         }
159         return result;
162 int BC_MenuBar::cursor_motion_event()
164         int result = 0;
165         for(int i = 0; i < menu_titles.total && !result; i++)
166         {
167                 result = menu_titles.values[i]->dispatch_motion_event();
168         }
169         return result;
172 int BC_MenuBar::cursor_leave_event()
174         for(int i = 0; i < menu_titles.total; i++)
175         {
176                 menu_titles.values[i]->dispatch_cursor_leave();
177         }
178         return 0;
181 int BC_MenuBar::cursor_enter_event()
183         if(active) return 1;
184         return 0;
187 int BC_MenuBar::translation_event()
189         if(active)
190         {
191                 for(int i = 0; i < menu_titles.total; i++)
192                 {
193                         menu_titles.values[i]->dispatch_translation_event();
194                 }
195         }
196         return 0;
199 int BC_MenuBar::activate()
201         top_level->deactivate();
202         top_level->active_menubar = this;
203         active = 1;
204         return 0;
207 int BC_MenuBar::deactivate()
209         for(int i = 0; i < menu_titles.total; i++)
210         {
211                 menu_titles.values[i]->deactivate_menu();
212         }
213         top_level->active_menubar = 0;
214         active = 0;
215         return 0;
218 int BC_MenuBar::unhighlight()
220         for(int i = 0; i < menu_titles.total; i++)
221         {
222                 menu_titles.values[i]->unhighlight();
223         }
224         return 0;
227 int BC_MenuBar::draw_face()
229         if(menu_bar_bg)
230         {
231                 draw_9segment(0, 0, get_w(), get_h(), menu_bar_bg);
232         }
233         else
234         {
235                 int lx,ly,ux,uy;
236                 int h, w;
237                 h = get_h();
238                 w = get_w();
239                 h--; 
240                 w--;
242                 lx = 1;  ly = 1;
243                 ux = w - 1;  uy = h - 1;
245                 set_color(top_level->get_resources()->menu_light);
246                 draw_line(0, 0, 0, uy);
247                 draw_line(0, 0, ux, 0);
249                 set_color(top_level->get_resources()->menu_shadow);
250                 draw_line(ux, ly, ux, uy);
251                 draw_line(lx, uy, ux, uy);
252                 set_color(BLACK);
253                 draw_line(w, 0, w, h);
254                 draw_line(0, h, w, h);
255         }
257         flash();
258         flush();
259         return 0;