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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: show_hide_dialog.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:29:19  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.14
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: show_hide_dialog.cpp,v 1000.2 2004/06/01 18:29:19 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. *      Class definition for the Show/Hide dialog
  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 "show_hide_dialog.hpp"
  47. #include "cn3d_tools.hpp"
  48. USING_NCBI_SCOPE;
  49. BEGIN_SCOPE(Cn3D)
  50. BEGIN_EVENT_TABLE(ShowHideDialog, wxDialog)
  51.     EVT_LISTBOX     (LISTBOX,   ShowHideDialog::OnSelection)
  52.     EVT_BUTTON      (B_APPLY,   ShowHideDialog::OnButton)
  53.     EVT_BUTTON      (B_CANCEL,  ShowHideDialog::OnButton)
  54.     EVT_BUTTON      (B_DONE,    ShowHideDialog::OnButton)
  55.     EVT_CLOSE                  (ShowHideDialog::OnCloseWindow)
  56. END_EVENT_TABLE()
  57. #define MIN_SIZE 200,300
  58. #define B_WIDTH 50
  59. #define MARGIN 10
  60. ShowHideDialog::ShowHideDialog(
  61.     const wxString items[],
  62.     vector < bool > *itemsOn,
  63.     ShowHideCallbackObject *callback,
  64.     bool useExtendedListStyle,
  65.     wxWindow* parent,
  66.     wxWindowID id,
  67.     const wxString& title,
  68.     const wxPoint& pos
  69. ) :
  70.     wxDialog(parent, id, title, pos, wxSize(MIN_SIZE), wxCAPTION | wxRESIZE_BORDER),
  71.     itemsEnabled(itemsOn), callbackObject(callback), applyB(NULL), haveApplied(false)
  72. {
  73.     SetAutoLayout(true);
  74.     SetSizeHints(MIN_SIZE);
  75. wxButton *doneB;
  76.     if (callbackObject) {
  77.         doneB = new wxButton(this, B_DONE, "Done");
  78.         wxLayoutConstraints *c1 = new wxLayoutConstraints();
  79.         c1->bottom.SameAs       (this,      wxBottom,   MARGIN);
  80.         c1->right.SameAs        (this,      wxRight,    MARGIN);
  81.         c1->width.Absolute      (B_WIDTH);
  82.         c1->height.AsIs         ();
  83.         doneB->SetConstraints(c1);
  84.         applyB = new wxButton(this, B_APPLY, "Apply");
  85.         wxLayoutConstraints *c2 = new wxLayoutConstraints();
  86.         c2->bottom.SameAs       (this,      wxBottom,   MARGIN);
  87.         c2->centreX.SameAs      (this,      wxCentreX);
  88.         c2->width.Absolute      (B_WIDTH);
  89.         c2->top.SameAs          (doneB,     wxTop);
  90.         applyB->SetConstraints(c2);
  91.         applyB->Enable(false);
  92.         cancelB = new wxButton(this, B_CANCEL, "Cancel");
  93.         wxLayoutConstraints *c3 = new wxLayoutConstraints();
  94.         c3->bottom.SameAs       (this,      wxBottom,   MARGIN);
  95.         c3->left.SameAs         (this,      wxLeft,     MARGIN);
  96.         c3->width.Absolute      (B_WIDTH);
  97.         c3->top.SameAs          (doneB,     wxTop);
  98.         cancelB->SetConstraints(c3);
  99.         cancelB->Enable(false);
  100.     }
  101.     // don't include Apply button if no callback object given
  102.     else {
  103.         doneB = new wxButton(this, B_DONE, "Done");
  104.         wxLayoutConstraints *c1 = new wxLayoutConstraints();
  105.         c1->bottom.SameAs       (this,      wxBottom,   MARGIN);
  106.         c1->left.SameAs         (this,      wxCentreX,  MARGIN);
  107.         c1->width.Absolute      (B_WIDTH);
  108.         c1->height.AsIs         ();
  109.         doneB->SetConstraints(c1);
  110.         cancelB = new wxButton(this, B_CANCEL, "Cancel");
  111.         wxLayoutConstraints *c3 = new wxLayoutConstraints();
  112.         c3->bottom.SameAs       (this,      wxBottom,   MARGIN);
  113.         c3->right.SameAs        (this,      wxCentreX,  MARGIN);
  114.         c3->width.Absolute      (B_WIDTH);
  115.         c3->top.SameAs          (doneB,     wxTop);
  116.         cancelB->SetConstraints(c3);
  117.         cancelB->Enable(false);
  118.     }
  119.     listBox = new wxListBox(this, LISTBOX, wxDefaultPosition, wxDefaultSize,
  120.         itemsEnabled->size(), items,
  121.         (useExtendedListStyle ? wxLB_EXTENDED : wxLB_MULTIPLE) | wxLB_HSCROLL | wxLB_NEEDED_SB);
  122.     wxLayoutConstraints *c4 = new wxLayoutConstraints();
  123.     c4->top.SameAs          (this,      wxTop,      MARGIN);
  124.     c4->left.SameAs         (this,      wxLeft,     MARGIN);
  125.     c4->right.SameAs        (this,      wxRight,    MARGIN);
  126.     c4->bottom.Above        (doneB,                 -MARGIN);
  127.     listBox->SetConstraints(c4);
  128.     Layout();
  129.     // set initial item selection (kludge: reverse order, so scroll bar is initially at the top)
  130.     originalItemsEnabled.resize(itemsEnabled->size());
  131.     for (int i=itemsEnabled->size()-1; i>=0; --i) {
  132.         listBox->SetSelection(i, true);
  133.         listBox->SetSelection(i, (*itemsEnabled)[i]);
  134.         originalItemsEnabled[i] = (*itemsEnabled)[i];
  135.     }
  136.     tempItemsEnabled.resize(itemsEnabled->size());
  137. }
  138. void ShowHideDialog::OnSelection(wxCommandEvent& event)
  139. {
  140.     int i;
  141.     // get states as they are before this selection
  142.     for (i=0; i<listBox->GetCount(); ++i) tempItemsEnabled[i] = (*itemsEnabled)[i];
  143.     // update from current listbox selections
  144.     for (i=0; i<listBox->GetCount(); ++i) (*itemsEnabled)[i] = listBox->Selected(i);
  145.     // do the selection changed callback, and adjust selections according to what's changed
  146.     if (callbackObject && callbackObject->SelectionChangedCallback(tempItemsEnabled, *itemsEnabled)) {
  147.         // apply changes
  148.         int pV = listBox->GetScrollPos(wxVERTICAL);
  149.         for (i=0; i<listBox->GetCount(); ++i) listBox->SetSelection(i, (*itemsEnabled)[i]);
  150.         // horrible kludge to keep vertical scroll at same position...
  151.         if (pV >= 0 && pV < listBox->GetCount()) {
  152.             listBox->SetSelection(listBox->GetCount() - 1, true);
  153.             listBox->SetSelection(listBox->GetCount() - 1, (*itemsEnabled)[listBox->GetCount() - 1]);
  154.             listBox->SetSelection(pV, true);
  155.             listBox->SetSelection(pV, (*itemsEnabled)[pV]);
  156.         }
  157.     }
  158.     cancelB->Enable(true);
  159.     if (applyB) applyB->Enable(true);
  160. }
  161. void ShowHideDialog::OnButton(wxCommandEvent& event)
  162. {
  163.     bool doCallback = (applyB && applyB->IsEnabled());
  164.     if (event.GetId() == B_CANCEL) {
  165.         // restore item list to original state
  166.         for (int i=0; i<originalItemsEnabled.size(); ++i) (*itemsEnabled)[i] = originalItemsEnabled[i];
  167.         doCallback = haveApplied;
  168.     }
  169.     // only do this if selection has changed since last time
  170.     if (callbackObject && doCallback) {
  171.         TRACEMSG("calling ShowHideCallbackFunction()");
  172.         // do the callback with the current selection state
  173.         callbackObject->ShowHideCallbackFunction(*itemsEnabled);
  174.         if (applyB) applyB->Enable(false);
  175.     }
  176.     if (event.GetId() == B_CANCEL)
  177.         EndModal(wxCANCEL);
  178.     else if (event.GetId() == B_DONE)
  179.         EndModal(wxOK);
  180.     else if (event.GetId() == B_APPLY)
  181.         haveApplied = true;
  182. }
  183. void ShowHideDialog::OnCloseWindow(wxCloseEvent& event)
  184. {
  185.     EndModal(wxOK);
  186. }
  187. END_SCOPE(Cn3D)
  188. /*
  189. * ---------------------------------------------------------------------------
  190. * $Log: show_hide_dialog.cpp,v $
  191. * Revision 1000.2  2004/06/01 18:29:19  gouriano
  192. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.14
  193. *
  194. * Revision 1.14  2004/05/21 21:41:40  gorelenk
  195. * Added PCH ncbi_pch.hpp
  196. *
  197. * Revision 1.13  2004/03/15 18:11:01  thiessen
  198. * prefer prefix vs. postfix ++/-- operators
  199. *
  200. * Revision 1.12  2004/02/19 17:05:11  thiessen
  201. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  202. *
  203. * Revision 1.11  2003/02/03 19:20:06  thiessen
  204. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  205. *
  206. * Revision 1.10  2002/04/26 12:56:20  thiessen
  207. * remove wxFLOAT_ON_PARENT, doesn't work on Mac
  208. *
  209. * Revision 1.9  2001/10/08 14:18:33  thiessen
  210. * fix show/hide dialog under wxGTK
  211. *
  212. * Revision 1.8  2001/09/06 13:10:10  thiessen
  213. * tweak show hide dialog layout
  214. *
  215. * Revision 1.7  2001/08/06 20:22:01  thiessen
  216. * add preferences dialog ; make sure OnCloseWindow get wxCloseEvent
  217. *
  218. * Revision 1.6  2001/07/19 19:14:38  thiessen
  219. * working CDD alignment annotator ; misc tweaks
  220. *
  221. * Revision 1.5  2001/05/17 18:34:26  thiessen
  222. * spelling fixes; change dialogs to inherit from wxDialog
  223. *
  224. * Revision 1.4  2001/05/15 23:48:38  thiessen
  225. * minor adjustments to compile under Solaris/wxGTK
  226. *
  227. * Revision 1.3  2001/03/09 15:49:05  thiessen
  228. * major changes to add initial update viewer
  229. *
  230. * Revision 1.2  2000/12/15 15:51:47  thiessen
  231. * show/hide system installed
  232. *
  233. * Revision 1.1  2000/11/17 19:48:14  thiessen
  234. * working show/hide alignment row
  235. *
  236. */