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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: preferences_dialog.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 18:28:58  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.20
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: preferences_dialog.cpp,v 1000.3 2004/06/01 18:28:58 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. *      dialogs for editing program preferences
  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 "preferences_dialog.hpp"
  48. #include "wx_tools.hpp"
  49. #include "opengl_renderer.hpp"
  50. #include "cn3d_tools.hpp"
  51. #include "messenger.hpp"
  52. #include "cn3d_cache.hpp"
  53. ////////////////////////////////////////////////////////////////////////////////////////////////
  54. // The following is taken unmodified from wxDesigner's C++ header from preferences_dialog.wdr
  55. ////////////////////////////////////////////////////////////////////////////////////////////////
  56. #include <wx/image.h>
  57. #include <wx/statline.h>
  58. #include <wx/spinbutt.h>
  59. #include <wx/spinctrl.h>
  60. #include <wx/splitter.h>
  61. #include <wx/listctrl.h>
  62. #include <wx/treectrl.h>
  63. #include <wx/notebook.h>
  64. #include <wx/grid.h>
  65. // Declare window functions
  66. #define ID_NOTEBOOK 10000
  67. #define ID_B_DONE 10001
  68. #define ID_B_CANCEL 10002
  69. wxSizer *SetupPreferencesNotebook( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE );
  70. #define ID_TEXT 10003
  71. #define ID_TEXTCTRL 10004
  72. #define ID_SPINBUTTON 10005
  73. #define ID_C_HIGHLIGHT 10006
  74. #define ID_RADIOBOX 10007
  75. #define ID_B_Q_LOW 10008
  76. #define ID_B_Q_MED 10009
  77. #define ID_B_Q_HIGH 10010
  78. wxSizer *SetupQualityPage( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE );
  79. #define ID_C_CACHE_ON 10011
  80. #define ID_LINE 10012
  81. #define ID_T_CACHE_1 10013
  82. #define ID_B_CACHE_BROWSE 10014
  83. #define ID_T_CACHE_FOLDER 10015
  84. #define ID_T_CACHE_2 10016
  85. #define ID_B_CACHE_CLEAR 10017
  86. wxSizer *SetupCachePage( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE );
  87. #define ID_C_ANNOT_RO 10018
  88. #define ID_T_LAUNCH 10019
  89. #define ID_T_NSTRUCT 10020
  90. #define ID_T_FOOT 10021
  91. #define ID_T_SEPARATION 10022
  92. #define ID_C_PROXIMAL 10023
  93. wxSizer *SetupAdvancedPage( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE );
  94. ////////////////////////////////////////////////////////////////////////////////////////////////
  95. USING_NCBI_SCOPE;
  96. BEGIN_SCOPE(Cn3D)
  97. static IntegerSpinCtrl
  98.     *giWormSegments, *giWormSides, *giBondSides, *giHelixSides, *giAtomSlices, *giAtomStacks,
  99.     *giCacheSize, *giMaxStructs, *giFootRes;
  100. static FloatingPointSpinCtrl *gfSeparation;
  101. #define DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(var, id, type) 
  102.     type *var; 
  103.     var = wxDynamicCast(FindWindow(id), type); 
  104.     if (!var) { 
  105.         ERRORMSG("Can't find window with id " << id); 
  106.         return; 
  107.     }
  108. BEGIN_EVENT_TABLE(PreferencesDialog, wxDialog)
  109.     EVT_CLOSE       (       PreferencesDialog::OnCloseWindow)
  110.     EVT_BUTTON      (-1,    PreferencesDialog::OnButton)
  111.     EVT_CHECKBOX    (-1,    PreferencesDialog::OnCheckbox)
  112. END_EVENT_TABLE()
  113. #define SET_ISPINCTRL_FROM_REGISTRY_VALUE(section, name, iSpinCtrl) 
  114.     do { 
  115.         int value; 
  116.         if (!RegistryGetInteger((section), (name), &value) || !((iSpinCtrl)->SetInteger(value))) 
  117.             WARNINGMSG("PreferencesDialog::PreferencesDialog() - error with " << (name)); 
  118.     } while (0)
  119. #define SET_FSPINCTRL_FROM_REGISTRY_VALUE(section, name, fSpinCtrl) 
  120.     do { 
  121.         double value; 
  122.         if (!RegistryGetDouble((section), (name), &value) || !((fSpinCtrl)->SetDouble(value))) 
  123.             WARNINGMSG("PreferencesDialog::PreferencesDialog() - error with " << (name)); 
  124.     } while (0)
  125. #define SET_CHECKBOX_FROM_REGISTRY_VALUE(section, name, id) 
  126.     do { 
  127.         bool on; 
  128.         wxCheckBox *box = wxDynamicCast(FindWindow(id), wxCheckBox); 
  129.         if (!box || !RegistryGetBoolean((section), (name), &on)) 
  130.             WARNINGMSG("PreferencesDialog::PreferencesDialog() - error with " << (name)); 
  131.         else 
  132.             box->SetValue(on); 
  133.     } while (0)
  134. #define SET_RADIOBOX_FROM_REGISTRY_VALUE(section, name, id) 
  135.     do { 
  136.         string value; 
  137.         wxRadioBox *radio = wxDynamicCast(FindWindow(id), wxRadioBox); 
  138.         if (!radio || !RegistryGetString((section), (name), &value)) 
  139.             WARNINGMSG("PreferencesDialog::PreferencesDialog() - error with " << (name)); 
  140.         else 
  141.             radio->SetStringSelection(value.c_str()); 
  142.     } while (0)
  143. #define SET_TEXTCTRL_FROM_REGISTRY_VALUE(section, name, id) 
  144.     do { 
  145.         string value; 
  146.         wxTextCtrl *text = wxDynamicCast(FindWindow(id), wxTextCtrl); 
  147.         if (!text || !RegistryGetString((section), (name), &value)) 
  148.             WARNINGMSG("PreferencesDialog::PreferencesDialog() - error with " << (name)); 
  149.         else 
  150.             text->SetValue(value.c_str()); 
  151.     } while (0)
  152. PreferencesDialog::PreferencesDialog(wxWindow *parent) :
  153.     wxDialog(parent, -1, "Preferences", wxPoint(400, 100), wxDefaultSize,
  154.         wxCAPTION | wxSYSTEM_MENU) // not resizable
  155. {
  156.     // construct the panel
  157.     wxSizer *topSizer = SetupPreferencesNotebook(this, false);
  158.     // get SpinCtrl pointers
  159.     iWormSegments = giWormSegments;
  160.     iWormSides = giWormSides;
  161.     iBondSides = giBondSides;
  162.     iHelixSides = giHelixSides;
  163.     iAtomSlices = giAtomSlices;
  164.     iAtomStacks = giAtomStacks;
  165.     iCacheSize = giCacheSize;
  166.     iMaxStructs = giMaxStructs;
  167.     iFootRes = giFootRes;
  168.     fSeparation = gfSeparation;
  169.     // set initial values
  170.     SET_ISPINCTRL_FROM_REGISTRY_VALUE(REG_QUALITY_SECTION, REG_QUALITY_ATOM_SLICES, iAtomSlices);
  171.     SET_ISPINCTRL_FROM_REGISTRY_VALUE(REG_QUALITY_SECTION, REG_QUALITY_ATOM_STACKS, iAtomStacks);
  172.     SET_ISPINCTRL_FROM_REGISTRY_VALUE(REG_QUALITY_SECTION, REG_QUALITY_BOND_SIDES, iBondSides);
  173.     SET_ISPINCTRL_FROM_REGISTRY_VALUE(REG_QUALITY_SECTION, REG_QUALITY_WORM_SIDES, iWormSides);
  174.     SET_ISPINCTRL_FROM_REGISTRY_VALUE(REG_QUALITY_SECTION, REG_QUALITY_WORM_SEGMENTS, iWormSegments);
  175.     SET_ISPINCTRL_FROM_REGISTRY_VALUE(REG_QUALITY_SECTION, REG_QUALITY_HELIX_SIDES, iHelixSides);
  176.     SET_CHECKBOX_FROM_REGISTRY_VALUE(REG_QUALITY_SECTION, REG_HIGHLIGHTS_ON, ID_C_HIGHLIGHT);
  177.     SET_RADIOBOX_FROM_REGISTRY_VALUE(REG_QUALITY_SECTION, REG_PROJECTION_TYPE, ID_RADIOBOX);
  178.     SET_CHECKBOX_FROM_REGISTRY_VALUE(REG_CACHE_SECTION, REG_CACHE_ENABLED, ID_C_CACHE_ON);
  179.     SET_TEXTCTRL_FROM_REGISTRY_VALUE(REG_CACHE_SECTION, REG_CACHE_FOLDER, ID_T_CACHE_FOLDER);
  180.     SET_ISPINCTRL_FROM_REGISTRY_VALUE(REG_CACHE_SECTION, REG_CACHE_MAX_SIZE, iCacheSize);
  181.     wxCommandEvent fakeCheck(wxEVT_COMMAND_CHECKBOX_CLICKED, ID_C_CACHE_ON);
  182.     OnCheckbox(fakeCheck);  // set initial GUI enabled state
  183.     SET_CHECKBOX_FROM_REGISTRY_VALUE(REG_ADVANCED_SECTION, REG_CDD_ANNOT_READONLY, ID_C_ANNOT_RO);
  184. #ifdef __WXGTK__
  185.     SET_TEXTCTRL_FROM_REGISTRY_VALUE(REG_ADVANCED_SECTION, REG_BROWSER_LAUNCH, ID_T_LAUNCH);
  186. #endif
  187.     SET_ISPINCTRL_FROM_REGISTRY_VALUE(REG_ADVANCED_SECTION, REG_MAX_N_STRUCTS, iMaxStructs);
  188.     SET_ISPINCTRL_FROM_REGISTRY_VALUE(REG_ADVANCED_SECTION, REG_FOOTPRINT_RES, iFootRes);
  189.     SET_FSPINCTRL_FROM_REGISTRY_VALUE(REG_ADVANCED_SECTION, REG_STEREO_SEPARATION, fSeparation);
  190.     SET_CHECKBOX_FROM_REGISTRY_VALUE(REG_ADVANCED_SECTION, REG_PROXIMAL_STEREO, ID_C_PROXIMAL);
  191.     // call sizer stuff
  192.     topSizer->Fit(this);
  193.     topSizer->SetSizeHints(this);
  194. }
  195. PreferencesDialog::~PreferencesDialog(void)
  196. {
  197.     delete iWormSegments;
  198.     delete iWormSides;
  199.     delete iBondSides;
  200.     delete iHelixSides;
  201.     delete iAtomSlices;
  202.     delete iAtomStacks;
  203.     delete iCacheSize;
  204.     delete iMaxStructs;
  205.     delete iFootRes;
  206.     delete fSeparation;
  207. }
  208. #define SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(section, name, iSpinCtrl, changedPtr) 
  209.     do { 
  210.         int oldValue, newValue; 
  211.         if (!RegistryGetInteger((section), (name), &oldValue)) throw "RegistryGetInteger() failed"; 
  212.         if (!((iSpinCtrl)->GetInteger(&newValue))) throw "GetInteger() failed"; 
  213.         if (newValue != oldValue) { 
  214.             if (!RegistrySetInteger((section), (name), newValue)) 
  215.                 throw "RegistrySetInteger() failed"; 
  216.             if (changedPtr) *((bool*) changedPtr) = true; 
  217.         } 
  218.     } while (0)
  219. #define SET_DOUBLE_REGISTRY_VALUE_IF_DIFFERENT(section, name, fSpinCtrl, changedPtr) 
  220.     do { 
  221.         double oldValue, newValue; 
  222.         if (!RegistryGetDouble((section), (name), &oldValue)) throw "RegistryGetInteger() failed"; 
  223.         if (!((fSpinCtrl)->GetDouble(&newValue))) throw "GetInteger() failed"; 
  224.         if (newValue != oldValue) { 
  225.             if (!RegistrySetDouble((section), (name), newValue)) 
  226.                 throw "RegistrySetInteger() failed"; 
  227.             if (changedPtr) *((bool*) changedPtr) = true; 
  228.         } 
  229.     } while (0)
  230. #define SET_BOOL_REGISTRY_VALUE_IF_DIFFERENT(section, name, id, changedPtr) 
  231.     do { 
  232.         bool oldValue, newValue; 
  233.         if (!RegistryGetBoolean((section), (name), &oldValue)) throw "RegistryGetBoolean() failed"; 
  234.         wxCheckBox *box = wxDynamicCast(FindWindow(id), wxCheckBox); 
  235.         if (!box) throw "Can't get wxCheckBox*"; 
  236.         newValue = box->GetValue(); 
  237.         if (newValue != oldValue) { 
  238.             if (!RegistrySetBoolean((section), (name), newValue, true)) 
  239.                 throw "RegistrySetBoolean() failed"; 
  240.             if (changedPtr) *((bool*) changedPtr) = true; 
  241.         } 
  242.     } while (0)
  243. #define SET_RADIO_REGISTRY_VALUE_IF_DIFFERENT(section, name, id, changedPtr) 
  244.     do { 
  245.         string oldValue, newValue; 
  246.         if (!RegistryGetString((section), (name), &oldValue)) throw "RegistryGetString() failed"; 
  247.         wxRadioBox *radio = wxDynamicCast(FindWindow(id), wxRadioBox); 
  248.         if (!radio) throw "Can't get wxRadioBox*"; 
  249.         newValue = radio->GetStringSelection().c_str(); 
  250.         if (newValue != oldValue) { 
  251.             if (!RegistrySetString((section), (name), newValue)) 
  252.                 throw "RegistrySetString() failed"; 
  253.             if (changedPtr) *((bool*) changedPtr) = true; 
  254.         } 
  255.     } while (0)
  256. #define SET_STRING_REGISTRY_VALUE_IF_DIFFERENT(section, name, textCtrl) 
  257.     do { 
  258.         string oldValue, newValue; 
  259.         if (!RegistryGetString((section), (name), &oldValue)) throw "RegistryGetString() failed"; 
  260.         newValue = (textCtrl)->GetValue().c_str(); 
  261.         if (newValue != oldValue) { 
  262.             if (!RegistrySetString((section), (name), newValue)) 
  263.                 throw "RegistrySetString() failed"; 
  264.         } 
  265.     } while (0)
  266. // same as hitting done button
  267. void PreferencesDialog::OnCloseWindow(wxCloseEvent& event)
  268. {
  269.     bool okay = true, qualityChanged = false;
  270.     // set values if changed
  271.     try {
  272.         SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION,
  273.             REG_QUALITY_ATOM_SLICES, iAtomSlices, &qualityChanged);
  274.         SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION,
  275.             REG_QUALITY_ATOM_STACKS, iAtomStacks, &qualityChanged);
  276.         SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION,
  277.             REG_QUALITY_BOND_SIDES, iBondSides, &qualityChanged);
  278.         SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION,
  279.             REG_QUALITY_WORM_SIDES, iWormSides, &qualityChanged);
  280.         SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION,
  281.             REG_QUALITY_WORM_SEGMENTS, iWormSegments, &qualityChanged);
  282.         SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION,
  283.             REG_QUALITY_HELIX_SIDES, iHelixSides, &qualityChanged);
  284.         SET_BOOL_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION,
  285.             REG_HIGHLIGHTS_ON, ID_C_HIGHLIGHT, &qualityChanged);
  286.         SET_RADIO_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION,
  287.             REG_PROJECTION_TYPE, ID_RADIOBOX, &qualityChanged);
  288.         SET_BOOL_REGISTRY_VALUE_IF_DIFFERENT(REG_CACHE_SECTION, REG_CACHE_ENABLED, ID_C_CACHE_ON, NULL);
  289.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tCache, ID_T_CACHE_FOLDER, wxTextCtrl)
  290.         SET_STRING_REGISTRY_VALUE_IF_DIFFERENT(REG_CACHE_SECTION, REG_CACHE_FOLDER, tCache);
  291.         SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_CACHE_SECTION, REG_CACHE_MAX_SIZE, iCacheSize, NULL);
  292.         SET_BOOL_REGISTRY_VALUE_IF_DIFFERENT(REG_ADVANCED_SECTION, REG_CDD_ANNOT_READONLY, ID_C_ANNOT_RO, NULL);
  293. #ifdef __WXGTK__
  294.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tLaunch, ID_T_LAUNCH, wxTextCtrl)
  295.         SET_STRING_REGISTRY_VALUE_IF_DIFFERENT(REG_ADVANCED_SECTION, REG_BROWSER_LAUNCH, tLaunch);
  296. #endif
  297.         SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_ADVANCED_SECTION, REG_MAX_N_STRUCTS, iMaxStructs, NULL);
  298.         SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_ADVANCED_SECTION, REG_FOOTPRINT_RES, iFootRes, NULL);
  299.         SET_DOUBLE_REGISTRY_VALUE_IF_DIFFERENT(REG_ADVANCED_SECTION, REG_STEREO_SEPARATION, fSeparation, NULL);
  300.         SET_BOOL_REGISTRY_VALUE_IF_DIFFERENT(REG_ADVANCED_SECTION, REG_PROXIMAL_STEREO, ID_C_PROXIMAL, NULL);
  301.         // Limit cache size to current value now
  302.         int size;
  303.         if (iCacheSize->GetInteger(&size)) TruncateCache(size);
  304.     } catch (const char *err) {
  305.         ERRORMSG("Error setting registry values - " << err);
  306.         okay = false;
  307.     }
  308.     // close dialog only if all user values are legit
  309.     if (okay) {
  310.         if (qualityChanged) GlobalMessenger()->PostRedrawAllStructures();
  311.         EndModal(wxOK);
  312.     } else {
  313.         if (event.CanVeto())
  314.             event.Veto();
  315.     }
  316. }
  317. void PreferencesDialog::OnButton(wxCommandEvent& event)
  318. {
  319.     switch (event.GetId()) {
  320.         case ID_B_DONE: {
  321.             wxCloseEvent fake;
  322.             OnCloseWindow(fake); // handle on-exit stuff there
  323.             break;
  324.         }
  325.         case ID_B_CANCEL:
  326.             EndModal(wxCANCEL);
  327.             break;
  328.         // quality page stuff
  329.         case ID_B_Q_LOW:
  330.             iWormSegments->SetInteger(2);
  331.             iWormSides->SetInteger(4);
  332.             iBondSides->SetInteger(4);
  333.             iHelixSides->SetInteger(8);
  334.             iAtomSlices->SetInteger(5);
  335.             iAtomStacks->SetInteger(3);
  336.             break;
  337.         case ID_B_Q_MED:
  338.             iWormSegments->SetInteger(6);
  339.             iWormSides->SetInteger(6);
  340.             iBondSides->SetInteger(6);
  341.             iHelixSides->SetInteger(12);
  342.             iAtomSlices->SetInteger(10);
  343.             iAtomStacks->SetInteger(8);
  344.             break;
  345.         case ID_B_Q_HIGH:
  346.             iWormSegments->SetInteger(10);
  347.             iWormSides->SetInteger(20);
  348.             iBondSides->SetInteger(16);
  349.             iHelixSides->SetInteger(30);
  350.             iAtomSlices->SetInteger(20);
  351.             iAtomStacks->SetInteger(14);
  352.             break;
  353.         // cache page stuff
  354.         case ID_B_CACHE_BROWSE: {
  355.             DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tCache, ID_T_CACHE_FOLDER, wxTextCtrl)
  356.             wxString path;
  357.             path = wxDirSelector("Select a cache folder:", tCache->GetValue());
  358.             if (path.size() > 0 && wxDirExists(path.c_str()))
  359.                 tCache->SetValue(path);
  360.             break;
  361.         }
  362.         case ID_B_CACHE_CLEAR:
  363.             TruncateCache(0);
  364.             break;
  365.         default:
  366.             event.Skip();
  367.     }
  368. }
  369. void PreferencesDialog::OnCheckbox(wxCommandEvent& event)
  370. {
  371.     if (event.GetId() == ID_C_CACHE_ON) {
  372.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(c, ID_C_CACHE_ON, wxCheckBox)
  373.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(st1, ID_T_CACHE_1, wxStaticText)
  374.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(b1, ID_B_CACHE_BROWSE, wxButton)
  375.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(t, ID_T_CACHE_FOLDER, wxTextCtrl)
  376.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(st2, ID_T_CACHE_2, wxStaticText)
  377.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(b2, ID_B_CACHE_CLEAR, wxButton)
  378.         st1->Enable(c->GetValue());
  379.         b1->Enable(c->GetValue());
  380.         t->Enable(c->GetValue());
  381.         st2->Enable(c->GetValue());
  382.         b2->Enable(c->GetValue());
  383.         iCacheSize->GetTextCtrl()->Enable(c->GetValue());
  384.         iCacheSize->GetSpinButton()->Enable(c->GetValue());
  385.     }
  386. }
  387. END_SCOPE(Cn3D)
  388. USING_SCOPE(Cn3D);
  389. ////////////////////////////////////////////////////////////////////////////////////////////////
  390. // The following is taken *unmodified* from wxDesigner's C++ code from preferences_dialog.wdr
  391. ////////////////////////////////////////////////////////////////////////////////////////////////
  392. wxSizer *SetupPreferencesNotebook( wxWindow *parent, bool call_fit, bool set_sizer )
  393. {
  394.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  395.     wxNotebook *item2 = new wxNotebook( parent, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize, 0 );
  396.     wxNotebookSizer *item1 = new wxNotebookSizer( item2 );
  397.     wxPanel *item3 = new wxPanel( item2, -1 );
  398.     SetupQualityPage( item3, FALSE );
  399.     item2->AddPage( item3, "Quality" );
  400.     wxPanel *item4 = new wxPanel( item2, -1 );
  401.     SetupCachePage( item4, FALSE );
  402.     item2->AddPage( item4, "Cache" );
  403.     wxPanel *item5 = new wxPanel( item2, -1 );
  404.     SetupAdvancedPage( item5, FALSE );
  405.     item2->AddPage( item5, "Advanced" );
  406.     item0->Add( item1, 0, wxALIGN_CENTRE|wxALL, 5 );
  407.     wxBoxSizer *item6 = new wxBoxSizer( wxHORIZONTAL );
  408.     wxButton *item7 = new wxButton( parent, ID_B_DONE, "Done", wxDefaultPosition, wxDefaultSize, 0 );
  409.     item7->SetDefault();
  410.     item6->Add( item7, 0, wxALIGN_CENTRE|wxALL, 5 );
  411.     item6->Add( 20, 20, 0, wxALIGN_CENTRE|wxALL, 5 );
  412.     wxButton *item8 = new wxButton( parent, ID_B_CANCEL, "Cancel", wxDefaultPosition, wxDefaultSize, 0 );
  413.     item6->Add( item8, 0, wxALIGN_CENTRE|wxALL, 5 );
  414.     item0->Add( item6, 0, wxALIGN_CENTRE|wxALL, 5 );
  415.     if (set_sizer)
  416.     {
  417.         parent->SetAutoLayout( TRUE );
  418.         parent->SetSizer( item0 );
  419.         if (call_fit)
  420.         {
  421.             item0->Fit( parent );
  422.             item0->SetSizeHints( parent );
  423.         }
  424.     }
  425.     return item0;
  426. }
  427. ////////////////////////////////////////////////////////////////////////////////////////////////
  428. // The following is modified from wxDesigner's C++ code from preferences_dialog.wdr
  429. ////////////////////////////////////////////////////////////////////////////////////////////////
  430. wxSizer *SetupAdvancedPage( wxWindow *parent, bool call_fit, bool set_sizer )
  431. {
  432.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  433.     wxStaticBox *item2 = new wxStaticBox( parent, -1, "Advanced" );
  434.     wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL );
  435.     wxCheckBox *item3 = new wxCheckBox( parent, ID_C_ANNOT_RO, "CDD annotations are read-only", wxDefaultPosition, wxDefaultSize, 0 );
  436.     item3->SetValue( TRUE );
  437.     item1->Add( item3, 0, wxALIGN_CENTRE|wxALL, 5 );
  438. #ifdef __WXGTK__
  439.     wxFlexGridSizer *item4 = new wxFlexGridSizer( 1, 0, 0, 0 );
  440.     item4->AddGrowableCol( 0 );
  441.     wxTextCtrl *item5 = new wxTextCtrl( parent, ID_T_LAUNCH, "", wxDefaultPosition, wxSize(80,-1), 0 );
  442.     item4->Add( item5, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  443.     wxStaticText *item6 = new wxStaticText( parent, ID_TEXT, "Browser launch", wxDefaultPosition, wxDefaultSize, 0 );
  444.     item4->Add( item6, 0, wxALIGN_CENTRE|wxALL, 5 );
  445.     item1->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 );
  446. #endif
  447.     wxFlexGridSizer *item7 = new wxFlexGridSizer( 2, 0, 0, 0 );
  448.     item7->AddGrowableCol( 0 );
  449.     wxStaticText *item8 = new wxStaticText( parent, ID_TEXT, "Max structures to load:", wxDefaultPosition, wxDefaultSize, 0 );
  450.     item7->Add( item8, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  451.     giMaxStructs = new IntegerSpinCtrl(parent,
  452.         0, 100, 1, 10,
  453.         wxDefaultPosition, wxSize(80,SPIN_CTRL_HEIGHT), 0,
  454.         wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT));
  455.     item7->Add(giMaxStructs->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  456.     item7->Add(giMaxStructs->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  457.     wxStaticText *item11 = new wxStaticText( parent, ID_TEXT, "Footprint excess residues:", wxDefaultPosition, wxDefaultSize, 0 );
  458.     item7->Add( item11, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  459.     giFootRes = new IntegerSpinCtrl(parent,
  460.         0, 1000, 5, 15,
  461.         wxDefaultPosition, wxSize(80,SPIN_CTRL_HEIGHT), 0,
  462.         wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT));
  463.     item7->Add(giFootRes->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  464.     item7->Add(giFootRes->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  465.     item1->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  466.     item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  467.     wxStaticBox *item15 = new wxStaticBox( parent, -1, wxT("Stereo Settings") );
  468.     wxStaticBoxSizer *item14 = new wxStaticBoxSizer( item15, wxVERTICAL );
  469.     wxFlexGridSizer *item16 = new wxFlexGridSizer( 3, 0, 0 );
  470.     item16->AddGrowableCol( 0 );
  471.     wxStaticText *item17 = new wxStaticText( parent, ID_TEXT, wxT("Eye separation (degrees):"), wxDefaultPosition, wxDefaultSize, 0 );
  472.     item16->Add( item17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  473.     gfSeparation = new FloatingPointSpinCtrl(parent,
  474.         0.0, 15.0, 0.1, 5.0,
  475.         wxDefaultPosition, wxSize(80,SPIN_CTRL_HEIGHT), 0,
  476.         wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT));
  477.     item16->Add(gfSeparation->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  478.     item16->Add(gfSeparation->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  479.     wxStaticText *item20 = new wxStaticText( parent, ID_TEXT, wxT("Proximal (cross-eyed):"), wxDefaultPosition, wxDefaultSize, 0 );
  480.     item16->Add( item20, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  481.     wxCheckBox *item21 = new wxCheckBox( parent, ID_C_PROXIMAL, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
  482.     item16->Add( item21, 0, wxALIGN_CENTRE|wxALL, 5 );
  483.     item16->Add( 5, 5, 0, wxALIGN_CENTRE|wxALL, 5 );
  484.     item14->Add( item16, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  485.     item0->Add( item14, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  486.     if (set_sizer)
  487.     {
  488.         parent->SetAutoLayout( TRUE );
  489.         parent->SetSizer( item0 );
  490.         if (call_fit)
  491.         {
  492.             item0->Fit( parent );
  493.             item0->SetSizeHints( parent );
  494.         }
  495.     }
  496.     return item0;
  497. }
  498. wxSizer *SetupQualityPage(wxWindow *parent, bool call_fit, bool set_sizer)
  499. {
  500.     wxFlexGridSizer *item0 = new wxFlexGridSizer( 2, 0, 0 );
  501.     wxStaticBox *item2 = new wxStaticBox( parent, -1, "Rendering Settings" );
  502.     wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL );
  503.     wxFlexGridSizer *item3 = new wxFlexGridSizer( 3, 0, 0 );
  504.     item3->AddGrowableCol( 0 );
  505.     wxStaticText *item5 = new wxStaticText(parent, ID_TEXT, "Worm segments:", wxDefaultPosition, wxDefaultSize, 0);
  506.     item3->Add(item5, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
  507.     giWormSegments = new IntegerSpinCtrl(parent,
  508.         2, 30, 2, 4,
  509.         wxDefaultPosition, wxSize(80,SPIN_CTRL_HEIGHT), 0,
  510.         wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT));
  511.     item3->Add(giWormSegments->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  512.     item3->Add(giWormSegments->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  513.     wxStaticText *item8 = new wxStaticText(parent, ID_TEXT, "Worm sides:", wxDefaultPosition, wxDefaultSize, 0);
  514.     item3->Add(item8, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
  515.     giWormSides = new IntegerSpinCtrl(parent,
  516.         4, 30, 2, 6,
  517.         wxDefaultPosition, wxSize(80,SPIN_CTRL_HEIGHT), 0,
  518.         wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT));
  519.     item3->Add(giWormSides->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  520.     item3->Add(giWormSides->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  521.     wxStaticText *item11 = new wxStaticText(parent, ID_TEXT, "Bond sides:", wxDefaultPosition, wxDefaultSize, 0);
  522.     item3->Add(item11, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
  523.     giBondSides = new IntegerSpinCtrl(parent,
  524.         3, 30, 1, 6,
  525.         wxDefaultPosition, wxSize(80,SPIN_CTRL_HEIGHT), 0,
  526.         wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT));
  527.     item3->Add(giBondSides->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  528.     item3->Add(giBondSides->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  529.     wxStaticText *item14 = new wxStaticText(parent, ID_TEXT, "Helix sides:", wxDefaultPosition, wxDefaultSize, 0);
  530.     item3->Add(item14, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
  531.     giHelixSides = new IntegerSpinCtrl(parent,
  532.         3, 40, 1, 12,
  533.         wxDefaultPosition, wxSize(80,SPIN_CTRL_HEIGHT), 0,
  534.         wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT));
  535.     item3->Add(giHelixSides->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  536.     item3->Add(giHelixSides->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  537.     wxStaticText *item17 = new wxStaticText(parent, ID_TEXT, "Atom slices:", wxDefaultPosition, wxDefaultSize, 0);
  538.     item3->Add(item17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
  539.     giAtomSlices = new IntegerSpinCtrl(parent,
  540.         3, 30, 1, 8,
  541.         wxDefaultPosition, wxSize(80,SPIN_CTRL_HEIGHT), 0,
  542.         wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT));
  543.     item3->Add(giAtomSlices->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  544.     item3->Add(giAtomSlices->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  545.     wxStaticText *item20 = new wxStaticText(parent, ID_TEXT, "Atom stacks:", wxDefaultPosition, wxDefaultSize, 0);
  546.     item3->Add(item20, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
  547.     giAtomStacks = new IntegerSpinCtrl(parent,
  548.         2, 30, 1, 6,
  549.         wxDefaultPosition, wxSize(80,SPIN_CTRL_HEIGHT), 0,
  550.         wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT));
  551.     item3->Add(giAtomStacks->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  552.     item3->Add(giAtomStacks->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  553.     item1->Add(item3, 0, wxALIGN_CENTRE|wxALL, 5);
  554.     wxFlexGridSizer *item22 = new wxFlexGridSizer( 2, 0, 0, 0 );
  555.     item22->AddGrowableCol( 1 );
  556.     wxStaticText *item23 = new wxStaticText( parent, ID_TEXT, "Highlights:", wxDefaultPosition, wxDefaultSize, 0 );
  557.     item22->Add( item23, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  558.     wxCheckBox *item24 = new wxCheckBox( parent, ID_C_HIGHLIGHT, "", wxDefaultPosition, wxDefaultSize, 0 );
  559.     item22->Add( item24, 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5 );
  560.     wxStaticText *item25 = new wxStaticText( parent, ID_TEXT, "Projection:", wxDefaultPosition, wxDefaultSize, 0 );
  561.     item22->Add( item25, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  562.     wxString strs26[] =
  563.     {
  564.         "Perspective",
  565.         "Orthographic"
  566.     };
  567.     wxRadioBox *item26 = new wxRadioBox( parent, ID_RADIOBOX, "", wxDefaultPosition, wxDefaultSize, 2, strs26, 1, wxRA_SPECIFY_COLS );
  568.     item22->Add( item26, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
  569.     item1->Add( item22, 0, wxALIGN_CENTRE, 5 );
  570.     item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
  571.     wxStaticBox *item28 = new wxStaticBox( parent, -1, "Presets" );
  572.     wxStaticBoxSizer *item27 = new wxStaticBoxSizer( item28, wxHORIZONTAL );
  573.     wxBoxSizer *item29 = new wxBoxSizer( wxVERTICAL );
  574.     wxButton *item30 = new wxButton( parent, ID_B_Q_LOW, "Low", wxDefaultPosition, wxDefaultSize, 0 );
  575.     item29->Add( item30, 0, wxALIGN_CENTRE|wxALL, 5 );
  576.     item29->Add( 20, 20, 0, wxALIGN_CENTRE|wxALL, 5 );
  577.     wxButton *item31 = new wxButton( parent, ID_B_Q_MED, "Medium", wxDefaultPosition, wxDefaultSize, 0 );
  578.     item29->Add( item31, 0, wxALIGN_CENTRE|wxALL, 5 );
  579.     item29->Add( 20, 20, 0, wxALIGN_CENTRE|wxALL, 5 );
  580.     wxButton *item32 = new wxButton( parent, ID_B_Q_HIGH, "High", wxDefaultPosition, wxDefaultSize, 0 );
  581.     item29->Add( item32, 0, wxALIGN_CENTRE|wxALL, 5 );
  582.     item27->Add( item29, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
  583.     item0->Add( item27, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
  584.     if (set_sizer)
  585.     {
  586.         parent->SetAutoLayout(TRUE);
  587.         parent->SetSizer(item0);
  588.         if (call_fit)
  589.         {
  590.             item0->Fit(parent);
  591.             item0->SetSizeHints(parent);
  592.         }
  593.     }
  594.     return item0;
  595. }
  596. wxSizer *SetupCachePage( wxWindow *parent, bool call_fit, bool set_sizer )
  597. {
  598.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  599.     wxStaticBox *item2 = new wxStaticBox( parent, -1, "Cache Settings" );
  600.     wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL );
  601.     wxCheckBox *item3 = new wxCheckBox( parent, ID_C_CACHE_ON, "Enable Biostruc cache", wxDefaultPosition, wxDefaultSize, 0 );
  602.     item1->Add( item3, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
  603.     wxStaticLine *item4 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(20,-1), wxLI_HORIZONTAL );
  604.     item1->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  605.     wxBoxSizer *item5 = new wxBoxSizer( wxVERTICAL );
  606.     wxFlexGridSizer *item6 = new wxFlexGridSizer( 1, 0, 0, 0 );
  607.     item6->AddGrowableCol( 1 );
  608.     wxStaticText *item7 = new wxStaticText( parent, ID_T_CACHE_1, "Cache folder:", wxDefaultPosition, wxDefaultSize, 0 );
  609.     item6->Add( item7, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxTOP, 5 );
  610.     item6->Add( 20, 20, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxTOP, 5 );
  611.     wxButton *item8 = new wxButton( parent, ID_B_CACHE_BROWSE, "Browse", wxDefaultPosition, wxDefaultSize, 0 );
  612.     item6->Add( item8, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxTOP, 5 );
  613.     item5->Add( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 );
  614.     wxTextCtrl *item9 = new wxTextCtrl( parent, ID_T_CACHE_FOLDER, "", wxDefaultPosition, wxDefaultSize, 0 );
  615.     item5->Add( item9, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 );
  616.     item5->Add( 20, 20, 0, wxALIGN_CENTRE, 5 );
  617.     wxFlexGridSizer *item10 = new wxFlexGridSizer( 1, 0, 0, 0 );
  618.     item10->AddGrowableCol( 2 );
  619.     wxStaticText *item11 = new wxStaticText( parent, ID_T_CACHE_2, "Maximum folder size (MB):", wxDefaultPosition, wxDefaultSize, 0 );
  620.     item10->Add( item11, 0, wxALIGN_CENTRE|wxALL, 5 );
  621.     giCacheSize = new IntegerSpinCtrl(parent,
  622.         1, 500, 1, 50,
  623.         wxDefaultPosition, wxSize(50,SPIN_CTRL_HEIGHT), 0,
  624.         wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT));
  625.     item10->Add(giCacheSize->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  626.     item10->Add(giCacheSize->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  627.     item10->Add( 20, 20, 0, wxALIGN_CENTRE|wxALL, 5 );
  628.     wxButton *item14 = new wxButton( parent, ID_B_CACHE_CLEAR, "Clear now", wxDefaultPosition, wxDefaultSize, 0 );
  629.     item10->Add( item14, 0, wxALIGN_CENTRE|wxALL, 5 );
  630.     item5->Add( item10, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 );
  631.     item1->Add( item5, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  632.     item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  633.     if (set_sizer)
  634.     {
  635.         parent->SetAutoLayout( TRUE );
  636.         parent->SetSizer( item0 );
  637.         if (call_fit)
  638.         {
  639.             item0->Fit( parent );
  640.             item0->SetSizeHints( parent );
  641.         }
  642.     }
  643.     return item0;
  644. }
  645. /*
  646. * ---------------------------------------------------------------------------
  647. * $Log: preferences_dialog.cpp,v $
  648. * Revision 1000.3  2004/06/01 18:28:58  gouriano
  649. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.20
  650. *
  651. * Revision 1.20  2004/05/21 21:41:39  gorelenk
  652. * Added PCH ncbi_pch.hpp
  653. *
  654. * Revision 1.19  2004/02/19 17:05:03  thiessen
  655. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  656. *
  657. * Revision 1.18  2003/11/15 16:08:36  thiessen
  658. * add stereo
  659. *
  660. * Revision 1.17  2003/02/03 19:20:04  thiessen
  661. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  662. *
  663. * Revision 1.16  2003/01/31 17:18:58  thiessen
  664. * many small additions and changes...
  665. *
  666. * Revision 1.15  2002/09/13 14:21:45  thiessen
  667. * finish hooking up browser launch on unix
  668. *
  669. * Revision 1.14  2002/09/13 13:44:34  thiessen
  670. * add browser launch item to prefs dialog
  671. *
  672. * Revision 1.13  2002/08/15 22:13:15  thiessen
  673. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  674. *
  675. * Revision 1.12  2002/06/04 12:48:56  thiessen
  676. * tweaks for release ; fill out help menu
  677. *
  678. * Revision 1.11  2002/05/22 17:17:09  thiessen
  679. * progress on BLAST interface ; change custom spin ctrl implementation
  680. *
  681. * Revision 1.10  2002/04/27 16:32:13  thiessen
  682. * fix small leaks/bugs found by BoundsChecker
  683. *
  684. * Revision 1.9  2002/04/09 23:59:10  thiessen
  685. * add cdd annotations read-only option
  686. *
  687. * Revision 1.8  2002/03/04 15:52:14  thiessen
  688. * hide sequence windows instead of destroying ; add perspective/orthographic projection choice
  689. *
  690. * Revision 1.7  2001/11/01 19:05:12  thiessen
  691. * use wxDirSelector
  692. *
  693. * Revision 1.6  2001/10/30 02:54:12  thiessen
  694. * add Biostruc cache
  695. *
  696. * Revision 1.5  2001/09/24 14:37:52  thiessen
  697. * more wxPanel stuff - fix for new heirarchy in wx 2.3.2+
  698. *
  699. * Revision 1.4  2001/09/24 13:29:54  thiessen
  700. * fix wxPanel issues
  701. *
  702. * Revision 1.3  2001/09/20 19:31:30  thiessen
  703. * fixes for SGI and wxWin 2.3.2
  704. *
  705. * Revision 1.2  2001/08/13 22:30:59  thiessen
  706. * add structure window mouse drag/zoom; add highlight option to render settings
  707. *
  708. * Revision 1.1  2001/08/06 20:22:01  thiessen
  709. * add preferences dialog ; make sure OnCloseWindow get wxCloseEvent
  710. *
  711. */