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

Go to the SVN repository for this file.

1 /* $Id: user_object_util.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: Colleen Bollin
27  */
28 
29 #include <ncbi_pch.hpp>
41 
42 
45 
47 {
48  wxWindow* parent = this->GetParent();
49 
50  CUserFieldListPanel * listpanel = dynamic_cast<CUserFieldListPanel *>(parent);
51 
52  while (parent && !listpanel) {
53  parent = parent->GetParent();
54  listpanel = dynamic_cast<CUserFieldListPanel*>(parent);
55  }
56 
57  if (!listpanel) {
58  return;
59  }
60  listpanel->AddLastField((wxWindow*)this);
61 }
62 
63 
64 CSingleUserFieldPanel * CRefGeneTrackFieldManager::MakeEditor(wxWindow* parent, objects::CUser_field& field)
65 {
66  return new CSingleRefGeneTrackLocPanel(parent, field);
67 }
68 
69 
71 {
72  if (NStr::EqualNocase(str, "Assembly")
73  || NStr::EqualNocase(str, "IdenticalTo")) {
74  return true;
75  } else {
76  return false;
77  }
78 }
79 
80 
81 bool CRefGeneTrackFieldManager::IsEligible(const objects::CUser_field& field)
82 {
83  if (field.IsSetLabel() && (field.GetLabel().IsStr() && x_IsTypeString(field.GetLabel().GetStr()))) {
84  return true;
85  } else {
86  return false;
87  }
88 }
89 
90 
91 bool CRefGeneTrackFieldManager::x_HasPopulatedFields(const objects::CUser_field& field)
92 {
93  if (!field.IsSetData()) {
94  return false;
95  }
96  if (field.GetData().IsFields()) {
97  for (auto& it : field.GetData().GetFields()) {
98  if (it->IsSetData() && it->GetData().IsStr() &&
99  !NStr::IsBlank(it->GetData().GetStr())) {
100  return true;
101  }
102  }
103  } else if (field.GetData().IsStr() && !NStr::IsBlank(field.GetData().GetStr())) {
104  return true;
105  }
106  return false;
107 }
108 
109 
110 bool CRefGeneTrackFieldManager::IsEmpty(const objects::CUser_field& field)
111 {
112  if (!field.IsSetData() || !field.GetData().IsFields()) {
113  return true;
114  }
115  for (auto& it : field.GetData().GetFields()) {
116  if (x_HasPopulatedFields(*it)) {
117  return false;
118  }
119  }
120  return true;
121 }
122 
123 
125 {
126  CSingleRefGeneTrackLocPanel* single_panel = dynamic_cast<CSingleRefGeneTrackLocPanel*> (ctrl);
127  if (single_panel) {
128  return single_panel->GetUser_field();
129  } else {
131  return empty;
132  }
133 }
134 
135 
136 CSingleUserFieldPanel * CAssemblyTrackFieldManager::MakeEditor(wxWindow* parent, objects::CUser_field& field)
137 {
138  return new CSingleAssemblyTrackingPanel(parent, field);
139 }
140 
141 
142 bool CAssemblyTrackFieldManager::IsEligible(const objects::CUser_field& field)
143 {
144  if (field.IsSetData() && field.GetData().IsFields()) {
145  return true;
146  } else {
147  return false;
148  }
149 }
150 
151 
152 bool CAssemblyTrackFieldManager::IsEmpty(const objects::CUser_field& field)
153 {
154  if (field.IsSetData() && field.GetData().IsFields() && !field.GetData().GetFields().empty()) {
155  return false;
156  } else {
157  return true;
158  }
159 }
160 
161 
163 {
164  CSingleAssemblyTrackingPanel* single_panel = dynamic_cast<CSingleAssemblyTrackingPanel*> (ctrl);
165  if (single_panel) {
166  return single_panel->GetUser_field();
167  } else {
169  return empty;
170  }
171 }
172 
173 
175 {
176  if (user) {
177  m_UserObj->Assign(*user);
178  } else {
179  m_UserObj = new CUser_object();
180  }
182 }
183 
184 
186 {
187  CUser_object::TData::iterator it = user_obj.SetData().begin();
188  while (it != user_obj.SetData().end()) {
189  if (m_FieldManager->IsEligible(**it)) {
190  it = user_obj.SetData().erase(it);
191  } else {
192  ++it;
193  }
194  }
195 
196  for (CUser_object::TData::iterator x = m_Fields.begin();
197  x != m_Fields.end();
198  x++) {
199  if (!m_FieldManager->IsEmpty(**x)) {
200  CRef<CUser_field> new_field(new CUser_field());
201  new_field->Assign(**x);
202  user_obj.SetData().push_back(new_field);
203  }
204  }
205 }
206 
207 
209 {
210  if (m_UserObj && m_UserObj->IsSetType() && m_UserObj->GetType().IsStr() &&
211  NStr::EqualNocase(m_UserObj->GetType().GetStr(), "TpaAssembly")) {
212  return true;
213  } else {
214  return false;
215  }
216 
217 }
218 
219 
221 {
222  Freeze();
223 
224  // remove existing subitems
225  while (m_Sizer->GetItemCount() > 0) {
226  int pos = 0;
227  m_Sizer->GetItem(pos)->DeleteWindows();
228  m_Sizer->Remove(pos);
229  }
230 
231  m_TotalHeight = 0;
232  m_TotalWidth = 0;
233  m_NumRows = 0;
234  m_ScrollRate = 0;
235 
236  x_UpdateFields();
237  vector< CRef< CUser_field > >::iterator it = m_Fields.begin();
238  vector<wxWindow *> new_rows;
239  bool is_tpa = x_IsTPA();
240  while (it != m_Fields.end()) {
241  if (!is_tpa && (*it)->IsSetData() && (*it)->GetData().IsFields()) {
242  for (auto& fit : (*it)->GetData().GetFields()) {
243  new_rows.push_back(x_AddRow(fit, m_ScrolledWindow, m_Sizer));
244  }
245  } else {
246  new_rows.push_back(x_AddRow(*it, m_ScrolledWindow, m_Sizer));
247  }
248  ++it;
249  }
250  if (new_rows.size() == 0 || m_NeedsEmptyLastRow) {
251  CRef<CUser_field> last_field(new CUser_field());
252  x_AddRow(last_field, m_ScrolledWindow, m_Sizer);
253  }
254  m_ScrolledWindow->SetVirtualSize(m_TotalWidth + 10, m_TotalHeight);
255  m_ScrolledWindow->SetScrollRate(0, m_ScrollRate);
256  m_ScrolledWindow->FitInside();
257  Layout();
258  Thaw();
259  ITERATE(vector<wxWindow *>, it, new_rows) {
260  (*it)->TransferDataToWindow();
261  }
262 
263  if (!wxPanel::TransferDataToWindow())
264  return false;
265  return true;
266 }
267 
268 
270 {
271  if (!wxPanel::TransferDataFromWindow())
272  return false;
273 
274  m_Fields.clear();
275 
276  wxSizerItemList::iterator node = m_Sizer->GetChildren().begin();
277  for (; node != m_Sizer->GetChildren().end(); ++node) {
278  wxWindow *w = (*node)->GetWindow();
279  if (!w) {
280  continue;
281  }
282  w->TransferDataFromWindow();
283  CRef<CUser_field> edited_field = m_FieldManager->GetUserField(w);
284  if (edited_field) {
285  m_Fields.push_back(edited_field);
286  }
287  }
288  return true;
289 }
290 
291 
293 {
294  if (!m_NeedsEmptyLastRow) {
295  return;
296  }
297  // find the row that holds the author to be deleted
298  wxSizerItemList& itemList = m_Sizer->GetChildren();
299 
300  if (IsLastRow(link, itemList)) {
301  link->TransferDataFromWindow();
302  CRef<CUser_field> curr_field = m_FieldManager->GetUserField(link);
303  if (curr_field && !m_FieldManager->IsEmpty(*curr_field)) {
304  CRef<CUser_field> last_field(new CUser_field());
305  m_Fields.push_back(last_field);
306  x_AddRow (last_field, m_ScrolledWindow, m_Sizer);
307  m_ScrolledWindow->SetVirtualSize(m_TotalWidth + 10, m_TotalHeight);
308  m_ScrolledWindow->SetScrollRate(0, m_ScrollRate);
309  m_ScrolledWindow->FitInside();
310  }
311  }
312 }
313 
314 
315 wxWindow* CUserFieldListPanel::x_AddRow(CRef<CUser_field> field, wxScrolledWindow* scrolled_window, wxBoxSizer* sizer)
316 {
317  wxWindow* row = m_FieldManager->MakeEditor(scrolled_window, *field);
318  sizer->Add(row, 0, wxALIGN_LEFT|wxALL, 0);
319  int row_width;
320  int row_height;
321  row->GetSize(&row_width, &row_height);
322  if (row_width > m_TotalWidth) {
323  m_TotalWidth = row_width;
324  }
325  m_TotalHeight += row_height;
326  m_ScrollRate = row_height;
327  m_NumRows++;
328  return row;
329 }
330 
331 
333 {
334  //m_Object = dynamic_cast<CSeq_feat*>(&object);
335  m_Fields.clear();
336  if (m_UserObj->IsSetData()) {
337  ITERATE(CUser_object::TData, it, m_UserObj->GetData()) {
338  if (m_FieldManager->IsEligible(**it)) {
339  CRef< CUser_field > field(new CUser_field());
340  field->Assign(**it);
341  m_Fields.push_back(field);
342  }
343  }
344  }
345 }
346 
347 
348 bool IsLastRow(wxWindow* wnd, wxSizerItemList& itemList)
349 {
350  bool is_last = false;
351  if (NULL == wnd)
352  return false;
353 
354  for(wxSizerItemList::iterator it = itemList.begin(); it != itemList.end(); ++it) {
355  wxWindow* child = (**it).GetWindow();
356  if (child && child == wnd) {
357  is_last = true;
358  } else {
359  if (is_last) {
360  is_last = false;
361  return is_last;
362  }
363  }
364  }
365 
366  return is_last;
367 }
368 
369 
370 CRef<CSeq_table> ReadTabDelimitedTable(const wxString& filename, bool read_header)
371 {
373  if (!ds.LoadTable(filename)) {
375  return empty;
376  }
378  if (read_header) {
379  ds.SetColumnHeaderRow(0);
380  ds.SetFirstImportRow(1);
381  }
382 
383  // All delimiter options can be updated through the CTableDelimiterRules
384  // class. The separators part of that is a vector of 'char'.
385  vector<char> delims;
386  delims.push_back('\t');
387  ds.GetDelimiterRules().SetDelimiters(delims);
388 
389  // Recompute the table (break it up into fields) using the new
390  // delimiters and header row specs
391  ds.RecomputeFields(true);
392 
393  // Set column information which will be used to set the seq-table
394  // column properties
395  for (size_t i=0; i<ds.GetColumns().size(); ++i) {
396  // set names for columns if no header
397  if (!read_header) {
398  ds.GetColumns()[i].SetName("This is column: " + NStr::Int8ToString(i));
399  }
400  ds.GetColumns()[i].SetType(CTableImportColumn::eTextColumn); // skipped is a type too
402  }
403 
404  // Convert table to a seq-table (inside of a seq-annot)
405  CRef<CSeq_annot> annot_container;
406  annot_container.Reset(new CSeq_annot());
407  ds.ConvertToSeqAnnot(annot_container);
408 
410  table->Assign(annot_container->GetData().GetSeq_table());
411  return table;
412 }
413 
414 
415 bool SaveTableFile (const string& save_file_name, CRef<objects::CSeq_table> values_table, bool include_header)
416 {
417  ios::openmode mode = ios::out;
418 
419  CNcbiOfstream os(save_file_name.c_str(), mode);
420  if (!os)
421  {
422  return false;
423  }
424 
425  CCSVExporter exporter(os, '\t', '"', false);
426  if (include_header) {
427  ITERATE (objects::CSeq_table::TColumns, cit, values_table->GetColumns()) {
428  exporter.Field((*cit)->GetHeader().GetTitle());
429  }
430  exporter.NewRow();
431  }
432  for (int i = 0; i < values_table->GetNum_rows(); ++i) {
433  ITERATE (objects::CSeq_table::TColumns, cit, values_table->GetColumns()) {
434  if (i < (*cit)->GetData().GetSize()) {
435  if ((*cit)->GetData().IsId()) {
436  string label = "";
437  (*cit)->GetData().GetId()[i]->GetLabel(&label, objects::CSeq_id::eContent);
438  exporter.Field(label);
439  } else if ((*cit)->GetData().IsString()) {
440  exporter.Field((*cit)->GetData().GetString()[i]);
441  } else if ((*cit)->GetData().IsInt()) {
442  string val = NStr::NumericToString((*cit)->GetData().GetInt()[i]);
443  exporter.Field(val);
444  }
445  } else {
446  string blank = "";
447  exporter.Field(blank);
448  }
449  }
450  exporter.NewRow();
451  }
452  return true;
453 }
454 
455 
456 bool SaveTableRowAsListFile (const string& save_file_name, CRef<objects::CSeq_table> values_table, int col)
457 {
458  if (!values_table || !values_table->IsSetColumns() || col >= values_table->GetColumns().size()) {
459  return false;
460  }
461  CRef<CSeqTable_column> src = values_table->GetColumns()[col];
462  if (!src->IsSetData() || src->GetData().GetSize() == 0) {
463  return false;
464  }
465  ios::openmode mode = ios::out;
466 
467  CNcbiOfstream os(save_file_name.c_str(), mode);
468  if (!os)
469  {
470  return false;
471  }
472 
473  CCSVExporter exporter(os, ',', '"', false);
474  for (size_t i = 0; i < values_table->GetColumns()[col]->GetData().GetSize(); ++i) {
475  if (i < src->GetData().GetSize()) {
476  if (src->GetData().IsId()) {
477  string label = "";
478  src->GetData().GetId()[i]->GetLabel(&label, objects::CSeq_id::eContent);
479  exporter.Field(label);
480  } else if (src->GetData().IsString()) {
481  exporter.Field(src->GetData().GetString()[i]);
482  } else if (src->GetData().IsInt()) {
483  string val = NStr::NumericToString(src->GetData().GetInt()[i]);
484  exporter.Field(val);
485  }
486  }
487  }
488  exporter.NewRow();
489  return true;
490 }
491 
492 
494 {
495  if (!table || !table->IsSetColumns() || table->GetColumns().size() < 1
496  || !table->GetColumns()[0]->IsSetData()
497  || !table->GetColumns()[0]->GetData().IsString()) {
498  return;
499  }
500  CRef<CSeqTable_column> acc_col = table->GetColumns()[0];
501  size_t num_rows;
502  if (table->IsSetNum_rows()) {
503  num_rows = table->GetNum_rows();
504  } else {
505  num_rows = acc_col->GetData().GetSize();
506  }
507 
508  CRef<CSeqTable_column> from_col(NULL);
510  if (table->GetColumns().size() > 2) {
511  from_col = table->GetColumns()[1];
512  to_col = table->GetColumns()[2];
513  }
514 
515  for (size_t row = 0; row < num_rows; row++) {
516  string accession = table->GetColumns()[0]->GetData().GetString()[row];
517  if (!NStr::IsBlank(accession)) {
518  CRef<CUser_field> new_field(new CUser_field());
519  new_field->SetLabel().SetId(0);
520  CRef<CUser_field> acc_field(new CUser_field());
521  acc_field->SetLabel().SetStr("accession");
522  acc_field->SetData().SetStr(accession);
523  new_field->SetData().SetFields().push_back(acc_field);
524  if (from_col && to_col
525  && row < from_col->GetData().GetSize()
526  && row < to_col->GetData().GetSize()
527  && !NStr::IsBlank(from_col->GetData().GetString()[row])
528  && !NStr::IsBlank(to_col->GetData().GetString()[row])) {
529  try {
530  int from_val = NStr::StringToInt(from_col->GetData().GetString()[row]);
531  int to_val = NStr::StringToInt(to_col->GetData().GetString()[row]);
532  CRef<CUser_field> from_field(new CUser_field());
533  from_field->SetLabel().SetStr("from");
534  from_field->SetData().SetInt(from_val - 1);
535  new_field->SetData().SetFields().push_back(from_field);
536  CRef<CUser_field> to_field(new CUser_field());
537  to_field->SetLabel().SetStr("to");
538  to_field->SetData().SetInt(to_val - 1);
539  new_field->SetData().SetFields().push_back(to_field);
540  } catch(CException &e) {} catch (exception &e) {}
541  }
542  obj->SetData().push_back(new_field);
543  }
544  }
545 }
546 
548 {
549  if (!obj.IsSetData() || obj.GetData().size() == 0) {
551  return empty;
552  }
555  table->SetColumns().push_back(acc_col);
557  table->SetColumns().push_back(from_col);
559  table->SetColumns().push_back(to_col);
560 
561  ITERATE(CUser_object::TData, it, obj.GetData()) {
562  if ((*it)->IsSetData() && ((*it)->GetData().IsFields())) {
563  string accession = "";
564  int from_val = -1;
565  int to_val = -1;
566  ITERATE(CUser_field::TData::TFields, fit, (*it)->GetData().GetFields()) {
567  if ((*fit)->IsSetLabel() && (*fit)->GetLabel().IsStr() && (*fit)->IsSetData()) {
568  string label = (*fit)->GetLabel().GetStr();
569  if (NStr::EqualNocase(label, "accession")) {
570  if ((*fit)->GetData().IsStr()) {
571  accession = (*fit)->GetData().GetStr();
572  }
573  } else if (NStr::EqualNocase(label, "from")) {
574  if ((*fit)->GetData().IsInt()) {
575  from_val = (*fit)->GetData().GetInt();
576  }
577  } else if (NStr::EqualNocase(label, "to")) {
578  if ((*fit)->GetData().IsInt()) {
579  to_val = (*fit)->GetData().GetInt();
580  }
581  }
582  }
583  }
584  if (!NStr::IsBlank(accession)) {
585  acc_col->SetData().SetString().push_back(accession);
586  string from = "";
587  string to = "";
588  if (from_val > -1 && to_val > -1) {
589  from = NStr::NumericToString(from_val + 1);
590  to = NStr::NumericToString(to_val + 1);
591  }
592  from_col->SetData().SetString().push_back(from);
593  to_col->SetData().SetString().push_back(to);
594  }
595  }
596  }
597 
598  if (acc_col->IsSetData()) {
599  table->SetNum_rows(static_cast<CSeq_table::TNum_rows>(acc_col->GetData().GetSize()));
600  } else {
601  table.Reset(NULL);
602  }
603  return table;
604 }
605 
606 
608 
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
virtual CSingleUserFieldPanel * MakeEditor(wxWindow *parent, objects::CUser_field &field)
virtual bool IsEmpty(const objects::CUser_field &field)
virtual bool IsEligible(const objects::CUser_field &field)
virtual CRef< objects::CUser_field > GetUserField(wxWindow *ctrl)
void Field(const string &value)
bool x_IsTypeString(const string &str)
virtual CRef< objects::CUser_field > GetUserField(wxWindow *ctrl)
virtual CSingleUserFieldPanel * MakeEditor(wxWindow *parent, objects::CUser_field &field)
virtual bool IsEligible(const objects::CUser_field &field)
virtual bool IsEmpty(const objects::CUser_field &field)
static bool x_HasPopulatedFields(const objects::CUser_field &field)
size_t GetSize(void) const
virtual CRef< objects::CUser_field > GetUser_field()
CRef< objects::CUser_field > GetUser_field()
void SetDelimiters(const vector< char > &d)
Get/set delimiter characters.
CTableImportDataSource -.
void SetColumnHeaderRow(int c)
set/get (optional) row from which to parse column names
void SetTableType(EFieldSeparatorType e)
Update current table type.
const CTableDelimiterRules & GetDelimiterRules() const
Get set all delimiter rules (for delimited tables)
void RecomputeFields(bool recreate_columns, int recompute_count=-1)
Updated the individual rows and columns to match the current delimiter choice.
vector< CTableImportColumn > & GetColumns()
return the array of column data
bool LoadTable(const wxString &fname, CUser_object &user_object)
void ConvertToSeqAnnot(CRef< CSeq_annot > annot_container)
Save data in table into annot_container.
void SetFirstImportRow(int r)
set/get first row for import (0-based)
wxScrolledWindow * m_ScrolledWindow
virtual bool TransferDataToWindow()
virtual void AddLastField(wxWindow *link)
vector< CRef< objects::CUser_field > > m_Fields
CRef< objects::CUser_object > m_UserObj
void SetUser_object(CRef< objects::CUser_object > user)
void PopulateFields(objects::CUser_object &user_obj)
virtual bool TransferDataFromWindow()
wxWindow * x_AddRow(CRef< objects::CUser_field > field, wxScrolledWindow *scrolled_window, wxBoxSizer *sizer)
CUserFieldManager * m_FieldManager
virtual CRef< objects::CUser_field > GetUserField(wxWindow *ctrl)=0
virtual bool IsEligible(const objects::CUser_field &field)=0
virtual CSingleUserFieldPanel * MakeEditor(wxWindow *parent, objects::CUser_field &field)=0
virtual bool IsEmpty(const objects::CUser_field &field)=0
std::ofstream out("events_result.xml")
main entry point for tests
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
virtual void Assign(const CSerialObject &source, ESerialRecursionMode how=eRecursive)
Set object to copy of another one.
@ eContent
Definition: feature.hpp:87
void Reset(void)
Reset reference object.
Definition: ncbiobj.hpp:773
#define END_NCBI_SCOPE
End previously defined NCBI scope.
Definition: ncbistl.hpp:103
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
Definition: ncbistl.hpp:100
IO_PREFIX::ofstream CNcbiOfstream
Portable alias for ofstream.
Definition: ncbistre.hpp:500
static string Int8ToString(Int8 value, TNumToStringFlags flags=0, int base=10)
Convert Int8 to string.
Definition: ncbistr.hpp:5153
static int StringToInt(const CTempString str, TStringToNumFlags flags=0, int base=10)
Convert string to int.
Definition: ncbistr.cpp:630
static bool IsBlank(const CTempString str, SIZE_TYPE pos=0)
Check if a string is blank (has no text).
Definition: ncbistr.cpp:106
static bool EqualNocase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-insensitive equality of a substring with another string.
Definition: ncbistr.hpp:5347
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
static const char label[]
bool IsSetData(void) const
the object itself Check if a value has been assigned to Data data member.
vector< CRef< CUser_field > > TFields
TData & SetData(void)
Assign a value to Data data member.
void SetLabel(TLabel &value)
Assign a value to Label data member.
const TData & GetData(void) const
Get the Data member data.
void SetData(TData &value)
Assign a value to Data data member.
vector< CRef< CUser_field > > TData
bool IsId(void) const
Check if variant Id is selected.
bool IsString(void) const
Check if variant String is selected.
bool IsInt(void) const
Check if variant Int is selected.
void SetData(TData &value)
Assign a value to Data data member.
bool IsSetData(void) const
row data Check if a value has been assigned to Data data member.
const TInt & GetInt(void) const
Get the variant data.
const TString & GetString(void) const
Get the variant data.
const TData & GetData(void) const
Get the Data member data.
const TId & GetId(void) const
Get the variant data.
const TSeq_table & GetSeq_table(void) const
Get the variant data.
Definition: Seq_annot_.cpp:153
const TData & GetData(void) const
Get the Data member data.
Definition: Seq_annot_.hpp:873
<!DOCTYPE HTML >< html > n< header > n< title > PubSeq Gateway Help Page</title > n< style > n table
int i
constexpr bool empty(list< Ts... >) noexcept
mdb_mode_t mode
Definition: lmdb++.h:38
const struct ncbi::grid::netcache::search::fields::SIZE size
#define row(bind, expected)
Definition: string_bind.c:73
USING_SCOPE(objects)
CRef< CSeq_table > SeqTableFromAssemblyFields(const CUser_object &obj)
void AddAssemblyUserFieldsFromSeqTable(CRef< CUser_object > obj, CRef< CSeq_table > table)
bool IsLastRow(wxWindow *wnd, wxSizerItemList &itemList)
CRef< CSeq_table > ReadTabDelimitedTable(const wxString &filename, bool read_header)
bool SaveTableRowAsListFile(const string &save_file_name, CRef< objects::CSeq_table > values_table, int col)
bool SaveTableFile(const string &save_file_name, CRef< objects::CSeq_table > values_table, bool include_header)
Modified on Fri Sep 20 14:57:03 2024 by modify_doxy.py rev. 669887