diff options
author | Eike Rathke <erack@redhat.com> | 2019-06-20 18:02:38 +0200 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2019-08-29 09:17:02 +0200 |
commit | 44d56e25d6b68b0a8f37b9b8d4f0da68bbe285c2 (patch) | |
tree | eccc427141500d24e3b38b9409491f0f7ef3711b /sc | |
parent | 0b663c813b01247bf3139e417e57afd35984b5e8 (diff) |
Resolves: tdf#108209 let auto fill handle double click stop at existing data
Also consolidate the code to take both, left and right, data areas
into account, still preferring left if it exists.
Change-Id: I3d46b32f3790fd367fe92712fbcab0c392294599
Reviewed-on: https://gerrit.libreoffice.org/74462
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
(cherry picked from commit 7dd57a914be5f8fc2b53b7725c16625887cf7439)
Reviewed-on: https://gerrit.libreoffice.org/77157
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Reviewed-on: https://gerrit.libreoffice.org/77901
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Andras Timar <andras.timar@collabora.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/ui/view/viewfun2.cxx | 63 |
1 files changed, 37 insertions, 26 deletions
diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx index 565fa987e0e3..1b948b916746 100644 --- a/sc/source/ui/view/viewfun2.cxx +++ b/sc/source/ui/view/viewfun2.cxx @@ -1630,40 +1630,51 @@ void ScViewFunc::FillCrossDblClick() if ( nEndY < MAXROW ) { - if ( nStartX > 0 ) + const bool bDataLeft = (nStartX > 0); + if (bDataLeft || nEndX < MAXCOL) { - SCCOL nMovX = nStartX - 1; - SCROW nMovY = nStartY; + // Check that there is + // 1) data immediately left (preferred) or right of start (row) of selection + // 2) data there below + // 3) no data immediately below selection - if ( pDoc->HasData( nMovX, nStartY, nTab ) && - pDoc->HasData( nMovX, nStartY + 1, nTab ) ) + SCCOL nMovX = (bDataLeft ? nStartX - 1 : nEndX + 1); + SCROW nMovY = nStartY; + bool bDataFound = (pDoc->HasData( nMovX, nStartY, nTab) && pDoc->HasData( nMovX, nStartY + 1, nTab)); + if (!bDataFound && bDataLeft && nEndX < MAXCOL) { - pDoc->FindAreaPos( nMovX, nMovY, nTab, SC_MOVE_DOWN ); - - if ( nMovY > nEndY ) - { - FillAuto( FILL_TO_BOTTOM, nStartX, nStartY, nEndX, nEndY, - nMovY - nEndY ); - return; - } + nMovX = nEndX + 1; // check right + bDataFound = (pDoc->HasData( nMovX, nStartY, nTab) && pDoc->HasData( nMovX, nStartY + 1, nTab)); } - } - if ( nEndX < MAXCOL ) - { - SCCOL nMovX = nEndX + 1; - SCROW nMovY = nStartY; - - if ( pDoc->HasData( nMovX, nStartY, nTab ) && - pDoc->HasData( nMovX, nStartY + 1, nTab ) ) + if (bDataFound && pDoc->IsBlockEmpty( nTab, nStartX, nEndY + 1, nEndX, nEndY + 1, true)) { - pDoc->FindAreaPos( nMovX, nMovY, nTab, SC_MOVE_DOWN ); + // Get end of data left or right. + pDoc->FindAreaPos( nMovX, nMovY, nTab, SC_MOVE_DOWN); + // Find minimum end row of below empty area and data right. + for (SCCOL nX = nStartX; nX <= nEndX; ++nX) + { + SCROW nY = nEndY + 1; + // Get next row with data in this column. + pDoc->FindAreaPos( nX, nY, nTab, SC_MOVE_DOWN); + if (nMovY == MAXROW && nY == MAXROW) + { + // FindAreaPos() returns MAXROW also if there is no + // data at all from the start, so check if that + // contains data if the nearby (left or right) data + // ends there and increment if no data here, pretending + // the next data would be thereafter so nMovY will not + // be decremented. + if (!pDoc->HasData( nX, nY, nTab)) + ++nY; + } + if (nMovY > nY - 1) + nMovY = nY - 1; + } - if ( nMovY > nEndY ) + if (nMovY > nEndY) { - FillAuto( FILL_TO_BOTTOM, nStartX, nStartY, nEndX, nEndY, - nMovY - nEndY ); - return; + FillAuto( FILL_TO_BOTTOM, nStartX, nStartY, nEndX, nEndY, nMovY - nEndY); } } } |