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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: command.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 21:04:46  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: command.cpp,v 1000.2 2004/06/01 21:04: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:  Andrey Yazhuk
  35.  *  CCommandTarget - a class capable of handling commands using command maps. 
  36.  *  CMenuBar - wrapps and extends Fl_Menu_Bar class.
  37.  */
  38. #include <ncbi_pch.hpp>
  39. #include <corelib/ncbistd.hpp>
  40. #include <corelib/ncbistl.hpp>
  41. #include <algorithm>
  42. #include <gui/utils/command.hpp>
  43. BEGIN_NCBI_SCOPE
  44. /// Traverses a list of Command Maps in order to locate a handler corresponding
  45. /// to the given command ID.
  46. const SCmdMapEntry* FindEntryByCmdID(const SCmdMap* pMap, TCmdID CmdID, 
  47.                                      SCmdMapEntry::EHandlerType type)
  48. {
  49.     const SCmdMapEntry* pEntry = 0;
  50.     while(pMap) {
  51.         for( pEntry = pMap->m_Entries; pEntry->m_CmdID != 0;  pEntry++ )    {
  52.             if(CmdID >= pEntry->m_CmdID  &&  CmdID <= pEntry->m_LastCmdID
  53.                                          &&  pEntry->m_HandlerType == type) 
  54.                 return pEntry; // handler is found
  55.         }        
  56.         pMap = pMap->m_BaseMap; // go to the command map of the base class
  57.     }
  58.     return NULL; // handler not found
  59. }
  60. ////////////////////////////////////////////////////////////////////////////////
  61. // class CCommandTarget
  62. const SCmdMap CCommandTarget::sm_CmdMap =
  63. {
  64. NULL, // no base class
  65. &CCommandTarget::sm_CmdMapEntries[0]
  66. };
  67. const SCmdMap* CCommandTarget::GetCommandMap() const
  68. {
  69. return &CCommandTarget::sm_CmdMap;
  70. }
  71. const SCmdMapEntry CCommandTarget::sm_CmdMapEntries[] =
  72. {
  73. { 0, 0, SCmdMapEntry::eInvalid, 0 } // no entries
  74. };
  75. void    CCommandTarget::OnFlMenuCommand(Fl_Menu_* f_menu, void* user_data)
  76. {
  77.     IMenu* menu = dynamic_cast<IMenu*>(f_menu);
  78.     if(menu)    {
  79.         CCommandTarget* target = menu->GetCmdTarget();
  80.         if(target)  {
  81.             TCmdID id = *((TCmdID*) user_data); //### temp
  82.             target->OnCommand(id);
  83.         } else {
  84.             ERR_POST(Error << "CCommandTargetGroup::OnFlMenuCommand 
  85.                             IMenu should have a root CCommandTarget.");
  86.         }
  87.     }
  88.     else {
  89.         ERR_POST(Error << "CCommandTargetGroup::OnFlMenuCommand can be 
  90.                             used only with "IMenu*" menus.");
  91.     }
  92. }
  93. bool    CCommandTarget::OnCommand(const TCmdID CmdID) 
  94. {
  95.     bool b_handled = x_HandleCommand(CmdID); 
  96.     if(! b_handled)  {
  97.         b_handled = x_ChildrenHandleCommand(CmdID); // pass to children
  98.     }
  99.     return b_handled;
  100. }
  101. bool    CCommandTarget::OnUpdateCommand(const TCmdID CmdID, ICmdUI* pCmdUI) 
  102. {
  103.     bool b_handled = x_UpdateCommand(CmdID, pCmdUI); 
  104.     if(! b_handled)  {
  105.         b_handled = x_ChildrenUpdateCommand(CmdID, pCmdUI); // pass to children        
  106.     }
  107.     return b_handled;
  108. }
  109. bool    CCommandTarget::AddChildCmdTarget(CCommandTarget* target)
  110. {
  111.     if(target  &&  
  112.        find(m_ChildTargets.begin(), m_ChildTargets.end(), target) == m_ChildTargets.end()) {
  113.        m_ChildTargets.push_back(target);
  114.        return true;
  115.     }
  116.     return false;
  117. }
  118. bool    CCommandTarget::RemoveChildCmdTarget(CCommandTarget* target)
  119. {
  120.     if(target)  {
  121.         TChildTargets::iterator it = find(m_ChildTargets.begin(), m_ChildTargets.end(), target);
  122.         if(it != m_ChildTargets.end()) {
  123.             m_ChildTargets.erase(it);
  124.             return true;
  125.         }
  126.     }
  127.     return false;
  128. }
  129. bool    CCommandTarget::x_HandleCommand(const TCmdID cmd)
  130. {
  131.     const SCmdMapEntry *pEntry = 
  132.         FindEntryByCmdID(GetCommandMap(), cmd, SCmdMapEntry::eCmd);
  133.     if(pEntry  &&  pEntry->m_Handler)
  134.     {
  135.         if(pEntry->m_LastCmdID > pEntry->m_CmdID)   { // range handler
  136.             FCmdHandler_ID handler = (FCmdHandler_ID) pEntry->m_Handler;
  137.             (this->*handler)(cmd);
  138.         } else {
  139.             FCmdHandler handler = pEntry->m_Handler;
  140.             (this->*handler)();            
  141.         }
  142.         return true;
  143.     }
  144.     else return false;
  145. }
  146. bool    CCommandTarget::x_UpdateCommand(const TCmdID cmd, ICmdUI* pCmdUI)
  147. {
  148.     const SCmdMapEntry *pEntry = 
  149.         FindEntryByCmdID(GetCommandMap(), cmd, SCmdMapEntry::eUpdateCmd);
  150.     if(pEntry  &&  pEntry->m_Handler)
  151.     {
  152.         FUpdateCmdHandler handler = (FUpdateCmdHandler) pEntry->m_Handler;
  153.         (*this.*handler)(pCmdUI);
  154.         return true;
  155.     }
  156.     else return false;
  157. }
  158. bool   CCommandTarget::x_ChildrenHandleCommand(const TCmdID cmd)
  159. {
  160.     NON_CONST_ITERATE(TChildTargets, it, m_ChildTargets)    {
  161.         if((*it)->OnCommand(cmd))
  162.             return true;
  163.     }
  164.     return false;
  165. }
  166. bool   CCommandTarget::x_ChildrenUpdateCommand(const TCmdID cmd, ICmdUI* pCmdUI)
  167. {
  168.     NON_CONST_ITERATE(TChildTargets, it, m_ChildTargets)    {
  169.         if((*it)->OnUpdateCommand(cmd, pCmdUI))
  170.             return true;
  171.     }
  172.     return false;
  173. }
  174. END_NCBI_SCOPE
  175. /*
  176.  * ===========================================================================
  177.  * $Log: command.cpp,v $
  178.  * Revision 1000.2  2004/06/01 21:04:46  gouriano
  179.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  180.  *
  181.  * Revision 1.6  2004/05/21 22:27:50  gorelenk
  182.  * Added PCH ncbi_pch.hpp
  183.  *
  184.  * Revision 1.5  2004/05/03 19:41:01  yazhuk
  185.  * Extended command handling to support command updates
  186.  *
  187.  * Revision 1.4  2004/01/15 20:08:07  yazhuk
  188.  * Moved most menu-related code to gui/widgets/gl/menu.cpp
  189.  *
  190.  * Revision 1.3  2004/01/08 19:36:51  yazhuk
  191.  * Added to CCommandTarget support for child targets. Added MENU_SEPARATOR macro.
  192.  * Added comments.
  193.  *
  194.  * revision 1.2  2003/10/15 21:14:24  yazhuk
  195.  * Fixed GCC warning
  196.  *
  197.  * revision 1.1  2003/10/03 16:01:38  yazhuk
  198.  * Initial revision
  199.  *
  200.  * ===========================================================================
  201.  */