[Winmerge-svn] SF.net SVN: winmerge: [4539] branches/R2_6/Src
Windows visual diff and merge for files and directories
Brought to you by:
christianlist,
grimmdp
From: <ki...@us...> - 2007-09-15 10:55:32
|
Revision: 4539 http://winmerge.svn.sourceforge.net/winmerge/?rev=4539&view=rev Author: kimmov Date: 2007-09-15 03:55:17 -0700 (Sat, 15 Sep 2007) Log Message: ----------- BUG: [ 1777054 ] Next difference sometimes not seen with Wrap Lines enabled Modified Paths: -------------- branches/R2_6/Src/Changes.txt branches/R2_6/Src/MergeEditView.cpp branches/R2_6/Src/MergeEditView.h Modified: branches/R2_6/Src/Changes.txt =================================================================== --- branches/R2_6/Src/Changes.txt 2007-09-15 02:33:31 UTC (rev 4538) +++ branches/R2_6/Src/Changes.txt 2007-09-15 10:55:17 UTC (rev 4539) @@ -2,6 +2,10 @@ Add new items to top. (This summarizes all changes to all files under Src, including Src\Languages.) +2007-09-15 Kimmo + BUG: [ 1777054 ] Next difference sometimes not seen with Wrap Lines enabled + Src: MergeEditView.cpp MergeEditView.h + 2007-08-22 Tim PATCH: [ 1743623 ] ChineseSimplified language .rc file for trunk rev.4317 Src/Languages/ChineseSimplified: MergeChineseSimplified.rc Modified: branches/R2_6/Src/MergeEditView.cpp =================================================================== --- branches/R2_6/Src/MergeEditView.cpp 2007-09-15 02:33:31 UTC (rev 4538) +++ branches/R2_6/Src/MergeEditView.cpp 2007-09-15 10:55:17 UTC (rev 4539) @@ -1467,19 +1467,20 @@ if (bScroll) { - // If diff first line outside current view - context OR - // if diff last line outside current view - context OR - // if diff is bigger than screen - if ((ptStart.y < m_nTopLine + CONTEXT_LINES_ABOVE) || - (ptEnd.y >= m_nTopLine + GetScreenLines() - CONTEXT_LINES_BELOW) || - (ptEnd.y - ptStart.y) >= GetScreenLines()) + if (IsDiffVisible(curDiff, CONTEXT_LINES_BELOW) == FALSE) { - int line = ptStart.y - CONTEXT_LINES_ABOVE; - if (line < 0) - line = 0; - - pCurrentView->ScrollToLine(line); - pOtherView->ScrollToLine(line); + // Difference is not visible, scroll it so that max amount of + // scrolling is done while keeping the diff in screen. So if + // scrolling is downwards, scroll the diff to as up in screen + // as possible. This usually brings next diff to the screen + // and we don't need to scroll into it. + int nLine = GetSubLineIndex(ptStart.y); + if (nLine > CONTEXT_LINES_ABOVE) + { + nLine -= CONTEXT_LINES_ABOVE; + } + pCurrentView->ScrollToSubLine(nLine); + pOtherView->ScrollToSubLine(nLine); } pCurrentView->SetCursorPos(ptStart); pOtherView->SetCursorPos(ptStart); @@ -2888,25 +2889,39 @@ } /** - * @brief Determine if difference is visible on screen. - * @param [in] nDiff Number of diff to check. - * @return TRUE if difference is visible. - */ +* @brief Determine if difference is visible on screen. +* @param [in] nDiff Number of diff to check. +* @return TRUE if difference is visible. +*/ BOOL CMergeEditView::IsDiffVisible(int nDiff) { CMergeDoc *pd = GetDocument(); - CPoint ptStart, ptEnd; DIFFRANGE diff; pd->m_diffList.GetDiff(nDiff, diff); - ptStart.x = 0; - ptStart.y = diff.dbegin0; - ptEnd.x = 0; - ptEnd.y = diff.dend0; - if (ptStart.y < m_nTopLine || - (ptEnd.y >= m_nTopLine + GetScreenLines()) || - (ptEnd.y - ptStart.y) >= GetScreenLines()) + return IsDiffVisible(diff); +} + +/** + * @brief Determine if difference is visible on screen. + * @param [in] diff diff to check. + * @param [in] nLinesBelow Allow "minimizing" the number of visible lines. + * @return TRUE if difference is visible, FALSE otherwise. + */ +BOOL CMergeEditView::IsDiffVisible(const DIFFRANGE& diff, int nLinesBelow /*=0*/) +{ + const int nDiffStart = GetSubLineIndex(diff.dbegin0); + const int nDiffEnd = GetSubLineIndex(diff.dend0); + // Diff's height is last line - first line + last line's line count + const int nDiffHeight = nDiffEnd - nDiffStart + GetSubLines(diff.dend0) + 1; + + // If diff first line outside current view - context OR + // if diff last line outside current view - context OR + // if diff is bigger than screen + if ((nDiffStart < m_nTopSubLine) || + (nDiffEnd >= m_nTopSubLine + GetScreenLines() - nLinesBelow) || + (nDiffHeight >= GetScreenLines())) { return FALSE; } Modified: branches/R2_6/Src/MergeEditView.h =================================================================== --- branches/R2_6/Src/MergeEditView.h 2007-09-15 02:33:31 UTC (rev 4538) +++ branches/R2_6/Src/MergeEditView.h 2007-09-15 10:55:17 UTC (rev 4539) @@ -198,8 +198,8 @@ virtual void OnUpdateCaret(); BOOL MergeModeKeyDown(MSG* pMsg); int FindPrediffer(const CString & prediffer) const; + BOOL IsDiffVisible(const DIFFRANGE& diff, int nLinesBelow = 0); - // Generated message map functions protected: //{{AFX_MSG(CMergeEditView) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |