NCBI C++ ToolKit
alnmulti_widget.cpp
Go to the documentation of this file.

Go to the SVN repository for this file.

1 /* $Id: alnmulti_widget.cpp 47464 2023-04-20 00:19:10Z evgeniev $
2  * ===========================================================================
3  *
4  * PUBLIC DOMAIN NOTICE
5  * National Center for Biotechnology Information
6  *
7  * This software/database is a "United States Government Work" under the
8  * terms of the United States Copyright Act. It was written as part of
9  * the author's official duties as a United States Government employee and
10  * thus cannot be copyrighted. This software/database is freely available
11  * to the public for use. The National Library of Medicine and the U.S.
12  * Government have not placed any restriction on its use or reproduction.
13  *
14  * Although all reasonable efforts have been taken to ensure the accuracy
15  * and reliability of the software and data, the NLM and the U.S.
16  * Government do not and cannot warrant the performance or results that
17  * may be obtained by using this software or data. The NLM and the U.S.
18  * Government disclaim all warranties, express or implied, including
19  * warranties of performance, merchantability or fitness for any particular
20  * purpose.
21  *
22  * Please cite the author in any work or product based on this material.
23  *
24  * ===========================================================================
25  *
26  * Authors: Andrey Yazhuk
27  *
28  * File Description:
29  *
30  */
31 
32 #include <ncbi_pch.hpp>
33 
37 
39 
42 
48 
49 #include <gui/types.hpp>
50 
52 
54 #include <gui/objutils/utils.hpp>
55 
56 #include <gui/utils/menu_item.hpp>
57 
58 #include <wx/menu.h>
59 
61 
64 
65 
66 ////////////////////////////////////////////////////////////////////////////////
67 /// class CAlnMultiWidget
68 
70  wxFileArtProvider& provider)
71 {
72  WidgetsData_RegisterCommands(cmd_reg, provider);
73 
74  bool static initialized = false;
75  if( ! initialized) {
76  cmd_reg.RegisterCommand(eCmdMoveSelectedUp, "Move Selected Items Up", "Move Selected Items Up", "", "");
77 
78  cmd_reg.RegisterCommand(eCmdHideSelected, "Hide Selected", "Hide Selected", "", "");
79  cmd_reg.RegisterCommand(eCmdUnhideSelected, "Unhide Selected", "Unhide Selected", "", "");
80  cmd_reg.RegisterCommand(eCmdShowOnlySelected, "Show Only Selected", "Show Only Selected", "", "");
81  cmd_reg.RegisterCommand(eCmdShowAll, "Show All", "Show All", "", "");
82 
83  cmd_reg.RegisterCommand(eCmdSetSelMaster, "Set Selected", "Set Selected", "", "");
84  cmd_reg.RegisterCommand(eCmdUnsetMaster, "Unset", "Unset", "", "");
85 
86  cmd_reg.RegisterCommand(eCmdMarkSelected, "Mark Selected Regions", "Mark Selected", "", "");
87  cmd_reg.RegisterCommand(eCmdUnMarkSelected, "UnMark Selected Regions", "UnMark Selected", "", "");
88  cmd_reg.RegisterCommand(eCmdUnMarkAll, "UnMark All", "UnMark All", "", "");
89 
90  cmd_reg.RegisterCommand(eCmdRebuildAlignment, "Rebuild Alignment...", "Rebuild Alignment", "", "");
91 
92  initialized = true;
93  }
94 }
95 
96 
98  wxWindowID id,
99  const wxPoint& pos,
100  const wxSize& size,
101  long style,
102  const wxString& name)
103 : CGlWidgetBase(parent, id, pos, size, style, name),
104  m_DataSource(NULL),
105  m_Model(NULL),
106  m_AlignPane(NULL)
107 {
108 }
109 
110 
112 {
113  // Really model needs to be created After the pane is created in x_CreateControls otherwise
114  // we can have font problems.
115  if (model != NULL) {
116  m_Model = model;
117  m_Model->SetListener(this);
118  }
119 
121 
122  TVPRect rcVP;
124  GetPort().SetViewport(rcVP);
125 
127 }
128 
129 // Since the model creates fonts this has to be called After
130 // the pane (OpenGL context) is created, otherwise some fonts
131 // may not work correctly
133 {
134  if (m_Model == NULL) {
135  m_Model = new CAlnMultiModel();
136  m_Model->Init();
137  m_Model->SetListener(this);
138  }
139 
140  return m_Model;
141 }
142 
143 
145 {
146  if (m_AlignPane) {
149  }
150  if (m_Model) {
152  m_Model->ClearRows();
153  delete m_Model;
154  }
155 }
156 
157 
158 BEGIN_EVENT_TABLE(CAlnMultiWidget, CGlWidgetBase)
159  EVT_CONTEXT_MENU(CAlnMultiWidget::OnContextMenu)
160 
165 
173 
176 
193  CAlnMultiWidget::OnUpdateShowMethodDlg)
194  EVT_MENU(eCmdMethodProperties, CAlnMultiWidget::OnMethodProperties)
196  CAlnMultiWidget::OnUpdateMethodProperties)
197  EVT_MENU(eCmdDisableScoring, CAlnMultiWidget::OnDisableScoring)
198  EVT_UPDATE_UI(eCmdDisableScoring, CAlnMultiWidget::OnUpdateDisableScoring)
199  EVT_MENU(eCmdSetAsDefaultMethod, CAlnMultiWidget::OnSetAsDefaultMethod)
201  CAlnMultiWidget::OnScoringMethod)
203  CAlnMultiWidget::OnUpdateScoringMethod)
205 
206 
207 ////////////////////////////////////////////////////////////////////////////////
208 // IAlnMultiPaneParent implementation
209 
211 {
212  return m_DataSource;
213 }
214 
215 
217 {
218  return m_DataSource;
219 }
220 
221 
222 /// changes visibility state for given vector of rows to "b_visible"
223 void CAlnMultiWidget::SetVisible(const vector<TNumrow>& rows, bool b_visible,
224  bool b_invert_others)
225 {
226  m_Model->SetVisible(rows, b_visible, b_invert_others);
227 
228  x_AdjustVisible(false);
231 }
232 
233 
234 void CAlnMultiWidget::Select(const vector<TNumrow>& rows,
235  bool /*b_select*/,
236  bool /*b_invert_others*/)
237 {
238  if(m_Model) {
240  vsel.reserve(rows.size());
241 
242  for( size_t i = 0; i < rows.size(); i++ ) {
244  if(index >= 0) { // for master row it can be -1
245  vsel.push_back(index);
246  }
247  }
248 
249  m_Model->SLM_SelectItems(vsel, true);
251  }
252 }
253 
254 
256 {
257  _ASSERT(m_Model);
259 }
260 
261 
263 {
264  return m_Model->GetDisplayStyle();
265 }
266 
267 
269 {
270  if (m_RegPath.empty())
271  return;
272 
274  CRegistryReadView view = gui_reg.GetReadView(m_RegPath);
275 
277  style->LoadSettings(view);
278 
280 }
281 
282 
284 {
285  if (m_RegPath.empty())
286  return;
287 
288  if (m_DataSource && m_Model) {
290  CRegistryWriteView view = gui_reg.GetWriteView(m_RegPath);
292  if (m_Model->GetNumRows() > 0) try {
293  align_type = m_DataSource->GetAlignType();
294  } catch (...) {
295  }
297  style->SaveSettings(view, align_type);
298  }
299 }
300 
301 
303 {
304  return m_Model->GetAlignPort();
305 }
306 
307 
309 {
310  return m_Model->GetAlignPort();
311 }
312 
313 
315 {
316  return m_AlignPane;
317 }
318 
319 
321 {
322  _ASSERT(m_Model);
323 
324  m_Model->SetDataSource(NULL); // release the old one
325 
326  m_DataSource = p_ds;
327  m_AlignPane->Init(scope);
328 
329  if(m_DataSource) {
330  if (!m_DataSource->IsEmpty()) {
332  string method = m_Model->GetDefaultMethod();
333  x_SetScoringMethod(method, false);
334  }
335 
336  if (m_Model->GetDisplayStyle() != NULL) {
337  bool create_consensus = m_Model->GetDisplayStyle()->m_ShowConsensus;
338  m_DataSource->SetCreateConsensus(create_consensus);
339  }
340  }
341 
343 }
344 
345 
347 {
348  return m_Model;
349 }
350 
351 
353 {
354  return m_Model;
355 }
356 
357 
359 {
360  IAlignRow* p_row = m_Model->GetRowByLine(line);
361  return p_row->GetRowNum();
362 }
363 
364 
365 /// return -1 if "row" does not exist or is not visible
367 {
368  return m_Model->GetLineByRowNum(row);
369 }
370 
371 
373 {
374  x_OnResize();
375 }
376 
377 
379 {
380  GetPort().SetScaleRefPoint(scale_x, GetPort().GetScaleY(), point);
381  x_UpdateOnZoom();
382 }
383 
384 
386 {
387  TSeqPos left = (TSeqPos) floor(rc.Left());
388  TSeqPos right = (TSeqPos) ceil(rc.Right());
389  x_ZoomToRange(left, right);
390 }
391 
392 
394 {
395  GetPort().ZoomPoint(point, factor);
396 }
397 
398 
400 {
401  GetPort().Scroll(d_x, d_y);
402  x_UpdateOnZoom();
403 }
404 
405 
407 {
408  if (p_row == m_Model->GetMasterRow()) {
409  m_AlignPane->Update();
410  x_AdjustVisible(false);
413  }
414  else {
416  }
417 }
418 
419 
420 void CAlnMultiWidget::OnContextMenu(wxContextMenuEvent& event)
421 {
422  wxPoint point = event.GetPosition();
423 
424  bool from_keyboard = (point == wxPoint(-1, -1));
425  if (! from_keyboard) {
426  point = ScreenToClient(point);
427 
430  }
431 
432  // give listeners a chance to customize the menu //TODO
433  wxMenu* menu = x_CreatePopupMenu();
434 
436 }
437 
438 
440 {
442  SaveSettings();
443 }
444 
446 {
447  switch(update.GetType()) {
450  //update.GetMessage(),
451  eDialog_Ok, eIcon_Stop, "Error", eWrap);
453  break;
455  if (!CDCN_GetMessage(update).empty())
456  m_AlignPane->ShowProgressPanel((float) update.GetProgressNorm(),
457  CDCN_GetMessage(update)
458  );
459  break;
461  try {
462  m_Model->SetDataSource(nullptr);
463  if (m_DataSource && !m_DataSource->IsEmpty()) {
465  string method = m_Model->GetDefaultMethod();
466  x_SetScoringMethod(method, false);
467  }
469  } catch (CException& e) {
471  } catch (exception& e) {
472  NcbiMessageBox(string(e.what()), eDialog_Ok, eIcon_Stop, "Error", eWrap);
473  }
475  break;
476  default:
477  _ASSERT(false); //unexpected
478  }
479 }
480 
481 
482 void CAlnMultiWidget::OnScoringProgress(float progress, const string& msg)
483 {
484  m_AlignPane->ShowProgressPanel(progress, msg);
485 }
486 
487 
489 {
491 }
492 
493 
494 /// overriding base class implementation
496 {
497  return FindFocus() == m_AlignPane;
498 }
499 
500 
501 // end IAlnMultiPaneParent implementation
502 ////////////////////////////////////////////////////////////////////////////////
503 
504 
505 void CAlnMultiWidget::OnSavePdf(wxCommandEvent& /* evt */)
506 {
508 }
509 
510 void CAlnMultiWidget::OnEnableSavePdfCmdUpdate(wxUpdateUIEvent& event)
511 {
512  event.Enable(true);
513 }
514 
515 void CAlnMultiWidget::OnSaveSvg(wxCommandEvent& /* evt */)
516 {
518 }
519 
520 void CAlnMultiWidget::OnEnableSaveSvgCmdUpdate(wxUpdateUIEvent& event)
521 {
522  event.Enable(true);
523 }
524 
525 void CAlnMultiWidget::OnZoomSequence(wxCommandEvent& event)
526 {
528  GetPort().SetScale(1 / w, GetPort().GetScaleY());
529  x_UpdateOnZoom();
530 }
531 
532 
533 void CAlnMultiWidget::OnZoomSelection(wxCommandEvent&)
534 {
535  ZoomToSelection();
536 }
537 
539 {
541  if(sel_r.NotEmpty()) {
542  x_ZoomToRange(sel_r.GetFrom(), sel_r.GetTo());
543  x_UpdateOnZoom();
544  }
545 }
546 
547 
548 void CAlnMultiWidget::OnUpdateZoomSelection(wxUpdateUIEvent& event)
549 {
550  if( m_AlignPane ){
552  event.Enable(sel_r.NotEmpty());
553  } else {
554  event.Enable( false );
555  }
556 }
557 
559 {
561  rcV.SetLeft(from);
562  rcV.SetRight(to + 1);
563  GetPort().ZoomRect(rcV);
564 
565  x_UpdateOnZoom();
566 }
567 
568 
570 {
571  x_MakeVisibleHorz(pos, pos);
572 }
573 
574 
576 {
577  CGlPane& port = GetPort();
578  TModelRect rcV = port.GetVisibleRect();
579  TModelUnit sh_left = from - rcV.Left();
580  TModelUnit sh_right = to + 1 - rcV.Right();
581 
582  TModelUnit sh = 0;
583  if(sh_left < 0) { // shift left
584  sh = sh_left;
585  } else if(sh_right > 0) {
586  sh = min(sh_right, sh_left);
587  }
588  if(sh != 0) {
589  port.Scroll(sh, 0);
590  x_UpdateOnZoom();
591  }
592 }
593 
594 
595 void CAlnMultiWidget::OnMakeSelectedRowMaster(wxCommandEvent& event)
596 {
597  int sel_n = m_Model->SLM_GetSelectedCount();
598 
599  if(sel_n == 1) {
600  // perform command
602  m_Model->SLM_GetSelectedIndices(vIndices);
603  int SelIndex = vIndices[0]; // take the first selected item
604  TNumrow iRow = GetRowNumByLine(SelIndex);
605 
607  } else { // show warning
608  string msg = "Please select a ";
609  msg += (sel_n == 0) ? "row!" : "single row!";
611  }
612 }
613 
614 
616 {
617  event.Enable( m_Model ? m_Model->CanChangeMasterRow() : false );
618 }
619 
620 
621 void CAlnMultiWidget::OnMakeConsensusRowMaster(wxCommandEvent& event)
622 {
623  int iRow = GetDataSource()->GetConsensusRow();
624  if(iRow > -1) {
626  }
627 }
628 
629 
631 {
632  bool en = m_Model ? m_Model->CanChangeMasterRow() : false;
633  event.Enable(en);
634 }
635 
636 
637 void CAlnMultiWidget::OnUnsetMaster(wxCommandEvent& event)
638 {
640 }
641 
642 
643 void CAlnMultiWidget::OnUpdateUnsetMaster(wxUpdateUIEvent& event)
644 {
645  bool en = m_Model ? (m_Model->CanChangeMasterRow() && m_Model->GetMasterRow() ) : false;
646  event.Enable(en);
647 }
648 
649 
650 void CAlnMultiWidget::OnResetSelection(wxCommandEvent& event)
651 {
653 }
654 
655 
657 {
658  if(GetModel() && GetDataSource()) {
660  GetModel()->SLM_GetSelectedIndices(vindices);
661  ITERATE(CAlnMultiModel::TIndexVector, itInd, vindices) {
662  TNumrow row = GetRowNumByLine(*itInd);
663  if(GetDataSource()->CanGetId(row))
664  {
665  const CSeq_id& id = GetDataSource()->GetSeqId(row);
666  ids.push_back(CConstRef<CSeq_id>(&id));
667  }
668  }
669  } else _ASSERT(false);
670 }
671 
672 
673 void CAlnMultiWidget::GetSelectedRows(vector<TNumrow>& rows)
674 {
675  if(GetModel() && GetDataSource()) {
676  IAlignRow* master_row = m_Model->GetMasterRow();
677  if (master_row &&
678  (master_row->GetRowState()& IAlignRow::fItemSelected) != 0)
679  rows.push_back(master_row->GetRowNum());
680 
682  GetModel()->SLM_GetSelectedIndices(vindices);
683  ITERATE(CAlnMultiModel::TIndexVector, itInd, vindices) {
684  TNumrow row = GetRowNumByLine(*itInd);
685  rows.push_back(row);
686  }
687  }
688 }
689 
690 
692 {
693  if(GetModel() && GetDataSource()) {
694  vector<TNumrow> sel_rows;
695 
696  ITERATE(TRSeqIdVector, it, ids) {
697  const CSeq_id& id = **it;
698 
699  //find row corresponding to id
700  int n_rows = GetDataSource()->GetNumRows();
701  for( TNumrow row = 0; row < n_rows; row++ ) {
702  if((GetModel()->GetRowState(row) & IAlignRow::fItemHidden) == 0) {
703  const CSeq_id& row_id = GetDataSource()->GetSeqId(row);
704  if(CSeqUtils::Match(row_id, id, &scope)) {
705  sel_rows.push_back(row);
706  break;
707  }
708  }
709  }
710  }
711 
712  Select(sel_rows, true);
713  }
714 }
715 
716 
718 {
719  return m_AlignPane->GetSelection();
720 }
721 
722 
724 {
725  m_AlignPane->SetSelection(coll, true);
726 }
727 
728 
729 void CAlnMultiWidget::OnMarkSelected(wxCommandEvent& event)
730 {
731  const TRangeColl& C = m_AlignPane->GetSelection();
733 
734  m_AlignPane->Refresh();
735 }
736 
737 
738 void CAlnMultiWidget::OnUnMarkSelected(wxCommandEvent& event)
739 {
740  const TRangeColl& C = m_AlignPane->GetSelection();
741  m_AlignPane->MarkSelectedRows(C, false);
742 
743  m_AlignPane->Refresh();
744 }
745 
746 
747 void CAlnMultiWidget::OnUpdateMarkSelected(wxUpdateUIEvent& event)
748 {
749  bool en = false;
750  if( m_Model && m_Model->SLM_GetSelectedCount() > 0 ){
751  const TRangeColl& C = m_AlignPane->GetSelection();
752  en = C.size() > 0;
753  }
754  event.Enable(en);
755 }
756 
757 void CAlnMultiWidget::OnHasSelected(wxUpdateUIEvent& event)
758 {
759  event.Enable(m_Model && m_Model->SLM_GetSelectedCount() > 0);
760 }
761 
762 void CAlnMultiWidget::OnUnMarkAll(wxCommandEvent& event)
763 {
765 
766  m_AlignPane->Refresh();
767 }
768 
769 
770 void CAlnMultiWidget::OnHideSelected(wxCommandEvent& event)
771 {
772  vector<TNumrow> rows;
773  m_Model->GetSelectedRows(rows);
774  m_Model->SLM_SelectAll(false); // reset selection
775 
776  SetVisible(rows, false);
777 }
778 
779 
780 void CAlnMultiWidget::x_GetMatchingHiddenRows(vector<TNumrow>& rows)
781 {
782  rows.clear();
783  if (!GetModel() || !GetDataSource() || GetDataSource()->IsEmpty())
784  return;
786  set<string> selected;
787  //find row corresponding to id
788  int n_rows = GetDataSource()->GetNumRows();
789  string acc;
790  for (TNumrow row = 0; row < n_rows; row++) {
791  IAlignRow* aln_row = GetModel()->GetRow(row);
792  int state = aln_row->GetRowState();
793  aln_row->GetColumnText(IAlignRow::eDescr, acc);
795  hidden.insert(pair<string, TNumrow>(acc, row));
796  } else if (state & IAlignRow::fItemSelected) {
797  selected.insert(acc);
798  }
799  }
800  ITERATE(set<string>, it, selected)
801  {
802  pair<multimap<string, int>::iterator, multimap<string, int>::iterator> ppp;
803  ppp = hidden.equal_range(*it);
804  while (ppp.first != ppp.second) {
805  rows.push_back(ppp.first->second);
806  ++ppp.first;
807  }
808  }
809 }
810 
811 
812 void CAlnMultiWidget::OnUnhideSelected(wxCommandEvent& event)
813 {
814  vector<TNumrow> rows;
816  if (!rows.empty())
817  SetVisible(rows, true);
818 }
819 
820 void CAlnMultiWidget::OnUpdateUnhideSelected(wxUpdateUIEvent& event)
821 {
822  vector<TNumrow> selected;
823  GetSelectedRows(selected);
824  string text = "Unhide ";
825  if (selected.empty()) {
826  text += "selected";
827  } else if (selected.size() == 1) {
828  string txt;
829  text += "All '" + GetModel()->GetRow(selected.front())->GetColumnText(IAlignRow::eDescr, txt) + "' Rows";
830  } else {
831  text += "All Rows Matching " + NStr::NumericToString(selected.size()) + " Selected Rows";
832  }
833  event.SetText(ToWxString(text));
834  vector<TNumrow> rows;
836  event.Enable(!rows.empty());
837 }
838 
839 
840 void CAlnMultiWidget::OnShowOnlySelected(wxCommandEvent& event)
841 {
842  vector<TNumrow> rows;
843  m_Model->GetSelectedRows(rows);
844 
845  SetVisible(rows, true, true); // hide those that are not selected
846 }
847 
848 
849 void CAlnMultiWidget::OnShowAll(wxCommandEvent& event)
850 {
851  m_Model->ShowAll();
852 
853  x_AdjustVisible(false);
856 }
857 
858 
859 void CAlnMultiWidget::OnMoveSelectedUp(wxCommandEvent& event)
860 {
861  if(m_Model) {
862  vector<TNumrow> rows;
863  m_Model->GetSelectedRows(rows);
864 
865  if(rows.size()) {
866  m_Model->SetRowOrder(rows);
868  }
869  }
870 }
871 
872 
874 {
876  CWidgetDisplayStyle::TColumns& st_cols = style.m_Columns;
877 
879  int cols_n = renderer.GetColumnsCount();
880  st_cols.resize(cols_n);
881 
882  for( int i = 0; i < cols_n; i++ ) {
883  const CAlnMultiRenderer::SColumn& col = renderer.GetColumn(i);
884 
885  st_cols[i].m_Name = col.m_Name;
886  st_cols[i].m_Width = col.m_Width;
887  st_cols[i].m_Visible = col.m_Visible;
888  }
889 }
890 
891 
892 void CAlnMultiWidget::OnSettings(wxCommandEvent& event)
893 {
895  CWidgetDisplayStyle::TColumns& st_cols = style.m_Columns;
896 
898 
899  // update style columns
901  int cols_n = renderer.GetColumnsCount();
902  st_cols.resize(cols_n);
903  for( int i = 0; i < cols_n; i++ ) {
904  const CAlnMultiRenderer::SColumn& col = renderer.GetColumn(i);
905  st_cols[i].m_Name = col.m_Name;
906  st_cols[i].m_Width = col.m_Width;
907  st_cols[i].m_Visible = col.m_Visible;
908  }
909 
910  // show the dialog
911  CAlnPropertiesDlg dlg(this);
912  dlg.SetRegistryPath(m_RegPath + ".Properties Dialog");
913  dlg.SetParams(style);
914 
915  if(dlg.ShowModal() == wxID_OK) {
917  SaveSettings();
918  }
919 }
920 
921 void CAlnMultiWidget::OnUpdateSettings(wxUpdateUIEvent& event)
922 {
923  event.Enable( true );
924 }
925 
926 
928 {
931 
933 }
934 
935 
937 {
938  m_AlignPane->Update();
940 }
941 
942 
944 {
946 
947  ITERATE(CAlnMultiPane::TRowToMarkMap, it_m, map) { //for each marked row
948  TNumrow row = it_m->first;
949  if(GetDataSource()->CanGetId(row)) {
950  const CSeq_id& seq_id = GetDataSource()->GetSeqId(row);
951  // create CSeq_loc
952  ls_locs.push_back(new CSeq_loc());
953  CSeq_loc& seq_loc = *ls_locs.back();
954 
955  // put intervals
956  CSeq_loc::TPacked_int& p_int = seq_loc.SetPacked_int();
957 
958  const TRangeColl& mark = it_m->second;
959  ITERATE(TRangeColl, it_r, mark) { // for each range in mark
960  p_int.AddInterval(seq_id, it_r->GetFrom(), it_r->GetTo());
961  }
962  }
963  }
964 }
965 
967 {
969  m_AlignPane->Update();
970 }
971 
972 
974 {
975  m_AlignPane = new CAlnMultiPane(this, wxID_ANY);
976 
977  // Pane is created, now we can model (which includes fonts which require
978  // an active opengl context)
979  if(m_Model == NULL) {
981  }
982  _ASSERT(m_Model);
983 
984  IAlnMultiPaneParent* widget = static_cast<IAlnMultiPaneParent*>(this);
985  m_AlignPane->SetWidget(widget);
987 
989 }
990 
991 /*void CAlnMultiWidget::x_CreateControls()
992 {
993  CFlCurrentGuard GUARD;
994  _ASSERT(! m_AlignPane && ! m_ScrollX && ! m_ScrollY);
995 
996  const CWidgetSettings& sys_st = CWidgetSettings::GetSystemSettings();
997  const int ScrollbarSize = sys_st.GetMetric(eSysMetric_ScrollbarSize);
998 
999  int client_w = w() - ScrollbarSize;
1000  int client_h = h() - ScrollbarSize;
1001 
1002  m_AlignPane = new CAlnMultiPane(x(), y(), client_w, client_h);
1003  m_AlignPane->end();
1004  add(m_AlignPane);
1005 
1006  IAlnMultiPaneParent* pWidget = static_cast<IAlnMultiPaneParent*>(this);
1007  m_AlignPane->SetWidget(pWidget);
1008  m_AlignPane->SetContext(m_Model);
1009 
1010  m_Model->SLM_AddSLView(static_cast<TNumrowSelListView*>(m_AlignPane));
1011 
1012  // scrollbars
1013  m_ScrollX = new Fl_Scrollbar(x(), y() + client_h, client_w, ScrollbarSize);
1014  m_ScrollX->type(FL_HORIZONTAL);
1015  m_ScrollX->callback(CAlnMultiWidget::x_OnScrollX, this );
1016  add(m_ScrollX);
1017 
1018  m_ScrollY = new Fl_Scrollbar(x() + client_w, y(), ScrollbarSize, client_h);
1019  m_ScrollY->type(FL_VERTICAL);
1020  m_ScrollY->callback(CAlnMultiWidget::x_OnScrollY, this );
1021  add(m_ScrollY);
1022 
1023  resizable(m_AlignPane);
1024 }
1025 
1026 void CAlnMultiWidget::x_SetScrollbars()
1027 {
1028  TModelRect rcAll = x_GetAlignPort().GetModelLimitsRect();
1029  TModelRect rcVisible = x_GetAlignPort().GetVisibleRect();
1030 
1031  if (x_GetAlignPort().NeedsScrollX()) {
1032  m_ScrollX->value((int) rcVisible.Left(), (int) rcVisible.Width(),
1033  (int) rcAll.Left(), (int)rcAll.Width());
1034  } else {
1035  m_ScrollX->value(0, 0, 0, 0);
1036  }
1037 
1038  if (x_GetAlignPort().NeedsScrollY()) {
1039  m_ScrollY->value((int) rcVisible.Top(), (int) -rcVisible.Height(),
1040  (int) rcAll.Top(), (int) -rcAll.Height());
1041  } else {
1042  m_ScrollY->value(0, 0, 0, 0);
1043  }
1044 }*/
1045 
1046 
1048 {
1049  TVPRect rcVP;
1051  GetPort().SetViewport(rcVP);
1052 
1053  x_AdjustVisible(false);
1055 
1056  // do not redraw, FLTK will do it for us -
1057 }
1058 
1059 
1061 {
1062  m_AlignPane->Refresh();
1063 }
1064 
1065 
1066 ////////////////////////////////////////////////////////////////////////////////
1067 /// Update handlers
1069 {
1071  if(ds && ! ds->IsEmpty()) {
1072  x_AdjustVisible(b_reset);
1073 
1074  if(m_Model) {
1075  TNumrow n_rows = ds->GetNumRows();
1076  for( TNumrow i = 0; i < n_rows; i++ ) {
1077  IAlignRow* p_row = m_Model->GetRow(i);
1078  p_row->SetHost(m_AlignPane);
1079  }
1080  }
1081  }
1082 
1083  m_AlignPane->ResetSelection(false);
1085 
1087 
1089  if (!style.m_ShowConsensus) {
1090  int iRow = GetDataSource()->GetConsensusRow();
1091  if (iRow > -1) {
1092  vector<TNumrow> rows;
1093  rows.push_back(iRow);
1094  SetVisible(rows, false);
1095  }
1096  }
1097 
1099  x_RedrawControls();
1100 }
1101 
1102 
1104 {
1105  TModelRect rcV;
1106  CGlPane& port = GetPort();
1107 
1108  if(b_reset) {
1109  rcV = port.GetModelLimitsRect();
1110  rcV.SetTop(0);
1111  } else {
1112  rcV = port.GetVisibleRect();
1113  }
1114  rcV.SetBottom(rcV.Top() + (m_AlignPane->GetAlignVPHeight() - 1));
1115  port.SetVisibleRect(rcV);
1116  port.AdjustToLimits();
1117 }
1118 
1119 
1121 {
1122  //_ASSERT(GetDataSource());
1123 
1124  // updating model
1126 
1127  // updating representation
1128  x_AdjustVisible(false);
1130  x_RedrawControls();
1131 }
1132 
1133 
1135 {
1136  CGlPane& port = GetPort();
1137  TModelRect rcV = port.GetVisibleRect();
1138  TSignedSeqPos SeqStart = 0;
1139  TSignedSeqPos SeqStop = 0;
1140 
1141  if(GetDataSource()->GetAnchor() == NewMasterRow)
1142  return;
1143 
1144  // choose row that will be used for coordinate translations
1145  TNumrow SelRow = (NewMasterRow != -1) ? NewMasterRow : GetDataSource()->GetAnchor();
1146  TRangeColl SeqSelection; //selection in coordinates of SelRow
1147 
1148  if(SelRow != -1) {
1149  TSeqPos AlnStart((TSeqPos) rcV.Left());
1150  TSeqPos AlnStop((TSeqPos) rcV.Right());
1151  SeqStart = GetDataSource()->GetSeqPosFromAlnPos(SelRow, AlnStart,
1153  SeqStop = GetDataSource()->GetSeqPosFromAlnPos(SelRow, AlnStop,
1155 
1156  // convert selection to SelRow coordinates
1157  const TRangeColl& Selection = m_AlignPane->GetSelection();
1158  ITERATE(TRangeColl, it, Selection) {
1159  TSeqPos Start =
1160  GetDataSource()->GetSeqPosFromAlnPos(SelRow, it->GetFrom(),
1162  TSeqPos Stop =
1163  GetDataSource()->GetSeqPosFromAlnPos(SelRow, it->GetTo(),
1165  SeqSelection.CombineWith(TSeqRange(Start, Stop));
1166  }
1167  }
1168 
1169  m_Model->SetMasterRow(NewMasterRow);
1170 
1171  if(SelRow != -1) {
1172  // calculate new visible rect based on saved positions
1173  TSignedSeqPos AlnStart = GetDataSource()->GetAlnPosFromSeqPos(SelRow, SeqStart);
1174  TSignedSeqPos AlnStop = GetDataSource()->GetAlnPosFromSeqPos(SelRow, SeqStop);
1175 
1176  TModelRect rcNewV(AlnStart, rcV.Bottom(), AlnStop, rcV.Top());
1177  port.SetVisibleRect(rcNewV);
1178 
1179  // convert Selection back to Alignment space
1180  TRangeColl AlnSelection;
1181  const TRangeColl& C = SeqSelection;
1182  ITERATE(TRangeColl, it, C) {
1183  TSeqPos Start = GetDataSource()->GetAlnPosFromSeqPos(SelRow, it->GetFrom());
1184  TSeqPos Stop = GetDataSource()->GetAlnPosFromSeqPos(SelRow, it->GetTo());
1185  AlnSelection.CombineWith(TSeqRange(Start, Stop));
1186  }
1187  m_AlignPane->SetSelection(AlnSelection, false);
1188  }
1189 
1190  m_AlignPane->Update();
1191 
1192  x_AdjustVisible(false);
1194 
1195  x_RedrawControls();
1196 
1197  // TODO - use special function of CAlnMultiPane
1200 }
1201 
1202 
1204 {
1206  m_AlignPane->Update();
1207  x_RedrawControls();
1208 }
1209 
1210 
1212 {
1214 
1216 
1218 
1221 
1222  if (GetDataSource() != NULL) {
1224 
1225  int iRow = GetDataSource()->GetConsensusRow();
1226  if (iRow > -1) {
1227  if (!style.m_ShowConsensus &&
1228  m_Model->GetMasterRow() != NULL &&
1229  m_Model->GetMasterRow()->GetRowNum() == iRow) {
1231  }
1232 
1233  vector<TNumrow> rows;
1234  rows.push_back(iRow);
1235 
1236  SetVisible(rows, style.m_ShowConsensus);
1237  }
1238  else if (style.m_ShowConsensus) {
1239  // User has asked to see consensus row but the row has not
1240  // been created, so create it and then update data since dense-seg
1241  // is rebuilt with a new row when consensus is created
1244 
1247  }
1248  }
1249 
1251 }
1252 
1253 
1254 void CAlnMultiWidget::OnShowMethodDlg(wxCommandEvent& event)
1255 {
1257 
1258  string name = x_GetCurrentMethodName();
1259 
1261  _ASSERT(sc_type != IAlnExplorer::fInvalid);
1262 
1263  CScoringMethodsDlg dlg;
1264  dlg.Setup(name, sc_type);
1265  dlg.Create(this);
1266 
1267  if(dlg.ShowModal() == wxID_OK) {
1268  name = ToStdString(dlg.GetSelectedMethod());
1269  x_SetScoringMethod(name, true);
1270  }
1271 }
1272 
1273 
1274 void CAlnMultiWidget::OnUpdateShowMethodDlg(wxUpdateUIEvent& event)
1275 {
1276  bool en = false;
1277  if(GetDataSource()) {
1279  en = (type != IAlnExplorer::fInvalid);
1280  }
1281  event.Enable(en);
1282 }
1283 
1284 
1285 void CAlnMultiWidget::OnMethodProperties(wxCommandEvent& event)
1286 {
1287  IUIToolWithGUI* method = dynamic_cast<IUIToolWithGUI*>(m_Model->GetCurrentMethod());
1288  if(method) {
1289  CPropertiesPanelDlg dlg(this, method);
1290  dlg.SetTitle(wxT("Coloring Method Properties"));
1291 
1292  if(dlg.ShowModal() == wxID_OK) {
1293  m_Model->UpdateOnScoringChanged(); // update scores
1294 
1295  UpdateOnScoringChanged(); // update UI
1296  }
1297  }
1298 }
1299 
1300 
1301 void CAlnMultiWidget::OnUpdateMethodProperties(wxUpdateUIEvent& event)
1302 {
1303  bool bEn = false;
1304  if(m_Model) {
1305  IUIToolWithGUI* method = dynamic_cast<IUIToolWithGUI*>(m_Model->GetCurrentMethod());
1306  bEn = method && method->HasPropertiesPanel();
1307  }
1308  event.Enable(bEn);
1309 }
1310 
1311 
1312 void CAlnMultiWidget::OnDisableScoring(wxCommandEvent& event)
1313 {
1314  x_SetScoringMethod("", true);
1315 }
1316 
1317 
1318 void CAlnMultiWidget::OnUpdateDisableScoring(wxUpdateUIEvent& event)
1319 {
1320  bool en = (m_Model && m_Model->GetCurrentMethod() != NULL);
1321  event.Enable(en);
1322  event.Check( ! en);
1323 }
1324 
1325 
1327 {
1328  _ASSERT(m_Model);
1329 
1331  return method ? method->GetName() : "";
1332 }
1333 
1334 
1335 static const int kDefMRUSize = 5;
1336 
1337 
1338 // changes current scoring method to "method_name"
1339 void CAlnMultiWidget::x_SetScoringMethod(const string& method_name, bool save)
1340 {
1341  _ASSERT(m_Model);
1342 
1343  string current_name = x_GetCurrentMethodName();
1344 
1345  if(current_name != method_name) { // we do need to change it
1346  if(method_name == "") {
1348 
1349  UpdateOnScoringChanged(); // update display
1350  } else {
1352  bool ok = m_Model->SetCurrentMethod(method_name);
1353 
1354  if( ! ok) {
1355  // method not registered yet - create a new instance
1356  CIRef<IUITool> tool = reg->CreateToolInstance(method_name);
1357  IScoringMethod* method =
1358  dynamic_cast<IScoringMethod*>(tool.GetPointer());
1359  if(method) {
1360  // add the method to the model and select it
1361  m_Model->AddScoringMethod(method);
1362  ok = m_Model->SetCurrentMethod(method_name);
1363  } else {
1364  string msg = string("Method \"") + method_name;
1365  msg += "\" is invalid.";
1367  }
1368  }
1369 
1370  if(ok) {
1371  string mru_list = x_GetScoringMRUListName();
1372  if( ! reg->MRUListExists(mru_list)) {
1373  reg->CreateMRUList(mru_list, kDefMRUSize);
1374  }
1375  reg->AddToolToMRU(mru_list, method_name);
1376 
1377  UpdateOnScoringChanged(); // update display
1378  }
1379  }
1380  if(save) {
1381  m_Model->SetDefaultMethod(method_name);
1382  SaveSettings();
1383  }
1384  }
1385 }
1386 
1387 
1388 void CAlnMultiWidget::OnScoringMethod(wxCommandEvent& event)
1389 {
1390  int cmd = event.GetId();
1391  const string& method_name = m_CmdToName[cmd];
1392 
1393  x_SetScoringMethod(method_name, true);
1394  m_CmdToName.clear();
1395 }
1396 
1397 
1398 void CAlnMultiWidget::OnUpdateScoringMethod(wxUpdateUIEvent& event)
1399 {
1400  TCmdID cmd = event.GetId();
1401  const string& method_name = m_CmdToName[cmd];
1402 
1403  string current_name = x_GetCurrentMethodName();
1404 
1405  event.Check(current_name == method_name);
1406 }
1407 
1408 
1409 void CAlnMultiWidget::OnSetAsDefaultMethod(wxCommandEvent& event)
1410 {
1411  string current_name = x_GetCurrentMethodName();
1412 
1413  string* def_name = x_GetDefMethodName();
1414 
1415  _ASSERT(def_name);
1416 
1417  *def_name = current_name;
1418  SaveSettings();
1419 }
1420 
1421 
1422 // returns a reference to the default scoring method for this type of alignment
1424 {
1426 
1429 
1430  switch(type) {
1431  case IAlnExplorer::fDNA:
1432  return &(style->m_DefDNAMethod);
1434  return &style->m_DefProteinMethod;
1435  default:
1436  _ASSERT(false);
1437  return NULL;
1438  }
1439  }
1440 
1441 
1443 {
1444  string tag =
1446  string mru_list = "Multiple Alignment Widget Scoring Methods - " + tag;
1447  return mru_list;
1448 }
1449 
1450 
1451 ////////////////////////////////////////////////////////////////////////////////
1452 /// Scroll callbacks
1453 /*
1454 void CAlnMultiWidget::x_OnScrollX(Fl_Widget* pW, void* pData)
1455 {
1456  CAlnMultiWidget* pCont = reinterpret_cast<CAlnMultiWidget*>(pData);
1457 
1458  int V = pCont->m_ScrollX->value();
1459  double dX = V - pCont->x_GetAlignPort().GetVisibleRect().Left();
1460  pCont->x_GetAlignPort().Scroll(dX, 0);
1461 
1462  pCont->x_RedrawControls();
1463 }
1464 
1465 void CAlnMultiWidget::x_OnScrollY(Fl_Widget* pW, void* pData)
1466 {
1467  CAlnMultiWidget* pCont = reinterpret_cast<CAlnMultiWidget*>(pData);
1468 
1469  int V = pCont->m_ScrollY->value();
1470  double dY = V - pCont->x_GetAlignPort().GetVisibleRect().Top();
1471  pCont->x_GetAlignPort().Scroll(0, dY);
1472 
1473  pCont->x_RedrawControls();
1474 }*/
1475 
1476 
1477 void CAlnMultiWidget::Print(const string& filename)
1478 {
1479 /* CPrintOptions opts;
1480  opts.SetOutputFormat(CPrintOptions::GetFormatFromName("pdf"));
1481  opts.SetFilename(filename);
1482  opts.SetHeader("header --- SeqViewer --- header");
1483  opts.SetFooter("footer --- SeqViewer --- footer");
1484 
1485  m_AlignPane->Print(opts);*/
1486 }
1487 
1488 static
1489 WX_DEFINE_MENU(kPopupMenu)
1490  WX_MENU_SEPARATOR_L("Top Actions")
1491  WX_MENU_SEPARATOR_L("Zoom")
1501  WX_SUBMENU("Hide / Show")
1506  WX_END_SUBMENU()
1507  WX_SUBMENU("Anchor")
1510  WX_END_SUBMENU()
1512  WX_SUBMENU("Coloring")
1516  WX_END_SUBMENU()
1517  WX_MENU_SEPARATOR_L("Settings")
1519 WX_END_MENU()
1520 
1521 
1522 wxMenu* CAlnMultiWidget::x_CreatePopupMenu()
1523 {
1525  wxMenu* root = cmd_reg.CreateMenu(kPopupMenu);
1526 
1527  if(GetDataSource()) {
1528  IAlnExplorer::EAlignType type = GetDataSource()->GetAlignType();
1529 
1530  if(type != IAlnExplorer::fInvalid) {
1531  // alignment has been created
1532 
1533  /// add Scoring Methods menu
1534  wxMenu* color_menu = FindSubItem(*root, wxT("Coloring"))->GetMenu();
1535  x_CreateScoringMethodsMenu(*color_menu);
1536 
1537  // obtain a list of MRU names from the Method Registry
1538  m_CmdToName.clear();
1539 
1540  string current_method = x_GetCurrentMethodName();
1541  string mru_list = x_GetScoringMRUListName();
1542 
1543  vector<string> MRU_names;
1545  if(reg->MRUListExists(mru_list)) {
1546  reg->GetMRUToolNames(mru_list, MRU_names);
1547  }
1548 
1549  // if current method is not in the MRU - add it
1550  if(! current_method.empty()) {
1551  vector<string>::const_iterator it =
1552  std::find(MRU_names.begin(), MRU_names.end(), current_method);
1553  if(it == MRU_names.end()) {
1554  MRU_names.push_back(current_method);
1555  }
1556  }
1557 
1558  if( ! MRU_names.empty()) {
1559  // keep it sorted, so that user can easily find a method
1560  std::sort(MRU_names.begin(), MRU_names.end());
1561 
1562  wxMenuItem* col_item = FindSubItem(*root, wxT("Coloring"));
1563  wxMenu* submenu = col_item->GetSubMenu();
1564 
1565  int index = 0;
1566  ITERATE(vector<string>, it_name, MRU_names) {
1567  TCmdID cmd = eCmdScoringMethodXXXX + index;
1568  const string& method_name = *it_name;
1569  submenu->AppendCheckItem(cmd, ToWxString(method_name));
1570 
1571  m_CmdToName[cmd] = method_name;
1572  index++;
1573  }
1574 
1575  submenu->AppendSeparator();
1576  cmd_reg.AppendMenuItem(*submenu, eCmdDisableScoring);
1577 
1578  string* def_name = x_GetDefMethodName();
1579  _ASSERT(def_name);
1580 
1581  if(*def_name != current_method) {
1582  cmd_reg.AppendMenuItem(*submenu, eCmdSetAsDefaultMethod);
1583  }
1584  }
1585  }
1586  }
1587  return root;
1588 }
1589 
1590 
1592 {
1593  _ASSERT(m_Model);
1594 
1595  IScoringMethod* curr_method = m_Model->GetCurrentMethod();
1596  IUIToolWithGUI* gui_method = dynamic_cast<IUIToolWithGUI*>(curr_method);
1597  if(gui_method) {
1598  // if method provides a menu - integrate this menu
1599  const CMenuItem* method_item = gui_method->GetMenu();
1600 
1601  if(method_item) { // menu is not empty
1602  wxMenu* item_menu = CreateMenu(method_item);
1603  color_menu.AppendSubMenu(item_menu,
1604  ToWxString(method_item->GetLabel()));
1605  }
1606  }
1607 }
1608 
1610 {
1612  return m_AlignPane ? m_AlignPane->HasSelectedObjects() : false;
1613 }
1614 
1616 {
1618  if (m_AlignPane)
1620 }
1621 
1622 bool CAlnMultiWidget::SaveVectorImage(CPrintOptions::EOutputFormat format, string const &path, string const &file_name, bool show_header, bool simplified)
1623 {
1624  int original_shown = m_Model->GetShownElements();
1625  int shown = original_shown;
1626  if (show_header) {
1628  }
1629  else {
1630  shown &= ~IAlnMultiRendererContext::fShownElement_Header;
1631  }
1632  m_Model->SetShownElements(shown);
1633 
1634  CAlnMultiRenderer &renderer = m_AlignPane->GetRenderer();
1635  TVPRect original_rect = renderer.GetRect();
1636  CGlPane &port = GetPort();
1637  const TModelRect model_limits = port.GetModelLimitsRect();
1638  const TVPRect vp_rect = port.GetViewport();
1639  const TModelRect visible_rect = port.GetVisibleRect();
1640 
1642  font.SetFontSize(12);
1643  TModelUnit title_height = font.TextHeight() - font.GetFontDescender();
1644  title_height += 12.f;
1645 
1646  size_t height = (size_t)-model_limits.Height();
1647  size_t width = original_rect.Width();
1648  int header_height = 0;
1650  header_height += renderer.GetHeaderAreaHeight();
1652  header_height += renderer.GetRulerAreaHeight();
1654  header_height += renderer.GetMasterAreaHeight();
1655  height += header_height;
1656 
1657  // adjust viewport and image size
1658  renderer.Resize(TVPRect(0, 0, static_cast<TVPUnit>(width - 1), static_cast<TVPUnit>(height - 1)));
1659  port.SetViewport(TVPRect(0, 0, static_cast<TVPUnit>(width - 1), static_cast<TVPUnit>(height - 1)));
1660 
1661  // adjust visible range - it gets ruined after viewport adjustment
1662  TModelRect rc_vis = port.GetVisibleRect();
1663  size_t y = 0;;
1664  rc_vis.SetVert(y + (height - 1), y);
1665  port.SetVisibleRect(rc_vis);
1666 
1667  unique_ptr<IImageGrabber> grabber{ CImageGrabberFactory::CreateImageGrabber(format, *m_AlignPane) };
1668 
1669  if (title_height > 0.0) {
1670  grabber->SetTitleHeight(title_height);
1671  }
1672  grabber->SetOutputInfo(path, file_name, CPrintOptions::GetFileExtension(format));
1673  grabber->DisableGouraudShading(simplified);
1674  IImageGrabber::eCaptureResult res = grabber->GrabImages(0);
1675 
1676 
1677  m_Model->SetShownElements(original_shown);
1678  renderer.Resize(original_rect);
1679  port.SetViewport(vp_rect);
1680  port.SetVisibleRect(visible_rect);
1681 
1682  if (res == IImageGrabber::eOpenGLError) {
1683  wxMessageBox(wxT("Graphics system does not support in-memory image save feature"), wxT("Error Saving"), wxOK);
1684  }
1685  else if (res == IImageGrabber::eFileError) {
1686  wxMessageBox(wxT("File error occured during save. Make sure file and directory names are valid."), wxT("Error Saving"), wxOK);
1687  }
1688 
1689  return (res == IImageGrabber::eSuccess);
1690 }
1691 
1693 {
1694  CwxExportAlnmultiImgDlg dlg(format, this, this);
1695  dlg.ShowModal();
1696 }
1697 
1698 
CAlnMultiWidget::OnUpdateMethodProperties eCmdScoringMethodLast
USING_SCOPE(objects)
static const int kDefMRUSize
CAlnMultiWidget::OnUpdateMethodProperties EVT_MENU_RANGE(eCmdScoringMethodXXXX, eCmdScoringMethodLast, CAlnMultiWidget::OnScoringMethod) EVT_UPDATE_UI_RANGE(eCmdScoringMethodXXXX
EVT_UPDATE_UI(eCmdAlnShowMethodsDlg, CAlnMultiWidget::OnUpdateShowMethodDlg) EVT_UPDATE_UI(eCmdMethodProperties
@ eCmdMarkSelected
@ eCmdShowAll
@ eCmdUnsetMaster
@ eCmdUnMarkAll
@ eCmdMoveSelectedUp
@ eCmdUnMarkSelected
@ eCmdRebuildAlignment
@ eCmdSetSelMaster
@ eCmdShowOnlySelected
@ eCmdUnhideSelected
@ eCmdHideSelected
class CAlnMultiModel - represents a visual model of an alignment.
virtual bool CanChangeMasterRow() const
changes Master (Anchor) and performs necessary updates
virtual void CreateConsensus(void)
Creates consenus row if it is not already created.
virtual int GetLineByRowNum(TNumrow row) const
virtual void SetDefaultMethod(const string &method_name)
void GetSelectedRows(vector< TNumrow > &rows)
virtual void UpdateSortOrder(void)
enables auto sorting of rows, sorts rows using x_SortRows() and performs necessary updates
virtual bool AddScoringMethod(IScoringMethod *method)
adds scoring method; model assumes ownership of the method, it will be deleted automatically
virtual CWidgetDisplayStyle * GetDisplayStyle()
virtual string GetDefaultMethod(void)
IAlignRow * GetRow(TNumrow row)
CAlnMultiModel inline functions.
virtual const IScoringMethod * GetCurrentMethod() const
void SetPortLimits(void)
virtual void UpdateOnScoringChanged(const TSeqRange &range=TSeqRange::GetEmpty())
virtual void Init()
const size_t GetNumRows() const
Get number of rows registered in model.
virtual void SetRowOrder(const vector< TNumrow > &rows, int pos=0)
disables auto sorting, reorders rows in alignment so that rows from the given vector appear in the sp...
virtual void SetStyleCatalog(const CRowStyleCatalog *catalog)
virtual void ClearRows(void)
Update handlers.
virtual void UpdateOnRowHChanged(void)
updates model after row height changed
virtual void SetListener(CScoreCache::IListener *listener)
virtual IAlignRow * GetMasterRow()
virtual bool SetMasterRow(TNumrow new_row)
virtual IAlignRow * GetRowByLine(TLine line)
all Y coordinates are OpenGL Viewport coordinates (not widget coords) "index" is a line index (not ro...
virtual void SetShownElements(int shown_mask)
virtual void UpdateOnStyleChanged(void)
virtual void UpdateOnDataChanged()
virtual void SLM_SelectAll(bool bSelect)
void SetVisible(vector< TNumrow > rows, bool b_visible, bool b_invert_others=false)
makes specified rows visible/hidden, if b_invert_others == "true" then visibility of all rows not in ...
virtual void ResetCurrentMethod()
virtual void SetDataSource(IAlnMultiDataSource *p_ds)
virtual int GetShownElements()
returns mask of shown elements - header, ruler, master row, alignment, track matrix
virtual bool SetCurrentMethod(const string &name, const TSeqRange &range=TSeqRange::GetEmpty())
CGlPane & GetAlignPort()
class CAlnMultiPane
void UpdateHeaderSortState()
virtual TModelUnit SHH_GetModelByWindow(int z, EOrientation orient) override
bool HasSelectedObjects() const
void SetContext(IAlnMultiRendererContext *p_context)
void HideProgressPanel()
const TRowToMarkMap & GetMarks() const
void ResetSelection(bool redraw)
CAlnMultiRenderer & GetRenderer()
void SetBackColor(const CRgbaColor &color)
virtual void Update() override
const TRangeColl & GetSelection() const
int GetAlignVPWidth() const
virtual void UpdateOnDataChanged()
void Init(objects::CScope *scope)
void ShowProgressPanel(float progress, const string &msg)
void SetSelection(const TRangeColl &C, bool redraw)
void MarkSelectedRows(const TRangeColl &C, bool bMark)
void SetWidget(IAlnMultiPaneParent *p_arent)
CRange< TSeqPos > GetSelectionLimits()
int GetAlignVPHeight() const
void GetObjectSelection(TConstObjects &objs) const
class CAlnMultiRenderer - renders multiple alignment represented by IAlnMultiRendererContext (the Mod...
virtual void Resize(const TVPRect &rc)
void SetColumnsByStyle(CWidgetDisplayStyle &style)
virtual int GetColumnsCount() const
int GetHeaderAreaHeight() const
virtual const SColumn & GetColumn(int index) const
int GetMasterAreaHeight() const
int GetRulerAreaHeight() const
virtual TVPRect GetRect() const
class CAlnMultiWidget
CAlnMultiModel::TNumrow TNumrow
CAlnMultiPane * m_AlignPane
representation of alignment data
IAlnMultiDataSource * m_DataSource
void OnScoringMethod(wxCommandEvent &event)
void OnUpdateUnsetMaster(wxUpdateUIEvent &event)
void x_ZoomToRange(TSeqPos from, TSeqPos to)
void GetObjectSelection(TConstObjects &objs) const
void GetSelectedRows(vector< TNumrow > &rows)
void OnMakeConsensusRowMaster(wxCommandEvent &event)
const TRangeColl & GetSelection(void) const
virtual void x_RedrawControls(void)
void OnSaveSvg(wxCommandEvent &evt)
void OnUpdateMarkSelected(wxUpdateUIEvent &event)
unmark selected regions of selected rows
void OnEnableSaveSvgCmdUpdate(wxUpdateUIEvent &evt)
virtual void SetDataSource(IAlnMultiDataSource *p_ds, objects::CScope *scope)
void OnSavePdf(wxCommandEvent &evt)
virtual void x_SetScoringMethod(const string &method_name, bool save)
void OnShowAll(wxCommandEvent &event)
hide rows that are not selected
CAlnMultiWidget(wxWindow *parent, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=0, const wxString &name=wxT("panel"))
void x_MakeVisibleHorz(TSeqPos pos)
void OnDisableScoring(wxCommandEvent &event)
void OnUnhideSelected(wxCommandEvent &event)
hide selected rows
void OnUpdateUnhideSelected(wxUpdateUIEvent &event)
hide selected rows
void OnContextMenu(wxContextMenuEvent &event)
virtual void SaveSettings() const
void OnUpdateMakeConsensusRowMaster(wxUpdateUIEvent &event)
virtual void x_UpdateStyleColumns()
virtual void x_CreateScoringMethodsMenu(wxMenu &color_menu)
virtual void Scroll(TModelUnit d_x, TModelUnit d_y)
void OnShowOnlySelected(wxCommandEvent &event)
void OnUnMarkSelected(wxCommandEvent &event)
mark selected regions of selected rows
bool HasSelectedObjects() const
void OnUpdateZoomSelection(wxUpdateUIEvent &event)
virtual int GetLineByRowNum(TNumrow Row) const
return -1 if "row" does not exist or is not visible
void OnMethodProperties(wxCommandEvent &event)
void OnHasSelected(wxUpdateUIEvent &event)
virtual void UpdateSortOrder()
void x_GetMatchingHiddenRows(vector< TNumrow > &rows)
bool SaveVectorImage(CPrintOptions::EOutputFormat format, string const &path, string const &file_name, bool show_header, bool simplified)
virtual void x_UpdateOnDataChanged(bool b_reset=true)
Update handlers.
virtual void OnChildResize()
virtual string x_GetCurrentMethodName() const
virtual void LoadSettings()
void OnMoveSelectedUp(wxCommandEvent &event)
show all hidden rows
virtual void x_AdjustVisible(bool b_reset)
virtual void x_UpdateOnRowHChanged(void)
virtual CGlPane & GetPort()
implement these 2 functions in derived classes
void OnUpdateShowMethodDlg(wxUpdateUIEvent &event)
virtual void SetStyleCatalog(const CRowStyleCatalog *catalog)
void OnMarkSelected(wxCommandEvent &event)
virtual CAlnMultiModel * x_CreateModel()
factory method creating and initializing a default model
void OnHideSelected(wxCommandEvent &event)
virtual void x_UpdateOnZoom(void)
virtual void ZoomRect(const TModelRect &rc)
void x_CreatePane(void)
factory method creating master pane, called form x_CreateControls()
virtual void Select(const vector< TNumrow > &rows, bool b_select, bool b_invert_others=false)
TCmdToName m_CmdToName
widget rendering data and handling events
void OnUpdateScoringMethod(wxUpdateUIEvent &event)
void OnUnsetMaster(wxCommandEvent &event)
virtual void SetScaleX(TModelUnit scale_x, const TModelPoint &point)
virtual void OnDSChanged(CDataChangeNotifier::CUpdate &update)
virtual ~CAlnMultiWidget()
vector< CConstRef< objects::CSeq_id > > TRSeqIdVector
void OnZoomSequence(wxCommandEvent &event)
static void RegisterCommands(CUICommandRegistry &cmd_reg, wxFileArtProvider &provider)
class CAlnMultiWidget
virtual wxMenu * x_CreatePopupMenu()
virtual void x_UpdateOnSwitchMaster(TNumrow NewMasterRow)
void GetSelectedIds(TRSeqIdVector &ids) const
void OnMakeSelectedRowMaster(wxCommandEvent &event)
void SetSelection(const TRangeColl &coll)
virtual void OnColumnsChanged()
virtual void SetVisible(const vector< TNumrow > &rows, bool b_visible, bool b_invert_others=false)
makes specified rows visible/hidden, other rows aren't affected
virtual bool IsRendererFocused()
overriding base class implementation
CAlnMultiModel * m_Model
source of alignment data
void OnSettings(wxCommandEvent &event)
virtual string * x_GetDefMethodName()
virtual const CWidgetDisplayStyle * GetDisplayStyle() const
virtual void x_UpdateOnStylesChanged(void)
virtual void OnRowChanged(IAlignRow *p_row)
virtual IAlnMultiDataSource * GetDataSource()
virtual CAlnMultiModel * GetModel()
void OnEnableSavePdfCmdUpdate(wxUpdateUIEvent &evt)
void OnResetSelection(wxCommandEvent &event)
virtual void UpdateOnScoringChanged()
virtual string x_GetScoringMRUListName()
list< objects::CSeq_loc * > TPSeqLocList
virtual void OnScoringFinished()
void OnShowMethodDlg(wxCommandEvent &event)
virtual void OnScoringProgress(float progress, const string &msg)
void Print(const string &filename)
Scroll callbacks.
void OnUpdateSettings(wxUpdateUIEvent &event)
void OnUnMarkAll(wxCommandEvent &event)
void x_OnSaveVectorImage(CPrintOptions::EOutputFormat format)
void OnZoomSelection(wxCommandEvent &event)
void OnUpdateDisableScoring(wxUpdateUIEvent &event)
void OnSetAsDefaultMethod(wxCommandEvent &event)
virtual TNumrow GetRowNumByLine(TLine line) const
void OnUpdateMakeSelectedRowMaster(wxUpdateUIEvent &event)
void OnUpdateMethodProperties(wxUpdateUIEvent &event)
void GetMarks(TPSeqLocList &ls_locs) const
virtual void CreateWidget(CAlnMultiModel *model=NULL)
performs initialization, creates Model and Controls.
virtual CGlWidgetPane * x_GetPane()
void SetSelectedIds(const TRSeqIdVector &ids, objects::CScope &scope)
virtual void x_OnResize(void)
virtual void ZoomPoint(const TModelPoint &point, TModelUnit factor)
CwxAlnPropertiesDlg.
void SetParams(CWidgetDisplayStyle &style)
CUpdate - notification send by CUIDataSource to the listener.
virtual void SetRegistryPath(const string &path)
Definition: dialog.cpp:59
class CGlPane
Definition: glpane.hpp:62
class CGlWidgetBase
TModelPoint m_PopupPoint
string m_RegPath
path to the widget's settings in GUI Registry
virtual void x_CreateControls(void)
creates Pane, Scrollbars and other child widgets, called from Create()
virtual void x_UpdateScrollbars()
virtual void x_ShowDecoratedPopupMenu(wxMenu *menu)
CGlWidgetPane represent a window component residing in CGlWidgetBase client area.
CRegistryWriteView GetWriteView(const string &section)
get a read-write view at a particular level.
Definition: registry.cpp:462
static CGuiRegistry & GetInstance()
access the application-wide singleton
Definition: registry.cpp:400
CRegistryReadView GetReadView(const string &section) const
get a read-only view at a particular level.
Definition: registry.cpp:428
static IImageGrabber * CreateImageGrabber(EOutputFormat format, IVectorGraphicsRenderer &pane)
CMenuItem - represents a menu items in IMenu-style menus.
Definition: menu_item.hpp:53
void AddInterval(const CSeq_interval &ival)
for convenience
static const string & GetFileExtension(EOutputFormat format)
TThisType & CombineWith(const TRange &r)
Definition: range_coll.hpp:195
class CRegistryReadView provides a nested hierarchical view at a particular key.
Definition: reg_view.hpp:58
class CRgbaColor provides a simple abstraction for managing colors.
Definition: rgba_color.hpp:58
CRowStyleCatalog is a collection of CRowDisplayStyle-s assigned to rows in alignment.
CScope –.
Definition: scope.hpp:92
CScoringMethodsDlg.
bool Create(wxWindow *parent, wxWindowID id=ID_CSCORINGMETHODSDLG, const wxString &caption=_("Alignment Scoring Methods"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(400, 300), long style=wxCAPTION|wxRESIZE_BORDER|wxSYSTEM_MENU|wxCLOSE_BOX)
Creation.
void Setup(const string &sel_method, IAlnExplorer::EAlignType type)
wxString GetSelectedMethod() const
virtual void SLM_SelectItems(const TIndexVector &vIndeces, bool b_reset_others=false)
Select items with given indices.
virtual TIndex SLM_GetSelectedCount() const
virtual void SLM_GetSelectedIndices(TIndexVector &vIndices) const
virtual void SLM_AddSLView(TSelListView *pView)
CUICommandRegistry is a centralized registry where all application commands should be registered.
Definition: ui_command.hpp:146
static CUICommandRegistry & GetInstance()
the main instance associated with the application
Definition: ui_command.cpp:176
wxMenu * CreateMenu(const SwxMenuItemRec *items)
create a menu from a static definition (see WX_*_MENU macros)
Definition: ui_command.cpp:349
int RegisterCommand(CUICommand *cmd)
assumes ownership of the given object returns a command id (useful when registry is used for auto id ...
Definition: ui_command.cpp:198
wxMenuItem * AppendMenuItem(wxMenu &menu, TCmdID cmd_id) const
Definition: ui_command.cpp:300
CUIToolRegistry - is a registry providing access to various tools registred in the application.
void CreateMRUList(const string &list_name, int size=10)
static CUIToolRegistry * GetInstance()
void GetMRUToolNames(const string &list_name, vector< string > &tool_names)
void AddToolToMRU(const string &list, const string &tool_name)
add a method to the MRU list
bool MRUListExists(const string &list_name) const
CIRef< IUITool > CreateToolInstance(const string &method_name)
factory method, returns NULL if name is invalid.
CWidgetDisplayStyle is a collection of display properties common for all rows in the CAlnMultiWidget.
string m_DefProteinMethod
default scoring method for DNA alignments
CGlTextureFont m_TextFont
void SaveSettings(CRegistryWriteView view, IAlnExplorer::EAlignType type)
vector< SColumn > TColumns
void LoadSettings(const CRegistryReadView &view)
CGlTextureFont m_SeqFont
text font (description, positions etc.)
virtual const CRgbaColor & GetColor(EColorType type) const
Interface IAlignRow - abstracts row rendering in Multiple Alignment Widget.
Definition: ialign_row.hpp:67
virtual int GetRowNum() const =0
Returns index of row in IAlnMultiDataSource.
virtual string & GetColumnText(TColumnType col_type, string &text, bool for_printer=false) const =0
virtual void SetHost(IAlignRowHost *pHost)=0
virtual int GetRowState() const =0
Returns row state (combination of EState flags)
@ eRight
Towards higher aln coord (always to the right)
@ eLeft
Towards lower aln coord (always to the left)
IAlnMultiDataSource - interface to a data source representing an abstract multiple alignment.
virtual IAlnExplorer::EAlignType GetAlignType() const =0
virtual TSignedSeqPos GetSeqPosFromAlnPos(TNumrow for_row, TSeqPos aln_pos, IAlnExplorer::ESearchDirection dir=IAlnExplorer::eNone, bool try_reverse_dir=true) const =0
virtual TSignedSeqPos GetAlnPosFromSeqPos(TNumrow row, TSeqPos seq_pos, IAlnExplorer::ESearchDirection dir=IAlnExplorer::eNone, bool try_reverse_dir=true) const =0
virtual int GetConsensusRow() const =0
returns index of the Consensus row or -1 if it doesn't exist
virtual TNumrow GetNumRows(void) const =0
number of rows in alignment
virtual const objects::CSeq_id & GetSeqId(TNumrow row) const =0
virtual TNumrow GetAnchor(void) const =0
virtual bool CanCreateConsensus()=0
virtual void SetCreateConsensus(bool b)=0
virtual bool IsEmpty() const =0
Interface IAlnMultiPaneParent represents a context in which an instance of CAlnMultiPane lives.
IAlnMultiDataSource::TNumrow TNumrow
IAlnMultiRendererContext - this interface represents context in which CAlnMultiRenderer lives.
void SetTitleHeight(TModelUnit h)
Set size for optional pdf title.
IScoringMethod represents an abstract algorithm for calculating alignment scores and assigning colors...
static const char * GetAlignmentTagByType(IAlnExplorer::EAlignType type)
returns symbolic label for the given alignment type, should be
vector< TIndex > TIndexVector
Definition: list_mvc.hpp:49
interface ISelListView
Definition: list_mvc.hpp:76
IUIToolWithGUI - represents a method that can be integrated in GUI.
Definition: ui_tool.hpp:102
virtual bool HasPropertiesPanel() const =0
returns true if the method supports properties dialog
virtual const CMenuItem * GetMenu()=0
Returns a pointer to the submenu.
virtual string GetName() const =0
returns unique name of the method that is used in UI to identify it
void clear()
Definition: map.hpp:169
const_iterator_pair equal_range(const key_type &key) const
Definition: map.hpp:296
iterator insert(const value_type &val)
Definition: map.hpp:305
iterator_bool insert(const value_type &val)
Definition: set.hpp:149
@ eCmdAlnShowMethodsDlg
@ eCmdDisableScoring
@ eCmdMethodProperties
@ eCmdSetAsDefaultMethod
@ eCmdScoringMethodXXXX
void WidgetsData_RegisterCommands(CUICommandRegistry &cmd_reg, wxFileArtProvider &provider)
Register standard commands defined in this file and wxWidgets headers.
#define C(s)
Definition: common.h:231
const char * file_name[]
static CS_COMMAND * cmd
Definition: ct_dynamic.c:26
static const char * catalog
Definition: stats.c:19
unsigned int TSeqPos
Type for sequence locations and lengths.
Definition: ncbimisc.hpp:875
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
Definition: ncbimisc.hpp:815
int TSignedSeqPos
Type for signed sequence position.
Definition: ncbimisc.hpp:887
string
Definition: cgiapp.hpp:690
#define NULL
Definition: ncbistd.hpp:225
const string & GetMsg(void) const
Get message string.
Definition: ncbiexpt.cpp:461
virtual const char * what(void) const noexcept
Standard report (includes full backlog).
Definition: ncbiexpt.cpp:342
static bool Match(const objects::CSeq_id &id1, const objects::CSeq_id &id2, objects::CScope *scope=NULL)
check to see if two seq-ids are identical.
GLdouble TModelUnit
Definition: gltypes.hpp:48
void ZoomPoint(TModelUnit x, TModelUnit y, TModelUnit factor, int options=fZoomXY)
Definition: glpane.cpp:311
void SetRight(T right)
Definition: glrect.hpp:114
void SetSize(T width, T height)
Definition: glrect.hpp:129
T Height() const
Definition: glrect.hpp:90
void SetViewport(const TVPRect &R)
Definition: glpane.cpp:96
void SetBottom(T bottom)
Definition: glrect.hpp:113
T Top() const
Definition: glrect.hpp:84
T Bottom() const
Definition: glrect.hpp:82
T Width() const
Definition: glrect.hpp:86
T Right() const
Definition: glrect.hpp:83
TVPRect & GetViewport(void)
Definition: glpane.hpp:332
CGlRect< TVPUnit > TVPRect
Definition: gltypes.hpp:53
void SetScale(TModelUnit scale_x, TModelUnit scale_y, TModelPoint p_center)
Definition: glpane.cpp:361
virtual TModelUnit GetFontDescender() const
void AdjustToLimits()
Definition: glpane.hpp:504
void SetScaleRefPoint(TModelUnit scale_x, TModelUnit scale_y, TModelPoint p_ref)
Definition: glpane.cpp:382
void ZoomRect(const TModelRect &r)
Definition: glpane.cpp:348
TModelRect & GetModelLimitsRect(void)
Definition: glpane.hpp:347
T Left() const
Definition: glrect.hpp:81
void Scroll(TModelUnit dx, TModelUnit dy)
Definition: glpane.cpp:602
int TVPUnit
Definition: gltypes.hpp:47
void SetVert(T bottom, T top)
Definition: glrect.hpp:123
void SetVisibleRect(const TModelRect &R)
Definition: glpane.cpp:113
virtual TModelUnit GetMetric(EMetric metric, const char *text=NULL, int len=-1) const
void SetLeft(T left)
Definition: glrect.hpp:112
virtual TModelUnit TextHeight(void) const
void SetFontSize(unsigned int size)
Set/get font size in points.
TModelRect & GetVisibleRect(void)
Definition: glpane.hpp:357
void SetTop(T top)
Definition: glrect.hpp:115
@ eMetric_MaxCharWidth
Definition: glfont.hpp:86
@ eHorz
Definition: gltypes.hpp:59
@ eVert
Definition: gltypes.hpp:60
virtual void RemoveListener(CEventHandler *listener)
Remove a listener.
vector< CConstRef< CObject > > TConstObjects
Definition: objects.hpp:64
const string & GetLabel() const
Definition: menu_item.cpp:167
EDialogReturnValue NcbiMessageBox(const string &message, TDialogType type=eDialog_Ok, EDialogIcon icon=eIcon_Exclamation, const string &title="Error", EDialogTextMode text_mode=eRaw)
Definition: message_box.cpp:48
virtual bool Send(CEvent *evt, EDispatch disp_how=eDispatch_Default, int pool_name=ePool_Default)
Sends an event synchronously.
int TCmdID
@ eCmdZoomInMouse
Definition: command.hpp:71
@ eCmdSettings
Definition: command.hpp:85
@ eCmdResetSelection
Definition: command.hpp:97
@ eCmdZoomOutMouse
Definition: command.hpp:72
@ eCmdSaveSvg
Definition: command.hpp:108
@ eCmdSavePdf
Definition: command.hpp:107
@ eCmdZoomSeq
Zoom to Selection.
Definition: command.hpp:74
@ eCmdZoomAll
Definition: command.hpp:70
@ eCmdZoomSel
Definition: command.hpp:73
@ eDispatch_Default
dispatch until handled at least by one handler
void SetPacked_int(TPacked_int &v)
Definition: Seq_loc.hpp:984
TObjectType * GetPointer(void) THROWS_NONE
Get pointer,.
Definition: ncbiobj.hpp:998
bool NotEmpty(void) const
Definition: range.hpp:152
CRange< TSeqPos > TSeqRange
typedefs for sequence ranges
Definition: range.hpp:419
#define END_NCBI_SCOPE
End previously defined NCBI scope.
Definition: ncbistl.hpp:103
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
Definition: ncbistl.hpp:100
static enable_if< is_arithmetic< TNumeric >::value||is_convertible< TNumeric, Int8 >::value, string >::type NumericToString(TNumeric value, TNumToStringFlags flags=0, int base=10)
Convert numeric value to string.
Definition: ncbistr.hpp:673
TTo GetTo(void) const
Get the To member data.
Definition: Range_.hpp:269
TFrom GetFrom(void) const
Get the From member data.
Definition: Range_.hpp:222
@ eIcon_Exclamation
Definition: types.hpp:65
@ eIcon_Stop
Definition: types.hpp:66
@ eWrap
Definition: types.hpp:82
@ eDialog_Ok
Definition: types.hpp:47
@ eDialog_Modal
Definition: types.hpp:53
n background color
END_EVENT_TABLE()
int i
static void text(MDB_val *v)
Definition: mdb_dump.c:62
CMinPanelContainer::OnRestoreWindow EVT_UPDATE_UI_RANGE(eCmdCloseDockPanel, eCmdWindowRestore, CMinPanelContainer::OnUpdateWindowCommand) CMinPanelContainer
#define wxT(x)
Definition: muParser.cpp:41
constexpr auto sort(_Init &&init)
constexpr bool empty(list< Ts... >) noexcept
const struct ncbi::grid::netcache::search::fields::SIZE size
const char * tag
T min(T x_, T y_)
static Format format
Definition: njn_ioutil.cpp:53
static static static wxID_ANY
ViewerWindowBase::OnEditMenu ViewerWindowBase::OnJustification EVT_MENU(MID_SHOW_GEOM_VLTNS, ViewerWindowBase::OnShowGeomVltns) EVT_MENU(MID_FIND_PATTERN
static SLJIT_INLINE sljit_ins msg(sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b)
#define row(bind, expected)
Definition: string_bind.c:73
SColumn describes a single column.
int m_Width
horizontal position in viewport
bool m_Visible
can be used to identify column
Definition: type.c:6
#define _ASSERT
#define WX_DEFINE_MENU(name)
New macros for defining menus for use with CUICommandRegistry.
Definition: ui_command.hpp:266
#define WX_SUBMENU(label)
Definition: ui_command.hpp:288
#define WX_END_MENU()
Definition: ui_command.hpp:294
#define WX_MENU_SEPARATOR_L(label)
Definition: ui_command.hpp:285
#define WX_MENU_ITEM(cmd)
Definition: ui_command.hpp:270
#define WX_MENU_SEPARATOR()
Definition: ui_command.hpp:282
#define WX_END_SUBMENU()
Definition: ui_command.hpp:291
const string & CDCN_GetMessage(const CDataChangeNotifier::CUpdate &update)
wxMenu * CreateMenu(const CMenuItem *item)
Creates a wxMenu object replicating the structure of CMenuItem.
Definition: wx_utils.cpp:365
wxString ToWxString(const string &s)
Definition: wx_utils.hpp:173
string ToStdString(const wxString &s)
Definition: wx_utils.hpp:161
wxMenuItem * FindSubItem(wxMenu &menu, const wxString &text)
Find a subitem of the given menu by text.
Definition: wx_utils.cpp:426
Modified on Fri Sep 20 14:57:53 2024 by modify_doxy.py rev. 669887