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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: menu_demo_window.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 21:30:49  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: menu_demo_window.cpp,v 1000.0 2004/06/01 21:30:49 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.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbidiag.hpp>
  41. #include "menu_demo.hpp"
  42. #include <FL/Fl_Tile.H>
  43. USING_NCBI_SCOPE;
  44. enum ETestCommands  {
  45.     eCmdFirst = 5000,
  46.     eCmdSecond,
  47.     eCmdThird,
  48.     eCmdRadioA,
  49.     eCmdRadioB,
  50.     eCmdRadioC,
  51.     eCmdCheck1,
  52.     eCmdCheck2
  53. };
  54. static
  55. DEFINE_MENU(Menu)   
  56.     SUBMENU("&Zoom")
  57.         MENU_ITEM_IM(eCmdZoomIn, "Zoom &In", "menu::zoom_in")
  58.         MENU_ITEM_IM(eCmdZoomIn, "Zoom &Out", "menu::zoom_out")
  59.         MENU_ITEM_IM(eCmdZoomIn, "Zoom &All", "menu::zoom_all")
  60.         MENU_ITEM_IM(eCmdZoomSel, "Zoom &Sel", "menu::zoom_sel")
  61.         MENU_SEPARATOR()    
  62.         SUBMENU("&More...")
  63.             MENU_ITEM(eCmdZoomIn, "Zoom &In")
  64.             MENU_ITEM(eCmdZoomOut, "Zoom &Out")
  65.             MENU_ITEM(eCmdZoomAll, "Zoom &All")
  66.             MENU_ITEM(eCmdZoomSel, "Zoom &Sel")        
  67.         END_SUBMENU()
  68.         SUBMENU("&Even More...")
  69.             MENU_ITEM(eCmdZoomIn, "Zoom &In")
  70.             MENU_ITEM(eCmdZoomOut, "Zoom &Out")
  71.             MENU_ITEM(eCmdZoomAll, "Zoom &All")
  72.             MENU_ITEM(eCmdZoomSel, "Zoom &Sel")        
  73.         END_SUBMENU()
  74.     END_SUBMENU()
  75.     SUBMENU("&Updates")
  76.         MENU_ITEM(eCmdFirst, "&First")
  77.         MENU_ITEM(eCmdSecond, "&Second")
  78.         MENU_ITEM(eCmdThird, "&Third")
  79.         MENU_SEPARATOR()
  80.         MENU_ITEM(eCmdRadioA, "Radio A")
  81.         MENU_ITEM(eCmdRadioB, "Radio B")
  82.         MENU_ITEM(eCmdRadioC, "Radio C")    
  83.         MENU_SEPARATOR()
  84.         MENU_ITEM(eCmdCheck1, "Check 1")    
  85.         MENU_ITEM(eCmdCheck2, "Check 2")    
  86.     END_SUBMENU()   
  87.     MENU_SEPARATOR()
  88.     MENU_ITEM_IM(eCmdZoomIn, "Zoom &In", "menu::zoom_in")
  89.     MENU_ITEM_IM(eCmdZoomIn, "Zoom &Out", "menu::zoom_out")
  90. END_MENU()
  91. static
  92. DEFINE_MENU(ToolBar)   
  93.     MENU_ITEM_IM(eCmdZoomIn, "Zoom In", "menu::zoom_in")
  94.     MENU_ITEM_IM(eCmdZoomOut, "Zoom Out", "menu::zoom_out")
  95.     MENU_ITEM_IM(eCmdZoomAll, "Zoom All", "menu::zoom_all")      
  96.     MENU_ITEM_IM(eCmdZoomSel, "Zoom &Sel", "menu::zoom_sel") 
  97.     MENU_SEPARATOR()
  98.     MENU_ITEM_IM(eCmdZoomIn, "", "menu::zoom_in")
  99.     MENU_ITEM_IM(eCmdZoomOut, "", "menu::zoom_out")
  100.     MENU_ITEM_IM(eCmdZoomAll, "", "menu::zoom_all")       
  101.     MENU_ITEM_IM(eCmdZoomSel, "", "menu::zoom_sel")
  102.     MENU_SEPARATOR()
  103.     MENU_ITEM(eCmdZoomIn, "Zoom In")
  104.     MENU_ITEM(eCmdZoomOut, "Zoom Out")
  105.     MENU_ITEM(eCmdZoomAll, "Zoom All")       
  106.     MENU_ITEM(eCmdZoomSel, "Zoom &Sel")
  107. END_MENU()
  108. ////////////////////////////////////////////////////////////////////////////////
  109. ///
  110. CMenuDemoClient::CMenuDemoClient(int x, int y, int w, int h)
  111. : CDiagPanel(x, y, w, h)
  112. {
  113.     m_Index = 3;
  114.     m_Radio = 'A';
  115.     m_Check1 = true;
  116.     m_Check1 = false;
  117. }
  118. BEGIN_CMD_MAP(CMenuDemoClient, CCommandTarget)
  119.     ON_COMMAND(eCmdZoomIn, &CMenuDemoClient::OnZoomIn)
  120.     ON_COMMAND(eCmdZoomOut, &CMenuDemoClient::OnZoomOut)
  121.     ON_COMMAND(eCmdZoomAll, &CMenuDemoClient::OnZoomAll)
  122.     ON_COMMAND(eCmdZoomSel, &CMenuDemoClient::OnZoomSel)
  123.     
  124.     ON_COMMAND(eCmdFirst, &CMenuDemoClient::OnFirst)
  125.     ON_COMMAND(eCmdSecond, &CMenuDemoClient::OnSecond)
  126.     ON_COMMAND(eCmdThird, &CMenuDemoClient::OnThird)    
  127.     // register update handler enabling/disabling commands
  128.     ON_UPDATE_COMMAND_UI(eCmdFirst, &CMenuDemoClient::OnUpdateFirst)
  129.     ON_UPDATE_COMMAND_UI(eCmdSecond, &CMenuDemoClient::OnUpdateSecond)
  130.     ON_UPDATE_COMMAND_UI(eCmdThird, &CMenuDemoClient::OnUpdateThird)
  131.     
  132.     // register one command handler and one update handler for 
  133.     // [eCmdRadioA..eCmdRadioC] command range
  134.     ON_COMMAND_RANGE(eCmdRadioA, eCmdRadioC, &CMenuDemoClient::OnRadio)
  135.     ON_UPDATE_COMMAND_UI_RANGE(eCmdRadioA, eCmdRadioC, &CMenuDemoClient::OnUpdateRadio)
  136.     
  137.     ON_COMMAND(eCmdCheck1, &CMenuDemoClient::OnCheck1)
  138.     ON_COMMAND(eCmdCheck2, &CMenuDemoClient::OnCheck2)
  139.     
  140.     // register update handler checkin/unchecking items
  141.     ON_UPDATE_COMMAND_UI(eCmdCheck1, &CMenuDemoClient::OnUpdateCheck1)
  142.     ON_UPDATE_COMMAND_UI(eCmdCheck2, &CMenuDemoClient::OnUpdateCheck2)        
  143. END_CMD_MAP()
  144. int     CMenuDemoClient::handle(int event)
  145. {
  146.     // Popup menu should be shown on CGUIEvent::ePopupSignal, however it is not 
  147.     // possible in this example, so we use FL_PUSH
  148.     if(event == FL_PUSH) {        
  149.         
  150.         CPopupMenu1 menu(Fl::event_x_root(), Fl::event_y_root(), Menu, this);
  151.         menu.Popup();
  152.         
  153.         return 1;
  154.     }
  155.     return CDiagPanel::handle(event);
  156. }
  157. void    CMenuDemoClient::PostMessage(const char* message)
  158. {
  159.     Post(SDiagMessage(eDiag_Info, message, strlen(message)));
  160. }
  161. void    CMenuDemoClient::OnZoomIn()
  162. {
  163.     PostMessage("OnZoomIn()");
  164. }
  165. void    CMenuDemoClient::OnZoomOut()
  166. {
  167.     PostMessage("OnZoomOut()");
  168. }
  169. void    CMenuDemoClient::OnZoomAll()
  170. {
  171.     PostMessage("OnZoomAll()");
  172. }
  173. void    CMenuDemoClient::OnZoomSel()
  174. {
  175.     PostMessage("OnZoomSel()");
  176. }
  177. void    CMenuDemoClient::OnFirst()
  178. {
  179.     m_Index = 1;
  180.     PostMessage("OnFirst()");
  181. }
  182. void    CMenuDemoClient::OnSecond()
  183. {
  184.     m_Index = 2;
  185.     PostMessage("OnSecond()");
  186. }
  187. void    CMenuDemoClient::OnThird()
  188. {
  189.     m_Index = 3;
  190.     PostMessage("OnThird()");
  191. }
  192. void    CMenuDemoClient::OnUpdateFirst(ICmdUI* pCmdUI)
  193. {
  194.     pCmdUI->Enable(m_Index != 1);
  195.     PostMessage("OnUpdateFirst()");
  196. }
  197. void    CMenuDemoClient::OnUpdateSecond(ICmdUI* pCmdUI)
  198. {
  199.     pCmdUI->Enable(m_Index != 2);
  200.     PostMessage("OnUpdateSecond()");
  201. }
  202. void    CMenuDemoClient::OnUpdateThird(ICmdUI* pCmdUI)
  203. {
  204.     pCmdUI->Enable(m_Index != 3);
  205.     PostMessage("OnUpdateThird()");
  206. }
  207. void    CMenuDemoClient::OnRadio(TCmdID cmd)
  208. {
  209.     switch(cmd)    {
  210.     case eCmdRadioA: m_Radio = 'A'; break;
  211.     case eCmdRadioB: m_Radio = 'B'; break;
  212.     case eCmdRadioC: m_Radio = 'C'; break;
  213.     };
  214.     string s = "OnRadio() for ";
  215.     s += m_Radio;
  216.     PostMessage(s.c_str());
  217. }
  218. // here we are handling 3 commands in one handler
  219. void    CMenuDemoClient::OnUpdateRadio(ICmdUI* pCmdUI)
  220. {
  221.     char ch = 0;
  222.     switch(pCmdUI->GetCommand())    {
  223.     case eCmdRadioA: ch = 'A'; break;
  224.     case eCmdRadioB: ch = 'B'; break;
  225.     case eCmdRadioC: ch = 'C'; break;
  226.     };
  227.     pCmdUI->SetRadio(m_Radio == ch);
  228.     
  229.     string s = "OnUpdateRadio() for ";
  230.     s += ch;
  231.     PostMessage(s.c_str());
  232. }
  233. void    CMenuDemoClient::OnCheck1()
  234. {
  235.     m_Check1 = ! m_Check1;
  236.     PostMessage("OnCheck1()");
  237. }
  238. void    CMenuDemoClient::OnCheck2()
  239. {
  240.     m_Check2 = ! m_Check2;
  241.     PostMessage("OnCheck2()");
  242. }
  243. void    CMenuDemoClient::OnUpdateCheck1(ICmdUI* pCmdUI)
  244. {
  245.     pCmdUI->SetCheck(m_Check1);
  246.     PostMessage("OnUpdateCheck1");
  247. }
  248. void    CMenuDemoClient::OnUpdateCheck2(ICmdUI* pCmdUI)
  249. {
  250.     pCmdUI->SetCheck(m_Check2);
  251.     PostMessage("OnUpdateCheck2");
  252. }
  253. ////////////////////////////////////////////////////////////////////////////////
  254. ///
  255. CMenuDemoWindow::CMenuDemoWindow()
  256. {
  257.     //CRef<CResourceManager> manager(new CResourceManager("E:\Projects\c++\src\gui\res\"));
  258.     CRef<CResourceManager> manager(new CResourceManager("<std> ; <home>"));
  259.     manager->RegisterAlias("menu::zoom", "zoom.png");
  260.     manager->RegisterAlias("menu::zoom_in", "zoom_in.png");
  261.     manager->RegisterAlias("menu::zoom_out", "zoom_out.png");
  262.     manager->RegisterAlias("menu::zoom_all", "zoom_all.png");
  263.     manager->RegisterAlias("menu::zoom_sel", "zoom_sel.png");
  264.     CMenu::SetResourceManager(manager);
  265.     m_Window.reset(x_CreateWindow());
  266. }
  267. CMenuDemoWindow::~CMenuDemoWindow()
  268. {
  269.     CRef<CResourceManager> empty;
  270.     CMenu::SetResourceManager(empty);
  271. }
  272. const static int kWidth = 600;
  273. const static int kHeight = 400;
  274. Fl_Double_Window* CMenuDemoWindow::x_CreateWindow() 
  275. {
  276.     Fl_Double_Window* window = new Fl_Double_Window(kWidth, kHeight, "Menu Demo");
  277.     window->user_data((void*)(this));
  278.     
  279.     m_Client = new CMenuDemoClient(0, 0, kWidth, kHeight);
  280.     m_Client->end();
  281.     m_MenuBar = new CMenuBar1(0, 0, kWidth, 0);
  282.     m_MenuBar->SetItems(Menu);
  283.     m_MenuBar->SetCmdTarget(m_Client);   
  284.     CPoint sz = m_MenuBar->GetPreferredSize();
  285.     m_MenuBar->size(kWidth, sz.Y());
  286.     
  287.     m_ToolBar = new CMenuBar1(0, sz.Y(), kWidth, 0);
  288.     m_ToolBar->SetItems(ToolBar);
  289.     m_ToolBar->SetCmdTarget(m_Client);    
  290.     sz = m_ToolBar->GetPreferredSize();
  291.     m_ToolBar->size(sz.X(), sz.Y());
  292.     
  293.     int off = m_MenuBar->h() + m_ToolBar->h();
  294.     m_Client->resize(0, off, kWidth, kHeight - off);
  295.     
  296.     Fl_Group::current()->resizable(m_Client);
  297.     window->end();
  298.   
  299.     m_Client->PostMessage("Started...");
  300.     m_Client->PostMessage("Press mouse button in empty space to display Popup menu");
  301.     return window;
  302. }
  303. /*
  304.  * ===========================================================================
  305.  * $Log: menu_demo_window.cpp,v $
  306.  * Revision 1000.0  2004/06/01 21:30:49  gouriano
  307.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  308.  *
  309.  * Revision 1.4  2004/05/21 22:27:53  gorelenk
  310.  * Added PCH ncbi_pch.hpp
  311.  *
  312.  * Revision 1.3  2004/05/13 17:59:18  yazhuk
  313.  * Replaced CDiagPanel1 with CDiagPanel
  314.  *
  315.  * Revision 1.2  2004/05/03 19:51:37  yazhuk
  316.  * Implemented command updates, pluged-in new resources
  317.  *
  318.  * Revision 1.1  2004/04/22 17:05:15  yazhuk
  319.  * Initial revision
  320.  *
  321.  * ===========================================================================
  322.  */