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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cdd_annot_dialog.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:27:54  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.39
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: cdd_annot_dialog.cpp,v 1000.2 2004/06/01 18:27:54 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. *      dialogs for annotating CDD's
  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/Align_annot.hpp>
  47. #include <objects/seqloc/Seq_loc.hpp>
  48. #include <objects/seqloc/Seq_interval.hpp>
  49. #include <objects/seqloc/Packed_seqint.hpp>
  50. #include <objects/pub/Pub.hpp>
  51. #include <objects/biblio/PubMedId.hpp>
  52. #include <objects/mmdb1/Biostruc_annot_set.hpp>
  53. #include <objects/mmdb1/Biostruc_descr.hpp>
  54. #include <objects/mmdb1/Biostruc_id.hpp>
  55. #include <objects/mmdb1/Mmdb_id.hpp>
  56. #include <objects/mmdb3/Biostruc_feature_set.hpp>
  57. #include <objects/mmdb3/Biostruc_feature_set_descr.hpp>
  58. #include <objects/mmdb3/Biostruc_feature.hpp>
  59. #include <objects/mmdb3/Chem_graph_pntrs.hpp>
  60. #include <objects/mmdb3/Residue_pntrs.hpp>
  61. #include <objects/mmdb3/Residue_interval_pntr.hpp>
  62. #include <objects/mmdb1/Molecule_id.hpp>
  63. #include <objects/mmdb1/Residue_id.hpp>
  64. #include <objects/cn3d/Cn3d_backbone_type.hpp>
  65. #include <objects/cn3d/Cn3d_backbone_style.hpp>
  66. #include <objects/cn3d/Cn3d_general_style.hpp>
  67. #include <objects/cn3d/Cn3d_style_settings.hpp>
  68. #include "cdd_annot_dialog.hpp"
  69. #include "structure_set.hpp"
  70. #include "messenger.hpp"
  71. #include "alignment_manager.hpp"
  72. #include "block_multiple_alignment.hpp"
  73. #include "sequence_set.hpp"
  74. #include "cn3d_tools.hpp"
  75. #include "chemical_graph.hpp"
  76. #include "molecule_identifier.hpp"
  77. #include "opengl_renderer.hpp"
  78. #include "show_hide_manager.hpp"
  79. ////////////////////////////////////////////////////////////////////////////////////////////////
  80. // The following is taken unmodified from wxDesigner's C++ header from cdd_annot_dialog.wdr
  81. ////////////////////////////////////////////////////////////////////////////////////////////////
  82. #include <wx/image.h>
  83. #include <wx/statline.h>
  84. #include <wx/spinbutt.h>
  85. #include <wx/spinctrl.h>
  86. #include <wx/splitter.h>
  87. #include <wx/listctrl.h>
  88. #include <wx/treectrl.h>
  89. #include <wx/notebook.h>
  90. // Declare window functions
  91. #define ID_L_ANNOT 10000
  92. #define ID_B_NEW_ANNOT 10001
  93. #define ID_B_HIGHLIGHT 10002
  94. #define ID_B_ANNOT_UP 10003
  95. #define ID_B_EDIT_ANNOT 10004
  96. #define ID_B_DEL_ANNOT 10005
  97. #define ID_B_ANNOT_DOWN 10006
  98. #define ID_L_EVID 10007
  99. #define ID_B_NEW_EVID 10008
  100. #define ID_B_SHOW 10009
  101. #define ID_B_EVID_UP 10010
  102. #define ID_B_EDIT_EVID 10011
  103. #define ID_B_DEL_EVID 10012
  104. #define ID_B_EVID_DOWN 10013
  105. wxSizer *SetupCDDAnnotDialog( wxPanel *parent, bool call_fit = TRUE, bool set_sizer = TRUE );
  106. #define ID_R_COMMENT 10014
  107. #define ID_ST_COMMENT 10015
  108. #define ID_T_COMMENT 10016
  109. #define ID_LINE 10017
  110. #define ID_R_PMID 10018
  111. #define ID_ST_PMID 10019
  112. #define ID_T_PMID 10020
  113. #define ID_R_STRUCTURE 10021
  114. #define ID_ST_STRUCTURE 10022
  115. #define ID_T_STRUCTURE 10023
  116. #define ID_B_RERANGE 10024
  117. #define ID_B_EDIT_OK 10025
  118. #define ID_B_EDIT_CANCEL 10026
  119. wxSizer *SetupEvidenceDialog( wxPanel *parent, bool call_fit = TRUE, bool set_sizer = TRUE );
  120. ////////////////////////////////////////////////////////////////////////////////////////////////
  121. USING_NCBI_SCOPE;
  122. USING_SCOPE(objects);
  123. BEGIN_SCOPE(Cn3D)
  124. // a "structure evidence" biostruc-annot-set has these qualities - basically, a specific
  125. // comment tag as the first entry in the set's description, and a 'name' descr in the feature set
  126. static const string STRUCTURE_EVIDENCE_COMMENT = "Used as Structure Evidence for CDD Annotation";
  127. #define IS_STRUCTURE_EVIDENCE_BSANNOT(evidence) 
  128.     ((evidence).IsBsannot() && 
  129.      (evidence).GetBsannot().IsSetDescr() && 
  130.      (evidence).GetBsannot().GetDescr().size() > 0 && 
  131.      (evidence).GetBsannot().GetDescr().front()->IsOther_comment() && 
  132.      (evidence).GetBsannot().GetDescr().front()->GetOther_comment() == STRUCTURE_EVIDENCE_COMMENT && 
  133.      (evidence).GetBsannot().GetFeatures().size() > 0 && 
  134.      (evidence).GetBsannot().GetFeatures().front()->IsSetDescr() && 
  135.      (evidence).GetBsannot().GetFeatures().front()->GetDescr().size() > 0 && 
  136.      (evidence).GetBsannot().GetFeatures().front()->GetDescr().front()->IsName())
  137. #define DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(var, id, type) 
  138.     type *var; 
  139.     var = wxDynamicCast(FindWindow(id), type); 
  140.     if (!var) { 
  141.         ERRORMSG("Can't find window with id " << id); 
  142.         return; 
  143.     }
  144. #define DECLARE_AND_FIND_WINDOW_RETURN_FALSE_ON_ERR(var, id, type) 
  145.     type *var; 
  146.     var = wxDynamicCast(FindWindow(id), type); 
  147.     if (!var) { 
  148.         ERRORMSG("Can't find window with id " << id); 
  149.         return false; 
  150.     }
  151. BEGIN_EVENT_TABLE(CDDAnnotateDialog, wxDialog)
  152.     EVT_BUTTON      (-1,    CDDAnnotateDialog::OnButton)
  153.     EVT_LISTBOX     (-1,    CDDAnnotateDialog::OnSelection)
  154.     EVT_CLOSE       (       CDDAnnotateDialog::OnCloseWindow)
  155. END_EVENT_TABLE()
  156. CDDAnnotateDialog::CDDAnnotateDialog(wxWindow *parent, CDDAnnotateDialog **handle, StructureSet *set) :
  157.     wxDialog(parent, -1, "CDD Annotations", wxPoint(400, 100), wxDefaultSize,
  158.         wxCAPTION | wxSYSTEM_MENU | wxDIALOG_MODELESS | wxFRAME_NO_TASKBAR),    // not resizable
  159.     dialogHandle(handle), structureSet(set), annotSet(set->GetCDDAnnotSet())
  160. {
  161.     if (annotSet.Empty()) {
  162.         Destroy();
  163.         return;
  164.     }
  165.     // construct the panel
  166.     wxPanel *panel = new wxPanel(this, -1);
  167.     wxSizer *topSizer = SetupCDDAnnotDialog(panel, false);
  168.     // call sizer stuff
  169.     topSizer->Fit(panel);
  170.     SetClientSize(topSizer->GetMinSize());
  171.     // set initial GUI state
  172.     SetupGUIControls(0, 0);
  173. }
  174. CDDAnnotateDialog::~CDDAnnotateDialog(void)
  175. {
  176.     // so owner knows that this dialog has been destroyed
  177.     if (dialogHandle && *dialogHandle) *dialogHandle = NULL;
  178.     TRACEMSG("destroyed CDDAnnotateDialog");
  179. }
  180. void CDDAnnotateDialog::OnCloseWindow(wxCloseEvent& event)
  181. {
  182.     Destroy();
  183. }
  184. void CDDAnnotateDialog::GetCurrentHighlightedIntervals(IntervalList *intervals)
  185. {
  186.     const BlockMultipleAlignment *alignment = structureSet->alignmentManager->GetCurrentMultipleAlignment();
  187.     const Sequence *master = alignment->GetMaster();
  188.     // find intervals of aligned residues of the master sequence that are currently highlighted
  189.     intervals->clear();
  190.     int first = 0, last = 0;
  191.     while (first < master->Length()) {
  192.         // find first highlighted residue
  193.         while (first < master->Length() &&
  194.                !(GlobalMessenger()->IsHighlighted(master, first) &&
  195.                  alignment->IsAligned(0, first))) ++first;
  196.         if (first >= master->Length()) break;
  197.         // find last in contiguous stretch of highlighted residues
  198.         last = first;
  199.         while (last + 1 < master->Length() &&
  200.                GlobalMessenger()->IsHighlighted(master, last + 1) &&
  201.                alignment->IsAligned(0, last + 1)) ++last;
  202.         // create Seq-interval
  203.         CRef < CSeq_interval > interval(new CSeq_interval());
  204.         interval->SetFrom(first);
  205.         interval->SetTo(last);
  206.         master->FillOutSeqId(&(interval->SetId()));
  207.         intervals->push_back(interval);
  208.         first = last + 2;
  209.     }
  210. }
  211. void CDDAnnotateDialog::OnButton(wxCommandEvent& event)
  212. {
  213.     switch (event.GetId()) {
  214.         // annotation buttons
  215.         case ID_B_NEW_ANNOT:
  216.             NewAnnotation();
  217.             break;
  218.         case ID_B_DEL_ANNOT:
  219.             DeleteAnnotation();
  220.             break;
  221.         case ID_B_EDIT_ANNOT:
  222.             EditAnnotation();
  223.             break;
  224.         case ID_B_HIGHLIGHT:
  225.             HighlightAnnotation();
  226.             break;
  227.         case ID_B_ANNOT_UP: case ID_B_ANNOT_DOWN:
  228.             MoveAnnotation(event.GetId() == ID_B_ANNOT_UP);
  229.             break;
  230.         // evidence buttons
  231.         case ID_B_NEW_EVID:
  232.             NewEvidence();
  233.             break;
  234.         case ID_B_DEL_EVID:
  235.             DeleteEvidence();
  236.             break;
  237.         case ID_B_EDIT_EVID:
  238.             EditEvidence();
  239.             break;
  240.         case ID_B_SHOW:
  241.             ShowEvidence();
  242.             break;
  243.         case ID_B_EVID_UP: case ID_B_EVID_DOWN:
  244.             MoveEvidence(event.GetId() == ID_B_EVID_UP);
  245.             break;
  246.         default:
  247.             event.Skip();
  248.     }
  249. }
  250. void CDDAnnotateDialog::OnSelection(wxCommandEvent& event)
  251. {
  252.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(annots, ID_L_ANNOT, wxListBox)
  253.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(evids, ID_L_EVID, wxListBox)
  254.     if (event.GetEventObject() == annots)
  255.         SetupGUIControls(annots->GetSelection(), 0);
  256.     else
  257.         SetupGUIControls(annots->GetSelection(), evids->GetSelection());
  258. }
  259. void CDDAnnotateDialog::SetupGUIControls(int selectAnnot, int selectEvidence)
  260. {
  261.     // get GUI control pointers
  262.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(annots, ID_L_ANNOT, wxListBox)
  263.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(evids, ID_L_EVID, wxListBox)
  264.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bNewAnnot, ID_B_NEW_ANNOT, wxButton)
  265.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bDelAnnot, ID_B_DEL_ANNOT, wxButton)
  266.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bEditAnnot, ID_B_EDIT_ANNOT, wxButton)
  267.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bHighlight, ID_B_HIGHLIGHT, wxButton)
  268.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bAnnotUp, ID_B_ANNOT_UP, wxButton)
  269.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bAnnotDown, ID_B_ANNOT_DOWN, wxButton)
  270.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bNewEvid, ID_B_NEW_EVID, wxButton)
  271.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bDelEvid, ID_B_DEL_EVID, wxButton)
  272.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bEditEvid, ID_B_EDIT_EVID, wxButton)
  273.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bShow, ID_B_SHOW, wxButton)
  274.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bEvidUp, ID_B_EVID_UP, wxButton)
  275.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bEvidDown, ID_B_EVID_DOWN, wxButton)
  276.     bool readOnly;
  277.     RegistryGetBoolean(REG_ADVANCED_SECTION, REG_CDD_ANNOT_READONLY, &readOnly);
  278.     // fill out annots listbox
  279.     annots->Clear();
  280.     CAlign_annot *selectedAnnot = NULL;
  281.     CAlign_annot_set::Tdata::iterator a, ae = annotSet->Set().end();
  282.     for (a=annotSet->Set().begin(); a!=ae; ++a) {
  283.         if ((*a)->IsSetDescription())
  284.             annots->Append((*a)->GetDescription().c_str(), a->GetPointer());
  285.         else
  286.             annots->Append("(no description)", a->GetPointer());
  287.     }
  288.     if (selectAnnot < annots->GetCount())
  289.         annots->SetSelection(selectAnnot);
  290.     else if (annots->GetCount() > 0)
  291.         annots->SetSelection(0);
  292.     if (annots->GetCount() > 0)
  293.         selectedAnnot = reinterpret_cast<CAlign_annot*>(annots->GetClientData(annots->GetSelection()));
  294.     // fill out evidence listbox
  295.     evids->Clear();
  296.     CFeature_evidence *selectedEvid = NULL;
  297.     if (selectedAnnot && selectedAnnot->IsSetEvidence()) {
  298.         CAlign_annot::TEvidence::iterator e, ee = selectedAnnot->SetEvidence().end();
  299.         for (e=selectedAnnot->SetEvidence().begin(); e!=ee; ++e) {
  300.             // get evidence "title" depending on type
  301.             wxString evidTitle;
  302.             if ((*e)->IsComment())
  303.                 evidTitle.Printf("Comment: %s", (*e)->GetComment().c_str());
  304.             else if ((*e)->IsReference() && (*e)->GetReference().IsPmid())
  305.                 evidTitle.Printf("PMID: %i", (*e)->GetReference().GetPmid().Get());
  306.             else if (IS_STRUCTURE_EVIDENCE_BSANNOT(**e))
  307.                 evidTitle.Printf("Structure: %s",
  308.                     (*e)->GetBsannot().GetFeatures().front()->GetDescr().front()->GetName().c_str());
  309.             else
  310.                 evidTitle = "(unknown type)";
  311.             evids->Append(evidTitle, e->GetPointer());
  312.         }
  313.         if (selectEvidence < evids->GetCount())
  314.             evids->SetSelection(selectEvidence);
  315.         else if (evids->GetCount() > 0)
  316.             evids->SetSelection(0);
  317.         if (evids->GetCount() > 0)
  318.             selectedEvid = reinterpret_cast<CFeature_evidence*>(evids->GetClientData(evids->GetSelection()));
  319.     }
  320.     // set button states
  321.     bNewAnnot->Enable(!readOnly);
  322.     bDelAnnot->Enable(selectedAnnot != NULL && !readOnly);
  323.     bEditAnnot->Enable(selectedAnnot != NULL && !readOnly);
  324.     bHighlight->Enable(selectedAnnot != NULL);
  325.     bAnnotUp->Enable(annots->GetSelection() > 0 && !readOnly);
  326.     bAnnotDown->Enable(annots->GetSelection() < annots->GetCount() - 1 && !readOnly);
  327.     bNewEvid->Enable(selectedAnnot != NULL && !readOnly);
  328.     bDelEvid->Enable(selectedEvid != NULL && !readOnly);
  329.     bEditEvid->Enable(selectedEvid != NULL && !readOnly);
  330.     bShow->Enable(selectedEvid != NULL &&
  331.         ((selectedEvid->IsReference() && selectedEvid->GetReference().IsPmid()) ||
  332.          IS_STRUCTURE_EVIDENCE_BSANNOT(*selectedEvid) || selectedEvid->IsComment()));
  333.     bEvidUp->Enable(evids->GetSelection() > 0 && !readOnly);
  334.     bEvidDown->Enable(evids->GetSelection() < evids->GetCount() - 1 && !readOnly);
  335. }
  336. void CDDAnnotateDialog::NewAnnotation(void)
  337. {
  338.     IntervalList intervals;
  339.     GetCurrentHighlightedIntervals(&intervals);
  340.     if (intervals.size() == 0) {
  341.         ERRORMSG("No aligned+highlighted master residues!");
  342.         return;
  343.     }
  344.     // get description from user
  345.     wxString descr = wxGetTextFromUser(
  346.         "Enter a description for the new annotation:", "Description");
  347.     if (descr.size() == 0) return;
  348.     // create a new annotation
  349.     CRef < CAlign_annot > annot(new CAlign_annot());
  350.     annot->SetDescription(descr.c_str());
  351.     // fill out location
  352.     if (intervals.size() == 1) {
  353.         annot->SetLocation().SetInt(*(intervals.front()));
  354.     } else {
  355.         CPacked_seqint *packed = new CPacked_seqint();
  356.         packed->Set() = intervals;  // copy list
  357.         annot->SetLocation().SetPacked_int(*packed);
  358.     }
  359.     // add to annotation list
  360.     annotSet->Set().push_back(annot);
  361.     structureSet->SetDataChanged(StructureSet::eUserAnnotationData);
  362.     // update GUI
  363.     SetupGUIControls(annotSet->Get().size() - 1, 0);
  364. }
  365. void CDDAnnotateDialog::DeleteAnnotation(void)
  366. {
  367.     // get selection
  368.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(annots, ID_L_ANNOT, wxListBox)
  369.     if (annots->GetCount() == 0 || annots->GetSelection() < 0) return;
  370.     CAlign_annot *selectedAnnot =
  371.         reinterpret_cast<CAlign_annot*>(annots->GetClientData(annots->GetSelection()));
  372.     if (!selectedAnnot) {
  373.         ERRORMSG("CDDAnnotateDialog::DeleteAnnotation() - error getting annotation pointer");
  374.         return;
  375.     }
  376.     // confirm with user
  377.     int confirm = wxMessageBox("This will remove the selected annotation and all then"
  378.         "evidence associated with it. Is this correct?", "Confirm", wxOK | wxCANCEL | wxCENTRE, this);
  379.     if (confirm != wxOK) return;
  380.     // actually delete the annotation
  381.     CAlign_annot_set::Tdata::iterator a, ae = annotSet->Set().end();
  382.     for (a=annotSet->Set().begin(); a!=ae; ++a) {
  383.         if (*a == selectedAnnot) {
  384.             annotSet->Set().erase(a);
  385.             structureSet->SetDataChanged(StructureSet::eUserAnnotationData);
  386.             break;
  387.         }
  388.     }
  389.     // update GUI
  390.     SetupGUIControls(0, 0);
  391. }
  392. void CDDAnnotateDialog::EditAnnotation(void)
  393. {
  394.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(annots, ID_L_ANNOT, wxListBox)
  395.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(evids, ID_L_EVID, wxListBox)
  396.     // get selection
  397.     if (annots->GetCount() == 0 || annots->GetSelection() < 0) return;
  398.     CAlign_annot *selectedAnnot =
  399.         reinterpret_cast<CAlign_annot*>(annots->GetClientData(annots->GetSelection()));
  400.     if (!selectedAnnot) {
  401.         ERRORMSG("CDDAnnotateDialog::EditAnnotation() - error getting annotation pointer");
  402.         return;
  403.     }
  404.     IntervalList intervals;
  405.     GetCurrentHighlightedIntervals(&intervals);
  406.     if (intervals.size() > 0) {
  407.         // move the annotation?
  408.         int move = wxMessageBox("Do you want to move the annotation to the currentlyn"
  409.             "highlighted and aligned residues?", "Move?", wxYES_NO | wxCANCEL | wxCENTRE, this);
  410.         if (move == wxCANCEL)
  411.             return;
  412.         else if (move == wxYES) {
  413.             // change location
  414.             if (intervals.size() == 1) {
  415.                 selectedAnnot->SetLocation().SetInt(*(intervals.front()));
  416.             } else {
  417.                 CPacked_seqint *packed = new CPacked_seqint();
  418.                 packed->Set() = intervals;  // copy list
  419.                 selectedAnnot->SetLocation().SetPacked_int(*packed);
  420.             }
  421.             structureSet->SetDataChanged(StructureSet::eUserAnnotationData);
  422.         }
  423.     }
  424.     // edit description
  425.     wxString initial;
  426.     if (selectedAnnot->IsSetDescription()) initial = selectedAnnot->GetDescription().c_str();
  427.     wxString descr = wxGetTextFromUser(
  428.         "Enter a description for the new annotation:", "Description", initial);
  429.     if (descr.size() > 0 && descr != selectedAnnot->GetDescription().c_str()) {
  430.         selectedAnnot->SetDescription(descr.c_str());
  431.         structureSet->SetDataChanged(StructureSet::eUserAnnotationData);
  432.     }
  433.     // update GUI
  434.     SetupGUIControls(annots->GetSelection(), evids->GetSelection());
  435. }
  436. bool CDDAnnotateDialog::HighlightInterval(const ncbi::objects::CSeq_interval& interval)
  437. {
  438.     const BlockMultipleAlignment *alignment = structureSet->alignmentManager->GetCurrentMultipleAlignment();
  439.     const Sequence *master = alignment->GetMaster();
  440.     // make sure annotation sequence matches master sequence
  441.     if (!master->identifier->MatchesSeqId(interval.GetId())) {
  442.         ERRORMSG("CDDAnnotateDialog::HighlightInterval() - interval Seq-id/master sequence mismatch");
  443.         return false;
  444.     }
  445.     // do the highlighting
  446.     return alignment->HighlightAlignedColumnsOfMasterRange(interval.GetFrom(), interval.GetTo());
  447. }
  448. void CDDAnnotateDialog::HighlightAnnotation(void)
  449. {
  450.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(annots, ID_L_ANNOT, wxListBox)
  451.     // get selection
  452.     if (annots->GetCount() == 0 || annots->GetSelection() < 0) return;
  453.     CAlign_annot *selectedAnnot =
  454.         reinterpret_cast<CAlign_annot*>(annots->GetClientData(annots->GetSelection()));
  455.     if (!selectedAnnot) {
  456.         ERRORMSG("CDDAnnotateDialog::HighlightAnnotation() - error getting annotation pointer");
  457.         return;
  458.     }
  459.     // highlight annotation's intervals
  460.     GlobalMessenger()->RemoveAllHighlights(true);
  461.     bool okay = true;
  462.     if (selectedAnnot->GetLocation().IsInt()) {
  463.         okay = HighlightInterval(selectedAnnot->GetLocation().GetInt());
  464.     } else if (selectedAnnot->GetLocation().IsPacked_int()) {
  465.         CPacked_seqint::Tdata::iterator s,
  466.             se = selectedAnnot->SetLocation().SetPacked_int().Set().end();
  467.         for (s=selectedAnnot->SetLocation().SetPacked_int().Set().begin(); s!=se; ++s) {
  468.             if (!HighlightInterval(**s))
  469.                 okay = false;
  470.         }
  471.     }
  472.     if (!okay)
  473.         wxMessageBox("WARNING: this annotation specifies master residues outside the aligned blocks;"
  474.             " see the message log for details.", "Annotation Error",
  475.             wxOK | wxCENTRE | wxICON_ERROR, this);
  476. }
  477. void CDDAnnotateDialog::MoveAnnotation(bool moveUp)
  478. {
  479.     // get selection
  480.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(annots, ID_L_ANNOT, wxListBox)
  481.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(evids, ID_L_EVID, wxListBox)
  482.     if (annots->GetCount() == 0 || annots->GetSelection() < 0) return;
  483.     CAlign_annot *selectedAnnot =
  484.         reinterpret_cast<CAlign_annot*>(annots->GetClientData(annots->GetSelection()));
  485.     if (!selectedAnnot) {
  486.         ERRORMSG("CDDAnnotateDialog::MoveAnnotation() - error getting annotation pointer");
  487.         return;
  488.     }
  489.     CAlign_annot_set::Tdata::iterator a, ae = annotSet->Set().end(), aPrev = ae, aSwap = ae;
  490.     CRef < CAlign_annot > tmp;
  491.     for (a=annotSet->Set().begin(); a!=ae; ++a) {
  492.         if (*a == selectedAnnot) {
  493.             // figure out which (prev or next) annot field to swap with
  494.             if (moveUp && aPrev != ae)
  495.                 aSwap = aPrev;
  496.             else if (!moveUp && (++(aSwap = a)) != ae)
  497.                 ;
  498.             else
  499.                 return;
  500.             // do the swap and update GUI
  501.             tmp = *aSwap;
  502.             *aSwap = *a;
  503.             *a = tmp;
  504.             structureSet->SetDataChanged(StructureSet::eUserAnnotationData);
  505.             SetupGUIControls(annots->GetSelection() + (moveUp ? -1 : 1), evids->GetSelection());
  506.             return;
  507.         }
  508.         aPrev = a;
  509.     }
  510.     ERRORMSG("CDDAnnotateDialog::MoveAnnotation() - error finding selected annotation");
  511. }
  512. void CDDAnnotateDialog::NewEvidence(void)
  513. {
  514.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(annots, ID_L_ANNOT, wxListBox)
  515.     // get selected annotation
  516.     if (annots->GetCount() == 0 || annots->GetSelection() < 0) return;
  517.     CAlign_annot *selectedAnnot =
  518.         reinterpret_cast<CAlign_annot*>(annots->GetClientData(annots->GetSelection()));
  519.     if (!selectedAnnot) {
  520.         ERRORMSG("CDDAnnotateDialog::NewEvidence() - error getting annotation pointer");
  521.         return;
  522.     }
  523.     // create default comment evidence
  524.     CRef < CFeature_evidence > newEvidence(new CFeature_evidence());
  525.     newEvidence->SetComment("");
  526.     // bring up evidence editor
  527.     CDDEvidenceDialog dialog(this, *newEvidence);
  528.     int result = dialog.ShowModal();
  529.     // add new evidence
  530.     if (result == wxOK) {
  531.         if (dialog.GetData(newEvidence.GetPointer())) {
  532.             selectedAnnot->SetEvidence().push_back(newEvidence);
  533.             SetupGUIControls(annots->GetSelection(), selectedAnnot->GetEvidence().size() - 1);
  534.             structureSet->SetDataChanged(StructureSet::eUserAnnotationData);
  535.         } else
  536.             ERRORMSG("CDDAnnotateDialog::NewEvidence() - error getting dialog data");
  537.     }
  538. }
  539. void CDDAnnotateDialog::DeleteEvidence(void)
  540. {
  541.     // get selected annotation
  542.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(annots, ID_L_ANNOT, wxListBox)
  543.     if (annots->GetCount() == 0 || annots->GetSelection() < 0) return;
  544.     CAlign_annot *selectedAnnot =
  545.         reinterpret_cast<CAlign_annot*>(annots->GetClientData(annots->GetSelection()));
  546.     if (!selectedAnnot) {
  547.         ERRORMSG("CDDAnnotateDialog::DeleteEvidence() - error getting annotation pointer");
  548.         return;
  549.     }
  550.     // get selected evidence
  551.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(evids, ID_L_EVID, wxListBox)
  552.     if (evids->GetCount() == 0 || evids->GetSelection() < 0) return;
  553.     CFeature_evidence *selectedEvidence =
  554.         reinterpret_cast<CFeature_evidence*>(evids->GetClientData(evids->GetSelection()));
  555.     if (!selectedEvidence) {
  556.         ERRORMSG("CDDAnnotateDialog::DeleteEvidence() - error getting evidence pointer");
  557.         return;
  558.     }
  559.     // confirm with user
  560.     int confirm = wxMessageBox("This will remove the selected evidence fromn"
  561.         "the selected annotation. Is this correct?", "Confirm", wxOK | wxCANCEL | wxCENTRE, this);
  562.     if (confirm != wxOK) return;
  563.     // delete evidence from annotation's list
  564.     CAlign_annot::TEvidence::iterator e, ee = selectedAnnot->SetEvidence().end();
  565.     for (e=selectedAnnot->SetEvidence().begin(); e!=ee; ++e) {
  566.         if (*e == selectedEvidence) {
  567.             selectedAnnot->SetEvidence().erase(e);
  568.             structureSet->SetDataChanged(StructureSet::eUserAnnotationData);
  569.             break;
  570.         }
  571.     }
  572.     if (e == ee) {
  573.         ERRORMSG("CDDAnnotateDialog::DeleteEvidence() - evidence pointer not found in annotation");
  574.         return;
  575.     }
  576.     // update GUI
  577.     SetupGUIControls(annots->GetSelection(), 0);
  578. }
  579. void CDDAnnotateDialog::EditEvidence(void)
  580. {
  581.     // get selected evidence
  582.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(evids, ID_L_EVID, wxListBox)
  583.     if (evids->GetCount() == 0 || evids->GetSelection() < 0) return;
  584.     CFeature_evidence *selectedEvidence =
  585.         reinterpret_cast<CFeature_evidence*>(evids->GetClientData(evids->GetSelection()));
  586.     if (!selectedEvidence) {
  587.         ERRORMSG("CDDAnnotateDialog::DeleteEvidence() - error getting evidence pointer");
  588.         return;
  589.     }
  590.     // bring up evidence editor
  591.     CDDEvidenceDialog dialog(this, *selectedEvidence);
  592.     int result = dialog.ShowModal();
  593.     // update evidence
  594.     if (result == wxOK && dialog.HasDataChanged()) {
  595.         if (dialog.GetData(selectedEvidence)) {
  596.             DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(annots, ID_L_ANNOT, wxListBox)
  597.             structureSet->SetDataChanged(StructureSet::eUserAnnotationData);
  598.             SetupGUIControls(annots->GetSelection(), evids->GetSelection());
  599.         } else
  600.             ERRORMSG("CDDAnnotateDialog::EditEvidence() - error getting dialog data");
  601.     }
  602. }
  603. typedef struct {
  604.     int alignedMoleculeID;
  605.     int from, to;
  606.     int hits;
  607. } ChainInfo;
  608. static const StructureObject * HighlightResidues(const StructureSet *set, const CBiostruc_annot_set& annot)
  609. {
  610.     try {
  611.         if (!annot.IsSetId() || annot.GetId().size() == 0 || !annot.GetId().front()->IsMmdb_id())
  612.             throw "no MMDB ID found in annotation";
  613.         int mmdbID = annot.GetId().front()->GetMmdb_id().Get();
  614.         // map object to aligned molecule ID and interval of alignment on that chain
  615.         typedef map < const StructureObject * , ChainInfo > ObjectMap;
  616.         ObjectMap annotObjects;
  617.         // first find all objects with the annotation's mmdbID; fill out chain id and interval
  618.         const BlockMultipleAlignment *alignment = set->alignmentManager->GetCurrentMultipleAlignment();
  619.         if (!alignment) throw "no alignment";
  620.         BlockMultipleAlignment::UngappedAlignedBlockList alignedBlocks;
  621.         alignment->GetUngappedAlignedBlocks(&alignedBlocks);
  622.         if (alignedBlocks.size() == 0) throw "no aligned blocks";
  623.         for (int row=0; row<alignment->NRows(); ++row) {
  624.             const StructureObject *object;
  625.             const Sequence *seq = alignment->GetSequenceOfRow(row);
  626.             if (!seq->molecule || seq->molecule->identifier->mmdbID != mmdbID ||
  627.                 !seq->molecule->GetParentOfType(&object))
  628.                 continue;
  629.             ChainInfo& ci = annotObjects[object];
  630.             ci.alignedMoleculeID = seq->molecule->id;
  631.             ci.from = alignedBlocks.front()->GetRangeOfRow(row)->from;
  632.             ci.to = alignedBlocks.back()->GetRangeOfRow(row)->to;
  633.             ci.hits = 0;
  634.         }
  635.         if (annotObjects.size() == 0)
  636.             throw "no chain of annotation's MMDB ID in the alignment";
  637.         GlobalMessenger()->RemoveAllHighlights(true);
  638.         CCn3d_style_settings globalStyleSettings;
  639.         set->styleManager->GetGlobalStyle().SaveSettingsToASN(&globalStyleSettings);
  640.         // iterate over molecule/residue intervals
  641.         if (annot.GetFeatures().size() > 0 &&
  642.             annot.GetFeatures().front()->GetFeatures().size() > 0 &&
  643.             annot.GetFeatures().front()->GetFeatures().front()->IsSetLocation() &&
  644.             annot.GetFeatures().front()->GetFeatures().front()->GetLocation().IsSubgraph() &&
  645.             annot.GetFeatures().front()->GetFeatures().front()->GetLocation().
  646.                 GetSubgraph().IsResidues() &&
  647.             annot.GetFeatures().front()->GetFeatures().front()->GetLocation().
  648.                 GetSubgraph().GetResidues().IsInterval() &&
  649.             annot.GetFeatures().front()->GetFeatures().front()->GetLocation().
  650.                 GetSubgraph().GetResidues().GetInterval().size() > 0)
  651.         {
  652.             ObjectMap::iterator o, oe = annotObjects.end();
  653.             CResidue_pntrs::TInterval::const_iterator i, ie =
  654.                 annot.GetFeatures().front()->GetFeatures().front()->GetLocation().
  655.                     GetSubgraph().GetResidues().GetInterval().end();
  656.             for (i=annot.GetFeatures().front()->GetFeatures().front()->GetLocation().
  657.                     GetSubgraph().GetResidues().GetInterval().begin(); i!=ie; ++i)
  658.             {
  659.                 // for each object
  660.                 for (o=annotObjects.begin(); o!=oe; ++o) {
  661.                     // find molecule with annotation's moleculeID
  662.                     ChemicalGraph::MoleculeMap::const_iterator
  663.                         m = o->first->graph->molecules.find((*i)->GetMolecule_id().Get());
  664.                     if (m == o->first->graph->molecules.end())
  665.                         throw "molecule with annotation's specified molecule ID not found in object";
  666.                         // make sure this stuff is visible in global style
  667.                         if (m->second->IsProtein()) {
  668.                             if (globalStyleSettings.GetProtein_backbone().GetType() == eCn3d_backbone_type_off &&
  669.                                 !globalStyleSettings.GetProtein_sidechains().GetIs_on())
  670.                             {
  671.                                 globalStyleSettings.SetProtein_backbone().SetType(eCn3d_backbone_type_trace);
  672.                             }
  673.                         } else if (m->second->IsNucleotide()) {
  674.                             if (globalStyleSettings.GetNucleotide_backbone().GetType() == eCn3d_backbone_type_off &&
  675.                                 !globalStyleSettings.GetNucleotide_sidechains().GetIs_on())
  676.                             {
  677.                                 globalStyleSettings.SetNucleotide_backbone().SetType(eCn3d_backbone_type_trace);
  678.                             }
  679.                         } else if (m->second->IsSolvent()) {
  680.                             globalStyleSettings.SetSolvents().SetIs_on(true);
  681.                         } else if (m->second->IsHeterogen()) {
  682.                             globalStyleSettings.SetHeterogens().SetIs_on(true);
  683.                         }
  684.                         for (int r=(*i)->GetFrom().Get(); r<=(*i)->GetTo().Get(); ++r) {
  685.                         // highlight residues in interval
  686.                         if (o == annotObjects.begin()) {
  687.                             if (r >= 1 && r <= m->second->NResidues())
  688.                                 GlobalMessenger()->ToggleHighlight(m->second, r);
  689.                             else
  690.                                 throw "annotation's residue ID out of molecule's residue range";
  691.                         }
  692.                         // count hits of annotated residues in aligned chain+interval
  693.                         if (o->second.alignedMoleculeID == m->second->id &&
  694.                                 r >= o->second.from && r <= o->second.to)
  695.                             (o->second.hits)++;
  696.                     }
  697.                 }
  698.             }
  699.             set->styleManager->SetGlobalStyle(globalStyleSettings);
  700.             // return object with most hits of annotation to aligned chain region
  701.             const StructureObject *bestObject = NULL;
  702.             for (o=annotObjects.begin(); o!=oe; ++o)
  703.                 if (!bestObject || o->second.hits > annotObjects[bestObject].hits)
  704.                     bestObject = o->first;
  705.             return bestObject;
  706.         } else
  707.             throw "unrecognized annotation structure";
  708.     } catch (const char *err) {
  709.         ERRORMSG("HighlightResidues() - " << err);
  710.     }
  711.     return NULL;
  712. }
  713. void CDDAnnotateDialog::ShowEvidence(void)
  714. {
  715.     // get selected evidence
  716.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(evids, ID_L_EVID, wxListBox)
  717.     if (evids->GetCount() == 0 || evids->GetSelection() < 0) return;
  718.     CFeature_evidence *selectedEvidence =
  719.         reinterpret_cast<CFeature_evidence*>(evids->GetClientData(evids->GetSelection()));
  720.     if (!selectedEvidence) {
  721.         ERRORMSG("CDDAnnotateDialog::ShowEvidence() - error getting evidence pointer");
  722.         return;
  723.     }
  724.     // launch URL given PMID
  725.     if (selectedEvidence->IsReference() && selectedEvidence->GetReference().IsPmid()) {
  726.         wxString url;
  727.         url.Printf("http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?"
  728.             "cmd=Retrieve&db=PubMed&dopt=Abstract&list_uids=%i",
  729.             selectedEvidence->GetReference().GetPmid().Get());
  730.         LaunchWebPage(url);
  731.     }
  732.     // highlight residues if structure evidence
  733.     else if (IS_STRUCTURE_EVIDENCE_BSANNOT(*selectedEvidence)) {
  734.         const StructureObject *bestObject = HighlightResidues(structureSet, selectedEvidence->GetBsannot());
  735.         if (bestObject) {
  736.             // first, set show/hide to make only objects of this mmdb id visible
  737.             structureSet->showHideManager->MakeAllVisible();
  738.             StructureSet::ObjectList::const_iterator o, oe = structureSet->objects.end();
  739.             for (o=structureSet->objects.begin(); o!=oe; ++o)
  740.                 if ((*o)->mmdbID != bestObject->mmdbID)
  741.                     structureSet->showHideManager->Show(*o, false);
  742.             // now force redrawing of structures, so the frames that contains
  743.             // these objects aren't empty (otherwise, renderer won't show selected frame)
  744.             GlobalMessenger()->ProcessRedraws();
  745.             // now show the frame containing the "best" object (get display list from first molecule)
  746.             unsigned int displayList = bestObject->graph->molecules.find(1)->second->displayLists.front();
  747.             for (int frame=0; frame<structureSet->frameMap.size(); ++frame) {
  748.                 StructureSet::DisplayLists::const_iterator d, de = structureSet->frameMap[frame].end();
  749.                 for (d=structureSet->frameMap[frame].begin(); d!=de; ++d) {
  750.                     if (*d == displayList) { // is display list in this frame?
  751.                         structureSet->renderer->ShowFrameNumber(frame);
  752.                         frame = structureSet->frameMap.size(); // to exit out of next-up loop
  753.                         break;
  754.                     }
  755.                 }
  756.             }
  757.             wxMessageBox(
  758.                 selectedEvidence->GetBsannot().GetFeatures().front()->GetDescr().front()->GetName().c_str(),
  759.                 "Structure Evidence", wxOK | wxCENTRE, this);
  760.         }
  761.     }
  762.     else if (selectedEvidence->IsComment()) {
  763.         wxMessageBox(selectedEvidence->GetComment().c_str(), "Comment", wxOK | wxCENTRE, this);
  764.     }
  765.     else {
  766.         ERRORMSG("CDDAnnotateDialog::ShowEvidence() - can't show that evidence type");
  767.     }
  768. }
  769. void CDDAnnotateDialog::MoveEvidence(bool moveUp)
  770. {
  771.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(annots, ID_L_ANNOT, wxListBox)
  772.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(evids, ID_L_EVID, wxListBox)
  773.     // get selected annotation
  774.     if (annots->GetCount() == 0 || annots->GetSelection() < 0) return;
  775.     CAlign_annot *selectedAnnot =
  776.         reinterpret_cast<CAlign_annot*>(annots->GetClientData(annots->GetSelection()));
  777.     if (!selectedAnnot) {
  778.         ERRORMSG("CDDAnnotateDialog::MoveEvidence() - error getting annotation pointer");
  779.         return;
  780.     }
  781.     // get selected evidence
  782.     if (evids->GetCount() == 0 || evids->GetSelection() < 0) return;
  783.     CFeature_evidence *selectedEvidence =
  784.         reinterpret_cast<CFeature_evidence*>(evids->GetClientData(evids->GetSelection()));
  785.     if (!selectedEvidence) {
  786.         ERRORMSG("CDDAnnotateDialog::MoveEvidence() - error getting evidence pointer");
  787.         return;
  788.     }
  789.     CAlign_annot::TEvidence::iterator e, ee = selectedAnnot->SetEvidence().end(), ePrev = ee, eSwap = ee;
  790.     CRef < CFeature_evidence > tmp;
  791.     for (e=selectedAnnot->SetEvidence().begin(); e!=ee; ++e) {
  792.         if (*e == selectedEvidence) {
  793.             // figure out which (prev or next) evidence field to swap with
  794.             if (moveUp && ePrev != ee)
  795.                 eSwap = ePrev;
  796.             else if (!moveUp && (++(eSwap = e)) != ee)
  797.                 ;
  798.             else
  799.                 return;
  800.             // do the swap and update GUI
  801.             tmp = *eSwap;
  802.             *eSwap = *e;
  803.             *e = tmp;
  804.             structureSet->SetDataChanged(StructureSet::eUserAnnotationData);
  805.             SetupGUIControls(annots->GetSelection(), evids->GetSelection() + (moveUp ? -1 : 1));
  806.             return;
  807.         }
  808.         ePrev = e;
  809.     }
  810. }
  811. ///// CDDEvidenceDialog stuff /////
  812. BEGIN_EVENT_TABLE(CDDEvidenceDialog, wxDialog)
  813.     EVT_CLOSE       (       CDDEvidenceDialog::OnCloseWindow)
  814.     EVT_BUTTON      (-1,    CDDEvidenceDialog::OnButton)
  815.     EVT_RADIOBUTTON (-1,    CDDEvidenceDialog::OnChange)
  816.     EVT_TEXT        (-1,    CDDEvidenceDialog::OnChange)
  817. END_EVENT_TABLE()
  818. CDDEvidenceDialog::CDDEvidenceDialog(wxWindow *parent, const ncbi::objects::CFeature_evidence& initial) :
  819.     wxDialog(parent, -1, "CDD Annotations", wxPoint(400, 100), wxDefaultSize,
  820.         wxCAPTION | wxSYSTEM_MENU), // not resizable
  821.     changed(false), rerange(false)
  822. {
  823.     // construct the panel
  824.     wxPanel *panel = new wxPanel(this, -1);
  825.     wxSizer *topSizer = SetupEvidenceDialog(panel, false);
  826.     // call sizer stuff
  827.     topSizer->Fit(this);
  828.     topSizer->Fit(panel);
  829.     topSizer->SetSizeHints(this);
  830.     // set initial states
  831.     if (initial.IsComment()) {
  832.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(rComment, ID_R_COMMENT, wxRadioButton)
  833.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tComment, ID_T_COMMENT, wxTextCtrl)
  834.         rComment->SetValue(true);
  835.         tComment->SetValue(initial.GetComment().c_str());
  836.         tComment->SetFocus();
  837.     } else if (initial.IsReference() && initial.GetReference().IsPmid()) {
  838.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(rPMID, ID_R_PMID, wxRadioButton)
  839.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tPMID, ID_T_PMID, wxTextCtrl)
  840.         rPMID->SetValue(true);
  841.         wxString pmid;
  842.         pmid.Printf("%i", initial.GetReference().GetPmid().Get());
  843.         tPMID->SetValue(pmid);
  844.         tPMID->SetFocus();
  845.     } else if (IS_STRUCTURE_EVIDENCE_BSANNOT(initial)) {
  846.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(rSTRUCTURE, ID_R_STRUCTURE, wxRadioButton)
  847.         DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tSTRUCTURE, ID_T_STRUCTURE, wxTextCtrl)
  848.         rSTRUCTURE->SetValue(true);
  849.         tSTRUCTURE->SetValue(
  850.             initial.GetBsannot().GetFeatures().front()->GetDescr().front()->GetName().c_str());
  851.     } else {
  852.         ERRORMSG("CDDEvidenceDialog::CDDEvidenceDialog() - "
  853.             "don't (yet) know how to edit this evidence type");
  854.     }
  855.     SetupGUIControls();
  856. }
  857. // same as hitting cancel button
  858. void CDDEvidenceDialog::OnCloseWindow(wxCloseEvent& event)
  859. {
  860.     EndModal(wxCANCEL);
  861. }
  862. void CDDEvidenceDialog::OnButton(wxCommandEvent& event)
  863. {
  864.     switch (event.GetId()) {
  865.         case ID_B_EDIT_OK: {
  866.             EndModal(wxOK);
  867.             break;
  868.         }
  869.         case ID_B_EDIT_CANCEL:
  870.             EndModal(wxCANCEL);
  871.             break;
  872.         case ID_B_RERANGE:
  873.             rerange = changed = true;
  874.             break;
  875.         default:
  876.             event.Skip();
  877.     }
  878. }
  879. void CDDEvidenceDialog::OnChange(wxCommandEvent& event)
  880. {
  881.     changed = true;
  882.     SetupGUIControls();
  883. }
  884. void CDDEvidenceDialog::SetupGUIControls(void)
  885. {
  886.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(rComment, ID_R_COMMENT, wxRadioButton)
  887.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(stComment, ID_ST_COMMENT, wxStaticText)
  888.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tComment, ID_T_COMMENT, wxTextCtrl)
  889.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(rPMID, ID_R_PMID, wxRadioButton)
  890.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(stPMID, ID_ST_PMID, wxStaticText)
  891.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tPMID, ID_T_PMID, wxTextCtrl)
  892.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(rStructure, ID_R_STRUCTURE, wxRadioButton)
  893.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(stStructure, ID_ST_STRUCTURE, wxStaticText)
  894.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tStructure, ID_T_STRUCTURE, wxTextCtrl)
  895.     DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(bStructure, ID_B_RERANGE, wxButton)
  896. //    stComment->Enable(rComment->GetValue());
  897.     tComment->Enable(rComment->GetValue());
  898. //    stPMID->Enable(rPMID->GetValue());
  899.     tPMID->Enable(rPMID->GetValue());
  900. //    stStructure->Enable(rStructure->GetValue());
  901.     tStructure->Enable(rStructure->GetValue());
  902.     bStructure->Enable(rStructure->GetValue());
  903. }
  904. bool CDDEvidenceDialog::GetData(ncbi::objects::CFeature_evidence *evidence)
  905. {
  906.     DECLARE_AND_FIND_WINDOW_RETURN_FALSE_ON_ERR(rComment, ID_R_COMMENT, wxRadioButton)
  907.     DECLARE_AND_FIND_WINDOW_RETURN_FALSE_ON_ERR(rPMID, ID_R_PMID, wxRadioButton)
  908.     DECLARE_AND_FIND_WINDOW_RETURN_FALSE_ON_ERR(rSTRUCTURE, ID_R_STRUCTURE, wxRadioButton)
  909.     if (rComment->GetValue()) {
  910.         DECLARE_AND_FIND_WINDOW_RETURN_FALSE_ON_ERR(tComment, ID_T_COMMENT, wxTextCtrl)
  911.         if (tComment->GetValue().size() > 0) {
  912.             evidence->SetComment(tComment->GetValue().c_str());
  913.             return true;
  914.         } else {
  915.             ERRORMSG("CDDEvidenceDialog::GetData() - comment must not be zero-length");
  916.             return false;
  917.         }
  918.     }
  919.     else if (rPMID->GetValue()) {
  920.         DECLARE_AND_FIND_WINDOW_RETURN_FALSE_ON_ERR(tPMID, ID_T_PMID, wxTextCtrl)
  921.         unsigned long pmid;
  922.         if (tPMID->GetValue().ToULong(&pmid)) {
  923.             evidence->SetReference().SetPmid().Set(pmid);
  924.             return true;
  925.         } else {
  926.             ERRORMSG("CDDEvidenceDialog::GetData() - PMID must be a positive integer");
  927.             return false;
  928.         }
  929.     }
  930.     else if (rSTRUCTURE->GetValue()) {
  931.         DECLARE_AND_FIND_WINDOW_RETURN_FALSE_ON_ERR(tSTRUCTURE, ID_T_STRUCTURE, wxTextCtrl)
  932.         // either leave existing range alone, or use new one if none present or rerange button pressed
  933.         if (!evidence->IsBsannot() || rerange) {
  934.             CBiostruc_annot_set *ref =
  935.                 GlobalMessenger()->CreateBiostrucAnnotSetForHighlightsOnSingleObject();
  936.             if (ref)
  937.                 evidence->SetBsannot(*ref);
  938.             else
  939.                 return false;
  940.         }
  941.         // reset structure evidence tag
  942.         CRef < CBiostruc_descr > descr(new CBiostruc_descr());
  943.         descr->SetOther_comment(STRUCTURE_EVIDENCE_COMMENT);
  944.         evidence->SetBsannot().SetDescr().clear();
  945.         evidence->SetBsannot().SetDescr().push_front(descr);
  946.         // reset name
  947.         CRef < CBiostruc_feature_set_descr > name(new CBiostruc_feature_set_descr());
  948.         name->SetName(tSTRUCTURE->GetValue().c_str());
  949.         evidence->SetBsannot().SetFeatures().front()->SetDescr().clear();
  950.         evidence->SetBsannot().SetFeatures().front()->SetDescr().push_front(name);
  951.         return true;
  952.     }
  953.     ERRORMSG("CDDEvidenceDialog::GetData() - unknown evidence type");
  954.     return false;
  955. }
  956. END_SCOPE(Cn3D)
  957. ////////////////////////////////////////////////////////////////////////////////////////////////
  958. // The following is taken unmodified from wxDesigner's C++ code from cdd_annot_dialog.wdr
  959. ////////////////////////////////////////////////////////////////////////////////////////////////
  960. wxSizer *SetupCDDAnnotDialog( wxPanel *parent, bool call_fit, bool set_sizer )
  961. {
  962.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  963.     wxFlexGridSizer *item1 = new wxFlexGridSizer( 1, 0, 0, 0 );
  964.     wxStaticBox *item3 = new wxStaticBox( parent, -1, "Annotations" );
  965.     wxStaticBoxSizer *item2 = new wxStaticBoxSizer( item3, wxVERTICAL );
  966.     wxString *strs4 = (wxString*) NULL;
  967.     wxListBox *item4 = new wxListBox( parent, ID_L_ANNOT, wxDefaultPosition, wxSize(200,100), 0, strs4, wxLB_SINGLE );
  968.     item2->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  969.     wxGridSizer *item5 = new wxGridSizer( 2, 0, 0, 0 );
  970.     wxButton *item6 = new wxButton( parent, ID_B_NEW_ANNOT, "New", wxDefaultPosition, wxDefaultSize, 0 );
  971.     item5->Add( item6, 0, wxALIGN_CENTRE|wxALL, 5 );
  972.     wxButton *item7 = new wxButton( parent, ID_B_HIGHLIGHT, "Highlight", wxDefaultPosition, wxDefaultSize, 0 );
  973.     item5->Add( item7, 0, wxALIGN_CENTRE|wxALL, 5 );
  974.     wxButton *item8 = new wxButton( parent, ID_B_ANNOT_UP, "Move Up", wxDefaultPosition, wxDefaultSize, 0 );
  975.     item5->Add( item8, 0, wxALIGN_CENTRE|wxALL, 5 );
  976.     wxButton *item9 = new wxButton( parent, ID_B_EDIT_ANNOT, "Edit", wxDefaultPosition, wxDefaultSize, 0 );
  977.     item5->Add( item9, 0, wxALIGN_CENTRE|wxALL, 5 );
  978.     wxButton *item10 = new wxButton( parent, ID_B_DEL_ANNOT, "Delete", wxDefaultPosition, wxDefaultSize, 0 );
  979.     item5->Add( item10, 0, wxALIGN_CENTRE|wxALL, 5 );
  980.     wxButton *item11 = new wxButton( parent, ID_B_ANNOT_DOWN, "Move Down", wxDefaultPosition, wxDefaultSize, 0 );
  981.     item5->Add( item11, 0, wxALIGN_CENTRE|wxALL, 5 );
  982.     item2->Add( item5, 0, wxALIGN_CENTRE|wxALL, 5 );
  983.     item1->Add( item2, 0, wxALIGN_CENTRE|wxALL, 5 );
  984.     wxStaticBox *item13 = new wxStaticBox( parent, -1, "Evidence" );
  985.     wxStaticBoxSizer *item12 = new wxStaticBoxSizer( item13, wxVERTICAL );
  986.     wxString *strs14 = (wxString*) NULL;
  987.     wxListBox *item14 = new wxListBox( parent, ID_L_EVID, wxDefaultPosition, wxSize(300,100), 0, strs14, wxLB_SINGLE );
  988.     item12->Add( item14, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  989.     wxGridSizer *item15 = new wxGridSizer( 2, 0, 0, 0 );
  990.     wxButton *item16 = new wxButton( parent, ID_B_NEW_EVID, "New", wxDefaultPosition, wxDefaultSize, 0 );
  991.     item15->Add( item16, 0, wxALIGN_CENTRE|wxALL, 5 );
  992.     wxButton *item17 = new wxButton( parent, ID_B_SHOW, "Show", wxDefaultPosition, wxDefaultSize, 0 );
  993.     item15->Add( item17, 0, wxALIGN_CENTRE|wxALL, 5 );
  994.     wxButton *item18 = new wxButton( parent, ID_B_EVID_UP, "Move Up", wxDefaultPosition, wxDefaultSize, 0 );
  995.     item15->Add( item18, 0, wxALIGN_CENTRE|wxALL, 5 );
  996.     wxButton *item19 = new wxButton( parent, ID_B_EDIT_EVID, "Edit", wxDefaultPosition, wxDefaultSize, 0 );
  997.     item15->Add( item19, 0, wxALIGN_CENTRE|wxALL, 5 );
  998.     wxButton *item20 = new wxButton( parent, ID_B_DEL_EVID, "Delete", wxDefaultPosition, wxDefaultSize, 0 );
  999.     item15->Add( item20, 0, wxALIGN_CENTRE|wxALL, 5 );
  1000.     wxButton *item21 = new wxButton( parent, ID_B_EVID_DOWN, "Move Down", wxDefaultPosition, wxDefaultSize, 0 );
  1001.     item15->Add( item21, 0, wxALIGN_CENTRE|wxALL, 5 );
  1002.     item12->Add( item15, 0, wxALIGN_CENTRE|wxALL, 5 );
  1003.     item1->Add( item12, 0, wxALIGN_CENTRE|wxALL, 5 );
  1004.     item0->Add( item1, 0, wxALIGN_CENTRE, 5 );
  1005.     if (set_sizer)
  1006.     {
  1007.         parent->SetAutoLayout( TRUE );
  1008.         parent->SetSizer( item0 );
  1009.         if (call_fit)
  1010.         {
  1011.             item0->Fit( parent );
  1012.             item0->SetSizeHints( parent );
  1013.         }
  1014.     }
  1015.     return item0;
  1016. }
  1017. wxSizer *SetupEvidenceDialog( wxPanel *parent, bool call_fit, bool set_sizer )
  1018. {
  1019.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  1020.     wxStaticBox *item2 = new wxStaticBox( parent, -1, "Evidence Options" );
  1021.     wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL );
  1022.     wxFlexGridSizer *item3 = new wxFlexGridSizer( 1, 0, 0, 0 );
  1023.     item3->AddGrowableCol( 2 );
  1024.     wxRadioButton *item4 = new wxRadioButton( parent, ID_R_COMMENT, "", wxDefaultPosition, wxDefaultSize, 0 );
  1025.     item3->Add( item4, 0, wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
  1026.     wxStaticText *item5 = new wxStaticText( parent, ID_ST_COMMENT, "Comment:", wxDefaultPosition, wxDefaultSize, 0 );
  1027.     item3->Add( item5, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 );
  1028.     wxTextCtrl *item6 = new wxTextCtrl( parent, ID_T_COMMENT, "", wxDefaultPosition, wxSize(150,-1), 0 );
  1029.     item3->Add( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  1030.     item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 );
  1031.     wxStaticLine *item7 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(20,-1), wxLI_HORIZONTAL );
  1032.     item1->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  1033.     wxFlexGridSizer *item8 = new wxFlexGridSizer( 1, 0, 0, 0 );
  1034.     item8->AddGrowableCol( 2 );
  1035.     wxRadioButton *item9 = new wxRadioButton( parent, ID_R_PMID, "", wxDefaultPosition, wxDefaultSize, 0 );
  1036.     item8->Add( item9, 0, wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
  1037.     wxStaticText *item10 = new wxStaticText( parent, ID_ST_PMID, "Reference (PubMed ID):", wxDefaultPosition, wxDefaultSize, 0 );
  1038.     item8->Add( item10, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 );
  1039.     wxTextCtrl *item11 = new wxTextCtrl( parent, ID_T_PMID, "", wxDefaultPosition, wxDefaultSize, 0 );
  1040.     item8->Add( item11, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  1041.     item1->Add( item8, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 );
  1042.     wxStaticLine *item12 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(20,-1), wxLI_HORIZONTAL );
  1043.     item1->Add( item12, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  1044.     wxFlexGridSizer *item13 = new wxFlexGridSizer( 1, 0, 0, 0 );
  1045.     item13->AddGrowableCol( 2 );
  1046.     wxRadioButton *item14 = new wxRadioButton( parent, ID_R_STRUCTURE, "", wxDefaultPosition, wxDefaultSize, 0 );
  1047.     item13->Add( item14, 0, wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
  1048.     wxStaticText *item15 = new wxStaticText( parent, ID_ST_STRUCTURE, "Structure:", wxDefaultPosition, wxDefaultSize, 0 );
  1049.     item13->Add( item15, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 );
  1050.     wxTextCtrl *item16 = new wxTextCtrl( parent, ID_T_STRUCTURE, "", wxDefaultPosition, wxSize(80,-1), 0 );
  1051.     item13->Add( item16, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  1052.     item1->Add( item13, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 );
  1053.     wxButton *item17 = new wxButton( parent, ID_B_RERANGE, "Reset Residues to Current Highlights", wxDefaultPosition, wxDefaultSize, 0 );
  1054.     item1->Add( item17, 0, wxALIGN_CENTRE|wxALL, 5 );
  1055.     item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  1056.     wxFlexGridSizer *item18 = new wxFlexGridSizer( 1, 0, 0, 0 );
  1057.     wxButton *item19 = new wxButton( parent, ID_B_EDIT_OK, "OK", wxDefaultPosition, wxDefaultSize, 0 );
  1058.     item19->SetDefault();
  1059.     item18->Add( item19, 0, wxALIGN_CENTRE|wxALL, 5 );
  1060.     item18->Add( 20, 20, 0, wxALIGN_CENTRE|wxALL, 5 );
  1061.     wxButton *item20 = new wxButton( parent, ID_B_EDIT_CANCEL, "Cancel", wxDefaultPosition, wxDefaultSize, 0 );
  1062.     item18->Add( item20, 0, wxALIGN_CENTRE|wxALL, 5 );
  1063.     item0->Add( item18, 0, wxALIGN_CENTRE|wxALL, 5 );
  1064.     if (set_sizer)
  1065.     {
  1066.         parent->SetAutoLayout( TRUE );
  1067.         parent->SetSizer( item0 );
  1068.         if (call_fit)
  1069.         {
  1070.             item0->Fit( parent );
  1071.             item0->SetSizeHints( parent );
  1072.         }
  1073.     }
  1074.     return item0;
  1075. }
  1076. /*
  1077. * ---------------------------------------------------------------------------
  1078. * $Log: cdd_annot_dialog.cpp,v $
  1079. * Revision 1000.2  2004/06/01 18:27:54  gouriano
  1080. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.39
  1081. *
  1082. * Revision 1.39  2004/05/21 21:41:38  gorelenk
  1083. * Added PCH ncbi_pch.hpp
  1084. *
  1085. * Revision 1.38  2004/04/02 22:45:03  thiessen
  1086. * make stuff visible in global style on show evidence
  1087. *
  1088. * Revision 1.37  2004/03/15 18:16:33  thiessen
  1089. * prefer prefix vs. postfix ++/-- operators
  1090. *
  1091. * Revision 1.36  2004/02/19 17:04:45  thiessen
  1092. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  1093. *
  1094. * Revision 1.35  2003/07/14 18:37:07  thiessen
  1095. * change GetUngappedAlignedBlocks() param types; other syntax changes
  1096. *
  1097. * Revision 1.34  2003/02/03 19:20:01  thiessen
  1098. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  1099. *
  1100. * Revision 1.33  2002/12/18 15:02:34  thiessen
  1101. * fixes for linux/gcc
  1102. *
  1103. * Revision 1.32  2002/12/12 23:07:18  thiessen
  1104. * improved handling of alignment annotation errors
  1105. *
  1106. * Revision 1.31  2002/11/25 15:02:20  thiessen
  1107. * changes for cdd annotation evidence show
  1108. *
  1109. * Revision 1.30  2002/11/21 18:07:25  thiessen
  1110. * show whole objects again on evidence show
  1111. *
  1112. * Revision 1.29  2002/11/12 20:35:36  thiessen
  1113. * use ShowDomainsWithHighlights for structure evidence show
  1114. *
  1115. * Revision 1.28  2002/11/06 00:18:10  thiessen
  1116. * fixes for new CRef/const rules in objects
  1117. *
  1118. * Revision 1.27  2002/09/06 18:28:46  thiessen
  1119. * fix show object bug
  1120. *
  1121. * Revision 1.26  2002/08/15 22:13:12  thiessen
  1122. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  1123. *
  1124. * Revision 1.25  2002/04/09 23:59:08  thiessen
  1125. * add cdd annotations read-only option
  1126. *
  1127. * Revision 1.24  2002/04/09 14:38:22  thiessen
  1128. * add cdd splash screen
  1129. *
  1130. * Revision 1.23  2002/03/28 14:06:02  thiessen
  1131. * preliminary BLAST/PSSM ; new CD startup style
  1132. *
  1133. * Revision 1.22  2002/02/12 21:15:59  thiessen
  1134. * add move up/down to CDD annotations
  1135. *
  1136. * Revision 1.21  2002/01/19 15:25:03  thiessen
  1137. * tweaks for DebugMT build to work
  1138. *
  1139. * Revision 1.20  2002/01/19 02:34:35  thiessen
  1140. * fixes for changes in asn serialization API
  1141. *
  1142. * Revision 1.19  2001/12/12 14:04:13  thiessen
  1143. * add missing object headers after object loader change
  1144. *
  1145. * Revision 1.18  2001/12/06 23:13:44  thiessen
  1146. * finish import/align new sequences into single-structure data; many small tweaks
  1147. *
  1148. * Revision 1.17  2001/11/30 14:02:05  thiessen
  1149. * progress on sequence imports to single structures
  1150. *
  1151. * Revision 1.16  2001/11/28 14:16:13  thiessen
  1152. * add 'show' to comment + structure name evidence
  1153. *
  1154. * Revision 1.15  2001/11/27 16:26:07  thiessen
  1155. * major update to data management system
  1156. *
  1157. * Revision 1.14  2001/10/30 02:54:11  thiessen
  1158. * add Biostruc cache
  1159. *
  1160. * Revision 1.13  2001/10/23 20:10:22  thiessen
  1161. * fix scaling of fonts in high-res PNG output
  1162. *
  1163. * Revision 1.12  2001/10/16 21:49:06  thiessen
  1164. * restructure MultiTextDialog; allow virtual bonds for alpha-only PDB's
  1165. *
  1166. * Revision 1.11  2001/10/14 09:27:46  thiessen
  1167. * add cdd evidence move up/down
  1168. *
  1169. * Revision 1.10  2001/10/01 16:04:23  thiessen
  1170. * make CDD annotation window non-modal; add SetWindowTitle to viewers
  1171. *
  1172. * Revision 1.9  2001/09/26 17:09:30  thiessen
  1173. * fix rerange bug
  1174. *
  1175. * Revision 1.8  2001/09/26 15:27:53  thiessen
  1176. * tweak sequence viewer widget for wx2.3.2, tweak cdd annotation
  1177. *
  1178. * Revision 1.7  2001/09/24 14:37:52  thiessen
  1179. * more wxPanel stuff - fix for new heirarchy in wx 2.3.2+
  1180. *
  1181. * Revision 1.6  2001/09/24 13:29:54  thiessen
  1182. * fix wxPanel issues
  1183. *
  1184. * Revision 1.5  2001/09/20 19:31:30  thiessen
  1185. * fixes for SGI and wxWin 2.3.2
  1186. *
  1187. * Revision 1.4  2001/08/27 00:06:23  thiessen
  1188. * add structure evidence to CDD annotation
  1189. *
  1190. * Revision 1.3  2001/08/06 20:22:00  thiessen
  1191. * add preferences dialog ; make sure OnCloseWindow get wxCloseEvent
  1192. *
  1193. * Revision 1.2  2001/07/19 19:14:38  thiessen
  1194. * working CDD alignment annotator ; misc tweaks
  1195. *
  1196. * Revision 1.1  2001/07/12 17:35:15  thiessen
  1197. * change domain mapping ; add preliminary cdd annotation GUI
  1198. *
  1199. */