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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: animation_controls.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:27:38  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: animation_controls.cpp,v 1000.1 2004/06/01 18:27:38 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:  Paul Thiessen
  35. *
  36. * File Description:
  37. *      dialog for setting animation controls
  38. *
  39. * ===========================================================================
  40. */
  41. #ifdef _MSC_VER
  42. #pragma warning(disable:4018)   // disable signed/unsigned mismatch warning in MSVC
  43. #endif
  44. #include <ncbi_pch.hpp>
  45. #include <corelib/ncbistd.hpp>
  46. #include <corelib/ncbireg.hpp>
  47. #include "animation_controls.hpp"
  48. #include "wx_tools.hpp"
  49. #include "cn3d_tools.hpp"
  50. ////////////////////////////////////////////////////////////////////////////////////////////////
  51. // The following is taken unmodified from wxDesigner's C++ header from animation_controls.wdr
  52. ////////////////////////////////////////////////////////////////////////////////////////////////
  53. #include <wx/image.h>
  54. #include <wx/statline.h>
  55. #include <wx/spinbutt.h>
  56. #include <wx/spinctrl.h>
  57. #include <wx/splitter.h>
  58. #include <wx/listctrl.h>
  59. #include <wx/treectrl.h>
  60. #include <wx/notebook.h>
  61. #include <wx/grid.h>
  62. // Declare window functions
  63. #define ID_TEXT 10000
  64. #define ID_TEXTCTRL 10001
  65. #define ID_SPINBUTTON 10002
  66. #define ID_B_DONE 10003
  67. wxSizer *SetupAnimationDialog( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE );
  68. ////////////////////////////////////////////////////////////////////////////////////////////////
  69. USING_NCBI_SCOPE;
  70. BEGIN_SCOPE(Cn3D)
  71. static IntegerSpinCtrl *giSpinDelay, *giFrameDelay;
  72. static FloatingPointSpinCtrl *gfSpinIncrement;
  73. #define DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(var, id, type) 
  74.     type *var; 
  75.     var = wxDynamicCast(FindWindow(id), type); 
  76.     if (!var) { 
  77.         ERRORMSG("Can't find window with id " << id); 
  78.         return; 
  79.     }
  80. #define SET_ISPINCTRL_FROM_REGISTRY_VALUE(section, name, iSpinCtrl) 
  81.     do { 
  82.         int value; 
  83.         if (!RegistryGetInteger((section), (name), &value) || !((iSpinCtrl)->SetInteger(value))) 
  84.             WARNINGMSG("PreferencesDialog::PreferencesDialog() - error with " << (name)); 
  85.     } while (0)
  86. #define SET_FSPINCTRL_FROM_REGISTRY_VALUE(section, name, fSpinCtrl) 
  87.     do { 
  88.         double value; 
  89.         if (!RegistryGetDouble((section), (name), &value) || !((fSpinCtrl)->SetDouble(value))) 
  90.             WARNINGMSG("PreferencesDialog::PreferencesDialog() - error with " << (name)); 
  91.     } while (0)
  92. BEGIN_EVENT_TABLE(AnimationControls, wxDialog)
  93.     EVT_CLOSE       (       AnimationControls::OnCloseWindow)
  94.     EVT_BUTTON      (-1,    AnimationControls::OnButton)
  95. END_EVENT_TABLE()
  96. AnimationControls::AnimationControls(wxWindow *parent) :
  97.     wxDialog(parent, -1, "Animation Controls", wxPoint(400, 100), wxDefaultSize,
  98.         wxCAPTION | wxSYSTEM_MENU) // not resizable
  99. {
  100.     // construct the panel
  101.     wxSizer *topSizer = SetupAnimationDialog(this, false);
  102.     // get SpinCtrl pointers
  103.     iSpinDelay = giSpinDelay;
  104.     iFrameDelay = giFrameDelay;
  105.     fSpinIncrement = gfSpinIncrement;
  106.     // set initial values
  107.     SET_ISPINCTRL_FROM_REGISTRY_VALUE(REG_ANIMATION_SECTION, REG_SPIN_DELAY, iSpinDelay);
  108.     SET_ISPINCTRL_FROM_REGISTRY_VALUE(REG_ANIMATION_SECTION, REG_FRAME_DELAY, iFrameDelay);
  109.     SET_FSPINCTRL_FROM_REGISTRY_VALUE(REG_ANIMATION_SECTION, REG_SPIN_INCREMENT, fSpinIncrement);
  110.     // call sizer stuff
  111.     topSizer->Fit(this);
  112.     topSizer->SetSizeHints(this);
  113. }
  114. AnimationControls::~AnimationControls(void)
  115. {
  116.     delete iSpinDelay;
  117.     delete iFrameDelay;
  118.     delete fSpinIncrement;
  119. }
  120. #define SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(section, name, iSpinCtrl) 
  121.     do { 
  122.         int oldValue, newValue; 
  123.         if (!RegistryGetInteger((section), (name), &oldValue)) throw "RegistryGetInteger() failed"; 
  124.         if (!((iSpinCtrl)->GetInteger(&newValue))) throw "GetInteger() failed"; 
  125.         if (newValue != oldValue && !RegistrySetInteger((section), (name), newValue)) 
  126.             throw "RegistrySetInteger() failed"; 
  127.     } while (0)
  128. #define SET_DOUBLE_REGISTRY_VALUE_IF_DIFFERENT(section, name, fSpinCtrl) 
  129.     do { 
  130.         double oldValue, newValue; 
  131.         if (!RegistryGetDouble((section), (name), &oldValue)) throw "RegistryGetInteger() failed"; 
  132.         if (!((fSpinCtrl)->GetDouble(&newValue))) throw "GetInteger() failed"; 
  133.         if (newValue != oldValue && !RegistrySetDouble((section), (name), newValue)) 
  134.             throw "RegistrySetInteger() failed"; 
  135.     } while (0)
  136. // same as hitting done button
  137. void AnimationControls::OnCloseWindow(wxCloseEvent& event)
  138. {
  139.     bool okay = true;
  140.     // set values if changed
  141.     try {
  142.         SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_ANIMATION_SECTION, REG_SPIN_DELAY, iSpinDelay);
  143.         SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_ANIMATION_SECTION, REG_FRAME_DELAY, iFrameDelay);
  144.         SET_DOUBLE_REGISTRY_VALUE_IF_DIFFERENT(REG_ANIMATION_SECTION, REG_SPIN_INCREMENT, fSpinIncrement);
  145.     } catch (const char *err) {
  146.         ERRORMSG("Error setting registry values - " << err);
  147.         okay = false;
  148.     }
  149.     // close dialog only if all user values are legit
  150.     if (okay) {
  151.         EndModal(wxOK);
  152.     } else {
  153.         if (event.CanVeto())
  154.             event.Veto();
  155.     }
  156. }
  157. void AnimationControls::OnButton(wxCommandEvent& event)
  158. {
  159.     switch (event.GetId()) {
  160.         case ID_B_DONE: {
  161.             wxCloseEvent fake;
  162.             OnCloseWindow(fake); // handle on-exit stuff there
  163.             break;
  164.         }
  165.         default:
  166.             event.Skip();
  167.     }
  168. }
  169. END_SCOPE(Cn3D)
  170. USING_SCOPE(Cn3D);
  171. ////////////////////////////////////////////////////////////////////////////////////////////////
  172. // The following is modified from wxDesigner's C++ code from animation_controls.wdr
  173. ////////////////////////////////////////////////////////////////////////////////////////////////
  174. wxSizer *SetupAnimationDialog( wxWindow *parent, bool call_fit, bool set_sizer )
  175. {
  176.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  177.     wxStaticBox *item2 = new wxStaticBox( parent, -1, wxT("Spin") );
  178.     wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL );
  179.     wxFlexGridSizer *item3 = new wxFlexGridSizer( 2, 0, 0, 0 );
  180.     item3->AddGrowableCol( 0 );
  181.     wxStaticText *item4 = new wxStaticText( parent, ID_TEXT, wxT("Increment (deg):"), wxDefaultPosition, wxDefaultSize, 0 );
  182.     item3->Add( item4, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  183.     gfSpinIncrement = new FloatingPointSpinCtrl(parent,
  184.         0.01, 30, 0.1, 2,
  185.         wxDefaultPosition, wxSize(50,SPIN_CTRL_HEIGHT), 0,
  186.         wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT));
  187.     item3->Add(gfSpinIncrement->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  188.     item3->Add(gfSpinIncrement->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  189.     wxStaticText *item7 = new wxStaticText( parent, ID_TEXT, wxT("Delay (ms):"), wxDefaultPosition, wxDefaultSize, 0 );
  190.     item3->Add( item7, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  191.     giSpinDelay = new IntegerSpinCtrl(parent,
  192.         1, 1000, 10, 50,
  193.         wxDefaultPosition, wxSize(50,SPIN_CTRL_HEIGHT), 0,
  194.         wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT));
  195.     item3->Add(giSpinDelay->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  196.     item3->Add(giSpinDelay->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  197.     item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 );
  198.     item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  199.     wxStaticBox *item11 = new wxStaticBox( parent, -1, wxT("Frames") );
  200.     wxStaticBoxSizer *item10 = new wxStaticBoxSizer( item11, wxVERTICAL );
  201.     wxFlexGridSizer *item12 = new wxFlexGridSizer( 1, 0, 0, 0 );
  202.     item12->AddGrowableCol( 0 );
  203.     wxStaticText *item13 = new wxStaticText( parent, ID_TEXT, wxT("Delay (ms):"), wxDefaultPosition, wxDefaultSize, 0 );
  204.     item12->Add( item13, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  205.     giFrameDelay = new IntegerSpinCtrl(parent,
  206.         1, 5000, 100, 500,
  207.         wxDefaultPosition, wxSize(50,SPIN_CTRL_HEIGHT), 0,
  208.         wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT));
  209.     item12->Add(giFrameDelay->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  210.     item12->Add(giFrameDelay->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  211.     item10->Add( item12, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 );
  212.     item0->Add( item10, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  213.     wxButton *item16 = new wxButton( parent, ID_B_DONE, wxT("Done"), wxDefaultPosition, wxDefaultSize, 0 );
  214.     item0->Add( item16, 0, wxALIGN_CENTRE|wxALL, 5 );
  215.     if (set_sizer)
  216.     {
  217.         parent->SetAutoLayout( TRUE );
  218.         parent->SetSizer( item0 );
  219.         if (call_fit)
  220.         {
  221.             item0->Fit( parent );
  222.             item0->SetSizeHints( parent );
  223.         }
  224.     }
  225.     return item0;
  226. }
  227. /*
  228. * ---------------------------------------------------------------------------
  229. * $Log: animation_controls.cpp,v $
  230. * Revision 1000.1  2004/06/01 18:27:38  gouriano
  231. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  232. *
  233. * Revision 1.4  2004/05/21 21:41:38  gorelenk
  234. * Added PCH ncbi_pch.hpp
  235. *
  236. * Revision 1.3  2004/02/19 17:04:40  thiessen
  237. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  238. *
  239. * Revision 1.2  2003/12/03 15:46:36  thiessen
  240. * adjust so spin increment is accurate
  241. *
  242. * Revision 1.1  2003/12/03 15:07:08  thiessen
  243. * add more sophisticated animation controls
  244. *
  245. * Revision 1.18  2003/11/15 16:08:36  thiessen
  246. * add stereo
  247. *
  248. * Revision 1.17  2003/02/03 19:20:04  thiessen
  249. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  250. *
  251. * Revision 1.16  2003/01/31 17:18:58  thiessen
  252. * many small additions and changes...
  253. *
  254. * Revision 1.15  2002/09/13 14:21:45  thiessen
  255. * finish hooking up browser launch on unix
  256. *
  257. * Revision 1.14  2002/09/13 13:44:34  thiessen
  258. * add browser launch item to prefs dialog
  259. *
  260. * Revision 1.13  2002/08/15 22:13:15  thiessen
  261. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  262. *
  263. * Revision 1.12  2002/06/04 12:48:56  thiessen
  264. * tweaks for release ; fill out help menu
  265. *
  266. * Revision 1.11  2002/05/22 17:17:09  thiessen
  267. * progress on BLAST interface ; change custom spin ctrl implementation
  268. *
  269. * Revision 1.10  2002/04/27 16:32:13  thiessen
  270. * fix small leaks/bugs found by BoundsChecker
  271. *
  272. * Revision 1.9  2002/04/09 23:59:10  thiessen
  273. * add cdd annotations read-only option
  274. *
  275. * Revision 1.8  2002/03/04 15:52:14  thiessen
  276. * hide sequence windows instead of destroying ; add perspective/orthographic projection choice
  277. *
  278. * Revision 1.7  2001/11/01 19:05:12  thiessen
  279. * use wxDirSelector
  280. *
  281. * Revision 1.6  2001/10/30 02:54:12  thiessen
  282. * add Biostruc cache
  283. *
  284. * Revision 1.5  2001/09/24 14:37:52  thiessen
  285. * more wxPanel stuff - fix for new heirarchy in wx 2.3.2+
  286. *
  287. * Revision 1.4  2001/09/24 13:29:54  thiessen
  288. * fix wxPanel issues
  289. *
  290. * Revision 1.3  2001/09/20 19:31:30  thiessen
  291. * fixes for SGI and wxWin 2.3.2
  292. *
  293. * Revision 1.2  2001/08/13 22:30:59  thiessen
  294. * add structure window mouse drag/zoom; add highlight option to render settings
  295. *
  296. * Revision 1.1  2001/08/06 20:22:01  thiessen
  297. * add preferences dialog ; make sure OnCloseWindow get wxCloseEvent
  298. *
  299. */