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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: entrez_record_table.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 21:26:40  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: entrez_record_table.cpp,v 1000.0 2004/06/01 21:26:40 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.  *    CGBSearchPlugin - load sequence information form Genbank.
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/widgets/fl/menu.hpp>
  41. #include <gui/core/algo_menu.hpp>
  42. #include "entrez_record_table.hpp"
  43. #include <gui/utils/message_box.hpp>
  44. #include <gui/objutils/label.hpp>
  45. #include <gui/core/doc_manager.hpp>
  46. #include <gui/core/plugin_handle.hpp>
  47. #include <gui/core/plugin_registry.hpp>
  48. #include <gui/core/plugin_utils.hpp>
  49. #include <gui/plugin/PluginArg.hpp>
  50. #include <gui/plugin/PluginValue.hpp>
  51. #include <objmgr/bioseq_handle.hpp>
  52. #include <objmgr/scope.hpp>
  53. #include <objects/seq/Seq_annot.hpp>
  54. BEGIN_NCBI_SCOPE
  55. USING_SCOPE(objects);
  56. CEntrezRecordTable::CEntrezRecordTable(int x, int y, int w, int h,
  57.                                        const char* label)
  58.     : TParent(x, y, w, h, label)
  59.     , m_Reporter(NULL)
  60. {
  61.     m_Handler.StandardConfig();
  62.     SetCellBox(CFltkUtils::eBox_RightEdge);
  63. }
  64. void CEntrezRecordTable::SetReporter(IReporter* reporter)
  65. {
  66.     m_Reporter = reporter;
  67. }
  68. bool CEntrezRecordTable::SetDatabase(const string& db)
  69. {
  70.     m_DbName = db;
  71.     try {
  72.         IEntrezDBHandler& handler = m_DbManager.GetHandler(m_DbName);
  73.         return true;
  74.     }
  75.     catch (...) {
  76.         return false;
  77.     }
  78. }
  79. void CEntrezRecordTable::GetDatabases(list<string>& db)
  80. {
  81.     CEntrezDBManager::TEntries entries;
  82.     m_DbManager.GetDatabases(entries);
  83.     ITERATE (CEntrezDBManager::TEntries, iter, entries) {
  84.         db.push_back(iter->visible_db_name);
  85.     }
  86. }
  87. void CEntrezRecordTable::Query(const string& terms, size_t& total_count,
  88.                                size_t start, size_t visible)
  89. {
  90.     Clear();
  91.     redraw();
  92.     // get our handler
  93.     try {
  94.         // set some limits - if num > 0, we assume it's correct
  95.         IEntrezDBHandler& handler = m_DbManager.GetHandler(m_DbName);
  96.         CRef<objects::CEntrez2_docsum_list> docsums =
  97.             handler.Query(terms, total_count, start, visible);
  98.         //
  99.         // set our columns up correctly
  100.         //
  101.         vector<IEntrezDBHandler::SHeaderInfo> headers;
  102.         handler.GetHeaders(headers);
  103.         SetCols(0);
  104.         ITERATE (vector<IEntrezDBHandler::SHeaderInfo>, iter, headers) {
  105.             SetColumn(iter - headers.begin(),
  106.                       iter->name, eString, FL_ALIGN_LEFT,
  107.                       iter->rel_width);
  108.         }
  109.         //
  110.         // now, add the docsums to the list...
  111.         // we only want certain fields from each docsum
  112.         //
  113.         SetRows(0);
  114.         if (visible) {
  115.             Reserve(visible);
  116.         } else {
  117.             Reserve(total_count);
  118.         }
  119.         if (docsums.GetPointer()  &&
  120.             docsums->IsSetList()  &&
  121.             docsums->GetList().size() != 0) {
  122.             vector<string> cols;
  123.             size_t row = 0;
  124.             NON_CONST_ITERATE(CEntrez2_docsum_list::TList, iter,
  125.                                 docsums->SetList()) {
  126.                 const CEntrez2_docsum& docsum = **iter;
  127.                 cols.clear();
  128.                 handler.Format(docsum, cols);
  129.                 ITERATE (vector<string>, col_iter, cols) {
  130.                     SetCell(row, col_iter - cols.begin(), *col_iter);
  131.                 }
  132.                 SetData(row).Reset(*iter);
  133.                 ++row;
  134.             }
  135.         }
  136.         //
  137.         // add a nice status message
  138.         //
  139.         if (m_Reporter) {
  140.             string str("Search Results");
  141.             if (docsums.GetPointer()  &&  docsums->GetCount() != 0) {
  142.                 int start_idx = start + 1;
  143.                 int end_idx   = start_idx + visible;
  144.                 if (visible == -1) {
  145.                     end_idx = start_idx + docsums->GetCount();
  146.                 }
  147.                 end_idx -= 1;
  148.                 end_idx = min(end_idx, start_idx + docsums->GetCount());
  149.                 str += " - Showing ";
  150.                 str += NStr::IntToString(start_idx) + " - ";
  151.                 str += NStr::IntToString(end_idx) + " of ";
  152.                 str += NStr::IntToString(total_count);
  153.                 str += " matching records.";
  154.             } else {
  155.                 str += " - No records found.";
  156.             }
  157.             m_Reporter->SetMessage(str);
  158.             m_Reporter->SetPctCompleted(0);
  159.         }
  160.         // finally, save our query string
  161.         m_Query = terms;
  162.     }
  163.     catch (CException& e) {
  164.         string str("Can't submit query:n");
  165.         str += e.GetMsg();
  166.         NcbiMessageBox(str);
  167.     }
  168.     catch (std::exception& e) {
  169.         string str("Can't submit query:n");
  170.         str += e.what();
  171.         NcbiMessageBox(str);
  172.     }
  173.     catch (...) {
  174.     }
  175. }
  176. #if 0
  177. void CEntrezRecordTable::GetSelections(TConstScopedObjects& objs) const
  178. {
  179.     CEntrez2_docsum_list docsums;
  180.     for (size_t i = 0;  i < GetRows();  ++i) {
  181.         if ( !IsRowSelected(i) ) {
  182.             continue;
  183.         }
  184.         CRef<CEntrez2_docsum> ref = GetData(i);
  185.         docsums.SetList().push_back(ref);
  186.     }
  187.     docsums.SetCount(docsums.GetList().size());
  188.     // retrieve our handler and get our IDs.
  189.     try {
  190.         IEntrezDBHandler& handler = m_DbManager.GetHandler(m_DbName);
  191.         IEntrezDBHandler::TIds ids = handler.GetSeqIds(docsums);
  192.         ITERATE (IEntrezDBHandler::TIds, iter, ids) {
  193.             SConstScopedObject obj;
  194.             obj.object.Reset(iter->GetPointer());
  195.             objs.push_back(obj);
  196.         }
  197.     }
  198.     catch (...) {
  199.     }
  200. }
  201. void CEntrezRecordTable::SetSelections(const TConstScopedObjects& objs)
  202. {
  203. }
  204. #endif
  205. void CEntrezRecordTable::OnNewDocument()
  206. {
  207.     try {
  208.         IEntrezDBHandler& handler = m_DbManager.GetHandler(m_DbName);
  209.         CPluginArg::TValues value_list;
  210.         for (size_t i = 0;  i < GetRows();  ++i) {
  211.             if ( !IsRowSelected(i) ) {
  212.                 continue;
  213.             }
  214.             CRef<CScope> scope(new CScope(CDocManager::GetObjectManager()));
  215.             scope->AddDefaults();
  216.             IEntrezDBHandler::TIds ids = handler.GetSeqIds(*GetData(i));
  217.             size_t idx = 0;
  218.             ITERATE (IEntrezDBHandler::TIds, iter, ids) {
  219.                 const CSeq_id& id = **iter;
  220.                 CBioseq_Handle handle = scope->GetBioseqHandle(id);
  221.                 if (handle) {
  222.                     string id_str;
  223.                     CLabel::GetLabel(id, &id_str, CLabel::eDefault, scope);
  224.                     CRef<CPluginValue> value(new CPluginValue());
  225.                     value->SetString(id_str);
  226.                     value_list.push_back(value);
  227.                     if (m_Reporter) {
  228.                         string msg("Loaded sequence ");
  229.                         msg += id_str;
  230.                         m_Reporter->SetMessage(msg);
  231.                         int pct = 100 * ++idx / ids.size();
  232.                         m_Reporter->SetPctCompleted(pct);
  233.                     }
  234.                 }
  235.             }
  236.         }
  237.         // now load them all
  238.         CPluginHandle ph =
  239.             CPluginRegistry::GetPlugin("CDataPlugin_GenbankLoader");
  240.         if (ph) {
  241.             CRef<CPluginMessage> msg = ph.CreateMessage(eDataCommand_load);
  242.             CPluginArg& arg = msg->SetRequest().SetCommand()["acc"];
  243.             arg.SetList(value_list);
  244.             CPluginUtils::CallPlugin(*msg);
  245.         }
  246.     }
  247.     catch (...) {
  248.     }
  249. }
  250. void CEntrezRecordTable::OnNewBulkDocument()
  251. {
  252.     try {
  253.         CFltkCursorGuard WAIT_GUARD;
  254.         IEntrezDBHandler& handler = m_DbManager.GetHandler(m_DbName);
  255.         CPluginArg::TValues value_list;
  256.         IEntrezDBHandler::TIds ids;
  257.         for (size_t i = 0;  i < GetRows();  ++i) {
  258.             if ( !IsRowSelected(i) ) {
  259.                 continue;
  260.             }
  261.             IEntrezDBHandler::TIds temp = handler.GetSeqIds(*GetData(i));
  262.             ids.insert(ids.end(), temp.begin(), temp.end());
  263.         }
  264.         CRef<CSeq_annot> annot(new CSeq_annot());
  265.         string title("Query Results: '");
  266.         title += m_Query;
  267.         title += "', ";
  268.         title += NStr::IntToString(ids.size());
  269.         title += " sequences";
  270.         annot->AddTitle(title);
  271.         annot->SetCreateDate(CTime(CTime::eCurrent));
  272.         annot->SetData().SetIds().swap(ids);
  273.         CRef<CScope> scope(new CScope(CDocManager::GetObjectManager()));
  274.         scope->AddDefaults();
  275.         CDocManager::CreateDocument(*scope, *annot);
  276.         CDocManager::UpdateAllViews();
  277.     }
  278.     catch (...) {
  279.     }
  280. }
  281. void CEntrezRecordTable::OnLoadNuclNeighbors()
  282. {
  283. }
  284. void CEntrezRecordTable::OnLoadProtNeighbors()
  285. {
  286. }
  287. enum EEntrezResultsDlgCommands {
  288.     eCmd_NewDocument = eBaseCmdLast + 200,
  289.     eCmd_NewBatchDocument,
  290.     eCmd_LoadNucleotideNeighbors,
  291.     eCmd_LoadProteinNeighbors
  292. };
  293. static
  294. DEFINE_MENU(PopupMenu)
  295.     MENU_ITEM(eCmd_NewDocument,             "Open in New Document")
  296.     MENU_ITEM(eCmd_NewBatchDocument,        "Open in Combined Document")
  297.     MENU_ITEM(eCmd_LoadNucleotideNeighbors, "Open Nucleotide Neighbors")
  298.     MENU_ITEM(eCmd_LoadProteinNeighbors,    "Open Protein Neighbors")
  299. END_MENU()
  300. BEGIN_CMD_MAP(CEntrezRecordTable, CCommandTarget)
  301.     ON_COMMAND(eCmd_NewDocument,             &CEntrezRecordTable::OnNewDocument)
  302.     ON_COMMAND(eCmd_NewBatchDocument,        &CEntrezRecordTable::OnNewBulkDocument)
  303.     ON_COMMAND(eCmd_LoadNucleotideNeighbors, &CEntrezRecordTable::OnLoadNuclNeighbors)
  304.     ON_COMMAND(eCmd_LoadProteinNeighbors,    &CEntrezRecordTable::OnLoadProtNeighbors)
  305. END_CMD_MAP()
  306. int CEntrezRecordTable::handle(int event)
  307. {
  308.     m_Handler.OnFLTKEvent(event);
  309.     switch (m_Handler.GetGUISignal()) {
  310.     case CGUIEvent::ePopupSignal:
  311.         {{
  312.             CPopupMenu menu(x(), y(), w(), h());
  313.             menu.SetCmdTarget(static_cast<CCommandTarget*>(this));
  314.             add(&menu);
  315.             menu.SetItems(PopupMenu);
  316.             menu.popup();
  317.             remove(menu);
  318.         }}
  319.         return 1;
  320.     default:
  321.         break;
  322.     }
  323.     return TParent::handle(event);
  324. }
  325. END_NCBI_SCOPE
  326. /*
  327.  * ===========================================================================
  328.  * ===========================================================================
  329.  */