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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: child_frame.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:14:10  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: child_frame.cpp,v 1000.1 2004/06/01 21:14:10 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.  *    CChildFrame -- internal widget class that represents the frame
  38.  *                   surrounding a given MDI child
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include "child_frame.hpp"
  42. #include <FL/fl_draw.H>
  43. BEGIN_NCBI_SCOPE
  44. //
  45. // look-and-feel statics
  46. //
  47. Fl_Boxtype CChildFrame::sm_SysButtonBox     = FL_UP_BOX;
  48. Fl_Color   CChildFrame::sm_SysButtonColor   = fl_rgb_color(224, 224, 224);
  49. Fl_Color   CChildFrame::sm_SelectedColor    = fl_rgb_color(  0,   0, 128);
  50. Fl_Font    CChildFrame::sm_TitleFont        = FL_HELVETICA_BOLD;
  51. int        CChildFrame::sm_TitleAlign       = FL_ALIGN_CENTER | FL_ALIGN_INSIDE;
  52. int        CChildFrame::sm_TitleSize        = 12;
  53. Fl_Color   CChildFrame::sm_TitleColor       = fl_rgb_color(224, 224, 0);
  54. int        CChildFrame::sm_TitleBarHeight = 15;
  55. //
  56. // static accessors
  57. //
  58. //
  59. // system button box type - this is the outline box type for the system button
  60. // tray
  61. // 
  62. Fl_Boxtype CChildFrame::GetSysButtonBox(void)
  63. {
  64.     return sm_SysButtonBox;
  65. }
  66. void CChildFrame::SetSysButtonBox(Fl_Boxtype box)
  67. {
  68.     sm_SysButtonBox = box;
  69. }
  70. //
  71. // system button color - this defines the background color for the system
  72. // buttons
  73. //
  74. Fl_Color CChildFrame::GetSysButtonColor(void)
  75. {
  76.     return sm_SysButtonColor;
  77. }
  78. void CChildFrame::SetSysButtonColor(Fl_Color color)
  79. {
  80.     sm_SysButtonColor = color;
  81. }
  82. //
  83. // selected color - this is the background color for the title when selected
  84. //
  85. Fl_Color CChildFrame::GetSelectedColor(void)
  86. {
  87.     return sm_SelectedColor;
  88. }
  89. void CChildFrame::SetSelectedColor(Fl_Color color)
  90. {
  91.     sm_SelectedColor = color;
  92. }
  93. //
  94. // title bar height - this is used internally to set the height of a title bar
  95. //
  96. int CChildFrame::GetTitleBarHeight(void)
  97. {
  98.     return sm_TitleBarHeight;
  99. }
  100. void CChildFrame::SetTitleBarHeight(int h)
  101. {
  102.     sm_TitleBarHeight = h;
  103. }
  104. //
  105. // title color - this is the color of the text in the title bar
  106. //
  107. Fl_Color CChildFrame::GetTitleColor(void)
  108. {
  109.     return sm_TitleColor;
  110. }
  111. void CChildFrame::SetTitleColor(Fl_Color color)
  112. {
  113.     sm_TitleColor = color;
  114. }
  115. //
  116. // title font - default is bold, helvetica font
  117. //
  118. Fl_Font CChildFrame::GetTitleFont(void)
  119. {
  120.     return sm_TitleFont;
  121. }
  122. void CChildFrame::SetTitleFont(Fl_Font font)
  123. {
  124.     sm_TitleFont = font;
  125. }
  126. //
  127. // title alignment - bitmask of Fl_Align styles
  128. //
  129. int CChildFrame::GetTitleAlign(void)
  130. {
  131.     return sm_TitleAlign;
  132. }
  133. void CChildFrame::SetTitleAlign(int align)
  134. {
  135.     sm_TitleAlign = align;
  136. }
  137. //
  138. // title size - font height in pixels (not points!)
  139. //
  140. int CChildFrame::GetTitleSize(void)
  141. {
  142.     return sm_TitleSize;
  143. }
  144. void CChildFrame::SetTitleSize(int size)
  145. {
  146.     sm_TitleSize = size;
  147. }
  148. //
  149. // 
  150. // CChildFrame
  151. //
  152. //
  153. CChildFrame::CChildFrame(int x, int y, int w, int h, const char* label)
  154.     : Fl_Window(x, y, w, h, label),
  155.       m_TitleBar(NULL),
  156.       m_Title(NULL),
  157.       m_SysButtons(NULL),
  158.       m_Child(NULL)
  159. {
  160.     m_SavedPos[0] = m_SavedPos[1] = m_SavedPos[2] = m_SavedPos[3] = 0;
  161. }
  162. CChildFrame::~CChildFrame()
  163. {
  164.     // detach our child, if it exists
  165.     if (m_Child) {
  166.         remove(m_Child);
  167.     }
  168. }
  169. void CChildFrame::Attach(CChild* child)
  170. {
  171.     Detach();
  172.     m_Child = child;
  173.     if (m_Child) {
  174.         add(m_Child);
  175.         resizable(m_Child);
  176.         m_Child->position(Fl::box_dx(box()),
  177.                           Fl::box_dy(box()) + GetTitleBarHeight());
  178.         m_Child->x_SetFrame(this);
  179.     }
  180. }
  181. void CChildFrame::Detach(void)
  182. {
  183.     if (m_Child) {
  184.         remove(m_Child);
  185.         m_Child->x_SetFrame(NULL);
  186.     }
  187. }
  188. int CChildFrame::handle(int event)
  189. {
  190.     int last_x = m_LastMousePos.first;
  191.     int last_y = m_LastMousePos.second;
  192.     m_LastMousePos.first  = Fl::event_x();
  193.     m_LastMousePos.second = Fl::event_y();
  194.     switch (event) {
  195.     case FL_PUSH:
  196.         m_DragState = eIdle;
  197.         if (Fl::event_shift()  ||  Fl::event_ctrl()  ||
  198.             Fl::event_alt()    ||  Fl::event_button() != 1  ||
  199.             GetMaximized()  ||
  200.             Fl::event_inside(m_SysButtons)  ||
  201.             Fl::event_inside(m_Child)) {
  202.             break;
  203.         }
  204.         if (Fl::event_inside(m_TitleBar)) {
  205.             m_DragState = eMoving;
  206.         } else {
  207.             m_DragState = eResizing;
  208.             // we also need to determine which edges we're dragging
  209.             m_BorderDrag = 0;
  210.             if (Fl::event_x() < 10) {
  211.                 m_BorderDrag |= fLeftBorderDrag;
  212.             } else if ( w() - Fl::event_x() < 10) {
  213.                 m_BorderDrag |= fRightBorderDrag;
  214.             }
  215.             if (Fl::event_y() < 10) {
  216.                 m_BorderDrag |= fTopBorderDrag;
  217.             } else if (h() - Fl::event_y() < 10) {
  218.                 m_BorderDrag |= fBottomBorderDrag;
  219.             }
  220.         }
  221.         m_DragSize[0] = x();
  222.         m_DragSize[1] = y();
  223.         m_DragSize[2] = w();
  224.         m_DragSize[3] = h();
  225.         return 1;
  226.     case FL_DRAG:
  227.         if (Fl::event_shift()  ||  Fl::event_ctrl()  ||  Fl::event_alt()  ||
  228.             Fl::event_button() != 1) {
  229.             m_DragState = eIdle;
  230.             break;
  231.         }
  232.         switch (m_DragState) {
  233.         case eNormal:
  234.             break;
  235.         case eMoving:
  236.             // title bar drag = move window
  237.             {{
  238.                  int new_x = m_DragSize[0] + Fl::event_x() - last_x;
  239.                  int new_y = m_DragSize[1] + Fl::event_y() - last_y;
  240.                  new_x = max(0, new_x);
  241.                  new_y = max(0, new_y);
  242.                  new_x = min(parent()->w() - 100, new_x);
  243.                  new_y = min(parent()->h() - sm_TitleBarHeight, new_y);
  244.                  m_DragSize[0] = new_x;
  245.                  m_DragSize[1] = new_y;
  246.                  window()->cursor(FL_CURSOR_MOVE);
  247.                  window()->make_current();
  248.                  fl_line_style(0, 2);
  249.                  fl_overlay_rect(m_DragSize[0], m_DragSize[1],
  250.                                  m_DragSize[2], m_DragSize[3]);
  251.                  fl_line_style(0, 1);
  252.              }}
  253.             return 1;
  254.         case eResizing:
  255.             {{
  256.                  int dx = 0;
  257.                  int dy = 0;
  258.                  int dw = 0;
  259.                  int dh = 0;
  260.                  int mouse_x = Fl::event_x();
  261.                  int mouse_y = Fl::event_y();
  262.                  if (m_BorderDrag & fLeftBorderDrag) {
  263.                      dx = mouse_x - last_x;
  264.                      dw -= dx;
  265.                  } else if (m_BorderDrag & fRightBorderDrag) {
  266.                      dw = mouse_x - last_x;
  267.                  }
  268.                  if (m_BorderDrag & fTopBorderDrag) {
  269.                      dy = mouse_y - last_y;
  270.                      dh -= dy;
  271.                  } else if (m_BorderDrag & fBottomBorderDrag) {
  272.                      dh = mouse_y - last_y;
  273.                  }
  274.                  m_DragSize[0] += dx;
  275.                  m_DragSize[1] += dy;
  276.                  m_DragSize[2] += dw;
  277.                  m_DragSize[3] += dh;
  278.                  m_DragSize[2] = max(100, m_DragSize[2]);
  279.                  m_DragSize[3] = max(100, m_DragSize[3]);
  280.                  
  281.                  window()->make_current();
  282.                  fl_line_style(0, 2);
  283.                  fl_overlay_rect(m_DragSize[0], m_DragSize[1],
  284.                                  m_DragSize[2], m_DragSize[3]);
  285.                  fl_line_style(0, 1);
  286.              }}
  287.             return 1;
  288.         default:
  289.             break;
  290.         }
  291.         break;
  292.     case FL_RELEASE:
  293.         switch (m_DragState) {
  294.         case eMoving:
  295.         case eResizing:
  296.             {{
  297.                  int min_x = min(x(), m_DragSize[0]);
  298.                  int min_y = min(y(), m_DragSize[1]);
  299.                  int max_x = max(x() + w(), m_DragSize[0] + m_DragSize[2]);
  300.                  int max_y = max(y() + w(), m_DragSize[1] + m_DragSize[3]);
  301.                  resize(m_DragSize[0], m_DragSize[1],
  302.                         m_DragSize[2], m_DragSize[3]);
  303.                  /**
  304.                  parent()->damage(FL_DAMAGE_ALL,
  305.                                   min_x, min_y, max_x - min_x, max_y - min_y);
  306.                                   **/
  307.              }}
  308.             window()->cursor(FL_CURSOR_DEFAULT);
  309.             window()->make_current();
  310.             fl_line_style(0, 2);
  311.             fl_overlay_clear();
  312.             fl_line_style(0, 1);
  313.             m_DragState = eIdle;
  314.             return 1;
  315.         default:
  316.             break;
  317.         }
  318.     default:
  319.         break;
  320.     }
  321.     return Fl_Window::handle(event);
  322. }
  323. void CChildFrame::label(const char* text)
  324. {
  325.     m_Title->label(text);
  326. }
  327. const char* CChildFrame::label(void) const
  328. {
  329.     return m_TitleBar->label();
  330. }
  331. END_NCBI_SCOPE
  332. /*
  333.  * ===========================================================================
  334.  * $Log: child_frame.cpp,v $
  335.  * Revision 1000.1  2004/06/01 21:14:10  gouriano
  336.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  337.  *
  338.  * Revision 1.6  2004/05/21 22:27:56  gorelenk
  339.  * Added PCH ncbi_pch.hpp
  340.  *
  341.  * Revision 1.5  2003/07/25 13:38:44  dicuccio
  342.  * Minor clean-up in issuing redraw events
  343.  *
  344.  * Revision 1.4  2003/03/17 14:55:41  dicuccio
  345.  * Lots of clean-up.  Fixed memory leaks in test program; added more explicit
  346.  * destruction pathway to support integration into Genome Workbench.  Added
  347.  * explicit calls to cascade / tile widgets in a toplevel workspace.
  348.  *
  349.  * Revision 1.3  2003/03/07 18:14:58  dicuccio
  350.  * Code clean-up.  Added missing accessors for look-n-feel statics; aligned
  351.  * accessors in code
  352.  *
  353.  * Revision 1.2  2003/03/07 17:49:25  dicuccio
  354.  * Small clean-ups.  Added description for each class.
  355.  *
  356.  * Revision 1.1  2003/03/07 17:36:08  dicuccio
  357.  * Initial revision
  358.  *
  359.  * ===========================================================================
  360.  */