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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cdd_ref_dialog.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 18:27:59  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: cdd_ref_dialog.cpp,v 1000.3 2004/06/01 18:27:59 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 editing CDD references
  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.hpp>
  47. #include <objects/pub/Pub.hpp>
  48. #include <objects/biblio/PubMedId.hpp>
  49. #include "cdd_ref_dialog.hpp"
  50. #include "structure_set.hpp"
  51. #include "cn3d_tools.hpp"
  52. #include <wx/tokenzr.h>
  53. ////////////////////////////////////////////////////////////////////////////////////////////////
  54. // The following is taken unmodified from wxDesigner's C++ header from cdd_ref_dialog.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. #include <wx/grid.h>
  65. // Declare window functions
  66. #define ID_L_REFS 10000
  67. #define ID_B_LAUNCH 10001
  68. #define ID_B_UP 10002
  69. #define ID_B_EDIT 10003
  70. #define ID_B_DOWN 10004
  71. #define ID_B_ADD 10005
  72. #define ID_B_DELETE 10006
  73. #define ID_B_DONE 10007
  74. wxSizer *SetupReferencesDialog( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE );
  75. ////////////////////////////////////////////////////////////////////////////////////////////////
  76. USING_NCBI_SCOPE;
  77. USING_SCOPE(objects);
  78. BEGIN_SCOPE(Cn3D)
  79. #define DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(var, id, type) 
  80.     type *var; 
  81.     var = wxDynamicCast(FindWindow(id), type); 
  82.     if (!var) { 
  83.         ERRORMSG("Can't find window with id " << id); 
  84.         return; 
  85.     }
  86. BEGIN_EVENT_TABLE(CDDRefDialog, wxDialog)
  87.     EVT_CLOSE       (       CDDRefDialog::OnCloseWindow)
  88.     EVT_BUTTON      (-1,    CDDRefDialog::OnButton)
  89. END_EVENT_TABLE()
  90. CDDRefDialog::CDDRefDialog(StructureSet *structureSet, CDDRefDialog **handle,
  91.     wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos) :
  92.         wxDialog(parent, id, title, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER),
  93.         sSet(structureSet), dialogHandle(handle), selectItem(0)
  94. {
  95.     if (!structureSet || !(descrSet = structureSet->GetCDDDescrSet())) {
  96.         ERRORMSG("CDDRefDialog::CDDRefDialog() - error getting descr set data");
  97.         Destroy();
  98.         return;
  99.     }
  100.     // construct the dialog
  101.     wxSizer *topSizer = SetupReferencesDialog(this, false);
  102.     // fill in list box with available references
  103.     ResetListBox();
  104.     bool readOnly;
  105.     RegistryGetBoolean(REG_ADVANCED_SECTION, REG_CDD_ANNOT_READONLY, &readOnly);
  106.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bAdd, ID_B_ADD, wxButton)
  107.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bEdit, ID_B_EDIT, wxButton)
  108.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bDelete, ID_B_DELETE, wxButton)
  109.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bUp, ID_B_UP, wxButton)
  110.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bDown, ID_B_DOWN, wxButton)
  111.     bAdd->Enable(!readOnly);
  112.     bEdit->Enable(!readOnly);
  113.     bDelete->Enable(!readOnly);
  114.     bUp->Enable(!readOnly);
  115.     bDown->Enable(!readOnly);
  116.     // call sizer stuff
  117.     topSizer->Fit(this);
  118.     topSizer->SetSizeHints(this);
  119. }
  120. CDDRefDialog::~CDDRefDialog(void)
  121. {
  122.     // so owner knows that this dialog has been destroyed
  123.     if (dialogHandle && *dialogHandle) *dialogHandle = NULL;
  124.     TRACEMSG("CDD references dialog destroyed");
  125. }
  126. // same as hitting done
  127. void CDDRefDialog::OnCloseWindow(wxCloseEvent& event)
  128. {
  129.     Destroy();
  130. }
  131. void CDDRefDialog::OnButton(wxCommandEvent& event)
  132. {
  133.     // get listbox and descr from selected item
  134.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(listbox, ID_L_REFS, wxListBox)
  135.     CCdd_descr *descr = NULL;
  136.     selectItem = listbox->GetSelection();
  137.     if (selectItem >= 0 && selectItem < listbox->GetCount())
  138.         descr = dynamic_cast<CCdd_descr*>(
  139.             reinterpret_cast<CObject*>(listbox->GetClientData(selectItem)));
  140.     // launch URL given PMID
  141.     if (event.GetId() == ID_B_LAUNCH && descr) {
  142.         wxString url;
  143.         url.Printf("http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?"
  144.             "cmd=Retrieve&db=PubMed&dopt=Abstract&list_uids=%i",
  145.             descr->GetReference().GetPmid().Get());
  146.         LaunchWebPage(url);
  147.     }
  148.     // add reference
  149.     else if (event.GetId() == ID_B_ADD) {
  150.         wxString ids = wxGetTextFromUser("Enter a list of PubMed IDs:", "Input PMIDs", "", this);
  151.         wxStringTokenizer tkz(ids, " ,;trn", wxTOKEN_STRTOK);
  152.         long pmidVal;
  153.         while (tkz.HasMoreTokens()) {
  154.             wxString id = tkz.GetNextToken();
  155.             if (id.size() > 0 && id.ToLong(&pmidVal) && pmidVal > 0) {
  156.                 CRef < CCdd_descr > ref(new CCdd_descr());
  157.                 ref->SetReference().SetPmid().Set((int) pmidVal);
  158.                 descrSet->Set().push_back(ref);
  159.                 sSet->SetDataChanged(StructureSet::eCDDData);
  160.                 selectItem = listbox->GetCount();
  161.                 ResetListBox();
  162.             } else
  163.                 ERRORMSG("Invalid PMID: '" << id.c_str() << "'");
  164.         }
  165.     }
  166.     // edit reference
  167.     else if (event.GetId() == ID_B_EDIT && descr) {
  168.         wxString init;
  169.         init.Printf("%i", descr->GetReference().GetPmid().Get());
  170.         wxString pmidStr = wxGetTextFromUser("Enter/edit the PubMed ID:", "Edit PMID", init, this);
  171.         unsigned long pmidVal;
  172.         if (pmidStr.size() > 0 && pmidStr.ToULong(&pmidVal)) {
  173.             descr->SetReference().SetPmid().Set((int) pmidVal);
  174.             sSet->SetDataChanged(StructureSet::eCDDData);
  175.             ResetListBox();
  176.         }
  177.     }
  178.     // delete reference
  179.     else if (event.GetId() == ID_B_DELETE && descr) {
  180.         CCdd_descr_set::Tdata::iterator d, de = descrSet->Set().end();
  181.         for (d=descrSet->Set().begin(); d!=de; ++d) {
  182.             if (d->GetPointer() == descr) {
  183.                 descrSet->Set().erase(d);
  184.                 sSet->SetDataChanged(StructureSet::eCDDData);
  185.                 ResetListBox();
  186.                 break;
  187.             }
  188.         }
  189.     }
  190.     else if ((event.GetId() == ID_B_UP || event.GetId() == ID_B_DOWN) && descr) {
  191.         CCdd_descr_set::Tdata::iterator d, de = descrSet->Set().end(), p = descrSet->Set().end(), n;
  192.         for (d=descrSet->Set().begin(); d!=de; ++d) {
  193.             if (d->GetPointer() == descr) {
  194.                 CRef < CCdd_descr > tmp(*d);
  195.                 n = d;
  196.                 do {        // find next pmid ref
  197.                     ++n;
  198.                 } while (n != descrSet->Set().end() && !((*n)->IsReference() && (*n)->GetReference().IsPmid()));
  199.                 if (event.GetId() == ID_B_DOWN && n != descrSet->Set().end()) {
  200.                     *d = *n;
  201.                     *n = tmp;
  202.                     ++selectItem;
  203.                 } else if (event.GetId() == ID_B_UP && p != descrSet->Set().end()) {
  204.                     *d = *p;
  205.                     *p = tmp;
  206.                     --selectItem;
  207.                 } else
  208.                     break;
  209.                 sSet->SetDataChanged(StructureSet::eCDDData);
  210.                 ResetListBox();
  211.                 break;
  212.             }
  213.             if ((*d)->IsReference() && (*d)->GetReference().IsPmid())
  214.                 p = d;      // keep prev pmid ref
  215.         }
  216.     }
  217.     else if (event.GetId() == ID_B_DONE) {
  218.         Destroy();
  219.     }
  220. }
  221. void CDDRefDialog::ResetListBox(void)
  222. {
  223.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(listbox, ID_L_REFS, wxListBox)
  224.     listbox->Clear();
  225.     CCdd_descr_set::Tdata::iterator d, de = descrSet->Set().end();
  226.     for (d=descrSet->Set().begin(); d!=de; ++d) {
  227.         if ((*d)->IsReference() && (*d)->GetReference().IsPmid()) {
  228.             wxString title;
  229.             title.Printf("%i", (*d)->GetReference().GetPmid().Get());
  230.             // make client data of menu item a pointer to the CCdd_descr object
  231.             listbox->Append(title, d->GetPointer());
  232.         }
  233.     }
  234.     if (selectItem >= 0 && selectItem < listbox->GetCount())
  235.         listbox->SetSelection(selectItem, true);
  236. }
  237. END_SCOPE(Cn3D)
  238. //////////////////////////////////////////////////////////////////////////////////////////////////
  239. // The following are taken *without* modification from wxDesigner C++ code generated from
  240. // cdd_ref_dialog.wdr.
  241. //////////////////////////////////////////////////////////////////////////////////////////////////
  242. wxSizer *SetupReferencesDialog( wxWindow *parent, bool call_fit, bool set_sizer )
  243. {
  244.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  245.     wxStaticBox *item2 = new wxStaticBox( parent, -1, wxT("PubMed IDs") );
  246.     wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL );
  247.     wxFlexGridSizer *item3 = new wxFlexGridSizer( 1, 0, 0 );
  248.     wxString *strs4 = (wxString*) NULL;
  249.     wxListBox *item4 = new wxListBox( parent, ID_L_REFS, wxDefaultPosition, wxSize(80,100), 0, strs4, wxLB_SINGLE|wxLB_NEEDED_SB );
  250.     item3->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  251.     wxGridSizer *item5 = new wxGridSizer( 2, 0, 0 );
  252.     wxButton *item6 = new wxButton( parent, ID_B_LAUNCH, wxT("Launch"), wxDefaultPosition, wxDefaultSize, 0 );
  253.     item5->Add( item6, 0, wxALIGN_CENTRE|wxALL, 5 );
  254.     wxButton *item7 = new wxButton( parent, ID_B_UP, wxT("Move Up"), wxDefaultPosition, wxDefaultSize, 0 );
  255.     item5->Add( item7, 0, wxALIGN_CENTRE|wxALL, 5 );
  256.     wxButton *item8 = new wxButton( parent, ID_B_EDIT, wxT("Edit"), wxDefaultPosition, wxDefaultSize, 0 );
  257.     item5->Add( item8, 0, wxALIGN_CENTRE|wxALL, 5 );
  258.     wxButton *item9 = new wxButton( parent, ID_B_DOWN, wxT("Move Down"), wxDefaultPosition, wxDefaultSize, 0 );
  259.     item5->Add( item9, 0, wxALIGN_CENTRE|wxALL, 5 );
  260.     wxButton *item10 = new wxButton( parent, ID_B_ADD, wxT("Add"), wxDefaultPosition, wxDefaultSize, 0 );
  261.     item5->Add( item10, 0, wxALIGN_CENTRE|wxALL, 5 );
  262.     wxButton *item11 = new wxButton( parent, ID_B_DELETE, wxT("Delete"), wxDefaultPosition, wxDefaultSize, 0 );
  263.     item5->Add( item11, 0, wxALIGN_CENTRE|wxALL, 5 );
  264.     item3->Add( item5, 0, wxALIGN_CENTRE|wxALL, 5 );
  265.     item1->Add( item3, 0, wxALIGN_CENTRE, 5 );
  266.     item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  267.     wxBoxSizer *item12 = new wxBoxSizer( wxHORIZONTAL );
  268.     wxButton *item13 = new wxButton( parent, ID_B_DONE, wxT("Done"), wxDefaultPosition, wxDefaultSize, 0 );
  269.     item12->Add( item13, 0, wxALIGN_CENTRE|wxALL, 5 );
  270.     item0->Add( item12, 0, wxALIGN_CENTRE|wxALL, 5 );
  271.     if (set_sizer)
  272.     {
  273.         parent->SetAutoLayout( TRUE );
  274.         parent->SetSizer( item0 );
  275.         if (call_fit)
  276.         {
  277.             item0->Fit( parent );
  278.             item0->SetSizeHints( parent );
  279.         }
  280.     }
  281.     return item0;
  282. }
  283. /*
  284. * ---------------------------------------------------------------------------
  285. * $Log: cdd_ref_dialog.cpp,v $
  286. * Revision 1000.3  2004/06/01 18:27:59  gouriano
  287. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  288. *
  289. * Revision 1.13  2004/05/21 21:41:38  gorelenk
  290. * Added PCH ncbi_pch.hpp
  291. *
  292. * Revision 1.12  2004/03/15 17:28:48  thiessen
  293. * prefer prefix vs. postfix ++/-- operators
  294. *
  295. * Revision 1.11  2004/02/19 17:04:45  thiessen
  296. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  297. *
  298. * Revision 1.10  2003/11/06 18:52:31  thiessen
  299. * make geometry violations shown on/off; allow multiple pmid entry in ref dialog
  300. *
  301. * Revision 1.9  2003/06/22 09:47:40  thiessen
  302. * rearrange buttons
  303. *
  304. * Revision 1.8  2003/06/13 19:12:58  thiessen
  305. * add move up/down buttons, selection control
  306. *
  307. * Revision 1.7  2003/02/03 19:20:01  thiessen
  308. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  309. *
  310. * Revision 1.6  2002/08/15 22:13:12  thiessen
  311. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  312. *
  313. * Revision 1.5  2002/04/09 23:59:09  thiessen
  314. * add cdd annotations read-only option
  315. *
  316. * Revision 1.4  2002/04/09 14:38:23  thiessen
  317. * add cdd splash screen
  318. *
  319. * Revision 1.3  2001/12/06 23:13:44  thiessen
  320. * finish import/align new sequences into single-structure data; many small tweaks
  321. *
  322. * Revision 1.2  2001/11/27 16:26:07  thiessen
  323. * major update to data management system
  324. *
  325. * Revision 1.1  2001/10/09 18:57:04  thiessen
  326. * add CDD references editing dialog
  327. *
  328. */