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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: viewer_window_base.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:34:57  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.26
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: viewer_window_base.hpp,v 1000.1 2004/04/12 17:34:57 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 GUI functionality for viewers
  38. *
  39. * ===========================================================================
  40. */
  41. #ifndef CN3D_VIEWER_WINDOW_BASE__HPP
  42. #define CN3D_VIEWER_WINDOW_BASE__HPP
  43. #include <corelib/ncbistd.hpp>
  44. #ifdef __WXMSW__
  45. #include <windows.h>
  46. #include <wx/msw/winundef.h>
  47. #endif
  48. #include <wx/wx.h>
  49. #include "block_multiple_alignment.hpp"
  50. #include "sequence_viewer_widget.hpp"
  51. BEGIN_SCOPE(Cn3D)
  52. class ViewerBase;
  53. class SequenceDisplay;
  54. class MoleculeIdentifier;
  55. // this must be included in the event table for the derived class, so that the base class's
  56. // menu item callbacks are accessible
  57. #define INCLUDE_VIEWER_WINDOW_BASE_EVENTS 
  58.     EVT_MENU_RANGE(MID_SHOW_TITLES, MID_HIDE_TITLES,    ViewerWindowBase::OnTitleView) 
  59.     EVT_MENU_RANGE(MID_ENABLE_EDIT, MID_SYNC_STRUCS_ON, ViewerWindowBase::OnEditMenu) 
  60.     EVT_MENU_RANGE(MID_SELECT_RECT, MID_DRAG_HORIZ,     ViewerWindowBase::OnMouseMode) 
  61.     EVT_MENU_RANGE(MID_LEFT,        MID_SPLIT,          ViewerWindowBase::OnJustification) 
  62.     EVT_MENU      (MID_SHOW_GEOM_VLTNS,                 ViewerWindowBase::OnShowGeomVltns) 
  63.     EVT_MENU      (MID_FIND_PATTERN,                    ViewerWindowBase::OnFindPattern)
  64. class ViewerWindowBase : public wxFrame
  65. {
  66.     friend class SequenceDisplay;
  67. public:
  68.     // displays a new alignment, and whether to enable the editor and column selection
  69.     void NewDisplay(SequenceDisplay *display, bool enableSelectByColumn);
  70.     // if 'prompt', ask if user wants to save edits; return value indicates whether program
  71.     // should continue after this dialog - i.e., returns false if user hits 'cancel';
  72.     // program should then abort the operation that engendered this function call.
  73.     // 'canCancel' tells whether or not a 'cancel' button is even displayed - thus
  74.     // if 'canCancel' is false, the function will always return true.
  75.     virtual bool SaveDialog(bool prompt, bool canCancel) = 0;
  76.     // updates alignment (e.g. if width or # rows has changed); doesn't change scroll
  77.     void UpdateDisplay(SequenceDisplay *display);
  78.     // scroll to specific column
  79.     void ScrollToColumn(int column) { viewerWidget->ScrollTo(column, -1); }
  80.     void ScrollToRow(int row) { viewerWidget->ScrollTo(-1, row); }
  81.     // scroll so that this cell is visible, if it's not already
  82.     void MakeCellVisible(int column, int row) { viewerWidget->MakeCharacterVisible(column, row); }
  83.     void MakeSequenceVisible(const MoleculeIdentifier *identifier);
  84.     // set the font for the characters from registry values; refreshes automatically.
  85.     void SetupFontFromRegistry(void);
  86.     // communicates to the derived class that the user wants to turn on/off the editor;
  87.     // should return true if derived class wants to allow the state change
  88.     virtual bool RequestEditorEnable(bool enable) { return false; }
  89.     virtual void EnableDerivedEditorMenuItems(bool enable) { }
  90.     // allows the derived class to set up special mouse/cursor modes, e.g. for delete row
  91.     virtual void CancelDerivedSpecialModesExcept(int id) { }
  92.     // override to set customized window title
  93.     virtual void SetWindowTitle(void) = 0;
  94.     // menu callbacks
  95.     void OnTitleView(wxCommandEvent& event);
  96.     void OnEditMenu(wxCommandEvent& event);
  97.     void OnMouseMode(wxCommandEvent& event);
  98.     void OnJustification(wxCommandEvent& event);
  99.     void OnShowGeomVltns(wxCommandEvent& event);
  100.     void OnFindPattern(wxCommandEvent& event);
  101. protected:
  102.     // menu identifiers
  103.     enum {
  104.         // view menu
  105.         MID_SHOW_TITLES,
  106.         MID_HIDE_TITLES,
  107.         MID_SHOW_GEOM_VLTNS,
  108.         MID_FIND_PATTERN,
  109.         // edit menu
  110.         MID_ENABLE_EDIT,
  111.         MID_UNDO,
  112.         MID_REDO,
  113.         MID_SPLIT_BLOCK,
  114.         MID_MERGE_BLOCKS,
  115.         MID_CREATE_BLOCK,
  116.         MID_DELETE_BLOCK,
  117.         MID_SYNC_STRUCS,
  118.         MID_SYNC_STRUCS_ON,
  119.         // mouse mode
  120.         MID_SELECT_RECT,
  121.         MID_SELECT_COLS,
  122.         MID_SELECT_ROWS,
  123.         MID_DRAG_HORIZ,
  124.         // unaligned justification
  125.         MID_LEFT,
  126.         MID_RIGHT,
  127.         MID_CENTER,
  128.         MID_SPLIT,
  129.         // so derived classes can use non-conflicting MID's
  130.         START_VIEWER_WINDOW_DERIVED_MID
  131.     };
  132.     // can't instantiate base class
  133.     ViewerWindowBase(ViewerBase *parentViewer,
  134.         const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize);
  135.     virtual ~ViewerWindowBase(void);
  136.     SequenceViewerWidget *viewerWidget;
  137.     ViewerBase *viewer;
  138.     void EnableBaseEditorMenuItems(bool enabled);
  139.     // so derived classes can add menu stuff
  140.     wxMenuBar *menuBar;
  141.     wxMenu *viewMenu, *editMenu, *mouseModeMenu, *justificationMenu;
  142.     SequenceViewerWidget::eMouseMode prevMouseMode;
  143.     BlockMultipleAlignment::eUnalignedJustification currentJustification;
  144.     void SplitBlockOff(void)
  145.     {
  146.         menuBar->Check(MID_SPLIT_BLOCK, false);
  147.         SetCursor(wxNullCursor);
  148.     }
  149.     void MergeBlocksOff(void)
  150.     {
  151.         menuBar->Check(MID_MERGE_BLOCKS, false);
  152.         viewerWidget->SetMouseMode(prevMouseMode);
  153.         SetCursor(wxNullCursor);
  154.     }
  155.     void CreateBlockOff(void)
  156.     {
  157.         menuBar->Check(MID_CREATE_BLOCK, false);
  158.         viewerWidget->SetMouseMode(prevMouseMode);
  159.         SetCursor(wxNullCursor);
  160.     }
  161.     void DeleteBlockOff(void)
  162.     {
  163.         menuBar->Check(MID_DELETE_BLOCK, false);
  164.         SetCursor(wxNullCursor);
  165.     }
  166.     void CancelBaseSpecialModesExcept(int id)
  167.     {
  168.         if (id != MID_SPLIT_BLOCK && DoSplitBlock()) SplitBlockOff();
  169.         if (id != MID_MERGE_BLOCKS && DoMergeBlocks()) MergeBlocksOff();
  170.         if (id != MID_CREATE_BLOCK && DoCreateBlock()) CreateBlockOff();
  171.         if (id != MID_DELETE_BLOCK && DoDeleteBlock()) DeleteBlockOff();
  172.     }
  173.     void CancelAllSpecialModesExcept(int id)
  174.     {
  175.         CancelBaseSpecialModesExcept(id);
  176.         CancelDerivedSpecialModesExcept(id);
  177.     }
  178.     virtual SequenceViewerWidget::eMouseMode GetMouseModeForCreateAndMerge(void) = 0;
  179. public:
  180.     BlockMultipleAlignment::eUnalignedJustification GetCurrentJustification(void) const
  181.         { return currentJustification; }
  182.     void Refresh(void) { viewerWidget->Refresh(false); }
  183.     void KillWindow(void)
  184.     {
  185.         viewer = NULL;
  186.         viewerWidget->AttachAlignment(NULL);
  187.         Destroy();
  188.     }
  189.     bool EditorIsOn(void) const { return menuBar->IsChecked(MID_ENABLE_EDIT); }
  190.     void EnableUndo(bool enabled) { menuBar->Enable(MID_UNDO, enabled); }
  191.     void EnableRedo(bool enabled) { menuBar->Enable(MID_REDO, enabled); }
  192.     bool DoSplitBlock(void) const { return menuBar->IsChecked(MID_SPLIT_BLOCK); }
  193.     bool DoMergeBlocks(void) const { return menuBar->IsChecked(MID_MERGE_BLOCKS); }
  194.     bool DoCreateBlock(void) const { return menuBar->IsChecked(MID_CREATE_BLOCK); }
  195.     bool DoDeleteBlock(void) const { return menuBar->IsChecked(MID_DELETE_BLOCK); }
  196.     void SyncStructures(void) { Command(MID_SYNC_STRUCS); }
  197.     bool AlwaysSyncStructures(void) const { return menuBar->IsChecked(MID_SYNC_STRUCS_ON); }
  198. };
  199. END_SCOPE(Cn3D)
  200. #endif // CN3D_VIEWER_WINDOW_BASE__HPP
  201. /*
  202. * ---------------------------------------------------------------------------
  203. * $Log: viewer_window_base.hpp,v $
  204. * Revision 1000.1  2004/04/12 17:34:57  gouriano
  205. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.26
  206. *
  207. * Revision 1.26  2004/02/19 17:05:22  thiessen
  208. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  209. *
  210. * Revision 1.25  2003/02/03 19:20:09  thiessen
  211. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  212. *
  213. * Revision 1.24  2002/10/13 22:58:08  thiessen
  214. * add redo ability to editor
  215. *
  216. * Revision 1.23  2002/10/07 13:29:32  thiessen
  217. * add double-click -> show row to taxonomy tree
  218. *
  219. * Revision 1.22  2002/09/09 13:38:23  thiessen
  220. * separate save and save-as
  221. *
  222. * Revision 1.21  2002/08/15 22:13:19  thiessen
  223. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  224. *
  225. * Revision 1.20  2002/06/05 15:59:38  thiessen
  226. * fix for Solaris
  227. *
  228. * Revision 1.19  2002/06/05 14:28:43  thiessen
  229. * reorganize handling of window titles
  230. *
  231. * Revision 1.18  2002/05/17 19:10:27  thiessen
  232. * preliminary range restriction for BLAST/PSSM
  233. *
  234. * Revision 1.17  2002/02/05 18:53:26  thiessen
  235. * scroll to residue in sequence windows when selected in structure window
  236. *
  237. * Revision 1.16  2001/12/06 23:13:47  thiessen
  238. * finish import/align new sequences into single-structure data; many small tweaks
  239. *
  240. * Revision 1.15  2001/08/14 17:17:48  thiessen
  241. * add user font selection, store in registry
  242. *
  243. * Revision 1.14  2001/07/23 20:08:38  thiessen
  244. * add regex pattern search
  245. *
  246. * Revision 1.13  2001/06/04 14:33:55  thiessen
  247. * add proximity sort; highlight sequence on browser launch
  248. *
  249. * Revision 1.12  2001/05/25 19:08:14  thiessen
  250. * fix GTK window redraw bug
  251. *
  252. * Revision 1.11  2001/05/23 17:43:29  thiessen
  253. * change dialog implementation to wxDesigner; interface changes
  254. *
  255. * Revision 1.10  2001/04/12 18:35:01  thiessen
  256. * fix merge GUI bug/typo
  257. *
  258. * Revision 1.9  2001/04/05 22:54:52  thiessen
  259. * change bg color handling ; show geometry violations
  260. *
  261. * Revision 1.8  2001/04/04 00:27:22  thiessen
  262. * major update - add merging, threader GUI controls
  263. *
  264. * Revision 1.7  2001/03/30 03:07:09  thiessen
  265. * add threader score calculation & sorting
  266. *
  267. * Revision 1.6  2001/03/22 00:32:37  thiessen
  268. * initial threading working (PSSM only); free color storage in undo stack
  269. *
  270. * Revision 1.5  2001/03/17 14:06:53  thiessen
  271. * more workarounds for namespace/#define conflicts
  272. *
  273. * Revision 1.4  2001/03/13 01:24:17  thiessen
  274. * working undo system for >1 alignment (e.g., update window)
  275. *
  276. * Revision 1.3  2001/03/09 15:48:44  thiessen
  277. * major changes to add initial update viewer
  278. *
  279. * Revision 1.2  2001/03/02 03:26:36  thiessen
  280. * fix dangling pointer upon app close
  281. *
  282. * Revision 1.1  2001/03/01 20:15:30  thiessen
  283. * major rearrangement of sequence viewer code into base and derived classes
  284. *
  285. */