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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: colorbutton.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 21:08:46  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: colorbutton.cpp,v 1000.2 2004/06/01 21:08:46 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:  Robert G. Smith
  35.  *
  36.  * File Description:
  37.  *    CColorButton: A widget that carries a CGlColor (RGB value) as state.
  38.  *   When clicked it presents a color chooser to change its state.
  39.  *   It displays its color state in a patch or in text format or both.
  40.  *   Its color state is not the same as its FLTK color(), nor is the text
  41.  *   description of the color the FLTK label.
  42.  */
  43.  
  44.  
  45. #include <ncbi_pch.hpp>
  46. #include <gui/widgets/fl/colorbutton.hpp>   // me
  47. // classes I use.
  48. #include <FL/Fl_Color_Chooser.H>
  49. BEGIN_NCBI_SCOPE
  50. const int CColorButton::sm_SwatchInset = 5; // pixels
  51. const int CColorButton::sm_SwatchMinHeight = 10;
  52. CColorButton::CColorButton(int X, int Y, int W, int H, const char *l)
  53.    : Fl_Button(X, Y, W, H, l), 
  54.      m_ColorTextType(eNoText), 
  55.      m_DrawSwatch(true)
  56. {
  57.     box(FL_UP_BOX);
  58.     callback((Fl_Callback*) clickCB);
  59.     when(FL_WHEN_RELEASE);
  60. }
  61. CColorButton::~CColorButton()
  62. {
  63. }
  64. void CColorButton::draw()
  65. {
  66.     Fl_Button::draw();
  67.     
  68.     const CGlColor& cgl = GetGlColor();
  69.     
  70.     // draw our color swatch
  71.     int sx = 0, sy = 0, sh = 0, sw = 0;
  72.     if (GetDrawSwatch()) {
  73.     
  74.         sh = h() - 2*sm_SwatchInset;
  75.         if (sh < sm_SwatchMinHeight) {
  76.             sh = sm_SwatchMinHeight;
  77.         }
  78.         if (GetColorTextType() != eNoText) {
  79.             sw = min(w()/2 - sm_SwatchInset, sh);
  80.             sw = min(sw, w() - 2*sm_SwatchInset);
  81.         } else {
  82.             sw = w() - 2*sm_SwatchInset;
  83.         }
  84.         sx = x() + w() - sw - sm_SwatchInset;
  85.         sy = y() + (h() - sh)/2;
  86.         
  87.         Fl_Color col = fl_rgb_color(cgl.GetRedUC(), cgl.GetGreenUC(), cgl.GetBlueUC());
  88.         draw_box(FL_ENGRAVED_BOX, sx, sy, sw, sh, col);
  89.     }
  90.     
  91.     // draw our color description text
  92.     if ( GetColorTextType() != eNoText) {
  93.         
  94.         string  color_str = ColorToString();
  95.         
  96.         int tx = x() + sm_SwatchInset;
  97.         int ty = y();
  98.         int tw = w() - 2*sm_SwatchInset;
  99.         if (GetDrawSwatch()) {
  100.             tw -= sw;
  101.         }
  102.         int th = h();
  103.         
  104.         int act_tw, act_th;
  105.         fl_measure(color_str.c_str(), act_tw, act_th, 0);
  106.         Fl_Align text_align = (Fl_Align) (FL_ALIGN_CENTER | FL_ALIGN_CLIP);
  107.         if (act_tw > tw) {
  108.             text_align = (Fl_Align) (FL_ALIGN_LEFT | FL_ALIGN_CLIP);
  109.         }
  110.         fl_color(labelcolor());
  111.         fl_draw(color_str.c_str(), tx, ty, tw, th, text_align , 0 , 0);
  112.     }
  113. }
  114. void CColorButton::SetColorTextType(CColorButton::EDrawColorText e)
  115. {
  116.     m_ColorTextType = e;
  117. }
  118. CColorButton::EDrawColorText CColorButton::GetColorTextType(void) const
  119. {
  120.     return m_ColorTextType;
  121. }
  122. void CColorButton::SetDrawSwatch(bool b)
  123. {
  124.     m_DrawSwatch = b;
  125. }
  126. bool CColorButton::GetDrawSwatch(void) const
  127. {
  128.     return m_DrawSwatch;
  129. }
  130. void CColorButton::SetGlColor(const CGlColor& color)
  131. {
  132.     m_GlColor = color;
  133. }
  134. const CGlColor& CColorButton::GetGlColor(void) const
  135. {
  136.     return m_GlColor;
  137. }
  138. void  CColorButton::clickCB(CColorButton* o, void* p) {
  139.     o->x_ClickCB(p);
  140. }
  141. void CColorButton::x_ClickCB(void*) 
  142. {
  143.     const CGlColor& glc = GetGlColor();
  144.     uchar r = glc.GetRedUC();
  145.     uchar g = glc.GetGreenUC();
  146.     uchar b = glc.GetBlueUC();
  147.     if (fl_color_chooser("Pick a color", r, g, b)) {
  148.         SetGlColor(CGlColor(r, g, b));
  149.         redraw();
  150.     }
  151. }
  152. string CColorButton::ColorToString(void) const
  153. {
  154.     const CGlColor& col     = GetGlColor();
  155.     EDrawColorText texttype = GetColorTextType();
  156.     
  157.     if (texttype == CColorButton::eNoText) {
  158.         return kEmptyStr;
  159.     }
  160.         
  161.     CNcbiOstrstream oss;
  162.     
  163.     if (texttype == CColorButton::eHexText) {
  164.         oss << setiosflags(IOS_BASE::uppercase) << hex << setfill('0') << "#"
  165.             << setw(2) << static_cast<int>(col.GetRedUC())
  166.             << setw(2) << static_cast<int>(col.GetBlueUC())
  167.             << setw(2) << static_cast<int>(col.GetGreenUC());
  168.     } else {
  169.         oss << "(" << dec
  170.             << static_cast<int>(col.GetRedUC()) << ","
  171.             << static_cast<int>(col.GetBlueUC()) << ","
  172.             << static_cast<int>(col.GetGreenUC()) << ")";
  173.     }
  174.     return CNcbiOstrstreamToString(oss);
  175. }
  176. END_NCBI_SCOPE
  177. /*
  178.  * ===========================================================================
  179.  * $Log: colorbutton.cpp,v $
  180.  * Revision 1000.2  2004/06/01 21:08:46  gouriano
  181.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  182.  *
  183.  * Revision 1.6  2004/05/21 22:27:53  gorelenk
  184.  * Added PCH ncbi_pch.hpp
  185.  *
  186.  * Revision 1.5  2003/11/21 04:02:58  ucko
  187.  * Use setiosflags rather than "uppercase" manipulator lacking in G++ 2.95.
  188.  *
  189.  * Revision 1.4  2003/10/23 16:25:22  dicuccio
  190.  * Fixed compilation error on MSVC
  191.  *
  192.  * Revision 1.3  2003/09/27 13:10:22  dicuccio
  193.  * Minor stule fixes.  Temporarily disable colorbutton pending fix of
  194.  * ColorToString()
  195.  *
  196.  * Revision 1.2  2003/09/26 16:20:13  ucko
  197.  * ColorToString: use CNcbiOstrstream rather than ostringstream, which
  198.  * G++ 2.95 doesn't support.
  199.  *
  200.  * Revision 1.1  2003/09/25 17:11:34  rsmith
  201.  * Initial checkin
  202.  *
  203.  *
  204.  * ===========================================================================
  205.  */