Flu_Button.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:5k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: Flu_Button.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:05:29  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*
  10.  * These files were imported into NCBI's CVS directly from FLU version 2.9.1.
  11.  * Modifications to the source are listed below.
  12.  *
  13.  * ==========================================================================
  14.  * $Log: Flu_Button.cpp,v $
  15.  * Revision 1000.1  2004/06/01 21:05:29  gouriano
  16.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  17.  *
  18.  * Revision 1.2  2004/05/21 22:27:51  gorelenk
  19.  * Added PCH ncbi_pch.hpp
  20.  *
  21.  * Revision 1.1  2004/03/11 13:51:39  dicuccio
  22.  * Imported FLU version 2.9.1.  Altered export specifiers to match NCBI layout.
  23.  * Altered include paths to match NCBI toolkit layout.
  24.  *
  25.  * ==========================================================================
  26.  */
  27. // $Id: Flu_Button.cpp,v 1000.1 2004/06/01 21:05:29 gouriano Exp $
  28. /***************************************************************
  29.  *                FLU - FLTK Utility Widgets 
  30.  *  Copyright (C) 2002 Ohio Supercomputer Center, Ohio State University
  31.  *
  32.  * This file and its content is protected by a software license.
  33.  * You should have received a copy of this license with this file.
  34.  * If not, please contact the Ohio Supercomputer Center immediately:
  35.  * Attn: Jason Bryan Re: FLU 1224 Kinnear Rd, Columbus, Ohio 43212
  36.  * 
  37.  ***************************************************************/
  38. #include <ncbi_pch.hpp>
  39. #include <FL/Fl.H>
  40. #include <gui/widgets/FLU/Flu_Button.h>
  41. #include <FL/fl_draw.H>
  42. // taken explicitly from Fl_Return_Button.cpp
  43. static int flu_return_arrow(int x, int y, int w, int h)
  44. {
  45.   int size = w; if (h<size) size = h;
  46.   int d = (size+2)/4; if (d<3) d = 3;
  47.   int t = (size+9)/12; if (t<1) t = 1;
  48.   int x0 = x+(w-2*d-2*t-1)/2;
  49.   int x1 = x0+d;
  50.   int y0 = y+h/2;
  51.   fl_color(FL_LIGHT3);
  52.   fl_line(x0, y0, x1, y0+d);
  53.   fl_yxline(x1, y0+d, y0+t, x1+d+2*t, y0-d);
  54.   fl_yxline(x1, y0-t, y0-d);
  55.   fl_color(fl_gray_ramp(0));
  56.   fl_line(x0, y0, x1, y0-d);
  57.   fl_color(FL_DARK3);
  58.   fl_xyline(x1+1, y0-t, x1+d, y0-d, x1+d+2*t);
  59.   return 1;
  60. }
  61. Flu_Button :: Flu_Button( int X,int Y,int W,int H,const char *l )
  62.   : Fl_Button( X,Y,W,H,l )
  63. {
  64.   inactiveImg = NULL;
  65.   color( FL_GRAY );
  66.   selection_color( FL_GRAY );
  67.   retBtn = linkBtn = false;
  68.   hover = false;
  69.   eBox = FL_NO_BOX;
  70. }
  71. Flu_Button :: ~Flu_Button()
  72. {
  73.   if( inactiveImg )
  74.     delete inactiveImg;
  75. }
  76. void Flu_Button :: checkLink()
  77. {
  78.   // change the cursor if the mouse is over the link
  79.   // the 'hover' variable reduces the number of times fl_cursor needs to be called (since it can be expensive)
  80.   if( linkBtn )
  81.     {
  82.       if( Fl::event_inside( x()+labelSize[0], y()+labelSize[1], labelSize[2], labelSize[3] ) )
  83. {
  84.   if( !hover )
  85.     fl_cursor( FL_CURSOR_HAND );
  86.   hover = true;
  87. }
  88.       else
  89. {
  90.   if( hover )
  91.     fl_cursor( FL_CURSOR_DEFAULT );
  92.   hover = false;
  93. }
  94.     }
  95. }
  96. int Flu_Button :: handle( int event )
  97. {
  98.   if( !active_r() )
  99.     return Fl_Button::handle( event );
  100.   switch( event )
  101.     {
  102.     case FL_MOVE:
  103.       {
  104. checkLink();
  105.       }
  106.     case FL_ENTER:
  107.       {
  108. if( active() )
  109.   {
  110.     Fl_Button::color( fl_lighter( col ) );
  111.     Fl_Button::selection_color( fl_lighter( sCol ) );
  112.   }
  113. checkLink();
  114. redraw();
  115.       }
  116.       break;
  117.     case FL_LEAVE:
  118.       {
  119. Fl_Button::color( col );
  120. Fl_Button::selection_color( sCol );
  121.       }
  122.       checkLink();
  123.       redraw();
  124.       break;
  125.     }
  126.   if( retBtn )
  127.     {
  128.       if( event == FL_SHORTCUT &&
  129.   (Fl::event_key() == FL_Enter || Fl::event_key() == FL_KP_Enter))
  130. {
  131.   do_callback();
  132.   return 1;
  133. }
  134.     }
  135.   return Fl_Button::handle( event );
  136. }
  137. // modified explicitly from Fl_Return_Button.cpp
  138. void Flu_Button :: draw()
  139. {
  140.   if( type() == FL_HIDDEN_BUTTON )
  141.     return;
  142.   if( !active() )
  143.     Fl_Button::color( col );
  144.   // draw the link text
  145.   if( linkBtn )
  146.     {
  147.       fl_draw_box( box(), x(), y(), w(), h(), color() );
  148.       labelSize[0] = labelSize[1] = labelSize[2] = labelSize[3] = 0;
  149.       fl_font( labelfont(), labelsize() );
  150.       fl_measure( label(), labelSize[2], labelSize[3], 1 );
  151.       labelSize[0] += 2;
  152.       labelSize[1] += h()/2 - labelsize()/2 - 2;
  153.       fl_color( labelcolor() );
  154.       fl_draw( label(), x()+labelSize[0], y()+labelSize[1],
  155.        labelSize[2], labelSize[3], FL_ALIGN_LEFT );
  156.       if( !overLink || ( overLink && hover ) )
  157. {
  158.   fl_line_style( FL_SOLID );
  159.   fl_line( x()+labelSize[0], y()+labelSize[1]+labelSize[3]-2,
  160.    x()+labelSize[0]+labelSize[2], y()+labelSize[1]+labelSize[3]-2 );
  161.   fl_line_style( 0 );
  162. }
  163.       return;
  164.     }
  165.   const char *lbl = label();
  166.   if( retBtn )
  167.     label("");
  168.   if( eBox != FL_NO_BOX && Fl::belowmouse() == this && active() )
  169.     {
  170.       Fl_Boxtype oldbox = box();
  171.       box( eBox );
  172.       Fl_Button::draw();
  173.       box( oldbox );
  174.     }
  175.   else
  176.     Fl_Button::draw();
  177.   if( retBtn )
  178.     {
  179.       int W = h();
  180.       if (w()/3 < W) W = w()/3;
  181.       flu_return_arrow(x()+w()-W-4, y(), W, h());
  182.       label( lbl );
  183.       draw_label(x(), y(), w()-W+4, h());
  184.     }
  185. }
  186. void Flu_Button :: image( Fl_Image *i )
  187. {
  188.   if( inactiveImg )
  189.     delete inactiveImg;
  190.   inactiveImg = NULL;
  191.   if( i )
  192.     {
  193.       if( labeltype()!=FL_NORMAL_LABEL )
  194. labeltype( FL_NORMAL_LABEL );
  195.       Fl_Button::image( i );
  196.       inactiveImg = Fl_Button::image()->copy();
  197.       inactiveImg->desaturate();
  198.       Fl_Button::deimage( inactiveImg );
  199.     }
  200. }