textaln_panel.cpp

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

CPP
890
字号
void CTextAlnPanel::x_DrawSeqNumPanel(void){    x_ActivateViewPort(m_NP);        x_DrawSelection(m_NP[3], eCol);    TSeqPos startX  = m_ScrX;    TSeqPos finishX = m_ScrX + m_NP[2] / kCellWidth;    TDim len = NStr::UIntToString(m_AlnWidth).length();    gl_color(m_GridColor);    glBegin(GL_LINES);    for (TSeqPos x = startX;  x != finishX;  x++) {        GLfloat xx = GLfloat(x - m_ScrX) * kCellWidth;        glVertex2f(xx, 0.0f);        glVertex2f(xx, m_NP[3]);    }    for (TNumrow y = 0;  y != len;  y++) {        GLfloat yy = y * kFontSize;        glVertex2f(0.0f,    yy);        glVertex2f(m_NP[2], yy);    }    glEnd();    gl_color(FL_GRAY);  // Draw thick separation line    x_DrawLine(0.0f, len * kFontSize + 1, m_NP[2], len * kFontSize + 1, 2.0f);    gl_color(m_NumbersColor);  // draw labels    CGlBitmapFont f(CGlBitmapFont::eHelvetica10);    for (TSeqPos x = startX;  x != finishX + 1;  x++) {        GLfloat xx = GLfloat(x - m_ScrX) * kCellWidth;        if (x % 10 == 0) {            string s = NStr::UIntToString(x);            int start = len - s.length();            for (TNumrow y = start, p = 0;  y!= len;  y++, p++) {                string to_draw = s.substr(p, 1);                GLfloat yy = y * kFontSize + kFontSize - 1;                f.TextOut(xx + 2, yy, to_draw.c_str());            }        } else if (x % 5 == 0) {  // draw tick marks            x_DrawLine(xx + kCellWidth / 2,  m_NP[3] - 3 - kFontSize,                       xx + kCellWidth / 2, m_NP[3] - 3, 1.0f);        }    }    glPopAttrib();}	void CTextAlnPanel::x_DrawLabelPanel(void){    x_ActivateViewPort(m_LP);    x_DrawSelection(m_LP[2], eRow);    string label_draw;    for (TNumrow row = 0;  row != m_ParaG.size();  row++) {        if (m_ParaG[row].GetType() == CParaG::eFeature) {            string feat_label;            feature::GetLabel(m_ParaG[row].Feature()->GetFeature(),                               &feat_label, feature::eBoth);            CGlBitmapFont f(CGlBitmapFont::eHelvetica10);            GLfloat yy = GLfloat(row - m_ScrY) * kCellHeight + kCellHeight - 3;            gl_color(m_SequenceColor);            f.TextOut(2, yy, feat_label.c_str());        }        if (m_ParaG[row].GetType() != CParaG::eSequence) continue;        GLfloat yy = GLfloat(row - m_ScrY + 1) * kCellHeight + 1;        if (m_Anchor == m_ParaG[row].GetIndex()) {  // draw anchor mark            x_DrawAnchorMark(row);        }        gl_color(m_NumbersColor);        const CSeq_id& id =            sequence::GetId(m_DS->GetAlnMgr().                            GetBioseqHandle(m_ParaG[row].GetIndex()),                            sequence::eGetId_Best);        id.GetLabel(&label_draw);        for (TSeqPos x = 0;  x != label_draw.length();  x++) {            GLfloat xx = kCellWidth + GLfloat(x * kCellWidth) + kCellWidth / 2;            string seq_this  = label_draw.substr(x, 1);            m_Font_8x13.TextOut(xx, yy - 2, seq_this.c_str());        }    }    gl_color(FL_GRAY);  // Draw thick separation line    x_DrawLine(m_LP[2] - 2, m_LP[1], m_LP[2] - 2, m_LP[3], 2.0f);    glPopAttrib();}void CTextAlnPanel::x_DrawAnchorMark(TNumrow row) const{    glEnable(GL_BLEND);    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);    glEnable(GL_POLYGON_SMOOTH);    glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST);    gl_color(FL_GREEN);    GLfloat xx = kCellWidth / 2;    GLfloat yy = GLfloat(row - m_ScrY) * kCellHeight;    glBegin(GL_QUADS);    glVertex2f(xx ,              yy + kCellHeight / 2);    glVertex2f(xx + kCellWidth / 2, yy + kCellHeight);    glVertex2f(xx + kCellWidth , yy + kCellHeight / 2);    glVertex2f(xx + kCellWidth / 2, yy);    glEnd();    glDisable(GL_BLEND);    glDisable(GL_POLYGON_SMOOTH);}void CTextAlnPanel::x_DrawInfoPanel(void){    x_ActivateViewPort(m_IP);    TDim len = NStr::UIntToString(m_AlnWidth).length();        gl_color(FL_GRAY);  // Draw thick separation line    x_DrawLine(m_IP[2] - 2, 0.0f, m_IP[2] - 2, m_IP[3], 2.0f);    x_DrawLine(0.0f, len * kFontSize + 1, m_IP[2], len * kFontSize + 1, 2.0f);    glEnable(GL_BLEND);    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);    x_DrawLine(0.0f, 0.0f, m_IP[2], len * kFontSize + 1, 2.0f);    glDisable(GL_BLEND);    glDisable(GL_LINE_SMOOTH);    glLineWidth(1.0f);            gl_color(m_NumbersColor);    CGlBitmapFont f(CGlBitmapFont::eHelvetica10);    f.TextOut(kCellWidth / 2, len * kFontSize - 2, kLabels.c_str());    GLfloat xx = m_IP[2] - gl_width(kPosition.c_str()) - kCellWidth;    f.TextOut(xx, kFontSize - 1, kPosition.c_str());    glPopAttrib();}void CTextAlnPanel::draw(){    if (!valid()) {        x_SetViewPorts    ();        x_AdjustScrollBars();    }    glClearColor(1, 1, 1, 0);    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    if ( !m_DS ) return;    x_DrawInfoPanel  ();    x_DrawSeqNumPanel();    x_DrawTextPanel ();    x_DrawLabelPanel ();    return;}void CTextAlnPanel::x_DrawLine(GLfloat x1, GLfloat y1, GLfloat x2,                               GLfloat y2, GLfloat width) const{    glLineWidth(width);    glBegin(GL_LINES);    glVertex2f(x1, y1);    glVertex2f(x2, y2);    glEnd();    glLineWidth(1.0f);}void CTextAlnPanel::x_SetViewPorts(void){    m_Width  = w();    m_Height = h();    gl_font(FL_BOLD, kFontSize);    TDim m_NPHeight = gl_height() *         NStr::UIntToString(m_AlnWidth).length();    TDim m_LPWidth = 0;    // find out the longest string    for (TNumrow row = 0;  row != m_AlnHeight;  row++) {        const CSeq_id& id =            sequence::GetId(m_DS->GetAlnMgr().GetBioseqHandle(row),                            sequence::eGetId_Best);        string str_label;        id.GetLabel(&str_label);        TDim len = str_label.length();        m_LPWidth = max(m_LPWidth, len);    }    m_LPWidth = (m_LPWidth + 2) * kCellWidth;  // add extra space    // Numbers panel (on top)    m_NP[0] = m_LPWidth;    m_NP[1] = m_Height - m_NPHeight;    m_NP[2] = m_Width - m_LPWidth;    m_NP[3] = m_NPHeight;    // Text panel    m_BP[0] = m_LPWidth;    m_BP[1] = 0;    m_BP[2] = m_Width  - m_LPWidth;    m_BP[3] = m_Height - m_NPHeight;    // Label panel (on the left)    m_LP[0] = 0;    m_LP[1] = 0;    m_LP[2] = m_LPWidth;    m_LP[3] = m_Height - m_NPHeight;    // Info panel (on the left/top corner)    m_IP[0] = 0;    m_IP[1] = m_Height - m_NPHeight;    m_IP[2] = m_LPWidth;    m_IP[3] = m_NPHeight;}void CTextAlnPanel::x_AdjustScrollBars(void){    Fl_Scrollbar* scrollX = (Fl_Scrollbar*)(parent()->child(0));    Fl_Scrollbar* scrollY = (Fl_Scrollbar*)(parent()->child(1));    scrollX->linesize(1);    scrollY->linesize(1);    scrollX->value(m_ScrX, m_BP[2] / kCellWidth, 0, m_AlnWidth + 1);    if (m_AlnWidth * kCellWidth < m_BP[2]) scrollX->hide();    else scrollX->show();    scrollY->value(m_ScrY, m_BP[3] / kCellHeight, 0, m_ParaG.size());    if (m_ParaG.size() * kCellHeight < m_BP[3]) scrollY->hide();    else scrollY->show();}string CTextAlnPanel::x_PreprocessSeq(const string& s) const{    if (s.length() <= 10) {        return s;    } else {        return s.substr(0, 4) + "..." + s.substr(s.length() - 5, 4);    }}void CTextAlnPanel::x_ActivateViewPort(GLuint* port) const{    glPushAttrib(GL_VIEWPORT_BIT);    glShadeModel(GL_FLAT);    glViewport(port[0], port[1], port[2], port[3]);    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    glOrtho(0, port[2], port[3], 0, -1, 1);    glMatrixMode(GL_MODELVIEW);    glLoadIdentity();}int CTextAlnPanel::handle(int event){    static int  s_X, s_Y;    static bool s_Drag;    switch (event) {            case FL_PUSH:        s_X = Fl::event_x();        s_Y = Fl::event_y();        s_Drag = false;        return 1;    case FL_DRAG:        s_Drag = true;        if (Fl::event_shift()) {            int pos = Fl::event_x() + m_ScrX * kCellWidth - m_LP[2];            size_t x = pos / kCellWidth;            if ( pos < 0  ||  x < 0  ||  x >= m_AlnWidth) return 1;            m_ColSelect[x] = !Fl::event_ctrl();            redraw();        } else {            size_t idx = x_GetAtXY(Fl::event_x(), Fl::event_y());            if (idx != kUnknowIdx) {                m_RowSelect[idx] = !Fl::event_ctrl();                redraw();            }        }        return 1;    case FL_RELEASE:        if (s_Drag) {            s_Drag   = false;        } else  {            size_t idx = x_GetAtXY(Fl::event_x(), Fl::event_y());            if (idx != kUnknowIdx) {                m_RowSelect[idx] = !Fl::event_ctrl();                redraw();            }        }        return 1;    default:        return Fl_Gl_Window::handle(event);    }    return 0;}size_t CTextAlnPanel::x_GetAtXY(int x, int y) const{    int pos = y + m_ScrY * kCellHeight - m_NP[3];    //if (pos < 0) return kUnknowIdx;    size_t idx = pos / kCellHeight;    if ( pos < 0  ||  idx >= m_ParaG.size()) return kUnknowIdx;    else return m_ParaG[idx].GetIndex();}// --- Scrolling --------------------------------------------------void CTextAlnPanel::Scroll(TSeqPos xPos, TSeqPos yPos){    m_ScrX = xPos;    m_ScrY = yPos;    redraw();}void CTextAlnPanel::SetFeatureDisplay(CTextAlnView::EFeatureDisplay disp){    if ( !m_DS ) return;    m_featDisp = disp;    x_PrepareData();    invalidate();    redraw();}// Colorsvoid CTextAlnPanel::SetColor(CTextAlnView::EDisplayElement elem,                              Fl_Color color){    switch (elem) {    case CTextAlnView::eBackground: { m_BackgroundColor = color; break; }    case CTextAlnView::eGrid:       { m_GridColor       = color; break; }    case CTextAlnView::eNumbers:    { m_NumbersColor    = color; break; }    case CTextAlnView::eSelection:  { m_SelectionColor  = color; break; }    case CTextAlnView::eSequence:   { m_SequenceColor   = color; break; }    case CTextAlnView::eMismatch:   { m_MismatchColor   = color; break; }    }    redraw();}Fl_Color CTextAlnPanel::GetColor(CTextAlnView::EDisplayElement elem) const{    switch (elem) {    case CTextAlnView::eBackground: return m_BackgroundColor;    case CTextAlnView::eGrid:       return m_GridColor;    case CTextAlnView::eNumbers:    return m_NumbersColor;    case CTextAlnView::eSelection:  return m_SelectionColor;    case CTextAlnView::eSequence:   return m_SequenceColor;    case CTextAlnView::eMismatch:   return m_MismatchColor;    }    return FL_BLACK;}END_NCBI_SCOPE/* * =========================================================================== * $Log: textaln_panel.cpp,v $ * Revision 1000.2  2004/06/01 21:08:00  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/03/11 17:50:41  dicuccio * Updated typedefs: dropped TDimension, TPosition, TIndex, TColor; use TSeqRange * instead of TRange * * Revision 1.10  2004/03/05 17:39:13  dicuccio * Use sequence::Getid() instead of CSeq_id::GetStringDescr() * * Revision 1.9  2003/09/29 15:49:58  dicuccio * Use CGlBitmapFont instead of home-grown font. * * Revision 1.8  2003/09/24 19:24:41  ucko * ~CTextAlnPanel: stop explicitly deleting m_DS, which is now a CRef. * * Revision 1.7  2003/09/24 18:34:58  dicuccio * Use new generic alignment data source.  Removed USING_SCOPE(objects) from * headers; used objects:: where necessary * * Revision 1.6  2003/09/17 16:29:03  dicuccio * Use CGlBitmapFont instead of CGlutFont * * Revision 1.5  2003/08/18 15:23:40  lebedev * Changed nales: CFeature -> CLayoutFeat * * Revision 1.4  2003/07/21 20:28:27  dicuccio * Fixed creation of CFeature to match new API * * Revision 1.3  2003/06/02 16:06:27  dicuccio * Rearranged src/objects/ subtree.  This includes the following shifts: *     - src/objects/asn2asn --> arc/app/asn2asn *     - src/objects/testmedline --> src/objects/ncbimime/test *     - src/objects/objmgr --> src/objmgr *     - src/objects/util --> src/objmgr/util *     - src/objects/alnmgr --> src/objtools/alnmgr *     - src/objects/flat --> src/objtools/flat *     - src/objects/validator --> src/objtools/validator *     - src/objects/cddalignview --> src/objtools/cddalignview * In addition, libseq now includes six of the objects/seq... libs, and libmmdb * replaces the three libmmdb? libs. * * Revision 1.2  2003/03/27 20:38:57  dicuccio * Fixed compilation errors under Linux (gcc-3.0.4) * * Revision 1.1  2003/03/27 17:04:32  lebedev * Text Alignment Widget: Initial revision * * =========================================================================== */

⌨️ 快捷键说明

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