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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: alnmulti_widget.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 21:07:16  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.49
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: alnmulti_widget.cpp,v 1000.5 2004/06/01 21:07:16 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 <gui/widgets/aln_multiple/alnmulti_ds.hpp>
  41. #include <gui/widgets/aln_multiple/alnmulti_settings.hpp>
  42. #include <gui/widgets/aln_multiple/alnmulti_widget.hpp>
  43. #include <gui/types.hpp>
  44. #include <gui/objutils/utils.hpp>
  45. #include <FL/Fl.H>
  46. BEGIN_NCBI_SCOPE
  47. USING_SCOPE(objects);
  48. ////////////////////////////////////////////////////////////////////////////////
  49. /// class CAlnMultiWidget
  50. CAlnMultiWidget::CAlnMultiWidget(int PosX, int PosY, int Width, int Height,
  51.                                  const char* label)
  52.     : Fl_Group(PosX, PosY, Width, Height, label),
  53.       m_pDataSource(NULL), 
  54.       m_pListener(NULL),
  55.       m_pModel(NULL),
  56.       m_pAlignPane(NULL),
  57.       m_pScrollX(NULL),
  58.       m_pScrollY(NULL),
  59.       m_pPopupMenu(NULL)
  60. {
  61.     end();  
  62. }
  63. void    CAlnMultiWidget::Create()
  64. {
  65.     x_CreateModel();
  66.     begin();
  67.     x_CreateControls();
  68.     end(); 
  69.     TVPRect rcVP;
  70.     rcVP.SetSize(m_pAlignPane->GetAlignVPWidth(), m_pAlignPane->GetAlignVPHeight());
  71.     x_GetAlignPort().SetViewport(rcVP);
  72.     m_pModel->SetPortLimits();
  73. }
  74. CAlnMultiWidget::~CAlnMultiWidget()
  75. {
  76. }
  77. BEGIN_CMD_MAP(CAlnMultiWidget, CCommandTarget)
  78.     ON_COMMAND(eCmdZoomIn,  &CAlnMultiWidget::OnZoomIn)
  79.     ON_COMMAND(eCmdZoomOut, &CAlnMultiWidget::OnZoomOut)
  80.     ON_COMMAND(eCmdZoomAll, &CAlnMultiWidget::OnZoomAll)
  81.     ON_COMMAND(eCmdZoomSel, &CAlnMultiWidget::OnZoomSelection)
  82.     ON_COMMAND(eCmdZoomSeq, &CAlnMultiWidget::OnZoomSequence)
  83.     ON_COMMAND(eCmdSetSelMaster,    &CAlnMultiWidget::MakeSelectedRowMaster)
  84.     ON_COMMAND(eCmdSetConsMaster,   &CAlnMultiWidget::MakeConsensusRowMaster)
  85.     ON_COMMAND(eCmdUnsetMaster,     &CAlnMultiWidget::UnsetMaster)
  86.     ON_COMMAND(eCmdResetSelection,  &CAlnMultiWidget::OnResetSelection)
  87.     ON_COMMAND(eCmdMarkSelected,    &CAlnMultiWidget::OnMarkSelected)
  88.     ON_COMMAND(eCmdUnMarkSelected,  &CAlnMultiWidget::OnUnMarkSelected)
  89.     ON_COMMAND(eCmdUnMarkAll,   &CAlnMultiWidget::OnUnMarkAll)
  90.     ON_COMMAND(eCmdHideSelected,   &CAlnMultiWidget::OnHideSelected)
  91.     ON_COMMAND(eCmdShowAll,   &CAlnMultiWidget::OnShowAll)
  92.     ON_COMMAND(eCmdMoveSelectedUp,   &CAlnMultiWidget::OnMoveSelectedUp)
  93. END_CMD_MAP()
  94. ////////////////////////////////////////////////////////////////////////////////
  95. // IAlnMultiPaneParent implementation
  96. IAlnMultiDataSource*  CAlnMultiWidget::GetDataSource()
  97. {
  98.     return m_pDataSource;
  99. }
  100. const IAlnMultiDataSource*  CAlnMultiWidget::GetDataSource() const
  101. {
  102.     return m_pDataSource;
  103. }
  104. void    CAlnMultiWidget::SetListener(CAlnMultiWidgetListener* listener)
  105. {
  106.     m_pListener = listener;
  107. }
  108. /// changes visibility state for given vector of rows to "b_visible"
  109. void    CAlnMultiWidget::SetVisible(const vector<TNumrow>& rows, bool b_visible, 
  110.                                     bool b_invert_others)
  111. {
  112.     m_pModel->SetVisible(rows, b_visible, b_invert_others);
  113.     x_AdjustVisible(false);
  114.     x_SetScrollbars();
  115.     x_RedrawControls();
  116. void    CAlnMultiWidget::Select(const vector<TNumrow>& rows, bool b_select, 
  117.                                 bool b_invert_others)
  118. {
  119.     if(m_pModel)    {
  120.         CAlnMultiModel::TIndexVector  vsel;
  121.         vsel.reserve(rows.size());
  122.         
  123.         for( size_t i = 0; i < rows.size();  i++  ) {
  124.             CAlnMultiModel::TIndex index = m_pModel->GetLineByRowNum(rows[i]);
  125.             vsel.push_back(index);
  126.         }
  127.         
  128.         m_pModel->SLM_SelectItems(vsel, true);
  129.     }
  130. }
  131. void    CAlnMultiWidget::SetStyleCatalog(const CRowStyleCatalog* catalog)
  132. {
  133.     m_pModel->SetStyleCatalog(catalog);
  134. }
  135. const CWidgetDisplayStyle*      CAlnMultiWidget::GetDisplayStyle() const
  136. {
  137.     return m_pModel->GetDisplayStyle();
  138. }
  139.     
  140. void    CAlnMultiWidget::SetDataSource(IAlnMultiDataSource* p_ds)
  141. {
  142.     _ASSERT(m_pModel);
  143.     m_pDataSource = p_ds;
  144.     m_pModel->SetDataSource(m_pDataSource);
  145.     
  146.     x_UpdateOnDataChanged();
  147. }
  148. CAlnMultiModel* CAlnMultiWidget::GetModel()
  149. {
  150.     return m_pModel;
  151. }
  152. const CAlnMultiModel* CAlnMultiWidget::GetModel() const
  153. {
  154.     return m_pModel;
  155. }
  156. CAlnMultiWidget::TNumrow     CAlnMultiWidget::GetRowNumByLine(TLine line) const
  157. {
  158.     IAlignRow* p_row = m_pModel->GetRowByLine(line);
  159.     return p_row->GetRowNum();
  160. }
  161. /// return -1 if "row" does not exist or is not visible
  162. int     CAlnMultiWidget::GetLineByRowNum(TNumrow row) const
  163. {
  164.     return m_pModel->GetLineByRowNum(row);
  165. }
  166. void CAlnMultiWidget::OnChildResize()
  167. {
  168.     x_OnResize();
  169. }
  170. void    CAlnMultiWidget::OnSetScaleX(TModelUnit scale_x, const TModelPoint& point)
  171. {
  172.     x_GetAlignPort().SetScaleRefPoint(scale_x, x_GetAlignPort().GetScaleY(), point);    
  173.     x_UpdateOnZoom();
  174. }
  175. void    CAlnMultiWidget::OnZoomRect(const TModelRect& rc)
  176. {
  177.     TSeqPos left = (TSeqPos) floor(rc.Left());
  178.     TSeqPos right = (TSeqPos) ceil(rc.Right());
  179.     x_ZoomToRange(left, right);
  180. }
  181. void    CAlnMultiWidget::OnScroll(TModelUnit d_x, TModelUnit d_y)
  182. {
  183.     x_GetAlignPort().Scroll(d_x, d_y);    
  184.     x_UpdateOnZoom();
  185. }
  186. void    CAlnMultiWidget::OnRowChanged(IAlignRow* p_row)
  187. {
  188.     x_UpdateOnRowHChanged();
  189. }
  190. void    CAlnMultiWidget::OnShowPopup()
  191. {
  192.     m_pPopupMenu = new CPopupMenu(x(), y(), w(), h());
  193.     m_pPopupMenu->SetCmdTarget(static_cast<CCommandTarget*>(this));
  194.     add(m_pPopupMenu);
  195.     // create menu
  196.     CMenuItem* root = new CMenuItem("Root");
  197.     root->AddSubItem(new CMenuItem("Zoom In", eCmdZoomIn));
  198.     root->AddSubItem(new CMenuItem("Zoom Out", eCmdZoomOut));
  199.     root->AddSubItem(new CMenuItem("Zoom All", eCmdZoomAll));
  200.     root->AddSubItem(new CMenuItem("Zoom to Sequence", eCmdZoomSeq));
  201.     root->AddSubItem(new CMenuItem("Zoom Selection", eCmdZoomSel));
  202.     root->AddSubItem(new CMenuItem());
  203.     CMenuItem* master = new CMenuItem("Master");
  204.     root->AddSubItem(master);
  205.     master->AddSubItem(new CMenuItem("Set Selected", eCmdSetSelMaster));
  206.     master->AddSubItem(new CMenuItem("Set Consensus", eCmdSetConsMaster));
  207.     master->AddSubItem(new CMenuItem("Unset", eCmdUnsetMaster));
  208.     root->AddSubItem(new CMenuItem());
  209.     root->AddSubItem(new CMenuItem("Hide Selected", eCmdHideSelected));
  210.     root->AddSubItem(new CMenuItem("Show All", eCmdShowAll));
  211.         
  212.     // show menu
  213.     m_pPopupMenu->SetItems(root);
  214.     
  215.     m_pPopupMenu->popup(); 
  216.     remove(m_pPopupMenu);
  217. }
  218. void    CAlnMultiWidget::OnNotify(ENotification notification)
  219. {
  220.     if(m_pListener) {
  221.         m_pListener->OnNotify(notification);
  222.     }
  223. }
  224. /// overriding base class implementation
  225. bool    CAlnMultiWidget::IsRendererFocused()
  226. {
  227.     return Fl::focus() == m_pAlignPane;
  228. }
  229. // end IAlnMultiPaneParent implementation
  230. ////////////////////////////////////////////////////////////////////////////////
  231. void    CAlnMultiWidget::resize(int x, int y, int w, int h)
  232. {
  233.     Fl_Group::resize(x, y, w, h); 
  234.     x_OnResize();
  235. }
  236. void    CAlnMultiWidget::OnZoomIn()
  237. {
  238.     if(x_GetAlignPort().IsZoomInAvaiable())  {
  239.         x_GetAlignPort().ZoomInCenter();        
  240.         x_UpdateOnZoom();
  241.     }
  242. }
  243. void CAlnMultiWidget::OnZoomOut()
  244. {    
  245.     if(x_GetAlignPort().IsZoomOutAvaiable())  {
  246.         x_GetAlignPort().ZoomOutCenter();
  247.         x_UpdateOnZoom();
  248.     }
  249. }
  250. void CAlnMultiWidget::OnZoomSequence()
  251. {
  252.     double w = 1.5 * GetDisplayStyle()->m_SeqFont.GetMetric(CGlBitmapFont::eMetric_MaxCharWidth);
  253.     x_GetAlignPort().SetScale(1 / w, x_GetAlignPort().GetScaleY());
  254.     x_UpdateOnZoom();
  255. }
  256. void CAlnMultiWidget::OnZoomAll()
  257. {    
  258.     x_GetAlignPort().ZoomAll();
  259.     x_UpdateOnZoom();
  260. }
  261. void CAlnMultiWidget::OnZoomSelection()
  262. {
  263.     CRange<TSeqPos> sel_r = m_pAlignPane->GetSelectionLimits();
  264.     if(sel_r.NotEmpty()) {    
  265.         x_ZoomToRange(sel_r.GetFrom(), sel_r.GetTo());
  266.     }
  267.     x_UpdateOnZoom();
  268. }
  269. void CAlnMultiWidget::MakeSelectedRowMaster()
  270. {
  271.     if(m_pModel->SLM_GetSelectedCount() == 1)  {
  272.         CAlnMultiModel::TIndexVector vIndices;
  273.         m_pModel->SLM_GetSelectedIndices(vIndices);
  274.         int SelIndex = vIndices[0]; // take the first selected item
  275.         TNumrow iRow = GetRowNumByLine(SelIndex);
  276.         x_UpdateOnSwitchMaster(iRow);
  277.     }
  278. }
  279. void    CAlnMultiWidget::x_ZoomToRange(TSeqPos from, TSeqPos to)
  280. {
  281.     TModelRect rcV = x_GetAlignPort().GetVisibleRect();
  282.     rcV.SetLeft(from);
  283.     rcV.SetRight(to + 1);
  284.     x_GetAlignPort().ZoomRect(rcV);
  285.     
  286.     x_UpdateOnZoom();
  287. }
  288. void    CAlnMultiWidget::x_MakeVisibleHorz(TSeqPos pos)
  289. {
  290.     x_MakeVisibleHorz(pos, pos);
  291. }
  292. void    CAlnMultiWidget::x_MakeVisibleHorz(TSeqPos from, TSeqPos to)
  293. {
  294.     TModelRect rcV = x_GetAlignPort().GetVisibleRect();
  295.     TModelUnit sh_left = from - rcV.Left();
  296.     TModelUnit sh_right = to + 1 - rcV.Right();
  297.     
  298.     TModelUnit sh = 0;
  299.     if(sh_left < 0) { // shift left 
  300.         sh = sh_left;
  301.     } else if(sh_right > 0) {
  302.         sh = min(sh_right, sh_left);
  303.     }
  304.     if(sh != 0) {
  305.         x_GetAlignPort().Scroll(sh, 0);   
  306.         x_UpdateOnZoom();
  307.     }
  308. }
  309. CGlPane&    CAlnMultiWidget::x_GetAlignPort()
  310. {
  311.     _ASSERT(m_pModel);
  312.     return m_pModel->GetAlignPort();
  313. }
  314. void    CAlnMultiWidget::UnsetMaster(void)
  315. {
  316.     x_UpdateOnSwitchMaster(-1);
  317. }
  318. void    CAlnMultiWidget::MakeConsensusRowMaster(void)
  319. {
  320.     int iRow = GetDataSource()->GetConsensusRow();
  321.     if(iRow > -1)  {
  322.         x_UpdateOnSwitchMaster(iRow);
  323.     }
  324. }
  325. void CAlnMultiWidget::OnResetSelection(void)
  326. {
  327.     m_pAlignPane->ResetSelection(true);
  328. }
  329. void    CAlnMultiWidget::GetSelectedIds(TRSeqIdVector& ids) const
  330. {
  331.     if(GetModel()  &&  GetDataSource())  {
  332.         CAlnMultiModel::TIndexVector vindices;
  333.         GetModel()->SLM_GetSelectedIndices(vindices);
  334.         ITERATE(CAlnMultiModel::TIndexVector, itInd, vindices)  {
  335.             TNumrow row = GetRowNumByLine(*itInd);
  336.             if(GetDataSource()->CanGetId(row))
  337.             {
  338.                 const CSeq_id& id = GetDataSource()->GetSeqId(row);
  339.                 ids.push_back(CConstRef<CSeq_id>(&id));
  340.             }
  341.         }
  342.     } else _ASSERT(false);
  343. }
  344. void    CAlnMultiWidget::SetSelectedIds(const TRSeqIdVector& ids, CScope& scope)
  345. {
  346.     if(GetModel()  &&  GetDataSource())  {
  347.         vector<CAlnVec::TNumrow> sel_rows;
  348.         ITERATE(TRSeqIdVector, it, ids) {
  349.             const CSeq_id& id = **it;
  350.             //find row corresponding to id
  351.             int n_rows = GetDataSource()->GetNumRows();
  352.             for( CAlnVec::TNumrow row = 0; row < n_rows; row++ )  {
  353.                 if((GetModel()->GetRowState(row) & IAlignRow::fItemHidden) == 0) {
  354.                     const CSeq_id&  row_id = GetDataSource()->GetSeqId(row);
  355.                     if(CSeqUtils::Match(row_id, id, &scope)) {
  356.                         sel_rows.push_back(row);
  357.                         break;
  358.                     }
  359.                 }
  360.             }
  361.         }
  362.         
  363.         Select(sel_rows, true);   
  364.     }
  365. }
  366. const   CAlnMultiWidget::TRangeColl&   CAlnMultiWidget::GetSelection(void) const
  367. {
  368.     return m_pAlignPane->GetSelection();
  369. }
  370. void    CAlnMultiWidget::OnMarkSelected(void)
  371. {  
  372.     const TRangeColl&  C = m_pAlignPane->GetSelection();
  373.     m_pAlignPane->MarkSelectedRows(C, true);
  374.     m_pAlignPane->redraw();
  375. }
  376. void CAlnMultiWidget::OnUnMarkSelected()
  377. {
  378.     const TRangeColl&  C = m_pAlignPane->GetSelection();
  379.     m_pAlignPane->MarkSelectedRows(C, false);
  380.     m_pAlignPane->redraw();
  381. }
  382. void CAlnMultiWidget::OnUnMarkAll(void)
  383. {
  384.     m_pAlignPane->UnMarkAll();
  385.     m_pAlignPane->redraw();
  386. }
  387. void CAlnMultiWidget::OnHideSelected()
  388. {
  389.     CAlnMultiModel::TIndexVector vIndices;
  390.     
  391.     m_pModel->SLM_GetSelectedIndices(vIndices);
  392.     m_pModel->SLM_SelectAll(false);
  393.     size_t N = vIndices.size();
  394.     vector<TNumrow> rows;
  395.     rows.resize(N);
  396.     for(size_t i = 0;  i<N; i++ )   {
  397.         rows[i] = GetRowNumByLine(vIndices[i]);
  398.     }
  399.     SetVisible(rows, false);
  400. }
  401. void CAlnMultiWidget::OnShowAll()
  402. {
  403.     m_pModel->ShowAll();
  404.     x_AdjustVisible(false);
  405.     x_SetScrollbars();
  406.     x_RedrawControls();
  407. }
  408. void CAlnMultiWidget::OnMoveSelectedUp()
  409. {
  410.     if(m_pModel)    {
  411.         vector<TNumrow> rows;
  412.         m_pModel->GetSelectedRows(rows);
  413.         if(rows.size()) {
  414.             m_pModel->SetRowOrder(rows);
  415.             x_RedrawControls();
  416.         }
  417.     }    
  418. }
  419. void    CAlnMultiWidget::UpdateSortOrder(void)
  420. {
  421.     m_pModel->UpdateSortOrder();
  422.     x_RedrawControls();
  423. }
  424. void    CAlnMultiWidget::GetMarks(TPSeqLocList& ls_locs) const
  425. {
  426.     const CAlnMultiPane::TRowToMarkMap& map = m_pAlignPane->GetMarks();
  427.     
  428.     ITERATE(CAlnMultiPane::TRowToMarkMap, it_m, map)  { //for each marked row       
  429.         TNumrow row = it_m->first;
  430.         if(GetDataSource()->CanGetId(row))  {
  431.             const CSeq_id& seq_id = GetDataSource()->GetSeqId(row);        
  432.             // create CSeq_loc
  433.             ls_locs.push_back(new CSeq_loc());
  434.             CSeq_loc& seq_loc = *ls_locs.back();
  435.         
  436.             // put intervals        
  437.             CSeq_loc::TPacked_int& p_int = seq_loc.SetPacked_int();
  438.         
  439.             const TRangeColl& mark = it_m->second;
  440.             ITERATE(TRangeColl, it_r, mark) { // for each range in mark
  441.                 p_int.AddInterval(seq_id, it_r->GetFrom(), it_r->GetTo());
  442.             }
  443.         }
  444.     }
  445. }
  446. void CAlnMultiWidget::x_CreateControls()
  447. {
  448.     _ASSERT(! m_pAlignPane  && ! m_pScrollX  && ! m_pScrollY);
  449.     const int kScrollbarSize = CAlnMultiSettings::GetScrollbarSize();
  450.     int client_w = w() - kScrollbarSize;
  451.     int client_h = h() - kScrollbarSize;
  452.     m_pAlignPane = new CAlnMultiPane(x(), y(), client_w, client_h);
  453.     IAlnMultiPaneParent* pWidget = static_cast<IAlnMultiPaneParent*>(this);
  454.     m_pAlignPane->SetWidget(pWidget);
  455.     m_pAlignPane->SetContext(m_pModel);
  456.     
  457.     m_pModel->SLM_AddSLView(static_cast<TNumrowSelListView*>(m_pAlignPane));
  458.     
  459.     // scrollbars
  460.     m_pScrollX = new Fl_Scrollbar(x(), y() + client_h, client_w, kScrollbarSize);
  461.     m_pScrollX->type(FL_HORIZONTAL);
  462.     m_pScrollX->callback(CAlnMultiWidget::x_OnScrollX, this );
  463.     
  464.     m_pScrollY = new Fl_Scrollbar(x() + client_w, y(), kScrollbarSize, client_h);
  465.     m_pScrollY->type(FL_VERTICAL);
  466.     m_pScrollY->callback(CAlnMultiWidget::x_OnScrollY, this );
  467.     
  468.     resizable(m_pAlignPane);
  469.     end();
  470. }
  471. void CAlnMultiWidget::x_SetScrollbars()
  472. {
  473.     TModelRect rcAll = x_GetAlignPort().GetModelLimitsRect();
  474.     TModelRect rcVisible = x_GetAlignPort().GetVisibleRect();
  475.     
  476.     if (x_GetAlignPort().NeedsScrollX()) { 
  477.         m_pScrollX->value((int) rcVisible.Left(), (int) rcVisible.Width(), 
  478.                           (int) rcAll.Left(), (int)rcAll.Width());
  479.     } else {
  480.         m_pScrollX->value(0, 0, 0, 0);
  481.     }
  482.     if (x_GetAlignPort().NeedsScrollY()) {
  483.         m_pScrollY->value((int) rcVisible.Top(), (int) -rcVisible.Height(), 
  484.                           (int) rcAll.Top(), (int) -rcAll.Height());
  485.     } else {
  486.         m_pScrollY->value(0, 0, 0, 0);
  487.     }
  488. }
  489. void CAlnMultiWidget::x_OnResize()
  490. {
  491.     TVPRect rcVP;
  492.     rcVP.SetSize(m_pAlignPane->GetAlignVPWidth(), m_pAlignPane->GetAlignVPHeight());
  493.     x_GetAlignPort().SetViewport(rcVP);
  494.     x_AdjustVisible(false);
  495.     x_SetScrollbars();
  496.     
  497.     // do not redraw, FLTK will do it for us - 
  498. }
  499. void CAlnMultiWidget::x_RedrawControls()
  500. {
  501.     m_pAlignPane->redraw();
  502. }
  503. ////////////////////////////////////////////////////////////////////////////////
  504. /// Update handlers
  505. void CAlnMultiWidget::x_UpdateOnDataChanged(bool b_reset)
  506. {
  507.     if(GetDataSource())   {
  508.         x_AdjustVisible(b_reset);
  509.     }
  510.     m_pAlignPane->ResetSelection(false);
  511.     m_pAlignPane->UnMarkAll();
  512.     x_SetScrollbars();
  513.     
  514.     m_pAlignPane->Update();    
  515.     x_RedrawControls();
  516. }
  517. void    CAlnMultiWidget::x_AdjustVisible(bool b_reset)
  518. {
  519.     TModelRect rcV; 
  520.     if(b_reset) {
  521.         rcV = x_GetAlignPort().GetModelLimitsRect();
  522.         rcV.SetTop(0);
  523.     } else {
  524.         rcV = x_GetAlignPort().GetVisibleRect();
  525.     }
  526.     rcV.SetBottom(rcV.Top() + m_pAlignPane->GetAlignVPHeight());
  527.     x_GetAlignPort().SetVisibleRect(rcV);
  528.     x_GetAlignPort().AdjustToLimits();
  529. }
  530. void CAlnMultiWidget::x_UpdateOnRowHChanged()
  531. {
  532.     _ASSERT(GetDataSource());
  533.     
  534.     // updating model
  535.     m_pModel->UpdateOnRowHChanged(); 
  536.     
  537.     // updating representation    
  538.     x_AdjustVisible(false);
  539.     x_SetScrollbars();
  540.     x_RedrawControls();
  541. }
  542. void CAlnMultiWidget::x_UpdateOnSwitchMaster(TNumrow NewMasterRow)
  543. {
  544.     TModelRect rcV = x_GetAlignPort().GetVisibleRect();
  545.     TSignedSeqPos SeqStart, SeqStop;
  546.     
  547.     if(GetDataSource()->GetAnchor() == NewMasterRow)
  548.         return;
  549.          
  550.     // choose row that will be used for coordinate translations
  551.     TNumrow SelRow = (NewMasterRow != -1)  ? NewMasterRow : GetDataSource()->GetAnchor();
  552.     TRangeColl SeqSelection; //selection in coordinates of SelRow
  553.     if(SelRow != -1)    {
  554.         TSeqPos AlnStart((TSeqPos) rcV.Left());
  555.         TSeqPos AlnStop((TSeqPos) rcV.Right());
  556.         SeqStart = GetDataSource()->GetSeqPosFromAlnPos(SelRow, AlnStart,
  557.                                                      IAlnMultiDataSource::
  558.                                                      TSearchDirection::eRight);
  559.         SeqStop = GetDataSource()->GetSeqPosFromAlnPos(SelRow, AlnStop,
  560.                                                      IAlnMultiDataSource::
  561.                                                      TSearchDirection::eRight);
  562.         // convert selection to SelRow coordinates       
  563.         const TRangeColl& Selection = m_pAlignPane->GetSelection();
  564.         ITERATE(TRangeColl, it, Selection)  {
  565.             TSeqPos Start =
  566.                 GetDataSource()->GetSeqPosFromAlnPos(SelRow, it->GetFrom(),
  567.                                                    IAlnMultiDataSource::
  568.                                                    TSearchDirection::eRight);
  569.             TSeqPos Stop =
  570.                 GetDataSource()->GetSeqPosFromAlnPos(SelRow, it->GetTo(),
  571.                                                    IAlnMultiDataSource::
  572.                                                    TSearchDirection::eLeft);
  573.             SeqSelection.CombineWith(TSeqRange(Start, Stop));
  574.         }        
  575.     }
  576.     m_pModel->SetMasterRow(NewMasterRow);
  577.     
  578.     if(SelRow != -1)    {
  579.         // calculate new visible rect based on saved positions
  580.         TSignedSeqPos AlnStart = GetDataSource()->GetAlnPosFromSeqPos(SelRow, SeqStart);
  581.         TSignedSeqPos AlnStop = GetDataSource()->GetAlnPosFromSeqPos(SelRow, SeqStop);
  582.     
  583.         TModelRect rcNewV(AlnStart, rcV.Bottom(), AlnStop, rcV.Top());            
  584.         x_GetAlignPort().SetVisibleRect(rcNewV);
  585.         // convert Selection back to Alignment space
  586.         TRangeColl AlnSelection;
  587.         const TRangeColl& C = SeqSelection;
  588.         ITERATE(TRangeColl, it, C)  {
  589.             TSeqPos Start = GetDataSource()->GetAlnPosFromSeqPos(SelRow, it->GetFrom());
  590.             TSeqPos Stop = GetDataSource()->GetAlnPosFromSeqPos(SelRow, it->GetTo());
  591.             AlnSelection.CombineWith(TSeqRange(Start, Stop));
  592.         }
  593.         m_pAlignPane->SetSelection(AlnSelection, false);
  594.     }     
  595.     
  596.     m_pAlignPane->Update();
  597.     x_AdjustVisible(false);
  598.     x_SetScrollbars();
  599.     
  600.     x_RedrawControls();  
  601. }
  602. void CAlnMultiWidget::x_UpdateOnZoom()
  603. {
  604.     x_SetScrollbars(); 
  605.     m_pAlignPane->Update();
  606.     x_RedrawControls();
  607. }
  608. ////////////////////////////////////////////////////////////////////////////////
  609. /// Scroll callbacks
  610. void CAlnMultiWidget::x_OnScrollX(Fl_Widget* pW, void* pData)
  611. {
  612.     CAlnMultiWidget* pCont = reinterpret_cast<CAlnMultiWidget*>(pData);
  613.     
  614.     int V = pCont->m_pScrollX->value();
  615.     double dX = V - pCont->x_GetAlignPort().GetVisibleRect().Left();
  616.     pCont->x_GetAlignPort().Scroll(dX, 0);
  617.     
  618.     pCont->x_RedrawControls();
  619. }
  620. void CAlnMultiWidget::x_OnScrollY(Fl_Widget* pW, void* pData)
  621. {
  622.     CAlnMultiWidget* pCont = reinterpret_cast<CAlnMultiWidget*>(pData);
  623.     
  624.     int V = pCont->m_pScrollY->value();
  625.     double dY = V - pCont->x_GetAlignPort().GetVisibleRect().Top();
  626.     pCont->x_GetAlignPort().Scroll(0, dY);
  627.     
  628.     pCont->x_RedrawControls();
  629. }
  630. END_NCBI_SCOPE
  631. /*
  632.  * ===========================================================================
  633.  * $Log: alnmulti_widget.cpp,v $
  634.  * Revision 1000.5  2004/06/01 21:07:16  gouriano
  635.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.49
  636.  *
  637.  * Revision 1.49  2004/05/21 22:27:52  gorelenk
  638.  * Added PCH ncbi_pch.hpp
  639.  *
  640.  * Revision 1.48  2004/05/10 17:46:35  yazhuk
  641.  * Addressed GCC warnings
  642.  *
  643.  * Revision 1.47  2004/05/03 13:23:57  dicuccio
  644.  * gui/utils --> gui/objutils where needed
  645.  *
  646.  * Revision 1.46  2004/04/29 21:39:56  johnson
  647.  * make viewport reset in x_UpdateOnDataChanged optional
  648.  *
  649.  * Revision 1.45  2004/04/07 13:07:27  dicuccio
  650.  * Changed use of Match() - scope is optional pointer
  651.  *
  652.  * Revision 1.44  2004/04/06 16:04:59  yazhuk
  653.  * Implemented OnMoveSelectedUp() command handler
  654.  *
  655.  * Revision 1.43  2004/04/02 16:34:35  yazhuk
  656.  * Implemented support for selection broadcasting
  657.  *
  658.  * Revision 1.42  2004/04/02 15:55:17  dicuccio
  659.  * Added call to redraw() in OnHideSelected()
  660.  *
  661.  * Revision 1.41  2004/03/25 13:18:49  dicuccio
  662.  * MInor code reformatting
  663.  *
  664.  * Revision 1.40  2004/03/24 19:20:32  yazhuk
  665.  * Fixed initilization/destruction
  666.  *
  667.  * Revision 1.39  2004/03/18 17:07:11  yazhuk
  668.  * Added "b_invert_others" argument to SetVisible()
  669.  *
  670.  * Revision 1.38  2004/03/17 20:11:32  yazhuk
  671.  * Refined CAlnMultiWidget interface and implementation
  672.  *
  673.  * Revision 1.37  2004/03/11 17:50:41  dicuccio
  674.  * Updated typedefs: dropped TDimension, TPosition, TIndex, TColor; use TSeqRange
  675.  * instead of TRange
  676.  *
  677.  * Revision 1.36  2004/03/09 21:04:23  yazhuk
  678.  * Separated part of CAlnMultiWidget class into CAlnMultiModel
  679.  *
  680.  * Revision 1.35  2004/03/08 15:40:18  yazhuk
  681.  * Implemented new functions for IAlnMultiPaneParent interface
  682.  *
  683.  * Revision 1.34  2004/02/04 20:05:08  yazhuk
  684.  * Clean-up
  685.  *
  686.  * Revision 1.33  2004/01/22 16:33:39  yazhuk
  687.  * Fixed FL_MOVE handling
  688.  *
  689.  * Revision 1.32  2004/01/15 20:13:25  yazhuk
  690.  * Implemented popup menus, added UpdateSortOrder() , renamed some x_Update...
  691.  * functions. Fixed focus handling bug in x_UpdateRowOrder()
  692.  *
  693.  * Revision 1.31  2004/01/08 19:40:44  yazhuk
  694.  * Implemented row sorting, bugfixes in hiding/showing rows
  695.  *
  696.  * Revision 1.30  2003/12/22 16:26:05  yazhuk
  697.  * Refactored Update system, optimized visibility support implementation
  698.  *
  699.  * Revision 1.29  2003/12/18 21:19:48  yazhuk
  700.  * Major refactoring - implemented rows hiding, support for display styles
  701.  *
  702.  * Revision 1.28  2003/12/17 19:15:06  yazhuk
  703.  * Added GetSelection()
  704.  *
  705.  * Revision 1.27  2003/12/10 17:07:25  yazhuk
  706.  * Added "ref. point" argument to OnSetScaleX(). Basic support for popup menus.
  707.  *
  708.  * Revision 1.26  2003/12/08 16:41:10  yazhuk
  709.  * Fixed scrollbar setup
  710.  *
  711.  * Revision 1.25  2003/12/01 22:35:52  yazhuk
  712.  * Fixed GCC warnings
  713.  *
  714.  * Revision 1.24  2003/12/01 16:57:41  yazhuk
  715.  * Added OnZoomRect() and OnScroll()
  716.  *
  717.  * Revision 1.23  2003/11/26 16:52:00  johnson
  718.  * switch IAlnMultiDataSource to use CAlnMap::ESearchDirection instead of it's
  719.  * own ESearchDirection
  720.  *
  721.  * Revision 1.22  2003/11/18 17:58:08  yazhuk
  722.  * Fixed GCC warnings
  723.  *
  724.  * Revision 1.21  2003/11/06 20:14:56  dicuccio
  725.  * Added USING_SCOPE(objects) to implementation file
  726.  *
  727.  * Revision 1.20  2003/11/03 16:57:38  yazhuk
  728.  * Added OnRowChanged(), x_UpdateOnRowChanged() functions
  729.  *
  730.  * Revision 1.19  2003/10/31 22:25:37  ucko
  731.  * Properly capitalize FL/Fl.H
  732.  *
  733.  * Revision 1.18  2003/10/29 23:33:12  yazhuk
  734.  * Migrated to new classes, did a lot of refactoring
  735.  *
  736.  * Revision 1.17  2003/10/20 15:49:06  yazhuk
  737.  * Implemented OnSetScaleX(). Clean-up.
  738.  *
  739.  * Revision 1.16  2003/10/15 21:23:08  yazhuk
  740.  * Migrated from using CAlnVec to accessing data via "generic" interface in IAlnMultiDataSource.
  741.  *
  742.  * Revision 1.15  2003/10/10 18:57:41  yazhuk
  743.  * Added scoring, OnZoomSequence() and fonts
  744.  *
  745.  * Revision 1.14  2003/10/07 13:44:59  dicuccio
  746.  * Code beautification
  747.  *
  748.  * Revision 1.13  2003/10/04 16:47:37  dicuccio
  749.  * Fix for compilation on gcc
  750.  *
  751.  * Revision 1.12  2003/10/03 16:26:36  yazhuk
  752.  * Added command map
  753.  *
  754.  * Revision 1.11  2003/09/29 15:53:42  dicuccio
  755.  * Reordered #include statements
  756.  *
  757.  * Revision 1.10  2003/09/29 13:40:31  yazhuk
  758.  * Added GetMarks() function, fixed bug with setting viewport limits
  759.  *
  760.  * Revision 1.9  2003/09/25 20:46:13  yazhuk
  761.  * Update CGlPane calls, added scale limitation
  762.  *
  763.  * Revision 1.8  2003/09/24 18:33:16  dicuccio
  764.  * Code reformatting.  Changed to match API in new data source
  765.  *
  766.  * Revision 1.7  2003/09/23 20:51:45  yazhuk
  767.  * Updated IAlnMultiPaneParent member function implementation, added Mark manipulation functions, removed code working with Consensus Row
  768.  *
  769.  * Revision 1.6  2003/09/10 20:45:20  yazhuk
  770.  * Merged 4 Pane classes into CAlnMultiPane class
  771.  *
  772.  * Revision 1.5  2003/09/08 20:42:04  yazhuk
  773.  * Added Selection translation for switching Master Row
  774.  *
  775.  * Revision 1.4  2003/09/08 16:17:27  yazhuk
  776.  * Support for anchoring sequences, "Zoom Selection" and 'Reset Selection" operations, bugfixes
  777.  *
  778.  * Revision 1.3  2003/09/02 16:53:57  yazhuk
  779.  * GCC compilation fixes
  780.  *
  781.  * Revision 1.2  2003/08/28 18:26:16  yazhuk
  782.  * Modified to be used with new CAlnMultiWidget
  783.  *
  784.  * Revision 1.1  2003/07/14 17:36:47  dicuccio
  785.  * Initial revision
  786.  *
  787.  * ===========================================================================
  788.  */