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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: viewer_window_base.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 18:29:58  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.50
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: viewer_window_base.cpp,v 1000.3 2004/06/01 18:29:58 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. #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 <memory>
  47. #include "viewer_window_base.hpp"
  48. #include "viewer_base.hpp"
  49. #include "sequence_display.hpp"
  50. #include "messenger.hpp"
  51. #include "cn3d_threader.hpp"
  52. #include "alignment_manager.hpp"
  53. #include "cn3d_tools.hpp"
  54. // the application icon (under Windows it is in resources)
  55. #if defined(__WXGTK__) || defined(__WXMAC__)
  56.     #include "cn3d.xpm"
  57. #endif
  58. USING_NCBI_SCOPE;
  59. BEGIN_SCOPE(Cn3D)
  60. ViewerWindowBase::ViewerWindowBase(ViewerBase *parentViewer, const wxPoint& pos, const wxSize& size) :
  61.     wxFrame(GlobalTopWindow(), wxID_HIGHEST + 10, "", pos, size,
  62.         wxDEFAULT_FRAME_STYLE
  63. #if defined(__WXMSW__)
  64.             | wxFRAME_TOOL_WINDOW
  65.             | wxFRAME_NO_TASKBAR
  66.             | wxFRAME_FLOAT_ON_PARENT
  67. #endif
  68.         ),
  69.     viewerWidget(NULL), viewer(parentViewer)
  70. {
  71.     if (!parentViewer) ERRORMSG("ViewerWindowBase::ViewerWindowBase() - got NULL pointer");
  72.     SetSizeHints(200, 150);
  73.     SetIcon(wxICON(cn3d));
  74.     // status bar with two fields - first is for id/loc, second is for general status line
  75.     CreateStatusBar(2);
  76.     int widths[2] = { 175, -1 };
  77.     SetStatusWidths(2, widths);
  78.     viewerWidget = new SequenceViewerWidget(this);
  79.     SetupFontFromRegistry();
  80.     menuBar = new wxMenuBar;
  81.     viewMenu = new wxMenu;
  82.     viewMenu->Append(MID_SHOW_TITLES, "Show &Titles");
  83.     //menu->Append(MID_HIDE_TITLES, "&Hide Titles");
  84.     viewMenu->Append(MID_SHOW_GEOM_VLTNS, "Show &Geometry Violations", "", true);
  85.     viewMenu->Append(MID_FIND_PATTERN, "Find &Pattern");
  86.     menuBar->Append(viewMenu, "&View");
  87.     editMenu = new wxMenu;
  88.     editMenu->Append(MID_ENABLE_EDIT, "&Enable Editor", "", true);
  89.     editMenu->Append(MID_UNDO, "UndotCtrl-Z");
  90. #ifndef __WXMAC__
  91.     editMenu->Append(MID_REDO, "RedotShift-Ctrl-Z");
  92. #else
  93.     // mac commands apparently don't recognize shift?
  94.     editMenu->Append(MID_REDO, "Redo");
  95. #endif
  96.     editMenu->AppendSeparator();
  97.     editMenu->Append(MID_SPLIT_BLOCK, "&Split Block", "", true);
  98.     editMenu->Append(MID_MERGE_BLOCKS, "&Merge Blocks", "", true);
  99.     editMenu->Append(MID_CREATE_BLOCK, "&Create Block", "", true);
  100.     editMenu->Append(MID_DELETE_BLOCK, "&Delete Block", "", true);
  101.     editMenu->AppendSeparator();
  102.     editMenu->Append(MID_SYNC_STRUCS, "Sy&nc Structure Colors");
  103.     editMenu->Append(MID_SYNC_STRUCS_ON, "&Always Sync Structure Colors", "", true);
  104.     menuBar->Append(editMenu, "&Edit");
  105.     mouseModeMenu = new wxMenu;
  106.     mouseModeMenu->Append(MID_SELECT_RECT, "&Select Rectangle", "", true);
  107.     mouseModeMenu->Append(MID_SELECT_COLS, "Select &Columns", "", true);
  108.     mouseModeMenu->Append(MID_SELECT_ROWS, "Select &Rows", "", true);
  109.     mouseModeMenu->Append(MID_DRAG_HORIZ, "&Horizontal Drag", "", true);
  110.     menuBar->Append(mouseModeMenu, "&Mouse Mode");
  111.     // accelerators for special mouse mode keys
  112.     wxAcceleratorEntry entries[4];
  113.     entries[0].Set(wxACCEL_NORMAL, 's', MID_SELECT_RECT);
  114.     entries[1].Set(wxACCEL_NORMAL, 'c', MID_SELECT_COLS);
  115.     entries[2].Set(wxACCEL_NORMAL, 'r', MID_SELECT_ROWS);
  116.     entries[3].Set(wxACCEL_NORMAL, 'h', MID_DRAG_HORIZ);
  117.     wxAcceleratorTable accel(4, entries);
  118.     SetAcceleratorTable(accel);
  119.     justificationMenu = new wxMenu;
  120.     justificationMenu->Append(MID_LEFT, "&Left", "", true);
  121.     justificationMenu->Append(MID_RIGHT, "&Right", "", true);
  122.     justificationMenu->Append(MID_CENTER, "&Center", "", true);
  123.     justificationMenu->Append(MID_SPLIT, "&Split", "", true);
  124.     menuBar->Append(justificationMenu, "Unaligned &Justification");
  125.     // set default initial modes
  126.     viewerWidget->SetMouseMode(SequenceViewerWidget::eSelectRectangle);
  127.     menuBar->Check(MID_SELECT_RECT, true);
  128.     menuBar->Check(MID_SPLIT, true);
  129.     currentJustification = BlockMultipleAlignment::eSplit;
  130.     viewerWidget->TitleAreaOn();
  131.     menuBar->Check(MID_SYNC_STRUCS_ON, true);
  132.     EnableBaseEditorMenuItems(false);
  133.     menuBar->Check(MID_SHOW_GEOM_VLTNS, false);   // start with gv's off
  134. }
  135. ViewerWindowBase::~ViewerWindowBase(void)
  136. {
  137.     if (viewer) viewer->GUIDestroyed();
  138. }
  139. void ViewerWindowBase::SetupFontFromRegistry(void)
  140. {
  141.     // get font info from registry, and create wxFont
  142.     string nativeFont;
  143.     RegistryGetString(REG_SEQUENCE_FONT_SECTION, REG_FONT_NATIVE_FONT_INFO, &nativeFont);
  144.     auto_ptr<wxFont> font(wxFont::New(wxString(nativeFont.c_str())));
  145.     if (!font.get() || !font->Ok())
  146.     {
  147.         ERRORMSG("ViewerWindowBase::SetupFontFromRegistry() - error setting up font");
  148.         return;
  149.     }
  150.     viewerWidget->SetCharacterFont(font.release());
  151. }
  152. void ViewerWindowBase::EnableBaseEditorMenuItems(bool enabled)
  153. {
  154.     int i;
  155.     for (i=MID_SPLIT_BLOCK; i<=MID_SYNC_STRUCS_ON; ++i)
  156.         menuBar->Enable(i, enabled);
  157.     menuBar->Enable(MID_DRAG_HORIZ, enabled);
  158.     if (!enabled) CancelBaseSpecialModesExcept(-1);
  159.     menuBar->Enable(MID_UNDO, false);
  160.     menuBar->Enable(MID_REDO, false);
  161.     menuBar->Enable(MID_SHOW_GEOM_VLTNS,
  162.         viewer->GetCurrentDisplay() && viewer->GetCurrentDisplay()->IsEditable());
  163.     EnableDerivedEditorMenuItems(enabled);
  164. }
  165. void ViewerWindowBase::NewDisplay(SequenceDisplay *display, bool enableSelectByColumn)
  166. {
  167.     viewerWidget->AttachAlignment(display);
  168.     menuBar->EnableTop(menuBar->FindMenu("Edit"), display->IsEditable());
  169.     menuBar->EnableTop(menuBar->FindMenu("Unaligned Justification"), display->IsEditable());
  170.     menuBar->Enable(MID_SELECT_COLS, enableSelectByColumn);
  171.     viewer->SetUndoRedoMenuStates();
  172. }
  173. void ViewerWindowBase::UpdateDisplay(SequenceDisplay *display)
  174. {
  175.     int vsX, vsY;   // to preserve scroll position
  176.     viewerWidget->GetScroll(&vsX, &vsY);
  177.     viewerWidget->AttachAlignment(display, vsX, vsY);
  178.     menuBar->EnableTop(menuBar->FindMenu("Edit"), display->IsEditable());
  179.     menuBar->EnableTop(menuBar->FindMenu("Unaligned Justification"), display->IsEditable());
  180.     GlobalMessenger()->PostRedrawAllSequenceViewers();
  181.     viewer->SetUndoRedoMenuStates();
  182. }
  183. void ViewerWindowBase::OnTitleView(wxCommandEvent& event)
  184. {
  185.     TRACEMSG("in OnTitleView()");
  186.     switch (event.GetId()) {
  187.         case MID_SHOW_TITLES:
  188.             viewerWidget->TitleAreaOn(); break;
  189.         case MID_HIDE_TITLES:
  190.             viewerWidget->TitleAreaOff(); break;
  191.     }
  192. }
  193. void ViewerWindowBase::OnEditMenu(wxCommandEvent& event)
  194. {
  195.     bool turnEditorOn = menuBar->IsChecked(MID_ENABLE_EDIT);
  196.     switch (event.GetId()) {
  197.         case MID_ENABLE_EDIT:
  198.             if (turnEditorOn) {
  199.                 TRACEMSG("turning on editor");
  200.                 if (!RequestEditorEnable(true)) {
  201.                     menuBar->Check(MID_ENABLE_EDIT, false);
  202.                     break;
  203.                 }
  204.                 EnableBaseEditorMenuItems(true);
  205.                 viewer->GetCurrentDisplay()->AddBlockBoundaryRows();    // add before push!
  206.                 viewer->EnableStacks();     // start up undo/redo stack system
  207.                 Command(MID_DRAG_HORIZ);    // switch to drag mode
  208.             } else {
  209.                 TRACEMSG("turning off editor");
  210.                 if (!RequestEditorEnable(false)) {   // cancelled
  211.                     menuBar->Check(MID_ENABLE_EDIT, true);
  212.                     break;
  213.                 }
  214.                 EnableBaseEditorMenuItems(false);
  215.                 viewer->GetCurrentDisplay()->RemoveBlockBoundaryRows();
  216.                 if (!menuBar->IsChecked(MID_SELECT_COLS) || !menuBar->IsChecked(MID_SELECT_ROWS))
  217.                     Command(MID_SELECT_RECT);
  218.             }
  219.             break;
  220.         case MID_UNDO:
  221.             TRACEMSG("undoing...");
  222.             viewer->Undo();
  223.             UpdateDisplay(viewer->GetCurrentDisplay());
  224.             if (AlwaysSyncStructures()) SyncStructures();
  225.             break;
  226.         case MID_REDO:
  227.             TRACEMSG("redoing...");
  228.             viewer->Redo();
  229.             UpdateDisplay(viewer->GetCurrentDisplay());
  230.             if (AlwaysSyncStructures()) SyncStructures();
  231.             break;
  232.         case MID_SPLIT_BLOCK:
  233.             CancelAllSpecialModesExcept(MID_SPLIT_BLOCK);
  234.             if (DoSplitBlock())
  235.                 SetCursor(*wxCROSS_CURSOR);
  236.             else
  237.                 SplitBlockOff();
  238.             break;
  239.         case MID_MERGE_BLOCKS:
  240.             CancelAllSpecialModesExcept(MID_MERGE_BLOCKS);
  241.             if (DoMergeBlocks()) {
  242.                 SetCursor(*wxCROSS_CURSOR);
  243.                 prevMouseMode = viewerWidget->GetMouseMode();
  244.                 viewerWidget->SetMouseMode(GetMouseModeForCreateAndMerge());
  245.             } else
  246.                 MergeBlocksOff();
  247.             break;
  248.         case MID_CREATE_BLOCK:
  249.             CancelAllSpecialModesExcept(MID_CREATE_BLOCK);
  250.             if (DoCreateBlock()) {
  251.                 SetCursor(*wxCROSS_CURSOR);
  252.                 prevMouseMode = viewerWidget->GetMouseMode();
  253.                 viewerWidget->SetMouseMode(GetMouseModeForCreateAndMerge());
  254.             } else
  255.                 CreateBlockOff();
  256.             break;
  257.         case MID_DELETE_BLOCK:
  258.             CancelAllSpecialModesExcept(MID_DELETE_BLOCK);
  259.             if (DoDeleteBlock())
  260.                 SetCursor(*wxCROSS_CURSOR);
  261.             else
  262.                 DeleteBlockOff();
  263.             break;
  264.         case MID_SYNC_STRUCS:
  265.             viewer->GetCurrentDisplay()->RedrawAlignedMolecules();
  266.             break;
  267.     }
  268. }
  269. void ViewerWindowBase::OnMouseMode(wxCommandEvent& event)
  270. {
  271.     const wxMenuItemList& items = mouseModeMenu->GetMenuItems();
  272.     for (int i=0; i<items.GetCount(); ++i)
  273.         items.Item(i)->GetData()->Check(
  274.             (items.Item(i)->GetData()->GetId() == event.GetId()) ? true : false);
  275.     switch (event.GetId()) {
  276.         case MID_SELECT_RECT:
  277.             viewerWidget->SetMouseMode(SequenceViewerWidget::eSelectRectangle); break;
  278.         case MID_SELECT_COLS:
  279.             viewerWidget->SetMouseMode(SequenceViewerWidget::eSelectColumns); break;
  280.         case MID_SELECT_ROWS:
  281.             viewerWidget->SetMouseMode(SequenceViewerWidget::eSelectRows); break;
  282.         case MID_DRAG_HORIZ:
  283.             viewerWidget->SetMouseMode(SequenceViewerWidget::eDragHorizontal); break;
  284.     }
  285. }
  286. void ViewerWindowBase::OnJustification(wxCommandEvent& event)
  287. {
  288.     for (int i=MID_LEFT; i<=MID_SPLIT; ++i)
  289.         menuBar->Check(i, (i == event.GetId()) ? true : false);
  290.     switch (event.GetId()) {
  291.         case MID_LEFT:
  292.             currentJustification = BlockMultipleAlignment::eLeft; break;
  293.         case MID_RIGHT:
  294.             currentJustification = BlockMultipleAlignment::eRight; break;
  295.         case MID_CENTER:
  296.             currentJustification = BlockMultipleAlignment::eCenter; break;
  297.         case MID_SPLIT:
  298.             currentJustification = BlockMultipleAlignment::eSplit; break;
  299.     }
  300.     GlobalMessenger()->PostRedrawSequenceViewer(viewer);
  301. }
  302. void ViewerWindowBase::OnShowGeomVltns(wxCommandEvent& event)
  303. {
  304.     const ViewerBase::AlignmentList& alignments = viewer->GetCurrentAlignments();
  305.     bool showGeometryViolations = menuBar->IsChecked(MID_SHOW_GEOM_VLTNS);
  306.     ViewerBase::AlignmentList::const_iterator a, ae = alignments.end();
  307.     int nViolations = 0;
  308.     for (a=alignments.begin(); a!=ae; ++a)
  309.         nViolations += (*a)->ShowGeometryViolations(showGeometryViolations);
  310.     if (showGeometryViolations)
  311.         INFOMSG("Found " << nViolations << " geometry violation"
  312.             << ((nViolations == 1) ? "" : "s") << " in this window");
  313.     GlobalMessenger()->PostRedrawSequenceViewer(viewer);
  314. }
  315. void ViewerWindowBase::OnFindPattern(wxCommandEvent& event)
  316. {
  317.     // remember previous pattern
  318.     static wxString previousPattern;
  319.     // get pattern from user
  320.     wxString pattern = wxGetTextFromUser("Enter a pattern using ProSite syntax:",
  321.         "Input pattern", previousPattern, this);
  322.     if (pattern.size() == 0) return;
  323.     // add trailing period if not present (convenience for the user)
  324.     if (pattern[pattern.size() - 1] != '.') pattern += '.';
  325.     previousPattern = pattern;
  326.     GlobalMessenger()->RemoveAllHighlights(true);
  327.     // highlight pattern from each (unique) sequence in the display
  328.     map < const Sequence * , bool > usedSequences;
  329.     const SequenceDisplay *display = viewer->GetCurrentDisplay();
  330.     for (int i=0; i<display->NRows(); ++i) {
  331.         const Sequence *sequence = display->GetSequenceForRow(i);
  332.         if (!sequence || usedSequences.find(sequence) != usedSequences.end()) continue;
  333.         usedSequences[sequence] = true;
  334.         if (!sequence->HighlightPattern(pattern.c_str())) break;
  335.     }
  336. }
  337. void ViewerWindowBase::MakeSequenceVisible(const MoleculeIdentifier *identifier)
  338. {
  339.     const SequenceDisplay *display = viewer->GetCurrentDisplay();
  340.     for (int i=0; i<display->NRows(); ++i) {
  341.         const Sequence *sequence = display->GetSequenceForRow(i);
  342.         if (sequence && sequence->identifier == identifier) {
  343.             viewerWidget->MakeCharacterVisible(-1, i);
  344.             break;
  345.         }
  346.     }
  347. }
  348. END_SCOPE(Cn3D)
  349. /*
  350. * ---------------------------------------------------------------------------
  351. * $Log: viewer_window_base.cpp,v $
  352. * Revision 1000.3  2004/06/01 18:29:58  gouriano
  353. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.50
  354. *
  355. * Revision 1.50  2004/05/21 21:41:40  gorelenk
  356. * Added PCH ncbi_pch.hpp
  357. *
  358. * Revision 1.49  2004/03/15 18:38:52  thiessen
  359. * prefer prefix vs. postfix ++/-- operators
  360. *
  361. * Revision 1.48  2004/02/19 17:05:22  thiessen
  362. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  363. *
  364. * Revision 1.47  2003/11/06 18:52:32  thiessen
  365. * make geometry violations shown on/off; allow multiple pmid entry in ref dialog
  366. *
  367. * Revision 1.46  2003/07/17 16:52:34  thiessen
  368. * add FileSaved message with edit typing
  369. *
  370. * Revision 1.45  2003/02/03 19:20:09  thiessen
  371. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  372. *
  373. * Revision 1.44  2003/01/31 17:18:59  thiessen
  374. * many small additions and changes...
  375. *
  376. * Revision 1.43  2003/01/23 20:03:05  thiessen
  377. * add BLAST Neighbor algorithm
  378. *
  379. * Revision 1.42  2002/12/19 14:15:37  thiessen
  380. * mac fixes to menus, add icon
  381. *
  382. * Revision 1.41  2002/11/22 19:54:29  thiessen
  383. * fixes for wxMac/OSX
  384. *
  385. * Revision 1.40  2002/10/18 17:31:10  thiessen
  386. * fix for gcc
  387. *
  388. * Revision 1.39  2002/10/18 17:15:33  thiessen
  389. * use wxNativeEncodingInfo to store fonts in registry
  390. *
  391. * Revision 1.38  2002/10/15 22:04:09  thiessen
  392. * fix geom vltns bug
  393. *
  394. * Revision 1.37  2002/10/13 22:58:08  thiessen
  395. * add redo ability to editor
  396. *
  397. * Revision 1.36  2002/10/07 13:29:32  thiessen
  398. * add double-click -> show row to taxonomy tree
  399. *
  400. * Revision 1.35  2002/09/06 13:06:31  thiessen
  401. * fix menu accelerator conflicts
  402. *
  403. * Revision 1.34  2002/08/15 22:13:18  thiessen
  404. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  405. *
  406. * Revision 1.33  2002/06/13 14:54:07  thiessen
  407. * add sort by self-hit
  408. *
  409. * Revision 1.32  2002/06/05 14:28:42  thiessen
  410. * reorganize handling of window titles
  411. *
  412. * Revision 1.31  2002/05/26 21:59:16  thiessen
  413. * tweaks for new window styles
  414. *
  415. * Revision 1.30  2002/05/17 19:10:27  thiessen
  416. * preliminary range restriction for BLAST/PSSM
  417. *
  418. * Revision 1.29  2002/03/01 19:21:00  thiessen
  419. * add icon to all frames
  420. *
  421. * Revision 1.28  2002/03/01 15:47:46  thiessen
  422. * try tool window style for sequence/log viewers
  423. *
  424. * Revision 1.27  2002/02/21 12:26:30  thiessen
  425. * fix row delete bug ; remember threader options
  426. *
  427. * Revision 1.26  2001/12/06 23:13:47  thiessen
  428. * finish import/align new sequences into single-structure data; many small tweaks
  429. *
  430. * Revision 1.25  2001/11/27 16:26:10  thiessen
  431. * major update to data management system
  432. *
  433. * Revision 1.24  2001/10/16 21:49:07  thiessen
  434. * restructure MultiTextDialog; allow virtual bonds for alpha-only PDB's
  435. *
  436. * Revision 1.23  2001/08/16 19:21:02  thiessen
  437. * add face name info to fonts
  438. *
  439. * Revision 1.22  2001/08/14 17:18:22  thiessen
  440. * add user font selection, store in registry
  441. *
  442. * Revision 1.21  2001/07/27 13:52:47  thiessen
  443. * make sure domains are assigned in order of molecule id; tweak pattern dialog
  444. *
  445. * Revision 1.20  2001/07/26 13:41:53  thiessen
  446. * add pattern memory, make period optional
  447. *
  448. * Revision 1.19  2001/07/24 15:02:59  thiessen
  449. * use ProSite syntax for pattern searches
  450. *
  451. * Revision 1.18  2001/07/23 20:24:23  thiessen
  452. * need redraw if no matches found
  453. *
  454. * Revision 1.17  2001/07/23 20:09:23  thiessen
  455. * add regex pattern search
  456. *
  457. * Revision 1.16  2001/05/31 14:32:33  thiessen
  458. * tweak font handling
  459. *
  460. * Revision 1.15  2001/05/23 17:45:41  thiessen
  461. * change dialog implementation to wxDesigner; interface changes
  462. *
  463. * Revision 1.14  2001/05/15 14:57:56  thiessen
  464. * add cn3d_tools; bring up log window when threading starts
  465. *
  466. * Revision 1.13  2001/05/11 13:45:06  thiessen
  467. * set up data directory
  468. *
  469. * Revision 1.12  2001/05/11 02:10:42  thiessen
  470. * add better merge fail indicators; tweaks to windowing/taskbar
  471. *
  472. * Revision 1.11  2001/04/18 15:46:54  thiessen
  473. * show description, length, and PDB numbering in status line
  474. *
  475. * Revision 1.10  2001/04/05 22:55:37  thiessen
  476. * change bg color handling ; show geometry violations
  477. *
  478. * Revision 1.9  2001/03/30 14:43:41  thiessen
  479. * show threader scores in status line; misc UI tweaks
  480. *
  481. * Revision 1.8  2001/03/30 03:07:35  thiessen
  482. * add threader score calculation & sorting
  483. *
  484. * Revision 1.7  2001/03/19 15:50:40  thiessen
  485. * add sort rows by identifier
  486. *
  487. * Revision 1.6  2001/03/13 01:25:07  thiessen
  488. * working undo system for >1 alignment (e.g., update window)
  489. *
  490. * Revision 1.5  2001/03/09 15:49:06  thiessen
  491. * major changes to add initial update viewer
  492. *
  493. * Revision 1.4  2001/03/07 13:39:12  thiessen
  494. * damn string namespace weirdness again
  495. *
  496. * Revision 1.3  2001/03/06 20:20:51  thiessen
  497. * progress towards >1 alignment in a SequenceDisplay ; misc minor fixes
  498. *
  499. * Revision 1.2  2001/03/02 03:26:59  thiessen
  500. * fix dangling pointer upon app close
  501. *
  502. * Revision 1.1  2001/03/01 20:15:51  thiessen
  503. * major rearrangement of sequence viewer code into base and derived classes
  504. *
  505. */