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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: entrez_search_dlg.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 21:27:00  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: entrez_search_dlg.cpp,v 1000.0 2004/06/01 21:27:00 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.  *    CEntrezSearchDlg -- search Entrez databases for sequence information
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "entrez_search_dlg.hpp"
  41. #include "entrez_record_table.hpp"
  42. #include <gui/core/version.hpp>
  43. #include <gui/core/doc_manager.hpp>
  44. #include <gui/utils/message_box.hpp>
  45. #include <gui/utils/fltk_utils.hpp>
  46. #include <objects/entrez2/entrez2_client.hpp>
  47. #include <objects/entrez2/Entrez2_info.hpp>
  48. #include <objects/entrez2/Entrez2_eval_boolean.hpp>
  49. #include <objects/entrez2/Entrez2_boolean_reply.hpp>
  50. #include <objects/entrez2/Entrez2_boolean_exp.hpp>
  51. #include <objects/entrez2/Entrez2_boolean_element.hpp>
  52. #include <objects/entrez2/Entrez2_id_list.hpp>
  53. #include <objects/entrez2/Entrez2_docsum.hpp>
  54. #include <objects/entrez2/Entrez2_docsum_list.hpp>
  55. #include <objects/entrez2/Entrez2_docsum_data.hpp>
  56. #include <objects/entrez2/Entrez2_db_id.hpp>
  57. #include <objects/entrez2/Entrez2_limits.hpp>
  58. #include <objmgr/util/sequence.hpp>
  59. #include <gui/plugin/PluginMessage.hpp>
  60. #include <gui/plugin/PluginRequest.hpp>
  61. #include <gui/plugin/PluginCommand.hpp>
  62. #include <gui/plugin/PluginArg.hpp>
  63. #include <gui/plugin/PluginValue.hpp>
  64. #include <gui/core/plugin_utils.hpp>
  65. #include <gui/core/plugin_handle.hpp>
  66. #include <gui/core/plugin_registry.hpp>
  67. #include <gui/objutils/label.hpp>
  68. #include <serial/serial.hpp>
  69. #include <serial/objostr.hpp>
  70. BEGIN_NCBI_SCOPE
  71. USING_SCOPE(objects);
  72. #include "entrez_search_dlg_.cpp"
  73. CEntrezSearchDlg::CEntrezSearchDlg()
  74.     : m_Start(0)
  75.     , m_Visible(10)
  76.     , m_Length(0)
  77. {
  78.     m_Window.reset(x_CreateWindow());
  79.     CenterOnActive();
  80.     // retrieve our list of databases
  81.     list<string> dbs;
  82.     m_Table->GetDatabases(dbs);
  83.     int default_idx = 0;
  84.     ITERATE (list<string>, iter, dbs) {
  85.         int idx = m_DB->add(iter->c_str());
  86.         if (*iter == "Nucleotide") {
  87.             default_idx = idx;
  88.         }
  89.     }
  90.     m_DB->value(default_idx);
  91.     m_Table->SetDatabase(m_DB->text(default_idx));
  92.     m_Table->SetReporter(m_StatusBar);
  93.     m_StatusBar->PushMessage("Ready");
  94. }
  95. void CEntrezSearchDlg::SetQuery(const string& str)
  96. {
  97.     m_QueryStr->value(str.c_str());
  98.     x_OnChangeTerms();
  99. }
  100. void CEntrezSearchDlg::SetDB(const string& str)
  101. {
  102.     for (int i = 0;  i < m_DB->size();  ++i) {
  103.         const char* ptr = m_DB->text(i);
  104.         if (ptr  &&  str == ptr) {
  105.             m_DB->value(i);
  106.             x_OnChangeDB();
  107.             break;
  108.         }
  109.     }
  110. }
  111. void CEntrezSearchDlg::x_OnPrevious()
  112. {
  113.     if (m_Visible > 0  &&  m_Start > 0) {
  114.         m_Start  = max(0, m_Start - m_Visible);
  115.         x_OnSearch();
  116.     }
  117. }
  118. void CEntrezSearchDlg::x_OnNext()
  119. {
  120.     if (m_Visible > 0  &&  (m_Start + m_Visible < m_Length)) {
  121.         m_Start = min(m_Length - m_Visible, m_Start + m_Visible);
  122.         m_Start = max(0, m_Start);
  123.         x_OnSearch();
  124.     }
  125. }
  126. void CEntrezSearchDlg::x_OnLoad()
  127. {
  128.     CStatusBarGuard GUARD(*m_StatusBar, "Loading accessions...");
  129.     m_Table->OnNewDocument();
  130. #if 0
  131.     CPluginArg::TValues value_list;
  132.     // this is a hack to get the nice GUI effect we want
  133.     // we simply create a new default scope and use it to load our sequences
  134.     CRef<CScope> scope(new CScope(CDocManager::GetObjectManager()));
  135.     scope->AddDefaults();
  136.     try {
  137.         // gather our docsums and prepare to do the docsum -> seqid conversion
  138.         CEntrez2_docsum_list docsums;
  139.         for (size_t i = 0;  i < m_Table->GetRows();  ++i) {
  140.             if ( !m_Table->IsRowSelected(i) ) {
  141.                 continue;
  142.             }
  143.             CRef<CEntrez2_docsum> ref = m_Table->GetData(i);
  144.             docsums.SetList().push_back(ref);
  145.         }
  146.         docsums.SetCount(docsums.GetList().size());
  147.         // retrieve our handler and get our IDs.
  148.         const char* p = m_DB->text();
  149.         if ( !p ) {
  150.             throw runtime_error("No database chosen.");
  151.         }
  152.         IEntrezDBHandler& handler = m_DbManager.GetHandler(p);
  153.         IEntrezDBHandler::TIds ids = handler.GetSeqIds(docsums);
  154.         // force loading to make a nice GUI statement...
  155.         size_t idx = 0;
  156.         ITERATE (IEntrezDBHandler::TIds, iter, ids) {
  157.             string str;
  158.             try {
  159.                 CBioseq_Handle handle = scope->GetBioseqHandle(**iter);
  160.                 if (handle) {
  161.                     str = "Loaded sequence ";
  162.                     string id_str;
  163.                     CLabel::GetLabel(**iter, &id_str, CLabel::eDefault, scope);
  164.                     str += id_str;
  165.                     CRef<CPluginValue> value(new CPluginValue());
  166.                     value->SetString(id_str);
  167.                     value_list.push_back(value);
  168.                 }
  169.             }
  170.             catch (CException& e) {
  171.                 str = "Failed to load sequence ";
  172.                 CLabel::GetLabel(**iter, &str, CLabel::eDefault);
  173.                 str += ": " + e.GetMsg();
  174.             }
  175.             catch (...) {
  176.             }
  177.             if (str.empty()) {
  178.                 str = "Failed to load sequence ";
  179.                 CLabel::GetLabel(**iter, &str, CLabel::eDefault);
  180.             }
  181.             m_StatusBar->SetMessage(str);
  182.             ++idx;
  183.             m_StatusBar->SetPctCompleted(100 * idx / ids.size());
  184.         }
  185.     }
  186.     catch (CException& e) {
  187.         string str("Can't load accessions:n");
  188.         str += e.GetMsg();
  189.         NcbiMessageBox(str);
  190.     }
  191.     catch (std::exception& e) {
  192.         string str("Can't load accessions:n");
  193.         str += e.what();
  194.         NcbiMessageBox(str);
  195.     }
  196.     catch (...) {
  197.     }
  198.     if (value_list.size() != 0) {
  199.         CPluginHandle ph =
  200.             CPluginRegistry::GetPlugin("CDataPlugin_GenbankLoader");
  201.         if (ph) {
  202.             CRef<CPluginMessage> msg = ph.CreateMessage(eDataCommand_load);
  203.             CPluginArg& arg = msg->SetRequest().SetCommand()["acc"];
  204.             arg.SetList(value_list);
  205.             CPluginUtils::CallPlugin(*msg);
  206.         }
  207.     }
  208.     m_StatusBar->SetPctCompleted(0);
  209. #endif
  210. }
  211. void CEntrezSearchDlg::x_OnChangeTerms()
  212. {
  213.     m_Start = 0;
  214.     x_OnSearch();
  215. }
  216. void CEntrezSearchDlg::x_OnChangeVisible()
  217. {
  218.     m_Visible = m_VisibleRecords->mvalue()->argument();
  219.     x_OnSearch();
  220. }
  221. void CEntrezSearchDlg::x_OnChangeDB()
  222. {
  223.     // determine our database
  224.     m_Start = 0;
  225.     m_Table->SetDatabase(m_DB->text(m_DB->value()));
  226.     x_OnSearch();
  227. }
  228. void CEntrezSearchDlg::x_OnSearch()
  229. {
  230.     //
  231.     // first, retrieve a list of the docsums for our search
  232.     //
  233.     string query = m_QueryStr->value();
  234.     if ( query.empty() ) {
  235.         return;
  236.     }
  237.     try {
  238.         size_t total_count = 0;
  239.         m_Table->Query(query, total_count, m_Start, m_Visible);
  240.         m_Length = total_count;
  241.     }
  242.     catch (CException& e) {
  243.         string str("Query failed:n");
  244.         str += e.GetMsg();
  245.         NcbiMessageBox(str);
  246.     }
  247.     catch (std::exception& e) {
  248.         string str("Query failed:n");
  249.         str += e.what();
  250.         NcbiMessageBox(str);
  251.     }
  252.     catch (...) {
  253.         NcbiMessageBox("Query failed");
  254.     }
  255. #if 0
  256.     CFltkCursorGuard WAIT_GUARD;
  257.     CStatusBarGuard GUARD(*m_StatusBar, "Submitting search...");
  258.     //
  259.     // reset the list data
  260.     //
  261.     m_Table->Clear();
  262.     m_Table->redraw();
  263.     // get our handler
  264.     try {
  265.         const char* p = m_DB->text();
  266.         if (p) {
  267.             // set some limits - if num > 0, we assume it's correct
  268.             size_t start = 0;
  269.             size_t visible = 0;
  270.             size_t total = 0;
  271.             if (m_Visible > 0) {
  272.                 start = m_Start;
  273.                 visible = m_Visible;
  274.             }
  275.             IEntrezDBHandler& handler = m_DbManager.GetHandler(p);
  276.             CRef<objects::CEntrez2_docsum_list> docsums =
  277.                 handler.Query(query, total, start, visible);
  278.             m_Length = total;
  279.             //
  280.             // set our columns up correctly
  281.             //
  282.             vector<IEntrezDBHandler::SHeaderInfo> headers;
  283.             handler.GetHeaders(headers);
  284.             m_Table->SetCols(0);
  285.             ITERATE (vector<IEntrezDBHandler::SHeaderInfo>, iter, headers) {
  286.                 m_Table->SetColumn(iter - headers.begin(),
  287.                                    iter->name,
  288.                                    CEntrezRecordTable::eString,
  289.                                    FL_ALIGN_LEFT,
  290.                                    iter->rel_width);
  291.             }
  292.             //
  293.             // now, add the docsums to the list...
  294.             // we only want certain fields from each docsum
  295.             //
  296.             m_Table->SetRows(0);
  297.             if (visible) {
  298.                 m_Table->Reserve(visible);
  299.             } else {
  300.                 m_Table->Reserve(m_Length);
  301.             }
  302.             if (docsums.GetPointer()  &&
  303.                 docsums->IsSetList()  &&
  304.                 docsums->GetList().size() != 0) {
  305.                 vector<string> cols;
  306.                 size_t row = 0;
  307.                 NON_CONST_ITERATE(CEntrez2_docsum_list::TList, iter,
  308.                                   docsums->SetList()) {
  309.                     const CEntrez2_docsum& docsum = **iter;
  310.                     cols.clear();
  311.                     handler.Format(docsum, cols);
  312.                     ITERATE (vector<string>, col_iter, cols) {
  313.                         m_Table->SetCell(row, col_iter - cols.begin(),
  314.                                          *col_iter);
  315.                     }
  316.                     m_Table->SetData(row).Reset(*iter);
  317.                     ++row;
  318.                 }
  319.             }
  320.             //
  321.             // add a nice status message
  322.             //
  323.             m_TitleStr = "Search Results";
  324.             if (docsums.GetPointer()  &&  docsums->GetCount() != 0) {
  325.                 int start = m_Start + 1;
  326.                 int end   = start + m_Visible;
  327.                 if (m_Visible == -1) {
  328.                     end = start + docsums->GetCount();
  329.                 }
  330.                 end -= 1;
  331.                 end = min(end, m_Start + docsums->GetCount());
  332.                 m_TitleStr += " - Showing ";
  333.                 m_TitleStr += NStr::IntToString(start) + " - ";
  334.                 m_TitleStr += NStr::IntToString(end) + " of ";
  335.                 m_TitleStr += NStr::IntToString(m_Length);
  336.                 m_TitleStr += " matching records.";
  337.             } else {
  338.                 m_TitleStr += " - No records found.";
  339.             }
  340.             m_Window->label(m_TitleStr.c_str());
  341.             m_StatusBar->SetPctCompleted(0);
  342.         }
  343.     }
  344.     catch (CException& e) {
  345.         string str("Can't submit query:n");
  346.         str += e.GetMsg();
  347.         NcbiMessageBox(str);
  348.     }
  349.     catch (std::exception& e) {
  350.         string str("Can't submit query:n");
  351.         str += e.what();
  352.         NcbiMessageBox(str);
  353.     }
  354.     catch (...) {
  355.     }
  356. #endif
  357. }
  358. END_NCBI_SCOPE
  359. /*
  360.  * ===========================================================================
  361.  * $Log: entrez_search_dlg.cpp,v $
  362.  * Revision 1000.0  2004/06/01 21:27:00  gouriano
  363.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.3
  364.  *
  365.  * Revision 1.3  2004/05/28 15:06:14  dicuccio
  366.  * Adjusted .fl files: include ncbi_pch.hpp, added CVS Id tags, fixed fonts
  367.  *
  368.  * Revision 1.2  2004/05/26 02:06:29  ucko
  369.  * Explicitly cast through int when converting between enum types.
  370.  *
  371.  * Revision 1.1  2004/05/25 17:15:40  dicuccio
  372.  * Initial revision - moved over from old GenBank search
  373.  *
  374.  * Revision 1.21  2004/05/07 15:35:13  dicuccio
  375.  * Fixed unsigned/signed comparison
  376.  *
  377.  * Revision 1.20  2004/03/05 17:36:41  dicuccio
  378.  * Use sequence::GetId() instead of CSeq_id::GetStringDescr()
  379.  *
  380.  * Revision 1.19  2004/01/20 18:16:48  dicuccio
  381.  * Chnaged to match new API in CTablePanel
  382.  *
  383.  * Revision 1.18  2004/01/06 20:15:54  dicuccio
  384.  * Use CFltkCursorGuard on load / import / search
  385.  *
  386.  * Revision 1.17  2003/12/30 15:02:57  dicuccio
  387.  * Fixed bug in progress bar - advance proportional to actual number of loaded sequences
  388.  *
  389.  * Revision 1.16  2003/12/22 19:29:20  dicuccio
  390.  * Added explicit passing of query string and database
  391.  *
  392.  * Revision 1.15  2003/12/10 15:10:04  dicuccio
  393.  * Fixed numerous bugs in search: forgot to assign docsum to data; fixed bugs in
  394.  * resetting counts of docsums
  395.  *
  396.  * Revision 1.14  2003/12/09 15:47:21  dicuccio
  397.  * Use CDialog::CenterOnActive() to center the window
  398.  *
  399.  * Revision 1.13  2003/12/05 13:07:53  dicuccio
  400.  * Split management interface into a separate plugin.  Fixed linker error
  401.  * introduced with status bar
  402.  *
  403.  * Revision 1.12  2003/12/04 18:14:07  dicuccio
  404.  * Lots of updates.  Added a status bar to track actions.  General code-clean-up
  405.  *
  406.  * Revision 1.11  2003/11/24 15:45:35  dicuccio
  407.  * Renamed CVersion to CPluginVersion
  408.  *
  409.  * Revision 1.10  2003/11/04 17:49:24  dicuccio
  410.  * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  411.  * CPluginCommand/CPluginReply
  412.  *
  413.  * Revision 1.9  2003/10/14 12:48:11  dicuccio
  414.  * Lots of clean-ups.  Added code for correctly handling client timeouts.
  415.  *
  416.  * Revision 1.8  2003/10/07 13:47:05  dicuccio
  417.  * Renamed CPluginURL* to CPluginValue*
  418.  *
  419.  * Revision 1.7  2003/09/30 19:53:18  dicuccio
  420.  * Wrap entrez query in try/catch to avoid unseemly errors on failed search
  421.  *
  422.  * Revision 1.6  2003/09/17 16:26:56  dicuccio
  423.  * Removed lines between cells in table.  Removed cancel button
  424.  *
  425.  * Revision 1.5  2003/09/16 14:08:37  dicuccio
  426.  * Changed retrieval to use UID as gi instead of searching for a docsum field
  427.  *
  428.  * Revision 1.4  2003/08/18 14:44:59  dicuccio
  429.  * Added PopSet as a search database option.  Fixed mapping og genomes <->
  430.  * proteins
  431.  *
  432.  * Revision 1.3  2003/08/05 17:07:18  dicuccio
  433.  * Changed calling semantics for the message queue - pass by reference, not
  434.  * CConstRef<>
  435.  *
  436.  * Revision 1.2  2003/08/01 14:37:20  dicuccio
  437.  * Solved issue with plugin communication - make sure that sequences are loaded
  438.  * when the load button is clicked, not when the dialog closes
  439.  *
  440.  * Revision 1.1  2003/07/31 17:04:00  dicuccio
  441.  * Added GenBank search
  442.  *
  443.  * ===========================================================================
  444.  */