NCBI C++ ToolKit
bioseq_editor.cpp
Go to the documentation of this file.

Go to the SVN repository for this file.

1 /* $Id: bioseq_editor.cpp 47522 2023-07-28 13:38:44Z asztalos $
2  * ===========================================================================
3  *
4  * PUBLIC DOMAIN NOTICE
5  * National Center for Biotechnology Information
6  *
7  * This software/database is a "United States Government Work" under the
8  * terms of the United States Copyright Act. It was written as part of
9  * the author's official duties as a United States Government employee and
10  * thus cannot be copyrighted. This software/database is freely available
11  * to the public for use. The National Library of Medicine and the U.S.
12  * Government have not placed any restriction on its use or reproduction.
13  *
14  * Although all reasonable efforts have been taken to ensure the accuracy
15  * and reliability of the software and data, the NLM and the U.S.
16  * Government do not and cannot warrant the performance or results that
17  * may be obtained by using this software or data. The NLM and the U.S.
18  * Government disclaim all warranties, express or implied, including
19  * warranties of performance, merchantability or fitness for any particular
20  * purpose.
21  *
22  * Please cite the author in any work or product based on this material.
23  *
24  * ===========================================================================
25  *
26  * Authors: Roman Katargin
27  */
28 
29 #include <ncbi_pch.hpp>
30 
31 #include <set>
56 
58 
59 #include <objmgr/bioseq_ci.hpp>
60 #include <objmgr/seqdesc_ci.hpp>
61 #include <objmgr/feat_ci.hpp>
62 #include <objmgr/seq_entry_ci.hpp>
63 #include <objmgr/align_ci.hpp>
64 #include <objmgr/seq_annot_ci.hpp>
65 
67 
73 #include <objects/seq/Pubdesc.hpp>
77 #include <objects/seq/MolInfo.hpp>
79 
88 #include <gui/objutils/utils.hpp>
89 
91 
92 #include <objmgr/util/sequence.hpp>
93 
95 
105 
110 
111 #include <wx/menu.h>
112 #include <wx/msgdlg.h>
113 
116 
118 {
119  static string sid("bioseq_editor_factory");
120  return sid;
121 }
122 
124 {
125  static string slabel("Bioseq Editor Factory");
126  return slabel;
127 }
128 
129 typedef struct featcmd {
131  string feature_name;
133 
134 static const FeatCmd feat_cmds[] =
135 {
136  { eCmdCreateCodingRegion, "Coding Region" },
137  { eCmdCreateCodingRegion_ext, "CDS" },
138  { eCmdCreateGene, "gene" },
139  { eCmdCreateProt, "prot" },
140  { eCmdCreateLTR, "LTR" },
141  { eCmdCreateRepeatRegion, "repeat_region" },
142  { eCmdCreateStemLoop, "stem_loop" },
143  { eCmdCreateSTS, "STS" },
144  { eCmdCreateRegion, "Region" },
145  { eCmdCreateSecondaryStructure, "Secondary Structure" },
146  { eCmdCreateProprotein, "proprotein" },
147  { eCmdCreateMatPeptide, "mat_peptide" },
148  { eCmdCreateSigPeptide, "sig_peptide" },
149  { eCmdCreateTransitPeptide, "trans_peptide" },
150  { eCmdCreateOperon, "operon" },
151  { eCmdCreateMobileElement, "mobile_element" },
152  { eCmdCreateCentromere, "centromere" },
153  { eCmdCreateTelomere, "telomere" },
154  { eCmdCreateRegulatory, "regulatory" },
155  { eCmdCreateRegulatory_promoter, "promoter"},
156  { eCmdCreateRegulatory_enhancer, "enhancer"},
157  { eCmdCreateRegulatory_ribosome_binding_site, "ribosome_binding_site"},
158  { eCmdCreateRegulatory_riboswitch, "riboswitch"},
159  { eCmdCreateRegulatory_terminator, "terminator"},
160  { eCmdCreatePreRNA, "preRNA" },
161  { eCmdCreateMRNA, "mRNA" },
162  { eCmdCreateExon, "exon" },
163  { eCmdCreateIntron, "intron" },
164  { eCmdCreate3UTR, "3'UTR" },
165  { eCmdCreate5UTR, "5'UTR" },
166  { eCmdCreatetRNA, "tRNA" },
167  { eCmdCreaterRNA, "rRNA" },
168  { eCmdCreateRNA, "RNA" },
169  { eCmdCreatemiscRNA, "miscRNA" },
170  { eCmdCreatepreRNA, "preRNA" },
171  { eCmdCreatencRNA, "ncRNA" },
172  { eCmdCreatetmRNA, "tmRNA" },
173  { eCmdCreatePolyASite, "polyA_site" },
174  { eCmdCreatePrimerBind, "primer_bind" } ,
175  { eCmdCreateProteinBind, "protein_bind" },
176  { eCmdCreateRepOrigin, "rep_origin" },
177  { eCmdCreateBond, "Bond" },
178  { eCmdCreateSite, "Site" },
179  { eCmdCreateOriT, "oriT" },
180  { eCmdCreateCRegion, "C_region" },
181  { eCmdCreateDLoop, "D-loop" },
182  { eCmdCreateDSegment, "D_segment" },
183  { eCmdCreateiDNA, "iDNA" },
184  { eCmdCreateJSegment, "J_segment" },
185  { eCmdCreateMiscBinding, "misc_binding" },
186  { eCmdCreateMiscDifference, "misc_difference" },
187  { eCmdCreateMiscFeature, "misc_feature" },
188  { eCmdCreateMiscRecomb, "misc_recomb" },
189  { eCmdCreateMiscStructure, "misc_structure" },
190  { eCmdCreateModifiedBase, "modified_base" },
191  { eCmdCreateNRegion, "N_region" } ,
192  { eCmdCreatePrimTranscript, "prim_transcript" },
193  { eCmdCreateSRegion, "S_REGION" },
194  { eCmdCreateUnsure, "unsure" },
195  { eCmdCreateVRegion, "V_region" },
196  { eCmdCreateVSegment, "V_segment" },
197  { eCmdCreateVariation, "variation" },
198  { eCmdCreateAssemblyGap, "assembly_gap" },
199  { eCmdCreateTPAAssembly, "TPA Assembly" },
200  { eCmdCreateStructuredComment, "StructuredComment" },
201  { eCmdCreateDBLink, "DBLink" },
202  { eCmdCreateUnverified, "Unverified" },
203  { eCmdCreateUnreviewed, "Unreviewed" },
204  { eCmdCreateAuthorizedAccess, "AuthorizedAccess" },
205  { eCmdCreateRefGeneTracking, "RefGene Tracking" },
206  { eCmdCreateRegionDescriptor, "Region" },
207  { eCmdCreateCommentDescriptor, "Comment" },
208  { eCmdCreateTitle, "Title" },
209  { eCmdCreateMolInfo, "Molecule Description" },
210  { eCmdCreatePubDescriptor, "Publication" },
211  { eCmdCreatePubDescriptorLabeled, "Publication" },
212  { eCmdCreatePubFeatureLabeled, "Publication" }
213 };
214 
215 static const int num_feat_cmds = sizeof (feat_cmds) / sizeof (FeatCmd);
216 
217 
218 static string GetKeyFromCmdID (int cmd_id)
219 {
220  for (int i = 0; i < num_feat_cmds; i++) {
221  if (feat_cmds[i].cmd == cmd_id) {
222  return feat_cmds[i].feature_name;
223  }
224  }
225  return "";
226 }
227 
228 
229 typedef struct feattypecmd {
233 
234 static const FeatTypeCmd feat_type_cmds[] =
235 {
302 
303 };
304 
305 static const int num_feat_type_cmds = sizeof (feat_type_cmds) / sizeof (FeatTypeCmd);
306 
307 
309 {
310  for (int i = 0; i < num_feat_type_cmds; i++) {
311  if (feat_type_cmds[i].cmd == cmd_id) {
312  return feat_type_cmds[i].subtype;
313  }
314  }
316 }
317 
319 {
320  CRef<CSeq_feat> feat(new CSeq_feat());
321 
322  switch (subtype) {
324  feat->SetData().SetCdregion();
325  break;
327  feat->SetData().SetGene();
328  break;
330  feat->SetData().SetProt();
331  break;
333  feat->SetData().SetProt().SetProcessed(CProt_ref::eProcessed_preprotein);
334  break;
336  feat->SetData().SetProt().SetProcessed(CProt_ref::eProcessed_mature);
337  break;
339  feat->SetData().SetProt().SetProcessed(CProt_ref::eProcessed_signal_peptide);
340  break;
342  feat->SetData().SetProt().SetProcessed(CProt_ref::eProcessed_transit_peptide);
343  break;
345  feat->SetData().SetRna().SetType(CRNA_ref::eType_premsg);
346  break;
348  feat->SetData().SetRna().SetType(CRNA_ref::eType_mRNA);
349  break;
351  feat->SetData().SetRna().SetType(CRNA_ref::eType_tRNA);
352  break;
354  feat->SetData().SetRna().SetType(CRNA_ref::eType_rRNA);
355  break;
357  feat->SetData().SetRna().SetType(CRNA_ref::eType_ncRNA);
358  break;
360  feat->SetData().SetRna().SetType(CRNA_ref::eType_tmRNA);
361  break;
363  feat->SetData().SetRna().SetType(CRNA_ref::eType_miscRNA);
364  break;
366  feat->SetData().SetBond();
367  break;
369  feat->SetData().SetSite();
370  break;
371 
373  feat->SetData().SetPsec_str(CSeqFeatData::ePsec_str_helix);
374  break;
376  feat->SetData().SetRegion();
377  break;
379  feat->SetData().SetPub();
380  break;
381 
383  feat->SetData().SetComment();
384  break;
386  feat->SetData().SetBiosrc();
387  break;
388  default:
389  feat->SetData().SetImp().SetKey(CSeqFeatData::SubtypeValueToName(subtype));
390  break;
391  }
392  return feat;
393 }
394 
395 static string s_GetMenuName(int i)
396 {
398  return "Publication Descriptor";
399  } else if (feat_cmds[i].cmd == eCmdCreatePubFeatureLabeled) {
400  return "Publication Feature";
401  } else {
402  return feat_cmds[i].feature_name;
403  }
404 }
405 
406 void CBioseqEditorFactory::CollectBioseqEditorCommands(vector<CUICommand*> &commands)
407 {
408  static bool registered = false;
409  if (!registered) {
410  registered = true;
411 
412  commands.push_back(new CUICommand(eCmdEditObjects,
413  "Edit Selected Object(s)\tCtrl+Enter",
414  "Edit Selected Object(s)",
417  "Command opens Dialog to Edit Selected Object(s)"));
418  commands.push_back(new CUICommand(eCmdDeleteObjects,
419  "Delete Selected Object(s)\tCtrl+Back",
420  "Delete Selected Object(s)",
423  "Command deletes Selected Object(s)"));
424  commands.push_back(new CUICommand(eCmdEditBiosourceDesc,
425  "Edit BioSource Descriptor",
426  "Edit BioSource Descriptor",
429  "Command opens Dialog to Edit Biosource Descriptor of the Current Bioseq"));
430  commands.push_back(new CUICommand(eCmdDeleteBiosourceDesc,
431  "Delete BioSource Descriptor",
432  "Delete BioSource Descriptor",
435  "Command deletes Biosource Descriptor of the Current Bioseq"));
436  commands.push_back(new CUICommand(eCmdCreateBiosourceDesc,
437  "Create BioSource Descriptor",
438  "Create BioSource Descriptor",
441  "Command opens Dialog to Create Biosource Descriptor of the Current Bioseq"));
442  commands.push_back(new CUICommand(eCmdEditBiosourceFeat,
443  "Edit BioSource Feature",
444  "Edit BioSource Feature",
447  "Command opens Dialog to Edit Biosource Feature of the Current Bioseq"));
448  commands.push_back(new CUICommand(eCmdDeleteBiosourceFeat,
449  "Delete BioSource Feature",
450  "Delete BioSource Feature",
453  "Command deletes Biosource Feature of the Current Bioseq"));
454  commands.push_back(new CUICommand(eCmdCreateBiosourceFeat,
455  "Create BioSource Feature",
456  "Create BioSource Feature",
459  "Command opens Dialog to Create Feature Descriptor of the Current Bioseq"));
460 
461  commands.push_back(new CUICommand(eCmdPropagateAllFeatures,
462  "Propagate All Features",
463  "Propagate All Features",
466  "Command opens Dialog to Propagate All Features from the Current Bioseq"));
467 
468  commands.push_back(new CUICommand(eCmdPropagateSelectedFeatures,
469  "Propagate Selected Feature(s)",
470  "Propagate Selected Feature(s)",
473  "Command opens Dialog to Propagate Selected Feature from the Current Bioseq"));
474 
475  for (int i = 0; i < num_feat_cmds; i++) {
476  string feature_name = feat_cmds[i].feature_name;
477  string menu_name = s_GetMenuName(i);
478  string description = "Command opens Dialog to Create " + feature_name + " on the Current Bioseq";
479  commands.push_back(new CUICommand(feat_cmds[i].cmd,
480  menu_name,
481  feature_name,
484  description));
485  }
486  }
487 }
488 
490 {
491  vector<CUICommand*> commands;
492  CollectBioseqEditorCommands(commands);
493  for (size_t i = 0; i < commands.size(); i++)
494  {
495  cmd_reg.RegisterCommand(commands[i]);
496  }
497 
498  wxAcceleratorEntry accelerator1(wxACCEL_CTRL, WXK_BACK, eCmdDeleteObjects);
499  cmd_reg.AddAccelerator(accelerator1);
500 // wxAcceleratorEntry accelerator2(wxACCEL_NORMAL, WXK_NUMPAD_DELETE, eCmdDeleteObjects);
501 // cmd_reg.AddAccelerator(accelerator2);
502  wxAcceleratorEntry accelerator3(wxACCEL_CTRL, WXK_RETURN, eCmdEditObjects);
503  cmd_reg.AddAccelerator(accelerator3);
504 // wxAcceleratorEntry accelerator4(wxACCEL_NORMAL, WXK_NUMPAD_ENTER, eCmdEditObjects);
505 // cmd_reg.AddAccelerator(accelerator4);
506 
507 }
508 
509 CObject* CBioseqEditorFactory::CreateEditor(const string& interface_name, ICommandProccessor& cmdProccessor, IGuiWidgetHost* guiWidgetHost)
510 {
511  if (typeid(IBioseqEditor).name() == interface_name) {
512  return new CBioseqEditor(cmdProccessor, guiWidgetHost);
513  }
514  return 0;
515 }
516 
517 static
518 WX_DEFINE_MENU(kBioseqEditorShortContextMenu)
519  WX_MENU_SEPARATOR_L("Edit Selection")
522 WX_END_MENU()
523 
524 static
525 WX_DEFINE_MENU(kBioseqEditorContextMenu)
526  WX_MENU_SEPARATOR_L("Edit Selection")
531 WX_END_MENU()
532 
533 wxMenu* CBioseqEditor::CreateContextMenu(bool shorter) const
534 {
535  if (shorter) {
536  return CUICommandRegistry::GetInstance().CreateMenu(kBioseqEditorShortContextMenu);
537  }
538  return CUICommandRegistry::GetInstance().CreateMenu(kBioseqEditorContextMenu);
539 }
540 
541 static
542 WX_DEFINE_MENU(kBioseqEditorBioseqMenu)
543  WX_SUBMENU("BioSource")
544  WX_MENU_SEPARATOR_L("Edit Bioseq")
552  WX_SUBMENU("Create Features")
553  WX_MENU_SEPARATOR_L("Edit Bioseq")
555  WX_SUBMENU("Genes and Named Regions")
573  WX_SUBMENU("Coding Regions and Transcripts")
582  WX_SUBMENU("Structural RNAs")
589  WX_SUBMENU("Sites and Bonds")
598  WX_SUBMENU("Remaining Features")
618  WX_END_SUBMENU()
619  WX_SUBMENU("Publications")
620  WX_MENU_SEPARATOR_L("Edit Bioseq")
623  WX_END_SUBMENU()
624  WX_SUBMENU("Descriptors")
625  WX_MENU_SEPARATOR_L("Edit Bioseq")
638  WX_END_SUBMENU()
639 WX_END_MENU()
640 
641 wxMenu* CBioseqEditor::CreateBioseqMenu() const
642 {
643  return CUICommandRegistry::GetInstance().CreateMenu(kBioseqEditorBioseqMenu);
644 }
645 
646 static
647 WX_DEFINE_MENU(kTextViewTopMenu)
648  WX_SUBMENU("&Edit")
649  WX_MENU_SEPARATOR_L("Contribs")
653 WX_END_MENU()
654 
655 const SwxMenuItemRec* CBioseqEditor::GetMenuDef() const
656 {
657  return kTextViewTopMenu;
658 }
659 
660 BEGIN_EVENT_TABLE( CBioseqEditor, wxEvtHandler )
667 
676 
713 
726 
737 
752 
793 
807 
810 
813 
817 
818 bool CBioseqEditor::ProcessEvent(wxEvent& event)
819 {
820  if (!m_CB)
821  return false;
822 
823  return wxEvtHandler::ProcessEvent(event);
824 }
825 
826 void CBioseqEditor::OnUpdateEditBiosourceDesc(wxUpdateUIEvent& event)
827 {
828  event.Enable(x_HaveBiosourceDesc());
829 }
830 
831 void CBioseqEditor::OnUpdateCreateBiosourceDesc(wxUpdateUIEvent& event)
832 {
833  event.Enable(!x_HaveBiosourceDesc() && x_IsNa());
834 }
835 
836 void CBioseqEditor::OnUpdateDeleteBiosourceDesc(wxUpdateUIEvent& event)
837 {
838  event.Enable(x_HaveBiosourceDesc());
839 }
840 
841 void CBioseqEditor::OnEditBiosourceDesc(wxCommandEvent& event)
842 {
843  const char* szCommand = "Edit Biosource Descriptor";
844 
845  try {
847  if (!bh)
848  {
849  event.Skip();
850  return;
851  }
852 
853  CSeqdesc_CI desc_it(bh, CSeqdesc::e_Source);
854  if (!desc_it)
855  {
856  event.Skip();
857  return;
858  }
859 
861  CIRef<IEditObject> editor(new CEditObjectSeq_desc(*desc_it, seh, bh.GetScope(), false));
862  ERR_POST(Info << "Start " << szCommand);
863  x_EditObject(editor);
864  ERR_POST(Info << "End " << szCommand);
865  } catch (const std::exception& e) {
866  x_ReportError(szCommand, e);
867  }
868 }
869 
870 void CBioseqEditor::OnCreateBiosourceDesc(wxCommandEvent& event)
871 {
872  const char* szCommand = "Create Biosource Descriptor";
873 
874  try {
876  if (!bh)
877  {
878  event.Skip();
879  return;
880  }
881 
882  CSeqdesc_CI desc_it(bh, CSeqdesc::e_Source);
883  if (desc_it) {
884  ERR_POST(Info << "Error: " << szCommand << ": Biosource descriptor already exists");
885  return;
886  }
887 
888  CRef<CSeqdesc> secdesc(new CSeqdesc());
889  CRef<CBioSource> bioSource(new CBioSource());
890  secdesc->SetSource(*bioSource);
891 
893  CIRef<IEditObject> editor(new CEditObjectSeq_desc(*secdesc, seh, bh.GetScope(), true));
894  ERR_POST(Info << "Start " << szCommand);
895  x_EditObject(editor);
896  ERR_POST(Info << "End " << szCommand);
897 
898  } catch (const std::exception& e) {
899  x_ReportError(szCommand, e);
900  }
901 }
902 
903 void CBioseqEditor::OnDeleteBiosourceDesc(wxCommandEvent& event)
904 {
905  const char* szCommand = "Delete Biosource Descriptor";
906 
907  try {
909  if (!bh)
910  {
911  event.Skip();
912  return;
913  }
914 
915  CSeqdesc_CI desc_it(bh, CSeqdesc::e_Source);
916  if (!desc_it)
917  {
918  event.Skip();
919  return;
920  }
921 
923  x_DeleteObject(seh, *desc_it);
924  } catch (const std::exception& e) {
925  x_ReportError(szCommand, e);
926  }
927 }
928 
929 void CBioseqEditor::OnUpdateEditBiosourceFeat(wxUpdateUIEvent& event)
930 {
931  event.Enable(x_HaveBiosourceFeat());
932 }
933 
934 void CBioseqEditor::OnUpdateCreateBiosourceFeat(wxUpdateUIEvent& event)
935 {
937  if (!bh)
938  {
939  event.Skip();
940  return;
941  }
942  event.Enable(!x_HaveBiosourceFeat() && x_IsNa());
943 }
944 
945 void CBioseqEditor::OnUpdateDeleteBiosourceFeat(wxUpdateUIEvent& event)
946 {
947  event.Enable(x_HaveBiosourceFeat());
948 }
949 
950 void CBioseqEditor::OnEditBiosourceFeat(wxCommandEvent& event)
951 {
952  const char* szCommand = "Edit Biosource Feature";
953 
954  try {
956  if (!bh)
957  {
958  event.Skip();
959  return;
960  }
961 
962  CFeat_CI fsrc_it(bh, CSeqFeatData::e_Biosrc);
963  if (!fsrc_it)
964  {
965  event.Skip();
966  return;
967  }
968 
969  CSeq_feat_Handle fh = *fsrc_it;
971 
972  CIRef<IEditObject> editor(new CEditObjectSeq_feat(*fh.GetOriginalSeq_feat(), seh, bh.GetScope(), false));
973  ERR_POST(Info << "Start " << szCommand);
974  x_EditObject(editor);
975  ERR_POST(Info << "End " << szCommand);
976  } catch (const std::exception& e) {
977  x_ReportError(szCommand, e);
978  }
979 }
980 
981 void CBioseqEditor::OnPropagateAllFeatures(wxCommandEvent& event)
982 {
983  //Context:
984  // The user selected "Propagate All Features" from the edit link next to a
985  // bioseq. The intent is to propagate every feature of that bioseq to one
986  // or all other bioseqs in the set.
987  // Where to and how to propagate still needs to be settled but the features to be
988  // propagated are already fixed. It needs therefore be passed into all the actions
989  // that will be triggered from here.
990  //
991  const char* szCommand = "Feature Propagate";
992 
993  try {
994  TEditObjectList objList;
995  m_CB->GetCurrentSelection(objList);
996  if (objList.empty()) {
997  event.Skip();
998  return;
999  }
1000 
1001  CBioseq_Handle bsh;
1002  for (TEditObjectList::iterator it = objList.begin(); it != objList.end(); ++it) {
1003  const CSeq_feat* pSeqFeat = dynamic_cast<const CSeq_feat*>(it->m_Obj.GetPointer());
1004  if (pSeqFeat) {
1005  if (it->m_Scope) {
1006  bsh = it->m_Scope->GetBioseqHandle(pSeqFeat->GetLocation());
1007  }
1008  else {
1009  bsh = it->m_SEH.GetScope().GetBioseqHandle(pSeqFeat->GetLocation());
1010  }
1011  if (bsh) {
1012  break;
1013  }
1014  }
1015  }
1016 
1017  vector<CConstRef<CSeq_feat>> propagatedFeats;
1018  for (CFeat_CI ci(bsh); ci; ++ci) {
1019  propagatedFeats.push_back(ci->GetSeq_feat());
1020  }
1021 
1022  CIRef<IEditObject> editor(new CEditObjectFeaturePropagate(bsh, propagatedFeats));
1023  ERR_POST(Info << "Start " << szCommand);
1024  x_EditObject(editor, "Propagate Features");
1025  ERR_POST(Info << "End " << szCommand);
1026  }
1027  catch (const std::exception& e) {
1028  x_ReportError(szCommand, e);
1029  }
1030 
1031 }
1032 
1034 {
1035  event.Enable(x_HasAlignment());
1036 }
1037 
1039 {
1040  //Context
1041  // The user highlighted one or more features of one of the bioseqs displayed. The
1042  // intent is to propagate all of the selected features to one or all of the other
1043  // sequences.
1044  // Where to and how to propagate still needs to be settled but the features to be
1045  // propagated are already fixed. It needs therefore be passed into all the actions
1046  // that will be triggered from here.
1047  //
1048  const char* szCommand = "Feature Propagate";
1049 
1050  try {
1051  //Generate list of features to be propagated. That would be the currently selected
1052  // ones
1053  TEditObjectList objList;
1054  m_CB->GetCurrentSelection(objList);
1055  if (objList.empty()) {
1056  event.Skip();
1057  return;
1058  }
1059 
1060  vector<CConstRef<CSeq_feat>> propagatedFeats;
1061  for (TEditObjectList::iterator it = objList.begin(); it != objList.end(); ++it) {
1062  const CSeq_feat* pSeqFeat = dynamic_cast<const CSeq_feat*>(it->m_Obj.GetPointer());
1063  if (pSeqFeat) {
1064  propagatedFeats.push_back(ConstRef(pSeqFeat));
1065  }
1066  }
1067 
1068  CSeq_entry_Handle seh = objList.front().m_SEH;
1069  CBioseq_Handle bh = seh.GetSeq();
1070  if (!bh) {
1071  event.Skip();
1072  return;
1073  }
1074  //Create and trigger the magic object editor that will take care of the
1075  // rest
1076  CEditObjectFeaturePropagate* pPropagator = new CEditObjectFeaturePropagate(bh, propagatedFeats);
1077 
1078  CIRef<IEditObject> editor(pPropagator);
1079  ERR_POST(Info << "Start " << szCommand);
1080  x_EditObject(editor, "Propagate Features");
1081  ERR_POST(Info << "End " << szCommand);
1082 
1083  } catch (const std::exception& e) {
1084  x_ReportError(szCommand, e);
1085  }
1086 }
1087 
1089 {
1090  event.Enable(x_HasAlignment());
1091 }
1092 
1093 void CBioseqEditor::OnCreateBiosourceFeat(wxCommandEvent& event)
1094 {
1095  const char* szCommand = "Create Biosource Feature";
1096 
1097  try {
1099  if (!bh)
1100  {
1101  event.Skip();
1102  return;
1103  }
1104 
1105  CFeat_CI fsrc_it(bh, CSeqFeatData::e_Biosrc);
1106  if (fsrc_it) {
1107  ERR_POST(Info << "Error: " << szCommand << ": Biosource feature already exists");
1108  return;
1109  }
1110 
1111  CRef<CSeq_feat> seqFeat(new CSeq_feat());
1112  CRef<CSeqFeatData> featData(new CSeqFeatData());
1113  CRef<CBioSource> bioSource(new CBioSource());
1114  seqFeat->SetData(*featData);
1115  featData->SetBiosrc(*bioSource);
1116 
1117  CRef<CSeq_id> seq_id(new CSeq_id);
1118  CConstRef<CSeq_id> bseq_seq_id = bh.GetSeqId();
1119  TSeqPos length = bh.GetBioseqLength();
1120  seq_id->Assign(*bseq_seq_id);
1121  CRef<CSeq_loc> seqloc(new CSeq_loc(*seq_id, 0, length - 1));
1122  seqFeat->SetLocation(*seqloc);
1123 
1125  CIRef<IEditObject> editor(new CEditObjectSeq_feat(*seqFeat, seh, seh.GetScope(), true));
1126  ERR_POST(Info << "Start " << szCommand);
1127  x_EditObject(editor);
1128  ERR_POST(Info << "End " << szCommand);
1129 
1130  } catch (const std::exception& e) {
1131  x_ReportError(szCommand, e);
1132  }
1133 
1134 }
1135 
1136 void CBioseqEditor::OnDeleteBiosourceFeat(wxCommandEvent& event)
1137 {
1138  const char* szCommand = "Delete Biosource Feature";
1139 
1140  try {
1142  if (!bh)
1143  {
1144  event.Skip();
1145  return;
1146  }
1147 
1148  CFeat_CI fsrc_it(bh, CSeqFeatData::e_Biosrc);
1149  if (!fsrc_it)
1150  return;
1151 
1154  seh.GetEditHandle();
1156  } catch (const std::exception& e) {
1157  x_ReportError(szCommand, e);
1158  }
1159 }
1160 
1161 
1162 
1163 // feature creators
1164 void CBioseqEditor::OnCreateFeature(CRef<CSeq_feat> feature, wxCommandEvent& event)
1165 {
1166  string feat_name = "Create " + feature->GetData().GetKey();
1167  const char* szCommand = feat_name.c_str();
1168 
1169  try {
1171  if (!bh)
1172  {
1173  event.Skip();
1174  return;
1175  }
1176 
1177 
1178  CRef<CSeq_id> seq_id(new CSeq_id);
1179  CConstRef<CSeq_id> bseq_seq_id = bh.GetSeqId();
1180  TSeqPos length = bh.GetBioseqLength();
1181  seq_id->Assign(*bseq_seq_id);
1182  CRef<CSeq_loc> seqloc(new CSeq_loc(*seq_id, 0, length - 1));
1183  feature->SetLocation(*seqloc);
1184 
1186  CIRef<IEditObject> editor(new CEditObjectSeq_feat(*feature, seh, seh.GetScope(), true));
1187  ERR_POST(Info << "Start " << szCommand);
1188  x_EditObject(editor);
1189  ERR_POST(Info << "End " << szCommand);
1190 
1191  } catch (const std::exception& e) {
1192  x_ReportError(szCommand, e);
1193  }
1194 }
1195 
1196 
1197 void CBioseqEditor::OnUpdateNucleotideFeat(wxUpdateUIEvent& event)
1198 {
1200  if (!bh)
1201  {
1202  event.Skip();
1203  return;
1204  }
1205  event.Enable(!bh.IsAa());
1206 }
1207 
1208 
1209 void CBioseqEditor::OnUpdateProteinFeat(wxUpdateUIEvent& event)
1210 {
1212  if (!bh)
1213  {
1214  event.Skip();
1215  return;
1216  }
1217  event.Enable(bh.IsAa());
1218 }
1219 
1220 void CBioseqEditor::OnUpdateAnyFeat(wxUpdateUIEvent& event)
1221 {
1223  if (!bh)
1224  {
1225  event.Skip();
1226  return;
1227  }
1228  event.Enable(true);
1229 }
1230 
1231 bool CBioseqEditor::x_HandleFeatCreationHere(wxCommandEvent& event)
1232 {
1233  if (!m_CB->MayCreateFeatures()) {
1234  event.Skip();
1235  return false;
1236  }
1237  return true;
1238 }
1239 
1240 void CBioseqEditor::OnCreateCodingRegion(wxCommandEvent& event)
1241 {
1242  if (x_HandleFeatCreationHere(event)) {
1243  CRef<CSeq_feat> seqFeat(new CSeq_feat());
1244  seqFeat->SetData().SetCdregion();
1245  OnCreateFeature(seqFeat, event);
1246  }
1247 }
1248 
1249 
1250 void CBioseqEditor::OnCreateGene(wxCommandEvent& event)
1251 {
1252  if (x_HandleFeatCreationHere(event)) {
1253  CRef<CSeq_feat> seqFeat(new CSeq_feat());
1254  seqFeat->SetData().SetGene();
1255  OnCreateFeature(seqFeat, event);
1256  }
1257 }
1258 
1259 
1260 void CBioseqEditor::OnCreateProt(wxCommandEvent& event)
1261 {
1262  if (x_HandleFeatCreationHere(event)) {
1263  CRef<CSeq_feat> seqFeat(new CSeq_feat());
1264  seqFeat->SetData().SetProt();
1265  switch (event.GetId()) {
1266  case eCmdCreateProprotein:
1267  seqFeat->SetData().SetProt().SetProcessed(CProt_ref::eProcessed_preprotein);
1268  break;
1269  case eCmdCreateMatPeptide:
1270  seqFeat->SetData().SetProt().SetProcessed(CProt_ref::eProcessed_mature);
1271  break;
1272  case eCmdCreateSigPeptide:
1273  seqFeat->SetData().SetProt().SetProcessed(CProt_ref::eProcessed_signal_peptide);
1274  break;
1276  seqFeat->SetData().SetProt().SetProcessed(CProt_ref::eProcessed_transit_peptide);
1277  break;
1278  default:
1279  // do nothing, normal protein
1280  break;
1281  }
1282  OnCreateFeature(seqFeat, event);
1283  }
1284 }
1285 
1286 
1287 void CBioseqEditor::OnCreateImport(wxCommandEvent& event)
1288 {
1289  if (x_HandleFeatCreationHere(event)) {
1290  CRef<CSeq_feat> seqFeat(new CSeq_feat());
1291  seqFeat->SetData().SetImp().SetKey(GetKeyFromCmdID(event.GetId()));
1292  OnCreateFeature(seqFeat, event);
1293  }
1294 }
1295 
1296 
1297 void CBioseqEditor::OnCreateRegion(wxCommandEvent& event)
1298 {
1299  if (x_HandleFeatCreationHere(event)) {
1300  CRef<CSeq_feat> seqFeat(new CSeq_feat());
1301  seqFeat->SetData().SetRegion();
1302  OnCreateFeature(seqFeat, event);
1303  }
1304 }
1305 
1306 
1308 {
1309  if (x_HandleFeatCreationHere(event)) {
1310  CRef<CSeq_feat> seqFeat(new CSeq_feat());
1311  seqFeat->SetData().SetPsec_str(CSeqFeatData::ePsec_str_helix);
1312  OnCreateFeature(seqFeat, event);
1313  }
1314 }
1315 
1316 
1317 void CBioseqEditor::OnCreateSite(wxCommandEvent& event)
1318 {
1319  if (x_HandleFeatCreationHere(event)) {
1320  CRef<CSeq_feat> seqFeat(new CSeq_feat());
1321  seqFeat->SetData().SetSite();
1322  OnCreateFeature(seqFeat, event);
1323  }
1324 }
1325 
1326 
1327 void CBioseqEditor::OnCreateBond(wxCommandEvent& event)
1328 {
1329  if (x_HandleFeatCreationHere(event)) {
1330  CRef<CSeq_feat> seqFeat(new CSeq_feat());
1331  seqFeat->SetData().SetBond();
1332  OnCreateFeature(seqFeat, event);
1333  }
1334 }
1335 
1336 
1337 void CBioseqEditor::OnCreatePubFeat(wxCommandEvent& event)
1338 {
1339  if (x_HandleFeatCreationHere(event)) {
1340  CRef<CSeq_feat> seqFeat(new CSeq_feat());
1341  seqFeat->SetData().SetPub();
1342  OnCreateFeature(seqFeat, event);
1343  }
1344 }
1345 
1346 
1347 void CBioseqEditor::OnCreateRNA(wxCommandEvent& event)
1348 {
1349  if (x_HandleFeatCreationHere(event)) {
1350  CRef<CSeq_feat> seqFeat(new CSeq_feat());
1351 
1352  string rna_type = GetKeyFromCmdID(event.GetId());
1353  if (NStr::EqualNocase(rna_type, "preRNA")) {
1354  seqFeat->SetData().SetRna().SetType(CRNA_ref::eType_premsg);
1355  }
1356  else if (NStr::EqualNocase(rna_type, "mRNA")) {
1357  seqFeat->SetData().SetRna().SetType(CRNA_ref::eType_mRNA);
1358  }
1359  else if (NStr::EqualNocase(rna_type, "tRNA")) {
1360  seqFeat->SetData().SetRna().SetType(CRNA_ref::eType_tRNA);
1361  }
1362  else if (NStr::EqualNocase(rna_type, "rRNA")) {
1363  seqFeat->SetData().SetRna().SetType(CRNA_ref::eType_rRNA);
1364  }
1365  else if (NStr::EqualNocase(rna_type, "ncRNA")) {
1366  seqFeat->SetData().SetRna().SetType(CRNA_ref::eType_ncRNA);
1367  }
1368  else if (NStr::EqualNocase(rna_type, "tmRNA")) {
1369  seqFeat->SetData().SetRna().SetType(CRNA_ref::eType_tmRNA);
1370  }
1371  else {
1372  seqFeat->SetData().SetRna().SetType(CRNA_ref::eType_miscRNA);
1373  }
1374 
1375  OnCreateFeature(seqFeat, event);
1376  }
1377 }
1378 
1379 
1380 void CBioseqEditor::OnCreateDescriptor(wxCommandEvent& evt)
1381 {
1382  string descriptor_type = GetKeyFromCmdID(evt.GetId());
1383  string cmd_name = "Create " + descriptor_type + " Descriptor";
1384  const char* szCommand = cmd_name.c_str();
1385 
1386  try {
1388  if (!bh)
1389  {
1390  evt.Skip();
1391  return;
1392  }
1393 
1394  // pre-checks
1395  if (NStr::EqualNocase(descriptor_type, "BioSource")) {
1396  CSeqdesc_CI desc_it(bh, CSeqdesc::e_Source);
1397  if (desc_it) {
1398  ERR_POST(Info << "Error: " << szCommand << ": Biosource descriptor already exists");
1399  return;
1400  }
1401  } else if (NStr::EqualNocase(descriptor_type, "Molecule Description")) {
1402  CSeqdesc_CI desc_it(bh, CSeqdesc::e_Molinfo);
1403  if (desc_it) {
1405  CIRef<IEditObject> editor(new CEditObjectSeq_desc(*desc_it, seh, bh.GetScope(), false));
1406  ERR_POST(Info << "Start " << szCommand);
1407  x_EditObject(editor);
1408  ERR_POST(Info << "End " << szCommand);
1409  return;
1410  }
1411  }
1412 
1413  CRef<CSeqdesc> seqdesc(new CSeqdesc());
1414  if (NStr::EqualNocase(descriptor_type, "BioSource")) {
1415  CRef<CBioSource> bioSource(new CBioSource());
1416  seqdesc->SetSource(*bioSource);
1417  } else if (NStr::EqualNocase(descriptor_type, "TPA Assembly")) {
1418  seqdesc->SetUser().SetType().SetStr("TpaAssembly");
1419  } else if (NStr::EqualNocase(descriptor_type, "StructuredComment")) {
1420  seqdesc->SetUser().SetType().SetStr("StructuredComment");
1421  } else if (NStr::EqualNocase(descriptor_type, "DBLink")) {
1422  seqdesc->SetUser().SetType().SetStr("DBLink");
1423  } else if (NStr::EqualNocase(descriptor_type, "Unverified")) {
1424  seqdesc->SetUser().SetType().SetStr("Unverified");
1425  } else if (NStr::EqualNocase(descriptor_type, "Unreviewed")) {
1426  seqdesc->SetUser().SetType().SetStr("Unreviewed");
1427  } else if (NStr::EqualNocase(descriptor_type, "AuthorizedAccess")) {
1428  seqdesc->SetUser().SetType().SetStr("AuthorizedAccess");
1429  } else if (NStr::EqualNocase(descriptor_type, "RefGene Tracking")) {
1430  seqdesc->SetUser().SetType().SetStr("RefGeneTracking");
1431  } else if (NStr::EqualNocase(descriptor_type, "Region")) {
1432  seqdesc->SetRegion();
1433  } else if (NStr::EqualNocase(descriptor_type, "Name")) {
1434  seqdesc->SetName();
1435  } else if (NStr::EqualNocase(descriptor_type, "Comment")) {
1436  seqdesc->SetComment();
1437  } else if (NStr::EqualNocase(descriptor_type, "Title")) {
1438  seqdesc->SetTitle();
1439  } else if (NStr::EqualNocase(descriptor_type, "Molecule Description")) {
1440  seqdesc->SetMolinfo();
1441  } else if (NStr::EqualNocase(descriptor_type, "Publication")) {
1442  seqdesc->SetPub();
1443  }
1444 
1446  CIRef<IEditObject> editor(new CEditObjectSeq_desc(*seqdesc, seh, bh.GetScope(), true));
1447  ERR_POST(Info << "Start " << szCommand);
1448  x_EditObject(editor);
1449  ERR_POST(Info << "End " << szCommand);
1450 
1451  } catch (const std::exception& e) {
1452  x_ReportError(szCommand, e);
1453  }
1454 
1455 }
1456 
1457 
1459 {
1460  CIRef<IEditObject> editor(NULL);
1461 
1462  const CSeq_feat* seqFeat = dynamic_cast<const CSeq_feat*>(obj.GetPointer());
1463  const CTitleEdit* titleEdit = dynamic_cast<const CTitleEdit*>(obj.GetPointer());
1464  const CSeqdesc* seqDesc = dynamic_cast<const CSeqdesc*>(obj.GetPointer());
1465  const CSubmit_block* submitBlock = dynamic_cast<const CSubmit_block*>(obj.GetPointer());
1466  const CBioseq_set* seq_set = dynamic_cast<const CBioseq_set*>(obj.GetPointer());
1467  const CSeq_entry* entry = dynamic_cast<const CSeq_entry*>(obj.GetPointer());
1468  const CSeq_submit* seq_submit = dynamic_cast<const CSeq_submit*>(obj.GetPointer());
1469  if (seq_submit && seq_submit->IsSetSub()) {
1470  submitBlock = &seq_submit->GetSub();
1471  }
1472  if (entry && entry->IsSet()) {
1473  seq_set = &(entry->GetSet());
1474  }
1475 
1476  if (seqFeat) {
1477  CSeq_entry_Handle feat_seh = seh;
1478  CBioseq_Handle bsh = GetBioseqForSeqFeat(*seqFeat, seh.GetScope());
1479  if (bsh) {
1480  feat_seh = bsh.GetSeq_entry_Handle();
1481  }
1482  if (create) {
1483  editor.Reset(new CEditObjectSeq_feat(*seqFeat, feat_seh, seh.GetScope(), create));
1484  } else {
1485  editor.Reset(new CEditObjectSeq_feat(*seqFeat, seh, seh.GetScope(), create));
1486  }
1487  }
1488  else if (seqDesc && CEditObjectSeq_desc::GetDescriptorType(*seqDesc).first != CEditObjectSeq_desc::eUnknown) {
1489  editor.Reset(new CEditObjectSeq_desc(*seqDesc, seh, seh.GetScope(), create));
1490  }
1491  else if (titleEdit) {
1492  CBioseq_Handle bh = seh.GetSeq();
1493  CConstRef<CObject> dummyDesc(new CSeqdescTitleEdit(bh, titleEdit->GetTitle()));
1494  editor.Reset(new CEditObjectSeq_desc(*dummyDesc, seh, seh.GetScope(), create));
1495  }
1496  else if (submitBlock) {
1497  // Create IEditObject object for Submit-block here
1498  CScope& scope = seh.GetScope();
1499  editor.Reset(new CEditObjectSubmit_block(*submitBlock, scope, create));
1500  }
1501  else if (seq_set) {
1502  // create IEditObject object for Bioseq-set
1503  CScope& scope = seh.GetScope();
1504  editor.Reset(new CEditObjectSet(*seq_set, scope));
1505  }
1506 
1507  const CSerialObject* serial =
1508  dynamic_cast<const CSerialObject*>(obj.GetPointer());
1509  string type_name =
1510  serial ? serial->GetThisTypeInfo()->GetName() : string("CObject");
1511 
1512  return editor;
1513 }
1514 
1516 {
1517  int from = 0;
1518  /* const set<ITextItem*> &selected_items = dynamic_cast<CTextPanelContext*>(m_CB)->GetSelectedTextItems();
1519  ITERATE (set<ITextItem*>, it, selected_items) {
1520  CFlatFileTextItem* ffItem = 0;
1521  CExpandItem* expandItem = dynamic_cast<CExpandItem*>(*it);
1522 
1523  if (expandItem)
1524  ffItem = dynamic_cast<CFlatFileTextItem*>(expandItem->GetExpandedItem());
1525  else
1526  ffItem = dynamic_cast<CFlatFileTextItem*>(*it);
1527 
1528  if (!ffItem)
1529  continue;
1530 
1531  const objects::IFlatItem* item = ffItem->GetFlatItem();
1532  const CSequenceItem* seqItem = dynamic_cast<const CSequenceItem*>(item);
1533  if (seqItem) {
1534  from = seqItem->GetFrom();
1535  }
1536  }
1537  */
1538  return from;
1539 }
1540 
1542 {
1543  string command = "Edit Object: ";
1544 
1545  try {
1546  TEditObjectList objList;
1547  m_CB->GetCurrentSelection(objList);
1548  if (objList.empty())
1549  return;
1550 
1551 
1552  CEditObject& editObj = objList.front();
1553  if (!IsEditable(editObj))
1554  return;
1555 
1556  const CSeq_loc* loc = dynamic_cast<const CSeq_loc*>(editObj.m_Obj.GetPointer());
1557  const CSeq_align* align = dynamic_cast<const CSeq_align*>(editObj.m_Obj.GetPointer());
1558  const CSeq_submit* submit = dynamic_cast<const CSeq_submit*>(editObj.m_Obj.GetPointer());
1559  const CTitleEdit* titleEdit = dynamic_cast<const CTitleEdit*>(editObj.m_Obj.GetPointer());
1560  const CSeqdesc* seqDesc = dynamic_cast<const CSeqdesc*>(editObj.m_Obj.GetPointer());
1561 
1562  if (loc )
1563  {
1564  int from = 0;
1565  CRef<CSeq_loc> whole_loc;
1566  if (loc->IsInt())
1567  {
1568  from = loc->GetInt().GetFrom() + 1;
1569  CBioseq_Handle bsh = editObj.m_SEH.GetScope().GetBioseqHandle(*loc);
1570  whole_loc = bsh.GetRangeSeq_loc(0,0);
1571  }
1572  if (whole_loc)
1573  loc = whole_loc.GetPointer();
1574 
1575  if (loc->IsWhole())
1576  {
1577  wxApp *app = dynamic_cast<wxApp*>(wxApp::GetInstance());
1578  CEditSequence *dlg = new CEditSequence( app->GetTopWindow(), loc, editObj.m_SEH.GetScope(), &m_CmdProccessor, from);
1579  dlg->Show(true);
1580  }
1581  return;
1582  }
1583 
1584  if (align) {
1585  CAlignmentAssistant *dlg = NULL;
1586  try
1587  {
1588  wxApp *app = dynamic_cast<wxApp*>(wxApp::GetInstance());
1589  dlg = new CAlignmentAssistant(app->GetTopWindow(), editObj.m_SEH, &m_CmdProccessor, ConstRef(align));
1590  dlg->Show(true);
1591  return;
1592  }
1593  catch (CException&)
1594  {
1595  if (dlg)
1596  dlg->Destroy();
1597  wxMessageBox(wxT("Unable to load the alignment"), wxT("Error"), wxOK | wxICON_ERROR);
1598  return;
1599  }
1600  }
1601 
1602  CConstRef<CObject> obj = editObj.m_Obj;
1603 
1604  if (submit && submit->IsSetSub())
1605  {
1606  CConstRef<CSubmit_block> bl(&(submit->GetSub()));
1607  obj.Reset(bl.GetPointer());
1608  }
1609 
1610  CSeq_entry_Handle seh = editObj.m_SEH;
1611 
1612  if (titleEdit)
1613  {
1614  CSeqdesc_CI desc_it(seh, CSeqdesc::e_Title);
1615  if (!desc_it)
1616  {
1617  int res = wxMessageBox(wxT("The current display is an on-the-fly defline, not an instantiated one. Editing this will create an instantiated title."), wxT("Create Defline"), wxYES_NO | wxICON_QUESTION);
1618  if (res != wxYES)
1619  {
1620  return;
1621  }
1622  }
1623  }
1624 
1625  bool create = false;
1626  if (seqDesc && seqDesc->IsSource()) // if object does not exist but allows selection and editing - create it (can happen with biosource in flat file view)
1627  {
1628  CSeqdesc_CI desc_it(seh, CSeqdesc::e_Source);
1629  if (!desc_it)
1630  {
1631  create = true;
1632  }
1633  }
1634 
1635  CIRef<IEditObject> editor = CreateEditorForObject(obj, seh, create);
1636 
1637  const CSerialObject* serial = dynamic_cast<const CSerialObject*>(editObj.m_Obj.GetPointer());
1638  string type_name = serial ? serial->GetThisTypeInfo()->GetName() : string("CObject");
1639 
1640  if (!editor) {
1641  wxMessageBox(wxT("No editor found for object of type \'") +
1642  ToWxString(type_name) +
1643  wxT("\'."),
1644  wxT("Error"), wxOK|wxICON_ERROR);
1645  return;
1646  }
1647 
1648  command += type_name;
1649 
1650  ERR_POST(Info << "Start " << command << type_name);
1651  x_EditObject(editor);
1652  ERR_POST(Info << "End " << command<< type_name);
1653 
1654  } catch (const std::exception& e) {
1655  x_ReportError(command, e);
1656  }
1657 }
1658 
1659 void CBioseqEditor::OnEditSelection(wxCommandEvent& event)
1660 {
1661  /*TFlatItemList itemList;
1662  m_CB->GetItemSelection(itemList);
1663  if (!itemList.empty())
1664  {
1665  cout << "Selected: " << typeid(*itemList.front()).name() << endl;
1666  }
1667  */
1668  try {
1669  TEditObjectList objList;
1670  m_CB->GetCurrentSelection(objList);
1671  if (objList.empty())
1672  {
1673  event.Skip();
1674  return;
1675  }
1676 
1677  if (IsEditable(objList.front()))
1678  {
1679  EditSelection();
1680  return;
1681  }
1682  }
1683  catch (const std::exception&) {
1684  }
1685  event.Skip();
1686 }
1687 
1688 void CBioseqEditor::OnUpdateEditSelection(wxUpdateUIEvent& event)
1689 {
1690  event.Enable(false);
1691 
1692  try {
1693  TEditObjectList objList;
1694  m_CB->GetCurrentSelection(objList);
1695  if (objList.empty())
1696  {
1697  // event.Skip();
1698  return;
1699  }
1700 
1701  event.Enable(IsEditable(objList.front()));
1702  }
1703  catch (const std::exception&) {
1704  }
1705 }
1706 
1707 void CBioseqEditor::OnDeleteSelection(wxCommandEvent& event)
1708 {
1709  int num_selected = 0;
1710  int num_cds = 0;
1711  try {
1712  TEditObjectList objList;
1713  m_CB->GetCurrentSelection(objList);
1714  if (objList.empty())
1715  {
1716  event.Skip();
1717  return;
1718  }
1719 
1720  ITERATE(TEditObjectList, editObj, objList) {
1721 
1722  const CSeqdesc* seqDesq = dynamic_cast<const CSeqdesc*>(editObj->m_Obj.GetPointer());
1723  const CSeq_feat* seqFeat = dynamic_cast<const CSeq_feat*>(editObj->m_Obj.GetPointer());
1724  const CSeq_annot* seqAnnot = dynamic_cast<const CSeq_annot*>(editObj->m_Obj.GetPointer());
1725  const CSeq_align* seqAlign = dynamic_cast<const CSeq_align*>(editObj->m_Obj.GetPointer());
1726 
1727  if (seqDesq || seqFeat || seqAnnot || seqAlign)
1728  num_selected++;
1729  if (seqFeat && seqFeat->IsSetData()
1731  && sequence::GetGeneForFeature(*seqFeat, editObj->m_SEH.GetScope()))
1732  num_cds++;
1733  }
1734  } catch (const std::exception&) {
1735  }
1736  if (num_selected == 0)
1737  {
1738  event.Skip();
1739  return;
1740  }
1741  if (num_selected > 1)
1742  {
1743  int res = wxMessageBox(wxT("Are you sure you want to delete multiple objects?"), wxT("Delete Selected Objects"), wxYES_NO | wxICON_QUESTION);
1744  if (res != wxYES)
1745  {
1746  return;
1747  }
1748  }
1749 
1750  bool delete_genes = false;
1751  if (num_cds > 0)
1752  {
1753  int res = wxMessageBox(wxT("Remove associated genes?"), wxT("Delete genes"), wxYES_NO | wxCANCEL | wxICON_QUESTION);
1754  if (res == wxCANCEL)
1755  {
1756  return;
1757  }
1758  if (res == wxYES)
1759  {
1760  delete_genes = true;
1761  }
1762  }
1763 
1764  const char* szCommand = "Delete Object";
1765 
1766  try {
1767  TEditObjectList objList;
1768  m_CB->GetCurrentSelection(objList);
1769  if (objList.empty()) {
1770  return;
1771  }
1772  // warn before deleting biosource descriptor
1773  ITERATE(TEditObjectList, obj, objList) {
1774  const CSeqdesc* seqDesq = dynamic_cast<const CSeqdesc*>(obj->m_Obj.GetPointer());
1775  if (seqDesq) {
1776  if (seqDesq->IsSource()) {
1777  wxMessageDialog dlg(NULL, wxT("Are you sure you want to delete the BioSource?"), wxT("Delete BioSource"), wxOK | wxCANCEL);
1778  if (dlg.ShowModal() == wxID_CANCEL) {
1779  return;
1780  } else {
1781  break;
1782  }
1783  }
1784  }
1785  }
1786  // ask about deleting descriptors from sets
1787  bool from_single = false;
1788  ITERATE(TEditObjectList, obj, objList) {
1789  CSeq_entry_Handle seh = obj->m_SEH;
1790  const CSeqdesc* seqDesq = dynamic_cast<const CSeqdesc*>(obj->m_Obj.GetPointer());
1791  if (seqDesq) {
1792  CSeq_entry_Handle sehDesc;
1793  bool cancel;
1794  bool any;
1795  from_single = x_DeleteFromSingleSeq(seh, sehDesc, *seqDesq, any, cancel);
1796  if (cancel) {
1797  return;
1798  }
1799  if (any) {
1800  break;
1801  }
1802  }
1803  }
1804 
1805  // now delete all selected objects
1806  CRef<CCmdComposite> delete_cmd(new CCmdComposite("Delete object(s)"));
1807  bool any_deleted = false;
1808  ITERATE(TEditObjectList, editObj, objList) {
1809  CSeq_entry_Handle seh = editObj->m_SEH;
1810  const CSeqdesc* seqDesq = dynamic_cast<const CSeqdesc*>(editObj->m_Obj.GetPointer());
1811  const CSeq_feat* seqFeat = dynamic_cast<const CSeq_feat*>(editObj->m_Obj.GetPointer());
1812  const CSeq_annot* seqAnnot = dynamic_cast<const CSeq_annot*>(editObj->m_Obj.GetPointer());
1813  const CSeq_align* seqAlign = dynamic_cast<const CSeq_align*>(editObj->m_Obj.GetPointer());
1814  if (seqDesq) {
1815  CIRef<IEditCommand> this_cmd = x_GetDeleteCommand(seh, *seqDesq, from_single);
1816  if (!this_cmd) {
1817  return;
1818  }
1819  delete_cmd->AddCommand(*this_cmd);
1820  any_deleted = true;
1821  } else if (seqFeat) {
1822  CRef<CCmdComposite> this_cmd = x_GetDeleteCommand(seh, *seqFeat);
1823  if (!this_cmd) {
1824  return;
1825  }
1826  delete_cmd->AddCommand(*this_cmd);
1827  if (delete_genes && seqFeat->GetData().GetSubtype() == CSeqFeatData::eSubtype_cdregion)
1828  {
1829  CConstRef<CSeq_feat> gene = sequence::GetGeneForFeature(*seqFeat, editObj->m_SEH.GetScope());
1830  if (gene)
1831  {
1832  CRef<CCmdComposite> gene_cmd = x_GetDeleteCommand(seh, *gene);
1833  if (gene_cmd)
1834  delete_cmd->AddCommand(*gene_cmd);
1835  }
1836  }
1837 
1838  any_deleted = true;
1839  }
1840  else if (seqAnnot) {
1841  CRef<CCmdComposite> this_cmd = x_GetDeleteCommand(seh, *seqAnnot);
1842  if (!this_cmd) {
1843  return;
1844  }
1845  delete_cmd->AddCommand(*this_cmd);
1846  any_deleted = true;
1847  }
1848  else if (seqAlign) {
1849  CIRef<IEditCommand> this_cmd = x_GetDeleteCommand(seh, *seqAlign);
1850  if (!this_cmd) {
1851  return;
1852  }
1853  delete_cmd->AddCommand(*this_cmd);
1854  any_deleted = true;
1855  }
1856  }
1857  if (any_deleted) {
1858  m_CmdProccessor.Execute(delete_cmd);
1859  }
1860  } catch (const std::exception& e) {
1861  x_ReportError(szCommand, e);
1862  }
1863 }
1864 
1865 void CBioseqEditor::OnUpdateDeleteSelection(wxUpdateUIEvent& event)
1866 {
1867  event.Enable(false);
1868 
1869  try {
1870  TEditObjectList objList;
1871  m_CB->GetCurrentSelection(objList);
1872  if (objList.empty())
1873  {
1874  // event.Skip();
1875  return;
1876  }
1877  event.Enable(IsDeletable(objList.front()));
1878  } catch (const std::exception&) {
1879  }
1880 }
1881 
1883 {
1884  wxBusyCursor wait;
1885  CEditObjViewDlg* edit_dlg = new CEditObjViewDlg(NULL, true);
1886  edit_dlg->SetUndoManager(&m_CmdProccessor);
1887  wxWindow* editorWindow = edit->CreateWindow(edit_dlg);
1888  edit_dlg->SetEditorWindow(editorWindow);
1889  edit_dlg->SetEditor(edit);
1890  SetWorkDir(edit_dlg, m_CB->GetWorkDir());
1891 
1892  if (!title.empty()) {
1893  edit_dlg->SetTitle(title);
1894  }
1895 }
1896 
1897 
1898 // if a descriptor is on a set, have the option to remove from just a single sequence in the set
1899 bool CBioseqEditor::x_DeleteFromSingleSeq(objects::CSeq_entry_Handle& seh, objects::CSeq_entry_Handle& sehDesc, const objects::CSeqdesc& seqDesc, bool& any, bool& cancel)
1900 {
1901  cancel = false;
1902  any = false;
1903  CSeqdesc::E_Choice choice = seqDesc.Which();
1904 
1905  sehDesc = edit::GetSeqEntryForSeqdesc(CRef<CScope>(&(seh.GetScope())), seqDesc);
1906 
1907  if (!sehDesc)
1908  return false;
1909 
1910  bool askSeqSet = false;
1911 
1912  switch (choice) {
1913  case CSeqdesc::e_Name:
1914  case CSeqdesc::e_Title:
1915  case CSeqdesc::e_Comment:
1916  case CSeqdesc::e_Genbank:
1917  case CSeqdesc::e_Region:
1918  case CSeqdesc::e_User:
1919  case CSeqdesc::e_Embl:
1920  case CSeqdesc::e_Pub:
1921  case CSeqdesc::e_Source:
1922  askSeqSet = (seh.IsSeq() && sehDesc != seh);
1923  break;
1924  default:
1925  break;
1926  }
1927 
1928  if (askSeqSet) {
1929  any = true;
1931  if (dlg.ShowModal() != wxID_OK) {
1932  cancel = true;
1933  return false;
1934  }
1935 
1936  if (dlg.GetChoice() == 0) {
1937  return false;
1938  } else {
1939  return true;
1940  }
1941  }
1942  return false;
1943 }
1944 
1945 
1946 CIRef<IEditCommand> CBioseqEditor::x_GetDeleteCommand(objects::CSeq_entry_Handle& seh, const objects::CSeqdesc& seqDesc, bool from_single)
1947 {
1948  CSeq_entry_Handle sehDesc = edit::GetSeqEntryForSeqdesc(CRef<CScope>(&(seh.GetScope())), seqDesc);
1949  if (!sehDesc) {
1950  return CIRef<IEditCommand>(NULL);
1951  }
1952 
1954  if (from_single) {
1955  CRef<CCmdComposite> composite(new CCmdComposite("Delete Descriptor(s)"));
1956  CIRef<IEditCommand> cmdDelDesc(new CCmdDelDesc(sehDesc, seqDesc));
1957  composite->AddCommand(*cmdDelDesc);
1958 
1959  for (CSeq_entry_CI it(sehDesc.GetSet()); it; ++it) {
1960  if (*it != seh) {
1961  CIRef<IEditCommand> cmdAddDesc(new CCmdCreateDesc(*it, seqDesc));
1962  composite->AddCommand(*cmdAddDesc);
1963  }
1964  }
1965  cmd.Reset(composite.GetPointer());
1966  } else {
1967  cmd.Reset(new CCmdDelDesc(sehDesc, seqDesc));
1968  }
1969  return cmd;
1970 }
1971 
1972 void CBioseqEditor::x_DeleteObject(objects::CSeq_entry_Handle& seh, const objects::CSeqdesc& seqDesq)
1973 {
1974  bool cancel = false;
1975  bool any = false;
1976  CSeq_entry_Handle sehDesc;
1977  bool from_single = x_DeleteFromSingleSeq(seh, sehDesc, seqDesq, any, cancel);
1978  if (cancel || !sehDesc) {
1979  return;
1980  }
1981 
1983  if (from_single) {
1984  CRef<CCmdComposite> composite(new CCmdComposite("Delete Descriptor(s)"));
1985  CIRef<IEditCommand> cmdDelDesc(new CCmdDelDesc(sehDesc, seqDesq));
1986  composite->AddCommand(*cmdDelDesc);
1987 
1988  for (CSeq_entry_CI it(sehDesc.GetSet()); it; ++it) {
1989  if (*it != seh) {
1990  CIRef<IEditCommand> cmdAddDesc(new CCmdCreateDesc(*it, seqDesq));
1991  composite->AddCommand(*cmdAddDesc);
1992  }
1993  }
1994  cmd.Reset(composite.GetPointer());
1995  } else {
1996  cmd.Reset(new CCmdDelDesc(sehDesc, seqDesq));
1997  }
1998 
2000 }
2001 
2002 
2003 CRef<CCmdComposite> CBioseqEditor::x_GetDeleteCommand(objects::CSeq_entry_Handle& seh, const objects::CSeq_feat& seqFeat)
2004 {
2006 
2007  if (!seqFeat.IsSetData()) {
2008  LOG_POST(Error << "CBioseqEditor.Delete.Feature data not set");
2009  return cmd;
2010  }
2011  CSeq_feat_Handle fh;
2012  SAnnotSelector sel(seqFeat.GetData().GetSubtype());
2013  if (seqFeat.IsSetLocation() && !seqFeat.GetLocation().IsNull()) {
2014  for (CFeat_CI mf(seh.GetScope(), seqFeat.GetLocation(), sel); mf; ++mf) {
2015  if (mf->GetOriginalFeature().Equals(seqFeat)) {
2016  fh = mf->GetSeq_feat_Handle();
2017  break;
2018  }
2019  }
2020  }
2021 
2022  if (!fh) {
2023  fh = GetSeqFeatHandleForBadLocFeature(seqFeat, seh.GetScope());
2024  }
2025 
2026  if (!fh) {
2027  LOG_POST(Error << "CBioseqEditor.Delete.Feature Feature not found");
2028  return cmd;
2029  }
2030 
2031  CIRef<IEditCommand> addCommand;
2032 
2033  const CSeqFeatData& data = seqFeat.GetData();
2034  if (data.IsGene()) {
2035  addCommand = CCmdFactory::DeleteGeneXRefs(seh, data.GetGene());
2036  if (addCommand) {
2037  int res = wxMessageBox(wxT("Delete features which reference this gene?"),
2038  wxT("Delete Gene"), wxYES_NO | wxICON_QUESTION);
2039  if (res != wxYES)
2040  addCommand.Reset();
2041  }
2042  }
2043 
2044  if (addCommand) {
2045  CRef<CCmdComposite> composite(new CCmdComposite("Delete Feature"));
2046  composite->AddCommand(*addCommand);
2047  composite->AddCommand(*GetDeleteFeatureCommand(fh));
2048  cmd.Reset(&*composite);
2049  } else {
2050  cmd.Reset(&*GetDeleteFeatureCommand(fh));
2051  }
2052 
2053  // when the feature has a local feat-id which is cross-referenced by other features:
2054  if (seqFeat.IsSetId() && seqFeat.GetId().IsLocal()) {
2055  const CFeat_id::TLocal& local_id = seqFeat.GetId().GetLocal();
2056  CCrossRefFeatsDlg::TFeatVec feat_list;
2057 
2058  for (CFeat_CI feat_it(seh); feat_it; ++feat_it) {
2059  const CSeq_feat& orig = feat_it->GetOriginalFeature();
2061  if ((*it)->IsSetId() && (*it)->GetId().IsLocal()) {
2062  if (local_id.Match((*it)->GetId().GetLocal())) {
2063  feat_list.push_back(seh.GetScope().GetSeq_featHandle(orig));
2064  break;
2065  }
2066  }
2067  }
2068  }
2069  if (!feat_list.empty()) {
2070  CCrossRefFeatsDlg dlg(NULL, feat_list, local_id);
2071  if (dlg.ShowModal() == wxID_OK) {
2072  CRef<CCmdComposite> chgfeats = dlg.GetCommand();
2073  if (chgfeats) {
2074  cmd->AddCommand(*chgfeats);
2075  }
2076  }
2077  }
2078 
2079  }
2080 
2081  if (!cmd) {
2082  LOG_POST(Error << "CBioseqEditor.Delete.Feature failed to create command");
2083  return cmd;
2084  }
2085 
2086  // This is necessary, to make sure that we are in "editing mode"
2087  const CSeq_annot_Handle& annot_handle = fh.GetAnnot();
2088  CSeq_entry_EditHandle eh = annot_handle.GetParentEntry().GetEditHandle();
2089 
2090  return cmd;
2091 }
2092 
2093 
2094 void CBioseqEditor::x_DeleteObject(objects::CSeq_entry_Handle& seh, const objects::CSeq_feat& seqFeat)
2095 {
2096  if (!seqFeat.IsSetData()) {
2097  LOG_POST(Error << "CBioseqEditor.Delete.Feature data not set");
2098  return;
2099  }
2100 
2101  CSeq_feat_Handle fh;
2102  SAnnotSelector sel(seqFeat.GetData().GetSubtype());
2103  if (seqFeat.IsSetLocation() && !seqFeat.GetLocation().IsNull()) {
2104  for (CFeat_CI mf(seh.GetScope(), seqFeat.GetLocation(), sel); mf; ++mf) {
2105  if (mf->GetOriginalFeature().Equals(seqFeat)) {
2106  fh = mf->GetSeq_feat_Handle();
2107  break;
2108  }
2109  }
2110  } else {
2111  fh = GetSeqFeatHandleForBadLocFeature(seqFeat, seh.GetScope());
2112  }
2113 
2114  if (!fh) {
2115  LOG_POST(Error << "CBioseqEditor.Delete.Feature Feature not found");
2116  return;
2117  }
2118 
2119  CIRef<IEditCommand> addCommand;
2121 
2122  const CSeqFeatData& data = seqFeat.GetData();
2123  if (data.IsGene()) {
2124  addCommand = CCmdFactory::DeleteGeneXRefs(seh, data.GetGene());
2125  if (addCommand) {
2126  int res = wxMessageBox(wxT("Delete features which reference this gene?"),
2127  wxT("Delete Gene"), wxYES_NO | wxICON_QUESTION );
2128  if (res != wxYES)
2129  addCommand.Reset();
2130  }
2131  }
2132 
2133  if (addCommand) {
2134  CRef<CCmdComposite> composite(new CCmdComposite("Delete Feature"));
2135  composite->AddCommand(*addCommand);
2136  composite->AddCommand(*GetDeleteFeatureCommand(fh));
2137  cmd.Reset(&*composite);
2138  }
2139  else {
2140  cmd.Reset(&*GetDeleteFeatureCommand(fh));
2141  }
2142 
2143  // when the feature has a local feat-id which is cross-referenced by other features:
2144  if (seqFeat.IsSetId() && seqFeat.GetId().IsLocal()) {
2145  const CFeat_id::TLocal& local_id = seqFeat.GetId().GetLocal();
2146  CCrossRefFeatsDlg::TFeatVec feat_list;
2147 
2148  for(CFeat_CI feat_it(seh); feat_it; ++feat_it) {
2149  const CSeq_feat& orig = feat_it->GetOriginalFeature();
2151  if ((*it)->IsSetId() && (*it)->GetId().IsLocal()) {
2152  if (local_id.Match((*it)->GetId().GetLocal())) {
2153  feat_list.push_back(seh.GetScope().GetSeq_featHandle(orig));
2154  break;
2155  }
2156  }
2157  }
2158  }
2159  if (!feat_list.empty()) {
2160  CCrossRefFeatsDlg dlg(NULL, feat_list, local_id);
2161  if (dlg.ShowModal() == wxID_OK) {
2162  CRef<CCmdComposite> chgfeats = dlg.GetCommand();
2163  if (chgfeats) {
2164  cmd->AddCommand(*chgfeats);
2165  }
2166  }
2167  }
2168 
2169  }
2170 
2171  if (!cmd) {
2172  LOG_POST(Error << "CBioseqEditor.Delete.Feature failed to create command");
2173  return;
2174  }
2175 
2176  // This is necessary, to make sure that we are in "editing mode"
2177  const CSeq_annot_Handle& annot_handle = fh.GetAnnot();
2178  CSeq_entry_EditHandle eh = annot_handle.GetParentEntry().GetEditHandle();
2180 }
2181 
2183 {
2184  CSeq_annot_Handle ah;
2185  for (CSeq_annot_CI annot_it(seh, CSeq_annot_CI::eSearch_entry); annot_it; ++annot_it) {
2186  if (annot_it->GetCompleteSeq_annot().GetPointer() == &annot) {
2187  ah = *annot_it;
2188  }
2189  }
2190 
2191  if (!ah) {
2192  LOG_POST(Error << "CBioseqEditor.Delete.Annot Annot not found");
2193  return CRef<CCmdComposite>();
2194  }
2195 
2196  CRef<CCmdComposite> cmd(new CCmdComposite("Delete annotation"));
2197  if (!annot.IsFtable()) {
2198  CIRef<IEditCommand> cmdDelAnnot(new CCmdDelSeq_annot(ah));
2199  cmd->AddCommand(*cmdDelAnnot);
2200  }
2201  else {
2202  for (CFeat_CI feat_it(ah); feat_it; ++feat_it) {
2203  CRef<CCmdComposite> cmdDelFeat = GetDeleteFeatureCommand(feat_it->GetSeq_feat_Handle(), true);
2204  cmd->AddCommand(*cmdDelFeat);
2205  }
2206  }
2207 
2208  if (!cmd) {
2209  LOG_POST(Error << "CBioseqEditor.Delete.Annot failed to create command");
2210  return cmd;
2211  }
2212 
2213  // This is necessary, to make sure that we are in "editing mode"
2215 
2216  return cmd;
2217 }
2218 
2220 {
2221  CSeq_align_Handle ah;
2222  for (CAlign_CI align_it(seh); align_it; ++align_it) {
2223  if (&align_it.GetOriginalSeq_align() == &align) {
2224  ah = align_it.GetSeq_align_Handle();
2225  }
2226  }
2227 
2228  if (!ah) {
2229  LOG_POST(Error << "CBioseqEditor.Delete.Align Align not found");
2230  return CIRef<IEditCommand>();
2231  }
2232 
2234  if (!cmd) {
2235  LOG_POST(Error << "CBioseqEditor.Delete.Align failed to create command");
2236  return cmd;
2237  }
2238 
2239  // This is necessary, to make sure that we are in "editing mode"
2240  const CSeq_annot_Handle& annot_handle = ah.GetAnnot();
2241  CSeq_entry_EditHandle eh = annot_handle.GetParentEntry().GetEditHandle();
2242 
2243  return cmd;
2244 }
2245 
2247 {
2248  try {
2250  if (!bh)
2251  return false;
2252 
2253  CSeqdesc_CI desc_it(bh, CSeqdesc::e_Source);
2254  if (desc_it) {
2255  return true;
2256  }
2257  }
2258  catch (const std::exception&) {
2259  }
2260 
2261  return false;
2262 }
2263 
2265 {
2266  try {
2268  if (!bh)
2269  return false;
2270 
2271  return !bh.IsAa();
2272  }
2273  catch (const std::exception&) {
2274  }
2275 
2276  return false;
2277 }
2278 
2280 {
2281  try {
2283  if (!bh)
2284  return false;
2285 
2286  CFeat_CI fsrc_it(bh, CSeqFeatData::e_Biosrc);
2287  if (fsrc_it) {
2288  return true;
2289  }
2290  }
2291  catch (const std::exception&) {
2292  }
2293 
2294  return false;
2295 }
2296 
2298 {
2299  TEditObjectList objList;
2300  m_CB->GetCurrentSelection(objList);
2301  if (objList.empty()) {
2302  return false;
2303  }
2304 
2305  CBioseq_Handle bsh;
2306  for (auto&& it : objList) {
2307  const CSeq_feat* pSeqFeat = dynamic_cast<const CSeq_feat*>(it.m_Obj.GetPointer());
2308  if (pSeqFeat) {
2309  if (it.m_Scope) {
2310  bsh = it.m_Scope->GetBioseqHandle(pSeqFeat->GetLocation());
2311  }
2312  else {
2313  try {
2314  bsh = it.m_SEH.GetScope().GetBioseqHandle(pSeqFeat->GetLocation());
2315  } catch (CException&) {
2316  // may not be possible to get Bioseq from feature if multiple sequences
2317  return false;
2318  }
2319  }
2320  if (bsh) {
2321  break;
2322  }
2323  }
2324  else {
2325  return false;
2326  }
2327  }
2328  if (!bsh) {
2329  return false;
2330  }
2331  CRef<CSeq_loc> loc = bsh.GetRangeSeq_loc(0, 0);
2332  return (CAlign_CI(bsh.GetScope(), *loc));
2333 }
2334 
2335 void CBioseqEditor::x_ReportError(const string& cmd, const std::exception& e)
2336 {
2337  const CException* pex = dynamic_cast<const CException*>(&e);
2338  if (pex) {
2339  ERR_POST(Error << cmd << " Failed: " << pex->GetMsg());
2340  }
2341  else {
2342  ERR_POST(Error << cmd << " Failed: " << e.what());
2343  }
2344 }
2345 
2346 
2347 static bool s_IsLocalFeature(const CSeq_feat& seq_feat, CSeq_entry_Handle ctx)
2348 {
2349  if (!ctx) {
2350  return false;
2351  }
2352  CScope& scope = ctx.GetScope();
2353  // check to see if this is from external annotation
2354  try {
2355  CSeq_feat_Handle feat = scope.GetSeq_featHandle(seq_feat);
2356  const CSeq_annot_Handle& ah = feat.GetAnnot();
2357  CSeq_entry_Handle seh = ah.GetParentEntry();
2358  if (!seh) {
2359  // from external annotation
2360  return false;
2361  } else if (seh.GetTopLevelEntry() != ctx.GetTopLevelEntry()) {
2362  return false;
2363  } else {
2364  return true;
2365  }
2366  } catch (const CException&) {
2367  return false;
2368  }
2369 }
2370 
2371 
2373 {
2374  CBioseq_Handle none;
2375  const CFlatItem* flat = dynamic_cast<const CFlatItem*>(&item);
2376  if (flat) {
2377  CBioseqContext* ctx = flat->GetContext();
2378  if (ctx) {
2379  return ctx->GetHandle();
2380  }
2381  }
2382  return none;
2383 }
2384 
2386 {
2387  int flags = 0;
2388  if (IsEditable(editObj))
2390  if (IsDeletable(editObj))
2392  return flags;
2393 }
2394 
2395 int CBioseqEditor::GetEditFlags(const objects::IFlatItem& item) const
2396 {
2397  int flags = 0;
2398  if (IsEditable(item))
2400  if (IsDeletable(item))
2402  return flags;
2403 }
2404 
2405 bool CBioseqEditor::IsDeletable(const IFlatItem& item) const
2406 {
2407  const CKeywordsItem* keyword_item = dynamic_cast<const CKeywordsItem*>(&item);
2408  if (keyword_item)
2409  {
2410  return false;
2411  }
2412 
2413  const CAccessionItem* accession_item = dynamic_cast<const CAccessionItem*>(&item);
2414  if (accession_item)
2415  {
2416  return false;
2417  }
2418 
2419  const CVersionItem* version_item = dynamic_cast<const CVersionItem*>(&item);
2420  if (version_item)
2421  {
2422  return false;
2423  }
2424 
2425  const CFeatHeaderItem* featheader_item = dynamic_cast<const CFeatHeaderItem*>(&item);
2426  if (featheader_item)
2427  {
2428  return false;
2429  }
2430 
2431  const COriginItem* origin_item = dynamic_cast<const COriginItem*>(&item);
2432  if (origin_item)
2433  {
2434  return false;
2435  }
2436 
2437  const CStartSectionItem* startsection_item = dynamic_cast<const CStartSectionItem*>(&item);
2438  if (startsection_item)
2439  {
2440  return false;
2441  }
2442 
2443  const CEndSectionItem* endsection_item = dynamic_cast<const CEndSectionItem*>(&item);
2444  if (endsection_item)
2445  {
2446  return false;
2447  }
2448 
2449  const CContigItem* contig_item = dynamic_cast<const CContigItem*>(&item);
2450  if (contig_item)
2451  {
2452  return false;
2453  }
2454 
2455  const CStartItem* start_item = dynamic_cast<const CStartItem*>(&item);
2456  if (start_item)
2457  {
2458  return false;
2459  }
2460 
2461  const CEndItem* end_item = dynamic_cast<const CEndItem*>(&item);
2462  if (end_item)
2463  {
2464  return false;
2465  }
2466 
2467  const CBaseCountItem* basecount_item = dynamic_cast<const CBaseCountItem*>(&item);
2468  if (basecount_item)
2469  {
2470  return false;
2471  }
2472 
2473 
2474  const CSerialObject* obj = item.GetObject();
2475  const CSeqdesc* seqdesc = dynamic_cast<const CSeqdesc*>(obj);
2476  if (seqdesc) {
2477  return true;
2478  }
2479 
2480  const CSeq_feat* seq_feat = dynamic_cast<const CSeq_feat*>(obj);
2481  if (seq_feat) {
2482  CBioseq_Handle bsh = s_GetContext(item);
2483  if (bsh) {
2484  return s_IsLocalFeature(*seq_feat, bsh.GetSeq_entry_Handle());
2485  } else {
2486  return false;
2487  }
2488  }
2489 
2490  const CSubmit_block* submit_block = dynamic_cast<const CSubmit_block*>(obj);
2491  if (submit_block) {
2492  return false;
2493  }
2494 
2495  const CDeflineItem* defLineItem = dynamic_cast<const CDeflineItem*>(&item);
2496  if (defLineItem) {
2497  CBioseqContext* ctx = defLineItem->GetContext();
2498  if (ctx) {
2499  CBioseq_Handle& bh = ctx->GetHandle();
2501  if (di) {
2502  return true;
2503  }
2504  }
2505  return false;
2506  }
2507  const CLocusItem* locusItem = dynamic_cast<const CLocusItem*>(&item);
2508  if (locusItem) {
2509  CBioseqContext* ctx = locusItem->GetContext();
2510  if (ctx) {
2511  const CMolInfo* molInfo = dynamic_cast<const CMolInfo*>(obj);
2512  if (molInfo) {
2513  CSeqdesc_CI dsrc_it(ctx->GetHandle(), CSeqdesc::e_Molinfo);
2514  for (; dsrc_it; ++dsrc_it) {
2515  const CSeqdesc& seqDesc = *dsrc_it;
2516  if (&seqDesc.GetMolinfo() == molInfo) {
2517  return true;
2518  }
2519  }
2520  }
2521  }
2522  return false;
2523  }
2524  return false;
2525 }
2526 
2527 bool CBioseqEditor::IsEditable(const objects::IFlatItem& item) const
2528 {
2529  const CSerialObject* obj = item.GetObject();
2530  const CSeqdesc* seqdesc = dynamic_cast<const CSeqdesc*>(obj);
2531  if (seqdesc) {
2533  }
2534 
2535  const CSeq_feat* seq_feat = dynamic_cast<const CSeq_feat*>(obj);
2536  if (seq_feat) {
2537  CBioseq_Handle bsh = s_GetContext(item);
2538  if (bsh) {
2539  return s_IsLocalFeature(*seq_feat, bsh.GetSeq_entry_Handle());
2540  }
2541  }
2542 
2543  const CDeflineItem* defLineItem = dynamic_cast<const CDeflineItem*>(&item);
2544  if (defLineItem) {
2545  CBioseqContext* ctx = defLineItem->GetContext();
2546  if (ctx) {
2547  CBioseq_Handle& bh = ctx->GetHandle();
2549  if (di) {
2550  return true;
2551  }
2552  }
2553  }
2554 
2555  const CLocusItem* locusItem = dynamic_cast<const CLocusItem*>(&item);
2556  if (locusItem) {
2557  CBioseqContext* ctx = locusItem->GetContext();
2558  if (ctx) {
2559  CBioseq_Handle& bh = ctx->GetHandle();
2560 
2561  const CMolInfo* molInfo = dynamic_cast<const CMolInfo*>(obj);
2562  if (molInfo) {
2563  CSeqdesc_CI dsrc_it(ctx->GetHandle(), CSeqdesc::e_Molinfo);
2564  for (; dsrc_it; ++dsrc_it) {
2565  const CSeqdesc& seqDesc = *dsrc_it;
2566  if (&seqDesc.GetMolinfo() == molInfo) {
2567  return true;
2568  }
2569  }
2570  }
2571  }
2572  }
2573 
2574 
2575  const CSequenceItem* seqItem = dynamic_cast<const CSequenceItem*>(&item);
2576  if (seqItem) {
2577  CBioseqContext* ctx = seqItem->GetContext();
2578  if (ctx) {
2579  return true;
2580  } else {
2581  return false;
2582  }
2583  }
2584 
2585  const CSubmit_block* submit_block = dynamic_cast<const CSubmit_block*>(obj);
2586  if (submit_block) {
2587  return true;
2588  }
2589  const CGapItem* gap_item = dynamic_cast<const CGapItem*>(&item);
2590  if (gap_item)
2591  {
2592  return true;
2593  }
2594  return false;
2595 }
2596 
2598 {
2599  const CSeq_feat* seq_feat = dynamic_cast<const CSeq_feat*>(editObj.m_Obj.GetPointer());
2600  if (seq_feat) {
2601  return s_IsLocalFeature(*seq_feat, editObj.m_SEH);
2602  }
2603 
2604  const CSeqdesc* seqdesc = dynamic_cast<const CSeqdesc*>(editObj.m_Obj.GetPointer());
2605  if (seqdesc) {
2606  return true;
2607  }
2608 
2609  return false;
2610 }
2611 
2612 
2614 {
2615  const CSeq_feat* seq_feat = dynamic_cast<const CSeq_feat*>(editObj.m_Obj.GetPointer());
2616  if (seq_feat) {
2617  return s_IsLocalFeature(*seq_feat, editObj.m_SEH);
2618  }
2619 
2620  const CSeqdesc* seqdesc = dynamic_cast<const CSeqdesc*>(editObj.m_Obj.GetPointer());
2621  if (seqdesc) {
2623  }
2624 
2625  const CSeq_loc* loc = dynamic_cast<const CSeq_loc*>(editObj.m_Obj.GetPointer());
2626  if (loc) {
2627  // only allow sequence editing if this is near and a single seqid
2628  const CSeq_id* id = loc->GetId();
2629  if (id) {
2630  return true;
2631  }
2632  return false;
2633  }
2634  const CSubmit_block* submit_block = dynamic_cast<const CSubmit_block*>(editObj.m_Obj.GetPointer());
2635  const CTitleEdit* title_edit = dynamic_cast<const CTitleEdit*>(editObj.m_Obj.GetPointer());
2636  const CSeq_align* align = dynamic_cast<const CSeq_align*>(editObj.m_Obj.GetPointer());
2637  const CSeq_submit* submit = dynamic_cast<const CSeq_submit*>(editObj.m_Obj.GetPointer());
2638  const CBioseq_set* seq_set = dynamic_cast<const CBioseq_set*>(editObj.m_Obj.GetPointer());
2639  const CSeq_entry* entry = dynamic_cast<const CSeq_entry*>(editObj.m_Obj.GetPointer());
2640  if (entry && entry->IsSet())
2641  seq_set = &(entry->GetSet());
2642 
2643  if (submit_block || seq_set || title_edit || align || submit) {
2644  return true;
2645  }
2646 
2647  return false;
2648 }
2649 
2650 
User-defined methods of the data storage class.
User-defined methods of the data storage class.
#define static
User-defined methods of the data storage class.
EVT_UPDATE_UI(eCmdAlnShowMethodsDlg, CAlnMultiWidget::OnUpdateShowMethodDlg) EVT_UPDATE_UI(eCmdMethodProperties
CSeq_entry_Handle GetSeqEntryForSeqdesc(CRef< CScope > scope, const CSeqdesc &seq_desc)
USING_SCOPE(objects)
static CBioseq_Handle s_GetContext(const IFlatItem &item)
struct featcmd FeatCmd
static const int num_feat_cmds
static const FeatTypeCmd feat_type_cmds[]
static bool s_IsLocalFeature(const CSeq_feat &seq_feat, CSeq_entry_Handle ctx)
struct feattypecmd FeatTypeCmd
static string GetKeyFromCmdID(int cmd_id)
static const FeatCmd feat_cmds[]
CIRef< IEditObject > CreateEditorForObject(CConstRef< CObject > obj, CSeq_entry_Handle seh, bool create)
static string s_GetMenuName(int i)
static const int num_feat_type_cmds
EBioseqEditCommands
@ eCmdCreateSigPeptide
@ eCmdCreateRegion
@ eCmdCreateMiscRecomb
@ eCmdCreateRepeatRegion
@ eCmdCreateDBLink
@ eCmdCreateRegulatory_ribosome_binding_site
@ eCmdCreatetRNA
@ eCmdCreateAssemblyGap
@ eCmdCreateBond
@ eCmdCreatepreRNA
@ eCmdCreateRegulatory
@ eCmdCreateCRegion
@ eCmdEditBiosourceDesc
@ eCmdCreateProt
@ eCmdCreateVSegment
@ eCmdCreateMiscFeature
@ eCmdEditBiosourceFeat
@ eCmdCreateModifiedBase
@ eCmdCreateMobileElement
@ eCmdCreateNRegion
@ eCmdCreateTelomere
@ eCmdCreateMiscStructure
@ eCmdCreaterRNA
@ eCmdCreatetmRNA
@ eCmdCreatePrimerBind
@ eCmdCreateBiosourceFeat
@ eCmdCreateExon
@ eCmdCreateRefGeneTracking
@ eCmdCreateMatPeptide
@ eCmdCreateCentromere
@ eCmdCreateiDNA
@ eCmdDeleteBiosourceDesc
@ eCmdCreatePrimTranscript
@ eCmdCreateJSegment
@ eCmdCreateTitle
@ eCmdCreateMiscBinding
@ eCmdCreatemiscRNA
@ eCmdCreatePubDescriptorLabeled
@ eCmdCreateRegulatory_promoter
@ eCmdCreateOriT
@ eCmdCreateDSegment
@ eCmdCreateVRegion
@ eCmdCreateRegulatory_riboswitch
@ eCmdCreateSTS
@ eCmdCreateCodingRegion_ext
@ eCmdCreatePolyASite
@ eCmdCreateSRegion
@ eCmdCreateCommentDescriptor
@ eCmdCreateUnreviewed
@ eCmdCreateUnverified
@ eCmdCreateBiosourceDesc
@ eCmdCreate5UTR
@ eCmdCreatePubFeatureLabeled
@ eCmdCreateMRNA
@ eCmdCreateGene
@ eCmdCreateCodingRegion
@ eCmdCreateSite
@ eCmdCreateUnsure
@ eCmdCreateRegulatory_enhancer
@ eCmdCreateVariation
@ eCmdCreatePreRNA
@ eCmdCreatePubDescriptor
@ eCmdCreateTransitPeptide
@ eCmdPropagateAllFeatures
@ eCmdCreateRegionDescriptor
@ eCmdCreateIntron
@ eCmdCreateDLoop
@ eCmdCreateSecondaryStructure
@ eCmdCreateProprotein
@ eCmdCreatencRNA
@ eCmdCreateProteinBind
@ eCmdCreateAuthorizedAccess
@ eCmdPropagateSelectedFeatures
@ eCmdCreateStructuredComment
@ eCmdCreateTPAAssembly
@ eCmdCreate3UTR
@ eCmdCreateRepOrigin
@ eCmdCreateLTR
@ eCmdCreateStemLoop
@ eCmdCreateRNA
@ eCmdCreateOperon
@ eCmdCreateRegulatory_terminator
@ eCmdCreateMiscDifference
@ eCmdDeleteBiosourceFeat
@ eCmdCreateMolInfo
#define bool
Definition: bool.h:34
CAlign_CI –.
Definition: align_ci.hpp:63
static void CollectBioseqEditorCommands(vector< CUICommand * > &commands)
virtual CObject * CreateEditor(const string &interface_name, ICommandProccessor &cmdProccessor, IGuiWidgetHost *guiWidgetHost)
virtual string GetExtensionIdentifier() const
returns the unique human-readable identifier for the extension the id should use lowercase letters se...
virtual void RegisterCommands(CUICommandRegistry &, wxFileArtProvider &)
virtual string GetExtensionLabel() const
returns a displayable label for this extension ( please capitalize the key words - "My Extension" )
void OnCreateSite(wxCommandEvent &event)
bool x_HasAlignment(void)
bool x_HaveBiosourceDesc()
void OnPropagateSelectedFeatures(wxCommandEvent &event)
static CRef< objects::CSeq_feat > MakeDefaultFeature(objects::CSeqFeatData::ESubtype subtype)
CIRef< IEditCommand > x_GetDeleteCommand(objects::CSeq_entry_Handle &seh, const objects::CSeqdesc &seqDesc, bool from_single)
void OnDeleteBiosourceDesc(wxCommandEvent &event)
static objects::CSeqFeatData::ESubtype GetFeatTypeFromCmdID(int cmd_id)
void OnUpdateEditSelection(wxUpdateUIEvent &event)
void OnUpdateDeleteSelection(wxUpdateUIEvent &event)
void OnUpdateCreateBiosourceDesc(wxUpdateUIEvent &event)
void OnPropagateAllFeatures(wxCommandEvent &event)
void OnUpdateDeleteBiosourceDesc(wxUpdateUIEvent &event)
virtual void EditSelection()
void OnUpdateEditBiosourceFeat(wxUpdateUIEvent &event)
void OnCreateBond(wxCommandEvent &event)
void OnUpdateAnyFeat(wxUpdateUIEvent &event)
void OnUpdateProteinFeat(wxUpdateUIEvent &event)
void OnUpdatePropagateSelectedFeatures(wxUpdateUIEvent &event)
void OnCreateCodingRegion(wxCommandEvent &event)
void OnUpdateCreateBiosourceFeat(wxUpdateUIEvent &event)
void OnCreateDescriptor(wxCommandEvent &evt)
void OnCreateFeature(CRef< objects::CSeq_feat > feat, wxCommandEvent &event)
void OnEditSelection(wxCommandEvent &event)
virtual int GetEditFlags(CEditObject &editObj) const
bool x_DeleteFromSingleSeq(objects::CSeq_entry_Handle &seh, objects::CSeq_entry_Handle &sehdesc, const objects::CSeqdesc &seqDesq, bool &any, bool &cancel)
void OnCreatePubFeat(wxCommandEvent &event)
IBioseqEditorCB * m_CB
void OnCreateImport(wxCommandEvent &evt)
void OnCreateBiosourceDesc(wxCommandEvent &event)
bool x_HaveBiosourceFeat()
bool IsEditable(CEditObject &editObj) const
void OnDeleteBiosourceFeat(wxCommandEvent &event)
ICommandProccessor & m_CmdProccessor
void OnCreateRegion(wxCommandEvent &evt)
int x_GetFromPosition(void)
void OnCreateProt(wxCommandEvent &event)
void OnCreateBiosourceFeat(wxCommandEvent &event)
void x_DeleteObject(objects::CSeq_entry_Handle &seh, const objects::CSeqdesc &seqDesq)
void OnUpdateDeleteBiosourceFeat(wxUpdateUIEvent &event)
void OnEditBiosourceFeat(wxCommandEvent &event)
void OnCreateRNA(wxCommandEvent &evt)
void OnEditBiosourceDesc(wxCommandEvent &event)
void OnUpdateNucleotideFeat(wxUpdateUIEvent &event)
void OnUpdateEditBiosourceDesc(wxUpdateUIEvent &event)
void OnUpdatePropagateAllFeatures(wxUpdateUIEvent &event)
bool x_HandleFeatCreationHere(wxCommandEvent &event)
void x_EditObject(CIRef< IEditObject > edit, const string &title=kEmptyStr)
void OnCreateSecondaryStructure(wxCommandEvent &evt)
void x_ReportError(const string &cmd, const std::exception &e)
bool IsDeletable(CEditObject &editObj) const
void OnDeleteSelection(wxCommandEvent &event)
void OnCreateGene(wxCommandEvent &event)
CBioseq_Handle –.
void AddCommand(IEditCommand &command)
static CIRef< IEditCommand > DeleteGeneXRefs(objects::CSeq_entry_Handle &seh, const objects::CGene_ref &gene)
CRef< CCmdComposite > GetCommand()
vector< objects::CSeq_feat_Handle > TFeatVec
void SetEditorWindow(wxWindow *editorWindow)
void SetEditor(CIRef< IEditObject > editor)
virtual void SetUndoManager(ICommandProccessor *cmdProccessor)
static pair< EDescriptorType, string > GetDescriptorType(const objects::CSeqdesc &desc)
objects::CSeq_entry_Handle m_SEH
CConstRef< CObject > m_Obj
CFeat_CI –.
Definition: feat_ci.hpp:64
CBioseqContext * GetContext(void)
Definition: item_base.hpp:113
bool Match(const CObject_id &oid2) const
Definition: Object_id.cpp:61
CObject –.
Definition: ncbiobj.hpp:180
CScope –.
Definition: scope.hpp:92
void SetBiosrc(TBiosrc &v)
ESubtype GetSubtype(void) const
string GetKey(EVocabulary vocab=eVocabulary_full) const
@ eSubtype_misc_difference
@ eSubtype_bad
These no longer need to match the FEATDEF values in the C toolkit's objfdef.h.
@ eSubtype_prim_transcript
@ eSubtype_transit_peptide_aa
static CTempString SubtypeValueToName(ESubtype eSubtype)
Turns a ESubtype into its string value which is NOT necessarily related to the identifier of the enum...
CSeq_annot_CI –.
CSeq_annot_Handle –.
bool IsFtable(void) const
Definition: Seq_annot.cpp:177
CSeq_entry_CI –.
CSeq_entry_Handle –.
CSeq_entry_Handle –.
Definition: Seq_entry.hpp:56
CSeq_feat_Handle –.
namespace ncbi::objects::
Definition: Seq_feat.hpp:58
CSeqdesc_CI –.
Definition: seqdesc_ci.hpp:65
Base class for all serializable objects.
Definition: serialbase.hpp:150
CSubmit_block –.
string GetTitle() const
CUICommandRegistry is a centralized registry where all application commands should be registered.
Definition: ui_command.hpp:146
static CUICommandRegistry & GetInstance()
the main instance associated with the application
Definition: ui_command.cpp:176
wxMenu * CreateMenu(const SwxMenuItemRec *items)
create a menu from a static definition (see WX_*_MENU macros)
Definition: ui_command.cpp:349
int RegisterCommand(CUICommand *cmd)
assumes ownership of the given object returns a command id (useful when registry is used for auto id ...
Definition: ui_command.cpp:198
void AddAccelerator(const wxAcceleratorEntry &entry)
Definition: ui_command.cpp:274
CUICommand.
Definition: ui_command.hpp:79
virtual objects::CBioseq_Handle GetCurrentBioseq()=0
virtual void GetCurrentSelection(TEditObjectList &)=0
virtual bool MayCreateFeatures() const
virtual wxString GetWorkDir() const =0
IBioseqEditor.
Undo/Redo interface for editing operations.
virtual void Execute(IEditCommand *command, wxWindow *window=0)=0
virtual const CSerialObject * GetObject(void) const =0
static CS_COMMAND * cmd
Definition: ct_dynamic.c:26
static uch flags
CS_CONTEXT * ctx
Definition: t0006.c:12
unsigned int TSeqPos
Type for sequence locations and lengths.
Definition: ncbimisc.hpp:875
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
Definition: ncbimisc.hpp:815
string
Definition: cgiapp.hpp:687
#define NULL
Definition: ncbistd.hpp:225
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
Definition: ncbidiag.hpp:186
#define LOG_POST(message)
This macro is deprecated and it's strongly recomended to move in all projects (except tests) to macro...
Definition: ncbidiag.hpp:226
void Error(CExceptionArgs_Base &args)
Definition: ncbiexpt.hpp:1197
const string & GetMsg(void) const
Get message string.
Definition: ncbiexpt.cpp:461
void Info(CExceptionArgs_Base &args)
Definition: ncbiexpt.hpp:1185
objects::CBioseq_Handle GetBioseqForSeqFeat(const objects::CSeq_feat &f, objects::CScope &scope)
objects::CSeq_feat_Handle GetSeqFeatHandleForBadLocFeature(const objects::CSeq_feat &feat, objects::CScope &scope)
virtual const CTypeInfo * GetThisTypeInfo(void) const =0
virtual void Assign(const CSerialObject &source, ESerialRecursionMode how=eRecursive)
Optimized implementation of CSerialObject::Assign, which is not so efficient.
Definition: Seq_id.cpp:318
CConstRef< CSeq_feat > GetGeneForFeature(const CSeq_feat &feat, CScope &scope)
Finds gene for feature, but obeys SeqFeatXref directives.
Definition: sequence.cpp:1529
CBioseq_Handle GetBioseqHandle(const CSeq_id &id)
Get bioseq handle by seq-id.
Definition: scope.cpp:95
CSeq_feat_Handle GetSeq_featHandle(const CSeq_feat &feat, EMissing action=eMissing_Default)
Definition: scope.cpp:200
const CSeq_annot_Handle & GetAnnot(void) const
Get handle to seq-annot for this feature.
TSeqPos GetBioseqLength(void) const
TSet GetSet(void) const
bool IsAa(void) const
CSeq_entry_Handle GetSeq_entry_Handle(void) const
Get parent Seq-entry handle.
CConstRef< CSeq_id > GetSeqId(void) const
Get id which can be used to access this bioseq handle Throws an exception if none is available.
TSeq GetSeq(void) const
CSeq_entry_Handle GetParentEntry(void) const
Get parent Seq-entry handle.
CSeq_entry_EditHandle GetEditHandle(void) const
Get 'edit' version of handle.
CSeq_entry_Handle GetTopLevelEntry(void) const
Get top level Seq-entry handle.
CScope & GetScope(void) const
Get scope this handle belongs to.
CScope & GetScope(void) const
Get scope this handle belongs to.
CConstRef< CSeq_feat > GetOriginalSeq_feat(void) const
CRef< CSeq_loc > GetRangeSeq_loc(TSeqPos start, TSeqPos stop, ENa_strand strand=eNa_strand_unknown) const
Return CSeq_loc referencing the given range and strand on the bioseq If start == 0,...
const CSeq_annot_Handle & GetAnnot(void) const
Get handle to the seq-annot.
const CSeq_feat_Handle & GetSeq_feat_Handle(void) const
Get original feature handle.
Definition: mapped_feat.hpp:71
TObjectType * GetPointer(void) const THROWS_NONE
Get pointer,.
Definition: ncbiobj.hpp:1684
CConstRef< C > ConstRef(const C *object)
Template function for conversion of const object pointer to CConstRef.
Definition: ncbiobj.hpp:2024
TObjectType * GetPointer(void) THROWS_NONE
Get pointer,.
Definition: ncbiobj.hpp:998
void Reset(void)
Reset reference object.
Definition: ncbiobj.hpp:1439
void Reset(void)
Reset reference object.
Definition: ncbiobj.hpp:773
#define END_NCBI_SCOPE
End previously defined NCBI scope.
Definition: ncbistl.hpp:103
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
Definition: ncbistl.hpp:100
#define NcbiEmptyString
Definition: ncbistr.hpp:122
static bool EqualNocase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-insensitive equality of a substring with another string.
Definition: ncbistr.hpp:5352
const string & GetName(void) const
Get name of this type.
Definition: typeinfo.cpp:249
void SetType(TType &value)
Assign a value to Type data member.
TId GetId(void) const
Get the variant data.
Definition: Object_id_.hpp:270
@ eProcessed_signal_peptide
Definition: Prot_ref_.hpp:99
@ eProcessed_transit_peptide
Definition: Prot_ref_.hpp:100
@ eType_ncRNA
non-coding RNA; subsumes snRNA, scRNA, snoRNA
Definition: RNA_ref_.hpp:104
bool IsSetData(void) const
the specific data Check if a value has been assigned to Data data member.
Definition: Seq_feat_.hpp:913
void SetLocation(TLocation &value)
Assign a value to Location data member.
Definition: Seq_feat_.cpp:131
const TLocation & GetLocation(void) const
Get the Location member data.
Definition: Seq_feat_.hpp:1117
bool IsGene(void) const
Check if variant Gene is selected.
const TData & GetData(void) const
Get the Data member data.
Definition: Seq_feat_.hpp:925
void SetData(TData &value)
Assign a value to Data data member.
Definition: Seq_feat_.cpp:94
const TGene & GetGene(void) const
Get the variant data.
@ ePsec_str_helix
any helix
TFrom GetFrom(void) const
Get the From member data.
const TInt & GetInt(void) const
Get the variant data.
Definition: Seq_loc_.cpp:194
const TSet & GetSet(void) const
Get the variant data.
Definition: Seq_entry_.cpp:124
bool IsSet(void) const
Check if variant Set is selected.
Definition: Seq_entry_.hpp:263
TTitle & SetTitle(void)
Select the variant.
Definition: Seqdesc_.hpp:1039
TPub & SetPub(void)
Select the variant.
Definition: Seqdesc_.cpp:362
bool IsSource(void) const
Check if variant Source is selected.
Definition: Seqdesc_.hpp:1190
TName & SetName(void)
Select the variant.
Definition: Seqdesc_.hpp:1019
TComment & SetComment(void)
Select the variant.
Definition: Seqdesc_.hpp:1065
TSource & SetSource(void)
Select the variant.
Definition: Seqdesc_.cpp:572
E_Choice
Choice variants.
Definition: Seqdesc_.hpp:109
TUser & SetUser(void)
Select the variant.
Definition: Seqdesc_.cpp:390
const TMolinfo & GetMolinfo(void) const
Get the variant data.
Definition: Seqdesc_.cpp:588
TMolinfo & SetMolinfo(void)
Select the variant.
Definition: Seqdesc_.cpp:594
TRegion & SetRegion(void)
Select the variant.
Definition: Seqdesc_.hpp:1115
@ e_Embl
EMBL specific information.
Definition: Seqdesc_.hpp:127
@ e_User
user defined object
Definition: Seqdesc_.hpp:124
@ e_Pub
a reference to the publication
Definition: Seqdesc_.hpp:122
@ e_Genbank
GenBank specific info.
Definition: Seqdesc_.hpp:121
@ e_Comment
a more extensive comment
Definition: Seqdesc_.hpp:117
@ e_Region
overall region (globin locus)
Definition: Seqdesc_.hpp:123
@ e_Molinfo
info on the molecule and techniques
Definition: Seqdesc_.hpp:134
@ e_Title
a title for this sequence
Definition: Seqdesc_.hpp:115
@ e_Name
a name for this sequence
Definition: Seqdesc_.hpp:114
@ e_Source
source of materials, includes Org-ref
Definition: Seqdesc_.hpp:133
const TSub & GetSub(void) const
Get the Sub member data.
bool IsSetSub(void) const
Check if a value has been assigned to Sub data member.
vector< CEditObject > TEditObjectList
@ eCmdEditObjects
@ eCmdDeleteObjects
where boath are integers</td > n< td ></td > n</tr > n< tr > n< td > tse</td > n< td > optional</td > n< td > String</td > n< td class=\"description\"> TSE option controls what blob is orig
END_EVENT_TABLE()
int i
#define wxT(x)
Definition: muParser.cpp:41
Definition: fix_pub.hpp:45
const char * command
#define FOR_EACH_SEQFEATXREF_ON_SEQFEAT(Itr, Var)
FOR_EACH_SEQFEATXREF_ON_SEQFEAT EDIT_EACH_SEQFEATXREF_ON_SEQFEAT.
ViewerWindowBase::OnEditMenu ViewerWindowBase::OnJustification EVT_MENU(MID_SHOW_GEOM_VLTNS, ViewerWindowBase::OnShowGeomVltns) EVT_MENU(MID_FIND_PATTERN
SAnnotSelector –.
string feature_name
EBioseqEditCommands cmd
EBioseqEditCommands cmd
CSeqFeatData::ESubtype subtype
#define WX_DEFINE_MENU(name)
New macros for defining menus for use with CUICommandRegistry.
Definition: ui_command.hpp:266
#define WX_SUBMENU(label)
Definition: ui_command.hpp:288
#define WX_END_MENU()
Definition: ui_command.hpp:294
#define WX_MENU_SEPARATOR_L(label)
Definition: ui_command.hpp:285
#define WX_MENU_ITEM(cmd)
Definition: ui_command.hpp:270
#define WX_MENU_ITEM_INT(cmd)
Definition: ui_command.hpp:302
#define WX_END_SUBMENU()
Definition: ui_command.hpp:291
CRef< CCmdComposite > GetDeleteFeatureCommand(const objects::CSeq_feat_Handle &fh, bool remove_proteins=true)
void SetWorkDir(wxWindow *wnd, const wxString &workDir)
Definition: work_dir.cpp:38
wxString ToWxString(const string &s)
Definition: wx_utils.hpp:173
#define const
Definition: zconf.h:230
Modified on Thu Sep 21 03:44:49 2023 by modify_doxy.py rev. 669887