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 / bctoggle.C < prev    next >
C/C++ Source or Header  |  2000-11-29  |  6KB  |  348 lines

  1. #include "bcpixmap.h"
  2. #include "bcresources.h"
  3. #include "bctoggle.h"
  4. #include "colors.h"
  5. #include "fonts.h"
  6.  
  7.  
  8. BC_Toggle::BC_Toggle(int x, int y, 
  9.         VFrame **data, 
  10.         int value, 
  11.         char *caption,
  12.         int bottom_justify, 
  13.         int font,
  14.         int color)
  15.  : BC_SubWindow(x, y, 0, 0, -1)
  16. {
  17.     this->data = data;
  18.     images[0] = images[1] = images[2] = images[3] = images[4] = 0;
  19.     status = value ? TOGGLE_CHECKED : TOGGLE_UP;
  20.     this->value = value;
  21.     this->caption = caption;
  22.     this->bottom_justify = bottom_justify;
  23.     this->font = font;
  24.     this->color = color;
  25. }
  26.  
  27.  
  28. BC_Toggle::~BC_Toggle()
  29. {
  30.     delete images[0];
  31.     delete images[1];
  32.     delete images[2];
  33.     delete images[3];
  34.     delete images[4];
  35. }
  36.  
  37.  
  38. int BC_Toggle::initialize()
  39. {
  40. // Get the image
  41.     set_images(data);
  42.     w = images[0]->get_w();
  43.     h = images[0]->get_h();
  44.     toggle_x = 0;
  45.     toggle_y = 0;
  46.     text_y = 0;
  47.     text_x = w + 5;
  48.  
  49. // Expand subwindow for text
  50.     if(has_caption())
  51.     {
  52.         text_w = get_text_width(MEDIUMFONT, caption);
  53.         text_h = get_text_height(MEDIUMFONT);
  54.         if(text_h > h)
  55.         {
  56.             toggle_y = (text_h - h) >> 1;
  57.             h = text_h;
  58.         }
  59.         else
  60.             text_y = (h - text_h) >> 1;
  61.  
  62.         if(bottom_justify)
  63.         {
  64.             text_y = h - text_h;
  65.             text_line = h - get_text_descent(MEDIUMFONT);
  66.         }
  67.         else
  68.             text_line = text_y + get_text_ascent(MEDIUMFONT);
  69.         
  70.         w = text_x + text_w;
  71.     }
  72.  
  73. // Create the subwindow
  74.     BC_SubWindow::initialize();
  75.  
  76. // Display the bitmap
  77.     draw_face();
  78.     return 0;
  79. }
  80.  
  81. int BC_Toggle::set_images(VFrame **data)
  82. {
  83.     if(images)
  84.     {
  85.         delete images[0];
  86.         delete images[1];
  87.         delete images[2];
  88.         delete images[3];
  89.         delete images[4];
  90.     }
  91.  
  92.     images[0] = new BC_Pixmap(top_level, data[0], PIXMAP_ALPHA);
  93.     images[1] = new BC_Pixmap(top_level, data[1], PIXMAP_ALPHA);
  94.     images[2] = new BC_Pixmap(top_level, data[2], PIXMAP_ALPHA);
  95.     images[3] = new BC_Pixmap(top_level, data[3], PIXMAP_ALPHA);
  96.     images[4] = new BC_Pixmap(top_level, data[4], PIXMAP_ALPHA);
  97.     return 0;
  98. }
  99.  
  100. int BC_Toggle::draw_face()
  101. {
  102.     draw_top_background(parent_window, 0, 0, get_w(), get_h());
  103.     if(has_caption())
  104.     {
  105.         if(status == TOGGLE_UPHI || status == TOGGLE_DOWN || status == TOGGLE_CHECKEDHI)
  106.         {
  107.             set_color(LTGREY);
  108.             draw_box(text_x, text_line - get_text_ascent(MEDIUMFONT), get_w() - text_x, get_text_height(MEDIUMFONT));
  109.         }
  110.  
  111.         set_opaque();
  112.         set_color(get_resources()->text_default);
  113.         set_font(font);
  114.         set_color(color);
  115.         draw_text(text_x, text_line, caption);
  116.     }
  117.  
  118.     draw_pixmap(images[status]);
  119.     flash();
  120.     return 0;
  121. }
  122.  
  123.  
  124. int BC_Toggle::repeat_event(long duration)
  125. {
  126.     if(duration == top_level->get_resources()->tooltip_delay &&
  127.         tooltip_text[0] != 0 &&
  128.         (status == TOGGLE_UPHI || status == TOGGLE_CHECKEDHI) &&
  129.         !tooltip_done)
  130.     {
  131.         show_tooltip();
  132.         tooltip_done = 1;
  133.         return 1;
  134.     }
  135.     return 0;
  136. }
  137.  
  138. int BC_Toggle::cursor_enter_event()
  139. {
  140.     if(top_level->event_win == win)
  141.     {
  142.         tooltip_done = 0;
  143.         if(top_level->button_down)
  144.             status = TOGGLE_DOWN;
  145.         else
  146.             status = value ? TOGGLE_CHECKEDHI : TOGGLE_UPHI;
  147.         draw_face();
  148.     }
  149.     return 0;
  150. }
  151.  
  152. int BC_Toggle::cursor_leave_event()
  153. {
  154.     hide_tooltip();
  155.     if(!value)
  156.     {
  157.         status = TOGGLE_UP;
  158.         draw_face();
  159.     }
  160.     else
  161.     {
  162.         status = TOGGLE_CHECKED;
  163.         draw_face();
  164.     }
  165.     return 0;
  166. }
  167.  
  168. int BC_Toggle::button_press_event()
  169. {
  170.     hide_tooltip();
  171.     if(top_level->event_win == win)
  172.     {
  173.         status = TOGGLE_DOWN;
  174.         draw_face();
  175.         return 1;
  176.     }
  177.     return 0;
  178. }
  179.  
  180. int BC_Toggle::button_release_event()
  181. {
  182.     hide_tooltip();
  183.     if(top_level->event_win == win && status == TOGGLE_DOWN)
  184.     {
  185.         if(!value)
  186.         {
  187.             status = TOGGLE_CHECKEDHI;
  188.             value = 1;
  189.             draw_face();
  190.             return handle_event();
  191.         }
  192.         else
  193.         {
  194.             status = TOGGLE_UPHI;
  195.             value = 0;
  196.             draw_face();
  197.             return handle_event();
  198.         }
  199.     }
  200.     return 0;
  201. }
  202.  
  203. int BC_Toggle::cursor_motion_event()
  204. {
  205.     if(top_level->button_down && top_level->event_win == win && !cursor_inside())
  206.     {
  207.         if(status == TOGGLE_DOWN)
  208.         {
  209.             status = TOGGLE_UP;
  210.             draw_face();
  211.         }
  212.         else
  213.         if(status == TOGGLE_UPHI)
  214.         {
  215.             status = TOGGLE_CHECKEDHI;
  216.             draw_face();
  217.         }
  218.     }
  219.     return 0;
  220. }
  221.  
  222. int BC_Toggle::get_value()
  223. {
  224.     return value;
  225. }
  226.  
  227. int BC_Toggle::set_value(int value)
  228. {
  229.     this->value = value;
  230.     if(value) 
  231.     switch(status)
  232.     {
  233.         case TOGGLE_UP:
  234.             status = TOGGLE_CHECKED;
  235.             break;
  236.         case TOGGLE_UPHI:
  237.             status = TOGGLE_CHECKEDHI;
  238.             break;
  239.     }
  240.     else
  241.     switch(status)
  242.     {
  243.         case TOGGLE_CHECKED:
  244.             status = TOGGLE_UP;
  245.             break;
  246.         case TOGGLE_CHECKEDHI:
  247.             status = TOGGLE_UPHI;
  248.             break;
  249.     }
  250.     draw_face();
  251.     return 0;
  252. }
  253.  
  254. int BC_Toggle::update(int value)
  255. {
  256.     return set_value(value);
  257. }
  258.  
  259. void BC_Toggle::reposition_window(int x, int y)
  260. {
  261.     BC_WindowBase::reposition_window(x, y);
  262.     draw_face();
  263. }
  264.  
  265.  
  266. int BC_Toggle::has_caption()
  267. {
  268.     return (caption != 0 && caption[0] != 0);
  269. }
  270.  
  271. BC_Radial::BC_Radial(int x, 
  272.     int y, 
  273.     int value, 
  274.     char *caption, 
  275.     int font,
  276.     int color)
  277.  : BC_Toggle(x, 
  278.      y, 
  279.     BC_WindowBase::get_resources()->radial_images, 
  280.     value, 
  281.     caption, 
  282.     0, 
  283.     font,
  284.     color)
  285. {
  286. }
  287.  
  288. BC_CheckBox::BC_CheckBox(int x, 
  289.     int y, 
  290.     int value, 
  291.     char *caption, 
  292.     int font,
  293.     int color)
  294.  : BC_Toggle(x, 
  295.      y, 
  296.     BC_WindowBase::get_resources()->checkbox_images, 
  297.     value, 
  298.     caption, 
  299.     1, 
  300.     font,
  301.     color)
  302. {
  303.     this->value = 0;
  304. }
  305.  
  306. BC_CheckBox::BC_CheckBox(int x, 
  307.     int y, 
  308.     int *value, 
  309.     char *caption, 
  310.     int font,
  311.     int color)
  312.  : BC_Toggle(x, 
  313.      y, 
  314.     BC_WindowBase::get_resources()->checkbox_images, 
  315.     *value, 
  316.     caption, 
  317.     1, 
  318.     font,
  319.     color)
  320. {
  321.     this->value = value;
  322. }
  323.  
  324. int BC_CheckBox::handle_event()
  325. {
  326.     *value = get_value();
  327.     return 1;
  328. }
  329.  
  330.  
  331.  
  332.  
  333. BC_Label::BC_Label(int x, 
  334.     int y, 
  335.     int value, 
  336.     int font,
  337.     int color)
  338.  : BC_Toggle(x, 
  339.      y, 
  340.     BC_WindowBase::get_resources()->label_images, 
  341.     value, 
  342.     "", 
  343.     0, 
  344.     font,
  345.     color)
  346. {
  347. }
  348.