alnmulti_renderer.cpp

来自「ncbi源码」· C++ 代码 · 共 636 行 · 第 1/2 页

CPP
636
字号
            pane.SetClipRect(NULL);        }    }}// renders all columns within the given Row, vp_top_y is OpenGL viewport// coordinate of the top pixel in the rowvoid    CAlnMultiRenderer::x_RenderRow(IAlignRow* p_row, CGlPane& pane,                                       int state, int vp_top_y,                                       TAreaVector* p_areas){    _ASSERT(p_row);    m_RowToList[p_row] = true; // update "on-screen" attribute    SetupPaneForRow(pane, p_row, vp_top_y);    int col_n = GetColumnsCount();    for( int i_col = 0;  i_col < col_n;  i_col++ )  {                 const SColumn& col = GetColumn(i_col);                                if(col.VisibleWidth()) {             SetupPaneForColumn(pane, i_col);            EColumnType type = x_GetColumnType(col);            p_row->RenderColumn(type, pane, state);             if(p_areas) {                p_row->GetHTMLActiveAreas(type, pane, *p_areas);            }        }    }}void    CAlnMultiRenderer::SetupPaneForRow(CGlPane& pane,                                           const IAlignRow* p_row,                                           int vp_top_y) const{    const CGlPane& port = x_GetContext()->GetAlignPort();    int vp_bottom_y = vp_top_y - (p_row->GetHeightPixels() - 1);    // setup model space    TModelRect rcLim = port.GetModelLimitsRect();    rcLim.SetVert(vp_top_y, vp_bottom_y);    pane.SetModelLimitsRect(rcLim);    TModelRect rcV = port.GetVisibleRect();    rcV.SetVert(vp_top_y, vp_bottom_y);    pane.SetVisibleRect(rcV);    TVPRect rc_vp(0, vp_bottom_y, m_rcBounds.Width() - 1, vp_top_y);    pane.SetViewport(rc_vp);}void CAlnMultiRenderer::SetupPaneForColumn(CGlPane& pane, int i_col) const{    const SColumn& col = GetColumn(i_col);    pane.GetViewport().SetHorz(col.m_Pos, col.m_Pos + col.m_Width - 1);}int     CAlnMultiRenderer::GetVPListTop() const{    return m_rcBounds.Height() - 1 - m_RulerAreaHeight - m_MasterAreaHeight;}int     CAlnMultiRenderer::x_GetLineByWindowY(int WinY) const{    int vpY = WinY - GetListTop();    int OffsetY = (int) x_GetContext()->GetAlignPort().GetVisibleRect().Top();    return x_GetContext()->GetLineByModelY(vpY + OffsetY);}TVPRect CAlnMultiRenderer::x_GetLineRect(int Index){    int Top = 0, H = 0;    if(x_GetContext()  &&  Index >= 0) {        int OffsetY = (int) x_GetContext()->GetAlignPort().GetVisibleRect().Top();        Top = x_GetContext()->GetLinePosY(Index) - OffsetY;        H = x_GetContext()->GetLineHeight(Index);    }    return TVPRect(0, Top + H -1, m_rcBounds.Width() - 1, Top);}void    CAlnMultiRenderer::x_ResetRowListMap(){    NON_CONST_ITERATE(TRowToList, it, m_RowToList)  {        it->second = false;    }}void    CAlnMultiRenderer::x_PurgeRowListMap(){    for( TRowToList::iterator it = m_RowToList.begin(); it != m_RowToList.end();  )  {        if(! it->second) {            //row is off-screen now - purge cached graphics            (it->first)->GraphicsCacheCmd(IAlignRow::eDelete);            TRowToList::iterator next = it;            ++next;            m_RowToList.erase(it);            it = next;        } else it++;    }}const int kDefColumnWidth = 50;CAlnMultiRenderer::SColumn::SColumn():   m_Pos(0),     m_Width(kDefColumnWidth),    m_UserData(0),    m_bVisible(true),    m_Share(-1.0){}int     CAlnMultiRenderer::GetColumnsCount() const{    return m_vColumns.size();}const   CAlnMultiRenderer::SColumn&  CAlnMultiRenderer::GetColumn(int index) const{    _ASSERT(index >= 0  &&  index < (int) m_vColumns.size());    return m_vColumns[index];}int     CAlnMultiRenderer::AddColumn(){    return AddColumn(kDefColumnWidth, "", 0);}int     CAlnMultiRenderer::AddColumn(int width, const string& label, int data,                                    double share){    int index = GetColumnsCount();    return InsertColumn(index, width, label, data, share);}int     CAlnMultiRenderer::InsertColumn(int index, int width, const string& label,                                        int data, double share){    _ASSERT(index >= 0  &&  index <= (int) m_vColumns.size());        SColumn col;    col.m_Width = width;    col.m_Label = label;    col.m_UserData = data;    col.m_Share = share;    //###col.m_Pos = m_rcBounds.Width();        TColumnVector::const_iterator it  =         m_vColumns.insert(m_vColumns.begin() + index, col);    return it - m_vColumns.begin();}void    CAlnMultiRenderer::SetColumnWidth(int index, int width){    _ASSERT(index >= 0  &&  index < (int) m_vColumns.size());    _ASSERT(width >= 0);    SColumn& col = m_vColumns[index];    int delta = width - col.m_Width;    col.m_Width = width;        for( int i = index + 1; delta != 0  &&  i < (int) m_vColumns.size();  i++)  {        m_vColumns[i].m_Pos += delta;    }}void    CAlnMultiRenderer::SetColumnUserData(int index, int data){    _ASSERT(index >= 0  &&  index < (int) m_vColumns.size());    m_vColumns[index].m_UserData = data;}void    CAlnMultiRenderer::SetColumnVisible(int index, bool b_visible){    _ASSERT(index >= 0  &&  index < (int) m_vColumns.size());    SColumn& col = m_vColumns[index];    if(col.m_bVisible != b_visible) {        col.m_bVisible = b_visible;        int delta = b_visible ? col.m_Width : -col.m_Width;        for( int i = index + 1; delta != 0  &&  i < (int) m_vColumns.size();  i++)  {            m_vColumns[i].m_Pos += delta;        }    }}int     CAlnMultiRenderer::GetColumnIndexByX(int x) const{    ITERATE(TColumnVector, it, m_vColumns)  {        if(x >= it->m_Pos  &&  x < it->m_Pos + it->m_Width)            return it - m_vColumns.begin();    }    return -1;}void    CAlnMultiRenderer::UpdateColumns(){    Resize(m_rcBounds);}void    CAlnMultiRenderer::x_LayoutColumns(){    int w = m_rcBounds.Width();           int n_col = (int) m_vColumns.size();    if(w > 0  &&  n_col > 0) { // resize all columns                    // getting statistics        int total_w = 0;        double total_share = 0.0; // sum of m_Share for all resizable columns        int last_sh_index = -1; // index of last resizable column        for( int j = 0; j < n_col;  j++ )   {            SColumn& col = m_vColumns[j];            if(col.m_bVisible)  {                if(col.m_Share < 0.0)   {                    total_w += col.m_Width;                } else {                    total_share += col.m_Share;                    last_sh_index = j;                }            }        }        if(total_w < w)    { // there is some space left for resizable columns            int share_w = w - total_w;            double K = share_w / total_share; // proportion            int pos = 0, share_spent = 0;            for( int j = 0; j < n_col;  j++ )   {                SColumn& col = m_vColumns[j];                if(col.m_bVisible)  {                    col.m_Pos = pos;                                    if(col.m_Share >= 0.0)   { // resizable column                        if(j == last_sh_index)  {                            col.m_Width = share_w - share_spent; // the rest                        } else {                            col.m_Width = (int) (0.5 + share_w * K);                            share_spent += col.m_Pos;                        }                    }                    pos += col.m_Width;                }            }                            } else { // barely enough for fixed size columns            int pos = 0;            for( int j = 0; j < n_col;  j++ )   {                SColumn& col = m_vColumns[j];                if(col.m_bVisible)  {                    col.m_Pos = pos;                    if(col.m_Share >= 0.0)   {                        col.m_Width = 0;                    }                    pos += col.m_Width;                }            }        }    }}    END_NCBI_SCOPE/* * =========================================================================== * $Log: alnmulti_renderer.cpp,v $ * Revision 1000.1  2004/06/01 21:07:11  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12 * * Revision 1.12  2004/05/21 22:27:52  gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.11  2004/05/10 17:46:35  yazhuk * Addressed GCC warnings * * Revision 1.10  2004/04/22 17:10:34  yazhuk * Fixed rendering of focus state * * Revision 1.9  2004/04/06 19:08:59  yazhuk * Added "TAreaVector* p_areas" argument ot x_RenderRuler, generation of * CHTMLActiveArea object for Ruler and alignment graphics * * Revision 1.8  2004/04/06 16:02:22  yazhuk * Added cloumns management API to CAlnMultiRenderer, eliminated CColumnWidget * * Revision 1.7  2004/04/06 13:37:09  dicuccio * Formatting changes - trimmed trailing white space * * Revision 1.6  2004/04/05 15:34:38  johnson * added a few consts to SetupPane methods * * Revision 1.5  2004/03/29 19:04:42  yazhuk * Support for  CHTMLActiveArea-s generation * * Revision 1.4  2004/03/26 15:02:59  yazhuk * Changed width of "Icons" column * * Revision 1.3  2004/03/25 13:05:49  dicuccio * Use _TRACE() instead of cout * * Revision 1.2  2004/03/09 21:03:39  yazhuk * Clean-up * * Revision 1.1  2004/03/08 15:36:47  yazhuk * Initial revision * * * =========================================================================== */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?