/** * @brief Draws rect indicating visible area in file views. * * @param [in] nTopLine New topline for indicator * @param [in] nBottomLine New bottomline for indicator * @todo This function dublicates too much DrawRect() code. */ void CLocationView::DrawVisibleAreaRect(CDC *pClientDC, int nTopLine, int nBottomLine) { CMergeDoc* pDoc = GetDocument(); if (nTopLine == -1) nTopLine = pDoc->GetRightView()->GetTopSubLine(); if (nBottomLine == -1) { const int nScreenLines = pDoc->GetRightView()->GetScreenLines(); nBottomLine = nTopLine + nScreenLines; } CRect rc; GetClientRect(rc); const int nbLines = min(m_view[MERGE_VIEW_LEFT]->GetSubLineCount(), m_view[MERGE_VIEW_RIGHT]->GetSubLineCount()); int nTopCoord = static_cast<int>(Y_OFFSET + (static_cast<double>(nTopLine * m_lineInPix))); int nBottomCoord = static_cast<int>(Y_OFFSET + (static_cast<double>(nBottomLine * m_lineInPix))); double xbarBottom = min(nbLines / m_pixInLines + Y_OFFSET, rc.Height() - Y_OFFSET); int barBottom = (int)xbarBottom; // Make sure bottom coord is in bar range nBottomCoord = min(nBottomCoord, barBottom); // Ensure visible area is at least minimum height if (nBottomCoord - nTopCoord < INDICATOR_MIN_HEIGHT) { // If area is near top of file, add additional area to bottom // of the bar and vice versa. if (nTopCoord < Y_OFFSET + 20) nBottomCoord += INDICATOR_MIN_HEIGHT - (nBottomCoord - nTopCoord); else { // Make sure locationbox has min hight if ((nBottomCoord - nTopCoord) < INDICATOR_MIN_HEIGHT) { // If we have a high number of lines, it may be better // to keep the topline, otherwise the cursor can // jump up and down unexpected nBottomCoord = nTopCoord + INDICATOR_MIN_HEIGHT; } } } // Store current values for later use (to check if area changes) m_visibleTop = nTopCoord; m_visibleBottom = nBottomCoord; CRect rcVisibleArea(2, m_visibleTop, rc.right - 2, m_visibleBottom); CBitmap *pBitmap = CopyRectToBitmap(pClientDC, rcVisibleArea); CBitmap *pDarkenedBitmap = GetDarkenedBitmap(pClientDC, pBitmap); DrawBitmap(pClientDC, rcVisibleArea.left, rcVisibleArea.top, pDarkenedBitmap); delete pDarkenedBitmap; delete pBitmap; }
/** * @brief Handle scroll events sent directly. * */ void CLocationView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar) { if (pScrollBar == NULL) { // Scroll did not come frome a scroll bar // Send it to the right view instead CMergeDoc *pDoc = GetDocument(); pDoc->GetRightView()->SendMessage(WM_VSCROLL, MAKELONG(nSBCode, nPos), (LPARAM)NULL); return; } CView::OnVScroll (nSBCode, nPos, pScrollBar); }
/** * @brief Update view. */ void CLocationView::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint ) { UNREFERENCED_PARAMETER(pSender); UNREFERENCED_PARAMETER(lHint); CMergeDoc* pDoc = GetDocument(); m_view[MERGE_VIEW_LEFT] = pDoc->GetLeftView(); m_view[MERGE_VIEW_RIGHT] = pDoc->GetRightView(); // Give pointer to MergeEditView m_view[MERGE_VIEW_LEFT]->SetLocationView(this); m_view[MERGE_VIEW_RIGHT]->SetLocationView(this); m_bRecalculateBlocks = TRUE; Invalidate(); }