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

Go to the SVN repository for this file.

1 
2 /* $Id: align_span_view.cpp 46555 2021-07-07 15:43:24Z shkeda $
3  * ===========================================================================
4  *
5  * PUBLIC DOMAIN NOTICE
6  * National Center for Biotechnology Information
7  *
8  * This software/database is a "United States Government Work" under the
9  * terms of the United States Copyright Act. It was written as part of
10  * the author's official duties as a United States Government employee and
11  * thus cannot be copyrighted. This software/database is freely available
12  * to the public for use. The National Library of Medicine and the U.S.
13  * Government have not placed any restriction on its use or reproduction.
14  *
15  * Although all reasonable efforts have been taken to ensure the accuracy
16  * and reliability of the software and data, the NLM and the U.S.
17  * Government do not and cannot warrant the performance or results that
18  * may be obtained by using this software or data. The NLM and the U.S.
19  * Government disclaim all warranties, express or implied, including
20  * warranties of performance, merchantability or fitness for any particular
21  * purpose.
22  *
23  * Please cite the author in any work or product based on this material.
24  *
25  * ===========================================================================
26  *
27  * Authors: Mike DiCuccio, Yuri Voronov
28  *
29  * File Description:
30  *
31  */
32 
33 #include <ncbi_pch.hpp>
34 
36 
37 
39 
42 
44 
49 
50 #include <gui/objutils/utils.hpp>
51 #include <gui/objutils/label.hpp>
53 
55 #include <objmgr/util/sequence.hpp>
56 #include <objmgr/bioseq_handle.hpp>
61 
62 #include <serial/iterator.hpp>
63 
64 #include <wx/menu.h>
65 #include <wx/sizer.h>
66 
67 
70 
72  "Alignment Span View", // type name
73  "align_span_view", // icon alias TODO
74  "Show tabular information about matches and mismatches",
75  "The Alignment Span View provides a tabular break-down of matches, "
76  "mismatches and gaps in bounded regions within an alignment",
77  "ALIGN_SPAN_VIEW", // help ID
78  "Alignment", // category
79  false, // not a singleton
80  "Seq-align",
82 );
83 
84 /*
85 BEGIN_EVENT_MAP(CAlignSpanView, CProjectView)
86  //ON_COMMAND(eCmdFilter, &CViewAlnSpanTable::OnFilter)
87 END_EVENT_MAP()
88 */
89 
90 
92  : m_Panel()
93  , m_StatusBar()
94  , m_AlnWidget()
95 {
96 }
97 
99 {
100  _ASSERT(m_Panel);
101  return m_Panel;
102 }
103 
105 {
106  static bool initialized = false;
107 
108  // this code should execute only once
109  if( ! initialized ){
110  // register commands
111  /*
112  CUICommandRegistry& cmd_reg = m_Workbench->GetUICommandRegistry();
113  cmd_reg->RegisterCommand(
114  eCmdExportToCSV,
115  "Export to CSV...", "Export to CSV", "", "Exports data to file in CSV format"
116  );
117  */
118 
119  // register icons
120  //wxFileArtProvider& provider = m_Workbench->GetFileArtProvider();
121  //provider.RegisterFileAlias( ... );
122 
123  initialized = true;
124  }
125 }
126 
128 {
130 
131  wxMenu* view_menu = new wxMenu();
132 
133  //m_AlnWidget->AppendMenuItems( *view_menu );
134  view_menu->Append( wxID_SEPARATOR, wxT("Actions") );
135  view_menu->Append( CwxTableListCtrl::eCmdExportToCSV, wxT("Export to CSV...") );
136 
137  wxMenu* bar_menu = new wxMenu();
138  bar_menu->Append( wxID_ANY, wxT("&View"), view_menu );
139 
140  m_MenuBarMenu.reset( bar_menu );
141 }
142 
143 void CAlignSpanView::CreateViewWindow( wxWindow* parent )
144 {
145  _ASSERT( !m_AlnWidget );
146 
147  m_Panel = new wxPanel( parent );
148 
149  // main sizer
150  wxBoxSizer* main_sizer = new wxBoxSizer( wxVERTICAL );
151  m_Panel->SetSizer( main_sizer );
152 
154  m_Model.reset( new CAlnSpanVertModel() );
156 
159 
160  main_sizer->Add( m_AlnWidget, 1, wxEXPAND );
161 
162  // wxStatusBar
163  m_StatusBar = new wxStatusBar( m_Panel );
164  main_sizer->Add( m_StatusBar, 0, wxEXPAND );
165 
166  //m_Panel->PushEventHandler( new CCommandTransferHandler( m_AlnWidget ) );
167  m_Panel->PushEventHandler( new CCommandToFocusHandler( m_Panel ) );
168 }
169 
170 
172 {
173  if( GetWindow() ){
174  m_Panel->PopEventHandler( true );
175 
176  GetWindow()->Destroy();
177  m_Panel = NULL;
178  m_AlnWidget = NULL;
179  m_StatusBar = NULL;
180  }
181 }
182 
183 
184 void CAlignSpanView::SetRegistryPath(const string& reg_path)
185 {
186  m_RegPath = reg_path;
187 }
188 
189 
191 {
192  if( m_AlnWidget->GetModel() == NULL ){
193  return;
194  }
195 
196  /// restore our table's settings
198  CRegistryReadView reg_view = reg.GetReadView(m_RegPath);
199 
200  m_AlnWidget->LoadTableSettings(reg_view, true);
201 }
202 
204 {
205  if( m_AlnWidget->GetModel() == NULL ){
206  return;
207  }
208 
209  /// save our table's settings
211  CRegistryWriteView reg_view = reg.GetWriteView(m_RegPath);
212 
213  m_AlnWidget->SaveTableSettings(reg_view);
214 }
215 
216 
218 {
219  return m_TypeDescr;
220 }
221 
223 {
224  CRef<CScope> scope = GetScope();
225  _ASSERT(scope.NotNull());
226 
228 
229  if( true ){
230  /*
231  bool spliced = false;
232 
233  ITERATE( vector< CConstRef<CSeq_align> >, ait, m_InputAligns ){
234  if( (*ait)->GetSegs().Which() == CSeq_align::C_Segs::e_Spliced ){
235 
236  m_Model.reset(
237  new CAlnSpanVertModel( (*ait)->GetSegs().GetSpliced(), *GetScope() )
238  );
239  spliced = true;
240  break;
241  }
242  }
243 
244  if( !spliced ){
245  CAlnContainer container;
246 
247  if( m_OrigAlign ){
248  container.insert( *m_OrigAlign );
249 
250  } else if( m_OrigAnnot ){
251  CTypeConstIterator<CSeq_align> it( *m_OrigAnnot );
252  while( it ){
253  container.insert( *it );
254  ++it;
255  }
256 
257  } else if( m_OrigBioseq ){
258  CTypeConstIterator<CSeq_align> it( *m_OrigAnnot );
259  while( it ){
260  container.insert( *it );
261  ++it;
262  }
263 
264  if( m_InputAligns.size() > 0 ){
265  ITERATE( vector< CConstRef<CSeq_align> >, ait, m_InputAligns ){
266  container.insert( **ait );
267  }
268 
269  } else {
270  _ASSERT(false);
271  }
272 
273  /// Create a vector of seq-ids per seq-align
274  TIdExtract id_extract;
275  TAlnIdMap aln_id_map( id_extract, container.size() );
276  ITERATE( CAlnContainer, aln_it, container ){
277  try {
278  aln_id_map.push_back( **aln_it );
279 
280  } catch( CAlnException e ){
281  LOG_POST( Error << "Skipping this alignment: " << e.what() );
282  }
283  }
284 
285  /// Create align statistics object
286  TAlnStats aln_stats( aln_id_map );
287 
288  /// Can the alignments be anchored?
289  if ( !aln_stats.CanBeAnchored() ) {
290  LOG_POST( Error << "Input alignments cannot be anchored because they don't share at least one common sequence." );
291  //! THROW
292  return;
293  }
294 
295  /// Create user options
296  CAlnUserOptions aln_user_options;
297 
298  /// Construct a vector of anchored alignments
299  TAnchoredAlnVec anchored_aln_vec;
300  CreateAnchoredAlnVec( aln_stats, anchored_aln_vec, aln_user_options );
301 
302  BuildAln( anchored_aln_vec, m_AnchoredAln, aln_user_options );
303 
304  if( m_AnchoredAln.GetDim() == 1 ){
305  m_AnchoredAln = CAnchoredAln();
306 
307  aln_user_options.m_MergeAlgo = CAlnUserOptions::ePreserveRows;
308 
309  BuildAln( anchored_aln_vec, m_AnchoredAln, aln_user_options );
310  }
311 
312  /// Get sequence:
313  CRef<CSparseAln> sparse_aln;
314  sparse_aln.Reset( new CSparseAln( m_AnchoredAln, *GetScope() ) );
315 
316  m_Model.reset( new CAlnSpanVertModel( *sparse_aln ) );
317  }
318  */
319  m_Model.reset( new CAlnSpanVertModel( m_InputAligns, *GetScope() ) );
320 
321  int aln_type = CAlnSpanVertModel::fGap;
322  ITERATE( vector< CConstRef<CSeq_align> >, ait, m_InputAligns ){
323  if( (*ait)->GetSegs().Which() == CSeq_align::C_Segs::e_Spliced ){
324  aln_type = CAlnSpanVertModel::fIntron;
325 
326  } else if(
327  (*ait)->GetSegs().Which() == CSeq_align::C_Segs::e_Denseg
328  || (*ait)->GetSegs().Which() == CSeq_align::C_Segs::e_Disc
329  ){
331 
332  } else {
333  continue;
334  }
335 
336  break;
337  }
338  m_Model->SetMarkIndels( aln_type );
339  m_Model->SetThreshold( 1000000 );
340  m_Model->UpdateRows();
341 
342  } else {
343  CAlnMultiDSBuilder builder;
344  if( m_OrigAnnot ){
345  builder.Init( *scope, *m_OrigAnnot );
346  } else if( m_OrigAlign ){
347  builder.Init( *scope, *m_OrigAlign );
348  } else if( m_OrigBioseq ){
349  builder.Init( *scope, *m_OrigBioseq );
350  } else {
351  _ASSERT(false);
352  }
353 
354  builder.SetSyncCreate( true );
355  builder.PreCreateDataSource( false );
356  m_DataSource = builder.CreateDataSource();
357 
358  /* TODO clarification
359  if(m_DataSource->SelectDefaultIds()) {
360  m_AlnWidget->SetDataSource(m_DataSource.GetPointer());
361  }
362  */
363  m_Model.reset( new CAlnSpanVertModel( *m_DataSource ) );
364  }
366 }
367 
369 {
370  if( objects.size() == 0 ){
371  return NULL;
372  }
373 
374  const CObject* object = objects[0].object.GetPointer();
375  CScope* scope = objects[0].scope.GetPointer();
376 
377  for(;;){
378  const CSeq_annot* annot = dynamic_cast<const CSeq_annot*>(object);
379  if( annot ){
380  m_OrigAnnot.Reset( annot );
381  break;
382  }
383 
384  const CSeq_align* align = dynamic_cast<const CSeq_align*>(object);
385  if( align ){
386  m_OrigAlign.Reset( align );
387  break;
388  }
389 
390  const CBioseq* bioseq = dynamic_cast<const CBioseq*>(object);
391  if( bioseq ){
392  m_OrigBioseq.Reset( bioseq );
393  break;
394  }
395 
396  break;
397  }
398 
399  ITERATE( TConstScopedObjects, cso_it, objects ){
400  const CObject* object = cso_it->object.GetPointer();
402 
403  const CSeq_annot* annot = dynamic_cast<const CSeq_annot*>(object);
404  if( annot ){
405  CTypeConstIterator<CSeq_align> it( *annot );
406  while( it ){
407  ref.Reset( &*it );
408  m_InputAligns.push_back( ref );
409  ++it;
410  }
411  }
412 
413  const CSeq_align* align = dynamic_cast<const CSeq_align*>(object);
414  if( align ){
415  ref.Reset( align );
416  m_InputAligns.push_back( ref );
417  }
418 
419  const CBioseq* bioseq = dynamic_cast<const CBioseq*>(object);
420  if( bioseq ){
421  CTypeConstIterator<CSeq_align> it( *bioseq );
422  while( it ){
423  ref.Reset( &*it );
424  m_InputAligns.push_back( ref );
425  ++it;
426  }
427  }
428  }
429 
431  if( m_InputAligns.size() > 0 ){
432  return scope;
433  }
434  }
435 
436  return NULL;
437 }
438 
440 {
441  if( x_HasProject() ){
442 
443  x_InitWidget();
444 
445  LoadSettings();
446  }
447 
449 
451 }
452 
454 {
455  if(
458  ){
460 
462  }
463 }
464 
466 {
467  const CObject* obj = NULL;
468 
469  if( m_OrigAnnot ){
470  obj = (const CObject*) m_OrigAnnot.GetPointer();
471  } else if( m_OrigAlign ){
472  obj = (const CObject*) m_OrigAlign.GetPointer();
473  } else if( m_OrigBioseq ){
474  obj = (const CObject*) m_OrigBioseq.GetPointer();
475  }
476  return obj;
477 }
478 
480 {
481  if(m_AlnWidget && x_HasProject()) {
482  CRef<CScope> scope = GetScope();
483 
484  _ASSERT(!scope.IsNull());
485 
487  m_AlnWidget->GetSelection(locs);
488 
489  /// we pass everything back as range selections
491  TRangeMap ranges;
492  ITERATE (CAlnSpanWidget::TLocations, iter, locs) {
494  if ((*iter)->IsEmpty()) {
495  if (ranges.find(idh) == ranges.end()) {
496  ranges.emplace(idh, CSelectionEvent::TRangeColl());
497  }
498  } else {
499  TSeqRange range = (*iter)->GetTotalRange();
500  ranges[idh] += range;
501  }
502  }
503 
504  ITERATE (TRangeMap, iter, ranges) {
505  CRef<CSeq_loc> loc(new CSeq_loc);
506  loc->SetInt().SetFrom(iter->second.GetFrom());
507  loc->SetInt().SetTo(iter->second.GetTo());
508  loc->SetId(*iter->first.GetSeqId());
509  objs.push_back(SConstScopedObject(loc, scope));
510  }
511  }
512 }
513 
515 {
516  if( x_HasProject() ){
518  m_AlnWidget->GetSelection(locs);
519 
520  /// we pass everything back as range selections
522  TRangeMap ranges;
523  ITERATE (CAlnSpanWidget::TLocations, iter, locs) {
525  TSeqRange range = (*iter)->GetTotalRange();
526 
527  ranges[idh] += range;
528  }
529 
530  ITERATE (TRangeMap, iter, ranges) {
531  evt.AddRangeSelection(*iter->first.GetSeqId(), iter->second);
532  }
533  }
534 }
535 
536 
537 // handles incoming selection broadcast (overriding CView virtual function)
539 {
540  // TODO It is not clear what to select here
541 
542  if( evt.HasObjectSelection() ){
543 
545  }
546 }
547 
549 {
552 }
553 
555 {
556  if( x_HasProject() ){
558  m_AlnWidget->GetSelection( locs );
559 
560  ITERATE ( CAlnSpanWidget::TLocations, iter, locs ){
561  vrange.AddLocation( **iter );
562  }
563  }
564 }
565 
567 {
568  //CProjectView::OnWidgetRangeChanged();
570 }
571 
572 /*
573 void CAlignSpanView::OnFilter()
574 {
575  //m_AlnWidget->OnFilter();
576 }
577 
578 */
579 
581 
582  if( m_AlnWidget && x_HasProject() ){
583  m_AlnWidget->Update();
584 
586  }
587 }
588 
590 {
591  // prepare our status bar message
592  string status_msg;
593 
594  int total_rows = m_Model->GetNumRows();
595  status_msg = NStr::IntToString( total_rows ) + " span";
596  if( total_rows != 1 ){
597  status_msg += "s";
598  }
599 
600  int rows_shown = m_AlnWidget->GetNumRowsVisible();
601  if( rows_shown != total_rows ){
602  status_msg += " total, " + NStr::IntToString( rows_shown );
603  status_msg += " shown";
604  }
605 
606  int rows_selected = m_AlnWidget->GetNumRowsSelected();
607  if( rows_selected > 0 ){
608  status_msg += ", " + NStr::IntToString( rows_selected );
609  status_msg += " selected";
610  }
611 
612  // TODO describe the Filter - ideally the filter itself
613  // shall provide its description (better encapsulation)
614 
615  m_StatusBar->SetStatusText( ToWxString( status_msg ) );
616 
617  // TODO - get StatusBar service for update
618 }
619 
620 
621 ///////////////////////////////////////////////////////////////////////////////
622 // CAlignSpanViewFactory
623 //
625 {
626  static string sid("align_span_view_factory");
627  return sid;
628 }
629 
630 
632 {
633  static string slabel("Align Span View Factory");
634  return slabel;
635 }
636 
637 
639 {
640  string alias = GetViewTypeDescriptor().GetIconAlias();
641  provider.RegisterFileAlias(ToWxString(alias), wxT("alignment_span_view.png"));
642 }
643 
644 
646 {
648 }
649 
651 {
652  return new CAlignSpanView();
653 }
654 
655 
657 {
658  /*
659  TFingerprint print(CAlignSpanView::m_TypeDescr.GetLabel(), false);
660  if(print == fingerprint) {
661  return new CAlignSpanView();
662  }
663  */
664  return NULL;
665 }
666 
667 
669 {
670  bool found_good = false;
671  bool found_bad = false;
672  for( size_t i = 0; i < objects.size(); i++ ){
673  const CObject* obj = objects[i].object;
674  const type_info& type = typeid(*obj);
675 
676  found_good = false
677  //|| typeid(CSeq_annot) == type
678  || typeid(CSeq_align) == type
679  || typeid(CBioseq) == type
680  ;
681  }
682 
683  if( found_good ){
684  return fCanShowSeparated | (found_bad ? fCanShowSome : fCanShowAll);
685  }
686  return 0; // can show nothing
687 }
688 
689 
691 
USING_SCOPE(objects)
CAlignSpanView.
void Init(objects::CScope &scope, const objects::CSeq_align &align)
initial data set from which an alignment will be build
void SetSyncCreate(bool sync)
CRef< IAlnMultiDataSource > CreateDataSource()
void PreCreateDataSource(bool sparse)
void GetSelection(TLocations &locs) const
list< CConstRef< objects::CSeq_loc > > TLocations
int GetNumRowsSelected() const
void SetAlnModel(CAlnSpanVertModel &model)
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
CObject –.
Definition: ncbiobj.hpp:180
virtual void OnProjectChanged()
virtual void x_UpdateContentLabel()
virtual CRef< objects::CScope > GetScope() const
unique_ptr< const wxMenu > m_MenuBarMenu
virtual bool x_HasProject() const
CProjectViewEvent.
Definition: document.hpp:62
EEventSubtype GetSubtype() const
Definition: document.hpp:96
CProjectViewTypeDescriptor - holds description of a project view type.
virtual void OnWidgetSelChanged()
class CRegistryReadView provides a nested hierarchical view at a particular key.
Definition: reg_view.hpp:58
CScope –.
Definition: scope.hpp:92
CSelectionEvent CSelectionEvent is used for broadcasting selection between views.
Definition: obj_event.hpp:68
void AddRangeSelection(const objects::CSeq_id &id, const TRangeColl &segs)
bool HasObjectSelection()
Object Selection - represents select Objects (such as features, alignments, etc)
Definition: obj_event.cpp:171
Template class for iteration on objects of class C (non-medifiable version)
Definition: iterator.hpp:767
EEventType GetType() const
Definition: view_event.hpp:87
CViewTypeDescriptor - holds description of a view type.
Definition: view.hpp:98
void AddLocation(const objects::CSeq_loc &loc)
IwxTableModel * GetModel() const
void LoadTableSettings(const CRegistryReadView &view, bool byName=false)
void SaveTableSettings(CRegistryWriteView &view, bool saveSorting=true) const
int GetNumRowsVisible() const
virtual const CViewTypeDescriptor & GetViewTypeDescriptor() const
returns a Descriptor for the View Type supported by the Factory
IView - represents a standard visual part of Workbench UI.
Definition: view.hpp:73
CFingerprint identifies an instance of IWMClient and is used for labeling layout positions.
Definition: wm_client.hpp:58
Definition: map.hpp:338
virtual void RegisterFileAlias(const wxArtID &anId, const wxArtClient &aClient, const wxSize &aSize, const wxString &aName, long aType=wxBITMAP_TYPE_ANY, int anIndex=-1)
static int type
Definition: getdata.c:31
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
Definition: ncbimisc.hpp:815
#define NULL
Definition: ncbistd.hpp:225
CAlnSpanWidget * m_AlnWidget
virtual int TestInputObjects(TConstScopedObjects &objects)
tests input objects (probably using object conversion, or not) and returns a combination of ETestResu...
CRef< IAlnMultiDataSource > m_DataSource
virtual wxWindow * GetWindow()
returns a pointer to the wxWindow representing the client
virtual void x_Update()
virtual void RegisterIconAliases(wxFileArtProvider &provider)
called by the framework to give Factory a chance to register images used by view
virtual objects::CScope * x_PreAttachToProject(TConstScopedObjects &objects)
virtual string GetExtensionIdentifier() const
returns the unique human-readable identifier for the extension the id should use lowercase letters se...
vector< CConstRef< CSeq_align > > m_InputAligns
virtual void SetRegistryPath(const string &reg_path)
virtual void GetSelection(CSelectionEvent &evt) const
get selection for broadcasting
virtual IView * CreateInstanceByFingerprint(const TFingerprint &fingerprint) const
if fingerprint is recognized - creates and returns a new instance
virtual IView * CreateInstance() const
creates a view instance
virtual void x_OnSetSelection(CSelectionEvent &evt)
override in derived classes in order to handle selection broadcast
virtual void DestroyViewWindow()
destroy Window corresponding to the view
virtual void LoadSettings()
virtual const CObject * x_GetOrigObject() const
CConstRef< CSeq_annot > m_OrigAnnot
original data object passed to the view
virtual void OnWidgetSelChanged()
virtual void x_CreateMenuBarMenu()
initializes m_MenuBarMenu; override in derived classes
virtual void CreateViewWindow(wxWindow *parent)
create Window corresponding to the view
CConstRef< CBioseq > m_OrigBioseq
virtual const CProjectViewTypeDescriptor & GetProjectViewTypeDescriptor() const
returns a Descriptor for the View Type supported by the Factory
virtual void SaveSettings() const
virtual void x_UpdateStatusMessage()
CConstRef< CSeq_align > m_OrigAlign
virtual const CViewTypeDescriptor & GetTypeDescriptor() const
return an object providing meta information about thei view type
virtual void OnWidgetRangeChanged()
virtual string GetExtensionLabel() const
returns a displayable label for this extension ( please capitalize the key words - "My Extension" )
static CProjectViewTypeDescriptor m_TypeDescr
wxStatusBar * m_StatusBar
unique_ptr< CAlnSpanVertModel > m_Model
virtual void x_PostAttachToProject()
virtual void GetVisibleRanges(CVisibleRange &vrange) const
populate a visible range event for broadcasting
virtual const string & GetIconAlias() const
Definition: ui_object.cpp:130
virtual void AddListener(CEventHandler *listener, int pool_name=ePool_Default)
Add a listener.
vector< SConstScopedObject > TConstScopedObjects
Definition: objects.hpp:65
void SetId(CSeq_id &id)
set the 'id' field in all parts of this location
Definition: Seq_loc.cpp:3474
void SetInt(TInt &v)
Definition: Seq_loc.hpp:983
CSeq_id_Handle GetIdHandle(const CSeq_loc &loc, CScope *scope)
TObjectType * GetPointer(void) const THROWS_NONE
Get pointer,.
Definition: ncbiobj.hpp:1684
bool NotNull(void) const THROWS_NONE
Check if pointer is not null – same effect as NotEmpty().
Definition: ncbiobj.hpp:744
void Reset(void)
Reset reference object.
Definition: ncbiobj.hpp:1439
bool IsNull(void) const THROWS_NONE
Check if pointer is null – same effect as Empty().
Definition: ncbiobj.hpp:735
#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 string IntToString(int value, TNumToStringFlags flags=0, int base=10)
Convert int to string.
Definition: ncbistr.hpp:5083
int i
#define wxT(x)
Definition: muParser.cpp:41
range(_Ty, _Ty) -> range< _Ty >
@ eSimilarObjectsAccepted
static static static wxID_ANY
Definition: type.c:6
#define _ASSERT
wxString ToWxString(const string &s)
Definition: wx_utils.hpp:173
Modified on Sat Dec 09 04:49:58 2023 by modify_doxy.py rev. 669887