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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: lds_search_dlg.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 20:58:12  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: lds_search_dlg.cpp,v 1000.2 2004/06/01 20:58:12 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:  Anatoliy Kuznetsov
  35.  *
  36.  * File Description:
  37.  *    CLdsSearchDlg - simple search dialog for local storage
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <objtools/lds/lds.hpp>
  41. #include <objtools/lds/lds_set.hpp>
  42. #include <objtools/lds/lds_util.hpp>
  43. #include <objtools/lds/lds_reader.hpp>
  44. #include <objtools/lds/lds_query.hpp>
  45. //#include <objtools/lds/admin/lds_admin.hpp>
  46. #include "lds_search_dlg.hpp"
  47. #include "loader_utils.hpp"
  48. BEGIN_NCBI_SCOPE
  49. USING_SCOPE(objects);
  50. #include "lds_search_dlg_.cpp"
  51. CLdsSearchDlg::CLdsSearchDlg(objects::CLDS_DatabaseHolder* dbh)
  52.     : m_RetVal(eCancel),
  53.       m_dbh(dbh)
  54. {
  55.     m_Window.reset(x_CreateWindow());
  56.     // Feed aliases into the browser
  57.     vector<string> aliases;
  58.     dbh->EnumerateAliases(&aliases);
  59.     unsigned i = 0;
  60.     ITERATE(vector<string>, it, aliases) {
  61.         void* tmp_ptr=0;
  62.         ::memcpy(&tmp_ptr, &i, sizeof(i));
  63.         m_AliasList->add(it->c_str(), tmp_ptr);
  64.         if (i == 0) {
  65.             m_AliasList->select(i + 1, 1);
  66.         }
  67.         ++i;
  68.     }
  69. }
  70. EDialogReturnValue CLdsSearchDlg::Show()
  71. {
  72.     m_RetVal = eCancel;
  73.     m_Window->show();
  74.     while (m_Window->shown()) {
  75.         Fl::wait();
  76.     }
  77.     return m_RetVal;
  78. }
  79. void CLdsSearchDlg::x_OnOK()
  80. {
  81.     m_RetVal = eOK;
  82.     m_Window->hide();
  83. }
  84. void CLdsSearchDlg::x_OnCancel()
  85. {
  86.     m_RetVal = eCancel;
  87.     m_Window->hide();
  88. }
  89. void CLdsSearchDlg::x_OnGo()
  90. {
  91.     const char* search_text = m_Text->value();
  92.     vector<string> str_vec;
  93.     NStr::Tokenize(search_text, " ", str_vec, NStr::eMergeDelims);
  94.     CLoaderStrFormatter::PrepareSearchVector(str_vec);
  95.     if (str_vec.empty()) {
  96.         return;
  97.     }
  98.     m_List->clear();
  99.     CLDS_Database* db = 0;
  100.     Fl_Browser* alias_lst = m_AliasList;
  101.     {{
  102.     for (int i = 1;  i <= alias_lst->size();  ++i) {
  103.         int selected = alias_lst->selected(i);
  104.         if (selected) {
  105.             void* data = alias_lst->data(i);
  106.             int db_index;
  107.             ::memcpy(&db_index, &data, sizeof(db_index));
  108.             db = m_dbh->GetDatabase(db_index);
  109.             break;
  110.         }
  111.         
  112.     } // for i
  113.     }}
  114.     if (!db)
  115.         db = m_dbh->GetDefaultDatabase();
  116.     if (!db)
  117.         return;
  118.     SLDS_TablesCollection& tables = db->GetTables();
  119.     CLDS_Set obj_search_results;
  120.     CLDS_Query query(tables);
  121.     query.FindSequences(str_vec, &obj_search_results);
  122.     query.FindSequences(search_text, &obj_search_results);
  123.     CLDS_Set obj_read; // list of objects already loaded
  124.     if (obj_search_results.size() == 0) {
  125.         LOG_POST(Info
  126.                  << "Failed to find local sequence(s).");
  127.     }
  128.     else {
  129.         ITERATE (CLDS_Set, rsit, obj_search_results) {
  130.             try {
  131.                 int object_id = *rsit;
  132.                 tables.object_db.object_id = object_id;
  133.                 if (tables.object_db.Fetch() == eBDB_Ok) {
  134.                     CLDS_Query::SObjectDescr obj_descr = 
  135.                         query.GetObjectDescr(db->GetObjTypeMap(), object_id);
  136.                     string descr;
  137.                     descr = NStr::IntToString(object_id);
  138.                     descr.append(" ");
  139.                     descr.append(obj_descr.type_str);
  140.                     descr.append(" ");
  141.                     descr.append(obj_descr.title);
  142.                     void* tmp_ptr=0;
  143.                     ::memcpy(&tmp_ptr, &object_id, sizeof(object_id));
  144.                     m_List->add(descr.c_str(), tmp_ptr);
  145.                     
  146.                 }
  147.                 
  148.             } 
  149.             catch (CLDS_Exception& _DEBUG_ARG(ex))
  150.             {
  151.                 _TRACE("failed to read LDS file: " << ex.what());            
  152.             }
  153.         } // ITERATE
  154.     }
  155.     // Looking for annotations
  156.     {{
  157.         CLDS_Set slist_search_results;
  158.         query.FindSeqIdList(str_vec, &slist_search_results);
  159.         ITERATE (CLDS_Set, it, slist_search_results) {
  160.             try {
  161.                 int id = *it;
  162.                 CLDS_Query::SObjectDescr obj_descr = 
  163.                   query.GetObjectDescr(db->GetObjTypeMap(), id, true);
  164.                 string descr;
  165.                 descr = NStr::IntToString(id);
  166.                 descr.append(" ");
  167.                 descr.append(obj_descr.type_str);
  168.                 descr.append(" ");
  169.                 descr.append(obj_descr.title);
  170.                 void* tmp_ptr=0;
  171.                 ::memcpy(&tmp_ptr, &id, sizeof(id));
  172.                 m_List->add(descr.c_str(), tmp_ptr);
  173.             
  174.             }
  175.             catch (CLDS_Exception& _DEBUG_ARG(ex))
  176.             {
  177.                 _TRACE("failed to read object: " << ex.what());            
  178.             }
  179.         } // ITERATE
  180.     }}
  181.     // Select all rows
  182.     for (int i = 1;  i <= m_List->size();  ++i) {
  183.         m_List->select(i);
  184.     }
  185. }
  186. END_NCBI_SCOPE
  187. /*
  188.  * ===========================================================================
  189.  * $Log: lds_search_dlg.cpp,v $
  190.  * Revision 1000.2  2004/06/01 20:58:12  gouriano
  191.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  192.  *
  193.  * Revision 1.10  2004/05/21 22:27:48  gorelenk
  194.  * Added PCH ncbi_pch.hpp
  195.  *
  196.  * Revision 1.9  2004/03/16 15:59:50  vasilche
  197.  * Removed warning about unused exception variable
  198.  *
  199.  * Revision 1.8  2004/03/11 18:48:18  kuznets
  200.  * Made use of the query based FindSequences
  201.  *
  202.  * Revision 1.7  2004/01/27 18:45:33  dicuccio
  203.  * Added missing header files
  204.  *
  205.  * Revision 1.6  2003/10/29 16:25:07  kuznets
  206.  * Added support for LDS aliases.
  207.  *
  208.  * Revision 1.5  2003/08/08 15:31:03  kuznets
  209.  * Turn highlighting on for all found records in the search list after search.
  210.  *
  211.  * Revision 1.4  2003/08/07 20:31:35  kuznets
  212.  * Implemented document opening based on lds_search_dlg selection
  213.  *
  214.  * Revision 1.3  2003/08/06 20:58:36  kuznets
  215.  * Implemented "Go" button action (CLdsSearchDlg::x_OnGo())
  216.  *
  217.  * Revision 1.2  2003/08/05 17:16:25  kuznets
  218.  * Changes to improve code reuse between loaders + CLDS_Database passed as the
  219.  * construction parameter to the lds search dialog
  220.  *
  221.  * Revision 1.1  2003/07/29 14:35:14  dicuccio
  222.  * Initial revision of LDS search dialog
  223.  *
  224.  * ===========================================================================
  225.  */