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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: progress_meter.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:29:00  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: progress_meter.cpp,v 1000.2 2004/06/01 18:29:00 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. *      progress meter window
  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 "progress_meter.hpp"
  47. #include "cn3d_tools.hpp"
  48. USING_NCBI_SCOPE;
  49. BEGIN_SCOPE(Cn3D)
  50. #define DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(var, id, type) 
  51.     type *var; 
  52.     var = wxDynamicCast(FindWindow(id), type); 
  53.     if (!var) { 
  54.         ERRORMSG("Can't find window with id " << id); 
  55.         return; 
  56.     }
  57. BEGIN_EVENT_TABLE(ProgressMeter, wxDialog)
  58.     EVT_CLOSE       (       ProgressMeter::OnCloseWindow)
  59. END_EVENT_TABLE()
  60. ProgressMeter::ProgressMeter(wxWindow *myParent,
  61.         const wxString& message, const wxString& title, int maximumValue) :
  62.     wxDialog(myParent, -1, title, wxPoint(50, 50), wxDefaultSize,
  63.         wxCAPTION | wxDIALOG_MODELESS | wxFRAME_NO_TASKBAR) // not closeable or resizable
  64. {
  65.     // construct the panel
  66.     wxPanel *parent = new wxPanel(this, -1);
  67. ////////////////////////////////////////////////////////////////////////////////////////////////
  68. // The following is taken more or less from wxDesigner's C++ code from progress_meter.wdr,
  69. // except changing message and setting gauge style to wxGA_HORIZONTAL | wxGA_SMOOTH
  70. ////////////////////////////////////////////////////////////////////////////////////////////////
  71. #define ID_TEXT 10000
  72. #define ID_GAUGE 10001
  73.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  74.     wxStaticText *item1 = new wxStaticText( parent, ID_TEXT, message,
  75.         wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
  76.     item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  77.     wxGauge *item2 = new wxGauge( parent, ID_GAUGE, 100,
  78.         wxDefaultPosition, wxDefaultSize, wxGA_HORIZONTAL | wxGA_SMOOTH );
  79.     item0->Add( item2, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  80.     parent->SetAutoLayout( TRUE );
  81.     parent->SetSizer( item0 );
  82.     // set message
  83.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(text, ID_TEXT, wxStaticText)
  84.     text->SetLabel(message);
  85.     text->Fit();
  86.     // setup gauge
  87.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(gauge, ID_GAUGE, wxGauge)
  88.     gauge->SetRange(maximumValue);
  89.     gauge->SetValue(0);
  90.     // call sizer stuff
  91.     item0->Fit(parent);
  92.     SetClientSize(item0->GetMinSize());
  93.     // automatically bring up the window and let it be shown right away
  94.     Show(true);
  95. #if defined(__WXGTK__) || defined(__WXMAC__)
  96.     // wxSafeYield seems to force redraws in wxGTK and does ugly things in
  97.     // wxMac, so make window modal so that it's safe to call wxYield() instead
  98.     SetFocus();
  99.     MakeModal(true);
  100.     wxYield();
  101. #else
  102.     wxSafeYield();
  103. #endif
  104. }
  105. void ProgressMeter::OnCloseWindow(wxCloseEvent& event)
  106. {
  107. #if defined(__WXGTK__) || defined(__WXMAC__)
  108.     TRACEMSG("can veto: " << event.CanVeto());
  109.     if (event.CanVeto()) {
  110.         event.Veto();
  111.     } else {
  112.         MakeModal(false);
  113.         Show(false);
  114.     }
  115. #endif
  116. }
  117. void ProgressMeter::SetValue(int value, bool doYield)
  118. {
  119.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(gauge, ID_GAUGE, wxGauge)
  120.     if (value != gauge->GetValue()) {
  121.         int max = gauge->GetRange();
  122.         gauge->SetValue((value <= 0) ? 0 : ((value >= max) ? max : value));
  123.         // yield for window redraw
  124.         if (doYield)
  125. #if defined(__WXGTK__) || defined(__WXMAC__)
  126.             wxYield();  // wxSafeYield is ugly on these platforms
  127. #else
  128.             wxSafeYield();
  129. #endif
  130.     }
  131. }
  132. END_SCOPE(Cn3D)
  133. /*
  134. * ---------------------------------------------------------------------------
  135. * $Log: progress_meter.cpp,v $
  136. * Revision 1000.2  2004/06/01 18:29:00  gouriano
  137. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  138. *
  139. * Revision 1.8  2004/05/21 21:41:39  gorelenk
  140. * Added PCH ncbi_pch.hpp
  141. *
  142. * Revision 1.7  2004/02/19 17:05:04  thiessen
  143. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  144. *
  145. * Revision 1.6  2003/02/03 19:20:05  thiessen
  146. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  147. *
  148. * Revision 1.5  2002/08/15 22:13:15  thiessen
  149. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  150. *
  151. * Revision 1.4  2001/10/25 17:17:23  thiessen
  152. * use wxYield + modal for wxMac, too
  153. *
  154. * Revision 1.3  2001/10/25 00:06:29  thiessen
  155. * fix concurrent rendering problem in wxMSW PNG output
  156. *
  157. * Revision 1.2  2001/10/24 17:07:30  thiessen
  158. * add PNG output for wxGTK
  159. *
  160. * Revision 1.1  2001/10/23 13:53:40  thiessen
  161. * add PNG export
  162. *
  163. */