hit_matrix_pane.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:17k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: hit_matrix_pane.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 21:10:58  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: hit_matrix_pane.cpp,v 1000.3 2004/06/01 21:10:58 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Andrey Yazhuk
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbistl.hpp>
  41. #include <corelib/ncbitime.hpp>
  42. #include <gui/widgets/hit_matrix/hit_matrix_pane.hpp>
  43. #include <gui/widgets/hit_matrix/hit_matrix_widget.hpp>
  44. #include <FL/Fl.H>
  45. BEGIN_NCBI_SCOPE
  46. #define AXIS_AREA_W 50
  47. #define AXIS_AREA_H 30
  48. CHitMatrixPane::CHitMatrixPane(int PosX, int PosY, int Width, int Height, const char* Label)
  49. :   CGlPaneWidgetChild(PosX, PosY, Width, Height, Label),
  50.     m_BackColor(0.95f, 1.0f, 0.95f),
  51.     m_pTextFont(NULL),
  52.     m_pSeqFont(NULL),
  53.     m_VertSelHandler(eVert),
  54.     m_BottomRuler(true),
  55.     m_TopRuler(true),
  56.     m_LeftRuler(false),
  57.     m_RightRuler(false),
  58.     m_QueryGraph(false),
  59.     m_SubjectGraph(true)
  60. {
  61.     m_MatrixPane.EnableOffset(true);
  62.     m_SubjectPane.EnableOffset(true);
  63.     m_QueryPane.EnableOffset(true);
  64.     m_Gen.SetIntegerMode(true, true);
  65.     m_Gen.EnableOneBased(true, true);
  66.     m_Grid.EnableIntegerCentering(true);
  67.     m_pTextFont = new CGlBitmapFont(CGlBitmapFont::eHelvetica12);
  68.     m_pSeqFont = new CGlBitmapFont(CGlBitmapFont::eCourier14);    
  69.     m_QueryGraph.SetFonts(m_pTextFont, m_pSeqFont);
  70.     m_SubjectGraph.SetFonts(m_pTextFont, m_pSeqFont);
  71.     //setup Event Handlers
  72.     m_HorzSelHandler.SetHost(static_cast<ISelHandlerHost*>(this));
  73.     x_RegisterHandler(dynamic_cast<IEventHandler*>(&m_HorzSelHandler), fSubjectArea, &m_SubjectPane);
  74.     m_VertSelHandler.SetHost(static_cast<ISelHandlerHost*>(this));
  75.     x_RegisterHandler(dynamic_cast<IEventHandler*>(&m_VertSelHandler), fQueryArea, &m_QueryPane);
  76.     m_MouseZoomHandler.SetHost(static_cast<IMouseZoomHandlerHost*>(this));
  77.     x_RegisterHandler(dynamic_cast<IEventHandler*>(&m_MouseZoomHandler), fMatrixArea, &m_MatrixPane);
  78.     m_Graph.SetHost(static_cast<IHitMatrixGraphHost*>(this));
  79.     x_RegisterHandler(dynamic_cast<IEventHandler*>(&m_Graph), fMatrixArea, &m_MatrixPane);
  80.     /* x_AddHandler(dynamic_cast<IEventHandler*>(this), fDescrArea);
  81.     */
  82.     m_Event.StandardConfig();  
  83.     
  84.     x_Layout();
  85.     x_SetupAxes();
  86. }
  87. void    CHitMatrixPane::x_SetupAxes()
  88. {
  89.     m_TopRuler.SetHorizontal(true, CRuler::eTop);
  90.     m_RightRuler.SetHorizontal(false, CRuler::eRight);
  91. }
  92. TVPPoint CHitMatrixPane::GetPortSize(void)
  93. {
  94.     return TVPPoint(m_rcMatrix.Width(), m_rcMatrix.Height());
  95. }
  96. void CHitMatrixPane::SetWidget(CHitMatrixWidget* pParent)
  97. {
  98.     m_pParent = pParent;
  99.     
  100.     if(m_pParent)   {
  101.         m_MatrixPane = x_GetParent()->GetPort();
  102.     }
  103. }
  104. void    CHitMatrixPane::resize(int x, int y, int w, int h)
  105. {
  106.     CGlPaneWidgetChild::resize(x, y, w, h);
  107.     x_Layout();
  108.     m_MatrixPane.SetViewport(m_rcMatrix);
  109.     
  110.     m_SubjectPane.SetViewport(m_rcBottomSeq);
  111.     x_AdjsutToMasterPane(m_SubjectPane, true, false);
  112.     
  113.     m_QueryPane.SetViewport(m_rcLeftSeq);        
  114.     x_AdjsutToMasterPane(m_QueryPane, false, true);
  115. }
  116. void    CHitMatrixPane::x_Render(void)
  117. {
  118.     glClearColor(m_BackColor.GetRed(), m_BackColor.GetGreen(), m_BackColor.GetBlue(), m_BackColor.GetAlpha());
  119.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    
  120.     
  121.     // optional render background images    
  122.     x_RenderContent();
  123. }
  124. void    CHitMatrixPane::Update()
  125. {    
  126.     _ASSERT(x_GetParent());    
  127.     m_Graph.DeleteGlyphs();
  128.     CHitMatrixDataSource* pDS = x_GetParent()->GetDS();
  129.     if(pDS) {
  130.         CBioseq_Handle q_handle = pDS->GetQueryHandle();
  131.         CBioseq_Handle s_handle = pDS->GetSubjectHandle();
  132.         const CHitMatrixDataSource::THitAdapterCont&   hits = pDS->GetHits();
  133.         for( CHitMatrixDataSource::THitAdapterCont::const_iterator it =
  134.              hits.begin(); it != hits.end(); it++ )   {
  135.             //const CHitDataAdapter* hit = *it;
  136.             //cout << "Q Start " << hit.GetQueryStart() << ", Subj Start " << hit.GetSubjectStart() << endl;
  137.             m_Graph.CreateGlyph(&(*it));
  138.         }
  139.      
  140.         if(m_ColorScoreId)  {
  141.             m_Graph.AssignColorsByScore(m_ColorScoreId);
  142.             m_ColorScoreId.Reset();
  143.         }
  144.         m_SubjectGraph.SetBioseqHandle(s_handle);
  145.         m_QueryGraph.SetBioseqHandle(q_handle);
  146.     } else {
  147.         CBioseq_Handle h_null;
  148.         m_SubjectGraph.SetBioseqHandle(h_null);
  149.         m_QueryGraph.SetBioseqHandle(h_null);
  150.     }
  151. }
  152. void    CHitMatrixPane::ColorByScore(CConstRef<CObject_id> score_id)
  153. {
  154.     m_ColorScoreId = score_id;
  155.     CHitMatrixDataSource* pDS = x_GetParent()->GetDS();
  156.     if(pDS) {
  157.         m_Graph.AssignColorsByScore(score_id);
  158.     }
  159. }
  160. typedef multimap<const CHitDataAdapter*, const CHitElemGlyph*>  THitToElemGlyphMap;
  161. bool    SubjectStartLess(const CHitElemDataAdapter* el1, const CHitElemDataAdapter* el2)
  162. {
  163.     return  el1->GetSubjectStart() < el2->GetSubjectStart();
  164. CConstRef<CSeq_align_set>    CHitMatrixPane::GetSelectedHits() const
  165. {
  166.     const TElemGlyphSet& glyphs = m_Graph.GetSelectedGlyphs();
  167.     
  168.     // build a temporary map
  169.     THitToElemGlyphMap   hit_to_glyph;
  170.     ITERATE( CHitMatrixPane::TElemGlyphSet, it_G, glyphs)   {
  171.         const CHitElemDataAdapter& elem = (*it_G)->GetHitElem();
  172.         const CHitDataAdapter& hit = elem.GetHit();
  173.         hit_to_glyph.insert(THitToElemGlyphMap::value_type(&hit, *it_G));
  174.     }
  175.     // create a new seq-align-set
  176.     CRef<CSeq_align_set>    set(new CSeq_align_set);
  177.     CSeq_align_set::Tdata   ls_rf_aligns = set->Set();
  178.     const CHitDataAdapter*  p_curr_hit = NULL;
  179.     CSeq_align* p_align = NULL;
  180.     CDense_seg* p_denseg = NULL;
  181.     vector<const CHitElemDataAdapter*>    elems;
  182.     
  183.     // iterate by Glyphs
  184.     for( THitToElemGlyphMap::const_iterator it = hit_to_glyph.begin();
  185.             it != hit_to_glyph.end(); )   {
  186.         // for a new Hit create a CSeq_align
  187.         p_curr_hit = it->first;
  188.         p_align = new CSeq_align();            
  189.         p_align->SetType(CSeq_align::eType_partial);
  190.         ls_rf_aligns.push_back(CRef<CSeq_align>(p_align)); // add to set
  191.         CSeq_align::C_Segs& segs = p_align->SetSegs();
  192.         segs.Select(CSeq_align::C_Segs::e_Denseg);
  193.         p_denseg = & segs.SetDenseg();            
  194.         
  195.         // for all elements of the current hit - add to list
  196.         for( ; it != hit_to_glyph.end()  &&  it->first == p_curr_hit; it++ )    {
  197.             const CHitElemDataAdapter& elem = it->second->GetHitElem();
  198.             elems.push_back(&elem);
  199.         }
  200.         int size = elems.size();
  201.         if(size)
  202.             sort(elems.begin(), elems.end(), SubjectStartLess);
  203.         p_denseg->SetDim(2);
  204.         p_denseg->SetNumseg(size);
  205.         p_denseg->SetStarts().resize(2*size);
  206.         p_denseg->SetLens().resize(size);
  207.         p_denseg->SetStrands().resize(size);
  208.         // add elems to denseg
  209.         int i_start = 0, i_len = 0;
  210.         ITERATE(vector<const CHitElemDataAdapter*>, it_e, elems)   {
  211.             const CHitElemDataAdapter* elem  = *it_e;
  212.             p_denseg->SetStarts()[i_start++] = elem->GetSubjectStart();
  213.             p_denseg->SetStarts()[i_start++] = elem->GetQueryStart();
  214.             p_denseg->SetLens()[i_len++] = elem->GetLength();            
  215.         }
  216.         elems.clear();
  217.     }
  218.     return ConstRef<CSeq_align_set>(set);
  219. }
  220. TModelRect  CHitMatrixPane::GetSelectedHitElemsRect() const
  221. {
  222.     const TElemGlyphSet& glyphs = m_Graph.GetSelectedGlyphs();
  223.     bool b_first = true;    
  224.     
  225.     int left, right, top, bottom;
  226.     ITERATE( CHitMatrixPane::TElemGlyphSet, it_G, glyphs)   {
  227.         const CHitElemDataAdapter& elem = (*it_G)->GetHitElem();
  228.         
  229.         int s_from = elem.GetSubjectStart();
  230.         int q_from = elem.GetQueryStart();
  231.         int len = elem.GetLength();
  232.         int s_to = s_from + len;
  233.         int q_to = q_from + len;        
  234.         
  235.         if(q_from > q_to)
  236.             swap(q_from, q_to);
  237.         if(s_from > s_to)   
  238.             swap(s_from, s_to);
  239.         if(b_first) {
  240.             left = s_from;            right = s_to;
  241.             bottom = q_from;          top = q_to;
  242.             b_first = false;
  243.         } else {
  244.             left = min(left, s_from);
  245.             right = max(right, s_to);
  246.             bottom = min(bottom, q_from);
  247.             top = max(top, q_to);
  248.         }
  249.     }
  250.     return b_first ? TModelRect(0, 0) : TModelRect(left, bottom, right + 1, top + 1);
  251. }
  252. const CHitMatrixPane::TRangeColl&     CHitMatrixPane::GetSubjectSelection() const
  253. {
  254.     return m_HorzSelHandler.GetSelection();
  255. }
  256. const CHitMatrixPane::TRangeColl&     CHitMatrixPane::GetQuerySelection() const
  257. {
  258.     return m_VertSelHandler.GetSelection();
  259. }
  260. void    CHitMatrixPane::x_Layout(void)
  261. {    
  262.     TVPPoint subj_gr_size = m_SubjectGraph.PreferredSize();
  263.     TVPPoint query_gr_size = m_QueryGraph.PreferredSize();
  264.     int mx_left = query_gr_size.X() + AXIS_AREA_W;
  265.     int mx_bottom = subj_gr_size.Y() + AXIS_AREA_H;
  266.     int mx_right = w() - AXIS_AREA_W;
  267.     int mx_top = h() - AXIS_AREA_H;
  268.     m_rcMatrix.Init(mx_left, mx_bottom, mx_right, mx_top);
  269.     m_rcAxes.Init(query_gr_size.X(), subj_gr_size.Y(), w(), h());
  270.     m_rcLeftSeq.Init(0, mx_bottom, query_gr_size.X(), mx_top);
  271.     m_rcBottomSeq.Init(mx_left, 0, mx_right, subj_gr_size.Y());    
  272. }
  273. void    CHitMatrixPane::x_RenderContent(void)
  274. {
  275.     if(x_GetParent()) {
  276.         const CGlPane& VP = x_GetParent()->GetPort();
  277.         
  278.         // prepare CGlPanes
  279.         TModelRect rc_M = VP.GetModelLimitsRect();  
  280.         m_MatrixPane.SetModelLimitsRect(rc_M);    
  281.         TModelRect rc_V = VP.GetVisibleRect();        
  282.         m_MatrixPane.SetVisibleRect(rc_V);
  283.         x_AdjsutToMasterPane(m_SubjectPane, true, false);
  284.         x_AdjsutToMasterPane(m_QueryPane, false, true);
  285.         // now rendering
  286.         x_RenderAxisAndGrid(m_MatrixPane);
  287.         x_RenderSeqPanes();
  288.         m_Graph.Render(m_MatrixPane);
  289.         x_RenderSelHandler(true, m_MatrixPane, CLinearSelHandler::ePassiveState);        
  290.         x_RenderSelHandler(false, m_MatrixPane, CLinearSelHandler::ePassiveState);
  291.         x_RenderMouseZoomHandler(m_MatrixPane);        
  292.     }
  293. }
  294. void    CHitMatrixPane::x_RenderAxisAndGrid(CGlPane& gr_pane)
  295. {
  296.     CGlPane pane(CGlPane::eNeverUpdate);
  297.     pane.SetViewport(m_rcAxes);
  298.         
  299.     m_Grid.Render(&pane, &gr_pane, &m_Gen);
  300.     // draw horizonatl rulers
  301.     // draw bottom ruler
  302.     TVPRect rc_VP(m_rcMatrix.Left(), m_rcAxes.Bottom(), m_rcMatrix.Right(), m_rcMatrix.Bottom() - 1);
  303.     pane.SetViewport(rc_VP);
  304.     x_AdjsutToMasterPane(pane, true, false);
  305.     m_BottomRuler.Render(pane);
  306.     // draw top ruler
  307.     rc_VP.Init(m_rcMatrix.Left(), m_rcMatrix.Top() + 1, m_rcMatrix.Right(), m_rcAxes.Top());
  308.     pane.SetViewport(rc_VP);
  309.     x_AdjsutToMasterPane(pane, true, false);
  310.     
  311.     m_TopRuler.Render(pane);
  312.     // draw vertical rulers
  313.     // draw left ruler
  314.     rc_VP.Init(m_rcAxes.Left(), m_rcMatrix.Bottom(), m_rcMatrix.Left() - 1, m_rcMatrix.Top());
  315.     pane.SetViewport(rc_VP);
  316.     x_AdjsutToMasterPane(pane, false, true);
  317.     m_LeftRuler.Render(pane);
  318.     // draw right ruler
  319.     rc_VP.Init(m_rcMatrix.Right() + 1, m_rcMatrix.Bottom(), m_rcAxes.Right(), m_rcMatrix.Top());
  320.     pane.SetViewport(rc_VP);
  321.     x_AdjsutToMasterPane(pane, false, true);
  322.     m_RightRuler.Render(pane);
  323. }
  324. void    CHitMatrixPane::x_RenderSeqPanes()
  325. {    
  326.     m_SubjectGraph.Render(m_SubjectPane);
  327.     x_RenderSelHandler(true, m_SubjectPane, CLinearSelHandler::eActiveState);
  328.         
  329.     m_QueryGraph.Render(m_QueryPane);
  330.     x_RenderSelHandler(false, m_QueryPane, CLinearSelHandler::eActiveState);
  331. }
  332. void    CHitMatrixPane::x_AdjsutToMasterPane(CGlPane& pane, bool b_model_x, bool b_model_y)
  333. {
  334.     const CGlPane& VP = x_GetParent()->GetPort();
  335.             
  336.     TModelRect rc_vis = VP.GetVisibleRect();
  337.     TModelRect rc_lim = VP.GetModelLimitsRect();  
  338.     // assuming that Viewport in the pane has been set properly
  339.     if(! b_model_x) { // adjust horz range to represent pixels
  340.         int max_x = pane.GetViewport().Width() - 1;
  341.         rc_lim.SetHorz(0, max_x);
  342.         rc_vis.SetHorz(0, max_x);
  343.     }
  344.     
  345.     if(! b_model_y) { // adjust vert range to represent pixels
  346.         int max_y = pane.GetViewport().Height() - 1;
  347.         rc_lim.SetVert(0, max_y);
  348.         rc_vis.SetVert(0, max_y);
  349.     }
  350.     pane.SetModelLimitsRect(rc_lim);    
  351.     pane.SetVisibleRect(rc_vis);
  352. }
  353. int     CHitMatrixPane::x_GetAreaByMousePos()
  354. {
  355.     int vp_x = Fl::event_x();
  356.     int vp_y = h() - Fl::event_y();
  357.     if(m_rcMatrix.PtInRect(vp_x, vp_y)) {
  358.         return fMatrixArea;
  359.     } else if(m_rcBottomSeq.PtInRect(vp_x, vp_y)) {
  360.         return fSubjectArea;
  361.     } else if(m_rcLeftSeq.PtInRect(vp_x, vp_y)) {
  362.         return fQueryArea;
  363.     }
  364.     return fOther;
  365. }
  366. void    CHitMatrixPane::x_RenderMouseZoomHandler(CGlPane& pane)
  367. {
  368.     glEnable(GL_BLEND);
  369.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  370.     m_MouseZoomHandler.Render(pane);
  371.     glDisable(GL_BLEND);
  372. }
  373. void    CHitMatrixPane::x_RenderSelHandler(bool b_horz, CGlPane& pane, CLinearSelHandler::ERenderingOption option)
  374. {
  375.     glEnable(GL_BLEND);
  376.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  377.     CLinearSelHandler& handler = b_horz ? m_HorzSelHandler : m_VertSelHandler;
  378.     handler.Render(pane, option);
  379.     glDisable(GL_BLEND);        
  380. }
  381. ////////////////////////////////////////////////////////////////////////////////
  382. /// IAlnMarkHandlerHost implementation
  383. TModelUnit  CHitMatrixPane::MZHH_GetScale(EScaleType type)
  384. {
  385.     const CGlPane& VP = x_GetParent()->GetPort();
  386.     switch(type)    {
  387.     case eCurrent:   return VP.GetScaleX();
  388.     case eMin: return VP.GetMinScaleX();
  389.     case eMax: return VP.GetZoomAllScaleX();
  390.     default: _ASSERT(false); return -1;
  391.     }
  392. }
  393. void    CHitMatrixPane::MZHH_SetScale(TModelUnit scale, const TModelPoint& point) 
  394. {
  395.     x_GetParent()->OnSetScaleX(scale, point);
  396. }
  397. void     CHitMatrixPane::MZHH_ZoomRect(const TModelRect& rc)
  398. {
  399.     x_GetParent()->ZoomRect(rc);
  400. }
  401. void     CHitMatrixPane::MZHH_Scroll(TModelUnit d_x, TModelUnit d_y)
  402. {
  403.     x_GetParent()->Scroll(d_x, d_y);
  404. }
  405. TVPUnit  CHitMatrixPane::MZHH_GetVPPosByY(int y) const
  406. {
  407.     return h() - 1  - y;
  408. }
  409. void    CHitMatrixPane::MZHH_Redraw(void)
  410. {
  411.     redraw();
  412. }
  413. TVPUnit  CHitMatrixPane::HMGH_GetVPPosByY(int y) const
  414. {
  415.     return h() - 1  - y;
  416. }
  417. void    CHitMatrixPane::HMGH_Redraw(void)
  418. {
  419.     redraw();
  420. }
  421. ////////////////////////////////////////////////////////////////////////////////
  422. /// ISelHandlerHost implementation
  423. void CHitMatrixPane::SHH_Redraw()
  424. {
  425.     redraw();
  426. }
  427. TModelUnit  CHitMatrixPane::SHH_GetModelByWindow(int z, EOrientation orient)
  428. {
  429.     switch(orient)  {
  430.     case eHorz: return m_MatrixPane.UnProjectX(z);
  431.     case eVert: return m_MatrixPane.UnProjectY(h() - z);
  432.     default:    _ASSERT(false); return -1;
  433.     }
  434. }
  435. TVPUnit     CHitMatrixPane::SHH_GetWindowByModel(TModelUnit z, EOrientation orient)
  436. {
  437.     switch(orient)  {
  438.     case eHorz: return m_MatrixPane.ProjectX(z);
  439.     case eVert: return h() - m_MatrixPane.ProjectY(z);
  440.     default:    _ASSERT(false); return -1;
  441.     }
  442. }
  443. void    CHitMatrixPane::x_OnShowPopup()
  444. {
  445.     x_GetParent()->OnShowPopup();
  446. }
  447. END_NCBI_SCOPE
  448. /*
  449.  * ===========================================================================
  450.  * $Log: hit_matrix_pane.cpp,v $
  451.  * Revision 1000.3  2004/06/01 21:10:58  gouriano
  452.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  453.  *
  454.  * Revision 1.9  2004/05/21 22:27:54  gorelenk
  455.  * Added PCH ncbi_pch.hpp
  456.  *
  457.  * Revision 1.8  2004/02/12 21:05:21  yazhuk
  458.  * Added GetSelectedHitElemsRect() const; implemented  x_OnShowPopup();
  459.  * Enabled "offset" mode in CGlPanes
  460.  *
  461.  * Revision 1.7  2004/01/08 19:48:05  yazhuk
  462.  * Minor clean-up
  463.  *
  464.  * Revision 1.6  2003/12/10 16:57:18  yazhuk
  465.  * Updated implementation of  IMouseZoomHandlerHost interface.
  466.  *
  467.  * Revision 1.5  2003/12/06 04:19:13  ucko
  468.  * Avoid make_pair<>, which is broken on WorkShop.
  469.  *
  470.  * Revision 1.4  2003/12/05 17:35:23  yazhuk
  471.  * Functions for retrieving selection, support for coloration by score
  472.  *
  473.  * Revision 1.3  2003/12/01 17:07:13  yazhuk
  474.  * Eliminated IHitMatrixParent; refactored event handling; added support for linear selection.
  475.  *
  476.  * Revision 1.2  2003/11/18 17:57:23  yazhuk
  477.  * Fixed GCC warnings
  478.  *
  479.  * Revision 1.1  2003/11/17 20:41:19  yazhuk
  480.  * Initial revision
  481.  *
  482.  * ===========================================================================
  483.  */