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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: view_crossalign.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 20:59:09  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.36
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: view_crossalign.cpp,v 1000.5 2004/06/01 20:59:09 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:  Vlad Lebedev
  35.  *
  36.  * File Description:
  37.  *    User-modifiable implementation file for extension 
  38.  *    of Cross Alignment viewer
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include "view_crossalign.hpp"
  42. #include <gui/core/plugin_utils.hpp>
  43. #include <gui/core/version.hpp>
  44. #include <gui/plugin/PluginRequest.hpp>
  45. #include <gui/plugin/PluginCommand.hpp>
  46. #include <gui/plugin/PluginCommandSet.hpp>
  47. #include <gui/plugin/PluginInfo.hpp>
  48. #include <gui/plugin/PluginValue.hpp>
  49. #include <gui/objutils/utils.hpp>
  50. #include <objmgr/util/sequence.hpp>
  51. BEGIN_NCBI_SCOPE
  52. // We include the generated _.cpp file here.  This avoids a nasty bug in some
  53. // versions of gcc in which inline functions are not intantiated.
  54. #include "view_crossalign_.cpp"
  55. void CAlnCrossAlignView::GetInfo(CPluginInfo& info)
  56. {
  57.     info.Reset();
  58.     // version info macro
  59.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  60.                  string(__DATE__) + " " + string(__TIME__),
  61.                  "CAlnCrossAlignView",
  62.                  "Cross Alignment Viewer",
  63.                  "Cross Alignment Viewer", "");
  64.     // command info
  65.     CPluginCommandSet& cmds = info.SetCommands();
  66.     CPluginCommand&    args = cmds.AddViewCommand(eViewCommand_new_view);
  67.     args.AddArgument("alignments", "Alignments to merge and render",
  68.                      CSeq_annot::GetTypeInfo(),
  69.                      CPluginArg::TData::e_Single);
  70.     args.SetConstraint("alignments",
  71.                        *CPluginValueConstraint::CreateAnnotType
  72.                        (CSeq_annot::TData::e_Align));
  73. }
  74. CAlnCrossAlignView::CAlnCrossAlignView(const CPluginMessage& msg,
  75.                                        const string& pool_name)
  76.     : CAlnView()
  77. {
  78.     m_Window.reset(x_CreateWindow());
  79.     // set our core components
  80.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  81.     const CPluginArg& arg = args["alignments"];
  82.     // extract the alignments from the argument
  83.     const CSeq_annot* annot =
  84.         dynamic_cast<const CSeq_annot*>(arg.GetObject());
  85.     const IDocument* doc = arg.GetDocument();
  86.     if (annot  &&  doc) {
  87.         m_AnnotData.Reset(annot);
  88.         x_SetDocument(*doc);
  89.     }
  90. }
  91. void CAlnCrossAlignView::OnDocumentChanged()
  92. {
  93.     if (!m_Document) {
  94.         return;
  95.     }
  96.     SetTitle(m_Document->GetShortTitle() + ": " + GetTitle());
  97.     // create our datasource
  98.     m_DataSource.Reset(
  99.             new CCrossAlnDataSource(*m_AnnotData, m_Document->GetScope()));
  100.     CCrossAlnDataSource::TIdRefCont all_ids =  m_DataSource->GetSeqIDs();
  101.     // choosing sequences to display
  102.     m_SeqChoice1->clear();
  103.     m_SeqChoice2->clear();
  104.     
  105.     if(all_ids.size() >1 )  {
  106.         CCrossAlnDataSource::TIdRefCont::const_iterator  it = all_ids.begin();
  107.         CConstRef<CSeq_id>   s_id(*it);
  108.         CConstRef<CSeq_id>   q_id(*(++it));
  109.         m_DataSource->SelectIds(s_id, q_id);
  110.         m_AlnWidget->SetDataSource(m_DataSource.GetPointer());
  111.         
  112.         int i_q = -1, i_s = -1; 
  113.         for(unsigned int i = 0; i < all_ids.size(); i++ ) {
  114.             CConstRef<CSeq_id> id = all_ids[i];
  115.             if(id->Match(*q_id)) {
  116.                 i_q = i;
  117.             }
  118.             if(id->Match(*s_id)) {
  119.                 i_s = i;
  120.             }
  121.         
  122.             CBioseq_Handle handle = m_Document->GetScope().GetBioseqHandle(*id);
  123.             const CSeq_id& best_id =
  124.                 sequence::GetId(handle, sequence::eGetId_Best);
  125.             string str;
  126.             best_id.GetLabel(&str);
  127.             m_SeqChoice1->add(str.c_str());
  128.             m_SeqChoice2->add(str.c_str());
  129.         }
  130.         m_SeqChoice1->value(i_q);
  131.         m_SeqChoice2->value(i_s);
  132.     }    
  133. }
  134. void CAlnCrossAlignView::x_OnSelectionChanged()
  135. {
  136.     int idx1 = m_SeqChoice1->value();
  137.     int idx2 = m_SeqChoice2->value();
  138.     
  139.     CCrossAlnDataSource::TIdRefCont all_ids =  m_DataSource->GetSeqIDs();
  140.     m_DataSource->SelectIds(all_ids[idx1], all_ids[idx2]);                
  141.     m_AlnWidget->Update();
  142. }
  143. void CAlnCrossAlignView::x_OnFitToWindow()
  144. {
  145.     m_AlnWidget->FitToWindow();
  146. }
  147. void CAlnCrossAlignView::x_OnZoomToSequence()
  148. {
  149.     m_AlnWidget->ZoomToSequence();
  150. }
  151. void CAlnCrossAlignView::x_OnShowMismatches()
  152. {
  153.     //bool show = m_Menu->mvalue()->value() ? true : false;
  154.     //m_AlnWidget->ShowSequenceAsDots(show);
  155. }
  156. const string& CAlnCrossAlignView::GetTitle(void) const
  157. {
  158.     static string s_str("Cross Alignment View");
  159.     return s_str;
  160. }
  161. void CAlnCrossAlignView::x_OnFileClose()
  162. {
  163.     Hide();
  164. }
  165. void CAlnCrossAlignView::x_OnHelp()
  166. {
  167. }
  168. END_NCBI_SCOPE
  169. /*
  170.  * ===========================================================================
  171.  * $Log: view_crossalign.cpp,v $
  172.  * Revision 1000.5  2004/06/01 20:59:09  gouriano
  173.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.36
  174.  *
  175.  * Revision 1.36  2004/05/21 22:27:49  gorelenk
  176.  * Added PCH ncbi_pch.hpp
  177.  *
  178.  * Revision 1.35  2004/05/03 13:30:17  dicuccio
  179.  * gui/utils --> gui/objutils where needed
  180.  *
  181.  * Revision 1.34  2004/04/07 13:05:10  dicuccio
  182.  * Changed view API - require CPluginMessage instead of CPluginArgSet
  183.  *
  184.  * Revision 1.33  2004/03/05 17:37:11  dicuccio
  185.  * Use sequence::GetId() instead of CSeq_id::GetStringDescr()
  186.  *
  187.  * Revision 1.32  2003/12/22 19:33:13  dicuccio
  188.  * Lots of changes.  Changed to match new APIs in IView.  Added better handling of messages received from other views
  189.  *
  190.  * Revision 1.31  2003/12/22 16:50:07  lebedev
  191.  * Do not use ViewMenuManager (no menu present)
  192.  *
  193.  * Revision 1.30  2003/12/22 13:28:21  lebedev
  194.  * Plugin updated to use new CrossAlignment Widget
  195.  *
  196.  * Revision 1.29  2003/11/24 15:45:42  dicuccio
  197.  * Renamed CVersion to CPluginVersion
  198.  *
  199.  * Revision 1.28  2003/11/19 20:45:26  friedman
  200.  * Added handling a visible range change event
  201.  *
  202.  * Revision 1.27  2003/11/04 12:51:27  friedman
  203.  * Added event message pool callbacks for the document all-view message pool.
  204.  *
  205.  * Revision 1.26  2003/10/27 20:03:26  dicuccio
  206.  * Rearranged Update() to be consistent
  207.  *
  208.  * Revision 1.25  2003/10/07 13:47:06  dicuccio
  209.  * Renamed CPluginURL* to CPluginValue*
  210.  *
  211.  * Revision 1.24  2003/09/24 18:26:46  dicuccio
  212.  * Large clean-ups to alignment viewers.  Reimplemented data sources and alignment
  213.  * generation mechanism to be more generic.
  214.  *
  215.  * Revision 1.23  2003/09/04 14:54:21  dicuccio
  216.  * Use IDocument instead of CDocument.  Changed APIs to match changes in IView
  217.  *
  218.  * Revision 1.22  2003/07/22 15:32:16  dicuccio
  219.  * Changed to make use of new API in plugin_utils.hpp - GetArgValue()
  220.  *
  221.  * Revision 1.21  2003/06/26 15:33:41  dicuccio
  222.  * Moved GetURLValue() from PluginURL.hpp to plugin_utils.hpp.  Fixed compilation
  223.  * errors relating to missing #includes
  224.  *
  225.  * Revision 1.20  2003/06/25 17:02:59  dicuccio
  226.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  227.  * implementation file.  Lots of #include file clean-ups.
  228.  *
  229.  * Revision 1.19  2003/06/23 13:23:13  dicuccio
  230.  * Deprecated seq_utils.[h,c]pp - moved functions into gui.utils/utils.hpp
  231.  *
  232.  * Revision 1.18  2003/06/20 14:53:52  dicuccio
  233.  * Revised plugin registration - moved GetInfo() into the plugin handler
  234.  *
  235.  * Revision 1.17  2003/06/02 16:06:22  dicuccio
  236.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  237.  *     - src/objects/asn2asn --> arc/app/asn2asn
  238.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  239.  *     - src/objects/objmgr --> src/objmgr
  240.  *     - src/objects/util --> src/objmgr/util
  241.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  242.  *     - src/objects/flat --> src/objtools/flat
  243.  *     - src/objects/validator --> src/objtools/validator
  244.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  245.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  246.  * replaces the three libmmdb? libs.
  247.  *
  248.  * Revision 1.16  2003/05/22 18:50:04  dicuccio
  249.  * Standardized construction, argument specification for all alignment views
  250.  *
  251.  * Revision 1.15  2003/05/19 13:43:32  dicuccio
  252.  * Moved gui/core/plugin --> gui/plugin/.  Merged core libraries into libgui_core
  253.  *
  254.  * Revision 1.14  2003/04/24 16:40:38  dicuccio
  255.  * Updated to reflect changes in plugin API.  Added new common alignment view base
  256.  * class - handles notions of creating alignment manager in a standard way
  257.  *
  258.  * Revision 1.13  2003/03/17 14:54:14  dicuccio
  259.  * Changed base class CView - added member variable for FLTK gui component for
  260.  * child windows, which is now maintained via an auto_ptr<>.  Eliminated
  261.  * Show()/Hide() as a pure virtual requirement.
  262.  *
  263.  * Revision 1.12  2003/03/07 13:35:59  dicuccio
  264.  * Fixed titles in drop-down menu for sequence selection
  265.  *
  266.  * Revision 1.11  2003/03/04 20:08:36  lebedev
  267.  * Prepare Cross Alignment Viewer for MDI
  268.  *
  269.  * Revision 1.10  2003/03/03 18:31:22  dicuccio
  270.  * Deprecated CAlnUtils::GetTitle() in favor of sequence::GetTitle()
  271.  *
  272.  * Revision 1.9  2003/02/20 19:49:58  dicuccio
  273.  * Created new plugin architecture, based on ASN.1 spec.  Moved GBENCH frameowrk
  274.  * over to use new plugin architecture.
  275.  *
  276.  * Revision 1.8  2003/01/17 18:38:49  lebedev
  277.  * Menu item to hide matching sequence letters added
  278.  *
  279.  * Revision 1.7  2003/01/15 21:35:43  lebedev
  280.  * Zoom to Sequence menu item added
  281.  *
  282.  * Revision 1.6  2003/01/13 13:10:08  dicuccio
  283.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace ncbi.
  284.  * Moved all FLUID-generated code into namespace ncbi.
  285.  *
  286.  * Revision 1.5  2003/01/09 14:50:41  dicuccio
  287.  * Use 'const CBioseq_Handle&' instead of 'CBioseq_Handle&'
  288.  *
  289.  * Revision 1.4  2002/12/20 19:52:21  dicuccio
  290.  * Cnaged TRange::SetFrom()/TRange::SetTo() --> TRange::Set()
  291.  *
  292.  * Revision 1.3  2002/12/20 19:22:51  dicuccio
  293.  * Lots of changes to the menus.  Standardized the menu syntax across all views.
  294.  * Changed to use new dynamic menu managers.
  295.  *
  296.  * Revision 1.2  2002/12/13 13:18:52  dicuccio
  297.  * Added work-around for inlining problems in some versions of gcc: directly
  298.  * include a FLUID-generated '*_.cpp' file in the corresponding '*.cpp' and
  299.  * remove this file from the build.  Thanks Aaron!
  300.  *
  301.  * Revision 1.1  2002/12/05 19:07:20  lebedev
  302.  * Initial revision
  303.  *
  304.  * ===========================================================================
  305.  */