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
22 #include "bcmenubar.h"
23 #include "bcmenuitem.h"
24 #include "bcmenupopup.h"
27 #include "bcpopupmenu.h"
28 #include "bcresources.h"
29 #include "bcsignals.h"
30 #include "bcwindowbase.h"
41 #define MENUITEM_MARGIN 2
43 // ================================ Menu Item ==================================
45 BC_MenuItem::BC_MenuItem(const char *text, const char *hotkey_text, int hotkey)
49 if(text) set_text(text);
50 if(hotkey_text) set_hotkey_text(hotkey_text);
52 this->hotkey = hotkey;
63 BC_MenuItem::~BC_MenuItem()
65 if(text) delete [] text;
67 if(hotkey_text) delete [] hotkey_text;
69 if(submenu) delete submenu;
72 menu_popup->remove_item(this);
75 void BC_MenuItem::reset()
78 hotkey_text = new char[1];
84 int BC_MenuItem::initialize(BC_WindowBase *top_level, BC_MenuBar *menu_bar, BC_MenuPopup *menu_popup)
86 this->top_level = top_level;
87 this->menu_popup = menu_popup;
88 this->menu_bar = menu_bar;
92 int BC_MenuItem::set_checked(int value)
94 this->checked = value;
98 int BC_MenuItem::get_checked()
103 void BC_MenuItem::set_icon(BC_Pixmap *icon)
108 BC_Pixmap* BC_MenuItem::get_icon()
113 void BC_MenuItem::set_text(const char *text)
115 if(this->text) delete [] this->text;
116 this->text = new char[strlen(text) + 1];
117 strcpy(this->text, text);
120 void BC_MenuItem::set_hotkey_text(const char *text)
122 if(this->hotkey_text) delete [] this->hotkey_text;
123 this->hotkey_text = new char[strlen(text) + 1];
124 strcpy(this->hotkey_text, text);
127 int BC_MenuItem::deactivate_submenus(BC_MenuPopup *exclude)
129 if(submenu && submenu != exclude)
131 submenu->deactivate_submenus(exclude);
132 submenu->deactivate_menu();
133 submenu->popup_menu = 0;
139 int BC_MenuItem::activate_submenu()
142 if(menu_popup->popup && submenu && !submenu->popup)
145 XTranslateCoordinates(top_level->display,
146 menu_popup->get_popup()->win,
153 submenu->popup_menu = menu_popup->popup_menu;
154 submenu->activate_menu(new_x + 5, new_y, menu_popup->w - 10, h, 0, 0);
161 int BC_MenuItem::dispatch_button_press()
167 result = submenu->dispatch_button_press();
170 if(!result && menu_popup->get_popup()->is_event_win())
172 if(top_level->cursor_x >= 0 && top_level->cursor_x < menu_popup->get_w() &&
173 top_level->cursor_y >= y && top_level->cursor_y < y + h)
192 int BC_MenuItem::dispatch_button_release(int &redraw)
196 if(!strcmp(text, "-")) return 0;
200 result = submenu->dispatch_button_release();
203 if( !result && menu_popup->cursor_inside() ) {
204 int cursor_x, cursor_y;
205 menu_popup->get_popup()->get_relative_cursor_xy(cursor_x, cursor_y);
206 if( cursor_x >= 0 && cursor_x < menu_popup->get_w() &&
207 cursor_y >= y && cursor_y < y + h ) {
209 menu_bar->deactivate();
211 menu_popup->popup_menu->deactivate();
213 if(!handle_event() && menu_popup && menu_popup->popup_menu)
215 menu_popup->popup_menu->set_text(text);
216 menu_popup->popup_menu->handle_event();
224 int BC_MenuItem::dispatch_motion_event(int &redraw)
230 result = submenu->dispatch_motion_event();
233 if( !result && menu_popup->cursor_inside() ) {
234 int cursor_x, cursor_y;
235 menu_popup->get_popup()->get_relative_cursor_xy(cursor_x, cursor_y);
236 if( cursor_x >= 0 && cursor_x < menu_popup->get_w() &&
237 cursor_y >= y && cursor_y < y + h) {
238 // Highlight the item
241 // Deactivate submenus in the parent menu excluding this one.
242 menu_popup->deactivate_submenus(submenu);
244 if(submenu) activate_submenu();
260 int BC_MenuItem::dispatch_translation_event()
263 submenu->dispatch_translation_event();
267 int BC_MenuItem::dispatch_cursor_leave()
272 result = submenu->dispatch_cursor_leave();
275 if(!result && highlighted && menu_popup->get_popup()->is_event_win())
283 int BC_MenuItem::dispatch_key_press()
288 result = submenu->dispatch_key_press();
294 if(top_level->get_keypress() == hotkey &&
295 shift_hotkey == top_level->shift_down() &&
296 alt_hotkey == top_level->alt_down() &&
297 ctrl_hotkey == top_level->ctrl_down())
307 int BC_MenuItem::draw()
309 int text_line = top_level->get_text_descent(MEDIUMFONT);
310 BC_Resources *resources = top_level->get_resources();
312 if(!strcmp(text, "-"))
314 menu_popup->get_popup()->set_color(DKGREY);
315 menu_popup->get_popup()->draw_line(5, y + h / 2, menu_popup->get_w() - 5, y + h / 2);
316 menu_popup->get_popup()->set_color(LTGREY);
317 menu_popup->get_popup()->draw_line(5, y + h / 2 + 1, menu_popup->get_w() - 5, y + h / 2 + 1);
325 //int w = menu_popup->get_w() - 4;
329 if(top_level->get_button_down() && !submenu)
331 if(menu_popup->item_bg[MENUITEM_DN])
333 // menu_popup->get_popup()->draw_9segment(MENUITEM_MARGIN,
335 // menu_popup->get_w() - MENUITEM_MARGIN * 2,
337 // menu_popup->item_bg[MENUITEM_DN]);
338 menu_popup->get_popup()->draw_3segmenth(MENUITEM_MARGIN,
340 menu_popup->get_w() - MENUITEM_MARGIN * 2,
341 menu_popup->item_bg[MENUITEM_DN]);
345 menu_popup->get_popup()->draw_3d_box(MENUITEM_MARGIN,
347 menu_popup->get_w() - MENUITEM_MARGIN * 2,
349 resources->menu_shadow,
351 resources->menu_down,
352 resources->menu_down,
353 resources->menu_light);
360 if(menu_popup->item_bg[MENUITEM_HI])
362 // menu_popup->get_popup()->draw_9segment(MENUITEM_MARGIN,
364 // menu_popup->get_w() - MENUITEM_MARGIN * 2,
366 // menu_popup->item_bg[MENUITEM_HI]);
367 menu_popup->get_popup()->draw_3segmenth(MENUITEM_MARGIN,
369 menu_popup->get_w() - MENUITEM_MARGIN * 2,
370 menu_popup->item_bg[MENUITEM_HI]);
374 menu_popup->get_popup()->set_color(resources->menu_highlighted);
375 menu_popup->get_popup()->draw_box(MENUITEM_MARGIN,
377 menu_popup->get_w() - MENUITEM_MARGIN * 2,
381 menu_popup->get_popup()->set_color(resources->menu_highlighted_fontcolor);
385 menu_popup->get_popup()->set_color(resources->menu_item_text);
389 // menu_popup->get_popup()->draw_check(10 + offset, y + 2 + offset);
390 menu_popup->get_popup()->draw_pixmap(menu_popup->check,
392 y + (this->h - menu_popup->check->get_h()) / 2 + offset);
393 menu_popup->get_popup()->set_font(MEDIUMFONT);
394 menu_popup->get_popup()->draw_text(menu_popup->check->get_w() + offset,
395 y + h - text_line - 2 + offset,
397 menu_popup->get_popup()->draw_text(menu_popup->get_key_x() + offset,
398 y + h - text_line - 2 + offset,
403 menu_popup->get_popup()->set_font(MEDIUMFONT);
404 menu_popup->get_popup()->draw_text(10 + offset, y + h - text_line - 2 + offset, text);
405 menu_popup->get_popup()->draw_text(menu_popup->get_key_x() + offset, y + h - text_line - 2 + offset, hotkey_text);
412 int BC_MenuItem::add_submenu(BC_SubMenu *submenu)
414 this->submenu = submenu;
415 submenu->initialize(top_level, menu_bar, 0, this, 0);
419 BC_SubMenu* BC_MenuItem::get_submenu()
424 char* BC_MenuItem::get_text()
429 BC_WindowBase* BC_MenuItem::get_top_level()
434 BC_PopupMenu* BC_MenuItem::get_popup_menu()
436 return menu_popup->popup_menu;
439 int BC_MenuItem::set_shift(int value)
441 shift_hotkey = value;
445 int BC_MenuItem::set_alt(int value)
451 void BC_MenuItem::set_ctrl(int value)