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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: wx_tools.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:30:23  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: wx_tools.cpp,v 1000.2 2004/06/01 18:30:23 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. *      custom wx GUI controls
  38. *
  39. * ===========================================================================
  40. */
  41. #ifdef _MSC_VER
  42. #pragma warning(disable:4018)   // disable signed/unsigned mismatch warning in MSVC
  43. #endif
  44. #include <ncbi_pch.hpp>
  45. #include <corelib/ncbistd.hpp>
  46. #include <corelib/ncbi_limits.h>
  47. #include "wx_tools.hpp"
  48. #include "cn3d_tools.hpp"
  49. USING_NCBI_SCOPE;
  50. BEGIN_SCOPE(Cn3D)
  51. const int WX_TOOLS_NOTIFY_CHANGED = wxNewEventType();
  52. #define SEND_CHANGED_EVENT do { 
  53.     wxCommandEvent notify(WX_TOOLS_NOTIFY_CHANGED); 
  54.     AddPendingEvent(notify); } while (0)
  55. /////////////////////////////////////////////////////////////////////////////////
  56. // NotifyingSpinButton implementation
  57. /////////////////////////////////////////////////////////////////////////////////
  58. BEGIN_EVENT_TABLE(NotifyingSpinButton, wxSpinButton)
  59.     EVT_SPIN_UP  (-1, NotifyingSpinButton::OnSpinButtonUp)
  60.     EVT_SPIN_DOWN(-1, NotifyingSpinButton::OnSpinButtonDown)
  61. END_EVENT_TABLE()
  62. void NotifyingSpinButton::OnSpinButtonUp(wxSpinEvent& event)
  63. {
  64.     notify->OnSpinButtonUp(event);
  65.     SEND_CHANGED_EVENT;
  66. }
  67. void NotifyingSpinButton::OnSpinButtonDown(wxSpinEvent& event)
  68. {
  69.     notify->OnSpinButtonDown(event);
  70.     SEND_CHANGED_EVENT;
  71. }
  72. /////////////////////////////////////////////////////////////////////////////////
  73. // IntegerTextCtrl implementation
  74. /////////////////////////////////////////////////////////////////////////////////
  75. BEGIN_EVENT_TABLE(IntegerTextCtrl, wxTextCtrl)
  76.     EVT_TEXT        (-1, IntegerTextCtrl::Validate)
  77.     EVT_TEXT_ENTER  (-1, IntegerTextCtrl::OnChange)
  78. END_EVENT_TABLE()
  79. IntegerTextCtrl::IntegerTextCtrl(wxWindow* parent, wxWindowID id, const wxString& value,
  80.     const wxPoint& pos, const wxSize& size, long style,
  81.     const wxValidator& validator, const wxString& name) :
  82.         wxTextCtrl(parent, id, value, pos, size, style | wxTE_PROCESS_ENTER, validator, name),
  83.         minVal(kMin_Long), maxVal(kMax_Long)
  84. {
  85. }
  86. void IntegerTextCtrl::Validate(wxCommandEvent& event)
  87. {
  88.     if (IsValidInteger())
  89.         SetBackgroundColour(*wxWHITE);
  90.     else
  91.         SetBackgroundColour(*wxRED);
  92.     Refresh();
  93. }
  94. void IntegerTextCtrl::OnChange(wxCommandEvent& event)
  95. {
  96.     SEND_CHANGED_EVENT;
  97. }
  98. void IntegerTextCtrl::SetAllowedRange(int min, int max, int incr)
  99. {
  100.     minVal = min;
  101.     maxVal = max;
  102.     incrVal = incr;
  103. }
  104. bool IntegerTextCtrl::IsValidInteger(void) const
  105. {
  106.     long longVal;
  107.     int intVal;
  108.     if (!GetValue().ToLong(&longVal)) return false;
  109.     intVal = (int) longVal;
  110.     return (intVal >= minVal && intVal <= maxVal);
  111. }
  112. /////////////////////////////////////////////////////////////////////////////////
  113. // IntegerSpinCtrl implementation
  114. /////////////////////////////////////////////////////////////////////////////////
  115. IntegerSpinCtrl::IntegerSpinCtrl(wxWindow* parent,
  116.     int min, int max, int increment, int initial,
  117.     const wxPoint& textCtrlPos, const wxSize& textCtrlSize, long textCtrlStyle,
  118.     const wxPoint& spinCtrlPos, const wxSize& spinCtrlSize) :
  119.         minVal(min), maxVal(max), incrVal(increment)
  120. {
  121.     iTextCtrl = new IntegerTextCtrl(parent, -1, "", textCtrlPos, textCtrlSize, textCtrlStyle);
  122.     iTextCtrl->SetAllowedRange(min, max, increment);
  123.     spinButton = new NotifyingSpinButton(this,
  124.         parent, -1, spinCtrlPos, spinCtrlSize, wxSP_VERTICAL | wxSP_ARROW_KEYS);
  125.     spinButton->SetRange(-1, 1);    // position irrelevant; just need the button GUI
  126.     // clamp and set initial value
  127.     if (initial < min) initial = min;
  128.     if (initial > max) initial = max;
  129.     SetInteger(initial);
  130. }
  131. bool IntegerSpinCtrl::SetInteger(int value)
  132. {
  133.     // check for allowed value
  134.     if (value < minVal || value > maxVal) return false;
  135.     wxString strVal;
  136.     strVal.Printf("%i", value);
  137.     iTextCtrl->SetValue(strVal);
  138.     spinButton->SetValue(0);
  139.     return true;
  140. }
  141. void IntegerSpinCtrl::OnSpinButtonUp(wxSpinEvent& event)
  142. {
  143.     int value;
  144.     if (!GetInteger(&value)) return;
  145.     value += incrVal;
  146.     if (value > maxVal) value = maxVal;
  147.     SetInteger(value);
  148. }
  149. void IntegerSpinCtrl::OnSpinButtonDown(wxSpinEvent& event)
  150. {
  151.     int value;
  152.     if (!GetInteger(&value)) return;
  153.     value -= incrVal;
  154.     if (value < minVal) value = minVal;
  155.     SetInteger(value);
  156. }
  157. bool IntegerSpinCtrl::GetInteger(int *value) const
  158. {
  159. long longValue;
  160. if (!iTextCtrl->GetValue().ToLong(&longValue)) return false;
  161. *value = (int) longValue;
  162.     return (iTextCtrl->IsValidInteger());
  163. }
  164. /////////////////////////////////////////////////////////////////////////////////
  165. // FloatingPointTextCtrl implementation
  166. /////////////////////////////////////////////////////////////////////////////////
  167. BEGIN_EVENT_TABLE(FloatingPointTextCtrl, wxTextCtrl)
  168.     EVT_TEXT        (-1, FloatingPointTextCtrl::Validate)
  169.     EVT_TEXT_ENTER  (-1, FloatingPointTextCtrl::OnChange)
  170. END_EVENT_TABLE()
  171. FloatingPointTextCtrl::FloatingPointTextCtrl(wxWindow* parent, wxWindowID id, const wxString& value,
  172.     const wxPoint& pos, const wxSize& size, long style,
  173.     const wxValidator& validator, const wxString& name) :
  174.         wxTextCtrl(parent, id, value, pos, size, style | wxTE_PROCESS_ENTER, validator, name),
  175.         minVal(kMin_Double), maxVal(kMax_Double)
  176. {
  177. }
  178. void FloatingPointTextCtrl::Validate(wxCommandEvent& event)
  179. {
  180.     if (IsValidDouble())
  181.         SetBackgroundColour(*wxWHITE);
  182.     else
  183.         SetBackgroundColour(*wxRED);
  184.     Refresh();
  185. }
  186. void FloatingPointTextCtrl::OnChange(wxCommandEvent& event)
  187. {
  188.     SEND_CHANGED_EVENT;
  189. }
  190. void FloatingPointTextCtrl::SetAllowedRange(double min, double max)
  191. {
  192.     minVal = min;
  193.     maxVal = max;
  194. }
  195. bool FloatingPointTextCtrl::IsValidDouble(void) const
  196. {
  197.     double doubleVal;
  198.     return (GetValue().ToDouble(&doubleVal) && doubleVal >= minVal && doubleVal <= maxVal);
  199. }
  200. /////////////////////////////////////////////////////////////////////////////////
  201. // FloatingPointSpinCtrl implementation
  202. /////////////////////////////////////////////////////////////////////////////////
  203. FloatingPointSpinCtrl::FloatingPointSpinCtrl(wxWindow* parent,
  204.     double min, double max, double increment, double initial,
  205.     const wxPoint& textCtrlPos, const wxSize& textCtrlSize, long textCtrlStyle,
  206.     const wxPoint& spinCtrlPos, const wxSize& spinCtrlSize) :
  207.         minVal(min), maxVal(max), incrVal(increment)
  208. {
  209.     fpTextCtrl = new FloatingPointTextCtrl(parent, -1, "", textCtrlPos, textCtrlSize, textCtrlStyle);
  210.     fpTextCtrl->SetAllowedRange(min, max);
  211.     spinButton = new NotifyingSpinButton(this,
  212.         parent, -1, spinCtrlPos, spinCtrlSize, wxSP_VERTICAL | wxSP_ARROW_KEYS);
  213.     spinButton->SetRange(-1, 1);    // position irrelevant; just need the button GUI
  214.     // clamp and set initial value
  215.     if (initial < min) initial = min;
  216.     if (initial > max) initial = max;
  217.     SetDouble(initial);
  218. }
  219. bool FloatingPointSpinCtrl::SetDouble(double value)
  220. {
  221.     // check allowed range
  222.     if (value < minVal || value > maxVal) return false;
  223.     wxString strVal;
  224.     strVal.Printf("%g", value);
  225.     fpTextCtrl->SetValue(strVal);
  226.     spinButton->SetValue(0);
  227.     return true;
  228. }
  229. void FloatingPointSpinCtrl::OnSpinButtonUp(wxSpinEvent& event)
  230. {
  231.     double value;
  232.     if (!GetDouble(&value)) return;
  233.     value += incrVal;
  234.     if (value > maxVal) value = maxVal;
  235.     SetDouble(value);
  236. }
  237. void FloatingPointSpinCtrl::OnSpinButtonDown(wxSpinEvent& event)
  238. {
  239.     double value;
  240.     if (!GetDouble(&value)) return;
  241.     value -= incrVal;
  242.     if (value < minVal) value = minVal;
  243.     SetDouble(value);
  244. }
  245. bool FloatingPointSpinCtrl::GetDouble(double *value) const
  246. {
  247.     return (fpTextCtrl->GetValue().ToDouble(value) && fpTextCtrl->IsValidDouble());
  248. }
  249. /////////////////////////////////////////////////////////////////////////////////
  250. // GetFloatingPointDialog implementation
  251. /////////////////////////////////////////////////////////////////////////////////
  252. BEGIN_EVENT_TABLE(GetFloatingPointDialog, wxDialog)
  253.     EVT_BUTTON(-1,  GetFloatingPointDialog::OnButton)
  254.     EVT_CLOSE (     GetFloatingPointDialog::OnCloseWindow)
  255. END_EVENT_TABLE()
  256. GetFloatingPointDialog::GetFloatingPointDialog(wxWindow* parent,
  257.     const wxString& message, const wxString& title,
  258.     double min, double max, double increment, double initial) :
  259.         wxDialog(parent, -1, title, wxDefaultPosition, wxDefaultSize,
  260.             wxCAPTION | wxSYSTEM_MENU) // not resizable
  261. {
  262.     // code modified (heavily) from wxDesigner C++ output of fp_dialog.wdr
  263.     wxPanel *panel = new wxPanel(this, -1);
  264.     wxBoxSizer *item0 = new wxBoxSizer(wxVERTICAL);
  265.     wxStaticText *item1 = new wxStaticText(panel, -1, message, wxDefaultPosition, wxDefaultSize, 0);
  266.     item0->Add(item1, 0, wxALIGN_CENTRE|wxALL, 5);
  267.     wxFlexGridSizer *grid = new wxFlexGridSizer(1, 0, 0, 0);
  268.     grid->AddGrowableCol(1);
  269.     buttonOK = new wxButton(panel, -1, "OK", wxDefaultPosition, wxDefaultSize, 0);
  270.     grid->Add(buttonOK, 0, wxGROW|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5);
  271.     fpSpinCtrl = new FloatingPointSpinCtrl(panel,
  272.         min, max, increment, initial,
  273.         wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
  274.         wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
  275.     grid->Add(fpSpinCtrl->GetTextCtrl(), 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5);
  276.     grid->Add(fpSpinCtrl->GetSpinButton(), 0, wxALIGN_CENTRE, 5);
  277.     item0->Add(grid, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  278.     panel->SetAutoLayout(true);
  279.     panel->SetSizer(item0);
  280.     item0->Fit(this);
  281.     item0->Fit(panel);
  282.     item0->SetSizeHints(this);
  283. }
  284. GetFloatingPointDialog::~GetFloatingPointDialog(void)
  285. {
  286.     delete fpSpinCtrl;
  287. }
  288. double GetFloatingPointDialog::GetValue(void)
  289. {
  290. double returnValue;
  291. fpSpinCtrl->GetDouble(&returnValue);
  292.     return returnValue;
  293. }
  294. void GetFloatingPointDialog::OnButton(wxCommandEvent& event)
  295. {
  296.     if (event.GetEventObject() == buttonOK) {
  297. double test;
  298.         if (fpSpinCtrl->GetDouble(&test))
  299.             EndModal(wxOK);
  300.         else
  301.             wxBell();
  302.     } else {
  303.         event.Skip();
  304.     }
  305. }
  306. void GetFloatingPointDialog::OnCloseWindow(wxCloseEvent& event)
  307. {
  308.     EndModal(wxCANCEL);
  309. }
  310. END_SCOPE(Cn3D)
  311. /*
  312. * ---------------------------------------------------------------------------
  313. * $Log: wx_tools.cpp,v $
  314. * Revision 1000.2  2004/06/01 18:30:23  gouriano
  315. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  316. *
  317. * Revision 1.18  2004/05/21 21:41:40  gorelenk
  318. * Added PCH ncbi_pch.hpp
  319. *
  320. * Revision 1.17  2004/02/19 17:05:23  thiessen
  321. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  322. *
  323. * Revision 1.16  2003/02/03 19:20:09  thiessen
  324. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  325. *
  326. * Revision 1.15  2002/10/11 17:21:39  thiessen
  327. * initial Mac OSX build
  328. *
  329. * Revision 1.14  2002/08/15 22:13:19  thiessen
  330. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  331. *
  332. * Revision 1.13  2002/05/22 17:17:10  thiessen
  333. * progress on BLAST interface ; change custom spin ctrl implementation
  334. *
  335. * Revision 1.12  2002/04/27 16:32:16  thiessen
  336. * fix small leaks/bugs found by BoundsChecker
  337. *
  338. * Revision 1.11  2002/02/21 22:01:50  thiessen
  339. * remember alignment range on demotion
  340. *
  341. * Revision 1.10  2001/11/27 16:26:11  thiessen
  342. * major update to data management system
  343. *
  344. * Revision 1.9  2001/10/08 00:00:10  thiessen
  345. * estimate threader N random starts; edit CDD name
  346. *
  347. * Revision 1.8  2001/09/24 14:37:53  thiessen
  348. * more wxPanel stuff - fix for new heirarchy in wx 2.3.2+
  349. *
  350. * Revision 1.7  2001/09/24 13:29:55  thiessen
  351. * fix wxPanel issues
  352. *
  353. * Revision 1.6  2001/08/06 20:22:01  thiessen
  354. * add preferences dialog ; make sure OnCloseWindow get wxCloseEvent
  355. *
  356. * Revision 1.5  2001/06/08 14:47:06  thiessen
  357. * fully functional (modal) render settings panel
  358. *
  359. * Revision 1.4  2001/05/23 17:45:41  thiessen
  360. * change dialog implementation to wxDesigner; interface changes
  361. *
  362. * Revision 1.3  2001/05/17 18:34:27  thiessen
  363. * spelling fixes; change dialogs to inherit from wxDialog
  364. *
  365. * Revision 1.2  2001/05/15 23:48:39  thiessen
  366. * minor adjustments to compile under Solaris/wxGTK
  367. *
  368. * Revision 1.1  2001/04/04 00:27:16  thiessen
  369. * major update - add merging, threader GUI controls
  370. *
  371. */