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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: Flu_Collapsable_Group.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:05:36  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_Collapsable_Group.cpp,v $
  15.  * Revision 1000.1  2004/06/01 21:05:36  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_Collapsable_Group.cpp,v 1000.1 2004/06/01 21:05:36 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 <stdio.h>
  40. #include <math.h>
  41. #include <stdlib.h>
  42. #include <string.h>
  43. #include <FL/Fl_Window.H>
  44. #include <gui/widgets/FLU/Flu_Collapsable_Group.h>
  45. Flu_Collapsable_Group :: Flu_Collapsable_Group( int x, int y, int w, int h, const char *l )
  46.   : Fl_Group( x, y, w, h ), button( x, y, w, 20 ), group( x, y+20, w, h-20 )
  47. {
  48.   _originalHeight = h;
  49.   _changing = false;
  50.   _collapseTime = 0.25f;
  51.   _fps = 60.0f;
  52.   _fit = false;
  53.   _open = true;
  54.   _currentHeight = h;
  55.   label( l );
  56.   box( FL_EMBOSSED_BOX );
  57.   align( FL_ALIGN_LEFT );
  58.   // the group label is actually used by the button. so since we don't want this group's label
  59.   // to show up, draw it under everything
  60.   Fl_Group::align( FL_ALIGN_CENTER );
  61.   Fl_Group::add( &button );
  62.   button.callback( _collapseCB, this );
  63.   button.align( FL_ALIGN_CENTER | FL_ALIGN_CLIP );
  64.   Fl_Group::add( &group );
  65.   Fl_Group::resizable( group );
  66.   Fl_Group::end();
  67.   group.begin();
  68. }
  69. void Flu_Collapsable_Group :: resize( int x, int y, int w, int h )
  70. {
  71.   // skip over our parent's resize since we don't want it to mess with the children
  72.   Fl_Widget::resize( x, y, w, h );
  73.   button.resize( x, y, w, 20 );
  74.   group.resize( x, y+20, w, h-20 );
  75. }
  76. void Flu_Collapsable_Group :: open( bool o )
  77. {
  78.   _open = o;
  79.   do_callback();
  80.   if( !_changing )
  81.     {
  82.       _oldResizable = group.resizable();
  83.       group.resizable( NULL );
  84.     }
  85.   if( _open )
  86.     {
  87.       group.show();
  88.       _newHeight = _originalHeight;
  89.     }
  90.   else
  91.     {
  92.       _newHeight = button.h()+5;
  93.       if( !_changing )
  94. _originalHeight = h();
  95.     }
  96.   _currentHeight = float(h());
  97.   if( !_changing )
  98.     {
  99.       _timeout = 1.0f / _fps;
  100.       _deltaHeight = ( float(_newHeight) - _currentHeight ) / ( _collapseTime * _fps );
  101.       _changing = true;
  102.       Fl::add_timeout( _timeout, _updateCB, this );
  103.     }
  104. }
  105. void Flu_Collapsable_Group :: updateCB()
  106. {
  107.   // update the height
  108.   _currentHeight += _deltaHeight;
  109.   // see if we're done with the animation
  110.   if( ( _deltaHeight == 0.0f ) || 
  111.       ( ( _deltaHeight > 0.0f ) && ( _currentHeight >= float(_newHeight) ) ) ||
  112.       ( ( _deltaHeight < 0.0f ) && ( _currentHeight <= float(_newHeight) ) ) )
  113.     {
  114.       resize( x(), y(), w(), _newHeight );
  115.       if( !_open )
  116. group.hide();
  117.       _changing = false;
  118.       group.resizable( _oldResizable );
  119.     }
  120.   else
  121.     {
  122.       resize( x(), y(), w(), int(_currentHeight) );
  123.       Fl::repeat_timeout( _timeout, _updateCB, this );
  124.     }
  125.   // redraw the group
  126.   redraw();
  127.   group.redraw();
  128.   // wierd hack to get parent to redraw everything (necessary since our size has changed)
  129.   if( parent() )
  130.     parent()->init_sizes();
  131.   if( this->window() )
  132.     this->window()->redraw();
  133. }
  134. void Flu_Collapsable_Group :: draw()
  135. {
  136.   int X;
  137.   FluSimpleString l = open() ? "- " : "+ ";
  138.   l += label();
  139.   button.label( l.c_str() );
  140.   // force fit the button if necessary
  141.   if( _fit )
  142.     button.size( w()-12, button.labelsize()+6 );
  143.   else
  144.     {
  145.       // otherwise make it as big as its label
  146.       int W = 0, H = 0;
  147.       fl_font( button.labelfont(), button.labelsize() );
  148.       fl_measure( button.label(), W, H );
  149.       button.size( W+6, button.h() );
  150.     }
  151.   // align the button
  152.   if( align() & FL_ALIGN_LEFT )
  153.     X = 4;
  154.   else if( align() & FL_ALIGN_RIGHT )
  155.     X = w() - button.w() - 8;
  156.   else
  157.     X = w()/2 - button.w()/2 - 2;
  158.   // draw the main group box
  159.   fl_draw_box( box(), x(), y()+button.h()/2, w(), h()-button.h()/2, color() );
  160.   // clip and draw the internal group
  161.   fl_clip( x()+2, y()+button.h()+1, w()-4, h()-button.h()-3 );
  162.   if( _changing )
  163.     {
  164.       if( !_open )
  165. group.resize( x(), y()-_originalHeight+(int)_currentHeight+20, w(), _originalHeight );
  166.       else
  167. group.resize( x(), y()-_newHeight+(int)_currentHeight+20, w(), _newHeight );
  168.     }
  169.   draw_child( group );
  170.   fl_pop_clip();
  171.   // clear behind the button, resize, and draw
  172.   fl_color( color() );
  173.   fl_rectf( x()+X, y(), button.w()+4, button.h() );
  174.   button.position( x()+X+2, y() );
  175.   draw_child( button );
  176.   button.label( 0 );
  177. }