[Libreoffice-commits] core.git: sc/inc sc/source

Eilidh McAdam eilidh at lanedo.com
Mon Nov 4 16:39:08 CET 2013


 sc/inc/pagepar.hxx              |    1 +
 sc/source/core/data/pagepar.cxx |    2 +-
 sc/source/ui/view/printfun.cxx  |   34 ++++++++++++++++++++++++++++++++++
 3 files changed, 36 insertions(+), 1 deletion(-)

New commits:
commit a37092075791ccbe6081e3e01990df6d9e6cdce6
Author: Eilidh McAdam <eilidh at lanedo.com>
Date:   Sat Nov 2 21:05:12 2013 +0000

    Fix for Calc page scaling - see #i54993#
    
    If a print range's manual breaks forced it over more pages than specified
    by the sheet scale settings, the zoom calculation wasn't able to
    converge on a zoom level, so it bottomed out at ZOOM_MIN.
    
    This issue only appears if the Calc/Print/Page/ForceBreaks option is
    selected and simply ensures the minimum number of pages is at least
    the number required by the breaks in the sheet.
    
    Change-Id: Iba36e850081718b1aa43e5c3db3c883530885853
    Reviewed-on: https://gerrit.libreoffice.org/6532
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/sc/inc/pagepar.hxx b/sc/inc/pagepar.hxx
index a898d5a..581d08a 100644
--- a/sc/inc/pagepar.hxx
+++ b/sc/inc/pagepar.hxx
@@ -41,6 +41,7 @@ struct ScPageTableParam
     sal_Bool    bScaleAll;
     sal_Bool    bScaleTo;
     sal_Bool    bScalePageNum;
+    sal_Bool    bForceBreaks;
     sal_uInt16  nScaleAll;
     sal_uInt16  nScaleWidth;
     sal_uInt16  nScaleHeight;
diff --git a/sc/source/core/data/pagepar.cxx b/sc/source/core/data/pagepar.cxx
index 7cce7c7..cf4ef92 100644
--- a/sc/source/core/data/pagepar.cxx
+++ b/sc/source/core/data/pagepar.cxx
@@ -43,7 +43,7 @@ void ScPageTableParam::Reset()
     bCellContent = sal_True;
     bNotes=bGrid=bHeaders=bDrawings=
     bLeftRight=bScaleAll=bScaleTo=bScalePageNum=
-    bFormulas=bNullVals=bSkipEmpty          = false;
+    bFormulas=bNullVals=bSkipEmpty=bForceBreaks = false;
     bTopDown=bScaleNone=bCharts=bObjects    = sal_True;
     nScaleAll = 100;
     nScalePageNum = nScaleWidth = nScaleHeight = 0;
diff --git a/sc/source/ui/view/printfun.cxx b/sc/source/ui/view/printfun.cxx
index 6584bb8..6ab7d1e 100644
--- a/sc/source/ui/view/printfun.cxx
+++ b/sc/source/ui/view/printfun.cxx
@@ -924,6 +924,8 @@ void ScPrintFunc::InitParam( const ScPrintOptions* pOptions )
     // If pPageData is set, only the breaks are interesting for the
     // pagebreak preview, empty pages are not addressed separately.
 
+    aTableParam.bForceBreaks = pOptions && pOptions->GetForceBreaks();
+
     //------------------------------------------------------
     // TabPage "Parts":
     //------------------------------------------------------
@@ -2751,6 +2753,21 @@ void ScPrintFunc::CalcZoom( sal_uInt16 nRangeNo )                       // calcu
         nZoom = 100;
         sal_uInt16 nPagesToFit = aTableParam.nScalePageNum;
 
+        // If manual breaks are forced, calculate minimum # pages required
+        if (aTableParam.bForceBreaks)
+        {
+             sal_uInt16 nMinPages = 0;
+             std::set<SCROW> aRowBreaks;
+             std::set<SCCOL> aColBreaks;
+             pDoc->GetAllRowBreaks(aRowBreaks, nPrintTab, false, true);
+             pDoc->GetAllColBreaks(aColBreaks, nPrintTab, false, true);
+             nMinPages = (aRowBreaks.size() + 1) * (aColBreaks.size() + 1);
+
+             // #i54993# use min forced by breaks if it's > # pages in
+             // scale parameter to avoid bottoming out at <= ZOOM_MIN
+             nPagesToFit = nMinPages > nPagesToFit ? nMinPages : nPagesToFit;
+        }
+
         sal_uInt16 nLastFitZoom = 0, nLastNonFitZoom = 0;
         while (true)
         {
@@ -2793,6 +2810,23 @@ void ScPrintFunc::CalcZoom( sal_uInt16 nRangeNo )                       // calcu
         sal_uInt16 nW = aTableParam.nScaleWidth;
         sal_uInt16 nH = aTableParam.nScaleHeight;
 
+        // If manual breaks are forced, calculate minimum # pages required
+        if (aTableParam.bForceBreaks)
+        {
+             sal_uInt16 nMinPagesW = 0, nMinPagesH = 0;
+             std::set<SCROW> aRowBreaks;
+             std::set<SCCOL> aColBreaks;
+             pDoc->GetAllRowBreaks(aRowBreaks, nPrintTab, false, true);
+             pDoc->GetAllColBreaks(aColBreaks, nPrintTab, false, true);
+             nMinPagesW = aColBreaks.size() + 1;
+             nMinPagesH = aRowBreaks.size() + 1;
+
+             // #i54993# use min forced by breaks if it's > # pages in
+             // scale parameters to avoid bottoming out at <= ZOOM_MIN
+             nW = nMinPagesW > nW ? nMinPagesW : nW;
+             nH = nMinPagesH > nH ? nMinPagesH : nH;
+        }
+
         sal_uInt16 nLastFitZoom = 0, nLastNonFitZoom = 0;
         while (true)
         {


More information about the Libreoffice-commits mailing list