/** * @brief Copy diff from right pane to left pane */ void CMergeDiffDetailView::OnR2l() { // Check that left side is not readonly if (IsReadOnly(0)) return; CMergeDoc *pDoc = GetDocument(); int currentDiff = pDoc->GetCurrentDiff(); if (currentDiff != -1 && pDoc->m_diffList.IsDiffSignificant(currentDiff)) { WaitStatusCursor waitstatus(IDS_STATUS_COPYR2L); pDoc->ListCopy(1, 0, currentDiff); } }
/** * @brief Draw maps of files. * * Draws maps of differences in files. Difference list is walked and * every difference is drawn with same colors as in editview. * @note We MUST use doubles when calculating coords to avoid rounding * to integers. Rounding causes miscalculation of coords. * @sa CLocationView::DrawRect() */ void CLocationView::OnDraw(CDC* pDC) { ASSERT(m_view[MERGE_VIEW_LEFT] != NULL); ASSERT(m_view[MERGE_VIEW_RIGHT] != NULL); if (m_view[MERGE_VIEW_LEFT] == NULL || m_view[MERGE_VIEW_RIGHT] == NULL) return; if (!m_view[MERGE_VIEW_LEFT]->IsInitialized()) return; CRect rc; GetClientRect(&rc); CMemDC dc(pDC, &rc); COLORREF cr0 = CLR_NONE; // Left side color COLORREF cr1 = CLR_NONE; // Right side color COLORREF crt = CLR_NONE; // Text color BOOL bwh = FALSE; m_movedLines.RemoveAll(); CalculateBars(); DrawBackground(&dc); // Draw bar outlines CPen* oldObj = (CPen*)dc.SelectStockObject(BLACK_PEN); CBrush brush(m_view[0]->GetColor(COLORINDEX_WHITESPACE)); CBrush* oldBrush = (CBrush*)dc.SelectObject(&brush); dc.Rectangle(m_leftBar); dc.Rectangle(m_rightBar); dc.SelectObject(oldBrush); dc.SelectObject(oldObj); // Iterate the differences list and draw differences as colored blocks. // Don't recalculate blocks if we earlier determined it is not needed // This may save lots of processing if (m_bRecalculateBlocks) CalculateBlocks(); CMergeDoc *pDoc = GetDocument(); int nPrevEndY = -1; const int nCurDiff = pDoc->GetCurrentDiff(); vector<DiffBlock>::const_iterator iter = m_diffBlocks.begin(); while (iter != m_diffBlocks.end()) { CMergeEditView *pView = m_view[MERGE_VIEW_LEFT]; const BOOL bInsideDiff = (nCurDiff == (*iter).diff_index); if ((nPrevEndY != (*iter).bottom_coord) || bInsideDiff) { // Draw left side block m_view[MERGE_VIEW_LEFT]->GetLineColors2((*iter).top_line, 0, cr0, crt, bwh); CRect r0(m_leftBar.left, (*iter).top_coord, m_leftBar.right, (*iter).bottom_coord); DrawRect(&dc, r0, cr0, bInsideDiff); // Draw right side block m_view[MERGE_VIEW_RIGHT]->GetLineColors2((*iter).top_line, 0, cr1, crt, bwh); CRect r1(m_rightBar.left, (*iter).top_coord, m_rightBar.right, (*iter).bottom_coord); DrawRect(&dc, r1, cr1, bInsideDiff); } nPrevEndY = (*iter).bottom_coord; // Test if we draw a connector BOOL bDisplayConnectorFromLeft = FALSE; BOOL bDisplayConnectorFromRight = FALSE; switch (m_displayMovedBlocks) { case DISPLAY_MOVED_FOLLOW_DIFF: // display moved block only for current diff if (!bInsideDiff) break; // two sides may be linked to a block somewhere else bDisplayConnectorFromLeft = TRUE; bDisplayConnectorFromRight = TRUE; break; case DISPLAY_MOVED_ALL: // we display all moved blocks, so once direction is enough bDisplayConnectorFromLeft = TRUE; break; default: break; } if (bDisplayConnectorFromLeft) { int apparent0 = (*iter).top_line; int apparent1 = pDoc->RightLineInMovedBlock(apparent0); const int nBlockHeight = (*iter).bottom_line - (*iter).top_line; if (apparent1 != -1) { MovedLine line; CPoint start; CPoint end; apparent0 = pView->GetSubLineIndex(apparent0); apparent1 = pView->GetSubLineIndex(apparent1); start.x = m_leftBar.right; int leftUpper = (int) (apparent0 * m_lineInPix + Y_OFFSET); int leftLower = (int) ((nBlockHeight + apparent0) * m_lineInPix + Y_OFFSET); start.y = leftUpper + (leftLower - leftUpper) / 2; end.x = m_rightBar.left; int rightUpper = (int) (apparent1 * m_lineInPix + Y_OFFSET); int rightLower = (int) ((nBlockHeight + apparent1) * m_lineInPix + Y_OFFSET); end.y = rightUpper + (rightLower - rightUpper) / 2; line.ptLeft = start; line.ptRight = end; m_movedLines.AddTail(line); } } if (bDisplayConnectorFromRight) { int apparent1 = (*iter).top_line; int apparent0 = pDoc->LeftLineInMovedBlock(apparent1); const int nBlockHeight = (*iter).bottom_line - (*iter).top_line; if (apparent0 != -1) { MovedLine line; CPoint start; CPoint end; apparent0 = pView->GetSubLineIndex(apparent0); apparent1 = pView->GetSubLineIndex(apparent1); start.x = m_leftBar.right; int leftUpper = (int) (apparent0 * m_lineInPix + Y_OFFSET); int leftLower = (int) ((nBlockHeight + apparent0) * m_lineInPix + Y_OFFSET); start.y = leftUpper + (leftLower - leftUpper) / 2; end.x = m_rightBar.left; int rightUpper = (int) (apparent1 * m_lineInPix + Y_OFFSET); int rightLower = (int) ((nBlockHeight + apparent1) * m_lineInPix + Y_OFFSET); end.y = rightUpper + (rightLower - rightUpper) / 2; line.ptLeft = start; line.ptRight = end; m_movedLines.AddTail(line); } } ++iter; } if (m_displayMovedBlocks != DISPLAY_MOVED_NONE) DrawConnectLines(&dc); if (m_pSavedBackgroundBitmap) delete m_pSavedBackgroundBitmap; m_pSavedBackgroundBitmap = CopyRectToBitmap(&dc, rc); // Since we have invalidated locationbar there is no previous // arearect to remove m_visibleTop = -1; m_visibleBottom = -1; DrawVisibleAreaRect(&dc); m_bDrawn = true; }