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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cdd_splash_dialog.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:28:01  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: cdd_splash_dialog.cpp,v 1000.2 2004/06/01 18:28:01 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 CDD splash screen
  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 <objects/cdd/Cdd_descr_set.hpp>
  47. #include <objects/cdd/Cdd_descr.hpp>
  48. #include <objects/cdd/Align_annot_set.hpp>
  49. #include <objects/pub/Pub.hpp>
  50. #include <objects/cdd/Align_annot.hpp>
  51. #include <objects/cdd/Feature_evidence.hpp>
  52. #include <objects/biblio/PubMedId.hpp>
  53. #include <objects/mmdb1/Biostruc_id.hpp>
  54. #include <objects/mmdb1/Mmdb_id.hpp>
  55. #include <objects/mmdb3/Biostruc_feature_set.hpp>
  56. #include <objects/mmdb3/Biostruc_feature_set_descr.hpp>
  57. #include <objects/mmdb3/Biostruc_feature.hpp>
  58. #include "cdd_splash_dialog.hpp"
  59. #include "structure_window.hpp"
  60. #include "structure_set.hpp"
  61. #include "cn3d_tools.hpp"
  62. #include "chemical_graph.hpp"
  63. #include "molecule_identifier.hpp"
  64. #include "sequence_set.hpp"
  65. ////////////////////////////////////////////////////////////////////////////////////////////////
  66. // The following is taken unmodified from wxDesigner's C++ header from cdd_splash_dialog.wdr
  67. ////////////////////////////////////////////////////////////////////////////////////////////////
  68. #include <wx/image.h>
  69. #include <wx/statline.h>
  70. #include <wx/spinbutt.h>
  71. #include <wx/spinctrl.h>
  72. #include <wx/splitter.h>
  73. #include <wx/listctrl.h>
  74. #include <wx/treectrl.h>
  75. #include <wx/notebook.h>
  76. #include <wx/grid.h>
  77. // Declare window functions
  78. #define ID_TEXT 10000
  79. #define ID_ST_NAME 10001
  80. #define ID_T_DESCR 10002
  81. #define ID_B_ANNOT 10003
  82. #define ID_B_REF 10004
  83. #define ID_B_DONE 10005
  84. wxSizer *SetupCDDSplashDialog( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE );
  85. ////////////////////////////////////////////////////////////////////////////////////////////////
  86. USING_NCBI_SCOPE;
  87. USING_SCOPE(objects);
  88. BEGIN_SCOPE(Cn3D)
  89. #define DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(var, id, type) 
  90.     type *var; 
  91.     var = wxDynamicCast(FindWindow(id), type); 
  92.     if (!var) { 
  93.         ERRORMSG("Can't find window with id " << id); 
  94.         return; 
  95.     }
  96. BEGIN_EVENT_TABLE(CDDSplashDialog, wxDialog)
  97.     EVT_CLOSE       (       CDDSplashDialog::OnCloseWindow)
  98.     EVT_BUTTON      (-1,    CDDSplashDialog::OnButton)
  99. END_EVENT_TABLE()
  100. CDDSplashDialog::CDDSplashDialog(StructureWindow *cn3dFrame,
  101.     StructureSet *structureSet, CDDSplashDialog **parentHandle,
  102.     wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos) :
  103.         wxDialog(parent, id, title, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE),
  104.         sSet(structureSet), structureWindow(cn3dFrame), handle(parentHandle)
  105. {
  106.     if (!structureSet) {
  107.         Destroy();
  108.         return;
  109.     }
  110.     // construct the panel
  111.     wxPanel *panel = new wxPanel(this, -1);
  112.     wxSizer *topSizer = SetupCDDSplashDialog(panel, false);
  113.     // fill in info
  114.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tName, ID_ST_NAME, wxStaticText)
  115.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tDescr, ID_T_DESCR, wxTextCtrl)
  116.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bAnnot, ID_B_ANNOT, wxButton)
  117.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bRef, ID_B_REF, wxButton)
  118.     const string& cddName = structureSet->GetCDDName();
  119.     if (cddName.size() > 0)
  120.         tName->SetLabel(cddName.c_str());
  121.     const string& cddDescr = structureSet->GetCDDDescription();
  122.     if (cddDescr.size() > 0) {
  123.         int i, j;
  124.         for (i=j=0; i<cddDescr.size(); ++i, ++j) {
  125.             if (j > 60 && cddDescr[i] == ' ') {
  126.                 *tDescr << 'n';
  127.                 j = 0;
  128.             } else
  129.                 *tDescr << cddDescr[i];
  130.         }
  131.         *tDescr << "nn";
  132.     }
  133.     // summarize annotations
  134.     const CAlign_annot_set *annots = structureSet->GetCDDAnnotSet();
  135.     if (annots && annots->Get().size() > 0) {
  136.         *tDescr << "Annotation summary:nn";
  137.         CAlign_annot_set::Tdata::const_iterator a, ae = annots->Get().end();
  138.         for (a=annots->Get().begin(); a!=ae; ++a) {
  139.             *tDescr << ((*a)->IsSetDescription() ? (*a)->GetDescription() : string("")).c_str()
  140.                 << "; evidence:n";
  141.             if ((*a)->IsSetEvidence()) {
  142.                 CAlign_annot::TEvidence::const_iterator e, ee = (*a)->GetEvidence().end();
  143.                 for (e=(*a)->GetEvidence().begin(); e!=ee; ++e) {
  144.                     if ((*e)->IsComment())
  145.                         *tDescr << "  comment: " << (*e)->GetComment().c_str() << 'n';
  146.                     else if ((*e)->IsReference() && (*e)->GetReference().IsPmid())
  147.                         *tDescr << "  PubMed " << (*e)->GetReference().GetPmid().Get() << 'n';
  148.                     else if ((*e)->IsBsannot()) {
  149.                         *tDescr << "  structure:";
  150.                         if ((*e)->GetBsannot().GetFeatures().size() > 0 &&
  151.                             (*e)->GetBsannot().GetFeatures().front()->IsSetDescr() &&
  152.                             (*e)->GetBsannot().GetFeatures().front()->IsSetDescr() &&
  153.                             (*e)->GetBsannot().GetFeatures().front()->GetDescr().front()->IsName())
  154.                             *tDescr << ' ' <<
  155.                                 (*e)->GetBsannot().GetFeatures().front()->GetDescr().front()->GetName().c_str();
  156.                         if ((*e)->GetBsannot().IsSetId() && (*e)->GetBsannot().GetId().front()->IsMmdb_id()) {
  157.                             int mmdbID = (*e)->GetBsannot().GetId().front()->GetMmdb_id().Get();
  158.                             StructureSet::ObjectList::const_iterator o, oe = structureSet->objects.end();
  159.                             for (o=structureSet->objects.begin(); o!=oe; ++o) {
  160.                                 if ((*o)->mmdbID == mmdbID) {
  161.                                     *tDescr << " (" << (*o)->pdbID.c_str() << ')';
  162.                                     break;
  163.                                 }
  164.                             }
  165.                         }
  166.                         *tDescr << 'n';
  167.                     }
  168.                 }
  169.             }
  170.             *tDescr << 'n';
  171.         }
  172.     }
  173.     // summarize structures
  174.     if (structureSet->objects.size() > 0) {
  175.         *tDescr << "Structure summary:n";
  176.         StructureSet::ObjectList::const_iterator o, oe = structureSet->objects.end();
  177.         for (o=structureSet->objects.begin(); o!=oe; ++o) {
  178.             *tDescr << "nPDB " << (*o)->pdbID.c_str() << " (MMDB " << (*o)->mmdbID << ")n";
  179.             // make lists of biopolymer chains and heterogens
  180.             typedef list < string > ChainList;
  181.             ChainList chainList;
  182.             typedef map < string , int > HetList;
  183.             HetList hetList;
  184.             ChemicalGraph::MoleculeMap::const_iterator m, me = (*o)->graph->molecules.end();
  185.             for (m=(*o)->graph->molecules.begin(); m!=me; ++m) {
  186.                 if (m->second->IsProtein() || m->second->IsNucleotide()) {
  187.                     wxString descr;
  188.                     SequenceSet::SequenceList::const_iterator
  189.                         s, se = structureSet->sequenceSet->sequences.end();
  190.                     for (s=structureSet->sequenceSet->sequences.begin(); s!=se; ++s) {
  191.                         if ((*s)->identifier == m->second->identifier) {
  192.                             descr.Printf("%s: gi %i (%s)", m->second->identifier->ToString().c_str(),
  193.                                 (*s)->identifier->gi, (*s)->description.c_str());
  194.                             break;
  195.                         }
  196.                     }
  197.                     if (s == se)
  198.                         descr.Printf("%s: gi %i", m->second->identifier->ToString().c_str(),
  199.                             m->second->identifier->gi);
  200.                     chainList.push_back(descr.c_str());
  201.                 } else if (m->second->IsHeterogen()) {
  202.                     // get name from local graph name of first (should be only) residue
  203.                     const string& name = m->second->residues.find(1)->second->nameGraph;
  204.                     HetList::iterator n = hetList.find(name);
  205.                     if (n == hetList.end())
  206.                         hetList[name] = 1;
  207.                     else
  208.                         ++(n->second);
  209.                 }
  210.             }
  211.             chainList.sort();
  212.             // print chains
  213.             ChainList::const_iterator c, ce = chainList.end();
  214.             for (c=chainList.begin(); c!=ce; ++c)
  215.                 *tDescr << "    " << c->c_str() << 'n';
  216.             // print hets
  217.             if (hetList.size() > 0) {
  218.                 *tDescr << "Heterogens: ";
  219.                 HetList::const_iterator h, he = hetList.end();
  220.                 for (h=hetList.begin(); h!=he; ++h) {
  221.                     if (h != hetList.begin())
  222.                         *tDescr << ", ";
  223.                     wxString descr;
  224.                     if (h->second > 1)
  225.                         descr.Printf("%s (x%i)", h->first.c_str(), h->second);
  226.                     else
  227.                         descr = h->first.c_str();
  228.                     *tDescr << descr;
  229.                 }
  230.                 *tDescr << 'n';
  231.             }
  232.         }
  233.     }
  234.     const CCdd_descr_set *cddRefs = structureSet->GetCDDDescrSet();
  235.     CCdd_descr_set::Tdata::const_iterator d, de = cddRefs->Get().end();
  236.     for (d=cddRefs->Get().begin(); d!=de; ++d) {
  237.         if ((*d)->IsReference() && (*d)->GetReference().IsPmid())
  238.             break;
  239.     }
  240.     if (d == de)    // if no PMID references found
  241.         bRef->Enable(false);
  242.     const CAlign_annot_set *cddAnnot = structureSet->GetCDDAnnotSet();
  243.     if (cddAnnot->Get().size() == 0)
  244.         bAnnot->Enable(false);
  245.     // call sizer stuff
  246.     topSizer->Fit(this);
  247.     topSizer->Fit(panel);
  248.     topSizer->SetSizeHints(this);
  249. }
  250. CDDSplashDialog::~CDDSplashDialog(void)
  251. {
  252.     if (handle && *handle) *handle = NULL;
  253. }
  254. // same as hitting done
  255. void CDDSplashDialog::OnCloseWindow(wxCloseEvent& event)
  256. {
  257.     Destroy();
  258. }
  259. void CDDSplashDialog::OnButton(wxCommandEvent& event)
  260. {
  261.     if (event.GetId() == ID_B_ANNOT) {
  262.         structureWindow->ShowCDDAnnotations();
  263.     }
  264.     else if (event.GetId() == ID_B_REF) {
  265.         structureWindow->ShowCDDReferences();
  266.     }
  267.     else if (event.GetId() == ID_B_DONE) {
  268.         Destroy();
  269.     }
  270. }
  271. END_SCOPE(Cn3D)
  272. //////////////////////////////////////////////////////////////////////////////////////////////////
  273. // The following are taken *without* modification from wxDesigner C++ code generated from
  274. // cdd_splash_dialog.wdr.
  275. //////////////////////////////////////////////////////////////////////////////////////////////////
  276. wxSizer *SetupCDDSplashDialog( wxWindow *parent, bool call_fit, bool set_sizer )
  277. {
  278.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  279.     wxFlexGridSizer *item1 = new wxFlexGridSizer( 2, 0, 0 );
  280.     item1->AddGrowableCol( 1 );
  281.     wxStaticText *item2 = new wxStaticText( parent, ID_TEXT, "Name:", wxDefaultPosition, wxDefaultSize, 0 );
  282.     item1->Add( item2, 0, wxALIGN_CENTRE|wxALL, 5 );
  283.     wxStaticText *item3 = new wxStaticText( parent, ID_ST_NAME, "", wxDefaultPosition, wxDefaultSize, 0 );
  284.     item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  285.     item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  286.     wxTextCtrl *item4 = new wxTextCtrl( parent, ID_T_DESCR, "", wxDefaultPosition, wxSize(-1,100), wxTE_MULTILINE|wxTE_READONLY );
  287.     item0->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  288.     wxBoxSizer *item5 = new wxBoxSizer( wxHORIZONTAL );
  289.     wxButton *item6 = new wxButton( parent, ID_B_ANNOT, "Show Annotations Panel", wxDefaultPosition, wxDefaultSize, 0 );
  290.     item5->Add( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  291.     wxButton *item7 = new wxButton( parent, ID_B_REF, "Show References Panel", wxDefaultPosition, wxDefaultSize, 0 );
  292.     item5->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  293.     item5->Add( 20, 20, 0, wxALIGN_CENTRE|wxALL, 5 );
  294.     wxButton *item8 = new wxButton( parent, ID_B_DONE, "Dismiss", wxDefaultPosition, wxDefaultSize, 0 );
  295.     item5->Add( item8, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  296.     item0->Add( item5, 0, wxALIGN_CENTRE|wxALL, 5 );
  297.     if (set_sizer)
  298.     {
  299.         parent->SetAutoLayout( TRUE );
  300.         parent->SetSizer( item0 );
  301.         if (call_fit)
  302.         {
  303.             item0->Fit( parent );
  304.             item0->SetSizeHints( parent );
  305.         }
  306.     }
  307.     return item0;
  308. }
  309. /*
  310. * ---------------------------------------------------------------------------
  311. * $Log: cdd_splash_dialog.cpp,v $
  312. * Revision 1000.2  2004/06/01 18:28:01  gouriano
  313. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  314. *
  315. * Revision 1.12  2004/05/21 21:41:39  gorelenk
  316. * Added PCH ncbi_pch.hpp
  317. *
  318. * Revision 1.11  2004/03/15 18:16:33  thiessen
  319. * prefer prefix vs. postfix ++/-- operators
  320. *
  321. * Revision 1.10  2004/02/19 17:04:45  thiessen
  322. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  323. *
  324. * Revision 1.9  2003/03/13 14:26:18  thiessen
  325. * add file_messaging module; split cn3d_main_wxwin into cn3d_app, cn3d_glcanvas, structure_window, cn3d_tools
  326. *
  327. * Revision 1.8  2003/02/03 19:20:02  thiessen
  328. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  329. *
  330. * Revision 1.7  2002/12/19 19:15:27  thiessen
  331. * cosmetic fixes
  332. *
  333. * Revision 1.6  2002/12/19 18:52:41  thiessen
  334. * add structure summary
  335. *
  336. * Revision 1.5  2002/12/07 01:38:36  thiessen
  337. * fix header problem
  338. *
  339. * Revision 1.4  2002/09/18 14:12:00  thiessen
  340. * add annotations summary to overview
  341. *
  342. * Revision 1.3  2002/08/15 22:13:13  thiessen
  343. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  344. *
  345. * Revision 1.2  2002/04/09 23:59:09  thiessen
  346. * add cdd annotations read-only option
  347. *
  348. * Revision 1.1  2002/04/09 14:38:24  thiessen
  349. * add cdd splash screen
  350. *
  351. */