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

Go to the SVN repository for this file.

1 /* $Id: align_tab_export_page2.cpp 47479 2023-05-02 13:24:02Z ucko $
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: Roman Katargin
27  *
28  * File Description:
29  *
30  */
31 
32 #include <ncbi_pch.hpp>
33 
34 #include <wx/sizer.h>
35 #include <wx/checkbox.h>
36 #include <wx/choice.h>
37 #include <wx/button.h>
38 #include <wx/textctrl.h>
39 #include <wx/stattext.h>
40 #include <wx/listbox.h>
41 #include <wx/checklst.h>
42 #include <wx/valgen.h>
43 #include <wx/valtext.h>
44 #include <wx/msgdlg.h>
45 #include <wx/filedlg.h>
46 #include <wx/bitmap.h>
47 #include <wx/icon.h>
48 #include <wx/settings.h>
49 
51 
52 #include <objmgr/align_ci.hpp>
53 #include <gui/objutils/utils.hpp>
55 
58 
59 
62 
63 IMPLEMENT_DYNAMIC_CLASS( CAlignTabExportPage2, wxPanel )
64 
65 BEGIN_EVENT_TABLE( CAlignTabExportPage2, wxPanel )
66 
67 ////@begin CAlignTabExportPage2 event table entries
68 ////@end CAlignTabExportPage2 event table entries
69 
72 
74 {
75  Init();
76 }
77 
78 CAlignTabExportPage2::CAlignTabExportPage2( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style )
79 {
80  Init();
81  Create(parent, id, pos, size, style);
82 }
83 
84 bool CAlignTabExportPage2::Create( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style )
85 {
86 ////@begin CAlignTabExportPage2 creation
87  wxPanel::Create( parent, id, pos, size, style );
88 
90  if (GetSizer())
91  {
92  GetSizer()->SetSizeHints(this);
93  }
94  Centre();
95 ////@end CAlignTabExportPage2 creation
96  return true;
97 }
98 
100 {
101 ////@begin CAlignTabExportPage2 destruction
102 ////@end CAlignTabExportPage2 destruction
103 }
104 
106 {
107 ////@begin CAlignTabExportPage2 member initialisation
108  m_NoAlignments = true;
109  m_Sizer = NULL;
110  m_AlignList = NULL;
111  m_FieldList = NULL;
113 ////@end CAlignTabExportPage2 member initialisation
114 }
115 
116 static const wxString sFields[] =
117 {
118  wxT("Alignment"),
119  wxT("Anchor"),
120  wxT("Query"),
121  wxT("Strand"),
122  wxT("Aligned bases"),
123  wxT("Segments"),
124  wxT("Coverage"),
125  wxT("Identity"),
126  wxT("Mismatches"),
127  wxT("Gaps")
128 };
129 
131 {
132 ////@begin CAlignTabExportPage2 content construction
133  CAlignTabExportPage2* itemPanel1 = this;
134 
135  m_Sizer = new wxBoxSizer(wxVERTICAL);
136  itemPanel1->SetSizer(m_Sizer);
137 
138  wxFlexGridSizer* itemFlexGridSizer3 = new wxFlexGridSizer(0, 2, 0, 0);
139  m_Sizer->Add(itemFlexGridSizer3, 1, wxGROW|wxALL, 0);
140 
141  wxStaticText* itemStaticText4 = new wxStaticText( itemPanel1, wxID_STATIC, _("Select alignment:"), wxDefaultPosition, wxDefaultSize, 0 );
142  itemFlexGridSizer3->Add(itemStaticText4, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP, 5);
143 
144  wxStaticText* itemStaticText5 = new wxStaticText( itemPanel1, wxID_STATIC, _("Select fields:"), wxDefaultPosition, wxDefaultSize, 0 );
145  itemFlexGridSizer3->Add(itemStaticText5, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP, 5);
146 
147  wxArrayString m_AlignListStrings;
148  m_AlignList = new wxListBox( itemPanel1, ID_LISTBOX, wxDefaultPosition, wxDefaultSize, m_AlignListStrings, wxLB_SINGLE );
149  itemFlexGridSizer3->Add(m_AlignList, 0, wxGROW|wxGROW|wxALL, 5);
150 
151  wxArrayString m_FieldListStrings;
152  m_FieldList = new wxCheckListBox( itemPanel1, ID_CHECKLISTBOX, wxDefaultPosition, wxDefaultSize, m_FieldListStrings, wxLB_SINGLE );
153  itemFlexGridSizer3->Add(m_FieldList, 0, wxGROW|wxGROW|wxALL, 5);
154 
155  itemFlexGridSizer3->AddGrowableRow(1);
156  itemFlexGridSizer3->AddGrowableCol(0);
157  itemFlexGridSizer3->AddGrowableCol(1);
158 
159  m_LoadingSizer = new wxBoxSizer(wxHORIZONTAL);
160  m_Sizer->Add(m_LoadingSizer, 0, wxGROW|wxALL, 0);
161 
162 ////@end CAlignTabExportPage2 content construction
163 
164  wxStaticText* loadingText = new wxStaticText(this, ID_LOADING_TEXT, wxT("Loading alignments from Named Annotations ..."), wxDefaultPosition, wxDefaultSize, 0);
165  wxFont bold(wxNORMAL_FONT->GetPointSize(), wxNORMAL_FONT->GetFamily(), wxNORMAL_FONT->GetStyle(), wxFONTWEIGHT_BOLD, wxNORMAL_FONT->GetUnderlined(), wxNORMAL_FONT->GetFaceName());
166  loadingText->SetFont(bold);
167  loadingText->SetForegroundColour(*wxBLACK);
168  m_LoadingSizer->Add(loadingText, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
169 
170  CIndProgressBar* progress = new CIndProgressBar(this, ID_LOADING_PROGRESS, wxDefaultPosition, 100);
171  m_LoadingSizer->Add(progress, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5);
172 
173  wxStaticText* errorText = new wxStaticText(this, ID_LOADING_ERROR, "NA DB error", wxDefaultPosition, wxDefaultSize, 0);
174  errorText->SetForegroundColour(*wxRED);
175  errorText->SetFont(bold);
176  m_LoadingSizer->Add(errorText, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
177  m_LoadingSizer->Hide(errorText);
178 
179  m_SaveTextClr = m_AlignList->GetForegroundColour();
180  m_FieldList->Append(sizeof(sFields)/sizeof(sFields[0]), &sFields[0]);
181 }
182 
184 {
185  return true;
186 }
187 wxBitmap CAlignTabExportPage2::GetBitmapResource( const wxString& name )
188 {
189  // Bitmap retrieval
190 ////@begin CAlignTabExportPage2 bitmap retrieval
191  wxUnusedVar(name);
192  return wxNullBitmap;
193 ////@end CAlignTabExportPage2 bitmap retrieval
194 }
195 wxIcon CAlignTabExportPage2::GetIconResource( const wxString& name )
196 {
197  // Icon retrieval
198 ////@begin CAlignTabExportPage2 icon retrieval
199  wxUnusedVar(name);
200  return wxNullIcon;
201 ////@end CAlignTabExportPage2 icon retrieval
202 }
203 
205 {
206  vector<string> fields = GetData().GetFields();
207  if (fields.empty()) {
208  for (int i = 0; i < m_FieldList->GetCount(); ++ i) {
209  m_FieldList->Check(i, true);
210  }
211  } else {
212  set<string> checked(fields.begin(), fields.end());
213  for (int i = 0; i < m_FieldList->GetCount(); ++ i) {
214  string str = ToStdString(m_FieldList->GetString(i));
215  m_FieldList->Check(i, checked.find(str) != checked.end());
216  }
217  }
218 
219  m_NoAlignments = true;
220  m_AlignList->Clear();
221  m_AlignList->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
223 
224  return wxPanel::TransferDataToWindow();
225 }
226 
228 {
230 
231  wxStaticText* loadingText = dynamic_cast<wxStaticText*>(FindWindow(ID_LOADING_TEXT));
232  loadingText->SetLabelText("Loading alignment names ...");
233 
234  m_LoadingSizer->Show(FindWindow(ID_LOADING_TEXT));
235  m_LoadingSizer->Show(FindWindow(ID_LOADING_PROGRESS));
236  m_LoadingSizer->Hide(FindWindow(ID_LOADING_ERROR));
237 
238  m_Sizer->Layout();
239 
240  m_FutureNames = job_async([obj = GetData().GetObject()](ICanceled& canceled) mutable
241  {
242  static const string errTitle("Failed to get alignement names for ");
243  string seqIdLabel;
244 
245  try {
246  const CSeq_loc* seqLoc = dynamic_cast<const CSeq_loc*>(obj.object.GetPointerOrNull());
247  if (!seqLoc)
248  NCBI_THROW(CException, eUnknown, "Invalid input object (Seq-loc expected)");
249 
250  CScope* scope = obj.scope;
251  if (!scope)
252  NCBI_THROW(CException, eUnknown, "Scope is NULL");
253 
254  CConstRef<CSeq_id> seqId(seqLoc->GetId());
255  seqIdLabel = seqId->GetSeqIdString(true);
256 
257  SAnnotSelector sel(CSeqUtils::GetAnnotSelector(vector<string>()));
258  CSeqUtils::SetResolveDepth(sel, true, -1);
259  sel.SetCollectNames();
260 
261  vector<string> names;
262 
263  CAlign_CI aln_iter(*scope, *seqLoc, sel);
264 
265  if (canceled.IsCanceled())
266  return names;
267 
268  ITERATE(CAlign_CI::TAnnotNames, iter, aln_iter.GetAnnotNames()) {
269  if (iter->IsNamed()) {
270  if (iter->GetName().find("@@") == string::npos) {
271  names.emplace_back(iter->GetName());
272  }
273  }
274  else {
275  names.emplace_back(CSeqUtils::GetUnnamedAnnot());
276  }
277  }
278 
279  return names;
280  }
281  catch (const CException& e) {
282  NCBI_REPORT_EXCEPTION(errTitle + seqIdLabel, e);
283  throw;
284  }
285  catch (const exception& e) {
286  CNcbiDiag() << Error << "[" << errTitle + seqIdLabel << "] Exception: " << e.what();
287  throw;
288  }
289  }, "Get alignment names");
290 }
291 
293 {
294  wxStaticText* loadingText = dynamic_cast<wxStaticText*>(FindWindow(ID_LOADING_TEXT));
295  loadingText->SetLabelText("Loading Named Annotations alignments...");
296  m_Sizer->Layout();
297 
298  m_FutureNANames = job_async([obj = GetData().GetObject()](ICanceled& canceled) mutable
299  {
300  typedef map<string, CRef<CAnnotMetaData> > TAnnotMap;
301 
302  static const string errTitle("Failed to NA meta-data for ");
303  string seqIdLabel;
304 
305  try {
306  const CSeq_loc* seqLoc = dynamic_cast<const CSeq_loc*>(obj.object.GetPointerOrNull());
307  if (!seqLoc)
308  NCBI_THROW(CException, eUnknown, "Invalid input object (Seq-loc expected)");
309 
310  CScope* scope = obj.scope;
311  if (!scope)
312  NCBI_THROW(CException, eUnknown, "Scope is NULL");
313 
314  static CFastMutex mutex;
315  CFastMutexGuard lock(mutex);
316 
317  CConstRef<CSeq_id> seqId(seqLoc->GetId());
318  seqIdLabel = seqId->GetSeqIdString(true);
319 
320  static TAnnotMap cachedAnnots;
321  static CConstRef<CSeq_id> cachedSeqId;
322 
323  if (!cachedSeqId || CSeq_id_Handle::GetHandle(*cachedSeqId) != CSeq_id_Handle::GetHandle(*seqId)) {
324  cachedSeqId.Reset();
325  cachedAnnots.clear();
326 
327  LOG_POST(Info << "Retrieve NA meta-data for " << seqIdLabel);
328  CStopWatch sw;
329  sw.Start();
331  CNAUtils na_util(*seqId, *scope);
332  na_util.GetAllNAMetaData(annots);
333  LOG_POST(Info << "Time for retrieving NA meta-data: " << sw.Elapsed() << " seconds");
334 
335  TAnnotMap& cacheRef = cachedAnnots;
336 
337  for_each(annots.begin(), annots.end(), [&cacheRef](CNAUtils::TNAMetaDataSet::value_type& v) {
338  if (v.second->m_AnnotType == "align") cacheRef[v.second->m_Name] = v.second;
339  });
340 
341  cachedSeqId = seqId;
342  }
343 
344  vector<tuple<string, string> > names;
345 
346  if (canceled.IsCanceled())
347  return names;
348 
349  vector<string> alignNames;
350  SAnnotSelector sel(CSeqUtils::GetAnnotSelector(vector<string>({ "NA*" }), true, -1));
351  sel.SetCollectNames();
352  CAlign_CI aln_iter(*scope, *seqLoc, sel);
353 
354  if (canceled.IsCanceled())
355  return names;
356 
357  ITERATE(CAlign_CI::TAnnotNames, iter, aln_iter.GetAnnotNames()) {
358  if (iter->IsNamed() && iter->GetName().find("@@") == string::npos) {
359  string name = iter->GetName();
360  TAnnotMap::const_iterator it = cachedAnnots.find(name);
361  if (it != cachedAnnots.end())
362  names.emplace_back(name, it->second->m_Title);
363  else
364  names.emplace_back(name, name);
365  }
366  }
367 
368  return names;
369  }
370  catch (const CException& e) {
371  NCBI_REPORT_EXCEPTION(errTitle + seqIdLabel, e);
372  throw;
373  }
374  catch (const exception& e) {
375  CNcbiDiag() << Error << "[" << errTitle + seqIdLabel << "] Exception: " << e.what();
376  throw;
377  }
378  }, "Get NA DB alignment names");
379 }
380 
382 {
383  m_LoadingSizer->Hide(FindWindow(ID_LOADING_TEXT));
384  m_LoadingSizer->Hide(FindWindow(ID_LOADING_PROGRESS));
385  m_Sizer->Layout();
386 }
387 
388 void CAlignTabExportPage2::OnIdle(wxIdleEvent& event)
389 {
390  if (m_FutureNames.IsComplete()) {
391  string errMsg;
392 
393  try {
394  wxArrayString annotNames;
395  string selAlignment, selAcc = GetData().GetAlignmentName();
396  for (const string& i : m_FutureNames()) {
397  annotNames.push_back(i);
399  if (selAcc == i)
400  selAlignment = i;
401  }
402 
403  if (!annotNames.empty()) {
404  m_AlignList->Append(annotNames);
405  if (!selAlignment.empty())
406  m_AlignList->SetStringSelection(selAlignment);
407  m_NoAlignments = false;
408  }
409 
411  }
412  catch (const CException& e) {
413  errMsg = e.GetMsg();
414  }
415  catch (const exception& e) {
416  errMsg = e.what();
417  }
418 
420 
421  if (!errMsg.empty())
422  x_ReportError("Alignments error: " + errMsg);
423  }
424  else if (m_FutureNANames.IsComplete()) {
425  string errMsg;
426 
427  try {
428  wxArrayString annotNames;
429  string selAlignment, selAcc = GetData().GetAlignmentName();
430 
431  for (const auto& i : m_FutureNANames()) {
432  const string& accession = std::get<0>(i);
433  const string& title = std::get<1>(i);
434 
436  continue;
437  annotNames.push_back(title);
438  m_TitleToAccession[title] = accession;
439  if (selAcc == accession)
440  selAlignment = title;
441  }
442 
443  if (!annotNames.empty()) {
444  m_AlignList->Append(annotNames);
445  if (!selAlignment.empty())
446  m_AlignList->SetStringSelection(selAlignment);
447  m_NoAlignments = false;
448  }
449 
450  if (m_AlignList->GetCount() == 0) {
451  m_AlignList->SetForegroundColour(*wxRED);
452  m_AlignList->Append(wxT("No alignments available"));
453  }
454 
455  x_FinishLoading();
456  }
457  catch (const CException& e) {
458  errMsg = e.GetMsg();
459  }
460  catch (const exception& e) {
461  errMsg = e.what();
462  }
463 
465 
466  if (!errMsg.empty())
467  x_ReportError("Named Annotations error: " + errMsg);
468  }
469  else {
470  event.Skip();
471  }
472 }
473 
474 void CAlignTabExportPage2::x_ReportError(const string errMsg)
475 {
476  m_LoadingSizer->Hide(FindWindow(ID_LOADING_TEXT));
477  m_LoadingSizer->Hide(FindWindow(ID_LOADING_PROGRESS));
478 
479  wxStaticText* errorText = dynamic_cast<wxStaticText*>(FindWindow(ID_LOADING_ERROR));
480  errorText->SetLabelText(errMsg);
481  m_LoadingSizer->Show(FindWindow(ID_LOADING_ERROR));
482 
483  if (m_AlignList->GetCount() == 0) {
484  m_AlignList->SetForegroundColour(*wxRED);
485  m_AlignList->Append(wxT("No alignments available"));
486  }
487 
488  m_Sizer->Layout();
489 }
490 
492 {
493  if (m_NoAlignments) {
494  wxMessageBox(wxT("The location doesn't contain alignments.\n")
495  wxT("Please, go back and select another location."), wxT("Error"),
496  wxOK | wxICON_ERROR, this);
497  return false;
498  }
499 
500  string alignName = m_TitleToAccession[ToStdString(m_AlignList->GetStringSelection())];
501  if (alignName.empty()) {
502  wxMessageBox(wxT("Please select an alignment"), wxT("Error"),
503  wxOK | wxICON_ERROR, this);
504  m_AlignList->SetFocus();
505  return false;
506  }
507 
508  GetData().SetAlignmentName(alignName);
509 
510  vector<string> checked;
511  for (int i = 0; i < m_FieldList->GetCount(); ++ i) {
512  string str = ToStdString(m_FieldList->GetString(i));
513  if (m_FieldList->IsChecked(i))
514  checked.push_back(ToStdString(m_FieldList->GetString(i)));
515  }
516 
517  if (checked.empty()) {
518  wxMessageBox(wxT("Please, select some fields for export."), wxT("Error"),
519  wxOK | wxICON_ERROR, this);
520  m_FieldList->SetFocus();
521  return false;
522  }
523 
524  GetData().SetFields(checked);
525 
526  return wxPanel::TransferDataFromWindow();
527 }
528 
530 {
531  m_RegPath = path;
532 }
533 
535 {
536 }
537 
539 {
540 }
541 
USING_SCOPE(objects)
static const wxString sFields[]
virtual void SaveSettings() const
bool Create(wxWindow *parent, wxWindowID id=ID_CALIGNTABEXPORTPAGE2, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(400, 300), long style=wxTAB_TRAVERSAL)
virtual void SetRegistryPath(const string &path)
IRegSettings.
void x_ReportError(const string errMsg)
wxBitmap GetBitmapResource(const wxString &name)
wxIcon GetIconResource(const wxString &name)
void OnIdle(wxIdleEvent &event)
job_future< vector< tuple< string, string > > > m_FutureNANames
map< string, string > m_TitleToAccession
CAlignTabExportParams & GetData()
job_future< vector< string > > m_FutureNames
void SetFields(vector< string > value)
void SetAlignmentName(string value)
vector< string > GetFields() const
CAlign_CI –.
Definition: align_ci.hpp:63
const TAnnotNames & GetAnnotNames(void) const
CFastMutex –.
Definition: ncbimtx.hpp:667
CNcbiDiag –.
Definition: ncbidiag.hpp:924
CScope –.
Definition: scope.hpp:92
CStopWatch –.
Definition: ncbitime.hpp:1937
Interface for testing cancellation request in a long lasting operation.
Definition: icanceled.hpp:51
bool IsComplete() const
Definition: job_future.hpp:205
const_iterator begin() const
Definition: map.hpp:151
const_iterator end() const
Definition: map.hpp:152
container_type::value_type value_type
Definition: map.hpp:52
void clear()
Definition: map.hpp:169
const_iterator find(const key_type &key) const
Definition: map.hpp:153
Definition: map.hpp:338
const_iterator find(const key_type &key) const
Definition: set.hpp:137
const_iterator end() const
Definition: set.hpp:136
#define _(proto)
Definition: ct_nlmzip_i.h:78
static const struct name_t names[]
static void Init(void)
Definition: cursor6.c:76
static const char * str(char *buf, int n)
Definition: stats.c:84
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
Definition: ncbimisc.hpp:815
#define NULL
Definition: ncbistd.hpp:225
#define LOG_POST(message)
This macro is deprecated and it's strongly recomended to move in all projects (except tests) to macro...
Definition: ncbidiag.hpp:226
void Error(CExceptionArgs_Base &args)
Definition: ncbiexpt.hpp:1197
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
Definition: ncbiexpt.hpp:704
const string & GetMsg(void) const
Get message string.
Definition: ncbiexpt.cpp:461
#define NCBI_REPORT_EXCEPTION(title, ex)
Generate a report on the exception.
Definition: ncbiexpt.hpp:755
virtual const char * what(void) const noexcept
Standard report (includes full backlog).
Definition: ncbiexpt.cpp:342
void Info(CExceptionArgs_Base &args)
Definition: ncbiexpt.hpp:1185
static objects::SAnnotSelector GetAnnotSelector(TAnnotFlags flags=0)
request an annotation selector for a given type
Definition: utils.cpp:167
void GetAllNAMetaData(TNAMetaDataSet &md_set, const string &context="", ICanceled *canceledCallback=0) const
Get meta-data for a given NAA associated with seq_id.
Definition: na_utils.cpp:589
static const string & GetUnnamedAnnot()
Get the commonly used symbol representing a unnnamed annotation.
Definition: utils.hpp:531
static void SetResolveDepth(objects::SAnnotSelector &sel, bool adaptive, int depth=-1)
help function for setting selector resolve depth.
Definition: utils.cpp:405
string GetSeqIdString(bool with_version=false) const
Return seqid string with optional version for text seqid type.
Definition: Seq_id.cpp:2145
static CSeq_id_Handle GetHandle(const CSeq_id &id)
Normal way of getting a handle, works for any seq-id.
const CSeq_id * GetId(void) const
Get the id of the location return NULL if has multiple ids or no id at all.
Definition: Seq_loc.hpp:941
SAnnotSelector & SetCollectNames(bool value=true)
Collect available annot names rather than annots.
void Reset(void)
Reset reference object.
Definition: ncbiobj.hpp:1439
#define END_NCBI_SCOPE
End previously defined NCBI scope.
Definition: ncbistl.hpp:103
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
Definition: ncbistl.hpp:100
virtual bool IsCanceled(void) const =0
double Elapsed(void) const
Return time elapsed since first Start() or last Restart() call (in seconds).
Definition: ncbitime.hpp:2775
void Start(void)
Start the timer.
Definition: ncbitime.hpp:2764
static CStopWatch sw
job_function_traits< _Fty >::future job_async(const _Fty &_Fnarg, const string &descr)
Definition: job_future.hpp:428
END_EVENT_TABLE()
int i
#define wxT(x)
Definition: muParser.cpp:41
const struct ncbi::grid::netcache::search::fields::SIZE size
SAnnotSelector –.
string ToStdString(const wxString &s)
Definition: wx_utils.hpp:161
Modified on Sat Jul 13 13:37:47 2024 by modify_doxy.py rev. 669887