colorbutton.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
- /*
- * ===========================================================================
- * PRODUCTION $Log: colorbutton.cpp,v $
- * PRODUCTION Revision 1000.2 2004/06/01 21:08:46 gouriano
- * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
- * PRODUCTION
- * ===========================================================================
- */
- /* $Id: colorbutton.cpp,v 1000.2 2004/06/01 21:08:46 gouriano Exp $
- * ===========================================================================
- *
- * PUBLIC DOMAIN NOTICE
- * National Center for Biotechnology Information
- *
- * This software/database is a "United States Government Work" under the
- * terms of the United States Copyright Act. It was written as part of
- * the author's official duties as a United States Government employee and
- * thus cannot be copyrighted. This software/database is freely available
- * to the public for use. The National Library of Medicine and the U.S.
- * Government have not placed any restriction on its use or reproduction.
- *
- * Although all reasonable efforts have been taken to ensure the accuracy
- * and reliability of the software and data, the NLM and the U.S.
- * Government do not and cannot warrant the performance or results that
- * may be obtained by using this software or data. The NLM and the U.S.
- * Government disclaim all warranties, express or implied, including
- * warranties of performance, merchantability or fitness for any particular
- * purpose.
- *
- * Please cite the author in any work or product based on this material.
- *
- * ===========================================================================
- *
- * Authors: Robert G. Smith
- *
- * File Description:
- * CColorButton: A widget that carries a CGlColor (RGB value) as state.
- * When clicked it presents a color chooser to change its state.
- * It displays its color state in a patch or in text format or both.
- * Its color state is not the same as its FLTK color(), nor is the text
- * description of the color the FLTK label.
- */
-
-
- #include <ncbi_pch.hpp>
- #include <gui/widgets/fl/colorbutton.hpp> // me
- // classes I use.
- #include <FL/Fl_Color_Chooser.H>
- BEGIN_NCBI_SCOPE
- const int CColorButton::sm_SwatchInset = 5; // pixels
- const int CColorButton::sm_SwatchMinHeight = 10;
- CColorButton::CColorButton(int X, int Y, int W, int H, const char *l)
- : Fl_Button(X, Y, W, H, l),
- m_ColorTextType(eNoText),
- m_DrawSwatch(true)
- {
- box(FL_UP_BOX);
- callback((Fl_Callback*) clickCB);
- when(FL_WHEN_RELEASE);
- }
- CColorButton::~CColorButton()
- {
- }
- void CColorButton::draw()
- {
- Fl_Button::draw();
-
- const CGlColor& cgl = GetGlColor();
-
- // draw our color swatch
- int sx = 0, sy = 0, sh = 0, sw = 0;
- if (GetDrawSwatch()) {
-
- sh = h() - 2*sm_SwatchInset;
- if (sh < sm_SwatchMinHeight) {
- sh = sm_SwatchMinHeight;
- }
- if (GetColorTextType() != eNoText) {
- sw = min(w()/2 - sm_SwatchInset, sh);
- sw = min(sw, w() - 2*sm_SwatchInset);
- } else {
- sw = w() - 2*sm_SwatchInset;
- }
- sx = x() + w() - sw - sm_SwatchInset;
- sy = y() + (h() - sh)/2;
-
- Fl_Color col = fl_rgb_color(cgl.GetRedUC(), cgl.GetGreenUC(), cgl.GetBlueUC());
- draw_box(FL_ENGRAVED_BOX, sx, sy, sw, sh, col);
- }
-
- // draw our color description text
- if ( GetColorTextType() != eNoText) {
-
- string color_str = ColorToString();
-
- int tx = x() + sm_SwatchInset;
- int ty = y();
- int tw = w() - 2*sm_SwatchInset;
- if (GetDrawSwatch()) {
- tw -= sw;
- }
- int th = h();
-
- int act_tw, act_th;
- fl_measure(color_str.c_str(), act_tw, act_th, 0);
- Fl_Align text_align = (Fl_Align) (FL_ALIGN_CENTER | FL_ALIGN_CLIP);
- if (act_tw > tw) {
- text_align = (Fl_Align) (FL_ALIGN_LEFT | FL_ALIGN_CLIP);
- }
- fl_color(labelcolor());
- fl_draw(color_str.c_str(), tx, ty, tw, th, text_align , 0 , 0);
- }
- }
- void CColorButton::SetColorTextType(CColorButton::EDrawColorText e)
- {
- m_ColorTextType = e;
- }
- CColorButton::EDrawColorText CColorButton::GetColorTextType(void) const
- {
- return m_ColorTextType;
- }
- void CColorButton::SetDrawSwatch(bool b)
- {
- m_DrawSwatch = b;
- }
- bool CColorButton::GetDrawSwatch(void) const
- {
- return m_DrawSwatch;
- }
- void CColorButton::SetGlColor(const CGlColor& color)
- {
- m_GlColor = color;
- }
- const CGlColor& CColorButton::GetGlColor(void) const
- {
- return m_GlColor;
- }
- void CColorButton::clickCB(CColorButton* o, void* p) {
- o->x_ClickCB(p);
- }
- void CColorButton::x_ClickCB(void*)
- {
- const CGlColor& glc = GetGlColor();
- uchar r = glc.GetRedUC();
- uchar g = glc.GetGreenUC();
- uchar b = glc.GetBlueUC();
- if (fl_color_chooser("Pick a color", r, g, b)) {
- SetGlColor(CGlColor(r, g, b));
- redraw();
- }
- }
- string CColorButton::ColorToString(void) const
- {
- const CGlColor& col = GetGlColor();
- EDrawColorText texttype = GetColorTextType();
-
- if (texttype == CColorButton::eNoText) {
- return kEmptyStr;
- }
-
- CNcbiOstrstream oss;
-
- if (texttype == CColorButton::eHexText) {
- oss << setiosflags(IOS_BASE::uppercase) << hex << setfill('0') << "#"
- << setw(2) << static_cast<int>(col.GetRedUC())
- << setw(2) << static_cast<int>(col.GetBlueUC())
- << setw(2) << static_cast<int>(col.GetGreenUC());
- } else {
- oss << "(" << dec
- << static_cast<int>(col.GetRedUC()) << ","
- << static_cast<int>(col.GetBlueUC()) << ","
- << static_cast<int>(col.GetGreenUC()) << ")";
- }
- return CNcbiOstrstreamToString(oss);
- }
- END_NCBI_SCOPE
- /*
- * ===========================================================================
- * $Log: colorbutton.cpp,v $
- * Revision 1000.2 2004/06/01 21:08:46 gouriano
- * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
- *
- * Revision 1.6 2004/05/21 22:27:53 gorelenk
- * Added PCH ncbi_pch.hpp
- *
- * Revision 1.5 2003/11/21 04:02:58 ucko
- * Use setiosflags rather than "uppercase" manipulator lacking in G++ 2.95.
- *
- * Revision 1.4 2003/10/23 16:25:22 dicuccio
- * Fixed compilation error on MSVC
- *
- * Revision 1.3 2003/09/27 13:10:22 dicuccio
- * Minor stule fixes. Temporarily disable colorbutton pending fix of
- * ColorToString()
- *
- * Revision 1.2 2003/09/26 16:20:13 ucko
- * ColorToString: use CNcbiOstrstream rather than ostringstream, which
- * G++ 2.95 doesn't support.
- *
- * Revision 1.1 2003/09/25 17:11:34 rsmith
- * Initial checkin
- *
- *
- * ===========================================================================
- */