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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: frame.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:09:06  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: frame.cpp,v 1000.1 2004/06/01 21:09:06 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software / database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software / database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/widgets/fl/frame.hpp>
  41. #include <FL/Fl.H>
  42. #include <FL/fl_draw.H>
  43. BEGIN_NCBI_SCOPE
  44. //////////////////////////////////////////////////////////////////////////
  45. //
  46. // CFlFrame
  47. //
  48. CFlFrame::CFlFrame(int x, int y, int w, int h, const char* label)
  49.     : Fl_Group(x, y, w, h, label)
  50. {
  51. }
  52. int CFlFrame::align() const
  53. {
  54.     return Fl_Group::align();
  55. }
  56. void CFlFrame::align(int a)
  57. {
  58.     Fl_Group::align(a | FL_ALIGN_INSIDE);
  59. }
  60. void CFlFrame::draw_label()
  61. {
  62.     // save and restore our font for rendering
  63.     int font_face = fl_font();
  64.     int font_size = fl_size();
  65.     int pos_x = x();
  66.     int pos_y = y();
  67.     fl_font(labelfont(), labelsize());
  68.     int text_wid = (int)fl_width(label());
  69.     int text_ht = labelsize();
  70.     _TRACE("text size: " << text_wid << ", " << text_ht);
  71.     // make sure we appear correctly
  72.     // the default is always the top
  73.     if (align() & FL_ALIGN_BOTTOM) {
  74.         pos_y += h() - (text_ht / 2) - 1;
  75.     } else {
  76.         pos_y -= (text_ht - 1) / 2;
  77.     }
  78.     int offs = 6;
  79.     if (align() & FL_ALIGN_LEFT) {
  80.         // left justified
  81.         pos_x += offs;
  82.     } else if (align() & FL_ALIGN_RIGHT) {
  83.         // right-justified
  84.         pos_x += (w() - text_wid - offs);
  85.     } else {
  86.         // centered
  87.         pos_x += (w() - text_wid) / 2;
  88.     }
  89.     draw_label(pos_x, pos_y, text_wid, text_ht);
  90.     fl_font(font_face, font_size);
  91. }
  92. void CFlFrame::draw_label(int x, int y, int w, int h)
  93. {
  94.     fl_rectf(x - 2, y, w + 4, h, color());
  95.     fl_color(labelcolor());
  96.     fl_draw(label(), x, y, w, h, FL_ALIGN_CENTER);
  97. }
  98. void CFlFrame::draw()
  99. {
  100.     // call draw_children(), as we handle the rendering of the frame and label
  101.     if (damage() & ~FL_DAMAGE_CHILD) {
  102.         // label and frame get drawn
  103.         draw_box();
  104.         draw_label();
  105.     }
  106.     draw_children();
  107. }
  108. //////////////////////////////////////////////////////////////////////////
  109. //
  110. // CFlEnabledFrame
  111. //
  112. static void s_toggle_frame(Fl_Widget* w, void* data)
  113. {
  114.     CFlEnabledFrame* fw = static_cast<CFlEnabledFrame*>(data);
  115.     if (fw) {
  116.         fw->ToggleEnabled();
  117.     }
  118. }
  119. CFlEnabledFrame::CFlEnabledFrame(int x, int y, int w, int h, const char* label)
  120.     : CFlFrame(x, y, w, h, label)
  121.     , m_Button(x, y, w, h)
  122. {
  123.     m_Button.label(label);
  124.     m_Button.box(FL_FLAT_BOX);
  125.     m_Button.callback(s_toggle_frame, this);
  126. }
  127. const char* CFlEnabledFrame::label() const
  128. {
  129.     return m_Button.label();
  130. }
  131. void CFlEnabledFrame::label(const char* l)
  132. {
  133.     m_Button.label(l);
  134. }
  135. void CFlEnabledFrame::draw_label(int x, int y, int w, int h)
  136. {
  137.     w += 20;
  138.     if (align() & FL_ALIGN_RIGHT) {
  139.         x -= 20;
  140.     }
  141.     m_Button.resize(x, y, w, h);
  142.     m_Button.redraw();
  143. }
  144. void CFlEnabledFrame::SetEnabled(bool b)
  145. {
  146.     if (b) {
  147.         for (int i = 0;  i < children();  ++i) {
  148.             if (child(i) != &m_Button) {
  149.                 child(i)->activate();
  150.             }
  151.         }
  152.     } else {
  153.         for (int i = 0;  i < children();  ++i) {
  154.             if (child(i) != &m_Button) {
  155.                 child(i)->deactivate();
  156.             }
  157.         }
  158.     }
  159.     m_Button.value(b);
  160.     m_Button.redraw();
  161. }
  162. void CFlEnabledFrame::ToggleEnabled()
  163. {
  164.     SetEnabled( !m_Button.value() );
  165.     m_Button.value( !m_Button.value() );
  166.     /**
  167.     if (m_Button.value()) {
  168.         for (int i = 0;  i < children();  ++i) {
  169.             if (child(i) != &m_Button) {
  170.                 child(i)->deactivate();
  171.             }
  172.         }
  173.     } else {
  174.         for (int i = 0;  i < children();  ++i) {
  175.             if (child(i) != &m_Button) {
  176.                 child(i)->activate();
  177.             }
  178.         }
  179.     }
  180.     **/
  181.     Fl::focus(this);
  182. }
  183. END_NCBI_SCOPE
  184. /*
  185.  * ===========================================================================
  186.  * $Log: frame.cpp,v $
  187.  * Revision 1000.1  2004/06/01 21:09:06  gouriano
  188.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  189.  *
  190.  * Revision 1.2  2004/05/21 22:27:53  gorelenk
  191.  * Added PCH ncbi_pch.hpp
  192.  *
  193.  * Revision 1.1  2003/09/29 15:25:39  dicuccio
  194.  * Initial revision
  195.  *
  196.  * ===========================================================================
  197.  */