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

Go to the SVN repository for this file.

1 /* $Id: text_sel_handler.cpp 41823 2018-10-17 17:34:58Z katargir $
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 (adapted from a file by Andrey Yazhuk)
27  *
28  * File Description:
29  *
30  */
31 
32 #include <ncbi_pch.hpp>
33 #include <corelib/ncbistd.hpp>
34 
36 #include <gui/opengl/glhelpers.hpp>
37 #include <gui/opengl/glresmgr.hpp>
38 #include <gui/opengl/irender.hpp>
39 
41 
42 #include <math.h>
43 
44 
47 
48 
49 static int kDragThreshold = 4; // make this configurable
50 BEGIN_EVENT_TABLE(CTextSelHandler, wxEvtHandler)
51  EVT_LEFT_DOWN(CTextSelHandler::OnMousePush)
54 #if 0
55 // EVT_LEFT_DOWN(CHitMatrixGraph::OnLeftDown)
56 // EVT_LEFT_UP(CHitMatrixGraph::OnLeftUp)
57 // EVT_MOTION(CHitMatrixGraph::OnMotion)
58 // case FL_PUSH: res = x_OnMousePush(event, pane); break;
59 // case FL_DRAG: res = x_OnMouseDrag(event, pane); break;
60 // case FL_RELEASE: res = x_OnMouseRelease(event, pane); break;
61 // case FL_MOVE: res = x_OnMouseMove(event, pane); break;
62 
63  EVT_KEY_DOWN(CTextSelHandler::OnKeyDown)
64  EVT_KEY_UP(CTextSelHandler::OnKeyUp)
65 #endif
67 
68 ////////////////////////////////////////////////////////////////////////////////
69 /// class CTextSelHandler
70 
72 : m_ExtState(eNoExt),
73  m_OpType(eNoOp),
74  m_bResizeCursor(false),
75  m_pGeometry(NULL),
76  m_SelColor(0.5f, 0.5f, 0.5f, 0.25f),
77  m_BorderColor(0.25f, 0.25f, 0.25f, 0.5f),
78  m_PassiveSelColor(0.6f, 0.6f, 0.6f, 0.25f),
79  m_SymbolColor(0.0f, 0.0f, 1.0f, 1.0f),
80  m_Font(CGlTextureFont::eFontFace_Helvetica, 24),
81  m_HoverPos (kInvalidSeqPos)
82 {
83  m_Selection.clear();
84 }
85 
86 
88 {
89 }
90 
91 
93 {
94  m_pGeometry = pGeometry;
95 }
96 
97 
99 {
100  return m_Selection.GetLimits();
101 }
102 
103 
105 {
106  return m_Selection;
107 }
108 
109 
111 {
112  m_Selection = C;
113  if(b_redraw) {
115  }
116 }
117 
118 
120 {
121  CScope& scope = m_pGeometry->STG_GetScope();
122  m_SelectedObjects.Clear(&scope);
123 
124  if (b_redraw) {
126  }
127 }
128 
129 
130 void CTextSelHandler::DeSelectObject(const CObject* obj, bool b_redraw)
131 {
132  if(obj) {
134  if (b_redraw) {
136  }
137  }
138 }
139 
140 
141 void CTextSelHandler::SelectObject(const CObject* obj, bool b_redraw)
142 {
143  m_SelectedObjects.Add(NULL, *const_cast<CObject*>(obj));
144  if (b_redraw) {
146  }
147 }
148 
149 
151 {
152  m_Selection.clear();
153  if(b_redraw) {
155  }
156 }
157 
159 {
160  ResetRangeSelection(b_redraw);
161  ResetObjectSelection(b_redraw);
162 }
163 
165 {
166  switch(type) {
167  case eSelection: m_SelColor = color; break;
169  case eSymbol: m_SymbolColor = color; break;
170  default: _ASSERT(false);
171  }
172 }
173 
174 
175 ////////////////////////////////////////////////////////////////////////////////
176 // event handlers
177 
178 void CTextSelHandler::OnMousePush(wxMouseEvent &event)
179 {
180  if (event.ButtonDClick(1)) {
181  x_OnResetAll();
182  } else {
183  x_OnStartSel(event);
184  x_OnSelectCursor(event);
185  }
186 }
187 
188 
189 void CTextSelHandler::OnMouseDrag(wxMouseEvent &event)
190 {
191  if (event.Dragging()) {
192  if (m_OpType != eNoOp) {
193  x_OnChangeSelRange(event);
194  }
195  } else {
196  TSeqPos pos = x_MouseToSeqPos(event);
197  x_SetHoverPos (pos);
198  x_OnSelectCursor(event);
199  }
200 }
201 
202 
203 void CTextSelHandler::OnMouseRelease(wxMouseEvent &event)
204 {
205  m_OpType = x_GetOpTypeByEvent(event);
206  x_OnChangeSelRange(event);
207  x_OnEndSelRange();
208  x_OnSelectCursor(event);
209 }
210 
211 
213 {
214  if (m_pGeometry != NULL) {
216  if (m_HoverPos != pos) {
217  m_HoverPos = pos;
218  }
220  }
221 }
222 
223 
224 #if 0
226 {
227  CGUIEvent::EGUIState state = event.GetGUIState();
229 
230  TSeqPos pos = x_MouseToSeqPos();
231  x_SetHoverPos (pos);
232 
233  if(state == CGUIEvent::eSelectState || state == CGUIEvent::eSelectAltState) {
234  return 1;
235  } else return 0;
236 }
237 
238 
239 void CTextSelHandler::OnKeyDown(wxKeyEvent& event)
240 {
241  x_OnOpChange(event);
242  return 0;
243 }
244 
245 
246 void CTextSelHandler::OnKeyUp(wxKeyEvent& event)
247 {
248  x_OnOpChange(event);
249 
250 
251 
252  return 0;
253 }
254 #endif
255 
256 ////////////////////////////////////////////////////////////////////////////////
257 /// Signal handlers
258 void CTextSelHandler::x_OnStartSel(wxMouseEvent &event)
259 {
260  TSeqRange HitR;
261  bool b_hit_start = false;
262  x_HitTest(HitR, b_hit_start, event);
263 
264  if(HitR.NotEmpty()) { // hit a border of the selected range
265  m_OpType = eChange;
266  m_ExtState = b_hit_start ? eExtRangeStart : eExtRangeEnd;
267  m_CurrRange = HitR;
268 
269  x_RemoveFromSelection(HitR);
270  } else {
272  m_OpType = x_GetOpTypeByEvent(event);
273 
274  TSeqPos pos = x_MouseToSeqPos(event);
275 
276  m_CurrRange.SetFrom(pos);
277  m_CurrRange.SetToOpen(pos);
278  }
279 
281 }
282 
283 
284 void CTextSelHandler::x_OnChangeSelRange(wxMouseEvent &event)
285 {
286  if (m_ExtState == eNoExt && m_CurrRange.Empty())
287  return;
288  TSeqPos pos = x_MouseToSeqPos(event);
289  pos = x_ClipPosByRange(pos);
290  TSeqRange old_r = m_CurrRange;
291  bool in_right_margin = x_MouseInRightMargin(event);
292 
293  if (in_right_margin && m_ExtState == eExtRangeEnd) {
294  pos++;
295  }
296 
297  if(m_ExtState == eNoExt && pos != m_CurrRange.GetFrom()) {
298  if(pos > m_CurrRange.GetFrom()) {
299  m_CurrRange.SetToOpen(pos);
301  } else {
303  m_CurrRange.SetFrom(pos);
305  }
306  } else if(m_ExtState == eExtRangeEnd && pos != m_CurrRange.GetToOpen()) {
307  if(pos > m_CurrRange.GetFrom()) {
308  m_CurrRange.SetToOpen(pos);
309  } else { //flip
311  m_CurrRange.SetFrom(pos);
313  }
314  } else if(m_ExtState == eExtRangeStart && pos != m_CurrRange.GetFrom()) {
315  if(pos <= m_CurrRange.GetToOpen()) {
316  m_CurrRange.SetFrom(pos);
317  } else {
319  m_CurrRange.SetToOpen(pos);
321  }
322  };
323 
324  //Report end of range
325  if (pos == m_CurrRange.GetToOpen() && pos > 0) {
326  x_SetHoverPos (pos - 1);
327  } else {
328  x_SetHoverPos (pos);
329  }
330 
331  if(m_CurrRange != old_r) {
333  }
334 }
335 
336 
338 {
339  if(! m_CurrRange.Empty()) {
340  switch(m_OpType) {
341  case eAdd:
342  case eChange: x_AddToSelection(m_CurrRange); break;
344  case eNoOp: break;
345  }
346  }
348 
349  m_ExtState = eNoExt;
350  m_OpType = eNoOp;
351 
353 }
354 
356 {
357  bool b_update = ! m_Selection.empty();
358  m_Selection.clear();
359 
360  m_ExtState = eNoExt;
361  m_OpType = eNoOp;
362 
363  if(b_update) {
365  }
366 }
367 
368 
369 void CTextSelHandler::x_OnOpChange(wxMouseEvent &event)
370 {
371  if(m_ExtState != eNoExt) {
372  EOpType NewType = x_GetOpTypeByEvent(event);
373 
374  if(NewType != m_OpType) {
375  m_OpType = NewType;
376  x_OnSelectCursor(event);
377 
379  }
380  }
381 }
382 
383 
384 void CTextSelHandler::x_OnSelectCursor(wxMouseEvent &event)
385 {
386  switch(m_OpType) {
387  case eNoOp: {
388  TSeqRange HitR;
389  bool b_hit_start = false;
390  x_HitTest(HitR, b_hit_start, event);
391 
392  m_bResizeCursor = HitR.NotEmpty();
393  }; break;
394  case eAdd:
395  case eRemove:
396  case eChange: m_bResizeCursor = true; break;
397  }
398  x_SetCursor();
399 }
400 
401 
403 {
404  if (m_pGeometry) {
405  if (m_bResizeCursor) {
407  } else {
409  }
410  }
411 }
412 
413 ////////////////////////////////////////////////////////////////////////////////
414 /// helper functions
415 
416 // translate modificators to operation type
418 {
419 // switch(event.GetGUIState()) {
420 // case CGUIEvent::eSelectState: return eAdd;
421 // case CGUIEvent::eSelectAltState: return eRemove;
422 // default: return eNoOp;
423 // }
424  return eNoOp;
425 }
426 
427 
429 {
430 // switch(event.GetGUIState()) {
431 // case CGUIEvent::eSelectState: return eAdd;
432 // case CGUIEvent::eSelectAltState: return eRemove;
433 // default: return eNoOp;
434 // }
435  if (event.AltDown()) {
436  return eRemove;
437  } else {
438  return eAdd;
439  }
440 }
441 
442 
444 {
445  //_ASSERT(m_pPane);
446  wxPoint pt = event.GetPosition();
447  return m_pGeometry->STG_GetSequenceByWindow(pt.x, pt.y);
448 }
449 
450 
451 bool CTextSelHandler::x_MouseInRightMargin(wxMouseEvent& event)
452 {
453  //_ASSERT(m_pPane);
454  wxPoint pt = event.GetPosition();
455  return m_pGeometry->STG_IsPointInRightMargin (pt.x, pt.y);
456 }
457 
458 
459 void CTextSelHandler::x_HitTest(TSeqRange& range, bool& b_hit_start, wxMouseEvent &event)
460 {
461  //_ASSERT(m_pPane);
462  wxPoint pt = event.GetPosition();
463 
465 
466  int min_D = -1;
467  bool b_min_start = false;
468  const TSeqRange* p_min_range = 0;
469 
470  const TRangeColl& C = m_Selection;
471  ITERATE(TRangeColl, it, C) {
472  const TSeqRange& R = *it;
473 
474  int D = (int)abs((int)(z - R.GetFrom()));
475 
476  if(min_D < 0 || min_D > D) {
477  min_D = D;
478  b_min_start = true;
479  p_min_range = &R;
480  }
481  D = (int)abs((int)(z - R.GetToOpen()));
482  if(min_D > D) {
483  min_D = D;
484  b_min_start = false;
485  p_min_range = &R;
486  }
487  }
488 
489  if(min_D > -1 && min_D <= kDragThreshold) {
490  b_hit_start = b_min_start;
491  _ASSERT(p_min_range);
492  range = *p_min_range;
493  } else range.SetLength(0);
494 }
495 
496 
498 {
500 
501  TSeqPos chars_in_line, lines_in_seq;
502  m_pGeometry->STG_GetLineInfo(chars_in_line, lines_in_seq);
503 
504  pos = max (pos, (TSeqPos) 0);
505  pos = min (pos, (TSeqPos) (chars_in_line * lines_in_seq));
506  return pos;
507 }
508 
509 
511 {
513 }
514 
515 
517 {
519 }
520 
521 inline void RenderRect(const TModelRect& rc, TModelUnit offset_x, TModelUnit offset_y,
522  CRgbaColor& color, GLenum type)
523 {
524  IRender& gl = GetGl();
525 
526  gl.ColorC(color);
527  gl.PolygonMode(GL_FRONT_AND_BACK, type);
528  gl.Rectd(rc.Left() - offset_x, rc.Top() - offset_y,
529  rc.Right() - offset_x, rc.Bottom() - offset_y);
530 }
531 
532 
534  CRgbaColor& border_color)
535 {
536  IRender& gl = GetGl();
537 
538  TSeqPos seq_start = min (r.GetFrom(), r.GetTo());
539  TSeqPos seq_end = max (r.GetFrom(), r.GetTo());
540 
542  TSeqPos vis_start, vis_stop;
543  m_pGeometry->STG_GetVisibleRange (vis_start, vis_stop);
544 
545  if (seq_start > vis_stop || seq_end < vis_start) {
546  // range is completely offscreen, no need to draw
547  return;
548  }
549 
550  TSeqPos chars_in_line, lines_in_seq;
551  m_pGeometry->STG_GetLineInfo(chars_in_line, lines_in_seq);
552  seq_start = max ((TSeqPos) 0, seq_start);
553  seq_end = min (seq_end, lines_in_seq * chars_in_line);
554 
555  TModelPoint start_point = m_pGeometry->STG_GetModelPointBySourcePos(seq_start);
557  TSeqPos row_end = ((seq_start / chars_in_line) * chars_in_line) + chars_in_line - 1;
558  while (row_end < vis_start) {
559  TSeqPos next_row_start = row_end + 1;
560  row_end = min (next_row_start + chars_in_line - 1, seq_end);
561  }
562  TModelPoint interim_point = m_pGeometry->STG_GetModelPointBySourcePos (row_end);
563 
564  if (start_point.m_Y == end_point.m_Y) {
565  interim_point.m_X = end_point.m_X;
566  }
567 
568  TModelRect rc (start_point.m_X, start_point.m_Y - 0.2,
569  interim_point.m_X + 1.0,
570  interim_point.m_Y + 0.8);
571 
572  gl.LineWidth (0.5);
573 
574  RenderRect(rc, .1, 0, m_PassiveSelColor, GL_FILL);
575  RenderRect(rc, 0, 0, border_color, GL_LINE);
576 
577  while (row_end < vis_stop && row_end < seq_end)
578  {
579  TSeqPos next_row_start = row_end + 1;
580  start_point = m_pGeometry->STG_GetModelPointBySourcePos(next_row_start);
581  row_end = min (next_row_start + chars_in_line - 1, seq_end);
582  interim_point = m_pGeometry->STG_GetModelPointBySourcePos(row_end);
583  rc.Init (start_point.m_X, start_point.m_Y - 0.2, interim_point.m_X + 1.0, interim_point.m_Y + 0.8);
584 
585  RenderRect(rc, 0, 0, m_PassiveSelColor, GL_FILL);
586  RenderRect(rc, 0, 0, border_color, GL_LINE);
587  }
588 }
589 
590 
592 {
593  TSeqPos seq_start = min (r.GetFrom(), r.GetTo());
594  TSeqPos seq_end = max (r.GetFrom(), r.GetTo());
595  int sym_len = 0;
596 
597  // draw Operation symbol in center of range
598  const char* s = 0;
599  switch(m_OpType) {
600  case eAdd:
601  s = "+";
602  sym_len = 1;
603  break;
604  case eRemove:
605  s = "-";
606  sym_len = 1;
607  break;
608  case eChange:
609  s = "<->";
610  sym_len = 3;
611  break;
612  case eNoOp:
613  break;
614  }
615  if (sym_len < 1) {
616  return;
617  }
618 
620  TSeqPos vis_start, vis_stop;
621  m_pGeometry->STG_GetVisibleRange (vis_start, vis_stop);
622 
623  if (seq_start > vis_stop || seq_end < vis_start) {
624  // range is completely offscreen, no need to draw
625  return;
626  }
627 
628  seq_start = max (seq_start, vis_start);
629  seq_end = min (seq_end, vis_stop);
630 
631  TModelPoint start_point = m_pGeometry->STG_GetModelPointBySourcePos(seq_start);
633  TModelRect range_rect(min (start_point.m_X, end_point.m_X), min (start_point.m_Y, end_point.m_Y),
634  max (start_point.m_X, end_point.m_X), max (start_point.m_Y, end_point.m_Y));
635 
636  // if there is enougth space - draw operation symbol
637  TModelUnit x = range_rect.Left() + range_rect.Width() / 2 - sym_len / 2;
638  TModelUnit y = range_rect.Bottom() + range_rect.Height() / 2 + .5;
639  m_Font.TextOut(x, y, s);
640 }
641 
642 
644 {
645  TConstObjects objs;
647 
648  if (objs.size() == 0)
649  return;
650  if (!m_Mapper) {
651  // need to map locations
652  CBioseq_Handle top_handle = m_pGeometry->STG_GetScope().GetBioseqHandle(*(m_pGeometry->STG_GetDataSourceLoc()->GetId()));
654  }
655  set <CSerialObject*> objsToDraw;
656  ITERATE(TConstObjects, obj, objs) {
657  const CSerialObject* cso =
658  dynamic_cast<const CSerialObject*>(obj->GetPointer());
659 
660  if (cso) {
661  //const CTypeInfo* this_info = cso->GetThisTypeInfo();
662  if (cso->GetThisTypeInfo() == CSeq_feat::GetTypeInfo()) {
663  const CSeq_feat& feat = dynamic_cast<const CSeq_feat&>(*cso);
664  CRef<CSeq_loc> feat_loc = m_Mapper->Map(feat.GetLocation());
665 
666  if (m_pGeometry != NULL) {
667  m_pGeometry->STG_RenderSelectedFeature(feat, *feat_loc);
668  }
669  }
670  }
671  }
672 }
673 
674 
676 {
677  CGlAttrGuard AttrGuard(GL_ENABLE_BIT | GL_POLYGON_BIT | GL_HINT_BIT);
678 
679  TModelRect rc_vis = pane.GetVisibleRect();
680 
681  if(! rc_vis.IsEmpty()) {
682  CGlPaneGuard GUARD(pane, CGlPane::eOrtho);
683 
684  // draw exisiting selection
685 
686  const TRangeColl& C = m_Selection;
687  ITERATE(TRangeColl, it, C) { // for every segment
688  const TSeqRange& r = *it;
689 
691  }
692 
693  if(m_OpType != eNoOp) { // draw current range
694 
696 
697  if(option == eActiveState) {
699  }
700  }
701 
703 
704  if (m_pGeometry != NULL) {
705  vector<CConstRef<CSeq_feat> > feat_list = m_pGeometry->STG_GetFeaturesAtPosition(m_HoverPos);
706  ITERATE(vector<CConstRef<CSeq_feat> >, feat, feat_list) {
708  }
709  }
710  }
711 }
712 
713 
715 {
716  unsigned int i;
717  TConstObjects objs;
718  TSeqPos start_offset, stop_offset;
719 
720  subtypes.clear();
721 
722  // no point in trying to return feature subtypes without a host
723  if (m_pGeometry == NULL) {
724  return;
725  }
726 
727  m_pGeometry->STG_GetVisibleRange(start_offset, stop_offset);
728 
729  for (i = 0; i < stop_offset - start_offset + 2; i++) {
730  subtypes.push_back (CSeqFeatData::eSubtype_bad);
731  }
732 
734 
735  // no selected features, no selected feature subtypes
736  if (objs.size() == 0) {
737  return;
738  }
739 
740  if (!m_Mapper) {
741  // need to map locations
742  CBioseq_Handle top_handle = m_pGeometry->STG_GetScope().GetBioseqHandle(*(m_pGeometry->STG_GetDataSourceLoc()->GetId()));
744  }
745  set <CSerialObject*> objsToDraw;
746  ITERATE(TConstObjects, obj, objs) {
747  const CSerialObject* cso =
748  dynamic_cast<const CSerialObject*>(obj->GetPointer());
749 
750  if (cso) {
751  //const CTypeInfo* this_info = cso->GetThisTypeInfo();
752  if (cso->GetThisTypeInfo() == CSeq_feat::GetTypeInfo()) {
753  const CSeq_feat& feat = dynamic_cast<const CSeq_feat&>(*cso);
754  CRef<CSeq_loc> feat_loc = m_Mapper->Map(feat.GetLocation());
755  m_pGeometry->STG_SetSubtypesForFeature (subtypes, *feat_loc, feat.GetData().GetSubtype(), start_offset, stop_offset);
756  }
757  }
758  }
759 }
760 
761 
763 {
764  unsigned int i;
765  TConstObjects objs;
766  TSeqPos start_offset, stop_offset;
767 
768  subtypes.clear();
769 
770  // no point in trying to return feature subtypes without a host
771  if (m_pGeometry == NULL) {
772  return;
773  }
774 
775  m_pGeometry->STG_GetVisibleRange(start_offset, stop_offset);
776 
777  for (i = 0; i < stop_offset - start_offset + 2; i++) {
778  subtypes.push_back (CSeqFeatData::eSubtype_bad);
779  }
780 
781  vector<CConstRef<CSeq_feat> > feat_list = m_pGeometry->STG_GetFeaturesAtPosition(m_HoverPos);
782  ITERATE(vector<CConstRef<CSeq_feat> >, feat, feat_list) {
783  m_pGeometry->STG_SetSubtypesForFeature (subtypes, (*feat)->GetLocation(), (*feat)->GetData().GetSubtype(), start_offset, stop_offset);
784  }
785 
786 }
787 
788 
CBioseq_Handle –.
CGUIEvent provides mapping of FLTK events to Semantic Events.
Definition: gui_event.hpp:82
CGlAttrGuard - guard class for restoring OpenGL attributes.
Definition: glutils.hpp:130
class CGlPane
Definition: glpane.hpp:62
void Clear(objects::CScope *scope)
bool Remove(const CObject &obj)
void GetObjects(TConstObjects &objects) const
void Add(ISelObjectHandle *obj_handle, CObject &obj)
CObject –.
Definition: ncbiobj.hpp:180
TThisType & CombineWith(const TRange &r)
Definition: range_coll.hpp:195
TRange GetLimits() const
Definition: range_coll.hpp:165
bool empty() const
Definition: range_coll.hpp:102
TThisType & Subtract(const TRange &r)
Definition: range_coll.hpp:205
class CRgbaColor provides a simple abstraction for managing colors.
Definition: rgba_color.hpp:58
CScope –.
Definition: scope.hpp:92
ESubtype GetSubtype(void) const
@ eSubtype_bad
These no longer need to match the FEATDEF values in the C toolkit's objfdef.h.
vector< int > TSubtypeVector
namespace ncbi::objects::
Definition: Seq_feat.hpp:58
CSeq_loc_Mapper –.
Base class for all serializable objects.
Definition: serialbase.hpp:150
Class CTextSelHandler represents in GUI a two-dimnesional multi-segment selection.
void x_OnChangeSelRange(wxMouseEvent &event)
CRgbaColor m_BorderColor
EOpType x_GetOpTypeByEvent(wxKeyEvent &event) const
helper functions
void OnMouseDrag(wxMouseEvent &event)
void SelectObject(const CObject *obj, bool b_redraw)
TSeqRange GetSelectionLimits() const
ISeqTextGeometry * m_pGeometry
void DeSelectObject(const CObject *obj, bool b_redraw)
void OnMouseRelease(wxMouseEvent &event)
void x_OnSelectCursor(wxMouseEvent &event)
CRgbaColor m_PassiveSelColor
void x_HitTest(TSeqRange &Range, bool &bHitStart, wxMouseEvent &event)
void OnKeyUp(wxKeyEvent &event)
void SetColor(EColorType type, const CRgbaColor &color)
void ResetObjectSelection(bool b_redraw)
CRef< objects::CSeq_loc_Mapper > m_Mapper
void x_RemoveFromSelection(const TSeqRange &Range)
virtual ~CTextSelHandler()
TSeqPos x_ClipPosByRange(TSeqPos Pos)
CGlTextureFont m_Font
CRgbaColor m_SymbolColor
int x_OnMouseMove(CGUIEvent &event, CGlPane &Pane)
void x_SetHoverPos(TSeqPos pos)
TSeqPos x_MouseToSeqPos(wxMouseEvent &event)
void x_OnStartSel(wxMouseEvent &event)
Signal handlers.
void x_RenderRange(TSeqRange r, CRgbaColor &fill_color)
void x_AddToSelection(const TSeqRange &Range)
void OnKeyDown(wxKeyEvent &event)
void SetRangeSelection(const TRangeColl &C, bool bRedraw)
void SetHost(ISeqTextGeometry *pGeometry)
void STGH_GetMouseOverFeatureSubtypes(CSeqTextDefs::TSubtypeVector &subtypes)
const TRangeColl & GetSelection() const
void ResetSelection(bool bRedraw)
void x_OnOpChange(wxMouseEvent &event)
void ResetRangeSelection(bool bRedraw)
void OnMousePush(wxMouseEvent &event)
void x_RenderOpSymbol(TSeqRange r)
void Render(CGlPane &Pane, ERenderingOption option=eActiveState)
bool x_MouseInRightMargin(wxMouseEvent &event)
void STGH_GetSelectedFeatureSubtypes(CSeqTextDefs::TSubtypeVector &subtypes)
CObjectIndex m_SelectedObjects
class ISeqTextGeometry
virtual void STG_SetDefaultCursor()=0
virtual void STG_SetResizeCursor()=0
virtual void STG_ReportMouseOverPos(TSeqPos pos)=0
virtual const objects::CSeq_loc * STG_GetDataSourceLoc()=0
virtual void STG_RenderSelectedFeature(const objects::CSeq_feat &feat, const objects::CSeq_loc &mapped_loc)=0
virtual void STG_GetVisibleRange(TSeqPos &seq_start, TSeqPos &seq_stop)=0
virtual void STG_SetSubtypesForFeature(CSeqTextDefs::TSubtypeVector &subtypes, const objects::CSeq_loc &loc, int subtype, TSeqPos start_offset, TSeqPos stop_offset)=0
virtual void STG_Redraw()=0
virtual bool STG_IsPointInRightMargin(int x, int y)=0
virtual vector< CConstRef< objects::CSeq_feat > > STG_GetFeaturesAtPosition(TSeqPos pos)=0
virtual objects::CScope & STG_GetScope()=0
virtual TModelPoint STG_GetModelPointBySourcePos(TSeqPos z)=0
virtual void STG_RenderMouseOverFeature(const objects::CSeq_feat &feat)=0
virtual TSeqPos STG_GetSequenceByWindow(int x, int y)=0
virtual void STG_GetLineInfo(TSeqPos &chars_in_line, TSeqPos &lines_in_pane)=0
virtual void STG_OnChanged()=0
Definition: set.hpp:45
Include a standard set of the NCBI C++ Toolkit most basic headers.
#define C(s)
Definition: common.h:231
#define false
Definition: bool.h:36
#define option
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
const TSeqPos kInvalidSeqPos
Define special value for invalid sequence position.
Definition: ncbimisc.hpp:878
#define NULL
Definition: ncbistd.hpp:225
GLdouble TModelUnit
Definition: gltypes.hpp:48
T Height() const
Definition: glrect.hpp:90
void Init()
Definition: glrect.hpp:62
T Top() const
Definition: glrect.hpp:84
T Bottom() const
Definition: glrect.hpp:82
T Width() const
Definition: glrect.hpp:86
bool IsEmpty() const
Definition: glrect.hpp:150
IRender & GetGl()
convenience function for getting current render manager
T Right() const
Definition: glrect.hpp:83
T Left() const
Definition: glrect.hpp:81
virtual void PolygonMode(GLenum face, GLenum mode)=0
Set the polygon rasterization mode.
virtual void TextOut(const char *text) const
TextOut interface Write the specified text and set up state and transformation as needed.
TModelRect & GetVisibleRect(void)
Definition: glpane.hpp:357
virtual void LineWidth(GLfloat w)=0
Set line width for drawing: glLineWidth()
virtual void ColorC(const CRgbaColor &c)=0
Set current color (glColor{3,4}{f,d}{v,})
void Rectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)
Definition: irender.hpp:193
@ eOrtho
Definition: glpane.hpp:66
vector< CConstRef< CObject > > TConstObjects
Definition: objects.hpp:64
virtual const CTypeInfo * GetThisTypeInfo(void) const =0
@ eSeqMap_Up
map from segments to the top level bioseq
void Reset(void)
Reset reference object.
Definition: ncbiobj.hpp:773
bool NotEmpty(void) const
Definition: range.hpp:152
TThisType & SetToOpen(position_type toOpen)
Definition: range.hpp:175
position_type GetToOpen(void) const
Definition: range.hpp:138
TThisType & SetLength(position_type length)
Definition: range.hpp:194
bool Empty(void) const
Definition: range.hpp:148
#define END_NCBI_SCOPE
End previously defined NCBI scope.
Definition: ncbistl.hpp:103
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
Definition: ncbistl.hpp:100
void SetFrom(TFrom value)
Assign a value to From data member.
Definition: Range_.hpp:231
TFrom GetFrom(void) const
Get the From member data.
Definition: Range_.hpp:222
const TLocation & GetLocation(void) const
Get the Location member data.
Definition: Seq_feat_.hpp:1117
const TData & GetData(void) const
Get the Data member data.
Definition: Seq_feat_.hpp:925
unsigned int
A callback function used to compare two keys in a database.
Definition: types.hpp:1210
n background color
END_EVENT_TABLE()
int i
range(_Ty, _Ty) -> range< _Ty >
#define abs(a)
Definition: ncbi_heapmgr.c:130
T max(T x_, T y_)
T min(T x_, T y_)
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
double f(double x_, const double &y_)
Definition: njn_root.hpp:188
#define R(t)
Definition: type.c:6
#define _ASSERT
USING_SCOPE(objects)
void RenderRect(const TModelRect &rc, TModelUnit offset_x, TModelUnit offset_y, CRgbaColor &color, GLenum type)
static int kDragThreshold
Modified on Tue Apr 23 07:39:18 2024 by modify_doxy.py rev. 669887