4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "bcmenubar.h"
24 #include "bcmenuitem.h"
25 #include "bcmenupopup.h"
27 #include "bcresources.h"
28 #include "bcsignals.h"
33 // ==================================== Menu ===================================
35 BC_Menu::BC_Menu(const char *text)
37 strcpy(this->text, text);
48 int BC_Menu::initialize(BC_WindowBase *top_level,
49 BC_MenuBar *menu_bar, int x, int y, int w, int h)
55 this->menu_bar = menu_bar;
56 this->top_level = top_level;
57 menu_popup = new BC_MenuPopup;
58 menu_popup->initialize(top_level, menu_bar, this, 0, 0);
63 int BC_Menu::add_item(BC_MenuItem* menuitem)
65 menu_popup->add_item(menuitem);
69 int BC_Menu::del_item(BC_MenuItem *item)
71 menu_popup->del_item(item);
75 int BC_Menu::total_items()
77 return menu_popup->total_items();
80 int BC_Menu::dispatch_button_press()
84 // Menu is down so dispatch to popup
87 result = menu_popup->dispatch_button_press();
93 if(top_level->event_win == menu_bar->win &&
94 top_level->cursor_x >= x && top_level->cursor_x < x + w &&
95 top_level->cursor_y >= y && top_level->cursor_y < y + h)
99 menu_bar->deactivate();
100 menu_bar->unhighlight();
101 menu_bar->button_releases = 0;
102 menu_bar->activate();
111 int BC_Menu::dispatch_button_release()
115 if(top_level->event_win == menu_bar->win &&
116 top_level->cursor_x >= x && top_level->cursor_y < x + w &&
117 top_level->cursor_y >= y && top_level->cursor_y < y + h)
119 if(menu_bar->button_releases >= 2)
122 menu_bar->deactivate();
128 result = menu_popup->dispatch_button_release();
132 int BC_Menu::dispatch_keypress()
134 return menu_popup->dispatch_key_press();
137 int BC_Menu::dispatch_motion_event()
140 int cursor_x = 0, cursor_y = 0;
145 result = menu_popup->dispatch_motion_event();
148 if(!result && top_level->match_window(top_level->event_win))
150 top_level->translate_coordinates(top_level->event_win,
157 // change focus from other menu
158 if(menu_bar->active && !active &&
159 cursor_x >= x && cursor_x < x + w &&
160 cursor_y >= y && cursor_y < y + h)
162 menu_bar->activate();
167 // control highlighting
170 if(cursor_x < x || cursor_x >= x + w ||
171 cursor_y < y || cursor_y >= y + h)
179 if(cursor_x >= x && cursor_x < x + w &&
180 cursor_y >= y && cursor_y < y + h)
182 menu_bar->unhighlight();
192 int BC_Menu::dispatch_cursor_leave()
196 // if( !menu_popup->cursor_inside() )
197 // deactivate_menu();
198 menu_popup->dispatch_cursor_leave();
204 int BC_Menu::dispatch_translation_event()
208 menu_popup->dispatch_translation_event();
213 int BC_Menu::activate_menu()
219 XTranslateCoordinates(top_level->display,
227 menu_popup->activate_menu(new_x, new_y, w, h, 0, 1);
230 menu_popup->activate_menu(x, y, w, h, 1, 1);
237 void BC_Menu::draw_items()
239 if(active) menu_popup->draw_items();
242 int BC_Menu::set_text(char *text)
244 strcpy(this->text, text);
249 int BC_Menu::draw_title(int flash, int flush)
251 BC_Resources *resources = top_level->get_resources();
254 if(active && menu_popup)
256 // Menu is pulled down and title is recessed.
258 if(menu_bar->menu_title_bg[0])
261 menu_bar->draw_9segment(x, 0, w, menu_bar->get_h(), menu_bar->menu_title_bg[2]);
265 menu_bar->draw_3d_box(x, y, w, h,
266 resources->menu_shadow,
268 resources->menu_down,
269 resources->menu_down,
270 resources->menu_light);
275 // Menu is not pulled down.
280 if(menu_bar->menu_title_bg[0])
283 menu_bar->draw_9segment(x, 0, w, menu_bar->get_h(), menu_bar->menu_title_bg[1]);
287 menu_bar->set_color(resources->menu_highlighted);
288 menu_bar->draw_box(x, y, w, h);
294 if(menu_bar->menu_title_bg[0])
297 menu_bar->draw_9segment(x, 0, w, menu_bar->get_h(), menu_bar->menu_title_bg[0]);
301 menu_bar->draw_background(x, y, w, h);
306 menu_bar->set_color(resources->menu_title_text);
307 menu_bar->set_font(MEDIUMFONT);
308 menu_bar->draw_text(x + xS(10) + text_offset,
309 h / 2 + menu_bar->get_text_ascent(MEDIUMFONT) / 2 + 1 + text_offset,
311 if(flash) menu_bar->flash(flush);
316 int BC_Menu::deactivate_menu()
320 menu_popup->deactivate_menu();
327 int BC_Menu::unhighlight()