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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: sel_list_controller.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/04/12 18:16:13  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_ALNMULTI___SEL_LIST_CONTROLLER__HPP
  10. #define GUI_WIDGETS_ALNMULTI___SEL_LIST_CONTROLLER__HPP
  11. /*  $Id: sel_list_controller.hpp,v 1000.3 2004/04/12 18:16:13 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Andrey Yazhuk
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbistl.hpp>
  42. #include <gui/widgets/aln_multiple/list_mvc.hpp>
  43. #include <gui/widgets/gl/ievent_handler.hpp>
  44. #include <FL/Enumerations.H>
  45. BEGIN_NCBI_SCOPE
  46. ////////////////////////////////////////////////////////////////////////////////
  47. /// class CSelListController
  48. template <class Item>   class CSelListController : public IEventHandler
  49. {
  50. public:
  51.     typedef Item TItem;
  52.     typedef ISelListModel<Item> TSelListModel;
  53.     CSelListController();
  54.     virtual ~CSelListController();
  55.     /// IEventHandler implementation.
  56.     virtual int     handle(CGUIEvent& event, CGlPane& Pane);
  57. protected:        
  58.     // specialized event handlers
  59.     virtual int x_OnMousePush(CGUIEvent& event);
  60.     virtual int x_OnMouseDrag(CGUIEvent& event);
  61.     virtual int x_OnMouseRelease(CGUIEvent& event);
  62.     virtual int x_OnMouseMove();
  63.     virtual int x_OnMouseWheel();
  64.     virtual int x_OnKeyDown(CGUIEvent& event);
  65.     
  66.     // functions to be overriden in the inherited class
  67.     virtual TSelListModel* SLC_GetModel() = 0;
  68.     virtual int     SLC_GetLineByWindowY(int WinY, bool b_clip = false) = 0; 
  69.     virtual int     SLC_GetHeight() = 0; // view size in pixels
  70.     virtual void    SLC_VertScrollToMakeVisible(int index) = 0;
  71.          
  72.     void    x_MoveSelectionBy(int Shift, bool bShift, bool bCtrl);
  73.     void    x_MoveSelLineByPage(bool bDown, bool bShift, bool bCtrl);
  74.     void    x_SelectTo(int index, bool bShift, bool bCtrl);
  75.     void    x_SelectFocusedItem(bool bDeselectEn);
  76.     
  77. protected:
  78.     bool    m_bProcessMouseUp;
  79. };
  80. template<class Item>
  81.     CSelListController<Item>::CSelListController()
  82. :   m_bProcessMouseUp(false)
  83. {
  84. }
  85. template<class Item>
  86.     CSelListController<Item>::~CSelListController()
  87. {
  88. }
  89. template<class Item>
  90.     int CSelListController<Item>::handle(CGUIEvent& event, CGlPane& pane)
  91. {
  92.     switch(event.GetFLTKEvent())   {
  93.     case FL_PUSH: return x_OnMousePush(event);
  94.     case FL_DRAG: return x_OnMouseDrag(event);
  95.     case FL_RELEASE: return x_OnMouseRelease(event);
  96.     case FL_MOVE: return x_OnMouseMove();
  97.     case FL_MOUSEWHEEL: return x_OnMouseWheel();
  98.     case FL_KEYDOWN: return x_OnKeyDown(event);
  99.     default: return 0;
  100.     }
  101. }
  102. template<class Item>
  103.     int CSelListController<Item>::x_OnMousePush(CGUIEvent& event)
  104. {
  105.     m_bProcessMouseUp = false;
  106.     TSelListModel* pModel = SLC_GetModel();
  107.     
  108.     if(pModel) {        
  109.         int index = SLC_GetLineByWindowY(Fl::event_y(), true);
  110.         CGUIEvent::EGUIState state = event.GetGUIState();
  111.     
  112.         int Btn = Fl::event_button(); //###
  113.         
  114.         if(index == -1) {
  115.             m_bProcessMouseUp = true;
  116.         }
  117.         else {
  118.             if(event.GetGUISignal() == CGUIEvent::eSelectSignal)    {
  119.                 if(Btn == FL_LEFT_MOUSE)  { // left mouse button pressed
  120.                     //if(State == 0)  {
  121.                     if(state == CGUIEvent::eSelectState)    {
  122.                         m_bProcessMouseUp = pModel->SLM_IsItemSelected(index);
  123.                         if(m_bProcessMouseUp)
  124.                                 pModel->SLM_FocusItem(index); // change focus, selection will be changed on MouseUp
  125.                         else    pModel->SLM_SelectSingleItem(index);
  126.                     //} else if(State & FL_SHIFT) {
  127.                     } else if(state == CGUIEvent::eSelectExtState)    {
  128.                         pModel->SLM_SelectTo(index);
  129.                     //} else if(State == FL_CTRL)  {
  130.                     } else if(state == CGUIEvent::eSelectIncState)    {
  131.                         m_bProcessMouseUp = true;
  132.                     }
  133.                 }
  134.                 else if(Btn == FL_RIGHT_MOUSE) { // right mouse buttton pressed
  135.                     //if(State == 0)  {
  136.                     if(state == CGUIEvent::eSelectState)    {
  137.                         pModel->SLM_SelectSingleItem(index);
  138.                     //} else if(State & FL_SHIFT) {
  139.                      } else if(state == CGUIEvent::eSelectExtState)    {
  140.                         m_bProcessMouseUp = true;
  141.                     }
  142.                 }
  143.             }
  144.         }
  145.     }
  146.     fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE);
  147.     return 1;
  148. }
  149. template<class Item>
  150.     int CSelListController<Item>::x_OnMouseDrag(CGUIEvent& event)
  151. {
  152.     m_bProcessMouseUp = false;
  153.     fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE);
  154.     return 1;
  155. }
  156. template<class Item>
  157.     int CSelListController<Item>::x_OnMouseRelease(CGUIEvent& event)
  158. {
  159.     TSelListModel* pModel = SLC_GetModel();
  160.     if(pModel && m_bProcessMouseUp)  {
  161.         int index = SLC_GetLineByWindowY(Fl::event_y(), true);
  162.         CGUIEvent::EGUIState state = event.GetGUIState();
  163.         int Btn = Fl::event_button();
  164.         
  165.         if(index == -1) {
  166.             pModel->SLM_SelectAll(false);
  167.         }   else {
  168.             //if(Btn == FL_LEFT_MOUSE  &&  State == FL_CTRL) {
  169.             if(Btn == FL_LEFT_MOUSE  &&  state == CGUIEvent::eSelectIncState) {
  170.                 pModel->SLM_InvertSingleItem(index);
  171.             } else if((Btn == FL_LEFT_MOUSE  &&  state == CGUIEvent::eSelectState) 
  172.                         || (Btn == FL_RIGHT_MOUSE  &&  state == CGUIEvent::eSelectExtState)) {
  173.                 pModel->SLM_SelectSingleItem(index);
  174.             }
  175.         }
  176.     }
  177.     m_bProcessMouseUp = false;
  178.     fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE);
  179.     return 1;
  180. }
  181. template<class Item>
  182.     int CSelListController<Item>::x_OnMouseMove()
  183. {
  184.     fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE);
  185.     return 1;
  186. }
  187. template<class Item>
  188.     int CSelListController<Item>::x_OnMouseWheel()
  189. {
  190.     fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE);
  191.     return 0;
  192. }
  193. template<class Item>
  194.     int CSelListController<Item>::x_OnKeyDown(CGUIEvent& event)
  195. {
  196.     TSelListModel* pModel = SLC_GetModel();
  197.     if(pModel) {            
  198.         int Key = Fl::event_key();
  199.         CGUIEvent::EGUIState state = event.GetGUIState();
  200.         //bool b_shift = (Fl::event_state() & FL_SHIFT) != 0;
  201.         //bool b_ctrl = (Fl::event_state() & FL_CTRL) != 0;
  202.         bool b_shift = state == CGUIEvent::eSelectExtState;
  203.         bool b_ctrl = state == CGUIEvent::eSelectIncState;
  204.         switch(Key) {
  205.         case FL_Home: x_SelectTo(0, b_shift, b_ctrl); break;
  206.         case FL_End:  x_SelectTo(pModel->SLM_GetItemsCount()-1, b_shift, b_ctrl); break;
  207.         case FL_Down: x_MoveSelectionBy(1, b_shift, b_ctrl); break;
  208.         case FL_Up:   x_MoveSelectionBy(-1, b_shift, b_ctrl); break;
  209.         case FL_Page_Up:    x_MoveSelLineByPage(false, b_shift, b_ctrl);  break;
  210.         case FL_Page_Down:  x_MoveSelLineByPage(true, b_shift, b_ctrl);  break;    
  211.         case ' ': x_SelectFocusedItem(b_ctrl); break;
  212.         case 'a': 
  213.         case 'A': if(b_ctrl) pModel->SLM_SelectAll(true); break;
  214.         }    
  215.     }
  216.     return 0;
  217. }
  218. template<class Item>
  219.     void CSelListController<Item>::x_MoveSelectionBy(int Shift, bool b_shift, bool b_ctrl)
  220. {
  221.     TSelListModel* pModel = SLC_GetModel();
  222.     if(pModel) {        
  223.         int N = pModel->SLM_GetItemsCount();
  224.         if(N > 0)   {
  225.             int iFocused = pModel->SLM_GetFocusedItemIndex();
  226.             iFocused = max(iFocused, 0);
  227.             iFocused += Shift;
  228.             
  229.             iFocused = max(iFocused, 0);
  230.             iFocused = min(iFocused, N - 1);
  231.             x_SelectTo(iFocused, b_shift, b_ctrl);
  232.         }
  233.     }
  234. }
  235. template<class Item>
  236.     void CSelListController<Item>::x_SelectTo(int index, bool b_shift, bool b_ctrl)
  237. {
  238.     TSelListModel* pModel = SLC_GetModel();
  239.     if(pModel) {        
  240.         if(b_shift)  {
  241.             pModel->SLM_SelectTo(index);
  242.         } else  {
  243.             if(b_ctrl)   {
  244.                 pModel->SLM_FocusItem(index);
  245.             }   else  {
  246.                 pModel->SLM_SelectSingleItem(index);
  247.             }
  248.         }
  249.         SLC_VertScrollToMakeVisible(index);
  250.     }
  251. }
  252.  
  253. template<class Item>   
  254.     void CSelListController<Item>::x_MoveSelLineByPage(bool bDown, bool b_shift, bool b_ctrl)
  255. {
  256.     TSelListModel* pModel = SLC_GetModel();    
  257.     if(pModel)  {
  258.         if(bDown)   { // page Down
  259.             int PosY = SLC_GetHeight();
  260.             int iBottom = SLC_GetLineByWindowY(PosY);
  261.             int iFocused = pModel->SLM_GetFocusedItemIndex();
  262.             if(iFocused == iBottom) { // page down
  263.                 PosY += PosY;
  264.                 iBottom = SLC_GetLineByWindowY(PosY);
  265.             }
  266.             if(iBottom == -1)
  267.                 iBottom = pModel->SLM_GetItemsCount()-1;
  268.             
  269.             x_SelectTo(iBottom, b_shift, b_ctrl);
  270.         } else { // page Up
  271.             int iTop = SLC_GetLineByWindowY(0);
  272.             int iFocused = pModel->SLM_GetFocusedItemIndex();
  273.             if(iFocused == iTop) { // page down
  274.                 int PosY = SLC_GetHeight();            
  275.                 iTop = SLC_GetLineByWindowY(PosY);
  276.             }
  277.             if(iTop == -1)
  278.                 iTop = min(0, pModel->SLM_GetItemsCount()-1);
  279.             if(iTop > -1)
  280.                 x_SelectTo(iTop, b_shift, b_ctrl);
  281.         }
  282.     }
  283. }
  284. template<class Item>
  285.     void CSelListController<Item>::x_SelectFocusedItem(bool bDeselectEn)
  286. {
  287.     TSelListModel* pModel = SLC_GetModel();
  288.     if(pModel) {        
  289.         int iFocused = pModel->SLM_GetFocusedItemIndex();
  290.         if(iFocused != -1)  {
  291.             bool bSel = pModel->SLM_IsItemSelected(iFocused);
  292.             if( ! bSel  ||  (bSel  &&  bDeselectEn))
  293.                 pModel->SLM_InvertSingleItem(iFocused);
  294.         }
  295.     }
  296. }
  297. END_NCBI_SCOPE
  298. /*
  299.  * ===========================================================================
  300.  * $Log: sel_list_controller.hpp,v $
  301.  * Revision 1000.3  2004/04/12 18:16:13  gouriano
  302.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.9
  303.  *
  304.  * Revision 1.9  2004/03/17 20:08:00  yazhuk
  305.  * Removed obsolete includes
  306.  *
  307.  * Revision 1.8  2004/01/15 20:10:05  yazhuk
  308.  * Fixed "invisible items are selected" bug, clean-up
  309.  *
  310.  * Revision 1.7  2003/12/22 16:29:22  yazhuk
  311.  * Bugfix for x_OnMouseWheel()
  312.  *
  313.  * Revision 1.6  2003/12/18 21:17:44  yazhuk
  314.  * Converted CSelListController to template class
  315.  *
  316.  * Revision 1.5  2003/12/01 16:42:13  yazhuk
  317.  * Refactored event handling - introduced CGUIEvent
  318.  *
  319.  * Revision 1.4  2003/11/17 21:17:23  yazhuk
  320.  * Updated include for ievent_handler.hpp
  321.  *
  322.  * Revision 1.3  2003/10/20 15:45:31  yazhuk
  323.  * Inherited from IEventHandler
  324.  *
  325.  * Revision 1.2  2003/09/23 20:45:14  yazhuk
  326.  * Added #include <corelib/ncbistl.hpp>
  327.  *
  328.  * Revision 1.1  2003/09/10 20:56:44  yazhuk
  329.  * Moved CSelListController to a separate file
  330.  *
  331.  * ===========================================================================
  332.  */
  333. #endif  // GUI_WIDGETS_ALNMULTI___SEL_LIST_CONTROLLER__HPP