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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: update_viewer_window.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:29:52  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.61
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: update_viewer_window.cpp,v 1000.2 2004/06/01 18:29:52 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 update 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 <wx/stattext.h>
  52. #include "update_viewer_window.hpp"
  53. #include "update_viewer.hpp"
  54. #include "messenger.hpp"
  55. #include "sequence_display.hpp"
  56. #include "alignment_manager.hpp"
  57. #include "cn3d_threader.hpp"
  58. #include "wx_tools.hpp"
  59. #include "cn3d_tools.hpp"
  60. #include "molecule_identifier.hpp"
  61. #include "cn3d_ba_interface.hpp"
  62. USING_NCBI_SCOPE;
  63. BEGIN_SCOPE(Cn3D)
  64. BEGIN_EVENT_TABLE(UpdateViewerWindow, wxFrame)
  65.     INCLUDE_VIEWER_WINDOW_BASE_EVENTS
  66.     EVT_CLOSE     (                                     UpdateViewerWindow::OnCloseWindow)
  67.     EVT_MENU      (MID_DELETE_ALL_BLOCKS,               UpdateViewerWindow::OnDelete)
  68.     EVT_MENU      (MID_SORT_UPDATES_IDENTIFIER,         UpdateViewerWindow::OnSortUpdates)
  69.     EVT_MENU_RANGE(MID_THREAD_ONE, MID_THREAD_ALL,      UpdateViewerWindow::OnRunThreader)
  70.     EVT_MENU_RANGE(MID_MERGE_ONE, MID_MERGE_ALL,        UpdateViewerWindow::OnMerge)
  71.     EVT_MENU_RANGE(MID_DELETE_ONE, MID_DELETE_ALL,      UpdateViewerWindow::OnDelete)
  72.     EVT_MENU_RANGE(MID_IMPORT_SEQUENCES, MID_IMPORT_STRUCTURE,  UpdateViewerWindow::OnImport)
  73.     EVT_MENU_RANGE(MID_BLAST_ONE, MID_BLAST_NEIGHBOR,   UpdateViewerWindow::OnRunBlast)
  74.     EVT_MENU_RANGE(MID_SET_REGION, MID_RESET_REGIONS,   UpdateViewerWindow::OnSetRegion)
  75.     EVT_MENU_RANGE(MID_BLOCKALIGN_ONE, MID_BLOCKALIGN_ALL,  UpdateViewerWindow::OnBlockAlign)
  76. END_EVENT_TABLE()
  77. UpdateViewerWindow::UpdateViewerWindow(UpdateViewer *thisUpdateViewer) :
  78.     ViewerWindowBase(thisUpdateViewer, wxPoint(0,50), wxSize(1000,300)),
  79.     updateViewer(thisUpdateViewer)
  80. {
  81.     SetWindowTitle();
  82.     // Edit menu
  83.     editMenu->AppendSeparator();
  84.     wxMenu *subMenu = new wxMenu;
  85.     subMenu->Append(MID_SORT_UPDATES_IDENTIFIER, "By &Identifier");
  86.     editMenu->Append(MID_SORT_UPDATES, "So&rt Imports...", subMenu);
  87.     editMenu->AppendSeparator();
  88.     editMenu->Append(MID_IMPORT_SEQUENCES, "&Import Sequences");
  89.     editMenu->Append(MID_IMPORT_STRUCTURE, "Import S&tructure");
  90.     // insert at hard-coded location, since FindItem doesn't seem to work...
  91.     editMenu->Insert(8, MID_DELETE_ALL_BLOCKS, "Delete A&ll Blocks", "", true);
  92.     // Mouse mode menu
  93.     menuBar->Enable(MID_SELECT_COLS, false);
  94.     // Algorithms menu
  95.     wxMenu *menu = new wxMenu;
  96.     menu->Append(MID_BLOCKALIGN_ONE, "B&lock Align Single", "", true);
  97.     menu->Append(MID_BLOCKALIGN_ALL, "Bloc&k Align All");
  98.     menu->AppendSeparator();
  99.     menu->Append(MID_BLAST_ONE, "&BLAST Single", "", true);
  100.     menu->Append(MID_BLAST_PSSM_ONE, "BLAST/&PSSM Single", "", true);
  101.     menu->Append(MID_BLAST_NEIGHBOR, "BLAST &Neighbor", "", true);
  102.     menu->AppendSeparator();
  103.     menu->Append(MID_THREAD_ONE, "Thread &Single", "", true);
  104.     menu->Append(MID_THREAD_ALL, "Thread &All");
  105.     menu->AppendSeparator();
  106.     menu->Append(MID_SET_REGION, "Set &Region", "", true);
  107.     menu->Append(MID_RESET_REGIONS, "Reset All Re&gions");
  108.     menuBar->Append(menu, "Al&gorithms");
  109.     // Alignments menu
  110.     menu = new wxMenu;
  111.     menu->Append(MID_MERGE_ONE, "&Merge Single", "", true);
  112.     menu->Append(MID_MERGE_NEIGHBOR, "Merge to &Neighbor", "", true);
  113.     menu->Append(MID_MERGE_ALL, "Merge &All");
  114.     menu->AppendSeparator();
  115.     menu->Append(MID_DELETE_ONE, "&Delete Single", "", true);
  116.     menu->Append(MID_DELETE_ALL, "Delete A&ll");
  117.     menuBar->Append(menu, "&Alignments");
  118.     // editor always on
  119.     EnableBaseEditorMenuItems(true);
  120.     menuBar->Check(MID_ENABLE_EDIT, true);
  121.     menuBar->Enable(MID_ENABLE_EDIT, false);
  122.     // set default mouse mode
  123.     viewerWidget->SetMouseMode(SequenceViewerWidget::eDragHorizontal);
  124.     menuBar->Check(MID_DRAG_HORIZ, true);
  125.     menuBar->Check(MID_SELECT_RECT, false);
  126.     SetMenuBar(menuBar);
  127. }
  128. UpdateViewerWindow::~UpdateViewerWindow(void)
  129. {
  130. }
  131. void UpdateViewerWindow::OnCloseWindow(wxCloseEvent& event)
  132. {
  133.     if (viewer) {
  134.         if (event.CanVeto()) {
  135.             Show(false);    // just hide the window if we can
  136.             event.Veto();
  137.             return;
  138.         }
  139.         SaveDialog(true, false);
  140.         viewer->GUIDestroyed(); // make sure UpdateViewer knows the GUI is gone
  141.         GlobalMessenger()->UnPostRedrawSequenceViewer(viewer);  // don't try to redraw after destroyed!
  142.     }
  143.     Destroy();
  144. }
  145. void UpdateViewerWindow::SetWindowTitle(void)
  146. {
  147.     SetTitle(wxString(GetWorkingTitle().c_str()) + " - Import Viewer");
  148. }
  149. void UpdateViewerWindow::EnableDerivedEditorMenuItems(bool enabled)
  150. {
  151. }
  152. void UpdateViewerWindow::OnRunThreader(wxCommandEvent& event)
  153. {
  154.     switch (event.GetId()) {
  155.         case MID_THREAD_ONE:
  156.             CancelAllSpecialModesExcept(MID_THREAD_ONE);
  157.             if (DoThreadSingle())
  158.                 SetCursor(*wxCROSS_CURSOR);
  159.             else
  160.                 ThreadSingleOff();
  161.             break;
  162.         case MID_THREAD_ALL: {
  163.             if (!updateViewer->alignmentManager->GetCurrentMultipleAlignment()) {
  164.                 ERRORMSG("Can't run threader without existing core alignment");
  165.                 return;
  166.             }
  167.             if (updateViewer->GetCurrentAlignments().size() == 0) return;
  168.             // base nRS estimate on first update...
  169.             globalThreaderOptions.nRandomStarts = Threader::EstimateNRandomStarts(
  170.                 updateViewer->alignmentManager->GetCurrentMultipleAlignment(),
  171.                 updateViewer->GetCurrentAlignments().front());
  172.             ThreaderOptionsDialog optDialog(this, globalThreaderOptions);
  173.             if (optDialog.ShowModal() == wxCANCEL) return;  // user cancelled
  174.             if (!optDialog.GetValues(&globalThreaderOptions)) {
  175.                 ERRORMSG("Error retrieving options values from dialog");
  176.                 return;
  177.             }
  178.             RaiseLogWindow();
  179.             SetCursor(*wxHOURGLASS_CURSOR);
  180.             updateViewer->alignmentManager->ThreadAllUpdates(globalThreaderOptions);
  181.             SetCursor(wxNullCursor);
  182.             break;
  183.         }
  184.     }
  185. }
  186. void UpdateViewerWindow::OnMerge(wxCommandEvent& event)
  187. {
  188.     switch (event.GetId()) {
  189.         case MID_MERGE_ONE:
  190.             CancelAllSpecialModesExcept(MID_MERGE_ONE);
  191.             if (DoMergeSingle())
  192.                 SetCursor(*wxCROSS_CURSOR);
  193.             else
  194.                 MergeSingleOff();
  195.             break;
  196.         case MID_MERGE_NEIGHBOR:
  197.             CancelAllSpecialModesExcept(MID_MERGE_NEIGHBOR);
  198.             if (DoMergeNeighbor())
  199.                 SetCursor(*wxCROSS_CURSOR);
  200.             else
  201.                 MergeNeighborOff();
  202.             break;
  203.         case MID_MERGE_ALL:
  204.         {
  205.             AlignmentManager::UpdateMap all;    // construct map/list of all updates
  206.             const ViewerBase::AlignmentList& currentUpdates = updateViewer->GetCurrentAlignments();
  207.             if (currentUpdates.size() > 0) {
  208.                 ViewerBase::AlignmentList::const_iterator u, ue = currentUpdates.end();
  209.                 for (u=currentUpdates.begin(); u!=ue; ++u) all[*u] = true;
  210.                 updateViewer->alignmentManager->MergeUpdates(all, false);
  211.             }
  212.             break;
  213.         }
  214.     }
  215. }
  216. void UpdateViewerWindow::OnDelete(wxCommandEvent& event)
  217. {
  218.     switch (event.GetId()) {
  219.         case MID_DELETE_ALL_BLOCKS:
  220.             CancelAllSpecialModesExcept(MID_DELETE_ALL_BLOCKS);
  221.             if (DoDeleteAllBlocks())
  222.                 SetCursor(*wxCROSS_CURSOR);
  223.             else
  224.                 DeleteAllBlocksOff();
  225.             break;
  226.         case MID_DELETE_ONE:
  227.             CancelAllSpecialModesExcept(MID_DELETE_ONE);
  228.             if (DoDeleteSingle())
  229.                 SetCursor(*wxCROSS_CURSOR);
  230.             else
  231.                 DeleteSingleOff();
  232.             break;
  233.         case MID_DELETE_ALL: {
  234.             ViewerBase::AlignmentList empty;
  235.             updateViewer->ReplaceAlignments(empty);
  236.             break;
  237.         }
  238.     }
  239. }
  240. bool UpdateViewerWindow::SaveDialog(bool prompt, bool canCancel)
  241. {
  242.     // quick & dirty check for whether save is necessary, by whether Undo is enabled
  243.     if (!menuBar->IsEnabled(MID_UNDO)) return true;
  244.     int option = wxID_YES;
  245.     if (prompt) {
  246.         option = wxYES_NO | wxYES_DEFAULT | wxICON_EXCLAMATION | wxCENTRE;
  247.         if (canCancel) option |= wxCANCEL;
  248.         wxMessageDialog dialog(NULL, "Do you want to keep the changes to these updates?", "", option);
  249.         option = dialog.ShowModal();
  250.         if (option == wxID_CANCEL) return false; // user cancelled this operation
  251.     }
  252.     if (option == wxID_YES)
  253.         updateViewer->SaveAlignments();     // save data
  254.     else {
  255.         updateViewer->Revert(); // revert to original
  256.         updateViewer->EnableStacks();       // but keep undo stack active
  257.     }
  258.     return true;
  259. }
  260. void UpdateViewerWindow::OnImport(wxCommandEvent& event)
  261. {
  262.     if (event.GetId() == MID_IMPORT_SEQUENCES) updateViewer->ImportSequences();
  263.     else if (event.GetId() == MID_IMPORT_STRUCTURE) updateViewer->ImportStructure();
  264. }
  265. void UpdateViewerWindow::OnRunBlast(wxCommandEvent& event)
  266. {
  267.     switch (event.GetId()) {
  268.         case MID_BLAST_ONE:
  269.             CancelAllSpecialModesExcept(MID_BLAST_ONE);
  270.             if (DoBlastSingle())
  271.                 SetCursor(*wxCROSS_CURSOR);
  272.             else
  273.                 BlastSingleOff();
  274.             break;
  275.         case MID_BLAST_PSSM_ONE:
  276.             CancelAllSpecialModesExcept(MID_BLAST_PSSM_ONE);
  277.             if (DoBlastPSSMSingle())
  278.                 SetCursor(*wxCROSS_CURSOR);
  279.             else
  280.                 BlastPSSMSingleOff();
  281.             break;
  282.         case MID_BLAST_NEIGHBOR:
  283.             CancelAllSpecialModesExcept(MID_BLAST_NEIGHBOR);
  284.             if (DoBlastNeighborSingle())
  285.                 SetCursor(*wxCROSS_CURSOR);
  286.             else
  287.                 BlastNeighborSingleOff();
  288.             break;
  289.     }
  290. }
  291. void UpdateViewerWindow::OnSortUpdates(wxCommandEvent& event)
  292. {
  293.     if (event.GetId() == MID_SORT_UPDATES_IDENTIFIER)
  294.         updateViewer->SortByIdentifier();
  295. }
  296. void UpdateViewerWindow::OnSetRegion(wxCommandEvent& event)
  297. {
  298.     if (event.GetId() == MID_SET_REGION) {
  299.         CancelAllSpecialModesExcept(MID_SET_REGION);
  300.         if (DoSetRegion())
  301.             SetCursor(*wxCROSS_CURSOR);
  302.         else
  303.             SetRegionOff();
  304.     }
  305.     else if (event.GetId() == MID_RESET_REGIONS) {
  306. UpdateViewer::AlignmentList::const_iterator a, ae = updateViewer->GetCurrentAlignments().end();
  307.         for (a=updateViewer->GetCurrentAlignments().begin(); a!=ae; ++a) {
  308.             (*a)->alignSlaveFrom = -1;
  309.             (*a)->alignSlaveTo = -1;
  310.         }
  311.     }
  312. }
  313. void UpdateViewerWindow::OnBlockAlign(wxCommandEvent& event)
  314. {
  315.     if (event.GetId() == MID_BLOCKALIGN_ONE) {
  316.         CancelAllSpecialModesExcept(MID_BLOCKALIGN_ONE);
  317.         if (DoBlockAlignSingle())
  318.             SetCursor(*wxCROSS_CURSOR);
  319.         else
  320.             BlockAlignSingleOff();
  321.     }
  322.     else if (event.GetId() == MID_BLOCKALIGN_ALL) {
  323.         updateViewer->alignmentManager->BlockAlignAllUpdates();
  324.     }
  325. }
  326. /////////////////////////////////////////////////////////////////////////////////
  327. // ThreaderOptionsDialog implementation
  328. /////////////////////////////////////////////////////////////////////////////////
  329. BEGIN_EVENT_TABLE(ThreaderOptionsDialog, wxDialog)
  330.     EVT_BUTTON(-1,  ThreaderOptionsDialog::OnButton)
  331.     EVT_CLOSE (     ThreaderOptionsDialog::OnCloseWindow)
  332. END_EVENT_TABLE()
  333. ThreaderOptionsDialog::ThreaderOptionsDialog(wxWindow* parent, const ThreaderOptions& initialOptions) :
  334.     wxDialog(parent, -1, "Set Threader Options", wxDefaultPosition, wxDefaultSize,
  335.         wxCAPTION | wxSYSTEM_MENU) // not resizable
  336. {
  337.     // the following code is modified (heavily) from wxDesigner C++ output from threader_dialog.wdr
  338.     wxPanel *panel = new wxPanel(this, -1);
  339.     wxBoxSizer *item0 = new wxBoxSizer(wxVERTICAL);
  340.     wxBoxSizer *item1 = new wxBoxSizer(wxVERTICAL);
  341.     wxStaticBox *item3 = new wxStaticBox(panel, -1, "Threader Options");
  342.     wxStaticBoxSizer *item2 = new wxStaticBoxSizer(item3, wxHORIZONTAL);
  343.     wxFlexGridSizer *grid = new wxFlexGridSizer(3, 5, 0);
  344.     // PSSM weight
  345.     wxStaticText *item5 = new wxStaticText(panel, -1, "Weighting of PSSM/Contact score? [0 .. 1], 1 = PSSM only", wxDefaultPosition, wxDefaultSize, 0);
  346.     grid->Add(item5, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  347.     fpWeight = new FloatingPointSpinCtrl(panel,
  348.         0.0, 1.0, 0.05, initialOptions.weightPSSM,
  349.         wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
  350.         wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
  351.     grid->Add(fpWeight->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  352.     grid->Add(fpWeight->GetSpinButton(), 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP|wxBOTTOM, 5);
  353.     // loop lengths
  354.     wxStaticText *item8 = new wxStaticText(panel, -1, "Loop length multiplier? [0.1 .. 10]", wxDefaultPosition, wxDefaultSize, 0);
  355.     grid->Add(item8, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  356.     fpLoops = new FloatingPointSpinCtrl(panel,
  357.         0.1, 10.0, 0.25, initialOptions.loopLengthMultiplier,
  358.         wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
  359.         wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
  360.     grid->Add(fpLoops->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  361.     grid->Add(fpLoops->GetSpinButton(), 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP|wxBOTTOM, 5);
  362.     // random starts
  363.     wxStaticText *item11 = new wxStaticText(panel, -1, "Number of random starts? [1 .. 1000]", wxDefaultPosition, wxDefaultSize, 0);
  364.     grid->Add(item11, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  365.     iStarts = new IntegerSpinCtrl(panel,
  366.         1, 1000, 5, initialOptions.nRandomStarts,
  367.         wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
  368.         wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
  369.     grid->Add(iStarts->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  370.     grid->Add(iStarts->GetSpinButton(), 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP|wxBOTTOM, 5);
  371.     // # results
  372.     wxStaticText *item14 = new wxStaticText(panel, -1, "Number of result alignments per row? [1 .. 20]", wxDefaultPosition, wxDefaultSize, 0);
  373.     grid->Add(item14, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  374.     iResults = new IntegerSpinCtrl(panel,
  375.         1, 20, 1, initialOptions.nResultAlignments,
  376.         wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
  377.         wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
  378.     grid->Add(iResults->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  379.     grid->Add(iResults->GetSpinButton(), 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP|wxBOTTOM, 5);
  380.     // terminal residue cutoff
  381.     wxStaticText *item16 = new wxStaticText(panel, -1, "Terminal residue cutoff? [-1..N], -1 = unrestricted", wxDefaultPosition, wxDefaultSize, 0);
  382.     grid->Add(item16, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  383.     iCutoff = new IntegerSpinCtrl(panel,
  384.         -1, 100000, 1, initialOptions.terminalResidueCutoff,
  385.         wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
  386.         wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
  387.     grid->Add(iCutoff->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5);
  388.     grid->Add(iCutoff->GetSpinButton(), 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP|wxBOTTOM, 5);
  389.     // merge results
  390.     wxStaticText *item17 = new wxStaticText(panel, -1, "Merge results after each row is threaded?", wxDefaultPosition, wxDefaultSize, 0);
  391.     grid->Add(item17, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  392.     bMerge = new wxCheckBox(panel, -1, "", wxDefaultPosition, wxDefaultSize, 0);
  393.     bMerge->SetValue(initialOptions.mergeAfterEachSequence);
  394.     grid->Add(bMerge, 0, wxALIGN_CENTRE|wxALL, 5);
  395.     grid->Add(20, SPIN_CTRL_HEIGHT, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  396.     // freeze blocks
  397.     wxStaticText *item19 = new wxStaticText(panel, -1, "Freeze isolated blocks?", wxDefaultPosition, wxDefaultSize, 0);
  398.     grid->Add(item19, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
  399.     bFreeze = new wxCheckBox(panel, -1, "", wxDefaultPosition, wxDefaultSize, 0);
  400.     bFreeze->SetValue(initialOptions.freezeIsolatedBlocks);
  401.     grid->Add(bFreeze, 0, wxALIGN_CENTRE|wxALL, 5);
  402.     grid->Add(20, SPIN_CTRL_HEIGHT, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5);
  403.     item2->Add(grid, 0, wxALIGN_CENTRE|wxALL, 5);
  404.     item1->Add(item2, 0, wxALIGN_CENTRE|wxALL, 5);
  405.     wxBoxSizer *item21 = new wxBoxSizer(wxHORIZONTAL);
  406.     bOK = new wxButton(panel, -1, "OK", wxDefaultPosition, wxDefaultSize, 0);
  407.     bOK->SetDefault();
  408.     item21->Add(bOK, 0, wxALIGN_CENTRE|wxALL, 5);
  409.     bCancel = new wxButton(panel, -1, "Cancel", wxDefaultPosition, wxDefaultSize, 0);
  410.     item21->Add(bCancel, 0, wxALIGN_CENTRE|wxALL, 5);
  411.     item1->Add(item21, 0, wxALIGN_CENTRE|wxALL, 5);
  412.     item0->Add(item1, 0, wxALIGN_CENTRE|wxALL, 5);
  413.     panel->SetAutoLayout(true);
  414.     panel->SetSizer(item0);
  415.     item0->Fit(this);
  416.     item0->Fit(panel);
  417.     item0->SetSizeHints(this);
  418. }
  419. ThreaderOptionsDialog::~ThreaderOptionsDialog(void)
  420. {
  421.     delete fpWeight;
  422.     delete fpLoops;
  423.     delete iStarts;
  424.     delete iResults;
  425.     delete iCutoff;
  426. }
  427. bool ThreaderOptionsDialog::GetValues(ThreaderOptions *options)
  428. {
  429.     options->mergeAfterEachSequence = bMerge->GetValue();
  430.     options->freezeIsolatedBlocks = bFreeze->GetValue();
  431.     return (
  432.         fpWeight->GetDouble(&options->weightPSSM) &&
  433.         fpLoops->GetDouble(&options->loopLengthMultiplier) &&
  434.         iStarts->GetInteger(&options->nRandomStarts) &&
  435.         iResults->GetInteger(&options->nResultAlignments) &&
  436.         iCutoff->GetInteger(&options->terminalResidueCutoff)
  437.     );
  438. }
  439. void ThreaderOptionsDialog::OnCloseWindow(wxCloseEvent& event)
  440. {
  441.     EndModal(wxCANCEL);
  442. }
  443. void ThreaderOptionsDialog::OnButton(wxCommandEvent& event)
  444. {
  445.     if (event.GetEventObject() == bOK) {
  446.         ThreaderOptions dummy;
  447.         if (GetValues(&dummy))  // can't successfully quit if values aren't valid
  448.             EndModal(wxOK);
  449.         else
  450.             wxBell();
  451.     } else if (event.GetEventObject() == bCancel) {
  452.         EndModal(wxCANCEL);
  453.     } else {
  454.         event.Skip();
  455.     }
  456. }
  457. ///// RegionDialog stuff; window setup taken from region_dialog.wdr
  458. #define ID_TEXT 10000
  459. #define ID_T_TITLE 10001
  460. #define ID_TEXTCTRL 10002
  461. #define ID_SPINBUTTON 10003
  462. #define ID_B_OK 10004
  463. #define ID_B_CANCEL 10005
  464. BEGIN_EVENT_TABLE(RegionDialog, wxDialog)
  465.     EVT_BUTTON(-1,  RegionDialog::OnButton)
  466.     EVT_CLOSE (     RegionDialog::OnCloseWindow)
  467. END_EVENT_TABLE()
  468. RegionDialog::RegionDialog(wxWindow* parentFrame,
  469.         const Sequence* sequence, int initialFrom, int initialTo) :
  470.     wxDialog(parentFrame, -1, "Set Alignment Region", wxDefaultPosition, wxDefaultSize,
  471.         wxCAPTION | wxSYSTEM_MENU) // not resizable
  472. {
  473.     wxPanel *parent = new wxPanel(this, -1);
  474.     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
  475.     wxStaticBox *item2 = new wxStaticBox( parent, -1, "Region" );
  476.     wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL );
  477.     wxFlexGridSizer *item3 = new wxFlexGridSizer( 1, 0, 0, 0 );
  478.     item3->AddGrowableCol( 1 );
  479.     wxStaticText *item4 = new wxStaticText( parent, ID_TEXT, "Sequence:", wxDefaultPosition, wxDefaultSize, 0 );
  480.     item3->Add( item4, 0, wxALIGN_CENTRE|wxALL, 5 );
  481.     wxString title;
  482.     title.Printf("%s, length %i", sequence->identifier->ToString().c_str(), sequence->Length());
  483.     wxStaticText *item5 = new wxStaticText( parent, ID_T_TITLE, title, wxDefaultPosition, wxDefaultSize, 0 );
  484.     item3->Add( item5, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  485.     item1->Add( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  486.     wxFlexGridSizer *item6 = new wxFlexGridSizer( 1, 0, 0, 0 );
  487.     item6->AddGrowableCol( 1 );
  488.     item6->AddGrowableRow( 4 );
  489.     wxStaticText *item7 = new wxStaticText( parent, ID_TEXT, "From:", wxDefaultPosition, wxDefaultSize, 0 );
  490.     item6->Add( item7, 0, wxALIGN_CENTRE|wxALL, 5 );
  491.     iFrom = new IntegerSpinCtrl(parent, 0, sequence->Length(), 1, initialFrom,
  492.         wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
  493.         wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
  494.     item6->Add( iFrom->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5 );
  495.     item6->Add( iFrom->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 );
  496.     wxStaticText *item10 = new wxStaticText( parent, ID_TEXT, "To:", wxDefaultPosition, wxDefaultSize, 0 );
  497.     item6->Add( item10, 0, wxALIGN_CENTRE|wxALL, 5 );
  498.     iTo = new IntegerSpinCtrl(parent, 0, sequence->Length(), 1, initialTo,
  499.         wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
  500.         wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
  501.     item6->Add( iTo->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5 );
  502.     item6->Add( iTo->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 );
  503.     item1->Add( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
  504.     item0->Add( item1, 0, wxALIGN_CENTRE|wxALL, 5 );
  505.     wxBoxSizer *item13 = new wxBoxSizer( wxHORIZONTAL );
  506.     wxButton *item14 = new wxButton( parent, ID_B_OK, "OK", wxDefaultPosition, wxDefaultSize, 0 );
  507.     item14->SetDefault();
  508.     item13->Add( item14, 0, wxALIGN_CENTRE|wxALL, 5 );
  509.     wxButton *item15 = new wxButton( parent, ID_B_CANCEL, "Cancel", wxDefaultPosition, wxDefaultSize, 0 );
  510.     item13->Add( item15, 0, wxALIGN_CENTRE|wxALL, 5 );
  511.     item0->Add( item13, 0, wxALIGN_CENTRE|wxALL, 5 );
  512.     parent->SetAutoLayout( TRUE );
  513.     parent->SetSizer( item0 );
  514.     item0->Fit( this );
  515.     item0->Fit( parent );
  516.     item0->SetSizeHints( this );
  517. }
  518. RegionDialog::~RegionDialog(void)
  519. {
  520.     delete iFrom;
  521.     delete iTo;
  522. }
  523. void RegionDialog::OnCloseWindow(wxCloseEvent& event)
  524. {
  525.     EndModal(wxCANCEL);
  526. }
  527. void RegionDialog::OnButton(wxCommandEvent& event)
  528. {
  529.     if (event.GetId() == ID_B_OK) {
  530.         int dummy1, dummy2;
  531.         if (GetValues(&dummy1, &dummy2))  // can't successfully quit if values aren't valid
  532.             EndModal(wxOK);
  533.         else
  534.             wxBell();
  535.     } else if (event.GetId() == ID_B_CANCEL) {
  536.         EndModal(wxCANCEL);
  537.     } else {
  538.         event.Skip();
  539.     }
  540. }
  541. bool RegionDialog::GetValues(int *from, int *to)
  542. {
  543.     return (iFrom->GetInteger(from) && iTo->GetInteger(to));
  544. }
  545. END_SCOPE(Cn3D)
  546. /*
  547. * ---------------------------------------------------------------------------
  548. * $Log: update_viewer_window.cpp,v $
  549. * Revision 1000.2  2004/06/01 18:29:52  gouriano
  550. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.61
  551. *
  552. * Revision 1.61  2004/05/21 21:41:40  gorelenk
  553. * Added PCH ncbi_pch.hpp
  554. *
  555. * Revision 1.60  2004/03/15 18:38:52  thiessen
  556. * prefer prefix vs. postfix ++/-- operators
  557. *
  558. * Revision 1.59  2004/02/19 17:05:21  thiessen
  559. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  560. *
  561. * Revision 1.58  2003/09/25 15:14:09  thiessen
  562. * add Reset All Regions command
  563. *
  564. * Revision 1.57  2003/02/03 19:20:08  thiessen
  565. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  566. *
  567. * Revision 1.56  2003/01/31 17:18:59  thiessen
  568. * many small additions and changes...
  569. *
  570. * Revision 1.55  2003/01/29 01:41:06  thiessen
  571. * add merge neighbor instead of merge near highlight
  572. *
  573. * Revision 1.54  2003/01/23 20:03:05  thiessen
  574. * add BLAST Neighbor algorithm
  575. *
  576. * Revision 1.53  2002/12/19 14:15:37  thiessen
  577. * mac fixes to menus, add icon
  578. *
  579. * Revision 1.52  2002/10/13 22:58:08  thiessen
  580. * add redo ability to editor
  581. *
  582. * Revision 1.51  2002/09/19 12:51:08  thiessen
  583. * fix block aligner / update bug; add distance select for other molecules only
  584. *
  585. * Revision 1.50  2002/09/16 21:24:58  thiessen
  586. * add block freezing to block aligner
  587. *
  588. * Revision 1.49  2002/09/09 13:38:23  thiessen
  589. * separate save and save-as
  590. *
  591. * Revision 1.48  2002/08/15 22:13:18  thiessen
  592. * update for wx2.3.2+ only; add structure pick dialog; fix MultitextDialog bug
  593. *
  594. * Revision 1.47  2002/08/13 20:46:38  thiessen
  595. * add global block aligner
  596. *
  597. * Revision 1.46  2002/08/01 01:55:16  thiessen
  598. * add block aligner options dialog
  599. *
  600. * Revision 1.45  2002/07/26 15:28:48  thiessen
  601. * add Alejandro's block alignment algorithm
  602. *
  603. * Revision 1.44  2002/07/03 13:39:40  thiessen
  604. * fix for redundant sequence removal
  605. *
  606. * Revision 1.43  2002/06/05 17:25:47  thiessen
  607. * change 'update' to 'import' in GUI
  608. *
  609. * Revision 1.42  2002/06/05 14:28:41  thiessen
  610. * reorganize handling of window titles
  611. *
  612. * Revision 1.41  2002/05/22 17:17:10  thiessen
  613. * progress on BLAST interface ; change custom spin ctrl implementation
  614. *
  615. * Revision 1.40  2002/05/17 19:10:27  thiessen
  616. * preliminary range restriction for BLAST/PSSM
  617. *
  618. * Revision 1.39  2002/05/07 20:22:47  thiessen
  619. * fix for BLAST/PSSM
  620. *
  621. * Revision 1.38  2002/05/02 18:40:25  thiessen
  622. * do BLAST/PSSM for debug builds only, for testing
  623. *
  624. * Revision 1.37  2002/04/27 16:32:15  thiessen
  625. * fix small leaks/bugs found by BoundsChecker
  626. *
  627. * Revision 1.36  2002/04/26 13:46:42  thiessen
  628. * comment out all blast/pssm methods
  629. *
  630. * Revision 1.35  2002/04/15 15:34:55  thiessen
  631. * remove BLAST/PSSM for now
  632. *
  633. * Revision 1.34  2002/03/28 14:06:02  thiessen
  634. * preliminary BLAST/PSSM ; new CD startup style
  635. *
  636. * Revision 1.33  2002/03/04 15:52:15  thiessen
  637. * hide sequence windows instead of destroying ; add perspective/orthographic projection choice
  638. *
  639. * Revision 1.32  2002/02/21 22:01:49  thiessen
  640. * remember alignment range on demotion
  641. *
  642. * Revision 1.31  2002/02/21 12:26:30  thiessen
  643. * fix row delete bug ; remember threader options
  644. *
  645. * Revision 1.30  2002/02/13 14:53:30  thiessen
  646. * add update sort
  647. *
  648. * Revision 1.29  2002/02/12 17:19:23  thiessen
  649. * first working structure import
  650. *
  651. * Revision 1.28  2001/12/06 23:13:47  thiessen
  652. * finish import/align new sequences into single-structure data; many small tweaks
  653. *
  654. * Revision 1.27  2001/11/30 14:02:05  thiessen
  655. * progress on sequence imports to single structures
  656. *
  657. * Revision 1.26  2001/11/27 16:26:10  thiessen
  658. * major update to data management system
  659. *
  660. * Revision 1.25  2001/10/08 00:00:09  thiessen
  661. * estimate threader N random starts; edit CDD name
  662. *
  663. * Revision 1.24  2001/09/27 15:38:00  thiessen
  664. * decouple sequence import and BLAST
  665. *
  666. * Revision 1.23  2001/09/24 14:37:52  thiessen
  667. * more wxPanel stuff - fix for new heirarchy in wx 2.3.2+
  668. *
  669. * Revision 1.22  2001/09/24 13:29:55  thiessen
  670. * fix wxPanel issues
  671. *
  672. * Revision 1.21  2001/09/18 03:10:46  thiessen
  673. * add preliminary sequence import pipeline
  674. *
  675. * Revision 1.20  2001/08/24 18:53:43  thiessen
  676. * add filename to sequence viewer window titles
  677. *
  678. * Revision 1.19  2001/08/06 20:22:01  thiessen
  679. * add preferences dialog ; make sure OnCloseWindow get wxCloseEvent
  680. *
  681. * Revision 1.18  2001/06/01 21:48:26  thiessen
  682. * add terminal cutoff to threading
  683. *
  684. * Revision 1.17  2001/05/31 18:47:10  thiessen
  685. * add preliminary style dialog; remove LIST_TYPE; add thread single and delete all; misc tweaks
  686. *
  687. * Revision 1.16  2001/05/24 21:38:41  thiessen
  688. * fix threader options initial values
  689. *
  690. * Revision 1.15  2001/05/24 13:32:32  thiessen
  691. * further tweaks for GTK
  692. *
  693. * Revision 1.14  2001/05/23 17:45:40  thiessen
  694. * change dialog implementation to wxDesigner; interface changes
  695. *
  696. * Revision 1.13  2001/05/22 19:09:32  thiessen
  697. * many minor fixes to compile/run on Solaris/GTK
  698. *
  699. * Revision 1.12  2001/05/17 18:34:26  thiessen
  700. * spelling fixes; change dialogs to inherit from wxDialog
  701. *
  702. * Revision 1.11  2001/05/15 23:48:38  thiessen
  703. * minor adjustments to compile under Solaris/wxGTK
  704. *
  705. * Revision 1.10  2001/05/15 14:57:56  thiessen
  706. * add cn3d_tools; bring up log window when threading starts
  707. *
  708. * Revision 1.9  2001/05/02 13:46:29  thiessen
  709. * major revision of stuff relating to saving of updates; allow stored null-alignments
  710. *
  711. * Revision 1.8  2001/04/19 12:58:32  thiessen
  712. * allow merge and delete of individual updates
  713. *
  714. * Revision 1.7  2001/04/12 18:10:00  thiessen
  715. * add block freezing
  716. *
  717. * Revision 1.6  2001/04/04 00:27:15  thiessen
  718. * major update - add merging, threader GUI controls
  719. *
  720. * Revision 1.5  2001/03/28 23:02:17  thiessen
  721. * first working full threading
  722. *
  723. * Revision 1.4  2001/03/22 00:33:18  thiessen
  724. * initial threading working (PSSM only); free color storage in undo stack
  725. *
  726. * Revision 1.3  2001/03/17 14:06:49  thiessen
  727. * more workarounds for namespace/#define conflicts
  728. *
  729. * Revision 1.2  2001/03/13 01:25:06  thiessen
  730. * working undo system for >1 alignment (e.g., update window)
  731. *
  732. * Revision 1.1  2001/03/09 15:49:06  thiessen
  733. * major changes to add initial update viewer
  734. *
  735. */