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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: label.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 21:20:46  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: label.cpp,v 1000.0 2004/06/01 21:20:46 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:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/objutils/label.hpp>
  41. #include <corelib/ncbimtx.hpp>
  42. #include <objects/seq/Bioseq.hpp>
  43. #include <objects/seq/Seq_annot.hpp>
  44. #include <objects/seq/Annot_descr.hpp>
  45. #include <objects/seq/Annotdesc.hpp>
  46. #include <objects/seqalign/Seq_align.hpp>
  47. #include <objects/seqalign/Dense_seg.hpp>
  48. #include <objects/seqfeat/Seq_feat.hpp>
  49. #include <objects/seqloc/Seq_id.hpp>
  50. #include <objects/seqloc/Seq_loc.hpp>
  51. #include <objects/seqloc/Seq_interval.hpp>
  52. #include <objects/seqloc/Seq_point.hpp>
  53. #include <objects/seqset/Seq_entry.hpp>
  54. #include <objects/seqset/Bioseq_set.hpp>
  55. #include <objmgr/util/sequence.hpp>
  56. #include <objmgr/util/feature.hpp>
  57. BEGIN_NCBI_SCOPE
  58. USING_SCOPE(objects);
  59. DEFINE_STATIC_MUTEX(sm_Mutex);
  60. CLabel::TLabelMap CLabel::sm_LabelMap;
  61. void CLabel::GetLabel(const CObject& obj, string* label,
  62.                       ELabelType type, CScope* scope)
  63. {
  64.     if ( !label ) {
  65.         return;
  66.     }
  67.     const CSerialObject* so = dynamic_cast<const CSerialObject*>(&obj);
  68.     if (so) {
  69.         TLabelMap::const_iterator iter =
  70.             sm_LabelMap.find(so->GetThisTypeInfo()->GetName());
  71.         if (iter != sm_LabelMap.end()) {
  72.             iter->second->GetLabel(obj, label, type, scope);
  73.         } else {
  74.             *label = "CSerialObject";
  75.         }
  76.     } else {
  77.         *label = "CObject";
  78.     }
  79. }
  80. void CLabel::RegisterLabelHandler(const string& type,
  81.                                   ILabelHandler& handler)
  82. {
  83.     CMutexGuard LOCK(sm_Mutex);
  84.     sm_LabelMap[type] = CRef<ILabelHandler>(&handler);
  85. }
  86. void CLabel::RegisterLabelHandler(const CTypeInfo& type,
  87.                                   ILabelHandler& handler)
  88. {
  89.     CMutexGuard LOCK(sm_Mutex);
  90.     sm_LabelMap[type.GetName()] = CRef<ILabelHandler>(&handler);
  91. }
  92. //
  93. // label handlers
  94. //
  95. //
  96. // default format function for a seq-id
  97. // this is used by seq-id and seq-loc formatting
  98. //
  99. static inline
  100. void s_GetSeqLabel(const CSeq_id& id, string* label,
  101.                    CScope* scope, CLabel::ELabelType type)
  102. {
  103.     const CSeq_id* id_ptr = &id;
  104.     if (scope  &&  id_ptr->IsGi() ) {
  105.         CBioseq_Handle handle = scope->GetBioseqHandle(id);
  106.         if (handle) {
  107.             const CSeq_id& best_id =
  108.                 sequence::GetId(handle, sequence::eGetId_Best);
  109.             id_ptr = &best_id;
  110.         }
  111.     }
  112.     switch (type) {
  113.     case CLabel::eType:
  114.         id_ptr->GetLabel(label, CSeq_id::eType);
  115.         break;
  116.     default:
  117.     case CLabel::eTooltipBrief:
  118.     case CLabel::eContent:
  119.         id_ptr->GetLabel(label, CSeq_id::eContent);
  120.         break;
  121.     case CLabel::eTooltipDetailed:
  122.     case CLabel::eBoth:
  123.         id_ptr->GetLabel(label, CSeq_id::eBoth);
  124.         break;
  125.     }
  126. }
  127. //
  128. // process a seq-interval
  129. //
  130. static inline
  131. void s_GetSeq_intervalLabel(const CSeq_interval& interval, string* label,
  132.                             CScope* scope, CLabel::ELabelType type,
  133.                             const CSeq_id* last_id = NULL)
  134. {
  135.     if ( !last_id  ||  !interval.GetId().Match(*last_id)) {
  136.         if ( !label->empty() ) {
  137.             *label += "; ";
  138.         }
  139.         s_GetSeqLabel(interval.GetId(), label, scope, type);
  140.         *label += ": ";
  141.     }
  142.     *label += NStr::IntToString(interval.GetFrom());
  143.     *label += "-";
  144.     *label += NStr::IntToString(interval.GetTo());
  145.     if (interval.IsSetStrand()) {
  146.         switch (interval.GetStrand()) {
  147.         case eNa_strand_plus:
  148.             *label += " (+)";
  149.             break;
  150.         case eNa_strand_minus:
  151.             *label += " (-)";
  152.             break;
  153.         default:
  154.             *label += " (+)";
  155.             break;
  156.         }
  157.     }
  158. }
  159. //
  160. // internal processing of seq-loc labels
  161. // seq-locs frequently refer to GIs only - we need to use sequence accessions
  162. // to make a more friendly label
  163. //
  164. static inline
  165. const CSeq_id* s_GetLabel(const CSeq_loc& loc, string* label,
  166.                           CScope* scope, CLabel::ELabelType type,
  167.                           const CSeq_id* last_id = NULL)
  168. {
  169.     switch (loc.Which()) {
  170.     case CSeq_loc::e_Whole:
  171.         s_GetSeqLabel(loc.GetWhole(), label, scope, type);
  172.         return &loc.GetWhole();
  173.     case CSeq_loc::e_Int:
  174.         s_GetSeq_intervalLabel(loc.GetInt(), label, scope, type, last_id);
  175.         return &loc.GetInt().GetId();
  176.     case CSeq_loc::e_Packed_int:
  177.         {{
  178.             CConstRef<CSeq_id> id(last_id);
  179.             string str;
  180.             ITERATE (CSeq_loc::TPacked_int::Tdata, iter,
  181.                      loc.GetPacked_int().Get()) {
  182.                 const CSeq_interval& ival = **iter;
  183.                 if ( !str.empty() ) {
  184.                     str += ", ";
  185.                 }
  186.                 s_GetSeq_intervalLabel(ival, &str, scope, type, id.GetPointer());
  187.                 id.Reset(&ival.GetId());
  188.             }
  189.             *label += str;
  190.             return id.GetPointer();
  191.         }}
  192.     case CSeq_loc::e_Pnt:
  193.         {{
  194.             string str = NStr::IntToString(loc.GetPnt().GetPoint());
  195.             if ( !last_id  ||  !loc.GetPnt().GetId().Match(*last_id) ) {
  196.                 if ( !label->empty() ) {
  197.                     *label += "; ";
  198.                 }
  199.                 s_GetSeqLabel(loc.GetPnt().GetId(), label, scope, type);
  200.                 *label += ": ";
  201.             } else if ( !label->empty() ) {
  202.                 *label += ", ";
  203.             }
  204.             *label += str;
  205.             return &loc.GetPnt().GetId();
  206.         }}
  207.     case CSeq_loc::e_Packed_pnt:
  208.         {{
  209.             string str;
  210.             ITERATE (CSeq_loc::TPacked_pnt::TPoints, iter,
  211.                      loc.GetPacked_pnt().GetPoints()) {
  212.                 if ( !str.empty() ) {
  213.                     str += ", ";
  214.                 }
  215.                 str += NStr::IntToString(*iter);
  216.             }
  217.             if ( !last_id  ||  !loc.GetPnt().GetId().Match(*last_id) ) {
  218.                 if ( !label->empty() ) {
  219.                     *label += "; ";
  220.                 }
  221.                 s_GetSeqLabel(loc.GetPnt().GetId(), label, scope, type);
  222.                 *label += ": ";
  223.             } else if ( !label->empty() ) {
  224.                 *label += ", ";
  225.             }
  226.             *label += str;
  227.             return &loc.GetPnt().GetId();
  228.         }}
  229.     case CSeq_loc::e_Mix:
  230.         {{
  231.             string str;
  232.             ITERATE (CSeq_loc::TMix::Tdata, iter, loc.GetMix().Get()) {
  233.                 if ( !str.empty() ) {
  234.                     str += ", ";
  235.                 }
  236.                 last_id = s_GetLabel(**iter, &str, scope, type, last_id);
  237.             }
  238.             *label += str;
  239.             return last_id;
  240.         }}
  241.     default:
  242.         loc.GetLabel(label);
  243.         return NULL;
  244.     }
  245. }
  246. //
  247. //
  248. // seq-id handler
  249. //
  250. //
  251. class CSeq_idHandler : public ILabelHandler
  252. {
  253. public:
  254.     void GetLabel(const CObject& obj, string* label,
  255.                   CLabel::ELabelType type, CScope* scope) const
  256.     {
  257.         const CSeq_id* id = dynamic_cast<const CSeq_id*>(&obj);
  258.         if (id) {
  259.             s_GetSeqLabel(*id, label, scope, type);
  260.         }
  261.     }
  262. };
  263. //
  264. //
  265. // seq-loc handler
  266. //
  267. //
  268. class CSeq_locHandler : public ILabelHandler
  269. {
  270. public:
  271.     void GetLabel(const CObject& obj, string* label,
  272.                   CLabel::ELabelType type, CScope* scope) const
  273.     {
  274.         const CSeq_loc* loc = dynamic_cast<const CSeq_loc*>(&obj);
  275.         if (loc) {
  276.             s_GetLabel(*loc, label, scope, type);
  277.         }
  278.     }
  279. };
  280. //
  281. //
  282. // bioseq handler
  283. //
  284. //
  285. class CBioseqHandler : public ILabelHandler
  286. {
  287. public:
  288.     void GetLabel(const CObject& obj, string* label,
  289.                   CLabel::ELabelType type, CScope* scope) const
  290.     {
  291.         const CBioseq* bioseq = dynamic_cast<const CBioseq*>(&obj);
  292.         if (bioseq) {
  293.             switch (type) {
  294.             case CLabel::eType:
  295.                 bioseq->GetLabel(label, CBioseq::eType);
  296.                 break;
  297.             case CLabel::eContent:
  298.                 bioseq->GetLabel(label, CBioseq::eContent);
  299.                 break;
  300.             default:
  301.             case CLabel::eTooltipBrief:
  302.             case CLabel::eTooltipDetailed:
  303.             case CLabel::eBoth:
  304.                 bioseq->GetLabel(label, CBioseq::eBoth);
  305.                 break;
  306.             }
  307.         }
  308.     }
  309. };
  310. //
  311. //
  312. // Bioseq_set handler
  313. //
  314. //
  315. class CBioseq_setHandler : public ILabelHandler
  316. {
  317. public:
  318.     void GetLabel(const CObject& obj, string* label,
  319.                   CLabel::ELabelType type, CScope* scope) const
  320.     {
  321.         const CBioseq_set* bioseq_set = dynamic_cast<const CBioseq_set*>(&obj);
  322.         if (bioseq_set) {
  323.             switch (type) {
  324.             case CLabel::eType:
  325.                 bioseq_set->GetLabel(label, CBioseq_set::eType);
  326.                 break;
  327.             case CLabel::eContent:
  328.                 bioseq_set->GetLabel(label, CBioseq_set::eContent);
  329.                 break;
  330.             default:
  331.             case CLabel::eTooltipBrief:
  332.             case CLabel::eTooltipDetailed:
  333.             case CLabel::eBoth:
  334.                 bioseq_set->GetLabel(label, CBioseq_set::eBoth);
  335.                 break;
  336.             }
  337.         }
  338.     }
  339. };
  340. //
  341. //
  342. // seq-feat handler
  343. //
  344. //
  345. class CSeq_featHandler : public ILabelHandler
  346. {
  347. public:
  348.     void GetLabel(const CObject& obj, string* label,
  349.                   CLabel::ELabelType type, CScope* scope) const
  350.     {
  351.         const CSeq_feat* feat = dynamic_cast<const CSeq_feat*>(&obj);
  352.         if (feat) {
  353.             switch (type) {
  354.             case CLabel::eType:
  355.                 feature::GetLabel(*feat, label, feature::eType, scope);
  356.                 break;
  357.             case CLabel::eContent:
  358.                 feature::GetLabel(*feat, label, feature::eContent, scope);
  359.                 break;
  360.             default:
  361.             case CLabel::eTooltipBrief:
  362.             case CLabel::eTooltipDetailed:
  363.             case CLabel::eBoth:
  364.                 feature::GetLabel(*feat, label, feature::eBoth, scope);
  365.                 break;
  366.             }
  367.         }
  368.     }
  369. };
  370. //
  371. //
  372. // seq-entry handler
  373. //
  374. //
  375. class CSeq_entryHandler : public ILabelHandler
  376. {
  377. public:
  378.     void GetLabel(const CObject& obj, string* label,
  379.                   CLabel::ELabelType type, CScope* scope) const
  380.     {
  381.         const CSeq_entry* entry = dynamic_cast<const CSeq_entry*>(&obj);
  382.         if (entry) {
  383.             if (entry->IsSet()) {
  384.                 CLabel::GetLabel(entry->GetSet(), label, type, scope);
  385.             } else {
  386.                 CLabel::GetLabel(entry->GetSeq(), label, type, scope);
  387.             }
  388.         }
  389.     }
  390. };
  391. //
  392. //
  393. // seq-annots are complicated
  394. //
  395. //
  396. static void s_GetAnnotType(const CSeq_annot& annot, string* label)
  397. {
  398.     const CSeq_annot::TData& annot_data = annot.GetData();
  399.     switch (annot_data.Which()) {
  400.     case CSeq_annot::TData::e_Ftable:
  401.         *label += "Feature Table";
  402.         break;
  403.     case CSeq_annot::TData::e_Align:
  404.         *label += "Alignment";
  405.         break;
  406.     case CSeq_annot::TData::e_Graph:
  407.         *label += "Graph";
  408.         break;
  409.     case CSeq_annot::TData::e_Ids:
  410.         *label += "IDs";
  411.         break;
  412.     case CSeq_annot::TData::e_Locs:
  413.         *label += "Locations";
  414.         break;
  415.     default:
  416.         *label = "Annotation";
  417.         return;
  418.     }
  419. }
  420. static void s_GetAnnotContent(const CSeq_annot& annot, string* label)
  421. {
  422.     //
  423.     // check for formatted comments in descriptors first
  424.     //
  425.     if (annot.IsSetDesc()) {
  426.         ITERATE (CSeq_annot::TDesc::Tdata, iter, annot.GetDesc().Get()) {
  427.             switch ((*iter)->Which()) {
  428.             case CAnnotdesc::e_Title:
  429.                 *label = (*iter)->GetTitle();
  430.                 return;
  431.             default:
  432.                 break;
  433.             }
  434.         }
  435.     }
  436.     //
  437.     // default handling
  438.     //
  439.     string str;
  440.     size_t items = 0;
  441.     const CSeq_annot::TData& annot_data = annot.GetData();
  442.     switch (annot_data.Which()) {
  443.     case CSeq_annot::TData::e_Ftable:
  444.         str = "Feature Table, ";
  445.         items = annot_data.GetFtable().size();
  446.         break;
  447.     case CSeq_annot::TData::e_Align:
  448.         str = "Alignment, ";
  449.         items = annot_data.GetAlign().size();
  450.         break;
  451.     case CSeq_annot::TData::e_Graph:
  452.         str = "Graph, ";
  453.         items = annot_data.GetGraph().size();
  454.         break;
  455.     case CSeq_annot::TData::e_Ids:
  456.         str = "IDs, ";
  457.         items = annot_data.GetIds().size();
  458.         break;
  459.     case CSeq_annot::TData::e_Locs:
  460.         str = "Locations, ";
  461.         items = annot_data.GetLocs().size();
  462.         break;
  463.     default:
  464.         *label = "Annotation";
  465.         return;
  466.     }
  467.     str += NStr::IntToString(items);
  468.     if (items != 1) {
  469.         str += " entries";
  470.     } else {
  471.         str += " entry";
  472.     }
  473.     *label += str;
  474. }
  475. class CSeq_annotHandler : public ILabelHandler
  476. {
  477. public:
  478.     void GetLabel(const CObject& obj, string* label,
  479.                   CLabel::ELabelType type, CScope* scope) const
  480.     {
  481.         const CSeq_annot* annot  = dynamic_cast<const CSeq_annot*> (&obj);
  482.         if ( !annot ) {
  483.             return;
  484.         }
  485.         switch (type) {
  486.         case CLabel::eType:
  487.             s_GetAnnotType(*annot, label);
  488.             return;
  489.         case CLabel::eContent:
  490.             s_GetAnnotContent(*annot, label);
  491.             return;
  492.         case CLabel::eBoth:
  493.             s_GetAnnotType(*annot, label);
  494.             *label += ": ";
  495.             s_GetAnnotContent(*annot, label);
  496.             break;
  497.         }
  498.     }
  499. };
  500. static void s_GetAlignmentType(const CSeq_align& align, string* label)
  501. {
  502.     switch (align.GetSegs().Which()) {
  503.     default:
  504.     case CSeq_align::TSegs::e_not_set:
  505.         *label += "[Unknown]";
  506.         break;
  507.     case CSeq_align::TSegs::e_Denseg:
  508.         *label += "[Dense-seg]";
  509.         break;
  510.     case CSeq_align::TSegs::e_Dendiag:
  511.         *label += "[Dense-diag]";
  512.         break;
  513.     case CSeq_align::TSegs::e_Std:
  514.         *label += "[Standard-seg]";
  515.         break;
  516.     case CSeq_align::TSegs::e_Packed:
  517.         *label += "[Packed-seg]";
  518.         break;
  519.     case CSeq_align::TSegs::e_Disc:
  520.         *label += "[Discontinuous]";
  521.         break;
  522.     }
  523. }
  524. static void s_GetAlignmentContent(const CSeq_align& align, string* label,
  525.                                   CScope* scope)
  526. {
  527.     switch (align.GetSegs().Which()) {
  528.     default:
  529.     case CSeq_align::TSegs::e_not_set:
  530.         *label += "unknown contents";
  531.         break;
  532.     case CSeq_align::TSegs::e_Denseg:
  533.         {{
  534.             string str;
  535.             size_t seqs = align.GetSegs().GetDenseg().GetIds().size();
  536.             if (seqs < 4) {
  537.                 ITERATE (CDense_seg::TIds, iter,
  538.                          align.GetSegs().GetDenseg().GetIds()) {
  539.                     const CSeq_id* best_id = *iter;
  540.                     if (scope) {
  541.                         CBioseq_Handle handle =
  542.                             scope->GetBioseqHandle(**iter);
  543.                         if ( !handle ) {
  544.                             continue;
  545.                         }
  546.                         best_id = &sequence::GetId(handle,
  547.                                                    sequence::eGetId_Best);
  548.                     }
  549.                     if ( !str.empty() ) {
  550.                         str += " x ";
  551.                     }
  552.                     best_id->GetLabel(&str, CSeq_id::eContent);
  553.                 }
  554.             } else {
  555.                 str = NStr::IntToString(seqs) + " sequences.";
  556.             }
  557.             *label += str;
  558.         }}
  559.         break;
  560.     case CSeq_align::TSegs::e_Dendiag:
  561.         *label += "[Dense-diag]";
  562.         break;
  563.     case CSeq_align::TSegs::e_Std:
  564.         *label += "[Standard-seg]";
  565.         break;
  566.     case CSeq_align::TSegs::e_Packed:
  567.         *label += "[Packed-seg]";
  568.         break;
  569.     case CSeq_align::TSegs::e_Disc:
  570.         *label += "[Discontinuous]";
  571.         break;
  572.     }
  573. }
  574. class CSeq_alignHandler : public ILabelHandler
  575. {
  576. public:
  577.     void GetLabel(const CObject& obj, string* label,
  578.                   CLabel::ELabelType type, CScope* scope) const
  579.     {
  580.         const CSeq_align* align  = dynamic_cast<const CSeq_align*> (&obj);
  581.         if ( !align ) {
  582.             return;
  583.         }
  584.         switch (type) {
  585.         case CLabel::eType:
  586.             s_GetAlignmentType(*align, label);
  587.             return;
  588.         case CLabel::eContent:
  589.             s_GetAlignmentContent(*align, label, scope);
  590.             return;
  591.         case CLabel::eBoth:
  592.             s_GetAlignmentType(*align, label);
  593.             *label += ' ';
  594.             s_GetAlignmentContent(*align, label, scope);
  595.             break;
  596.         }
  597.     }
  598. };
  599. #if 0
  600. // retrieve a string label for an abstract object
  601. string CSeqUtils::GetLabel(const CObject& obj, CScope* scope)
  602. {
  603.     {{
  604.         // standard seq-annot label formatting
  605.         const CSeq_annot* annot  = dynamic_cast<const CSeq_annot*> (&obj);
  606.         if (annot) {
  607.             const CSeq_annot::TData& annot_data = annot->GetData();
  608.             string label;
  609.             size_t items = 0;
  610.             switch (annot_data.Which()) {
  611.             case CSeq_annot::TData::e_Ftable:
  612.                 label = "Feature Table, ";
  613.                 items = annot_data.GetFtable().size();
  614.                 break;
  615.             case CSeq_annot::TData::e_Align:
  616.                 label = "Alignment, ";
  617.                 items = annot_data.GetAlign().size();
  618.                 break;
  619.             case CSeq_annot::TData::e_Graph:
  620.                 label = "Graph, ";
  621.                 items = annot_data.GetGraph().size();
  622.                 break;
  623.             case CSeq_annot::TData::e_Ids:
  624.                 label = "IDs, ";
  625.                 items = annot_data.GetIds().size();
  626.                 break;
  627.             case CSeq_annot::TData::e_Locs:
  628.                 label = "Locations, ";
  629.                 items = annot_data.GetLocs().size();
  630.                 break;
  631.             default:
  632.                 return "Annotation";
  633.             }
  634.             label += NStr::IntToString(items);
  635.             if (items != 1) {
  636.                 label += " entries";
  637.             } else {
  638.                 label += " entry";
  639.             }
  640.             return label;
  641.         }
  642.     }}
  643.     {{
  644.         // standard seq-align label formatting
  645.         const CSeq_align* align  = dynamic_cast<const CSeq_align*> (&obj);
  646.         if (align) {
  647.             string label;
  648.             switch (align->GetSegs().Which()) {
  649.             case CSeq_align::TSegs::e_not_set:
  650.                 label = "Alignment: unknown type";
  651.                 break;
  652.             case CSeq_align::TSegs::e_Denseg:
  653.                 {{
  654.                     size_t seqs = align->GetSegs().GetDenseg().GetIds().size();
  655.                     if (seqs < 4) {
  656.                         ITERATE (CDense_seg::TIds, iter,
  657.                                  align->GetSegs().GetDenseg().GetIds()) {
  658.                             const CSeq_id* best_id = *iter;
  659.                             if (scope) {
  660.                                 CBioseq_Handle handle =
  661.                                     scope->GetBioseqHandle(**iter);
  662.                                 if ( !handle ) {
  663.                                     continue;
  664.                                 }
  665.                                 best_id =
  666.                                     &sequence::GetId(handle,
  667.                                                      sequence::eGetId_Best);
  668.                             }
  669.                             if ( !label.empty() ) {
  670.                                 label += " x ";
  671.                             }
  672.                             best_id->GetLabel(&label,
  673.                                               CSeq_id::eContent);
  674.                         }
  675.                         label = "Alignment: " + label;
  676.                     } else {
  677.                         label = "Alignment: " +
  678.                             NStr::IntToString(seqs) +
  679.                             " sequences.";
  680.                     }
  681.                 }}
  682.                 break;
  683.             case CSeq_align::TSegs::e_Dendiag:
  684.                 label = "Alignment: dense-diagonal";
  685.                 break;
  686.             case CSeq_align::TSegs::e_Std:
  687.                 label = "Alignment: standard-seg";
  688.                 break;
  689.             case CSeq_align::TSegs::e_Packed:
  690.                 label = "Alignment: packed-seg";
  691.                 break;
  692.             case CSeq_align::TSegs::e_Disc:
  693.                 label = "Alignment: discontinuous";
  694.                 break;
  695.             }
  696.             return label;
  697.         }
  698.     }}
  699.     {{
  700.         // generic unhandled CSerialObject
  701.         const CSerialObject* ser_obj =
  702.             dynamic_cast<const CSerialObject*> (&obj);
  703.         if (ser_obj) {
  704.             return ser_obj->GetThisTypeInfo()->GetName();
  705.         }
  706.     }}
  707.     /*{{  // should never be called that way: GetLabel(CLayoutObject obj);
  708.         // layout objects
  709.         const CLayoutObject* layout = dynamic_cast<const CLayoutObject*>(&obj);
  710.         if (layout) {
  711.             return GetLabel(layout->GetObject()), scope);
  712.         }
  713.     }}*/
  714.     // generic object handling
  715.     return ("Object");
  716. }
  717. #endif
  718. //
  719. // force registration at load
  720. //
  721. struct SForceRegister
  722. {
  723.     SForceRegister()
  724.     {
  725.         CLabel::RegisterLabelHandler(*CSeq_id::GetTypeInfo(),     *new CSeq_idHandler());
  726.         CLabel::RegisterLabelHandler(*CSeq_loc::GetTypeInfo(),    *new CSeq_locHandler());
  727.         CLabel::RegisterLabelHandler(*CBioseq::GetTypeInfo(),     *new CBioseqHandler());
  728.         CLabel::RegisterLabelHandler(*CBioseq_set::GetTypeInfo(), *new CBioseq_setHandler());
  729.         CLabel::RegisterLabelHandler(*CSeq_feat::GetTypeInfo(),   *new CSeq_featHandler());
  730.         CLabel::RegisterLabelHandler(*CSeq_entry::GetTypeInfo(),  *new CSeq_entryHandler());
  731.         CLabel::RegisterLabelHandler(*CSeq_annot::GetTypeInfo(),  *new CSeq_annotHandler());
  732.         CLabel::RegisterLabelHandler(*CSeq_align::GetTypeInfo(),  *new CSeq_alignHandler());
  733.     }
  734. };
  735. static SForceRegister sm_ForceRegistration;
  736. END_NCBI_SCOPE
  737. /*
  738.  * ===========================================================================
  739.  * $Log: label.cpp,v $
  740.  * Revision 1000.0  2004/06/01 21:20:46  gouriano
  741.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  742.  *
  743.  * Revision 1.4  2004/05/21 22:27:44  gorelenk
  744.  * Added PCH ncbi_pch.hpp
  745.  *
  746.  * Revision 1.3  2004/05/14 14:23:15  dicuccio
  747.  * When determining a label for a seq-id, only try to resolve GI-based seq-ids;
  748.  * all others can be considered "good enough"
  749.  *
  750.  * Revision 1.2  2004/05/07 15:38:54  dicuccio
  751.  * Fixed alignment labels lost in previous commit
  752.  *
  753.  * Revision 1.1  2004/04/30 11:48:16  dicuccio
  754.  * Initial commit - split out from src/gui/utils
  755.  *
  756.  * Revision 1.1  2004/04/20 19:16:33  dicuccio
  757.  * Initial revision
  758.  *
  759.  * ===========================================================================
  760.  */