home *** CD-ROM | disk | FTP | other *** search
/ Geek 6 / Geek-006.iso / linux / video / xmovie-1.5.3.tar.gz / xmovie-1.5.3.tar / xmovie-1.5.3 / guicast / bcpopupmenu.C < prev    next >
C/C++ Source or Header  |  2000-11-29  |  7KB  |  420 lines

  1. #include "bcmenubar.h"
  2. #include "bcpixmap.h"
  3. #include "bcpopupmenu.h"
  4. #include "bcresources.h"
  5. #include "colors.h"
  6. #include "fonts.h"
  7. #include <string.h>
  8.  
  9. #define BUTTON_UP 0
  10. #define BUTTON_DN 1
  11. #define BUTTON_HI 2
  12.  
  13. #define LEFT_DN  0
  14. #define LEFT_HI  1
  15. #define LEFT_UP  2
  16. #define MID_DN   3
  17. #define MID_HI   4
  18. #define MID_UP   5
  19. #define RIGHT_DN 6
  20. #define RIGHT_HI 7
  21. #define RIGHT_UP 8
  22.  
  23. BC_PopupMenu::BC_PopupMenu(int x, 
  24.         int y, 
  25.         int w, 
  26.         char *text, 
  27.         int use_title)
  28.  : BC_SubWindow(x, y, w, -1, -1)
  29. {
  30.     highlighted = popup_down = 0;
  31.     menu_popup = 0;
  32.     this->use_title = use_title;
  33.     strcpy(this->text, text);
  34.     for(int i = 0; i < 9; i++)
  35.     {
  36.         images[i] = 0;
  37.     }
  38.     status = BUTTON_UP;
  39. }
  40.  
  41. BC_PopupMenu::~BC_PopupMenu()
  42. {
  43.     if(menu_popup) delete menu_popup;
  44.     for(int i = 0; i < 9; i++)
  45.     {
  46.         if(images[i]) delete images[i];
  47.     }
  48. }
  49.  
  50. char* BC_PopupMenu::get_text()
  51. {
  52.     return text;
  53. }
  54.  
  55. int BC_PopupMenu::initialize()
  56. {
  57.     if(use_title)
  58.     {
  59.         set_images(BC_WindowBase::get_resources()->generic_button_images);
  60.     }
  61.     else
  62. // Move outside window if no title
  63.     {
  64.         x = -10;
  65.         y = -10;
  66.         w = 10;
  67.         h = 10;
  68.     }
  69.  
  70.     BC_SubWindow::initialize();
  71.  
  72.     menu_popup = new BC_MenuPopup;
  73.     menu_popup->initialize(top_level, 
  74.         0, 
  75.         0, 
  76.         0, 
  77.         this);
  78.  
  79.     if(use_title) draw_text();
  80.  
  81.     return 0;
  82. }
  83.  
  84. int BC_PopupMenu::set_images(VFrame **data)
  85. {
  86.     for(int i = 0; i < 9; i++)
  87.     {
  88.         if(images[i]) delete images[i];
  89.         images[i] = new BC_Pixmap(parent_window, data[i], PIXMAP_ALPHA);
  90.     }
  91.  
  92.     h = images[MID_HI]->get_h();
  93.     return 0;
  94. }
  95.  
  96. int BC_PopupMenu::add_item(BC_MenuItem *item)
  97. {
  98.     menu_popup->add_item(item);
  99.     return 0;
  100. }
  101.  
  102. int BC_PopupMenu::remove_item(BC_MenuItem *item)
  103. {
  104.     menu_popup->remove_item(item);
  105.     return 0;
  106. }
  107.  
  108. int BC_PopupMenu::total_items()
  109. {
  110.     return menu_popup->total_menuitems();
  111.     return 0;
  112. }
  113.  
  114. int BC_PopupMenu::set_text(char *text)
  115. {
  116.     if(use_title)
  117.     {
  118.         strcpy(this->text, text);
  119.         draw_text();
  120.     }
  121.  
  122.     return 0;
  123. }
  124.  
  125. int BC_PopupMenu::draw_text()
  126. {
  127.     if(!use_title) return 0;
  128.  
  129.     draw_top_background(parent_window, 0, 0, w, h);
  130.  
  131.     switch(status)
  132.     {
  133.         case BUTTON_UP:
  134.             draw_3segment(0, 0, w, h, images[LEFT_UP], images[MID_UP], images[RIGHT_UP]);
  135.             break;
  136.         case BUTTON_HI:
  137.             draw_3segment(0, 0, w, h, images[LEFT_HI], images[MID_HI], images[RIGHT_HI]);
  138.             break;
  139.         case BUTTON_DN:
  140.             draw_3segment(0, 0, w, h, images[LEFT_DN], images[MID_DN], images[RIGHT_DN]);
  141.             break;
  142.     }
  143.  
  144.     set_color(BLACK);
  145.     set_font(MEDIUMFONT);
  146.     BC_WindowBase::draw_center_text(get_w() / 2, 
  147.         (int)((float)get_h() / 2 + get_text_ascent(MEDIUMFONT) / 2 - 2), 
  148.         text);
  149.  
  150.     draw_triangle_down_flat(get_w() - 20, get_h() / 2 - 6, 10, 10);
  151.  
  152.     flash();
  153.     return 0;
  154. }
  155.  
  156. int BC_PopupMenu::deactivate()
  157. {
  158.     if(popup_down)
  159.     {
  160.         top_level->active_popup_menu = 0;
  161.         popup_down = 0;
  162.         menu_popup->deactivate_menu();
  163.  
  164.         if(use_title) draw_text();    // draw the title
  165.     }
  166.     return 0;
  167. }
  168.  
  169. int BC_PopupMenu::activate_menu()
  170. {
  171.     if(!popup_down)
  172.     {
  173.         int x = this->x;
  174.         int y = this->y;
  175.  
  176.         top_level->deactivate();
  177.         top_level->active_popup_menu = this;
  178.         if(!use_title)
  179.         {
  180.             x = top_level->get_abs_cursor_x() - get_w();
  181.             y = top_level->get_abs_cursor_y() - get_h();
  182.             button_press_x = top_level->cursor_x;
  183.             button_press_y = top_level->cursor_y;
  184.         }
  185.  
  186.         button_releases = 0;
  187.         if(use_title)
  188.         {
  189.             Window tempwin;
  190.             int new_x, new_y, top_w, top_h;
  191.             XTranslateCoordinates(top_level->display, 
  192.                 win, 
  193.                 top_level->rootwin, 
  194.                 0, 
  195.                 0, 
  196.                 &new_x, 
  197.                 &new_y, 
  198.                 &tempwin);
  199.             menu_popup->activate_menu(new_x, 
  200.                 new_y, 
  201.                 w, 
  202.                 h, 
  203.                 0, 
  204.                 1);
  205.         }
  206.         else
  207.             menu_popup->activate_menu(x, y, w, h, 0, 1);
  208.         popup_down = 1;
  209.         if(use_title) draw_text();
  210.     }
  211.     return 0;
  212. }
  213.  
  214. int BC_PopupMenu::deactivate_menu()
  215. {
  216.     deactivate();
  217.     return 0;
  218. }
  219.  
  220. int BC_PopupMenu::button_press_event()
  221. {
  222.     int result = 0;
  223.  
  224.     if(is_event_win() && use_title)
  225.     {
  226.         top_level->hide_tooltip();
  227.         if(status == BUTTON_HI || status == BUTTON_UP) status = BUTTON_DN;
  228.         activate_menu();
  229.         draw_text();
  230.         return 1;
  231.     }
  232.  
  233.     if(popup_down)
  234.     {
  235. // Menu is down so dispatch to popup.
  236.         menu_popup->dispatch_button_press();
  237.         return 1;
  238.     }
  239. // 
  240. //     if(!result && use_title && top_level->event_win == win && cursor_inside())
  241. //     {
  242. // // Either menu isn't down or menu didn't get it so try title.
  243. //         if(!popup_down)
  244. //         {
  245. // // Title activated
  246. //             button_releases = 0;
  247. //             activate_menu();
  248. //         }
  249. //         result = 1;
  250. //     }
  251.     return 0;
  252. }
  253.  
  254. int BC_PopupMenu::button_release_event()
  255. {
  256. // try the title
  257.     int result = 0;
  258.  
  259.     button_releases++;
  260.  
  261.     if(is_event_win() && use_title)
  262.     {
  263.         hide_tooltip();
  264.         if(status == BUTTON_DN)
  265.         {
  266.             status = BUTTON_HI;
  267.             draw_text();
  268.         }
  269.     }
  270.  
  271.     if(popup_down)
  272.     {
  273. // Menu is down so dispatch to popup.
  274.         result = menu_popup->dispatch_button_release();
  275.     }
  276.  
  277.     if(popup_down && button_releases >= 2)
  278.     {
  279.         deactivate();
  280.     }
  281.  
  282.     if(!result && use_title && cursor_inside() && is_event_win())
  283.     {
  284.         hide_tooltip();
  285.         result = 1;
  286.     }
  287.     else
  288.     if(!result && !use_title && button_releases < 2)
  289.     {
  290.         result = 1;
  291.     }
  292.  
  293.  
  294.     if(!result && popup_down)
  295.     {
  296. // Button was released outside any menu.
  297.         deactivate();
  298.         result = 1;
  299.     }
  300.  
  301.     return result;
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.     if(popup_down)
  313.     {
  314. // Menu is down so dispatch to popup.
  315.         result = menu_popup->dispatch_button_release();
  316.     }
  317.  
  318.     if(!result && use_title && cursor_inside() && top_level->event_win == win)
  319.     {
  320. // Inside title
  321.         if(button_releases >= 2)
  322.         {
  323.             highlighted = 1;
  324.             deactivate();
  325.         }
  326.         result = 1;
  327.     }
  328.     else
  329.     if(!result && !use_title && button_releases < 2)
  330.     {
  331. // First release outside a floating menu
  332. // Released outside a fictitious title area
  333. //         if(top_level->cursor_x < button_press_x - 5 ||
  334. //             top_level->cursor_y < button_press_y - 5 ||
  335. //             top_level->cursor_x > button_press_x + 5 ||
  336. //             top_level->cursor_y > button_press_y + 5)    
  337.             deactivate();
  338.         result = 1;
  339.     }
  340.  
  341.     return result;
  342. }
  343.  
  344. int BC_PopupMenu::cursor_leave_event()
  345. {
  346.     if(status == BUTTON_HI && use_title)
  347.     {
  348.         status = BUTTON_UP;
  349.         draw_text();
  350.         hide_tooltip();
  351.     }
  352.  
  353. // dispatch to popup
  354.     if(popup_down)
  355.     {
  356.         menu_popup->dispatch_cursor_leave();
  357.     }
  358.  
  359.     return 0;
  360. }
  361.  
  362.  
  363. int BC_PopupMenu::cursor_enter_event()
  364. {
  365.     if(is_event_win() && use_title)
  366.     {
  367.         tooltip_done = 0;
  368.         if(top_level->button_down)
  369.         {
  370.             status = BUTTON_DN;
  371.         }
  372.         else
  373.         if(status == BUTTON_UP) 
  374.             status = BUTTON_HI;
  375.         draw_text();
  376.     }
  377.  
  378.     return 0;
  379. }
  380.  
  381. int BC_PopupMenu::cursor_motion_event()
  382. {
  383.     int result = 0;
  384.  
  385. // This menu is down.
  386.     if(popup_down)
  387.     {
  388.         result = menu_popup->dispatch_motion_event();
  389.     }
  390.  
  391.     if(!result && use_title && top_level->event_win == win)
  392.     {
  393.         if(highlighted)
  394.         {
  395.             if(cursor_inside())
  396.             {
  397.                 highlighted = 0;
  398.                 draw_text();
  399.             }
  400.         }
  401.         else
  402.         {
  403.             if(cursor_inside())
  404.             {
  405.                 highlighted = 1;
  406.                 draw_text();
  407.                 result = 1;
  408.             }
  409.         }
  410.     }
  411.  
  412.     return result;
  413. }
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.