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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: show_hide_manager.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:29:21  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.23
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: show_hide_manager.cpp,v 1000.2 2004/06/01 18:29:21 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. *      manager object to track show/hide status of objects at various levels
  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 "show_hide_manager.hpp"
  46. #include "structure_set.hpp"
  47. #include "molecule.hpp"
  48. #include "residue.hpp"
  49. #include "chemical_graph.hpp"
  50. #include "messenger.hpp"
  51. #include "alignment_manager.hpp"
  52. #include "opengl_renderer.hpp"
  53. #include "cn3d_tools.hpp"
  54. #include "molecule_identifier.hpp"
  55. #include <corelib/ncbistre.hpp>
  56. #include <vector>
  57. USING_NCBI_SCOPE;
  58. BEGIN_SCOPE(Cn3D)
  59. // ShowHideInfo is a generic container class to help organize the list of things that can be
  60. // shown/hidden; stuff derived from it allows various types of objects to be shown/hidden
  61. string indent("     ");
  62. class ShowHideInfo
  63. {
  64. protected:
  65.     string label;
  66. public:
  67.     vector < int > parentIndexes;
  68.     void GetLabel(string *str) const { *str = label; }
  69.     virtual bool IsVisible(const ShowHideManager *shm) const = 0;
  70.     virtual void Show(ShowHideManager *shm, bool isShown) const = 0;
  71. };
  72. class ShowHideObject : public ShowHideInfo
  73. {
  74. private:
  75.     const StructureObject *object;
  76. public:
  77.     ShowHideObject(const StructureObject *o) : object(o) { label = o->pdbID; }
  78.     bool IsVisible(const ShowHideManager *shm) const { return shm->IsVisible(object); }
  79.     void Show(ShowHideManager *shm, bool isShown) const { shm->Show(object, isShown); }
  80. };
  81. class ShowHideMolecule : public ShowHideInfo
  82. {
  83. private:
  84.     const Molecule *molecule;
  85. public:
  86.     ShowHideMolecule(const Molecule *m) : molecule(m)
  87.     {
  88.         label = indent + m->identifier->pdbID;
  89.         if (m->identifier->pdbChain != ' ') {
  90.             label += '_';
  91.             label += (char) m->identifier->pdbChain;
  92.         }
  93.     }
  94.     bool IsVisible(const ShowHideManager *shm) const { return shm->IsVisible(molecule); }
  95.     void Show(ShowHideManager *shm, bool isShown) const { shm->Show(molecule, isShown); }
  96. };
  97. class ShowHideDomain : public ShowHideInfo
  98. {
  99. private:
  100.     const Molecule *molecule;
  101.     int domainID;
  102. public:
  103.     ShowHideDomain(const Molecule *m, int d, int labelNum) : molecule(m), domainID(d)
  104.     {
  105.         CNcbiOstrstream oss;
  106.         oss << indent << indent << m->identifier->pdbID;
  107.         if (m->identifier->pdbChain != ' ') oss << '_' << (char) m->identifier->pdbChain;
  108.         oss << " d" << labelNum << '';
  109.         label = oss.str();
  110.         delete oss.str();
  111.     }
  112.     bool IsVisible(const ShowHideManager *shm) const
  113.     {
  114.         bool isVisible = false;
  115.         for (int i=0; i<molecule->NResidues(); ++i) {
  116.             if (molecule->residueDomains[i] == domainID &&
  117.                 shm->IsVisible(molecule->residues.find(i+1)->second)) {
  118.                 isVisible = true;   // return true if any residue from this domain is visible
  119.                 break;
  120.             }
  121.         }
  122.         return isVisible;
  123.     }
  124.     void Show(ShowHideManager *shm, bool isShown) const
  125.     {
  126.         for (int i=0; i<molecule->NResidues(); ++i)
  127.             if (molecule->residueDomains[i] == domainID)
  128.                 shm->Show(molecule->residues.find(i+1)->second, isShown);
  129.     }
  130. };
  131. ///// the ShowHideManager class /////
  132. ShowHideManager::~ShowHideManager()
  133. {
  134.     for (int i=0; i<structureInfo.size(); ++i) delete structureInfo[i];
  135. }
  136. static void PostRedrawEntity(const StructureObject *object, const Molecule *molecule, const Residue *residue)
  137. {
  138.     if (residue) {
  139.         const Molecule *m;
  140.         if (residue->GetParentOfType(&m))
  141.             GlobalMessenger()->PostRedrawMolecule(m);
  142.     }
  143.     else if (molecule) {
  144.         GlobalMessenger()->PostRedrawMolecule(molecule);
  145.     }
  146.     else if (object) {
  147.         // redraw all prot/nuc molecules
  148.         ChemicalGraph::MoleculeMap::const_iterator m, me = object->graph->molecules.end();
  149.         for (m=object->graph->molecules.begin(); m!=me; ++m) {
  150.             if (m->second->IsProtein() || m->second->IsNucleotide())
  151.                 GlobalMessenger()->PostRedrawMolecule(m->second);
  152.         }
  153.     }
  154.     GlobalMessenger()->PostRedrawAllSequenceViewers();
  155. }
  156. void ShowHideManager::Show(const StructureBase *entity, bool isShown)
  157. {
  158.     // make sure this is a valid entity
  159.     const StructureObject *object = dynamic_cast<const StructureObject *>(entity);
  160.     const Molecule *molecule = dynamic_cast<const Molecule *>(entity);
  161.     const Residue *residue = dynamic_cast<const Residue *>(entity);
  162.     if (!entity || !(object || molecule || residue)) {
  163.         ERRORMSG("ShowHideManager::Show() - must be a StructureObject, Molecule, or Residue");
  164.         return;
  165.     }
  166.     EntitiesHidden::iterator e = entitiesHidden.find(entity);
  167.     // hide an entity that's not already hidden
  168.     if (!isShown && e == entitiesHidden.end()) {
  169.         entitiesHidden[entity] = true;
  170.         PostRedrawEntity(object, molecule, residue);
  171.         entity->parentSet->renderer->ShowAllFrames();
  172.     }
  173.     // show an entity that's currently hidden
  174.     else if (isShown && e != entitiesHidden.end()) {
  175.         UnHideEntityAndChildren(entity);
  176.         PostRedrawEntity(object, molecule, residue);
  177.         entity->parentSet->renderer->ShowAllFrames();
  178.     }
  179. }
  180. void ShowHideManager::UnHideEntityAndChildren(const StructureBase *entity)
  181. {
  182.     if (!entity || !IsHidden(entity)) return;
  183.     const StructureObject *object = dynamic_cast<const StructureObject *>(entity);
  184.     const Molecule *molecule = dynamic_cast<const Molecule *>(entity);
  185.     const Residue *residue = dynamic_cast<const Residue *>(entity);
  186.     // if entity is residue, just remove it from the list if present
  187.     if (residue) {
  188.         EntitiesHidden::iterator h = entitiesHidden.find(residue);
  189.         if (h != entitiesHidden.end()) entitiesHidden.erase(h);
  190.         return;
  191.     }
  192.     // otherwise, make sure entity and its descendents are visible
  193.     // if it isn't already visible, then unhide this entity and all of its children
  194.     EntitiesHidden::iterator h, he = entitiesHidden.end();
  195.     for (h=entitiesHidden.begin(); h!=he; ) {
  196.         const StructureObject *hObj = dynamic_cast<const StructureObject *>(h->first);
  197.         if (object && !hObj)
  198.             h->first->GetParentOfType(&hObj);
  199.         const Molecule *hMol = dynamic_cast<const Molecule *>(h->first);
  200.         if (molecule && hObj != h->first && !hMol)  // if not StructureObject or Molecule
  201.             h->first->GetParentOfType(&hMol);       // must be residue
  202.         if (entity == h->first ||               // unhide the entity itself
  203.             (object && hObj == object) ||       // unhide children of a StructureObject
  204.             (molecule && hMol == molecule))     // unhide children of a Molecule
  205.         {
  206.             EntitiesHidden::iterator d(h);
  207.             ++h;
  208.             entitiesHidden.erase(d);
  209.         } else {
  210.             ++h;
  211.         }
  212.     }
  213.     PostRedrawEntity(object, molecule, residue);
  214.     entity->parentSet->renderer->ShowAllFrames();
  215. }
  216. bool ShowHideManager::IsHidden(const StructureBase *entity) const
  217. {
  218.     if (entitiesHidden.size() == 0) return false;
  219.     const StructureObject *object;
  220.     const Molecule *molecule;
  221.     const Residue *residue;
  222.     EntitiesHidden::const_iterator e = entitiesHidden.find(entity);
  223.     if ((object = dynamic_cast<const StructureObject *>(entity)) != NULL) {
  224.         return (e != entitiesHidden.end());
  225.     }
  226.     else if ((molecule = dynamic_cast<const Molecule *>(entity)) != NULL) {
  227.         if (!molecule->GetParentOfType(&object)) return false;
  228.         return (entitiesHidden.find(object) != entitiesHidden.end() ||
  229.                 e != entitiesHidden.end());
  230.     }
  231.     else if ((residue = dynamic_cast<const Residue *>(entity)) != NULL) {
  232.         if (!residue->GetParentOfType(&molecule) ||
  233.             !molecule->GetParentOfType(&object)) return false;
  234.         return (entitiesHidden.find(object) != entitiesHidden.end() ||
  235.                 entitiesHidden.find(molecule) != entitiesHidden.end() ||
  236.                 e != entitiesHidden.end());
  237.     }
  238.     ERRORMSG("ShowHideManager::IsHidden() - must be a StructureObject, Molecule, or Residue");
  239.     return false;
  240. }
  241. void ShowHideManager::ConstructShowHideArray(const StructureSet *structureSet)
  242. {
  243.     ShowHideInfo *info;
  244.     int objectIndex, moleculeIndex;
  245.     StructureSet::ObjectList::const_iterator o, oe = structureSet->objects.end();
  246.     for (o=structureSet->objects.begin(); o!=oe; ++o) {
  247.         objectIndex = structureInfo.size();
  248.         structureInfo.push_back(new ShowHideObject(*o));
  249.         // list interesting (prot/nuc) chains
  250.         ChemicalGraph::MoleculeMap::const_iterator m, me = (*o)->graph->molecules.end();
  251.         for (m=(*o)->graph->molecules.begin(); m!=me; ++m) {
  252.             int nDom = 1; // # domains in this chain
  253.             if (m->second->IsProtein() || m->second->IsNucleotide()) {
  254.                 moleculeIndex = structureInfo.size();
  255.                 info = new ShowHideMolecule(m->second);
  256.                 info->parentIndexes.push_back(objectIndex);
  257.                 structureInfo.push_back(info);
  258.                 // if there at least one domain, enumerate them
  259.                 if (m->second->nDomains >= 1) {
  260.                     StructureObject::DomainMap::const_iterator d, de = (*o)->domainMap.end();
  261.                     for (d=(*o)->domainMap.begin(); d!=de; ++d) {
  262.                         if (d->second == m->second) {
  263.                             info = new ShowHideDomain(m->second, d->first, ++nDom);
  264.                             info->parentIndexes.push_back(objectIndex);
  265.                             info->parentIndexes.push_back(moleculeIndex);
  266.                             structureInfo.push_back(info);
  267.                         }
  268.                     }
  269.                 }
  270.             }
  271.         }
  272.     }
  273. }
  274. void ShowHideManager::GetShowHideInfo(
  275.     vector < string > *names, vector < bool > *visibilities) const
  276. {
  277.     names->resize(structureInfo.size());
  278.     visibilities->resize(structureInfo.size());
  279.     for (int i=0; i<structureInfo.size(); ++i) {
  280.         structureInfo[i]->GetLabel(&((*names)[i]));
  281.         (*visibilities)[i] = structureInfo[i]->IsVisible(this);
  282.     }
  283. }
  284. void ShowHideManager::ShowHideCallbackFunction(const vector < bool >& itemsEnabled)
  285. {
  286.     if (itemsEnabled.size() != structureInfo.size()) {
  287.         ERRORMSG("ShowHideManager::ShowHideCallbackFunction() - wrong size list");
  288.         return;
  289.     }
  290.     for (int i=0; i<itemsEnabled.size(); ++i)
  291.         structureInfo[i]->Show(this, itemsEnabled[i]);
  292.     TRACEMSG("entities hidden: " << entitiesHidden.size());
  293. }
  294. bool ShowHideManager::SelectionChangedCallback(
  295.     const vector < bool >& original, vector < bool >& itemsEnabled)
  296. {
  297.     // count number of changes
  298.     int i, nChanges = 0, itemChanged, nEnabled = 0, itemEnabled;
  299.     for (i=0; i<itemsEnabled.size(); ++i) {
  300.         if (itemsEnabled[i] != original[i]) {
  301.             ++nChanges;
  302.             itemChanged = i;
  303.         }
  304.         if (itemsEnabled[i]) {
  305.             ++nEnabled;
  306.             itemEnabled = i;
  307.         }
  308.     }
  309.     // if change was a single de/selection, then turn off/on the children of that item
  310.     bool anyChange = false;
  311.     if (nChanges == 1 || nEnabled == 1) {
  312.         int item = (nChanges == 1) ? itemChanged : itemEnabled;
  313.         for (i=item+1; i<structureInfo.size(); ++i) {
  314.             for (int j=0; j<structureInfo[i]->parentIndexes.size(); ++j) {
  315.                 if (structureInfo[i]->parentIndexes[j] == item) {
  316.                     if (itemsEnabled[i] != itemsEnabled[item]) {
  317.                         itemsEnabled[i] = itemsEnabled[item];
  318.                         anyChange = true;
  319.                     }
  320.                 }
  321.             }
  322.         }
  323.     }
  324.     // check all items to make sure that when an object is on, its parents are also on
  325.     for (i=0; i<itemsEnabled.size(); ++i) {
  326.         if (itemsEnabled[i]) {
  327.             for (int j=0; j<structureInfo[i]->parentIndexes.size(); ++j) {
  328.                 if (!itemsEnabled[structureInfo[i]->parentIndexes[j]]) {
  329.                     itemsEnabled[structureInfo[i]->parentIndexes[j]] = true;
  330.                     anyChange = true;
  331.                 }
  332.             }
  333.         }
  334.     }
  335.     return anyChange;
  336. }
  337. void ShowHideManager::MakeAllVisible(void)
  338. {
  339.     while (entitiesHidden.size() > 0) Show(entitiesHidden.begin()->first, true);
  340. }
  341. void ShowHideManager::ShowAlignedDomains(const StructureSet *set)
  342. {
  343.     MakeAllVisible();
  344.     StructureSet::ObjectList::const_iterator o, oe = set->objects.end();
  345.     for (o=set->objects.begin(); o!=oe; ++o) {
  346.         ChemicalGraph::MoleculeMap::const_iterator m, me = (*o)->graph->molecules.end();
  347.         for (m=(*o)->graph->molecules.begin(); m!=me; ++m) {
  348.             if (m->second->IsNucleotide()) {        // hide all nucleotides
  349.                 Show(m->second, false);
  350.                 continue;
  351.             }
  352.             if (!m->second->IsProtein()) continue;  // but leave all hets/solvents visible
  353.             if (!set->alignmentManager->IsInAlignment(m->second->sequence)) {
  354.                 Show(m->second, false);
  355.                 continue;
  356.             }
  357.             map < int, bool > domains;
  358.             Molecule::ResidueMap::const_iterator r, re = m->second->residues.end();
  359.             // first pass determines which domains have any aligned residues
  360.             for (r=m->second->residues.begin(); r!=re; ++r)
  361.                 if (set->alignmentManager->IsAligned(m->second->sequence, r->first - 1))
  362.                     domains[m->second->residueDomains[r->first - 1]] = true;
  363.             // second pass does hides domains not represented
  364.             for (r=m->second->residues.begin(); r!=re; ++r)
  365.                 if (domains.find(m->second->residueDomains[r->first - 1]) == domains.end())
  366.                     Show(r->second, false);
  367.         }
  368.     }
  369. }
  370. void ShowHideManager::PrivateShowResidues(const StructureSet *set, bool showAligned)
  371. {
  372.     StructureSet::ObjectList::const_iterator o, oe = set->objects.end();
  373.     for (o=set->objects.begin(); o!=oe; ++o) {
  374.         ChemicalGraph::MoleculeMap::const_iterator m, me = (*o)->graph->molecules.end();
  375.         for (m=(*o)->graph->molecules.begin(); m!=me; ++m) {
  376.             if (m->second->IsNucleotide()) {        // hide all nucleotides
  377.                 Show(m->second, false);
  378.                 continue;
  379.             }
  380.             if (!m->second->IsProtein()) continue;  // but leave all hets/solvents visible
  381.             if (!set->alignmentManager->IsInAlignment(m->second->sequence)) {
  382.                 if (showAligned) Show(m->second, false);
  383.                 continue;
  384.             }
  385.             Molecule::ResidueMap::const_iterator r, re = m->second->residues.end();
  386.             for (r=m->second->residues.begin(); r!=re; ++r) {
  387.                 bool aligned = set->alignmentManager->IsAligned(m->second->sequence, r->first - 1);
  388.                 if ((showAligned && !aligned) || (!showAligned && aligned))
  389.                     Show(r->second, false);
  390.             }
  391.         }
  392.     }
  393. }
  394. void ShowHideManager::ShowResidues(const StructureSet *set, bool showAligned)
  395. {
  396.     MakeAllVisible();
  397.     PrivateShowResidues(set, showAligned);
  398. }
  399. void ShowHideManager::ShowUnalignedResiduesInAlignedDomains(const StructureSet *set)
  400. {
  401.     ShowAlignedDomains(set);
  402.     PrivateShowResidues(set, false);
  403. }
  404. void ShowHideManager::ShowSelectedResidues(const StructureSet *set)
  405. {
  406.     MakeAllVisible();
  407.     if (!GlobalMessenger()->IsAnythingHighlighted()) return;
  408.     StructureSet::ObjectList::const_iterator o, oe = set->objects.end();
  409.     for (o=set->objects.begin(); o!=oe; ++o) {
  410.         bool anyResidueInObjectVisible = false;
  411.         ChemicalGraph::MoleculeMap::const_iterator m, me = (*o)->graph->molecules.end();
  412.         for (m=(*o)->graph->molecules.begin(); m!=me; ++m) {
  413.             Molecule::ResidueMap::const_iterator r, re = m->second->residues.end();
  414.             bool anyResidueInMoleculeVisible = false;
  415.             for (r=m->second->residues.begin(); r!=re; ++r) {
  416.                 if (!GlobalMessenger()->IsHighlighted(m->second, r->first))
  417.                     Show(r->second, false);
  418.                 else
  419.                     anyResidueInMoleculeVisible = anyResidueInObjectVisible = true;
  420.             }
  421.             if (!anyResidueInMoleculeVisible) {
  422.                 for (r=m->second->residues.begin(); r!=re; ++r)
  423.                     Show(r->second, true);  // un-flag individual residues
  424.                 Show(m->second, false);     // flag whole molecule as hidden
  425.             }
  426.         }
  427.         if (!anyResidueInObjectVisible) {
  428.             for (m=(*o)->graph->molecules.begin(); m!=me; ++m)
  429.                 Show(m->second, true);      // un-flag individual molecules
  430.             Show(*o, false);                // flag whole object as hidden
  431.         }
  432.     }
  433. }
  434. void ShowHideManager::ShowDomainsWithHighlights(const StructureSet *set)
  435. {
  436.     // first, show all highlighted stuff
  437.     MakeAllVisible();
  438.     if (!GlobalMessenger()->IsAnythingHighlighted()) return;
  439.     ShowSelectedResidues(set);
  440.     // then, also show all domains that contain highlighted residues
  441.     StructureSet::ObjectList::const_iterator o, oe = set->objects.end();
  442.     for (o=set->objects.begin(); o!=oe; ++o) {
  443.         ChemicalGraph::MoleculeMap::const_iterator m, me = (*o)->graph->molecules.end();
  444.         for (m=(*o)->graph->molecules.begin(); m!=me; ++m) {
  445.             Molecule::ResidueMap::const_iterator r, re = m->second->residues.end();
  446.             // find domains in this molecule that have highlights
  447.             map < int , bool > domains;
  448.             int domain;
  449.             for (r=m->second->residues.begin(); r!=re; ++r) {
  450.                 if (GlobalMessenger()->IsHighlighted(m->second, r->first)) {
  451.                     domain = m->second->residueDomains[r->first - 1];
  452.                     if (domain != Molecule::NO_DOMAIN_SET)
  453.                         domains[domain] = true;
  454.                 }
  455.             }
  456.             // now show all residues in these domains
  457.             for (r=m->second->residues.begin(); r!=re; ++r) {
  458.                 domain = m->second->residueDomains[r->first - 1];
  459.                 if (domain != Molecule::NO_DOMAIN_SET && domains.find(domain) != domains.end())
  460.                     Show(r->second, true);
  461.             }
  462.         }
  463.     }
  464. }
  465. END_SCOPE(Cn3D)
  466. /*
  467. * ---------------------------------------------------------------------------
  468. * $Log: show_hide_manager.cpp,v $
  469. * Revision 1000.2  2004/06/01 18:29:21  gouriano
  470. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.23
  471. *
  472. * Revision 1.23  2004/05/21 21:41:40  gorelenk
  473. * Added PCH ncbi_pch.hpp
  474. *
  475. * Revision 1.22  2004/03/15 18:32:03  thiessen
  476. * prefer prefix vs. postfix ++/-- operators
  477. *
  478. * Revision 1.21  2004/02/19 17:05:13  thiessen
  479. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  480. *
  481. * Revision 1.20  2003/02/03 19:20:06  thiessen
  482. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  483. *
  484. * Revision 1.19  2002/11/10 20:32:04  thiessen
  485. * show/hide optimizations, esp. show domains with highlights
  486. *
  487. * Revision 1.18  2002/10/28 21:36:01  thiessen
  488. * add show domains with highlights
  489. *
  490. * Revision 1.17  2002/06/21 14:40:15  thiessen
  491. * fix show/hide of nucleotides
  492. *
  493. * Revision 1.16  2001/10/08 14:18:33  thiessen
  494. * fix show/hide dialog under wxGTK
  495. *
  496. * Revision 1.15  2001/08/10 15:01:57  thiessen
  497. * fill out shortcuts; add update show/hide menu
  498. *
  499. * Revision 1.14  2001/07/12 17:35:15  thiessen
  500. * change domain mapping ; add preliminary cdd annotation GUI
  501. *
  502. * Revision 1.13  2001/06/21 02:02:34  thiessen
  503. * major update to molecule identification and highlighting ; add toggle highlight (via alt)
  504. *
  505. * Revision 1.12  2001/06/02 17:22:46  thiessen
  506. * fixes for GCC
  507. *
  508. * Revision 1.11  2001/05/31 18:47:09  thiessen
  509. * add preliminary style dialog; remove LIST_TYPE; add thread single and delete all; misc tweaks
  510. *
  511. * Revision 1.10  2001/05/17 18:34:26  thiessen
  512. * spelling fixes; change dialogs to inherit from wxDialog
  513. *
  514. * Revision 1.9  2001/03/09 15:49:05  thiessen
  515. * major changes to add initial update viewer
  516. *
  517. * Revision 1.8  2001/03/01 20:15:51  thiessen
  518. * major rearrangement of sequence viewer code into base and derived classes
  519. *
  520. * Revision 1.7  2001/01/25 20:21:18  thiessen
  521. * fix ostrstream memory leaks
  522. *
  523. * Revision 1.6  2000/12/29 19:23:39  thiessen
  524. * save row order
  525. *
  526. * Revision 1.5  2000/12/19 16:39:09  thiessen
  527. * tweaks to show/hide
  528. *
  529. * Revision 1.4  2000/12/15 15:51:47  thiessen
  530. * show/hide system installed
  531. *
  532. * Revision 1.3  2000/12/01 19:35:57  thiessen
  533. * better domain assignment; basic show/hide mechanism
  534. *
  535. * Revision 1.2  2000/08/17 18:33:12  thiessen
  536. * minor fixes to StyleManager
  537. *
  538. * Revision 1.1  2000/08/03 15:13:59  thiessen
  539. * add skeleton of style and show/hide managers
  540. *
  541. */