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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: sequence_viewer_window.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:29:17  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.54
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: sequence_viewer_window.cpp,v 1000.2 2004/06/01 18:29:17 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. *      implementation of GUI part of main sequence/alignment viewer
  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. #ifdef __WXMSW__
  47. #include <windows.h>
  48. #include <wx/msw/winundef.h>
  49. #endif
  50. #include <wx/wx.h>
  51. #include "taxonomy_tree.hpp"
  52. #include "sequence_viewer_window.hpp"
  53. #include "sequence_viewer.hpp"
  54. #include "alignment_manager.hpp"
  55. #include "sequence_set.hpp"
  56. #include "show_hide_dialog.hpp"
  57. #include "sequence_display.hpp"
  58. #include "messenger.hpp"
  59. #include "wx_tools.hpp"
  60. #include "molecule_identifier.hpp"
  61. #include "cn3d_tools.hpp"
  62. #include "cn3d_blast.hpp"
  63. USING_NCBI_SCOPE;
  64. BEGIN_SCOPE(Cn3D)
  65. static double prevPSSMWeight = -1.0;    // so scoring dialog remembers prev value
  66. BEGIN_EVENT_TABLE(SequenceViewerWindow, wxFrame)
  67.     INCLUDE_VIEWER_WINDOW_BASE_EVENTS
  68.     EVT_CLOSE     (                                     SequenceViewerWindow::OnCloseWindow)
  69.     EVT_MENU      (MID_SHOW_HIDE_ROWS,                  SequenceViewerWindow::OnShowHideRows)
  70.     EVT_MENU      (MID_DELETE_ROW,                      SequenceViewerWindow::OnDeleteRow)
  71.     EVT_MENU      (MID_MOVE_ROW,                        SequenceViewerWindow::OnMoveRow)
  72.     EVT_MENU      (MID_SHOW_UPDATES,                    SequenceViewerWindow::OnShowUpdates)
  73.     EVT_MENU_RANGE(MID_REALIGN_ROW, MID_REALIGN_ROWS,   SequenceViewerWindow::OnRealign)
  74.     EVT_MENU_RANGE(MID_SORT_IDENT, MID_PROXIMITY_SORT,  SequenceViewerWindow::OnSort)
  75.     EVT_MENU      (MID_SCORE_THREADER,                  SequenceViewerWindow::OnScoreThreader)
  76.     EVT_MENU_RANGE(MID_MARK_BLOCK, MID_CLEAR_MARKS,     SequenceViewerWindow::OnMarkBlock)
  77.     EVT_MENU_RANGE(MID_EXPORT_FASTA, MID_EXPORT_HTML,   SequenceViewerWindow::OnExport)
  78.     EVT_MENU      (MID_SELF_HIT,                        SequenceViewerWindow::OnSelfHit)
  79.     EVT_MENU_RANGE(MID_TAXONOMY_FULL, MID_TAXONOMY_ABBR,    SequenceViewerWindow::OnTaxonomy)
  80.     EVT_MENU      (MID_HIGHLIGHT_BLOCKS,                SequenceViewerWindow::OnHighlightBlocks)
  81. END_EVENT_TABLE()
  82. SequenceViewerWindow::SequenceViewerWindow(SequenceViewer *parentSequenceViewer) :
  83.     ViewerWindowBase(parentSequenceViewer, wxPoint(0,500), wxSize(1000,200)),
  84.     sequenceViewer(parentSequenceViewer), taxonomyTree(NULL)
  85. {
  86.     SetWindowTitle();
  87.     viewMenu->Append(MID_SHOW_HIDE_ROWS, "Show/Hide &Rows");
  88.     viewMenu->Append(MID_SCORE_THREADER, "Show PSSM+Contact &Scores");
  89.     viewMenu->Append(MID_SELF_HIT, "Show Se&lf-Hits");
  90.     wxMenu *subMenu = new wxMenu;
  91.     subMenu->Append(MID_EXPORT_FASTA, "&FASTA");
  92.     subMenu->Append(MID_EXPORT_A2M, "&A2M FASTA");
  93.     subMenu->Append(MID_EXPORT_TEXT, "&Text");
  94.     subMenu->Append(MID_EXPORT_HTML, "&HTML");
  95.     viewMenu->Append(MID_EXPORT, "&Export...", subMenu);
  96.     subMenu = new wxMenu;
  97.     subMenu->Append(MID_TAXONOMY_FULL, "&Full");
  98.     subMenu->Append(MID_TAXONOMY_ABBR, "&Abbreviated");
  99.     viewMenu->Append(MID_TAXONOMY, "Show Ta&xonomy...", subMenu);
  100.     viewMenu->Append(MID_HIGHLIGHT_BLOCKS, "&Highlight blocks");
  101.     editMenu->AppendSeparator();
  102.     subMenu = new wxMenu;
  103.     subMenu->Append(MID_SORT_IDENT, "By &Identifier");
  104.     subMenu->Append(MID_SORT_THREADER, "By &Score");
  105.     subMenu->Append(MID_FLOAT_PDBS, "Float &PDBs");
  106.     subMenu->Append(MID_FLOAT_HIGHLIGHTS, "Float Hi&ghlights");
  107.     subMenu->Append(MID_FLOAT_G_V, "Float &Geometry Violations");
  108.     subMenu->Append(MID_SORT_SELF_HIT, "By Self-&Hit");
  109.     subMenu->Append(MID_PROXIMITY_SORT, "&Proximity Sort", "", true);
  110.     editMenu->Append(MID_SORT_ROWS, "Sort &Rows...", subMenu);
  111.     editMenu->Append(MID_DELETE_ROW, "De&lete Row", "", true);
  112.     mouseModeMenu->Append(MID_MOVE_ROW, "&Move Row", "", true);
  113.     updateMenu = new wxMenu;
  114.     updateMenu->Append(MID_SHOW_UPDATES, "&Show Imports");
  115.     updateMenu->AppendSeparator();
  116.     updateMenu->Append(MID_REALIGN_ROW, "Realign &Individual Rows", "", true);
  117.     updateMenu->Append(MID_REALIGN_ROWS, "Realign Rows from &List");
  118.     updateMenu->AppendSeparator();
  119.     updateMenu->Append(MID_MARK_BLOCK, "Mark &Block", "", true);
  120.     updateMenu->Append(MID_CLEAR_MARKS, "&Clear Marks");
  121.     menuBar->Append(updateMenu, "&Imports");
  122.     EnableDerivedEditorMenuItems(false);
  123.     SetMenuBar(menuBar);
  124. }
  125. SequenceViewerWindow::~SequenceViewerWindow(void)
  126. {
  127.     if (taxonomyTree) delete taxonomyTree;
  128. }
  129. void SequenceViewerWindow::OnCloseWindow(wxCloseEvent& event)
  130. {
  131.     if (viewer) {
  132.         if (event.CanVeto()) {
  133.             Show(false);    // just hide the window if we can
  134.             event.Veto();
  135.             return;
  136.         }
  137.         SaveDialog(true, false);
  138.         viewer->RemoveBlockBoundaryRows();
  139.         viewer->GUIDestroyed(); // make sure SequenceViewer knows the GUI is gone
  140.         GlobalMessenger()->UnPostRedrawSequenceViewer(viewer);  // don't try to redraw after destroyed!
  141.     }
  142.     Destroy();
  143. }
  144. void SequenceViewerWindow::SetWindowTitle(void)
  145. {
  146.     SetTitle(wxString(GetWorkingTitle().c_str()) + " - Sequence/Alignment Viewer");
  147. }
  148. void SequenceViewerWindow::EnableDerivedEditorMenuItems(bool enabled)
  149. {
  150.     if (menuBar->FindItem(MID_SHOW_HIDE_ROWS)) {
  151.         bool editable = (sequenceViewer->GetCurrentDisplay() &&
  152.             sequenceViewer->GetCurrentDisplay()->IsEditable());
  153.         if (editable)
  154.             menuBar->Enable(MID_SHOW_HIDE_ROWS, !enabled);  // can't show/hide when editor is on
  155.         else
  156.             menuBar->Enable(MID_SHOW_HIDE_ROWS, false);     // can't show/hide in non-alignment display
  157.         menuBar->Enable(MID_DELETE_ROW, enabled);           // can only delete row when editor is on
  158.         menuBar->Enable(MID_SORT_ROWS, enabled);
  159.         menuBar->Enable(MID_MOVE_ROW, enabled);             // can only move row when editor is on
  160.         menuBar->Enable(MID_REALIGN_ROW, enabled);          // can only realign rows when editor is on
  161.         menuBar->Enable(MID_REALIGN_ROWS, enabled);         // can only realign rows when editor is on
  162.         menuBar->Enable(MID_MARK_BLOCK, enabled);
  163.         menuBar->Enable(MID_CLEAR_MARKS, enabled);
  164.         menuBar->Enable(MID_SELF_HIT, editable);
  165.         menuBar->Enable(MID_TAXONOMY, editable);
  166.         menuBar->Enable(MID_SCORE_THREADER, editable);
  167.         menuBar->Enable(MID_HIGHLIGHT_BLOCKS, editable);
  168.         if (!enabled) CancelDerivedSpecialModesExcept(-1);
  169.     }
  170. }
  171. void SequenceViewerWindow::OnDeleteRow(wxCommandEvent& event)
  172. {
  173.     if (event.GetId() == MID_DELETE_ROW) {
  174.         CancelAllSpecialModesExcept(MID_DELETE_ROW);
  175.         if (DoDeleteRow())
  176.             SetCursor(*wxCROSS_CURSOR);
  177.         else
  178.             DeleteRowOff();
  179.     }
  180. }
  181. void SequenceViewerWindow::OnMoveRow(wxCommandEvent& event)
  182. {
  183.     OnMouseMode(event); // set checks via base class
  184.     viewerWidget->SetMouseMode(SequenceViewerWidget::eDragVertical);
  185. }
  186. bool SequenceViewerWindow::RequestEditorEnable(bool enable)
  187. {
  188.     // turn on editor
  189.     if (enable) {
  190.         return QueryShowAllRows();
  191.     }
  192.     // turn off editor
  193.     else {
  194.         return SaveDialog(true, true);
  195.     }
  196. }
  197. bool SequenceViewerWindow::SaveDialog(bool prompt, bool canCancel)
  198. {
  199.     static bool overrideCanCancel = false, prevPrompt, prevCanCancel;
  200.     if (overrideCanCancel) {
  201.         prompt = prevPrompt;
  202.         canCancel = prevCanCancel;
  203.         overrideCanCancel = false;
  204.     }
  205.     // if editor is checked on, then this save command was initiated outside the menu;
  206.     // if so, then need to turn off editor pretending it was done from 'enable editor' menu item
  207.     if (menuBar->IsChecked(MID_ENABLE_EDIT)) {
  208.         overrideCanCancel = true;
  209.         prevPrompt = prompt;
  210.         prevCanCancel = canCancel;
  211.         Command(MID_ENABLE_EDIT);
  212.         return true;
  213.     }
  214.     // quick & dirty check for whether save is necessary, by whether Undo is enabled
  215.     if (!menuBar->IsEnabled(MID_UNDO)) {
  216.         viewer->KeepCurrent();  // remove any unnecessary copy from stack
  217.         return true;
  218.     }
  219.     int option = wxID_YES;
  220.     if (prompt) {
  221.         option = wxYES_NO | wxYES_DEFAULT | wxICON_EXCLAMATION | wxCENTRE;
  222.         if (canCancel) option |= wxCANCEL;
  223.         wxMessageDialog dialog(NULL, "Do you want to keep the changes to this alignment?", "", option);
  224.         option = dialog.ShowModal();
  225.         if (option == wxID_CANCEL) return false; // user cancelled this operation
  226.     }
  227.     if (option == wxID_YES) {
  228.         sequenceViewer->SaveAlignment();    // save data
  229.     } else {
  230.         sequenceViewer->Revert();  // revert to original
  231. UpdateDisplay(sequenceViewer->GetCurrentDisplay());
  232. }
  233.     return true;
  234. }
  235. void SequenceViewerWindow::OnShowHideRows(wxCommandEvent& event)
  236. {
  237.     vector < const Sequence * > slaveSequences;
  238.     sequenceViewer->alignmentManager->GetAlignmentSetSlaveSequences(&slaveSequences);
  239.     wxString *titleStrs = new wxString[slaveSequences.size()];
  240.     for (int i=0; i<slaveSequences.size(); ++i)
  241.         titleStrs[i] = slaveSequences[i]->identifier->ToString().c_str();
  242.     vector < bool > visibilities;
  243.     sequenceViewer->alignmentManager->GetAlignmentSetSlaveVisibilities(&visibilities);
  244.     wxString title = "Show/Hide Slaves of ";
  245.     title.Append(sequenceViewer->alignmentManager->GetCurrentMultipleAlignment()->GetMaster()->identifier->ToString().c_str());
  246.     ShowHideDialog dialog(
  247.         titleStrs, &visibilities, sequenceViewer->alignmentManager, true,
  248.         this, -1, title, wxPoint(250, 50));
  249.     dialog.ShowModal();
  250.     //delete titleStrs;    // apparently deleted by wxWindows
  251. }
  252. bool SequenceViewerWindow::QueryShowAllRows(void)
  253. {
  254.     vector < bool > visibilities;
  255.     sequenceViewer->alignmentManager->GetAlignmentSetSlaveVisibilities(&visibilities);
  256.     int i;
  257.     for (i=0; i<visibilities.size(); ++i) if (!visibilities[i]) break;
  258.     if (i == visibilities.size()) return true;  // we're okay if all rows already visible
  259.     // if some rows hidden, ask user whether to show all rows, or cancel
  260.     wxMessageDialog query(NULL,
  261.         "This operation requires all alignment rows to be visible. Do you wish to show all rows now?",
  262.         "Query", wxOK | wxCANCEL | wxCENTRE | wxICON_QUESTION);
  263.     if (query.ShowModal() == wxID_CANCEL) return false;   // user cancelled
  264.     // show all rows
  265.     for (i=0; i<visibilities.size(); ++i) visibilities[i] = true;
  266.     sequenceViewer->alignmentManager->ShowHideCallbackFunction(visibilities);
  267.     return true;
  268. }
  269. // process events from the realign menu
  270. void SequenceViewerWindow::OnShowUpdates(wxCommandEvent& event)
  271. {
  272.     sequenceViewer->alignmentManager->ShowUpdateWindow();
  273. }
  274. void SequenceViewerWindow::OnRealign(wxCommandEvent& event)
  275. {
  276.     // setup one-at-a-time row realignment
  277.     if (event.GetId() == MID_REALIGN_ROW) {
  278.         CancelAllSpecialModesExcept(MID_REALIGN_ROW);
  279.         if (DoRealignRow())
  280.             SetCursor(*wxCROSS_CURSOR);
  281.         else
  282.             RealignRowOff();
  283.         return;
  284.     }
  285.     // bring up selection dialog for realigning multiple rows
  286.     if (sequenceViewer->GetCurrentAlignments().size() == 0) {
  287.         ERRORMSG("SequenceViewerWindow::OnRealign() - no alignment!");
  288.         return;
  289.     }
  290.     BlockMultipleAlignment *alignment = sequenceViewer->GetCurrentAlignments().front();
  291.     // get titles of current slave display rows (*not* rows from the AlignmentSet!)
  292.     SequenceDisplay::SequenceList sequences;
  293.     sequenceViewer->GetCurrentDisplay()->GetSequences(alignment, &sequences);
  294.     wxString *titleStrs = new wxString[sequences.size() - 1];
  295.     int i;
  296.     for (i=1; i<sequences.size(); ++i)  // assuming master is first sequence
  297.         titleStrs[i - 1] = sequences[i]->identifier->ToString().c_str();
  298.     vector < bool > selectedSlaves(sequences.size() - 1, false);
  299.     wxString title = "Realign Slaves of ";
  300.     title.Append(alignment->GetMaster()->identifier->ToString().c_str());
  301.     ShowHideDialog dialog(
  302.         titleStrs, &selectedSlaves,
  303.         NULL,   // no "apply" button or callback
  304.         true, this, -1, title, wxPoint(200, 100));
  305.     dialog.ShowModal();
  306.     // make list of slave rows to be realigned
  307.     vector < int > rowOrder, realignSlaves;
  308.     sequenceViewer->GetCurrentDisplay()->GetRowOrder(alignment, &rowOrder);
  309.     for (i=0; i<selectedSlaves.size(); ++i)
  310.         if (selectedSlaves[i])
  311.             realignSlaves.push_back(rowOrder[i + 1]);
  312.     // do the realignment
  313.     if (realignSlaves.size() >= 0)
  314.         sequenceViewer->alignmentManager->RealignSlaveSequences(alignment, realignSlaves);
  315. }
  316. #define MASTER_HAS_STRUCTURE 
  317.     (sequenceViewer->alignmentManager != NULL && 
  318.      sequenceViewer->alignmentManager->GetCurrentMultipleAlignment() != NULL && 
  319.      sequenceViewer->alignmentManager->GetCurrentMultipleAlignment()->GetSequenceOfRow(0)->molecule != NULL)
  320. void SequenceViewerWindow::OnSort(wxCommandEvent& event)
  321. {
  322.     switch (event.GetId()) {
  323.         case MID_SORT_IDENT:
  324.             if (DoProximitySort()) ProximitySortOff();
  325.             sequenceViewer->GetCurrentDisplay()->SortRowsByIdentifier();
  326.             break;
  327.         case MID_SORT_THREADER:
  328.         {
  329.             if (DoProximitySort()) ProximitySortOff();
  330.             GetFloatingPointDialog fpDialog(NULL,
  331.                 "Weighting of PSSM/Contact score? ([0..1], 1 = PSSM only)", "Enter PSSM Weight",
  332.                 0.0, 1.0, 0.05, (MASTER_HAS_STRUCTURE ?
  333.                     ((prevPSSMWeight >= 0.0) ? prevPSSMWeight : 0.5) : 1.0));
  334.             if (fpDialog.ShowModal() == wxOK) {
  335.                 double weightPSSM = prevPSSMWeight = fpDialog.GetValue();
  336.                 SetCursor(*wxHOURGLASS_CURSOR);
  337.                 sequenceViewer->GetCurrentDisplay()->SortRowsByThreadingScore(weightPSSM);
  338.                 SetCursor(wxNullCursor);
  339.             }
  340.             break;
  341.         }
  342.         case MID_FLOAT_HIGHLIGHTS:
  343.             if (DoProximitySort()) ProximitySortOff();
  344.             sequenceViewer->GetCurrentDisplay()->FloatHighlightsToTop();
  345.             break;
  346.         case MID_FLOAT_PDBS:
  347.             if (DoProximitySort()) ProximitySortOff();
  348.             sequenceViewer->GetCurrentDisplay()->FloatPDBRowsToTop();
  349.             break;
  350.         case MID_FLOAT_G_V:
  351.             if (DoProximitySort()) ProximitySortOff();
  352.             sequenceViewer->GetCurrentDisplay()->FloatGVToTop();
  353.             break;
  354.         case MID_SORT_SELF_HIT:
  355.             if (DoProximitySort()) ProximitySortOff();
  356.             sequenceViewer->GetCurrentDisplay()->SortRowsBySelfHit();
  357.             break;
  358.         case MID_PROXIMITY_SORT:
  359.             CancelAllSpecialModesExcept(MID_PROXIMITY_SORT);
  360.             if (DoProximitySort())
  361.                 SetCursor(*wxCROSS_CURSOR);
  362.             else
  363.                 ProximitySortOff();
  364.             break;
  365.     }
  366. }
  367. void SequenceViewerWindow::OnScoreThreader(wxCommandEvent& event)
  368. {
  369.     GetFloatingPointDialog fpDialog(NULL,
  370.         "Weighting of PSSM/Contact score? ([0..1], 1 = PSSM only)", "Enter PSSM Weight",
  371.         0.0, 1.0, 0.05, (MASTER_HAS_STRUCTURE ?
  372.             ((prevPSSMWeight >= 0.0) ? prevPSSMWeight : 0.5) : 1.0));
  373.     if (fpDialog.ShowModal() == wxOK) {
  374.         double weightPSSM = prevPSSMWeight = fpDialog.GetValue();
  375.         SetCursor(*wxHOURGLASS_CURSOR);
  376.         if (sequenceViewer->GetCurrentDisplay()->IsEditable())
  377.             sequenceViewer->GetCurrentDisplay()->CalculateRowScoresWithThreader(weightPSSM);
  378.         SetCursor(wxNullCursor);
  379.     }
  380. }
  381. void SequenceViewerWindow::OnMarkBlock(wxCommandEvent& event)
  382. {
  383.     switch (event.GetId()) {
  384.         case MID_MARK_BLOCK:
  385.             CancelAllSpecialModesExcept(MID_MARK_BLOCK);
  386.             if (DoMarkBlock())
  387.                 SetCursor(*wxCROSS_CURSOR);
  388.             else
  389.                 MarkBlockOff();
  390.             break;
  391.         case MID_CLEAR_MARKS:
  392.             if (sequenceViewer->GetCurrentAlignments().size() > 0 &&
  393.                     sequenceViewer->GetCurrentAlignments().front()->ClearMarks())
  394.                 GlobalMessenger()->PostRedrawSequenceViewer(sequenceViewer);
  395.             break;
  396.     }
  397. }
  398. void SequenceViewerWindow::TurnOnEditor(void)
  399. {
  400.     if (!menuBar->IsChecked(MID_ENABLE_EDIT))
  401.         Command(SequenceViewerWindow::MID_ENABLE_EDIT);
  402. }
  403. void SequenceViewerWindow::OnExport(wxCommandEvent& event)
  404. {
  405.     SequenceViewer::eExportType type;
  406.     if (event.GetId() == MID_EXPORT_FASTA) type = SequenceViewer::asFASTA;
  407.     else if (event.GetId() == MID_EXPORT_A2M) type = SequenceViewer::asFASTAa2m;
  408.     else if (event.GetId() == MID_EXPORT_TEXT) type = SequenceViewer::asText;
  409.     else if (event.GetId() == MID_EXPORT_HTML) type = SequenceViewer::asHTML;
  410.     sequenceViewer->ExportAlignment(type);
  411. }
  412. void SequenceViewerWindow::OnSelfHit(wxCommandEvent& event)
  413. {
  414.     if (sequenceViewer->GetCurrentAlignments().size() > 0) {
  415.         const BlockMultipleAlignment *multiple = sequenceViewer->GetCurrentAlignments().front();
  416.         sequenceViewer->alignmentManager->blaster->CalculateSelfHitScores(multiple);
  417.     }
  418. }
  419. void SequenceViewerWindow::OnTaxonomy(wxCommandEvent& event)
  420. {
  421.     if (!taxonomyTree) taxonomyTree = new TaxonomyTree();
  422.     if (sequenceViewer->GetCurrentAlignments().size() > 0)
  423.         taxonomyTree->ShowTreeForAlignment(this, sequenceViewer->GetCurrentAlignments().front(),
  424.             (event.GetId() == MID_TAXONOMY_ABBR));
  425. }
  426. void SequenceViewerWindow::OnHighlightBlocks(wxCommandEvent& event)
  427. {
  428.     if (sequenceViewer->GetCurrentAlignments().size() == 0) return;
  429.     GlobalMessenger()->RemoveAllHighlights(true);
  430.     const BlockMultipleAlignment *multiple = sequenceViewer->GetCurrentAlignments().front();
  431.     BlockMultipleAlignment::UngappedAlignedBlockList blocks;
  432.     multiple->GetUngappedAlignedBlocks(&blocks);
  433.     if (blocks.size() == 0) return;
  434.     BlockMultipleAlignment::UngappedAlignedBlockList::const_iterator b, be = blocks.end();
  435.     const Sequence *seq;
  436.     const Block::Range *range;
  437.     for (int row=0; row<multiple->NRows(); ++row) {
  438.         seq = multiple->GetSequenceOfRow(row);
  439.         for (b = blocks.begin(); b!=be; ++b) {
  440.             range = (*b)->GetRangeOfRow(row);
  441.             GlobalMessenger()->AddHighlights(seq, range->from, range->to);
  442.         }
  443.     }
  444. }
  445. END_SCOPE(Cn3D)
  446. /*
  447. * ---------------------------------------------------------------------------
  448. * $Log: sequence_viewer_window.cpp,v $
  449. * Revision 1000.2  2004/06/01 18:29:17  gouriano
  450. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.54
  451. *
  452. * Revision 1.54  2004/05/21 21:41:40  gorelenk
  453. * Added PCH ncbi_pch.hpp
  454. *
  455. * Revision 1.53  2004/03/15 18:32:03  thiessen
  456. * prefer prefix vs. postfix ++/-- operators
  457. *
  458. * Revision 1.52  2004/02/19 17:05:10  thiessen
  459. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  460. *
  461. * Revision 1.51  2003/10/20 13:17:15  thiessen
  462. * add float geometry violations sorting
  463. *
  464. * Revision 1.50  2003/08/23 22:42:17  thiessen
  465. * add highlight blocks command
  466. *
  467. * Revision 1.49  2003/03/06 19:23:56  thiessen
  468. * fix for compilation problem (seqfeat macros)
  469. *
  470. * Revision 1.48  2003/02/03 19:20:06  thiessen
  471. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  472. *
  473. * Revision 1.47  2003/01/14 14:15:07  thiessen
  474. * default PSSM score = 1.0 when no structure
  475. *
  476. * Revision 1.46  2002/12/19 14:15:37  thiessen
  477. * mac fixes to menus, add icon
  478. *
  479. * Revision 1.45  2002/12/06 17:07:15  thiessen
  480. * remove seqrow export format; add choice of repeat handling for FASTA export; export rows in display order
  481. *
  482. * Revision 1.44  2002/12/02 13:37:09  thiessen
  483. * add seqrow format export
  484. *
  485. * Revision 1.43  2002/10/13 22:58:08  thiessen
  486. * add redo ability to editor
  487. *
  488. * Revision 1.42  2002/10/07 18:51:53  thiessen
  489. * add abbreviated taxonomy tree
  490. *
  491. * Revision 1.41  2002/10/04 18:45:28  thiessen
  492. * updates to taxonomy viewer
  493. *
  494. * Revision 1.40  2002/09/09 22:51:19  thiessen
  495. * add basic taxonomy tree viewer
  496. *
  497. * Revision 1.39  2002/09/09 13:38:23  thiessen
  498. * separate save and save-as
  499. *
  500. * Revision 1.38  2002/09/06 13:06:31  thiessen
  501. * fix menu accelerator conflicts
  502. *
  503. * Revision 1.37  2002/09/05 18:38:57  thiessen
  504. * add sort by highlights
  505. *
  506. * Revision 1.36  2002/09/03 13:15:58  thiessen
  507. * add A2M export
  508. *
  509. * Revision 1.35  2002/08/15 22:13:17  thiessen
  510. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  511. *
  512. * Revision 1.34  2002/06/13 14:54:07  thiessen
  513. * add sort by self-hit
  514. *
  515. * Revision 1.33  2002/06/13 13:32:39  thiessen
  516. * add self-hit calculation
  517. *
  518. * Revision 1.32  2002/06/05 17:25:47  thiessen
  519. * change 'update' to 'import' in GUI
  520. *
  521. * Revision 1.31  2002/06/05 14:28:40  thiessen
  522. * reorganize handling of window titles
  523. *
  524. * Revision 1.30  2002/05/17 19:10:27  thiessen
  525. * preliminary range restriction for BLAST/PSSM
  526. *
  527. * Revision 1.29  2002/04/22 14:27:29  thiessen
  528. * add alignment export
  529. *
  530. * Revision 1.28  2002/03/19 18:48:00  thiessen
  531. * small bug fixes; remember PSSM weight
  532. *
  533. * Revision 1.27  2002/03/04 15:52:14  thiessen
  534. * hide sequence windows instead of destroying ; add perspective/orthographic projection choice
  535. *
  536. * Revision 1.26  2002/02/13 14:53:30  thiessen
  537. * add update sort
  538. *
  539. * Revision 1.25  2001/12/06 23:13:45  thiessen
  540. * finish import/align new sequences into single-structure data; many small tweaks
  541. *
  542. * Revision 1.24  2001/10/20 20:16:32  thiessen
  543. * don't use wxDefaultPosition for dialogs (win2000 problem)
  544. *
  545. * Revision 1.23  2001/10/08 14:18:33  thiessen
  546. * fix show/hide dialog under wxGTK
  547. *
  548. * Revision 1.22  2001/10/01 16:04:24  thiessen
  549. * make CDD annotation window non-modal; add SetWindowTitle to viewers
  550. *
  551. * Revision 1.21  2001/09/06 13:10:10  thiessen
  552. * tweak show hide dialog layout
  553. *
  554. * Revision 1.20  2001/08/24 18:53:43  thiessen
  555. * add filename to sequence viewer window titles
  556. *
  557. * Revision 1.19  2001/06/21 02:02:34  thiessen
  558. * major update to molecule identification and highlighting ; add toggle highlight (via alt)
  559. *
  560. * Revision 1.18  2001/06/04 14:58:00  thiessen
  561. * add proximity sort; highlight sequence on browser launch
  562. *
  563. * Revision 1.17  2001/06/01 14:05:13  thiessen
  564. * add float PDB sort
  565. *
  566. * Revision 1.16  2001/05/17 18:34:26  thiessen
  567. * spelling fixes; change dialogs to inherit from wxDialog
  568. *
  569. * Revision 1.15  2001/05/15 23:48:37  thiessen
  570. * minor adjustments to compile under Solaris/wxGTK
  571. *
  572. * Revision 1.14  2001/05/11 02:10:42  thiessen
  573. * add better merge fail indicators; tweaks to windowing/taskbar
  574. *
  575. * Revision 1.13  2001/05/09 17:15:07  thiessen
  576. * add automatic block removal upon demotion
  577. *
  578. * Revision 1.12  2001/05/08 21:15:44  thiessen
  579. * add PSSM weight dialog for sorting
  580. *
  581. * Revision 1.11  2001/04/04 00:27:15  thiessen
  582. * major update - add merging, threader GUI controls
  583. *
  584. * Revision 1.10  2001/03/30 14:43:41  thiessen
  585. * show threader scores in status line; misc UI tweaks
  586. *
  587. * Revision 1.9  2001/03/30 03:07:34  thiessen
  588. * add threader score calculation & sorting
  589. *
  590. * Revision 1.8  2001/03/19 15:50:40  thiessen
  591. * add sort rows by identifier
  592. *
  593. * Revision 1.7  2001/03/17 14:06:49  thiessen
  594. * more workarounds for namespace/#define conflicts
  595. *
  596. * Revision 1.6  2001/03/13 01:25:06  thiessen
  597. * working undo system for >1 alignment (e.g., update window)
  598. *
  599. * Revision 1.5  2001/03/09 15:49:05  thiessen
  600. * major changes to add initial update viewer
  601. *
  602. * Revision 1.4  2001/03/06 20:20:51  thiessen
  603. * progress towards >1 alignment in a SequenceDisplay ; misc minor fixes
  604. *
  605. * Revision 1.3  2001/03/02 15:32:52  thiessen
  606. * minor fixes to save & show/hide dialogs, wx string headers
  607. *
  608. * Revision 1.2  2001/03/02 03:26:59  thiessen
  609. * fix dangling pointer upon app close
  610. *
  611. * Revision 1.1  2001/03/01 20:15:51  thiessen
  612. * major rearrangement of sequence viewer code into base and derived classes
  613. *
  614. */