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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: style_dialog.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:29:38  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.27
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: style_dialog.cpp,v 1000.2 2004/06/01 18:29: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 styles
  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 "style_dialog.hpp"
  47. #include "style_manager.hpp"
  48. #include "cn3d_tools.hpp"
  49. #include "structure_set.hpp"
  50. #include "messenger.hpp"
  51. #include "wx_tools.hpp"
  52. #include <wx/colordlg.h>
  53. ////////////////////////////////////////////////////////////////////////////////////////////////
  54. // The following is taken unmodified from wxDesigner's C++ header from render_settings.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. // Declare window functions
  65. #define ID_NOTEBOOK 10000
  66. #define ID_DONE 10001
  67. #define ID_CANCEL 10002
  68. #define ID_TEXT 10003
  69. #define ID_ALWAYS_APPLY 10004
  70. #define ID_APPLY 10005
  71. wxSizer *LayoutNotebook( wxPanel *parent, bool call_fit = TRUE, bool set_sizer = TRUE );
  72. #define ID_PBB_SHOW 10006
  73. #define ID_PBB_RENDER 10007
  74. #define ID_PBB_COLOR 10008
  75. #define ID_PBB_USER 10009
  76. #define ID_PSIDE_SHOW 10010
  77. #define ID_PSIDE_RENDER 10011
  78. #define ID_PSIDE_COLOR 10012
  79. #define ID_PSIDE_USER 10013
  80. #define ID_NUC_SHOW 10014
  81. #define ID_NUC_RENDER 10015
  82. #define ID_NUC_COLOR 10016
  83. #define ID_NUC_USER 10017
  84. #define ID_NSIDE_SHOW 10018
  85. #define ID_NSIDE_RENDER 10019
  86. #define ID_NSIDE_COLOR 10020
  87. #define ID_NSIDE_USER 10021
  88. #define ID_HET_SHOW 10022
  89. #define ID_HET_RENDER 10023
  90. #define ID_HET_COLOR 10024
  91. #define ID_HET_USER 10025
  92. #define ID_SOLV_SHOW 10026
  93. #define ID_SOLV_RENDER 10027
  94. #define ID_SOLV_COLOR 10028
  95. #define ID_SOLV_USER 10029
  96. #define ID_CONN_SHOW 10030
  97. #define ID_CONN_RENDER 10031
  98. #define ID_CONN_COLOR 10032
  99. #define ID_CONN_USER 10033
  100. #define ID_HELX_SHOW 10034
  101. #define ID_HELX_RENDER 10035
  102. #define ID_HELX_COLOR 10036
  103. #define ID_HELX_USER 10037
  104. #define ID_STRN_SHOW 10038
  105. #define ID_STRN_RENDER 10039
  106. #define ID_STRN_COLOR 10040
  107. #define ID_STRN_USER 10041
  108. #define ID_VSS_SHOW 10042
  109. #define ID_VSS_USER 10043
  110. #define ID_HYD_SHOW 10044
  111. #define ID_BG_USER 10045
  112. wxSizer *LayoutSettingsPage( wxPanel *parent, bool call_fit = TRUE, bool set_sizer = TRUE );
  113. #define ID_TEXTCTRL 10046
  114. #define ID_SPINBUTTON 10047
  115. wxSizer *LayoutDetailsPage( wxPanel *parent, bool call_fit = TRUE, bool set_sizer = TRUE );
  116. #define ID_S_PROT 10048
  117. #define ID_S_NUC 10049
  118. #define ID_C_PROT_TYPE 10050
  119. #define ID_C_NUC_TYPE 10051
  120. #define ID_C_PROT_NUM 10052
  121. #define ID_C_NUC_NUM 10053
  122. #define ID_K_PROT_CONTRAST 10054
  123. #define ID_K_NUC_CONTRAST 10055
  124. #define ID_K_PROT_TERM 10056
  125. #define ID_K_NUC_TERM 10057
  126. #define ID_LINE 10058
  127. #define ID_K_ION 10059
  128. wxSizer *LayoutLabelsPage( wxPanel *parent, bool call_fit = TRUE, bool set_sizer = TRUE );
  129. ////////////////////////////////////////////////////////////////////////////////////////////////
  130. // a bit of a kludge - but necessary to be able to use most of the wxDesigner code as is
  131. static Cn3D::FloatingPointSpinCtrl *gfpSpaceFill, *gfpBallRadius, *gfpStickRadius, *gfpTubeRadius,
  132.     *gfpTubeWormRadius, *gfpHelixRadius, *gfpStrandWidth, *gfpStrandThickness;
  133. USING_NCBI_SCOPE;
  134. BEGIN_SCOPE(Cn3D)
  135. TypeStringAssociator < StyleSettings::eBackboneType > StyleDialog::BackboneTypeStrings;
  136. TypeStringAssociator < StyleSettings::eDrawingStyle > StyleDialog::DrawingStyleStrings;
  137. TypeStringAssociator < StyleSettings::eColorScheme > StyleDialog::ColorSchemeStrings;
  138. TypeStringAssociator < StyleSettings::eLabelType > StyleDialog::LabelTypeStrings;
  139. TypeStringAssociator < StyleSettings::eNumberType > StyleDialog::NumberTypeStrings;
  140. BEGIN_EVENT_TABLE(StyleDialog, wxDialog)
  141.     EVT_CLOSE       (       StyleDialog::OnCloseWindow)
  142.     EVT_CHOICE      (-1,    StyleDialog::OnChange)
  143.     EVT_CHECKBOX    (-1,    StyleDialog::OnChange)
  144.     EVT_SPINCTRL    (-1,    StyleDialog::OnChange)
  145.     EVT_BUTTON      (-1,    StyleDialog::OnButton)
  146.     // generated when {Integer,FloatingPoint}SpinCtrl changes
  147.     EVT_COMMAND     (-1, WX_TOOLS_NOTIFY_CHANGED, StyleDialog::OnChange)
  148. END_EVENT_TABLE()
  149. StyleDialog::StyleDialog(wxWindow* parent, StyleSettings *settingsToEdit, const StructureSet *set) :
  150.     wxDialog(parent, -1, "Style Options", wxPoint(400, 100), wxDefaultSize,
  151.         wxCAPTION | wxSYSTEM_MENU), // not resizable
  152.     editedSettings(settingsToEdit), originalSettings(*settingsToEdit),
  153.     structureSet(set), changedSinceApply(false), changedEver(false)
  154. {
  155.     // setup maps for associating style types with strings
  156.     SetupStyleStrings();
  157.     // construct the panel
  158.     wxPanel *panel = new wxPanel(this, -1);
  159.     wxSizer *topSizer = LayoutNotebook(panel, false);
  160.     // hook in the stuff that the wxDesigner-based code (LayoutPage2()) created
  161.     fpSpaceFill = gfpSpaceFill;
  162.     fpBallRadius = gfpBallRadius;
  163.     fpStickRadius = gfpStickRadius;
  164.     fpTubeRadius = gfpTubeRadius;
  165.     fpTubeWormRadius = gfpTubeWormRadius;
  166.     fpHelixRadius = gfpHelixRadius;
  167.     fpStrandWidth = gfpStrandWidth;
  168.     fpStrandThickness = gfpStrandThickness;
  169.     // set defaults
  170.     SetControls(*editedSettings);
  171.     // call sizer stuff
  172.     topSizer->Fit(this);
  173.     topSizer->Fit(panel);
  174.     topSizer->SetSizeHints(this);
  175. }
  176. StyleDialog::~StyleDialog(void)
  177. {
  178.     delete fpSpaceFill;
  179.     delete fpBallRadius;
  180.     delete fpStickRadius;
  181.     delete fpTubeRadius;
  182.     delete fpTubeWormRadius;
  183.     delete fpHelixRadius;
  184.     delete fpStrandWidth;
  185.     delete fpStrandThickness;
  186. }
  187. void StyleDialog::SetupStyleStrings(void)
  188. {
  189.     if (BackboneTypeStrings.Size() == 0) {
  190.         BackboneTypeStrings.Associate(StyleSettings::eOff, "None");
  191.         BackboneTypeStrings.Associate(StyleSettings::eTrace, "Trace");
  192.         BackboneTypeStrings.Associate(StyleSettings::ePartial, "Partial");
  193.         BackboneTypeStrings.Associate(StyleSettings::eComplete, "Complete");
  194.         DrawingStyleStrings.Associate(StyleSettings::eWire, "Wire");
  195.         DrawingStyleStrings.Associate(StyleSettings::eTubes, "Tubes");
  196.         DrawingStyleStrings.Associate(StyleSettings::eBallAndStick, "Ball and Stick");
  197.         DrawingStyleStrings.Associate(StyleSettings::eSpaceFill, "Space Fill");
  198.         DrawingStyleStrings.Associate(StyleSettings::eWireWorm, "Wire Worm");
  199.         DrawingStyleStrings.Associate(StyleSettings::eTubeWorm, "Tube Worm");
  200.         DrawingStyleStrings.Associate(StyleSettings::eWithArrows, "With Arrows");
  201.         DrawingStyleStrings.Associate(StyleSettings::eWithoutArrows, "Without Arrows");
  202.         ColorSchemeStrings.Associate(StyleSettings::eElement, "Element");
  203.         ColorSchemeStrings.Associate(StyleSettings::eObject, "Object");
  204.         ColorSchemeStrings.Associate(StyleSettings::eMolecule, "Molecule");
  205.         ColorSchemeStrings.Associate(StyleSettings::eDomain, "Domain");
  206.         ColorSchemeStrings.Associate(StyleSettings::eSecondaryStructure, "Secondary Structure");
  207.         ColorSchemeStrings.Associate(StyleSettings::eUserSelect, "User Selection");
  208.         ColorSchemeStrings.Associate(StyleSettings::eAligned, "Aligned");
  209.         ColorSchemeStrings.Associate(StyleSettings::eIdentity, "Identity");
  210.         ColorSchemeStrings.Associate(StyleSettings::eVariety, "Variety");
  211.         ColorSchemeStrings.Associate(StyleSettings::eWeightedVariety, "Weighted Variety");
  212.         ColorSchemeStrings.Associate(StyleSettings::eInformationContent, "Information Content");
  213.         ColorSchemeStrings.Associate(StyleSettings::eFit, "Fit");
  214.         ColorSchemeStrings.Associate(StyleSettings::eBlockFit, "Block Fit");
  215.         ColorSchemeStrings.Associate(StyleSettings::eBlockZFit, "Normalized Block Fit");
  216.         ColorSchemeStrings.Associate(StyleSettings::eBlockRowFit, "Block Row Fit");
  217.         ColorSchemeStrings.Associate(StyleSettings::eTemperature, "Temperature");
  218.         ColorSchemeStrings.Associate(StyleSettings::eHydrophobicity, "Hydrophobicity");
  219.         ColorSchemeStrings.Associate(StyleSettings::eRainbow, "Rainbow");
  220.         ColorSchemeStrings.Associate(StyleSettings::eCharge, "Charge");
  221.         LabelTypeStrings.Associate(StyleSettings::eOneLetter, "One Letter");
  222.         LabelTypeStrings.Associate(StyleSettings::eThreeLetter, "Three Letter");
  223.         NumberTypeStrings.Associate(StyleSettings::eNoNumbers, "None");
  224.         NumberTypeStrings.Associate(StyleSettings::eSequentialNumbering, "Sequential");
  225.         NumberTypeStrings.Associate(StyleSettings::ePDBNumbering, "From PDB");
  226.     }
  227. }
  228. static bool ConvertColor(const wxColour& wxcol, Vector *vec)
  229. {
  230.     vec->Set(((double) wxcol.Red())/255.0, ((double) wxcol.Green())/255.0, ((double) wxcol.Blue())/255.0);
  231.     return true;
  232. }
  233. bool StyleDialog::GetBackboneStyle(StyleSettings::BackboneStyle *bbStyle,
  234.     int showID, int renderID, int colorID, int userID)
  235. {
  236.     wxChoice *choice;
  237.     wxButton *button;
  238.     return (
  239.         (choice = wxDynamicCast(FindWindow(showID), wxChoice)) != NULL &&
  240.         BackboneTypeStrings.Get(choice->GetStringSelection().c_str(), &(bbStyle->type)) &&
  241.         (choice = wxDynamicCast(FindWindow(renderID), wxChoice)) != NULL &&
  242.         DrawingStyleStrings.Get(choice->GetStringSelection().c_str(), &(bbStyle->style)) &&
  243.         (choice = wxDynamicCast(FindWindow(colorID), wxChoice)) != NULL &&
  244.         ColorSchemeStrings.Get(choice->GetStringSelection().c_str(), &(bbStyle->colorScheme)) &&
  245.         (button = wxDynamicCast(FindWindow(userID), wxButton)) != NULL &&
  246.         ConvertColor(button->GetBackgroundColour(), &(bbStyle->userColor))
  247.     );
  248. }
  249. static bool GetChecked(wxCheckBox *checkbox, bool *isChecked)
  250. {
  251.     if (!checkbox) return false;
  252.     *isChecked = checkbox->GetValue();
  253.     return true;
  254. }
  255. bool StyleDialog::GetGeneralStyle(StyleSettings::GeneralStyle *gStyle,
  256.     int showID, int renderID, int colorID, int userID)
  257. {
  258.     wxCheckBox *checkbox;
  259.     wxChoice *choice;
  260.     wxButton *button;
  261.     return (
  262.         (checkbox = wxDynamicCast(FindWindow(showID), wxCheckBox)) != NULL &&
  263.         GetChecked(checkbox, &(gStyle->isOn)) &&
  264.         (choice = wxDynamicCast(FindWindow(renderID), wxChoice)) != NULL &&
  265.         DrawingStyleStrings.Get(choice->GetStringSelection().c_str(), &(gStyle->style)) &&
  266.         (choice = wxDynamicCast(FindWindow(colorID), wxChoice)) != NULL &&
  267.         ColorSchemeStrings.Get(choice->GetStringSelection().c_str(), &(gStyle->colorScheme)) &&
  268.         (button = wxDynamicCast(FindWindow(userID), wxButton)) != NULL &&
  269.         ConvertColor(button->GetBackgroundColour(), &(gStyle->userColor))
  270.     );
  271. }
  272. static bool GetInteger(wxSpinCtrl *spinctrl, int *value)
  273. {
  274.     if (!spinctrl) return false;
  275.     *value = spinctrl->GetValue();
  276.     return true;
  277. }
  278. bool StyleDialog::GetLabelStyle(StyleSettings::LabelStyle *lStyle,
  279.     int spacingID, int typeID, int numberingID, int terminiID, int whiteID)
  280. {
  281.     wxSpinCtrl *spinctrl;
  282.     wxChoice *choice;
  283.     wxCheckBox *checkbox;
  284.     return (
  285.         (spinctrl = wxDynamicCast(FindWindow(spacingID), wxSpinCtrl)) != NULL &&
  286.         GetInteger(spinctrl, &(lStyle->spacing)) &&
  287.         (choice = wxDynamicCast(FindWindow(typeID), wxChoice)) != NULL &&
  288.         LabelTypeStrings.Get(choice->GetStringSelection().c_str(), &(lStyle->type)) &&
  289.         (choice = wxDynamicCast(FindWindow(numberingID), wxChoice)) != NULL &&
  290.         NumberTypeStrings.Get(choice->GetStringSelection().c_str(), &(lStyle->numbering)) &&
  291.         (checkbox = wxDynamicCast(FindWindow(terminiID), wxCheckBox)) != NULL &&
  292.         GetChecked(checkbox, &(lStyle->terminiOn)) &&
  293.         (checkbox = wxDynamicCast(FindWindow(whiteID), wxCheckBox)) != NULL &&
  294.         GetChecked(checkbox, &(lStyle->white))
  295.     );
  296. }
  297. bool StyleDialog::GetValues(StyleSettings *settings)
  298. {
  299.     wxCheckBox *checkbox;
  300.     wxButton *button;
  301.     bool okay = (
  302.         settings != NULL &&
  303.         GetBackboneStyle(&(settings->proteinBackbone),
  304.             ID_PBB_SHOW, ID_PBB_RENDER, ID_PBB_COLOR, ID_PBB_USER) &&
  305.         GetGeneralStyle(&(settings->proteinSidechains),
  306.             ID_PSIDE_SHOW, ID_PSIDE_RENDER, ID_PSIDE_COLOR, ID_PSIDE_USER) &&
  307.         GetBackboneStyle(&(settings->nucleotideBackbone),
  308.             ID_NUC_SHOW, ID_NUC_RENDER, ID_NUC_COLOR, ID_NUC_USER) &&
  309.         GetGeneralStyle(&(settings->nucleotideSidechains),
  310.             ID_NSIDE_SHOW, ID_NSIDE_RENDER, ID_NSIDE_COLOR, ID_NSIDE_USER) &&
  311.         GetGeneralStyle(&(settings->heterogens),
  312.             ID_HET_SHOW, ID_HET_RENDER, ID_HET_COLOR, ID_HET_USER) &&
  313.         GetGeneralStyle(&(settings->solvents),
  314.             ID_SOLV_SHOW, ID_SOLV_RENDER, ID_SOLV_COLOR, ID_SOLV_USER) &&
  315.         GetGeneralStyle(&(settings->connections),
  316.             ID_CONN_SHOW, ID_CONN_RENDER, ID_CONN_COLOR, ID_CONN_USER) &&
  317.         GetGeneralStyle(&(settings->helixObjects),
  318.             ID_HELX_SHOW, ID_HELX_RENDER, ID_HELX_COLOR, ID_HELX_USER) &&
  319.         GetGeneralStyle(&(settings->strandObjects),
  320.             ID_STRN_SHOW, ID_STRN_RENDER, ID_STRN_COLOR, ID_STRN_USER) &&
  321.         (checkbox = wxDynamicCast(FindWindow(ID_VSS_SHOW), wxCheckBox)) != NULL &&
  322.         GetChecked(checkbox, &(settings->virtualDisulfidesOn)) &&
  323.         (button = wxDynamicCast(FindWindow(ID_VSS_USER), wxButton)) != NULL &&
  324.         ConvertColor(button->GetBackgroundColour(), &(settings->virtualDisulfideColor)) &&
  325.         (checkbox = wxDynamicCast(FindWindow(ID_HYD_SHOW), wxCheckBox)) != NULL &&
  326.         GetChecked(checkbox, &(settings->hydrogensOn)) &&
  327.         (button = wxDynamicCast(FindWindow(ID_BG_USER), wxButton)) != NULL &&
  328.         ConvertColor(button->GetBackgroundColour(), &(settings->backgroundColor)) &&
  329.         fpSpaceFill->GetDouble(&(settings->spaceFillProportion)) &&
  330.         fpBallRadius->GetDouble(&(settings->ballRadius)) &&
  331.         fpStickRadius->GetDouble(&(settings->stickRadius)) &&
  332.         fpTubeRadius->GetDouble(&(settings->tubeRadius)) &&
  333.         fpTubeWormRadius->GetDouble(&(settings->tubeWormRadius)) &&
  334.         fpHelixRadius->GetDouble(&(settings->helixRadius)) &&
  335.         fpStrandWidth->GetDouble(&(settings->strandWidth)) &&
  336.         fpStrandThickness->GetDouble(&(settings->strandThickness)) &&
  337.         GetLabelStyle(&(settings->proteinLabels),
  338.             ID_S_PROT, ID_C_PROT_TYPE, ID_C_PROT_NUM, ID_K_PROT_TERM, ID_K_PROT_CONTRAST) &&
  339.         GetLabelStyle(&(settings->nucleotideLabels),
  340.             ID_S_NUC, ID_C_NUC_TYPE, ID_C_NUC_NUM, ID_K_NUC_TERM, ID_K_NUC_CONTRAST) &&
  341.         (checkbox = wxDynamicCast(FindWindow(ID_K_ION), wxCheckBox)) != NULL &&
  342.         GetChecked(checkbox, &(settings->ionLabelsOn))
  343.     );
  344.     if (!okay) ERRORMSG("StyleDialog::GetValues() - control/parameter mismatch: invalid style?");
  345.     return okay;
  346. }
  347. static bool SetChoiceToString(wxChoice *choice, const string& name)
  348. {
  349.     int field = choice->FindString(name.c_str());
  350.     if (field < 0) return false;
  351.     choice->SetSelection(field);
  352.     return true;
  353. }
  354. static bool SetButtonColor(wxButton *button, const Vector& color)
  355. {
  356.     if (!button) return false;
  357.     wxColour wxcol(
  358.         static_cast<unsigned char>((color[0] + 0.000001) * 255),
  359.         static_cast<unsigned char>((color[1] + 0.000001) * 255),
  360.         static_cast<unsigned char>((color[2] + 0.000001) * 255)
  361.     );
  362.     // set both foreground and background colors, so that if e.g. on wxGTK themes are
  363.     // used (and thus backgrounds are not user-selectable), at least the text (foreground)
  364.     // color will indicate the user's color choice
  365.     button->SetForegroundColour(wxcol);
  366.     button->SetBackgroundColour(wxcol);
  367.     return true;
  368. }
  369. bool StyleDialog::SetBackboneStyle(const StyleSettings::BackboneStyle& bbStyle,
  370.     int showID, int renderID, int colorID, int userID)
  371. {
  372.     string name;
  373.     wxChoice *choice;
  374.     wxButton *button;
  375.     return (
  376.         BackboneTypeStrings.Get(bbStyle.type, &name) &&
  377.         (choice = wxDynamicCast(FindWindow(showID), wxChoice)) != NULL &&
  378.         SetChoiceToString(choice, name) &&
  379.         DrawingStyleStrings.Get(bbStyle.style, &name) &&
  380.         (choice = wxDynamicCast(FindWindow(renderID), wxChoice)) != NULL &&
  381.         SetChoiceToString(choice, name) &&
  382.         ColorSchemeStrings.Get(bbStyle.colorScheme, &name) &&
  383.         (choice = wxDynamicCast(FindWindow(colorID), wxChoice)) != NULL &&
  384.         SetChoiceToString(choice, name) &&
  385.         (button = wxDynamicCast(FindWindow(userID), wxButton)) != NULL &&
  386.         SetButtonColor(button, bbStyle.userColor)
  387.     );
  388. }
  389. static bool SetChecked(wxCheckBox *checkbox, bool isChecked)
  390. {
  391.     if (!checkbox) return false;
  392.     checkbox->SetValue(isChecked);
  393.     return true;
  394. }
  395. bool StyleDialog::SetGeneralStyle(const StyleSettings::GeneralStyle& gStyle,
  396.     int showID, int renderID, int colorID, int userID)
  397. {
  398.     string name;
  399.     wxCheckBox *checkbox;
  400.     wxChoice *choice;
  401.     wxButton *button;
  402.     return (
  403.         (checkbox = wxDynamicCast(FindWindow(showID), wxCheckBox)) != NULL &&
  404.         SetChecked(checkbox, gStyle.isOn) &&
  405.         DrawingStyleStrings.Get(gStyle.style, &name) &&
  406.         (choice = wxDynamicCast(FindWindow(renderID), wxChoice)) != NULL &&
  407.         SetChoiceToString(choice, name) &&
  408.         ColorSchemeStrings.Get(gStyle.colorScheme, &name) &&
  409.         (choice = wxDynamicCast(FindWindow(colorID), wxChoice)) != NULL &&
  410.         SetChoiceToString(choice, name) &&
  411.         (button = wxDynamicCast(FindWindow(userID), wxButton)) != NULL &&
  412.         SetButtonColor(button, gStyle.userColor)
  413.     );
  414. }
  415. static bool SetInteger(wxSpinCtrl *spinctrl, int value)
  416. {
  417.     if (!spinctrl) return false;
  418.     spinctrl->SetValue(value);
  419.     return true;
  420. }
  421. bool StyleDialog::SetLabelStyle(const StyleSettings::LabelStyle& lStyle,
  422.     int spacingID, int typeID, int numberingID, int terminiID, int whiteID)
  423. {
  424.     string name;
  425.     wxSpinCtrl *spinctrl;
  426.     wxCheckBox *checkbox;
  427.     wxChoice *choice;
  428.     return (
  429.         (spinctrl = wxDynamicCast(FindWindow(spacingID), wxSpinCtrl)) != NULL &&
  430.         SetInteger(spinctrl, lStyle.spacing) &&
  431.         LabelTypeStrings.Get(lStyle.type, &name) &&
  432.         (choice = wxDynamicCast(FindWindow(typeID), wxChoice)) != NULL &&
  433.         SetChoiceToString(choice, name) &&
  434.         NumberTypeStrings.Get(lStyle.numbering, &name) &&
  435.         (choice = wxDynamicCast(FindWindow(numberingID), wxChoice)) != NULL &&
  436.         SetChoiceToString(choice, name) &&
  437.         (checkbox = wxDynamicCast(FindWindow(terminiID), wxCheckBox)) != NULL &&
  438.         SetChecked(checkbox, lStyle.terminiOn) &&
  439.         (checkbox = wxDynamicCast(FindWindow(whiteID), wxCheckBox)) != NULL &&
  440.         SetChecked(checkbox, lStyle.white)
  441.     );
  442. }
  443. bool StyleDialog::SetControls(const StyleSettings& settings)
  444. {
  445.     wxCheckBox *checkbox;
  446.     wxButton *button;
  447.     bool okay = (
  448.         SetBackboneStyle(settings.proteinBackbone,
  449.             ID_PBB_SHOW, ID_PBB_RENDER, ID_PBB_COLOR, ID_PBB_USER) &&
  450.         SetGeneralStyle(settings.proteinSidechains,
  451.             ID_PSIDE_SHOW, ID_PSIDE_RENDER, ID_PSIDE_COLOR, ID_PSIDE_USER) &&
  452.         SetBackboneStyle(settings.nucleotideBackbone,
  453.             ID_NUC_SHOW, ID_NUC_RENDER, ID_NUC_COLOR, ID_NUC_USER) &&
  454.         SetGeneralStyle(settings.nucleotideSidechains,
  455.             ID_NSIDE_SHOW, ID_NSIDE_RENDER, ID_NSIDE_COLOR, ID_NSIDE_USER) &&
  456.         SetGeneralStyle(settings.heterogens,
  457.             ID_HET_SHOW, ID_HET_RENDER, ID_HET_COLOR, ID_HET_USER) &&
  458.         SetGeneralStyle(settings.solvents,
  459.             ID_SOLV_SHOW, ID_SOLV_RENDER, ID_SOLV_COLOR, ID_SOLV_USER) &&
  460.         SetGeneralStyle(settings.connections,
  461.             ID_CONN_SHOW, ID_CONN_RENDER, ID_CONN_COLOR, ID_CONN_USER) &&
  462.         SetGeneralStyle(settings.helixObjects,
  463.             ID_HELX_SHOW, ID_HELX_RENDER, ID_HELX_COLOR, ID_HELX_USER) &&
  464.         SetGeneralStyle(settings.strandObjects,
  465.             ID_STRN_SHOW, ID_STRN_RENDER, ID_STRN_COLOR, ID_STRN_USER) &&
  466.         (checkbox = wxDynamicCast(FindWindow(ID_VSS_SHOW), wxCheckBox)) != NULL &&
  467.         SetChecked(checkbox, settings.virtualDisulfidesOn) &&
  468.         (button = wxDynamicCast(FindWindow(ID_VSS_USER), wxButton)) != NULL &&
  469.         SetButtonColor(button, settings.virtualDisulfideColor) &&
  470.         (checkbox = wxDynamicCast(FindWindow(ID_HYD_SHOW), wxCheckBox)) != NULL &&
  471.         SetChecked(checkbox, settings.hydrogensOn) &&
  472.         (button = wxDynamicCast(FindWindow(ID_BG_USER), wxButton)) != NULL &&
  473.         SetButtonColor(button, settings.backgroundColor) &&
  474.         fpSpaceFill->SetDouble(settings.spaceFillProportion) &&
  475.         fpBallRadius->SetDouble(settings.ballRadius) &&
  476.         fpStickRadius->SetDouble(settings.stickRadius) &&
  477.         fpTubeRadius->SetDouble(settings.tubeRadius) &&
  478.         fpTubeWormRadius->SetDouble(settings.tubeWormRadius) &&
  479.         fpHelixRadius->SetDouble(settings.helixRadius) &&
  480.         fpStrandWidth->SetDouble(settings.strandWidth) &&
  481.         fpStrandThickness->SetDouble(settings.strandThickness) &&
  482.         SetLabelStyle(settings.proteinLabels,
  483.             ID_S_PROT, ID_C_PROT_TYPE, ID_C_PROT_NUM, ID_K_PROT_TERM, ID_K_PROT_CONTRAST) &&
  484.         SetLabelStyle(settings.nucleotideLabels,
  485.             ID_S_NUC, ID_C_NUC_TYPE, ID_C_NUC_NUM, ID_K_NUC_TERM, ID_K_NUC_CONTRAST) &&
  486.         (checkbox = wxDynamicCast(FindWindow(ID_K_ION), wxCheckBox)) != NULL &&
  487.         SetChecked(checkbox, settings.ionLabelsOn)
  488.     );
  489.     if (!okay) ERRORMSG("StyleDialog::SetControls() - control/parameter mismatch: invalid style?");
  490.     return okay;
  491. }
  492. // same as hitting done button
  493. void StyleDialog::OnCloseWindow(wxCloseEvent& event)
  494. {
  495.     StyleSettings dummy;
  496.     if (GetValues(&dummy)) {
  497.         if (changedSinceApply) {
  498.             *editedSettings = dummy;
  499.             GlobalMessenger()->PostRedrawAllStructures();
  500.             GlobalMessenger()->PostRedrawAllSequenceViewers();
  501. //            structureSet->SetDataChanged(StructureSet::eStyleData);
  502.         }
  503.     } else
  504.         wxBell();
  505.     EndModal(wxOK);
  506. }
  507. void StyleDialog::OnButton(wxCommandEvent& event)
  508. {
  509.     switch (event.GetId()) {
  510.         case ID_DONE: {
  511.             StyleSettings dummy;
  512.             if (GetValues(&dummy)) {
  513.                 if (changedSinceApply) {
  514.                     *editedSettings = dummy;
  515.                     GlobalMessenger()->PostRedrawAllStructures();
  516.                     GlobalMessenger()->PostRedrawAllSequenceViewers();
  517.                 }
  518. //                if (changedEver)
  519. //                    structureSet->SetDataChanged(StructureSet::eStyleData);
  520.                 EndModal(wxOK);
  521.             } else
  522.                 wxBell();
  523.             break;
  524.         }
  525.         case ID_APPLY: {
  526.             StyleSettings dummy;
  527.             if (GetValues(&dummy)) {
  528.                 *editedSettings = dummy;
  529.                 GlobalMessenger()->PostRedrawAllStructures();
  530.                 GlobalMessenger()->PostRedrawAllSequenceViewers();
  531.                 changedSinceApply = false;
  532. //                structureSet->SetDataChanged(StructureSet::eStyleData);
  533.             } else
  534.                 wxBell();
  535.             break;
  536.         }
  537.         case ID_CANCEL:
  538.             if (changedEver) {
  539.                 *editedSettings = originalSettings;
  540.                 GlobalMessenger()->PostRedrawAllStructures();
  541.                 GlobalMessenger()->PostRedrawAllSequenceViewers();
  542.             }
  543.             EndModal(wxCANCEL);
  544.             break;
  545.         default:
  546.             if (!HandleColorButton(event.GetId()))
  547.                 event.Skip();
  548.     }
  549. }
  550. // return true if bID does actually correspond to a valid color button
  551. bool StyleDialog::HandleColorButton(int bID)
  552. {
  553.     // just a filter to make sure the button pushed is really a user color button
  554.     switch (bID) {
  555.         case ID_PBB_USER: case ID_PSIDE_USER: case ID_NUC_USER: case ID_NSIDE_USER:
  556.         case ID_HET_USER: case ID_SOLV_USER: case ID_CONN_USER: case ID_HELX_USER:
  557.         case ID_STRN_USER: case ID_VSS_USER: case ID_BG_USER:
  558.             break;
  559.         default:
  560.             return false;
  561.     }
  562.     wxButton *button = wxDynamicCast(FindWindow(bID), wxButton);
  563.     if (!button) {
  564.         ERRORMSG("StyleDialog::HandleColorButton() - can't find button of given ID");
  565.         return false;
  566.     }
  567.     wxColour userColor = wxGetColourFromUser(this, button->GetBackgroundColour());
  568.     if (userColor.Ok()) {
  569.         button->SetBackgroundColour(userColor);
  570.         wxCommandEvent fake;
  571.         OnChange(fake);
  572.     }
  573.     return true;
  574. }
  575. void StyleDialog::OnChange(wxCommandEvent& event)
  576. {
  577.     TRACEMSG("control changed");
  578.     StyleSettings tmpSettings;
  579.     if (!GetValues(&tmpSettings) ||
  580.         !structureSet->styleManager->CheckStyleSettings(&tmpSettings) ||
  581.         !SetControls(tmpSettings)) {
  582.         ERRORMSG("StyleDialog::OnChange() - error adjusting settings/controls");
  583.         return;
  584.     }
  585.     changedSinceApply = changedEver = true;
  586.     if ((wxDynamicCast(FindWindow(ID_ALWAYS_APPLY), wxCheckBox))->GetValue()) {
  587.         *editedSettings = tmpSettings;
  588.         GlobalMessenger()->PostRedrawAllStructures();
  589.         GlobalMessenger()->PostRedrawAllSequenceViewers();
  590.         changedSinceApply = false;
  591.     }
  592. }
  593. END_SCOPE(Cn3D)
  594. //////////////////////////////////////////////////////////////////////////////////////////////////
  595. // Three of four of these following functions are taken *without* modification
  596. // from wxDesigner C++ code generated from render_settings.wdr. The function LayoutDetailsPage()
  597. // is modified from wxDesigner output in order to use custom FloatingPointSpinCtrl's
  598. //////////////////////////////////////////////////////////////////////////////////////////////////
  599. wxSizer *LayoutNotebook( wxPanel *parent, bool call_fit, bool set_sizer )
  600. {
  601.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  602.     wxNotebook *item2 = new wxNotebook( parent, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize, 0 );
  603.     wxNotebookSizer *item1 = new wxNotebookSizer( item2 );
  604.     wxPanel *item3 = new wxPanel( item2, -1 );
  605.     LayoutSettingsPage( item3, FALSE );
  606.     item2->AddPage( item3, "Settings" );
  607.     wxPanel *item4 = new wxPanel( item2, -1 );
  608.     LayoutLabelsPage( item4, FALSE );
  609.     item2->AddPage( item4, "Labels" );
  610.     wxPanel *item5 = new wxPanel( item2, -1 );
  611.     LayoutDetailsPage( item5, FALSE );
  612.     item2->AddPage( item5, "Details" );
  613.     item0->Add( item1, 0, wxALIGN_CENTRE|wxALL, 5 );
  614.     wxBoxSizer *item6 = new wxBoxSizer( wxHORIZONTAL );
  615.     wxButton *item7 = new wxButton( parent, ID_DONE, "Done", wxDefaultPosition, wxDefaultSize, 0 );
  616.     item7->SetDefault();
  617.     item6->Add( item7, 0, wxALIGN_CENTRE|wxALL, 5 );
  618.     wxButton *item8 = new wxButton( parent, ID_CANCEL, "Cancel", wxDefaultPosition, wxDefaultSize, 0 );
  619.     item6->Add( item8, 0, wxALIGN_CENTRE|wxALL, 5 );
  620.     item6->Add( 20, 20, 0, wxALIGN_CENTRE|wxALL, 5 );
  621.     wxStaticText *item9 = new wxStaticText( parent, ID_TEXT, "Apply after each change?", wxDefaultPosition, wxDefaultSize, 0 );
  622.     item6->Add( item9, 0, wxALIGN_CENTRE|wxALL, 5 );
  623.     wxCheckBox *item10 = new wxCheckBox( parent, ID_ALWAYS_APPLY, "", wxDefaultPosition, wxDefaultSize, 0 );
  624.     item10->SetValue( TRUE );
  625.     item6->Add( item10, 0, wxALIGN_CENTRE|wxALL, 5 );
  626.     wxButton *item11 = new wxButton( parent, ID_APPLY, "Apply", wxDefaultPosition, wxDefaultSize, 0 );
  627.     item6->Add( item11, 0, wxALIGN_CENTRE|wxALL, 5 );
  628.     item0->Add( item6, 0, wxALIGN_CENTRE|wxALL, 5 );
  629.     if (set_sizer)
  630.     {
  631.         parent->SetAutoLayout( TRUE );
  632.         parent->SetSizer( item0 );
  633.         if (call_fit)
  634.         {
  635.             item0->Fit( parent );
  636.             item0->SetSizeHints( parent );
  637.         }
  638.     }
  639.     return item0;
  640. }
  641. wxSizer *LayoutSettingsPage( wxPanel *parent, bool call_fit, bool set_sizer )
  642. {
  643.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  644.     wxStaticBox *item2 = new wxStaticBox( parent, -1, "Rendering Settings" );
  645.     wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL );
  646.     wxFlexGridSizer *item3 = new wxFlexGridSizer( 5, 0, 0 );
  647.     wxStaticText *item4 = new wxStaticText( parent, ID_TEXT, "Group", wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
  648.     item3->Add( item4, 0, wxALIGN_CENTRE|wxALL, 5 );
  649.     wxStaticText *item5 = new wxStaticText( parent, ID_TEXT, "Show", wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
  650.     item3->Add( item5, 0, wxALIGN_CENTRE|wxALL, 5 );
  651.     wxStaticText *item6 = new wxStaticText( parent, ID_TEXT, "Rendering", wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
  652.     item3->Add( item6, 0, wxALIGN_CENTRE|wxALL, 5 );
  653.     wxStaticText *item7 = new wxStaticText( parent, ID_TEXT, "Color Scheme", wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
  654.     item3->Add( item7, 0, wxALIGN_CENTRE|wxALL, 5 );
  655.     wxStaticText *item8 = new wxStaticText( parent, ID_TEXT, "User Color", wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
  656.     item3->Add( item8, 0, wxALIGN_CENTRE|wxALL, 5 );
  657.     wxStaticText *item9 = new wxStaticText( parent, ID_TEXT, "Protein backbone:", wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
  658.     item3->Add( item9, 0, wxALIGN_CENTRE|wxALL, 5 );
  659.     wxString strs10[] =
  660.     {
  661.         "None",
  662.         "Trace",
  663.         "Partial",
  664.         "Complete"
  665.     };
  666.     wxChoice *item10 = new wxChoice( parent, ID_PBB_SHOW, wxDefaultPosition, wxDefaultSize, 4, strs10, 0 );
  667.     item3->Add( item10, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  668.     wxString strs11[] =
  669.     {
  670.         "Wire Worm",
  671.         "Tube Worm",
  672.         "Wire",
  673.         "Tubes",
  674.         "Ball and Stick",
  675.         "Space Fill"
  676.     };
  677.     wxChoice *item11 = new wxChoice( parent, ID_PBB_RENDER, wxDefaultPosition, wxDefaultSize, 6, strs11, 0 );
  678.     item3->Add( item11, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  679.     wxString strs12[] =
  680.     {
  681.         "Element",
  682.         "Object",
  683.         "Molecule",
  684.         "Domain",
  685.         "Secondary Structure",
  686.         "Temperature",
  687.         "Rainbow",
  688.         "Charge",
  689.         "Hydrophobicity",
  690.         "User Selection",
  691.         "Aligned",
  692.         "Identity",
  693.         "Variety",
  694.         "Weighted Variety",
  695.         "Information Content",
  696.         "Fit",
  697.         "Block Fit",
  698.         "Normalized Block Fit",
  699.         "Block Row Fit"
  700.     };
  701.     wxChoice *item12 = new wxChoice( parent, ID_PBB_COLOR, wxDefaultPosition, wxDefaultSize, 19, strs12, 0 );
  702.     item3->Add( item12, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  703.     wxButton *item13 = new wxButton( parent, ID_PBB_USER, "Set Color", wxDefaultPosition, wxDefaultSize, 0 );
  704.     item3->Add( item13, 0, wxALIGN_CENTRE|wxALL, 5 );
  705.     wxStaticText *item14 = new wxStaticText( parent, ID_TEXT, "Protein sidechains:", wxDefaultPosition, wxDefaultSize, 0 );
  706.     item3->Add( item14, 0, wxALIGN_CENTRE|wxALL, 5 );
  707.     wxCheckBox *item15 = new wxCheckBox( parent, ID_PSIDE_SHOW, "", wxDefaultPosition, wxDefaultSize, 0 );
  708.     item3->Add( item15, 0, wxALIGN_CENTRE|wxALL, 5 );
  709.     wxString strs16[] =
  710.     {
  711.         "Wire",
  712.         "Tubes",
  713.         "Ball and Stick",
  714.         "Space Fill"
  715.     };
  716.     wxChoice *item16 = new wxChoice( parent, ID_PSIDE_RENDER, wxDefaultPosition, wxDefaultSize, 4, strs16, 0 );
  717.     item3->Add( item16, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  718.     wxString strs17[] =
  719.     {
  720.         "Element",
  721.         "Object",
  722.         "Molecule",
  723.         "Domain",
  724.         "Temperature",
  725.         "Rainbow",
  726.         "Charge",
  727.         "Hydrophobicity",
  728.         "User Selection",
  729.         "Aligned",
  730.         "Identity",
  731.         "Variety",
  732.         "Weighted Variety",
  733.         "Information Content",
  734.         "Fit",
  735.         "Block Fit",
  736.         "Normalized Block Fit",
  737.         "Block Row Fit"
  738.     };
  739.     wxChoice *item17 = new wxChoice( parent, ID_PSIDE_COLOR, wxDefaultPosition, wxDefaultSize, 18, strs17, 0 );
  740.     item3->Add( item17, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  741.     wxButton *item18 = new wxButton( parent, ID_PSIDE_USER, "Set Color", wxDefaultPosition, wxDefaultSize, 0 );
  742.     item3->Add( item18, 0, wxALIGN_CENTRE|wxALL, 5 );
  743.     wxStaticText *item19 = new wxStaticText( parent, ID_TEXT, "Nucleotide backbone:", wxDefaultPosition, wxDefaultSize, 0 );
  744.     item3->Add( item19, 0, wxALIGN_CENTRE|wxALL, 5 );
  745.     wxString strs20[] =
  746.     {
  747.         "None",
  748.         "Trace",
  749.         "Partial",
  750.         "Complete"
  751.     };
  752.     wxChoice *item20 = new wxChoice( parent, ID_NUC_SHOW, wxDefaultPosition, wxDefaultSize, 4, strs20, 0 );
  753.     item3->Add( item20, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  754.     wxString strs21[] =
  755.     {
  756.         "Wire Worm",
  757.         "Tube Worm",
  758.         "Wire",
  759.         "Tubes",
  760.         "Ball and Stick",
  761.         "Space Fill"
  762.     };
  763.     wxChoice *item21 = new wxChoice( parent, ID_NUC_RENDER, wxDefaultPosition, wxDefaultSize, 6, strs21, 0 );
  764.     item3->Add( item21, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  765.     wxString strs22[] =
  766.     {
  767.         "Element",
  768.         "Object",
  769.         "Molecule",
  770.         "Domain",
  771.         "Temperature",
  772.         "Rainbow",
  773.         "User Selection"
  774.     };
  775.     wxChoice *item22 = new wxChoice( parent, ID_NUC_COLOR, wxDefaultPosition, wxDefaultSize, 7, strs22, 0 );
  776.     item3->Add( item22, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  777.     wxButton *item23 = new wxButton( parent, ID_NUC_USER, "Set Color", wxDefaultPosition, wxDefaultSize, 0 );
  778.     item3->Add( item23, 0, wxALIGN_CENTRE|wxALL, 5 );
  779.     wxStaticText *item24 = new wxStaticText( parent, ID_TEXT, "Nucleotide sidechains:", wxDefaultPosition, wxDefaultSize, 0 );
  780.     item3->Add( item24, 0, wxALIGN_CENTRE|wxALL, 5 );
  781.     wxCheckBox *item25 = new wxCheckBox( parent, ID_NSIDE_SHOW, "", wxDefaultPosition, wxDefaultSize, 0 );
  782.     item3->Add( item25, 0, wxALIGN_CENTRE|wxALL, 5 );
  783.     wxString strs26[] =
  784.     {
  785.         "Wire",
  786.         "Tubes",
  787.         "Ball and Stick",
  788.         "Space Fill"
  789.     };
  790.     wxChoice *item26 = new wxChoice( parent, ID_NSIDE_RENDER, wxDefaultPosition, wxDefaultSize, 4, strs26, 0 );
  791.     item3->Add( item26, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  792.     wxString strs27[] =
  793.     {
  794.         "Element",
  795.         "Object",
  796.         "Molecule",
  797.         "Domain",
  798.         "Temperature",
  799.         "Rainbow",
  800.         "User Selection"
  801.     };
  802.     wxChoice *item27 = new wxChoice( parent, ID_NSIDE_COLOR, wxDefaultPosition, wxDefaultSize, 7, strs27, 0 );
  803.     item3->Add( item27, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  804.     wxButton *item28 = new wxButton( parent, ID_NSIDE_USER, "Set Color", wxDefaultPosition, wxDefaultSize, 0 );
  805.     item3->Add( item28, 0, wxALIGN_CENTRE|wxALL, 5 );
  806.     wxStaticText *item29 = new wxStaticText( parent, ID_TEXT, "Heterogens:", wxDefaultPosition, wxDefaultSize, 0 );
  807.     item3->Add( item29, 0, wxALIGN_CENTRE|wxALL, 5 );
  808.     wxCheckBox *item30 = new wxCheckBox( parent, ID_HET_SHOW, "", wxDefaultPosition, wxDefaultSize, 0 );
  809.     item3->Add( item30, 0, wxALIGN_CENTRE|wxALL, 5 );
  810.     wxString strs31[] =
  811.     {
  812.         "Wire",
  813.         "Tubes",
  814.         "Ball and Stick",
  815.         "Space Fill"
  816.     };
  817.     wxChoice *item31 = new wxChoice( parent, ID_HET_RENDER, wxDefaultPosition, wxDefaultSize, 4, strs31, 0 );
  818.     item3->Add( item31, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  819.     wxString strs32[] =
  820.     {
  821.         "Element",
  822.         "Object",
  823.         "Molecule",
  824.         "Temperature",
  825.         "User Selection"
  826.     };
  827.     wxChoice *item32 = new wxChoice( parent, ID_HET_COLOR, wxDefaultPosition, wxDefaultSize, 5, strs32, 0 );
  828.     item3->Add( item32, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  829.     wxButton *item33 = new wxButton( parent, ID_HET_USER, "Set Color", wxDefaultPosition, wxDefaultSize, 0 );
  830.     item3->Add( item33, 0, wxALIGN_CENTRE|wxALL, 5 );
  831.     wxStaticText *item34 = new wxStaticText( parent, ID_TEXT, "Solvents:", wxDefaultPosition, wxDefaultSize, 0 );
  832.     item3->Add( item34, 0, wxALIGN_CENTRE|wxALL, 5 );
  833.     wxCheckBox *item35 = new wxCheckBox( parent, ID_SOLV_SHOW, "", wxDefaultPosition, wxDefaultSize, 0 );
  834.     item3->Add( item35, 0, wxALIGN_CENTRE|wxALL, 5 );
  835.     wxString strs36[] =
  836.     {
  837.         "Wire",
  838.         "Tubes",
  839.         "Ball and Stick",
  840.         "Space Fill"
  841.     };
  842.     wxChoice *item36 = new wxChoice( parent, ID_SOLV_RENDER, wxDefaultPosition, wxDefaultSize, 4, strs36, 0 );
  843.     item3->Add( item36, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  844.     wxString strs37[] =
  845.     {
  846.         "Element",
  847.         "Object",
  848.         "Molecule",
  849.         "Temperature",
  850.         "User Selection"
  851.     };
  852.     wxChoice *item37 = new wxChoice( parent, ID_SOLV_COLOR, wxDefaultPosition, wxDefaultSize, 5, strs37, 0 );
  853.     item3->Add( item37, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  854.     wxButton *item38 = new wxButton( parent, ID_SOLV_USER, "Set Color", wxDefaultPosition, wxDefaultSize, 0 );
  855.     item3->Add( item38, 0, wxALIGN_CENTRE|wxALL, 5 );
  856.     wxStaticText *item39 = new wxStaticText( parent, ID_TEXT, "Connections:", wxDefaultPosition, wxDefaultSize, 0 );
  857.     item3->Add( item39, 0, wxALIGN_CENTRE|wxALL, 5 );
  858.     wxCheckBox *item40 = new wxCheckBox( parent, ID_CONN_SHOW, "", wxDefaultPosition, wxDefaultSize, 0 );
  859.     item3->Add( item40, 0, wxALIGN_CENTRE|wxALL, 5 );
  860.     wxString strs41[] =
  861.     {
  862.         "Wire",
  863.         "Tubes"
  864.     };
  865.     wxChoice *item41 = new wxChoice( parent, ID_CONN_RENDER, wxDefaultPosition, wxDefaultSize, 2, strs41, 0 );
  866.     item3->Add( item41, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  867.     wxString strs42[] =
  868.     {
  869.         "User Selection"
  870.     };
  871.     wxChoice *item42 = new wxChoice( parent, ID_CONN_COLOR, wxDefaultPosition, wxDefaultSize, 1, strs42, 0 );
  872.     item3->Add( item42, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  873.     wxButton *item43 = new wxButton( parent, ID_CONN_USER, "Set Color", wxDefaultPosition, wxDefaultSize, 0 );
  874.     item3->Add( item43, 0, wxALIGN_CENTRE|wxALL, 5 );
  875.     wxStaticText *item44 = new wxStaticText( parent, ID_TEXT, "Helix objects:", wxDefaultPosition, wxDefaultSize, 0 );
  876.     item3->Add( item44, 0, wxALIGN_CENTRE|wxALL, 5 );
  877.     wxCheckBox *item45 = new wxCheckBox( parent, ID_HELX_SHOW, "", wxDefaultPosition, wxDefaultSize, 0 );
  878.     item3->Add( item45, 0, wxALIGN_CENTRE|wxALL, 5 );
  879.     wxString strs46[] =
  880.     {
  881.         "With Arrows",
  882.         "Without Arrows"
  883.     };
  884.     wxChoice *item46 = new wxChoice( parent, ID_HELX_RENDER, wxDefaultPosition, wxDefaultSize, 2, strs46, 0 );
  885.     item3->Add( item46, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  886.     wxString strs47[] =
  887.     {
  888.         "Object",
  889.         "Molecule",
  890.         "Domain",
  891.         "Secondary Structure",
  892.         "User Selection"
  893.     };
  894.     wxChoice *item47 = new wxChoice( parent, ID_HELX_COLOR, wxDefaultPosition, wxDefaultSize, 5, strs47, 0 );
  895.     item3->Add( item47, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  896.     wxButton *item48 = new wxButton( parent, ID_HELX_USER, "Set Color", wxDefaultPosition, wxDefaultSize, 0 );
  897.     item3->Add( item48, 0, wxALIGN_CENTRE|wxALL, 5 );
  898.     wxStaticText *item49 = new wxStaticText( parent, ID_TEXT, "Strand objects:", wxDefaultPosition, wxDefaultSize, 0 );
  899.     item3->Add( item49, 0, wxALIGN_CENTRE|wxALL, 5 );
  900.     wxCheckBox *item50 = new wxCheckBox( parent, ID_STRN_SHOW, "", wxDefaultPosition, wxDefaultSize, 0 );
  901.     item3->Add( item50, 0, wxALIGN_CENTRE|wxALL, 5 );
  902.     wxString strs51[] =
  903.     {
  904.         "With Arrows",
  905.         "Without Arrows"
  906.     };
  907.     wxChoice *item51 = new wxChoice( parent, ID_STRN_RENDER, wxDefaultPosition, wxDefaultSize, 2, strs51, 0 );
  908.     item3->Add( item51, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  909.     wxString strs52[] =
  910.     {
  911.         "Object",
  912.         "Molecule",
  913.         "Domain",
  914.         "Secondary Structure",
  915.         "User Selection"
  916.     };
  917.     wxChoice *item52 = new wxChoice( parent, ID_STRN_COLOR, wxDefaultPosition, wxDefaultSize, 5, strs52, 0 );
  918.     item3->Add( item52, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  919.     wxButton *item53 = new wxButton( parent, ID_STRN_USER, "Set Color", wxDefaultPosition, wxDefaultSize, 0 );
  920.     item3->Add( item53, 0, wxALIGN_CENTRE|wxALL, 5 );
  921.     wxStaticText *item54 = new wxStaticText( parent, ID_TEXT, "Virtual disulfides:", wxDefaultPosition, wxDefaultSize, 0 );
  922.     item3->Add( item54, 0, wxALIGN_CENTRE|wxALL, 5 );
  923.     wxCheckBox *item55 = new wxCheckBox( parent, ID_VSS_SHOW, "", wxDefaultPosition, wxDefaultSize, 0 );
  924.     item3->Add( item55, 0, wxALIGN_CENTRE|wxALL, 5 );
  925.     item3->Add( 5, 5, 0, wxALIGN_CENTRE|wxALL, 5 );
  926.     item3->Add( 5, 5, 0, wxALIGN_CENTRE|wxALL, 5 );
  927.     wxButton *item56 = new wxButton( parent, ID_VSS_USER, "Set Color", wxDefaultPosition, wxDefaultSize, 0 );
  928.     item3->Add( item56, 0, wxALIGN_CENTRE|wxALL, 5 );
  929.     wxStaticText *item57 = new wxStaticText( parent, ID_TEXT, "Hydrogens:", wxDefaultPosition, wxDefaultSize, 0 );
  930.     item3->Add( item57, 0, wxALIGN_CENTRE|wxALL, 5 );
  931.     wxCheckBox *item58 = new wxCheckBox( parent, ID_HYD_SHOW, "", wxDefaultPosition, wxDefaultSize, 0 );
  932.     item3->Add( item58, 0, wxALIGN_CENTRE|wxALL, 5 );
  933.     item3->Add( 5, 5, 0, wxALIGN_CENTRE|wxALL, 5 );
  934.     wxStaticText *item59 = new wxStaticText( parent, ID_TEXT, "Background:", wxDefaultPosition, wxDefaultSize, 0 );
  935.     item3->Add( item59, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  936.     wxButton *item60 = new wxButton( parent, ID_BG_USER, "Set Color", wxDefaultPosition, wxDefaultSize, 0 );
  937.     item3->Add( item60, 0, wxALIGN_CENTRE|wxALL, 5 );
  938.     item1->Add( item3, 0, wxALIGN_CENTRE|wxALL, 5 );
  939.     item0->Add( item1, 0, wxALIGN_CENTRE|wxALL, 5 );
  940.     if (set_sizer)
  941.     {
  942.         parent->SetAutoLayout( TRUE );
  943.         parent->SetSizer( item0 );
  944.         if (call_fit)
  945.         {
  946.             item0->Fit( parent );
  947.             item0->SetSizeHints( parent );
  948.         }
  949.     }
  950.     return item0;
  951. }
  952. wxSizer *LayoutLabelsPage( wxPanel *parent, bool call_fit, bool set_sizer )
  953. {
  954.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  955.     wxStaticBox *item2 = new wxStaticBox( parent, -1, "Labeling Settings" );
  956.     wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL );
  957.     wxBoxSizer *item3 = new wxBoxSizer( wxVERTICAL );
  958.     wxGridSizer *item4 = new wxGridSizer( 3, 5, 0 );
  959.     item4->Add( 20, 20, 0, wxALIGN_CENTRE|wxALL, 5 );
  960.     wxStaticText *item5 = new wxStaticText( parent, ID_TEXT, "Protein backbone:", wxDefaultPosition, wxDefaultSize, 0 );
  961.     item4->Add( item5, 0, wxALIGN_CENTRE|wxALL, 5 );
  962.     wxStaticText *item6 = new wxStaticText( parent, ID_TEXT, "Nucleotide backbone:", wxDefaultPosition, wxDefaultSize, 0 );
  963.     item4->Add( item6, 0, wxALIGN_CENTRE|wxALL, 5 );
  964.     wxStaticText *item7 = new wxStaticText( parent, ID_TEXT, "Spacing (0 = none):", wxDefaultPosition, wxDefaultSize, 0 );
  965.     item4->Add( item7, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  966.     wxSpinCtrl *item8 = new wxSpinCtrl( parent, ID_S_PROT, "0", wxDefaultPosition, wxDefaultSize, 0, 0, 100, 0 );
  967.     item4->Add( item8, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  968.     wxSpinCtrl *item9 = new wxSpinCtrl( parent, ID_S_NUC, "0", wxDefaultPosition, wxDefaultSize, 0, 0, 100, 0 );
  969.     item4->Add( item9, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  970.     wxStaticText *item10 = new wxStaticText( parent, ID_TEXT, "Type:", wxDefaultPosition, wxDefaultSize, 0 );
  971.     item4->Add( item10, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  972.     wxString strs11[] =
  973.     {
  974.         "One Letter",
  975.         "Three Letter"
  976.     };
  977.     wxChoice *item11 = new wxChoice( parent, ID_C_PROT_TYPE, wxDefaultPosition, wxDefaultSize, 2, strs11, 0 );
  978.     item4->Add( item11, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  979.     wxString strs12[] =
  980.     {
  981.         "One Letter",
  982.         "Three Letter"
  983.     };
  984.     wxChoice *item12 = new wxChoice( parent, ID_C_NUC_TYPE, wxDefaultPosition, wxDefaultSize, 2, strs12, 0 );
  985.     item4->Add( item12, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  986.     wxStaticText *item13 = new wxStaticText( parent, ID_TEXT, "Numbering:", wxDefaultPosition, wxDefaultSize, 0 );
  987.     item4->Add( item13, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  988.     wxString strs14[] =
  989.     {
  990.         "None",
  991.         "Sequential",
  992.         "From PDB"
  993.     };
  994.     wxChoice *item14 = new wxChoice( parent, ID_C_PROT_NUM, wxDefaultPosition, wxDefaultSize, 3, strs14, 0 );
  995.     item4->Add( item14, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  996.     wxString strs15[] =
  997.     {
  998.         "None",
  999.         "Sequential",
  1000.         "From PDB"
  1001.     };
  1002.     wxChoice *item15 = new wxChoice( parent, ID_C_NUC_NUM, wxDefaultPosition, wxDefaultSize, 3, strs15, 0 );
  1003.     item4->Add( item15, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  1004.     wxStaticText *item16 = new wxStaticText( parent, ID_TEXT, "Contrast with background:", wxDefaultPosition, wxDefaultSize, 0 );
  1005.     item4->Add( item16, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  1006.     wxCheckBox *item17 = new wxCheckBox( parent, ID_K_PROT_CONTRAST, "", wxDefaultPosition, wxDefaultSize, 0 );
  1007.     item4->Add( item17, 0, wxALIGN_CENTRE|wxALL, 5 );
  1008.     wxCheckBox *item18 = new wxCheckBox( parent, ID_K_NUC_CONTRAST, "", wxDefaultPosition, wxDefaultSize, 0 );
  1009.     item4->Add( item18, 0, wxALIGN_CENTRE|wxALL, 5 );
  1010.     wxStaticText *item19 = new wxStaticText( parent, ID_TEXT, "Termini:", wxDefaultPosition, wxDefaultSize, 0 );
  1011.     item4->Add( item19, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  1012.     wxCheckBox *item20 = new wxCheckBox( parent, ID_K_PROT_TERM, "", wxDefaultPosition, wxDefaultSize, 0 );
  1013.     item4->Add( item20, 0, wxALIGN_CENTRE|wxALL, 5 );
  1014.     wxCheckBox *item21 = new wxCheckBox( parent, ID_K_NUC_TERM, "", wxDefaultPosition, wxDefaultSize, 0 );
  1015.     item4->Add( item21, 0, wxALIGN_CENTRE|wxALL, 5 );
  1016.     item3->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 );
  1017.     wxStaticLine *item22 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(20,-1), wxLI_HORIZONTAL );
  1018.     item3->Add( item22, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  1019.     wxBoxSizer *item23 = new wxBoxSizer( wxHORIZONTAL );
  1020.     wxStaticText *item24 = new wxStaticText( parent, ID_TEXT, "Metal ion labels:", wxDefaultPosition, wxDefaultSize, 0 );
  1021.     item23->Add( item24, 0, wxALIGN_CENTRE|wxALL, 5 );
  1022.     item23->Add( 20, 20, 0, wxALIGN_CENTRE|wxALL, 5 );
  1023.     wxCheckBox *item25 = new wxCheckBox( parent, ID_K_ION, "", wxDefaultPosition, wxDefaultSize, 0 );
  1024.     item23->Add( item25, 0, wxALIGN_CENTRE|wxALL, 5 );
  1025.     item3->Add( item23, 0, wxALIGN_CENTRE|wxALL, 5 );
  1026.     item1->Add( item3, 0, wxALIGN_CENTRE|wxALL, 5 );
  1027.     item0->Add( item1, 0, wxALIGN_CENTRE|wxALL, 5 );
  1028.     if (set_sizer)
  1029.     {
  1030.         parent->SetAutoLayout( TRUE );
  1031.         parent->SetSizer( item0 );
  1032.         if (call_fit)
  1033.         {
  1034.             item0->Fit( parent );
  1035.             item0->SetSizeHints( parent );
  1036.         }
  1037.     }
  1038.     return item0;
  1039. }
  1040. /////
  1041. // this is modified from wxDesigner output in order to use custom SpinCtrl's
  1042. /////
  1043. wxSizer *LayoutDetailsPage(wxPanel *parent, bool call_fit, bool set_sizer)
  1044. {
  1045.     wxBoxSizer *item0 = new wxBoxSizer(wxVERTICAL);
  1046.     wxStaticBox *item2 = new wxStaticBox(parent, -1, "Rendering Details");
  1047.     wxStaticBoxSizer *item1 = new wxStaticBoxSizer(item2, wxVERTICAL);
  1048.     wxFlexGridSizer *grid = new wxFlexGridSizer(3, 0, 0);
  1049.     // space fill proportion
  1050.     wxStaticText *item4 = new wxStaticText(parent, ID_TEXT, "Space fill size:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
  1051.     grid->Add(item4, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  1052.     gfpSpaceFill = new Cn3D::FloatingPointSpinCtrl(parent,
  1053.         0.0, 10.0, 0.1, 1.0,
  1054.         wxDefaultPosition, wxSize(80, Cn3D::SPIN_CTRL_HEIGHT), 0,
  1055.         wxDefaultPosition, wxSize(-1, Cn3D::SPIN_CTRL_HEIGHT));
  1056.     grid->Add(gfpSpaceFill->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  1057.     grid->Add(gfpSpaceFill->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  1058.     // tube radius
  1059.     wxStaticText *item7 = new wxStaticText(parent, ID_TEXT, "Tube radius:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
  1060.     grid->Add(item7, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  1061.     gfpTubeRadius = new Cn3D::FloatingPointSpinCtrl(parent,
  1062.         0.0, 5.0, 0.02, 0.3,
  1063.         wxDefaultPosition, wxSize(80, Cn3D::SPIN_CTRL_HEIGHT), 0,
  1064.         wxDefaultPosition, wxSize(-1, Cn3D::SPIN_CTRL_HEIGHT));
  1065.     grid->Add(gfpTubeRadius->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  1066.     grid->Add(gfpTubeRadius->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  1067.     // worm tube
  1068.     wxStaticText *item10 = new wxStaticText(parent, ID_TEXT, "Worm tube radius:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
  1069.     grid->Add(item10, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  1070.     gfpTubeWormRadius = new Cn3D::FloatingPointSpinCtrl(parent,
  1071.         0.0, 5.0, 0.02, 0.3,
  1072.         wxDefaultPosition, wxSize(80, Cn3D::SPIN_CTRL_HEIGHT), 0,
  1073.         wxDefaultPosition, wxSize(-1, Cn3D::SPIN_CTRL_HEIGHT));
  1074.     grid->Add(gfpTubeWormRadius->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  1075.     grid->Add(gfpTubeWormRadius->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  1076.     // ball radius
  1077.     wxStaticText *item13 = new wxStaticText(parent, ID_TEXT, "Ball radius:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
  1078.     grid->Add(item13, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  1079.     gfpBallRadius = new Cn3D::FloatingPointSpinCtrl(parent,
  1080.         0.0, 10.0, 0.05, 0.4,
  1081.         wxDefaultPosition, wxSize(80, Cn3D::SPIN_CTRL_HEIGHT), 0,
  1082.         wxDefaultPosition, wxSize(-1, Cn3D::SPIN_CTRL_HEIGHT));
  1083.     grid->Add(gfpBallRadius->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  1084.     grid->Add(gfpBallRadius->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  1085.     // stick radius
  1086.     wxStaticText *item16 = new wxStaticText(parent, ID_TEXT, "Stick radius:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
  1087.     grid->Add(item16, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  1088.     gfpStickRadius = new Cn3D::FloatingPointSpinCtrl(parent,
  1089.         0.0, 5.0, 0.01, 0.2,
  1090.         wxDefaultPosition, wxSize(80, Cn3D::SPIN_CTRL_HEIGHT), 0,
  1091.         wxDefaultPosition, wxSize(-1, Cn3D::SPIN_CTRL_HEIGHT));
  1092.     grid->Add(gfpStickRadius->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  1093.     grid->Add(gfpStickRadius->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  1094.     // spacer
  1095.     grid->Add(1, 1, 0, wxALIGN_CENTRE|wxALL, 5);
  1096.     grid->Add(1, 1, 0, wxALIGN_CENTRE|wxALL, 5);
  1097.     grid->Add(1, 1, 0, wxALIGN_CENTRE|wxALL, 5);
  1098.     // helix radius
  1099.     wxStaticText *item19 = new wxStaticText(parent, ID_TEXT, "Helix radius:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
  1100.     grid->Add(item19, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  1101.     gfpHelixRadius = new Cn3D::FloatingPointSpinCtrl(parent,
  1102.         0.0, 10.0, 0.1, 1.8,
  1103.         wxDefaultPosition, wxSize(80, Cn3D::SPIN_CTRL_HEIGHT), 0,
  1104.         wxDefaultPosition, wxSize(-1, Cn3D::SPIN_CTRL_HEIGHT));
  1105.     grid->Add(gfpHelixRadius->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  1106.     grid->Add(gfpHelixRadius->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  1107.     // strand width
  1108.     wxStaticText *item22 = new wxStaticText(parent, ID_TEXT, "Strand width:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
  1109.     grid->Add(item22, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  1110.     gfpStrandWidth = new Cn3D::FloatingPointSpinCtrl(parent,
  1111.         0.0, 10.0, 0.1, 2.0,
  1112.         wxDefaultPosition, wxSize(80, Cn3D::SPIN_CTRL_HEIGHT), 0,
  1113.         wxDefaultPosition, wxSize(-1, Cn3D::SPIN_CTRL_HEIGHT));
  1114.     grid->Add(gfpStrandWidth->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  1115.     grid->Add(gfpStrandWidth->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  1116.     // strand thickness
  1117.     wxStaticText *item25 = new wxStaticText(parent, ID_TEXT, "Strand thickness:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
  1118.     grid->Add(item25, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  1119.     gfpStrandThickness = new Cn3D::FloatingPointSpinCtrl(parent,
  1120.         0.0, 5.0, 0.05, 0.5,
  1121.         wxDefaultPosition, wxSize(80, Cn3D::SPIN_CTRL_HEIGHT), 0,
  1122.         wxDefaultPosition, wxSize(-1, Cn3D::SPIN_CTRL_HEIGHT));
  1123.     grid->Add(gfpStrandThickness->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  1124.     grid->Add(gfpStrandThickness->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  1125.     item1->Add(grid, 0, wxALIGN_CENTRE|wxALL, 5);
  1126.     item0->Add(item1, 0, wxALIGN_CENTRE|wxALL, 5);
  1127.     if (set_sizer)
  1128.     {
  1129.         parent->SetAutoLayout(TRUE);
  1130.         parent->SetSizer(item0);
  1131.         if (call_fit)
  1132.         {
  1133.             item0->Fit(parent);
  1134.             item0->SetSizeHints(parent);
  1135.         }
  1136.     }
  1137.     return item0;
  1138. }
  1139. /*
  1140. * ---------------------------------------------------------------------------
  1141. * $Log: style_dialog.cpp,v $
  1142. * Revision 1000.2  2004/06/01 18:29:38  gouriano
  1143. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.27
  1144. *
  1145. * Revision 1.27  2004/05/21 21:41:40  gorelenk
  1146. * Added PCH ncbi_pch.hpp
  1147. *
  1148. * Revision 1.26  2004/02/19 17:05:17  thiessen
  1149. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  1150. *
  1151. * Revision 1.25  2003/02/06 16:39:53  thiessen
  1152. * add block row fit coloring
  1153. *
  1154. * Revision 1.24  2003/02/03 19:20:07  thiessen
  1155. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  1156. *
  1157. * Revision 1.23  2003/01/28 21:07:56  thiessen
  1158. * add block fit coloring algorithm; tweak row dragging; fix style bug
  1159. *
  1160. * Revision 1.22  2002/11/21 16:59:39  thiessen
  1161. * error on invalid style parameter
  1162. *
  1163. * Revision 1.21  2002/08/15 22:13:17  thiessen
  1164. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  1165. *
  1166. * Revision 1.20  2002/05/22 17:17:09  thiessen
  1167. * progress on BLAST interface ; change custom spin ctrl implementation
  1168. *
  1169. * Revision 1.19  2002/05/17 19:09:24  thiessen
  1170. * undo spin button event workaround for wxmac
  1171. *
  1172. * Revision 1.18  2002/05/16 18:46:07  thiessen
  1173. * Mac fixes
  1174. *
  1175. * Revision 1.17  2002/04/27 16:32:14  thiessen
  1176. * fix small leaks/bugs found by BoundsChecker
  1177. *
  1178. * Revision 1.16  2002/04/12 01:54:43  thiessen
  1179. * tweaks to style stuff
  1180. *
  1181. * Revision 1.15  2001/12/06 23:13:46  thiessen
  1182. * finish import/align new sequences into single-structure data; many small tweaks
  1183. *
  1184. * Revision 1.14  2001/11/27 16:26:10  thiessen
  1185. * major update to data management system
  1186. *
  1187. * Revision 1.13  2001/11/15 18:12:46  thiessen
  1188. * add text+forefround color to user color buttons
  1189. *
  1190. * Revision 1.12  2001/09/24 14:37:52  thiessen
  1191. * more wxPanel stuff - fix for new heirarchy in wx 2.3.2+
  1192. *
  1193. * Revision 1.11  2001/09/24 13:29:54  thiessen
  1194. * fix wxPanel issues
  1195. *
  1196. * Revision 1.10  2001/09/20 19:31:30  thiessen
  1197. * fixes for SGI and wxWin 2.3.2
  1198. *
  1199. * Revision 1.9  2001/09/04 14:40:19  thiessen
  1200. * add rainbow and charge coloring
  1201. *
  1202. * Revision 1.8  2001/08/21 01:10:46  thiessen
  1203. * add labeling
  1204. *
  1205. * Revision 1.7  2001/08/09 19:07:14  thiessen
  1206. * add temperature and hydrophobicity coloring
  1207. *
  1208. * Revision 1.6  2001/08/06 20:22:01  thiessen
  1209. * add preferences dialog ; make sure OnCloseWindow get wxCloseEvent
  1210. *
  1211. * Revision 1.5  2001/07/04 19:39:17  thiessen
  1212. * finish user annotation system
  1213. *
  1214. * Revision 1.4  2001/06/14 00:34:01  thiessen
  1215. * asn additions
  1216. *
  1217. * Revision 1.3  2001/06/08 14:47:06  thiessen
  1218. * fully functional (modal) render settings panel
  1219. *
  1220. * Revision 1.2  2001/06/07 19:05:38  thiessen
  1221. * functional (although incomplete) render settings panel ; highlight title - not sequence - upon mouse click
  1222. *
  1223. * Revision 1.1  2001/05/31 18:47:10  thiessen
  1224. * add preliminary style dialog; remove LIST_TYPE; add thread single and delete all; misc tweaks
  1225. *
  1226. */