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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blast_poll_table.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:54:14  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: blast_poll_table.cpp,v 1000.1 2004/06/01 20:54:14 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 "blast_poll_table.hpp"
  41. #include <gui/objutils/label.hpp>
  42. #include <gui/objutils/obj_clipboard.hpp>
  43. #include <gui/utils/gui_event.hpp>
  44. #include <gui/utils/message_box.hpp>
  45. #include <gui/widgets/fl/menu.hpp>
  46. #include <gui/core/view_menu.hpp>
  47. #include <gui/core/doc_manager.hpp>
  48. #include <gui/dialogs/file_browser.hpp>
  49. #include <objmgr/scope.hpp>
  50. #include <serial/serial.hpp>
  51. #include <serial/objostr.hpp>
  52. #include <serial/objistr.hpp>
  53. #include <corelib/ncbireg.hpp>
  54. BEGIN_NCBI_SCOPE
  55. USING_SCOPE(objects);
  56. CBlastPollTable::CBlastPollTable(int x, int y, int w, int h, const char* label)
  57.     : CTablePanel< CRef<CBlastPollItem> >(x, y, w, h, label)
  58. {
  59.     //
  60.     // set up the actual columns for our internal data
  61.     //
  62.     SetColumn(eRid,      "RID",         eString, FL_ALIGN_LEFT,   1.0f);
  63.     SetColumn(eLocation, "Location",    eString, FL_ALIGN_LEFT,   1.0f);
  64.     SetColumn(eStatus,   "Status",      eString, FL_ALIGN_CENTER, 0.5f);
  65.     SetColumn(eSubmit,   "Submitted",   eString, FL_ALIGN_CENTER, 0.5f);
  66.     SetColumn(eLastPoll, "Polled",      eString, FL_ALIGN_CENTER, 0.5f);
  67.     SetCellBox(CFltkUtils::eBox_RightEdge);
  68. }
  69. enum EBlastResultsDlgCommands {
  70.     eCmd_NewDocument = eBaseCmdLast + 200,
  71.     eCmd_NewView,
  72.     eCmd_SaveAs
  73. };
  74. static
  75. DEFINE_MENU(PopupMenu)
  76.     MENU_ITEM(eCmd_NewDocument, "Open in New Document")
  77.     SUBMENU("Open a View")
  78.     END_SUBMENU()
  79.     MENU_SEPARATOR()
  80.     MENU_ITEM(eCmd_SaveAs,      "Save as File")
  81. END_MENU()
  82. BEGIN_CMD_MAP(CBlastPollTable, CCommandTarget)
  83.     ON_COMMAND(eCmd_NewDocument, &CBlastPollTable::OnNewDocument)
  84.     ON_COMMAND(eCmd_SaveAs,      &CBlastPollTable::OnSaveAs)
  85. END_CMD_MAP()
  86. void CBlastPollTable::OnNewDocument()
  87. {
  88.     for (size_t i = 0;  i < GetRows();  ++i) {
  89.         if ( !IsRowSelected(i) ) {
  90.             continue;
  91.         }
  92.         if (GetData(i)->m_Results) {
  93.             CRef<CScope> scope(new CScope(CDocManager::GetObjectManager()));
  94.             scope->AddDefaults();
  95.             CDocManager::CreateDocument(*scope, *GetData(i)->m_Results);
  96.             CDocManager::UpdateAllViews();
  97.         }
  98.     }
  99. }
  100. void CBlastPollTable::OnSaveAs()
  101. {
  102.     for (size_t i = 0;  i < GetRows();  ++i) {
  103.         if ( !IsRowSelected(i) ) {
  104.             continue;
  105.         }
  106.         const CBlastPollItem& item = *GetData(i);
  107.         if (item.m_Results) {
  108.             string fname = NcbiFileBrowser("Save BLAST Results", "", "");
  109.             if (fname.empty()) {
  110.                 NcbiMessageBox("Error: No file indicated.");
  111.                 continue;
  112.             }
  113.             CNcbiOfstream o_file(fname.c_str(), ios::binary);
  114.             auto_ptr<CObjectOStream> os
  115.                 (CObjectOStream::Open(eSerial_AsnBinary, o_file));
  116.             *os << *item.m_Results;
  117.         } else {
  118.             string fname = NcbiFileBrowser("Save BLAST Results", "*.rid", "");
  119.             if (fname.empty()) {
  120.                 NcbiMessageBox("Error: No file indicated.");
  121.                 continue;
  122.             }
  123.             CNcbiRegistry reg;
  124.             reg.Set("blast-rid", "RID", item.m_Rid,
  125.                     CNcbiRegistry::ePersistent);
  126.             if (item.m_QueryLoc) {
  127.                 string loc;
  128.                 {{
  129.                     CNcbiOstrstream ostr;
  130.                     auto_ptr<CObjectOStream> os
  131.                         (CObjectOStream::Open(eSerial_AsnText, ostr));
  132.                     *os << *item.m_QueryLoc;
  133.                     os->Flush();
  134.                     loc = CNcbiOstrstreamToString(ostr);
  135.                 }}
  136.                 loc = NStr::Replace(loc, "n", "");
  137.                 loc = NStr::Replace(loc, "r", "");
  138.                 reg.Set("blast-rid", "QueryLocation", loc,
  139.                         CNcbiRegistry::ePersistent);
  140.             }
  141.             CNcbiOfstream o_file(fname.c_str());
  142.             reg.Write(o_file);
  143.         }
  144.     }
  145. }
  146. void CBlastPollTable::OnShowPopup()
  147. {
  148.     CPopupMenu menu(x(), y(), w(), h());
  149.     menu.SetCmdTarget(static_cast<CCommandTarget*>(this));
  150.     add(&menu);
  151.     menu.SetItems(PopupMenu);
  152.     CViewMenuMgr mgr(&menu, "Open a View", this);
  153.     mgr.AddNewViews();
  154.     menu.popup(); 
  155.     remove(menu);
  156. }
  157. int CBlastPollTable::handle(int event)
  158. {
  159.     int res = CTablePanel< CRef<CBlastPollItem> >::handle(event);
  160.     if (res) {
  161.         return res;
  162.     }
  163.     switch (m_Handler.GetGUISignal()) {
  164.     case CGUIEvent::ePopupSignal:
  165.         OnShowPopup();
  166.         return 1;
  167.     default:
  168.         break;
  169.     }
  170.     return 0;
  171. }
  172. int CBlastPollTable::x_OnCopy()
  173. {
  174.     string str;
  175.     CClipboard::Clear();
  176.     for (size_t i = 0;  i < GetRows();  ++i) {
  177.         if ( !IsRowSelected(i) ) {
  178.             continue;
  179.         }
  180.         if (GetData(i)->m_Results) {
  181.             CObjClipboard::Add(GetData(i)->m_Document->GetScope(),
  182.                                *GetData(i)->m_Results);
  183.         } else {
  184.             CClipboard::Add(GetData(i)->m_Rid);
  185.         }
  186.     }
  187.     CClipboard::Copy();
  188.     return 1;
  189. }
  190. // add an item to the table
  191. void CBlastPollTable::AddItem(CBlastPollItem& item)
  192. {
  193.     size_t idx = AddRow();
  194.     SetData(idx, CRef<CBlastPollItem>(&item));
  195.     x_UpdateItem(idx);
  196. }
  197. void CBlastPollTable::ActivateItem(size_t idx)
  198. {
  199.     SetData(idx)->m_Active = true;
  200.     x_UpdateItem(GetData(idx));
  201. }
  202. void CBlastPollTable::DeactivateItem(size_t idx)
  203. {
  204.     SetData(idx)->m_Active = false;
  205.     x_UpdateItem(GetData(idx));
  206. }
  207. // remove an item from the table
  208. void CBlastPollTable::RemoveItem(size_t idx)
  209. {
  210.     RemoveRow(idx);
  211.     redraw();
  212. }
  213. // remove all selected items from the table
  214. void CBlastPollTable::RemoveSelected()
  215. {
  216.     for (size_t i = GetRows() - 1;  i >= 0;  --i) {
  217.         if ( !IsRowSelected(i) ) {
  218.             continue;
  219.         }
  220.         
  221.         RemoveRow(i);
  222.     }
  223. }
  224. void CBlastPollTable::MoveUp(size_t idx)
  225. {
  226. }
  227. void CBlastPollTable::MoveDown(size_t idx)
  228. {
  229. }
  230. // update an item in the table
  231. void CBlastPollTable::UpdateItem(size_t idx, CBlastPollItem& item)
  232. {
  233.     _ASSERT(idx < GetRows());
  234.     SetData(idx, CRef<CBlastPollItem>(&item));
  235.     x_UpdateItem(idx);
  236. }
  237. bool CBlastPollTable::HasRid(const string& rid) const
  238. {
  239.     for (size_t i = 0;  i < GetRows();  ++i) {
  240.         if (GetData(i)->m_Rid == rid) {
  241.             return true;
  242.         }
  243.     }
  244.     return false;
  245. }
  246. void CBlastPollTable::GetSelections(TConstScopedObjects& objs) const
  247. {
  248.     objs.clear();
  249.     for (size_t i = 0;  i < GetRows();  ++i) {
  250.         if ( !IsRowSelected(i) ) {
  251.             continue;
  252.         }
  253.         const CBlastPollItem& item = *GetData(i);
  254.         if ( !item.m_Document  ||  !item.m_Results ) {
  255.             continue;
  256.         }
  257.         SConstScopedObject sco;
  258.         sco.scope  = &item.m_Document->GetScope();
  259.         sco.object = item.m_Results.GetPointer();
  260.         objs.push_back(sco);
  261.     }
  262. }
  263. void CBlastPollTable::SetSelections(const TConstScopedObjects& objs)
  264. {
  265. }
  266. void CBlastPollTable::x_UpdateItem(size_t idx)
  267. {
  268.     const CBlastPollItem& item = *GetData(idx);
  269.     SetCell(idx, eRid,      item.m_Rid);
  270.     if (item.m_QueryLoc) {
  271.         string& str = SetCell(idx, eLocation);
  272.         str.erase();
  273.         CScope* scope = NULL;
  274.         if (item.m_Document) {
  275.             scope = &item.m_Document->GetScope();
  276.         }
  277.         CLabel::GetLabel(*item.m_QueryLoc, &str, CLabel::eDefault, scope);
  278.     }
  279.     SetCell(idx, eStatus,   item.m_Status);
  280.     SetCell(idx, eSubmit,   item.m_SubmitTime.AsString("h:m:s"));
  281.     SetCell(idx, eLastPoll, item.m_LastPollTime.AsString("h:m:s"));
  282.     redraw();
  283. }
  284. END_NCBI_SCOPE
  285. /*
  286.  * ===========================================================================
  287.  * $Log: blast_poll_table.cpp,v $
  288.  * Revision 1000.1  2004/06/01 20:54:14  gouriano
  289.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  290.  *
  291.  * Revision 1.8  2004/05/28 15:03:20  dicuccio
  292.  * Use right edge box type
  293.  *
  294.  * Revision 1.7  2004/05/21 22:27:46  gorelenk
  295.  * Added PCH ncbi_pch.hpp
  296.  *
  297.  * Revision 1.6  2004/05/07 15:42:08  dicuccio
  298.  * Use CLabel instead of CSeqUtils::GetLabel().  Use CObjClipboard instead of
  299.  * CClipboard
  300.  *
  301.  * Revision 1.5  2004/05/03 13:05:42  dicuccio
  302.  * gui/utils --> gui/objutils where needed
  303.  *
  304.  * Revision 1.4  2004/04/22 13:07:10  dicuccio
  305.  * Really pass selections through in GetSelections()
  306.  *
  307.  * Revision 1.3  2004/04/22 12:22:08  dicuccio
  308.  * Added BLAST RID caching.  Added better formatting for BLAST results
  309.  *
  310.  * Revision 1.2  2004/04/07 12:52:18  dicuccio
  311.  * Added copying of seq-align-set to clipboard, if present
  312.  *
  313.  * Revision 1.1  2004/03/05 17:30:34  dicuccio
  314.  * Initial revision
  315.  *
  316.  * ===========================================================================
  317.  */