00001 #include "bcmenu.h"
00002 #include "bcmenubar.h"
00003 #include "bcmenupopup.h"
00004 #include "bcpixmap.h"
00005 #include "bcpopup.h"
00006 #include "bcpopupmenu.h"
00007 #include "bcresources.h"
00008 #include "bcsignals.h"
00009 #include "colors.h"
00010 #include "fonts.h"
00011 #include <string.h>
00012 #include "vframe.h"
00013
00014
00015
00016
00017 BC_MenuBar::BC_MenuBar(int x, int y, int w)
00018 : BC_SubWindow(x, y, w, 0, -1)
00019 {
00020
00021 button_releases = 0;
00022 active = 0;
00023 menu_bar_bg = 0;
00024 for(int i = 0; i < 3; i++)
00025 menu_title_bg[i] = 0;
00026 }
00027
00028
00029 BC_MenuBar::~BC_MenuBar()
00030 {
00031
00032 for(int i = 0; i < menu_titles.total; i++) delete menu_titles.values[i];
00033 menu_titles.remove_all();
00034 delete menu_bar_bg;
00035 for(int i = 0; i < 3; i++)
00036 delete menu_title_bg[i];
00037 }
00038
00039 int BC_MenuBar::initialize()
00040 {
00041 BC_Resources *resources = get_resources();
00042
00043 h = calculate_height(this);
00044 bg_color = resources->menu_up;
00045
00046 if(resources->menu_bar_bg) menu_bar_bg = new BC_Pixmap(this,
00047 resources->menu_bar_bg);
00048
00049 if(resources->menu_title_bg)
00050 {
00051 for(int i = 0; i < 3; i++)
00052 menu_title_bg[i] = new BC_Pixmap(this,
00053 resources->menu_title_bg[i]);
00054 }
00055
00056
00057 BC_SubWindow::initialize();
00058
00059 if(resources->menu_bg)
00060 set_background(resources->menu_bg);
00061 draw_face();
00062 return 0;
00063 }
00064
00065 int BC_MenuBar::calculate_height(BC_WindowBase *window)
00066 {
00067 if(get_resources()->menu_bar_bg)
00068 return get_resources()->menu_bar_bg->get_h();
00069 else
00070 return window->get_text_height(MEDIUMFONT) + 8;
00071 }
00072
00073 void BC_MenuBar::draw_items()
00074 {
00075 for(int i = 0; i < menu_titles.total; i++)
00076 menu_titles.values[i]->draw_items();
00077 flush();
00078 }
00079
00080 int BC_MenuBar::add_menu(BC_Menu* menu)
00081 {
00082 int x, w;
00083
00084
00085 if(menu_titles.total == 0)
00086 x = 2;
00087 else
00088 x = menu_titles.values[menu_titles.total - 1]->x +
00089 menu_titles.values[menu_titles.total - 1]->w;
00090
00091 w = get_text_width(MEDIUMFONT, menu->text) + 20;
00092
00093 menu_titles.append(menu);
00094
00095 menu->initialize(top_level, this, x, 2, w, get_h() - 4);
00096 return 0;
00097 }
00098
00099 int BC_MenuBar::focus_out_event()
00100 {
00101 deactivate();
00102 return 0;
00103 }
00104
00105 int BC_MenuBar::button_press_event()
00106 {
00107 int result = 0;
00108
00109 for(int i = 0; i < menu_titles.total && !result; i++)
00110 {
00111 result = menu_titles.values[i]->dispatch_button_press();
00112 }
00113
00114 return result;
00115 }
00116
00117 int BC_MenuBar::button_release_event()
00118 {
00119 int result = 0;
00120
00121 button_down = 0;
00122 button_releases++;
00123 for(int i = 0; i < menu_titles.total; i++)
00124 {
00125 result += menu_titles.values[i]->dispatch_button_release();
00126 }
00127
00128
00129 if(!result)
00130 {
00131 deactivate();
00132 }
00133
00134
00135 return result;
00136 }
00137
00138 int BC_MenuBar::resize_event(int w, int h)
00139 {
00140 resize_window(w, get_h());
00141 draw_face();
00142 for(int i = 0; i < menu_titles.total; i++)
00143 {
00144 menu_titles.values[i]->draw_title();
00145 }
00146 return 0;
00147 }
00148
00149 int BC_MenuBar::keypress_event()
00150 {
00151 int result = 0;
00152 if(!top_level->active_subwindow || !top_level->active_subwindow->uses_text())
00153 {
00154 for(int i = 0; i < menu_titles.total && !result; i++)
00155 {
00156 result = menu_titles.values[i]->dispatch_keypress();
00157 }
00158 }
00159 return result;
00160 }
00161
00162 int BC_MenuBar::cursor_motion_event()
00163 {
00164 int result = 0;
00165 for(int i = 0; i < menu_titles.total && !result; i++)
00166 {
00167 result = menu_titles.values[i]->dispatch_motion_event();
00168 }
00169 return result;
00170 }
00171
00172 int BC_MenuBar::cursor_leave_event()
00173 {
00174 for(int i = 0; i < menu_titles.total; i++)
00175 {
00176 menu_titles.values[i]->dispatch_cursor_leave();
00177 }
00178 return 0;
00179 }
00180
00181 int BC_MenuBar::cursor_enter_event()
00182 {
00183 if(active) return 1;
00184 return 0;
00185 }
00186
00187 int BC_MenuBar::translation_event()
00188 {
00189 if(active)
00190 {
00191 for(int i = 0; i < menu_titles.total; i++)
00192 {
00193 menu_titles.values[i]->dispatch_translation_event();
00194 }
00195 }
00196 return 0;
00197 }
00198
00199 int BC_MenuBar::activate()
00200 {
00201 top_level->deactivate();
00202 top_level->active_menubar = this;
00203 active = 1;
00204 return 0;
00205 }
00206
00207 int BC_MenuBar::deactivate()
00208 {
00209 for(int i = 0; i < menu_titles.total; i++)
00210 {
00211 menu_titles.values[i]->deactivate_menu();
00212 }
00213 top_level->active_menubar = 0;
00214 active = 0;
00215 return 0;
00216 }
00217
00218 int BC_MenuBar::unhighlight()
00219 {
00220 for(int i = 0; i < menu_titles.total; i++)
00221 {
00222 menu_titles.values[i]->unhighlight();
00223 }
00224 return 0;
00225 }
00226
00227 int BC_MenuBar::draw_face()
00228 {
00229 if(menu_bar_bg)
00230 {
00231 draw_9segment(0, 0, get_w(), get_h(), menu_bar_bg);
00232 }
00233 else
00234 {
00235 int lx,ly,ux,uy;
00236 int h, w;
00237 h = get_h();
00238 w = get_w();
00239 h--;
00240 w--;
00241
00242 lx = 1; ly = 1;
00243 ux = w - 1; uy = h - 1;
00244
00245 set_color(top_level->get_resources()->menu_light);
00246 draw_line(0, 0, 0, uy);
00247 draw_line(0, 0, ux, 0);
00248
00249 set_color(top_level->get_resources()->menu_shadow);
00250 draw_line(ux, ly, ux, uy);
00251 draw_line(lx, uy, ux, uy);
00252 set_color(BLACK);
00253 draw_line(w, 0, w, h);
00254 draw_line(0, h, w, h);
00255 }
00256
00257 flash();
00258 flush();
00259 return 0;
00260 }
00261
00262
00263
00264
00265