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

Go to the SVN repository for this file.

1 /* $Id: flat_file_text_item.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 <corelib/ncbistre.hpp>
35 
36 #include <objmgr/seqdesc_ci.hpp>
37 
41 
44 
48 
49 #include "edit_tb.hpp"
50 
54 
62 
63 #include <wx/dcclient.h>
64 #include <wx/txtstrm.h>
65 
68 
69 namespace // anonymous
70 {
71 
72 class CCountLines : public IFlatTextOStream
73 {
74 public:
75  CCountLines() : m_Lines(0) {}
76 
77  virtual void AddParagraph(const list<string>& text, const CSerialObject*)
78  {
79  m_Lines += text.size();
80  for (const auto& it : text) {
81  if (NStr::Find(it, "\n") != NPOS) {
82  ++m_Lines;
83  }
84  }
85  }
86  virtual void AddLine(const CTempString& line,
87  const CSerialObject* obj,
88  EAddNewline add_newline)
89  {
90  if (eAddNewline_Yes == add_newline)
91  ++m_Lines;
92  }
93 
94  size_t GetLines() const { return m_Lines; }
95 
96 private:
97  size_t m_Lines;
98 };
99 
100 class CGetText : public IFlatTextOStream
101 {
102 public:
103  CGetText() {}
104 
105  virtual void AddParagraph(const list<string>& text, const CSerialObject*)
106  {
107  ITERATE(list<string>, it, text)
108  m_OS << *it << "\n";
109  }
110  virtual void AddLine(const CTempString& line,
111  const CSerialObject* obj,
112  EAddNewline add_newline)
113  {
114  m_OS << line;
115  if (eAddNewline_Yes == add_newline) {
116  m_OS << "\n";
117  }
118  }
119 
120  string Text() { return CNcbiOstrstreamToString(m_OS); }
121 
122 private:
123  CNcbiOstrstream m_OS;
124 };
125 
126 class CDrawLines : public IFlatTextOStream
127 {
128 public:
129  CDrawLines(CStyledTextOStream& drawText) : m_DrawText(drawText) {}
130 
131  virtual void AddParagraph(const list<string>& text, const CSerialObject*)
132  {
133  ITERATE(list<string>, it, text) {
134  if (auto pos = NStr::Find(*it, "\n"); pos != NPOS) {
135  m_DrawText << it->substr(0, pos) << NewLine();
136  m_DrawText << it->substr(pos + 1, NPOS) << NewLine();
137  }
138  else {
139  m_DrawText << *it << NewLine();
140  }
141  }
142  }
143  virtual void AddLine(const CTempString& line,
144  const CSerialObject* obj,
145  EAddNewline add_newline)
146  {
147  m_DrawText << line;
148  if (eAddNewline_Yes == add_newline)
149  m_DrawText << NewLine();
150  }
151 
152 private:
153  CStyledTextOStream& m_DrawText;
154 };
155 
156 } // anonymous namespace
157 
159  : m_Item(item), m_EditFlags(0), m_EditToolbar()
160 {
161  if (!m_Item)
162  return;
163 
164  const CSeqdesc* odesc = dynamic_cast<const CSeqdesc*>(item->GetObject());
165  if (odesc) {
166  m_AssosiatedObject.Reset(odesc);
167  return;
168  }
169 
170  const CSeq_feat* ofeat = dynamic_cast<const CSeq_feat*>(item->GetObject());
171  if (ofeat) {
172  m_AssosiatedObject.Reset(ofeat);
173  }
174 
175 
176  // See s_GetFlatRowType in flat_file_retrieve_job.cpp
177 
178  const CGapItem* gap_item = dynamic_cast<const CGapItem*>(m_Item.GetPointer());
179  if (gap_item)
180  {
181  CBioseqContext* ctx = gap_item->GetContext();
182  if (!ctx)
183  return;
184 
185  m_AssosiatedObject.Reset(new CGapEdit(ctx->GetHandle(), gap_item->GetFrom(), gap_item->GetTo() - gap_item->GetFrom() + 1));
186  return;
187  }
188 
189  const CPrimaryItem* primary_item = dynamic_cast<const CPrimaryItem*>(m_Item.GetPointer());
190  if (primary_item)
191  {
192  CBioseqContext* ctx = primary_item->GetContext();
193  if (!ctx)
194  return;
195  m_AssosiatedObject.Reset(new CPrimaryEdit(ctx->GetHandle()));
196  }
197 
198  const CDeflineItem* defLineItem = dynamic_cast<const CDeflineItem*>(m_Item.GetPointer());
199  if (defLineItem) {
200  CBioseqContext* ctx = defLineItem->GetContext();
201  if (!ctx)
202  return;
203 
204  m_AssosiatedObject.Reset(new CSeqdescTitleEdit(ctx->GetHandle(), defLineItem->GetDefline()));
205  return;
206  }
207  const CSourceItem* sourceItem = dynamic_cast<const CSourceItem*>(m_Item.GetPointer());
208  if (sourceItem) {
209  CBioseqContext* ctx = sourceItem->GetContext();
210  if (!ctx)
211  return;
212 
213  CSeqdesc_CI dsrc_it(ctx->GetHandle(), CSeqdesc::e_Source);
214  if (dsrc_it) {
215  const CSeqdesc& seqDesc = *dsrc_it;
216  m_AssosiatedObject.Reset(&seqDesc);
217  return;
218  }
219  const CSeq_feat* seq_feat = dynamic_cast<const CSeq_feat*>(m_Item->GetObject());
220  if (seq_feat && seq_feat->GetData().IsBiosrc()) {
221  m_AssosiatedObject.Reset(seq_feat);
222  return;
223  }
224  }
225 
226  const CSourceFeatureItem* sourceFeatureItem
227  = dynamic_cast<const CSourceFeatureItem*>(m_Item.GetPointer());
228  if (sourceFeatureItem) {
229  CBioseqContext* ctx = sourceFeatureItem->GetContext();
230  if (!ctx)
231  return;
232 
233  const CSeq_feat* seq_feat = dynamic_cast<const CSeq_feat*>(m_Item->GetObject());
234  if (!seq_feat)
235  return;
236 
237  const CSeq_feat::TData& data = seq_feat->GetData();
238  if (data.IsBiosrc()) {
239  const CBioSource& bioSource = data.GetBiosrc();
240  CSeqdesc_CI dsrc_it(ctx->GetHandle(), CSeqdesc::e_Source);
241  if (dsrc_it) {
242  const CSeqdesc& seqDesc = *dsrc_it;
243  if (seqDesc.IsSource()) {
244  const CBioSource& bioSource2 = seqDesc.GetSource();
245  if (&bioSource2 == &bioSource) {
246  m_AssosiatedObject.Reset(&seqDesc);
247  return;
248  }
249  }
250  }
251  }
252 
253  //CFeat_CI fsrc_it(ctx->GetHandle(), CSeqFeatData::e_Biosrc);
254  //if (fsrc_it) {
255  // m_AssosiatedObject.Reset(fsrc_it->GetOriginalSeq_feat().GetPointer());
256  // return;
257  //}
258  m_AssosiatedObject.Reset(seq_feat);
259  return;
260  }
261 
262  const CGenomeProjectItem* genomeProjectItem
263  = dynamic_cast<const CGenomeProjectItem*>(m_Item.GetPointer());
264  if (genomeProjectItem) {
265  CBioseqContext* ctx = genomeProjectItem->GetContext();
266  if (!ctx)
267  return;
268 
269  // extract all the useful user objects
270  for (CSeqdesc_CI desc(ctx->GetHandle(), CSeqdesc::e_User); desc; ++desc) {
271  const CUser_object& uo = desc->GetUser();
272 
273  if (!uo.GetType().IsStr()) {
274  continue;
275  }
276  if (NStr::EqualNocase(uo.GetType().GetStr(), "DBLink")) {
277  const CSeqdesc& seqDesc = *desc;
278  m_AssosiatedObject.Reset(&seqDesc);
279  return;
280  }
281  }
282  return;
283  }
284 
285  const CSerialObject* itemObject = m_Item->GetObject();
286  if (!itemObject)
287  return;
288 
289  const CBioseq* bioseq = dynamic_cast<const CBioseq*>(itemObject);
290  const CSequenceItem* seqItem =
291  dynamic_cast<const CSequenceItem*>(m_Item.GetPointer());
292  if (seqItem && bioseq) {
293  CRef<CSeq_loc> loc(new CSeq_loc());
294  loc->SetInt().SetFrom(seqItem->GetFrom() - 1);
295  loc->SetInt().SetTo(seqItem->GetTo() - 1);
296  try {
297  loc->SetId(*(bioseq->GetFirstId()));
298  } catch (const CObjMgrException&) {
299  return;
300  }
302  return;
303  } else {
304  m_AssosiatedObject.Reset(itemObject);
305  }
306 
307  if (m_AssosiatedObject)
309 }
310 
312 {
313  delete m_EditToolbar;
314 }
315 
317 {
318  if (!m_EditToolbar && m_EditFlags != 0)
320 }
321 
323 {
324  return m_AssosiatedObject;
325 }
326 
327 void CFlatFileTextItem::CalcSize(wxDC& /*dc*/, CTextPanelContext* context)
328 {
329  x_CalcLineCount(context);
330  wxSize size = context->GetWSize();
331  m_Size.Set(context->GetLeftMargin() + size.x*80, static_cast<int>(size.y*m_LineCount));
332 }
333 
334 void CFlatFileTextItem::Draw(wxDC& dc, const wxRect& updateRect, CTextPanelContext* context)
335 {
336  CTextSelectItem::Draw(dc, updateRect, context);
337 
338  if (m_EditToolbar) {
339  wxRect rect = m_EditToolbar->GetRect();
340  if (updateRect.Intersects(rect)) {
341  wxPoint dcOrigin = context->GetDeviceOrigin();
342  context->SetDeviceOrigin(wxPoint(dcOrigin.x + rect.GetLeft(), dcOrigin.y + rect.GetTop()));
343  context->SetDeviceOrigin(dc);
344  m_EditToolbar->Draw(dc, context);
345  context->SetDeviceOrigin(dcOrigin);
346  }
347  }
348 }
349 
350 void CFlatFileTextItem::MouseEvent(wxMouseEvent& event, CTextPanelContext& context)
351 {
352  if (m_EditToolbar) {
353  wxRect rect = m_EditToolbar->GetRect();
354  if (rect.Contains(event.m_x, event.m_y)) {
355  wxMouseEvent ev(event);
356  ev.m_x -= rect.x;
357  ev.m_y -= rect.y;
359  return;
360  }
361  }
362  CTextSelectItem::MouseEvent(event, context);
363 }
364 
366 {
367  CFlatFileViewContext* pcntx = static_cast<CFlatFileViewContext*>(context);
368  CDrawLines draw(ostream);
369  if (!m_Item->Skip())
370  m_Item->Format(pcntx->GetFormatter(), draw);
371 }
372 
374 {
375  CFlatFileViewContext* pcntx = (CFlatFileViewContext*)context;
376  _ASSERT(pcntx);
377  if (!pcntx) {
378  m_LineCount = 1;
379  return;
380  }
381 
382  CCountLines os;
383  if (!m_Item->Skip()) {
384  m_Item->Format(pcntx->GetFormatter(), os);
385  m_LineCount = os.GetLines();
386  }
387  else
388  m_LineCount = 1;
389 }
390 
392 {
393  if (dynamic_cast<const CFeatureItemBase*>(m_Item.GetPointer()) == NULL)
394  return "";
395 
396  CFlatFileViewContext* pcntx = static_cast<CFlatFileViewContext*>(context);
397  CGetText os;
398  if (!m_Item->Skip())
399  m_Item->Format(pcntx->GetFormatter(), os);
400  return os.Text();
401 }
402 
const CSeq_id * GetFirstId() const
Definition: Bioseq.cpp:271
const string & GetDefline(void) const
virtual void MouseEvent(wxMouseEvent &event)
Definition: edit_tb.cpp:75
virtual void Draw(wxDC &dc, CTextPanelContext *context)
Definition: edit_tb.cpp:67
CConstRef< CObject > m_AssosiatedObject
virtual string GetToolTipText(CTextPanelContext *context) const
virtual void Draw(wxDC &dc, const wxRect &updateRect, CTextPanelContext *context)
virtual void CalcSize(wxDC &dc, CTextPanelContext *context)
CConstRef< objects::IFlatItem > m_Item
virtual void x_RenderText(CStyledTextOStream &ostream, CTextPanelContext *context) const
virtual void x_CalcLineCount(CTextPanelContext *context)
CEditToolbar * m_EditToolbar
void SetEditFlags(int flags)
virtual void MouseEvent(wxMouseEvent &event, CTextPanelContext &context)
CFlatFileTextItem(CConstRef< objects::IFlatItem > item)
virtual const CConstRef< CObject > GetAssosiatedObject() const
objects::IFormatter & GetFormatter()
CBioseqContext * GetContext(void)
Definition: item_base.hpp:113
TSeqPos GetTo(void) const
Definition: gap_item.hpp:106
TSeqPos GetFrom(void) const
Definition: gap_item.hpp:100
virtual wxRect GetRect() const
Definition: glyph.hpp:53
CNcbiOstrstreamToString class helps convert CNcbiOstrstream to a string Sample usage:
Definition: ncbistre.hpp:802
Base class for all object manager exceptions.
namespace ncbi::objects::
Definition: Seq_feat.hpp:58
CSeqdesc_CI –.
Definition: seqdesc_ci.hpp:65
TSeqPos GetTo(void) const
TSeqPos GetFrom(void) const
Base class for all serializable objects.
Definition: serialbase.hpp:150
CTempString implements a light-weight string on top of a storage buffer whose lifetime management is ...
Definition: tempstr.hpp:65
size_t m_LineCount
Definition: text_item.hpp:171
wxSize m_Size
Definition: text_item.hpp:172
virtual void Draw(wxDC &dc, const wxRect &updateRect, CTextPanelContext *context)
Definition: text_item.cpp:135
wxSize GetWSize() const
virtual int GetLeftMargin() const
wxPoint GetDeviceOrigin() const
void SetDeviceOrigin(wxPoint drawDeviceOrigin)
virtual void MouseEvent(wxMouseEvent &event, CTextPanelContext &context)
Definition: svg.hpp:498
CS_CONTEXT * ctx
Definition: t0006.c:12
USING_SCOPE(objects)
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
Definition: ncbimisc.hpp:815
#define NULL
Definition: ncbistd.hpp:225
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
TObjectType * GetPointer(void) const THROWS_NONE
Get pointer,.
Definition: ncbiobj.hpp:1684
TObjectType * GetPointer(void) THROWS_NONE
Get pointer,.
Definition: ncbiobj.hpp:998
void Reset(void)
Reset reference object.
Definition: ncbiobj.hpp:1439
TObjectType & GetObject(void) const
Get object.
Definition: ncbiobj.hpp:1697
#define END_NCBI_SCOPE
End previously defined NCBI scope.
Definition: ncbistl.hpp:103
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
Definition: ncbistl.hpp:100
#define NPOS
Definition: ncbistr.hpp:133
static SIZE_TYPE Find(const CTempString str, const CTempString pattern, ECase use_case=eCase, EDirection direction=eForwardSearch, SIZE_TYPE occurrence=0)
Find the pattern in the string.
Definition: ncbistr.cpp:2887
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:5352
bool IsStr(void) const
Check if variant Str is selected.
Definition: Object_id_.hpp:291
const TStr & GetStr(void) const
Get the variant data.
Definition: Object_id_.hpp:297
const TType & GetType(void) const
Get the Type member data.
const TData & GetData(void) const
Get the Data member data.
Definition: Seq_feat_.hpp:925
const TBiosrc & GetBiosrc(void) const
Get the variant data.
bool IsBiosrc(void) const
Check if variant Biosrc is selected.
const TSource & GetSource(void) const
Get the variant data.
Definition: Seqdesc_.cpp:566
bool IsSource(void) const
Check if variant Source is selected.
Definition: Seqdesc_.hpp:1190
@ e_User
user defined object
Definition: Seqdesc_.hpp:124
@ e_Source
source of materials, includes Org-ref
Definition: Seqdesc_.hpp:133
static void text(MDB_val *v)
Definition: mdb_dump.c:62
const struct ncbi::grid::netcache::search::fields::SIZE size
NCBI C++ stream class wrappers for triggering between "new" and "old" C++ stream libraries.
#define _ASSERT
Modified on Sat Dec 09 04:47:26 2023 by modify_doxy.py rev. 669887