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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: viewer_base.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:29:56  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.22
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: viewer_base.cpp,v 1000.2 2004/06/01 18:29:56 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:  Paul Thiessen
  35. *
  36. * File Description:
  37. *      base functionality for non-GUI part of viewers
  38. *
  39. * ===========================================================================
  40. */
  41. #ifdef _MSC_VER
  42. #pragma warning(disable:4018)   // disable signed/unsigned mismatch warning in MSVC
  43. #endif
  44. #include <ncbi_pch.hpp>
  45. #include <corelib/ncbistd.hpp>
  46. #include <map>
  47. #include "viewer_base.hpp"
  48. #include "viewer_window_base.hpp"
  49. #include "sequence_display.hpp"
  50. #include "messenger.hpp"
  51. #include "cn3d_tools.hpp"
  52. #include "alignment_manager.hpp"
  53. #include "cn3d_blast.hpp"
  54. USING_NCBI_SCOPE;
  55. BEGIN_SCOPE(Cn3D)
  56. // limits the size of the stack (set to -1 for unlimited)
  57. const int ViewerBase::MAX_UNDO_STACK_SIZE = 50;
  58. ViewerBase::ViewerBase(ViewerWindowBase* *window, AlignmentManager *alnMgr) :
  59.     viewerWindow(window), alignmentManager(alnMgr), currentDisplay(NULL)
  60. {
  61.     if (!window) ERRORMSG("ViewerBase::ViewerBase() - got NULL handle");
  62. }
  63. ViewerBase::~ViewerBase(void)
  64. {
  65.     DestroyGUI();
  66.     ClearAllData();
  67. }
  68. void ViewerBase::DestroyGUI(void)
  69. {
  70.     if ((*viewerWindow)) {
  71.         (*viewerWindow)->KillWindow();
  72.         GUIDestroyed();
  73.     }
  74. }
  75. void ViewerBase::SetWindowTitle(void) const
  76. {
  77.     if (*viewerWindow)
  78.         (*viewerWindow)->SetWindowTitle();
  79. }
  80. void ViewerBase::InitData(const AlignmentList *alignments, SequenceDisplay *display)
  81. {
  82.     ClearAllData();
  83.     if (alignments) currentAlignments = *alignments;    // copy list
  84.     currentDisplay = display;
  85.     stacksEnabled = false;
  86.     SetUndoRedoMenuStates();
  87. }
  88. void ViewerBase::EnableStacks(void)
  89. {
  90.     if (stacksEnabled) {
  91.         ERRORMSG("ViewerBase::EnableStacks() - already enabled!");
  92.         return;
  93.     }
  94.     stacksEnabled = true;
  95.     nRedosStored = 0;
  96.     Save();
  97. }
  98. void ViewerBase::Save(void)
  99. {
  100.     if (!currentDisplay || !stacksEnabled) {
  101.         ERRORMSG("ViewerBase::Save() - stacks not enabled, or no alignment/display data");
  102.         return;
  103.     }
  104.     // clear out any data in the stack above the current position (deletes "redo" list)
  105.     if (nRedosStored > 0) {
  106.         TRACEMSG("deleting " << nRedosStored << " redo elements from the stack");
  107.         for (; nRedosStored>0; --nRedosStored) {
  108.             DELETE_ALL_AND_CLEAR(alignmentStack.back(), AlignmentList);
  109.             alignmentStack.pop_back();
  110.             delete displayStack.back();
  111.             displayStack.pop_back();
  112.         }
  113.     }
  114.     // remove the one-up-from-bottom of the stack if it's too big (so original isn't lost)
  115.     if (alignmentStack.size() == MAX_UNDO_STACK_SIZE) {
  116.         WARNINGMSG("max undo stack size exceeded - deleting next-from-bottom item");
  117.         DELETE_ALL_AND_CLEAR(*(++(alignmentStack.begin())), AlignmentList);
  118.         alignmentStack.erase(++(alignmentStack.begin()));
  119.         delete *(++(displayStack.begin()));
  120.         displayStack.erase(++(displayStack.begin()));
  121.     }
  122.     // clone current alignments onto top of stack
  123.     alignmentStack.resize(alignmentStack.size() + 1);
  124.     Old2NewAlignmentMap newAlignmentMap;
  125.     AlignmentList::const_iterator a, ae = currentAlignments.end();
  126.     for (a=currentAlignments.begin(); a!=ae; ++a) {
  127.         BlockMultipleAlignment *newAlignment = (*a)->Clone();
  128.         alignmentStack.back().push_back(newAlignment);
  129.         newAlignmentMap[*a] = newAlignment;
  130.     }
  131.     // clone display
  132.     displayStack.push_back(currentDisplay->Clone(newAlignmentMap));
  133.     SetUndoRedoMenuStates();
  134. }
  135. void ViewerBase::Undo(void)
  136. {
  137.     if ((alignmentStack.size() - nRedosStored) <= 1 || !stacksEnabled) {
  138.         ERRORMSG("ViewerBase::Undo() - stacks disabled, or no more undo data");
  139.         return;
  140.     }
  141.     ++nRedosStored;
  142.     CopyDataFromStack();
  143.     SetUndoRedoMenuStates();
  144. }
  145. void ViewerBase::Redo(void)
  146. {
  147.     if (nRedosStored == 0 || !stacksEnabled) {
  148.         ERRORMSG("ViewerBase::Redo() - stacks disabled, or no more redo data");
  149.         return;
  150.     }
  151.     --nRedosStored;
  152.     CopyDataFromStack();
  153.     SetUndoRedoMenuStates();
  154. }
  155. void ViewerBase::SetUndoRedoMenuStates(void)
  156. {
  157.     if (*viewerWindow) {
  158.         (*viewerWindow)->EnableUndo((alignmentStack.size() - nRedosStored) > 1 && stacksEnabled);
  159.         (*viewerWindow)->EnableRedo(nRedosStored > 0 && stacksEnabled);
  160.     }
  161. }
  162. void ViewerBase::CopyDataFromStack(void)
  163. {
  164.     // delete current objects
  165.     DELETE_ALL_AND_CLEAR(currentAlignments, AlignmentList);
  166.     delete currentDisplay;
  167.     // move to appropriate stack object
  168.     AlignmentStack::reverse_iterator as = alignmentStack.rbegin();
  169.     DisplayStack::reverse_iterator ds = displayStack.rbegin();
  170.     for (int i=0; i<nRedosStored; ++i) {
  171.         ++as;
  172.         ++ds;
  173.     }
  174.     // clone alignments into current
  175.     Old2NewAlignmentMap newAlignmentMap;
  176.     AlignmentList::const_iterator a, ae = as->end();
  177.     for (a=as->begin(); a!=ae; ++a) {
  178.         BlockMultipleAlignment *newAlignment = (*a)->Clone();
  179.         currentAlignments.push_back(newAlignment);
  180.         newAlignmentMap[*a] = newAlignment;
  181.     }
  182.     // clone display
  183.     currentDisplay = (*ds)->Clone(newAlignmentMap);
  184. }
  185. void ViewerBase::ClearAllData(void)
  186. {
  187.     DELETE_ALL_AND_CLEAR(currentAlignments, AlignmentList);
  188.     while (alignmentStack.size() > 0) {
  189.         DELETE_ALL_AND_CLEAR(alignmentStack.back(), AlignmentList);
  190.         alignmentStack.pop_back();
  191.     }
  192.     delete currentDisplay;
  193.     currentDisplay = NULL;
  194.     while (displayStack.size() > 0) {
  195.         delete displayStack.back();
  196.         displayStack.pop_back();
  197.     }
  198. }
  199. void ViewerBase::Revert(void)
  200. {
  201.     if (!stacksEnabled) {
  202.         ERRORMSG("ViewerBase::Revert() - stacks disabled!");
  203.         return;
  204.     }
  205.     nRedosStored = 0;
  206.     // revert to the bottom of the stack; delete the rest
  207.     while (alignmentStack.size() > 0) {
  208.         if (alignmentStack.size() == 1)
  209.             CopyDataFromStack();
  210.         DELETE_ALL_AND_CLEAR(alignmentStack.back(), AlignmentList);
  211.         alignmentStack.pop_back();
  212.         delete displayStack.back();
  213.         displayStack.pop_back();
  214.     }
  215.     stacksEnabled = false;
  216.     SetUndoRedoMenuStates();
  217. }
  218. void ViewerBase::KeepCurrent(void)
  219. {
  220.     if (!stacksEnabled) return;
  221.     // delete all stack data (leaving current stuff unchanged)
  222.     while (alignmentStack.size() > 0) {
  223.         DELETE_ALL_AND_CLEAR(alignmentStack.back(), AlignmentList);
  224.         alignmentStack.pop_back();
  225.     }
  226.     while (displayStack.size() > 0) {
  227.         delete displayStack.back();
  228.         displayStack.pop_back();
  229.     }
  230.     nRedosStored = 0;
  231.     stacksEnabled = false;
  232.     SetUndoRedoMenuStates();
  233. }
  234. bool ViewerBase::EditorIsOn(void) const
  235. {
  236.     return (*viewerWindow && (*viewerWindow)->EditorIsOn());
  237. }
  238. void ViewerBase::NewFont(void)
  239. {
  240.     if (*viewerWindow) (*viewerWindow)->SetupFontFromRegistry();
  241. }
  242. void ViewerBase::MakeResidueVisible(const Molecule *molecule, int seqIndex)
  243. {
  244.     if (!(*viewerWindow) || !currentDisplay) return;
  245.     int column, row;
  246.     if (currentDisplay->GetDisplayCoordinates(molecule, seqIndex,
  247.             (*viewerWindow)->GetCurrentJustification(), &column, &row))
  248.         (*viewerWindow)->MakeCellVisible(column, row);
  249. }
  250. void ViewerBase::MakeSequenceVisible(const MoleculeIdentifier *identifier)
  251. {
  252.     if (*viewerWindow) (*viewerWindow)->MakeSequenceVisible(identifier);
  253. }
  254. void ViewerBase::SaveDialog(bool prompt)
  255. {
  256.     if (*viewerWindow) (*viewerWindow)->SaveDialog(prompt, false);
  257. }
  258. void ViewerBase::Refresh(void)
  259. {
  260.     if (*viewerWindow) (*viewerWindow)->Refresh();
  261. }
  262. void ViewerBase::CalculateSelfHitScores(const BlockMultipleAlignment *multiple)
  263. {
  264.     alignmentManager->blaster->CalculateSelfHitScores(multiple);
  265. }
  266. void ViewerBase::RemoveBlockBoundaryRows(void)
  267. {
  268.     currentDisplay->RemoveBlockBoundaryRows();
  269. }
  270. END_SCOPE(Cn3D)
  271. /*
  272. * ---------------------------------------------------------------------------
  273. * $Log: viewer_base.cpp,v $
  274. * Revision 1000.2  2004/06/01 18:29:56  gouriano
  275. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.22
  276. *
  277. * Revision 1.22  2004/05/21 21:41:40  gorelenk
  278. * Added PCH ncbi_pch.hpp
  279. *
  280. * Revision 1.21  2004/03/15 18:11:01  thiessen
  281. * prefer prefix vs. postfix ++/-- operators
  282. *
  283. * Revision 1.20  2004/02/19 17:05:22  thiessen
  284. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  285. *
  286. * Revision 1.19  2003/02/03 19:20:08  thiessen
  287. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  288. *
  289. * Revision 1.18  2002/10/25 19:00:02  thiessen
  290. * retrieve VAST alignment from vastalign.cgi on structure import
  291. *
  292. * Revision 1.17  2002/10/13 22:58:08  thiessen
  293. * add redo ability to editor
  294. *
  295. * Revision 1.16  2002/10/07 13:29:32  thiessen
  296. * add double-click -> show row to taxonomy tree
  297. *
  298. * Revision 1.15  2002/09/09 13:38:23  thiessen
  299. * separate save and save-as
  300. *
  301. * Revision 1.14  2002/08/15 22:13:18  thiessen
  302. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  303. *
  304. * Revision 1.13  2002/06/05 14:28:42  thiessen
  305. * reorganize handling of window titles
  306. *
  307. * Revision 1.12  2002/02/05 18:53:26  thiessen
  308. * scroll to residue in sequence windows when selected in structure window
  309. *
  310. * Revision 1.11  2001/08/14 17:18:22  thiessen
  311. * add user font selection, store in registry
  312. *
  313. * Revision 1.10  2001/05/31 18:47:11  thiessen
  314. * add preliminary style dialog; remove LIST_TYPE; add thread single and delete all; misc tweaks
  315. *
  316. * Revision 1.9  2001/05/02 13:46:29  thiessen
  317. * major revision of stuff relating to saving of updates; allow stored null-alignments
  318. *
  319. * Revision 1.8  2001/04/05 22:55:36  thiessen
  320. * change bg color handling ; show geometry violations
  321. *
  322. * Revision 1.7  2001/04/04 00:27:16  thiessen
  323. * major update - add merging, threader GUI controls
  324. *
  325. * Revision 1.6  2001/03/30 14:43:41  thiessen
  326. * show threader scores in status line; misc UI tweaks
  327. *
  328. * Revision 1.5  2001/03/22 00:33:18  thiessen
  329. * initial threading working (PSSM only); free color storage in undo stack
  330. *
  331. * Revision 1.4  2001/03/13 01:25:06  thiessen
  332. * working undo system for >1 alignment (e.g., update window)
  333. *
  334. * Revision 1.3  2001/03/02 15:32:52  thiessen
  335. * minor fixes to save & show/hide dialogs, wx string headers
  336. *
  337. * Revision 1.2  2001/03/02 03:26:59  thiessen
  338. * fix dangling pointer upon app close
  339. *
  340. * Revision 1.1  2001/03/01 20:15:51  thiessen
  341. * major rearrangement of sequence viewer code into base and derived classes
  342. *
  343. */