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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: dock_frame.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:08:22  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: dock_frame.cpp,v 1000.1 2004/06/01 21:08:22 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.  *    CDockFrame -- internal widget class that represents the frame
  38.  *                   surrounding a given MDI child
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include "dock_frame.hpp"
  42. #include <FL/Fl_Box.H>
  43. #include <FL/Fl_Button.H>
  44. #include <FL/Fl_Pixmap.H>
  45. BEGIN_NCBI_SCOPE
  46. static void s_RedockLeft_cb(Fl_Widget* w, void* data)
  47. {
  48.     CDockFrame* frame = reinterpret_cast<CDockFrame*>(data);
  49.     if (frame) {
  50.         frame->RedockLeft();
  51.     }
  52. }
  53. static void s_RedockRight_cb(Fl_Widget* w, void* data)
  54. {
  55.     CDockFrame* frame = reinterpret_cast<CDockFrame*>(data);
  56.     if (frame) {
  57.         frame->RedockRight();
  58.     }
  59. }
  60. static void s_RedockBottom_cb(Fl_Widget* w, void* data)
  61. {
  62.     CDockFrame* frame = reinterpret_cast<CDockFrame*>(data);
  63.     if (frame) {
  64.         frame->RedockBottom();
  65.     }
  66. }
  67. static void s_RedockTop_cb(Fl_Widget* w, void* data)
  68. {
  69.     CDockFrame* frame = reinterpret_cast<CDockFrame*>(data);
  70.     if (frame) {
  71.         frame->RedockTop();
  72.     }
  73. }
  74. static void s_Remove_cb(Fl_Widget* w, void* data)
  75. {
  76.     CDockFrame* frame = reinterpret_cast<CDockFrame*>(data);
  77.     if (frame) {
  78.         frame->Remove();
  79.     }
  80. }
  81. CDockFrame::CDockFrame(CDockWidget* parent,
  82.                        int x, int y, int w, int h, const char* label)
  83.     : Fl_Group(x, y, w, h, label)
  84.     , m_Parent(parent)
  85.     , m_Owner(false)
  86. {
  87. }
  88. CDockFrame::~CDockFrame()
  89. {
  90.     // detach our child, if it exists
  91.     Detach();
  92. }
  93. void CDockFrame::Attach(Fl_Widget* child, bool owner)
  94. {
  95.     Detach();
  96.     m_Child = child;
  97.     m_Owner = owner;
  98.     // our border
  99.     const size_t border_h = 10;
  100.     const size_t control_btn_w = 8;
  101.     const size_t control_btn_h = 8;
  102.     const size_t control_btn_spacing = 2;
  103.     const size_t control_btn_panel_w = (control_btn_w+ control_btn_spacing) * 5;
  104.     {{
  105.         // our control group
  106.         Fl_Box* box       = NULL;
  107.         Fl_Button* button = NULL;
  108.         Fl_Group* group   = new Fl_Group(x(), y(), w(), border_h);
  109.         group->box(FL_FLAT_BOX);
  110.         const size_t gripper_w = group->w() - 3 -
  111.             (control_btn_panel_w + control_btn_spacing);
  112.         const size_t gripper_h = 3;
  113.         // gripper bars
  114.         box = new Fl_Box(group->x() + 2, group->y() + 2,
  115.                          gripper_w, gripper_h);
  116.         box->box(FL_THIN_UP_FRAME);
  117.         box->clear_visible_focus();
  118.         //group->add(box);
  119.         group->resizable(box);
  120.     
  121.         box = new Fl_Box(group->x() + 2,
  122.                          group->y() + border_h - gripper_h - 2,
  123.                          gripper_w, gripper_h);
  124.         box->box(FL_THIN_UP_FRAME);
  125.         box->clear_visible_focus();
  126.         //group->add(box);
  127.         // buttons
  128.         size_t control_x = group->x() + gripper_w + control_btn_spacing * 2;
  129.         button = new Fl_Button(control_x, group->y() + 1,
  130.                                control_btn_w, control_btn_h);
  131.         button->box(FL_THIN_UP_FRAME);
  132.         button->image(x_GetDockPositionImg(CDockWidget::eDock_Left));
  133.         button->clear_visible_focus();
  134.         button->tooltip("Re-dock this window on the left");
  135.         button->callback(s_RedockLeft_cb, this);
  136.         control_x += control_btn_w + control_btn_spacing;
  137.         button = new Fl_Button(control_x, group->y() + 1,
  138.                                control_btn_w, control_btn_h);
  139.         button->box(FL_THIN_UP_FRAME);
  140.         button->image(x_GetDockPositionImg(CDockWidget::eDock_Right));
  141.         button->clear_visible_focus();
  142.         button->callback(s_RedockRight_cb, this);
  143.         button->tooltip("Re-dock this window on the right");
  144.         control_x += control_btn_w + control_btn_spacing;
  145.         button = new Fl_Button(control_x, group->y() + 1,
  146.                                control_btn_w, control_btn_h);
  147.         button->box(FL_THIN_UP_FRAME);
  148.         button->image(x_GetDockPositionImg(CDockWidget::eDock_Top));
  149.         button->clear_visible_focus();
  150.         button->callback(s_RedockTop_cb, this);
  151.         button->tooltip("Re-dock this window on the top");
  152.         control_x += control_btn_w + control_btn_spacing;
  153.         button = new Fl_Button(control_x, group->y() + 1,
  154.                                control_btn_w, control_btn_h);
  155.         button->box(FL_THIN_UP_FRAME);
  156.         button->image(x_GetDockPositionImg(CDockWidget::eDock_Bottom));
  157.         button->clear_visible_focus();
  158.         button->callback(s_RedockBottom_cb, this);
  159.         button->tooltip("Re-dock this window on the bottom");
  160.         control_x += control_btn_w + control_btn_spacing;
  161.         button = new Fl_Button(control_x, group->y() + 1,
  162.                                control_btn_w, control_btn_h);
  163.         button->box(FL_THIN_UP_FRAME);
  164.         button->image(x_GetDockCloseImg());
  165.         button->clear_visible_focus();
  166.         button->tooltip("Remove this view from the dock");
  167.         control_x += control_btn_w + control_btn_spacing;
  168.         //group->add
  169.         group->end();
  170.         add(group);
  171.     }}
  172.     if (m_Child) {
  173.         m_Child->box(FL_THIN_DOWN_BOX);
  174.         m_Child->resize(x(), y() + border_h, w(), h() + - border_h);
  175.         add(m_Child);
  176.         resizable(m_Child);
  177.     }
  178. }
  179. void CDockFrame::Detach(void)
  180. {
  181.     if (m_Child) {
  182.         remove(m_Child);
  183.         if (m_Owner) {
  184.             delete m_Child;
  185.         }
  186.     }
  187.     m_Child = NULL;
  188.     m_Owner = false;
  189. }
  190. int CDockFrame::handle(int event)
  191. {
  192.     return Fl_Group::handle(event);
  193. }
  194. void CDockFrame::x_Redock(CDockWidget::EDockPosition pos)
  195. {
  196.     if (m_Parent) {
  197.         bool old_owner = m_Owner;
  198.         m_Owner = false;
  199.         m_Parent->Undock(m_Child);
  200.         m_Parent->Dock(m_Child, pos, old_owner);
  201.     }
  202. }
  203. void CDockFrame::RedockLeft()
  204. {
  205.     x_Redock(CDockWidget::eDock_Left);
  206. }
  207. void CDockFrame::RedockRight()
  208. {
  209.     x_Redock(CDockWidget::eDock_Right);
  210. }
  211. void CDockFrame::RedockTop()
  212. {
  213.     x_Redock(CDockWidget::eDock_Top);
  214. }
  215. void CDockFrame::RedockBottom()
  216. {
  217.     x_Redock(CDockWidget::eDock_Bottom);
  218. }
  219. void CDockFrame::Remove()
  220. {
  221. }
  222. ////////////////////////////////////////////////////////////////////////////
  223. ///
  224. /// Control button images
  225. ///
  226. Fl_Pixmap* CDockFrame::sm_DockLeftImg = NULL;
  227. Fl_Pixmap* CDockFrame::sm_DockRightImg = NULL;
  228. Fl_Pixmap* CDockFrame::sm_DockTopImg = NULL;
  229. Fl_Pixmap* CDockFrame::sm_DockBottomImg = NULL;
  230. Fl_Pixmap* CDockFrame::sm_DockCloseImg = NULL;
  231. Fl_Pixmap* CDockFrame::x_GetDockPositionImg(CDockWidget::EDockPosition pos)
  232. {
  233.     switch (pos) {
  234.     case CDockWidget::eDock_Right:
  235.         {{
  236.             static const char * sc_DockRight[] = {
  237.                 "8 8 2 1",
  238.                 "  c None",
  239.                 ". c #444040",
  240.                 "         ",
  241.                 "   .     ",
  242.                 "   ..    ",
  243.                 "   ...   ",
  244.                 "   ...   ",
  245.                 "   ..    ",
  246.                 "   .     ",
  247.                 "         "
  248.             };
  249.             if ( !sm_DockRightImg) {
  250.                 sm_DockRightImg = new Fl_Pixmap(sc_DockRight);
  251.             }
  252.             return sm_DockRightImg;
  253.         }}
  254.         break;
  255.     case CDockWidget::eDock_Left:
  256.         {{
  257.             static const char * sc_DockLeft[] = {
  258.                 "8 8 2 1",
  259.                 "  c None",
  260.                 ". c #444040",
  261.                 "        ",
  262.                 "    .   ",
  263.                 "   ..   ",
  264.                 "  ...   ",
  265.                 "  ...   ",
  266.                 "   ..   ",
  267.                 "    .   ",
  268.                 "        "
  269.             };
  270.             if ( !sm_DockLeftImg) {
  271.                 sm_DockLeftImg = new Fl_Pixmap(sc_DockLeft);
  272.             }
  273.             return sm_DockLeftImg;
  274.         }}
  275.         break;
  276.     case CDockWidget::eDock_Bottom:
  277.         {{
  278.             static const char * sc_DockBottom[] = {
  279.                 "8 8 2 1",
  280.                 "  c None",
  281.                 ". c #444040",
  282.                 "        ",
  283.                 "        ",
  284.                 " ...... ",
  285.                 "  ....  ",
  286.                 "   ..   ",
  287.                 "        ",
  288.                 "        ",
  289.                 "        "
  290.             };
  291.             if ( !sm_DockBottomImg) {
  292.                 sm_DockBottomImg = new Fl_Pixmap(sc_DockBottom);
  293.             }
  294.             return sm_DockBottomImg;
  295.         }}
  296.         break;
  297.     case CDockWidget::eDock_Top:
  298.         {{
  299.             static const char * sc_DockTop[] = {
  300.                 "8 8 2 1",
  301.                 "  c None",
  302.                 ". c #444040",
  303.                 "        ",
  304.                 "        ",
  305.                 "   ..   ",
  306.                 "  ....  ",
  307.                 " ...... ",
  308.                 "        ",
  309.                 "        ",
  310.                 "        "
  311.             };
  312.             if ( !sm_DockTopImg) {
  313.                 sm_DockTopImg = new Fl_Pixmap(sc_DockTop);
  314.             }
  315.             return sm_DockTopImg;
  316.         }}
  317.         break;
  318.     default:
  319.         LOG_POST(Error << "Error: unhandled dock image type");
  320.         break;
  321.     }
  322.     return NULL;
  323. }
  324. Fl_Pixmap* CDockFrame::x_GetDockCloseImg(void)
  325. {
  326.     static const char * sc_DockClose[] = {
  327.         "8 8 3 1",
  328.         "  c None",
  329.         "* c #444040",
  330.         ". c #c0c0c0",
  331.         "        ",
  332.         " *.  .* ",
  333.         "  *..*  ",
  334.         "   **   ",
  335.         "   **   ",
  336.         "  *..*  ",
  337.         " *.  .* ",
  338.         "        "
  339.     };
  340.     if ( !sm_DockCloseImg) {
  341.         sm_DockCloseImg = new Fl_Pixmap(sc_DockClose);
  342.     }
  343.     return sm_DockCloseImg;
  344. }
  345. END_NCBI_SCOPE
  346. /*
  347.  * ===========================================================================
  348.  * $Log: dock_frame.cpp,v $
  349.  * Revision 1000.1  2004/06/01 21:08:22  gouriano
  350.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  351.  *
  352.  * Revision 1.2  2004/05/21 22:27:53  gorelenk
  353.  * Added PCH ncbi_pch.hpp
  354.  *
  355.  * Revision 1.1  2004/01/08 16:45:31  dicuccio
  356.  * Initial revision
  357.  *
  358.  * ===========================================================================
  359.  */